diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 00000000..70e57088 --- /dev/null +++ b/.dockerignore @@ -0,0 +1 @@ +prover/ diff --git a/.github/workflows/prover.yml b/.github/workflows/prover.yml index f600b11c..1d066b0d 100644 --- a/.github/workflows/prover.yml +++ b/.github/workflows/prover.yml @@ -1,25 +1,38 @@ name: Prover -# on: -# push: -# branches: -# - main -# paths: -# - "prover/**" -# - ".github/workflows/prover.yaml" -# pull_request: -# paths: -# - "prover/**" -# - ".github/workflows/prover.yaml" -# -# defaults: -# run: -# working-directory: "prover" -# -# jobs: -# check: -# runs-on: ubuntu-22.04 -# steps: -# - uses: actions/checkout@v3 -# - name: Run build -# run: make build-prover +on: + push: + branches: + - main + paths: + - "prover/**" + - ".github/workflows/prover.yaml" + pull_request: + paths: + - "prover/**" + - ".github/workflows/prover.yaml" + +defaults: + run: + working-directory: "prover" + +jobs: + fmt: + name: fmt + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + with: + components: rustfmt + - run: cargo fmt --all --check + + build: + name: build + runs-on: ubuntu-latest + timeout-minutes: 30 + steps: + - uses: actions/checkout@v4 + - uses: dtolnay/rust-toolchain@stable + - run: make build-shadow-prove && make build-shadow-prove diff --git a/.gitignore b/.gitignore index 778eac07..d267e053 100644 --- a/.gitignore +++ b/.gitignore @@ -15,6 +15,7 @@ contracts/yarn.lock build/bin cache out +ops/docker/.devnet ops/l2-genesis/.devnet ops/l2-genesis/.qanet ops/l2-genesis/.testnet diff --git a/.gitmodules b/.gitmodules index 8e809137..3b72cbd0 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "go-ethereum"] path = go-ethereum url = https://github.com/morph-l2/go-ethereum.git -branch = release/2.0.x +branch = main diff --git a/Makefile b/Makefile index d53102ae..bf959f0d 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,7 @@ ################## update dependencies #################### -ETHEREUM_TARGET_VERSION := morph-v2.0.1 -TENDERMINT_TARGET_VERSION := v0.3.1 +ETHEREUM_TARGET_VERSION := morph-v2.0.5 +TENDERMINT_TARGET_VERSION := v0.3.2 ETHEREUM_MODULE_NAME := github.com/morph-l2/go-ethereum TENDERMINT_MODULE_NAME := github.com/morph-l2/tendermint @@ -143,6 +143,7 @@ devnet-down: devnet-clean-build: devnet-down docker volume ls --filter name=docker-* --format='{{.Name}}' | xargs -r docker volume rm rm -rf ops/l2-genesis/.devnet + rm -rf ops/docker/.devnet rm -rf ops/docker/consensus/beacondata ops/docker/consensus/validatordata ops/docker/consensus/genesis.ssz rm -rf ops/docker/execution/geth .PHONY: devnet-clean-build diff --git a/MakefileEc2.mk b/MakefileEc2.mk index 39cf5633..f5258138 100644 --- a/MakefileEc2.mk +++ b/MakefileEc2.mk @@ -21,3 +21,35 @@ build-bk-prod-morph-prod-mainnet-to-morph-tx-submitter: cp tx-submitter/tx-submitter dist/ tar -czvf tx-submitter.tar.gz dist aws s3 cp tx-submitter.tar.gz s3://morph-0582-morph-technical-department-mainnet-data/morph-setup/tx-submitter.tar.gz + +# build for holesky +build-bk-prod-morph-prod-testnet-to-morph-node-holesky: + if [ ! -d dist ]; then mkdir -p dist; fi + cd $(PWD)/node && make build + cp node/build/bin/morphnode dist/ + cp node/build/bin/tendermint dist/ + tar -czvf morph-node.tar.gz dist + aws s3 cp morph-node.tar.gz s3://morph-0582-morph-technical-department-testnet-data/testnet/holesky/morph-setup/morph-node.tar.gz + +build-bk-prod-morph-prod-testnet-to-morph-tx-submitter-holesky: + if [ ! -d dist ]; then mkdir -p dist; fi + env GO111MODULE=on CGO_LDFLAGS="-ldl" CGO_ENABLED=1 go build -v $(LDFLAGS) -o tx-submitter/tx-submitter ./tx-submitter/cmd + cp tx-submitter/tx-submitter dist/ + tar -czvf tx-submitter.tar.gz dist + aws s3 cp tx-submitter.tar.gz s3://morph-0582-morph-technical-department-testnet-data/testnet/holesky/morph-setup/tx-submitter.tar.gz + + +build-bk-test-morph-test-qanet-to-morph-node-qanet: + if [ ! -d dist ]; then mkdir -p dist; fi + cd $(PWD)/node && make build + cp node/build/bin/morphnode dist/ + cp node/build/bin/tendermint dist/ + tar -czvf morph-node.tar.gz dist + aws s3 cp morph-node.tar.gz s3://morph-7637-morph-technical-department-qanet-data/morph-setup/morph-node.tar.gz + +build-bk-test-morph-test-qanet-to-morph-tx-submitter-qanet: + if [ ! -d dist ]; then mkdir -p dist; fi + env GO111MODULE=on CGO_LDFLAGS="-ldl" CGO_ENABLED=1 go build -v $(LDFLAGS) -o tx-submitter/tx-submitter ./tx-submitter/cmd + cp tx-submitter/tx-submitter dist/ + tar -czvf tx-submitter.tar.gz dist + aws s3 cp tx-submitter.tar.gz s3://morph-7637-morph-technical-department-qanet-data/morph-setup/tx-submitter.tar.gz diff --git a/MakefileEks.mk b/MakefileEks.mk index 573c724b..0b935d10 100644 --- a/MakefileEks.mk +++ b/MakefileEks.mk @@ -6,6 +6,7 @@ LDFLAGSSTRING +=-X main.GitVersion=$(GITVERSION) LDFLAGS := -ldflags "$(LDFLAGSSTRING)" # gas-oracle +# mainnet build-bk-prod-morph-prod-mainnet-to-morph-gas-price-oracle: if [ ! -d dist ]; then mkdir -p dist; fi cd $(PWD)/gas-oracle/app && cargo build --release @@ -18,7 +19,21 @@ start-bk-prod-morph-prod-mainnet-to-morph-gas-price-oracle: /data/secret-manager-wrapper ./app +# qanet +build-bk-test-morph-test-qanet-to-morph-gas-price-oracle-qanet: + if [ ! -d dist ]; then mkdir -p dist; fi + cd $(PWD)/gas-oracle/app && cargo build --release + cp gas-oracle/app/target/release/app dist/ + aws s3 cp s3://morph-7637-morph-technical-department-qanet-data/morph-setup/secret-manager-wrapper.tar.gz ./ + tar -xvzf secret-manager-wrapper.tar.gz + + +start-bk-test-morph-test-qanet-to-morph-gas-price-oracle-qanet: + /data/secret-manager-wrapper ./app + + # prover +# mainnet build-bk-prod-morph-prod-mainnet-to-morph-prover: if [ ! -d dist ]; then mkdir -p dist; fi cd $(PWD)/prover/bin/server && RUSTFLAGS="-C target-feature=+avx2,+avx512f" cargo build --release @@ -28,10 +43,10 @@ build-bk-prod-morph-prod-mainnet-to-morph-prover: tar -xvzf secret-manager-wrapper.tar.gz start-bk-prod-morph-prod-mainnet-to-morph-prover: - #if [ ! -d morph-prover-data/sp1-circuits ]; then aws s3 cp s3://morph-0582-morph-technical-department-mainnet-data/morph-setup/sp1-circuits morph-prover-data/; fi /data/secret-manager-wrapper ./prover-server # challenge-handler +# mainnet build-bk-prod-morph-prod-mainnet-to-morph-challenge-handler: if [ ! -d dist ]; then mkdir -p dist; fi cd $(PWD)/prover/bin/challenge && cargo build --release @@ -43,8 +58,8 @@ build-bk-prod-morph-prod-mainnet-to-morph-challenge-handler: start-bk-prod-morph-prod-mainnet-to-morph-challenge-handler: /data/secret-manager-wrapper ./challenge-handler - # shadow-proving +# mainnet build-bk-prod-morph-prod-mainnet-to-morph-shadow-proving: if [ ! -d dist ]; then mkdir -p dist; fi cd $(PWD)/prover/bin/shadow-prove && cargo build --release @@ -55,6 +70,8 @@ build-bk-prod-morph-prod-mainnet-to-morph-shadow-proving: start-bk-prod-morph-prod-mainnet-to-morph-shadow-proving: /data/secret-manager-wrapper ./shadow-proving +# staking-oracle +# mainnet build-bk-prod-morph-prod-mainnet-to-morph-staking-oracle: if [ ! -d dist ]; then mkdir -p dist; fi env GO111MODULE=on CGO_LDFLAGS="-ldl" CGO_ENABLED=1 go build -v $(LDFLAGS) -o oracle/staking-oracle ./oracle/cmd/staking-oracle @@ -63,4 +80,79 @@ build-bk-prod-morph-prod-mainnet-to-morph-staking-oracle: tar -xvzf secret-manager-wrapper.tar.gz start-bk-prod-morph-prod-mainnet-to-morph-staking-oracle: + /data/secret-manager-wrapper ./staking-oracle + +# qanet +build-bk-test-morph-test-qanet-to-morph-staking-oracle-qanet: + if [ ! -d dist ]; then mkdir -p dist; fi + env GO111MODULE=on CGO_LDFLAGS="-ldl" CGO_ENABLED=1 go build -v $(LDFLAGS) -o oracle/staking-oracle ./oracle/cmd/staking-oracle + cp oracle/staking-oracle dist/ + aws s3 cp s3://morph-7637-morph-technical-department-qanet-data/morph-setup/secret-manager-wrapper.tar.gz ./ + tar -xvzf secret-manager-wrapper.tar.gz + +start-bk-test-morph-test-qanet-to-morph-staking-oracle-qanet: + /data/secret-manager-wrapper ./staking-oracle + + +# gas-oracle +# testnet +build-bk-prod-morph-prod-testnet-to-morph-gas-price-oracle-holesky: + if [ ! -d dist ]; then mkdir -p dist; fi + cd $(PWD)/gas-oracle/app && cargo build --release + cp gas-oracle/app/target/release/app dist/ + aws s3 cp s3://morph-0582-morph-technical-department-testnet-data/testnet/holesky/morph-setup/secret-manager-wrapper.tar.gz ./ + tar -xvzf secret-manager-wrapper.tar.gz + + +start-bk-prod-morph-prod-testnet-to-morph-gas-price-oracle-holesky: + /data/secret-manager-wrapper ./app + +# prover +# testnet +build-bk-prod-morph-prod-testnet-to-morph-prover-holesky: + if [ ! -d dist ]; then mkdir -p dist; fi + cd $(PWD)/prover/bin/server && RUSTFLAGS="-C target-feature=+avx2,+avx512f" cargo build --release + cp prover/target/release/prover-server dist/ + cp -r prover/configs dist/ + aws s3 cp s3://morph-0582-morph-technical-department-testnet-data/testnet/holesky/morph-setup/secret-manager-wrapper.tar.gz ./ + tar -xvzf secret-manager-wrapper.tar.gz + +start-bk-prod-morph-prod-testnet-to-morph-prover-holesky: + /data/secret-manager-wrapper ./prover-server + +# challenge-handler +# testnet +build-bk-prod-morph-prod-testnet-to-morph-challenge-handler-holesky: + if [ ! -d dist ]; then mkdir -p dist; fi + cd $(PWD)/prover/bin/challenge && cargo build --release + cp prover/bin/challenge/target/release/challenge-handler dist/ + aws s3 cp s3://morph-0582-morph-technical-department-testnet-data/testnet/holesky/morph-setup/secret-manager-wrapper.tar.gz ./ + tar -xvzf secret-manager-wrapper.tar.gz + + +start-bk-prod-morph-prod-testnet-to-morph-challenge-handler-holesky: + /data/secret-manager-wrapper ./challenge-handler + +# shadow-proving +# testnet +build-bk-prod-morph-prod-testnet-to-morph-shadow-proving-holesky: + if [ ! -d dist ]; then mkdir -p dist; fi + cd $(PWD)/prover/bin/shadow-prove && cargo build --release + cp prover/bin/shadow-prove/target/release/shadow-proving dist/ + aws s3 cp s3://morph-0582-morph-technical-department-testnet-data/testnet/holesky/morph-setup/secret-manager-wrapper.tar.gz ./ + tar -xvzf secret-manager-wrapper.tar.gz + +start-bk-prod-morph-prod-testnet-to-morph-shadow-proving-holesky: + /data/secret-manager-wrapper ./shadow-proving + +# staking-oracle +# testnet +build-bk-prod-morph-prod-testnet-to-morph-staking-oracle-holesky: + if [ ! -d dist ]; then mkdir -p dist; fi + env GO111MODULE=on CGO_LDFLAGS="-ldl" CGO_ENABLED=1 go build -v $(LDFLAGS) -o oracle/staking-oracle ./oracle/cmd/staking-oracle + cp oracle/staking-oracle dist/ + aws s3 cp s3://morph-0582-morph-technical-department-testnet-data/testnet/holesky/morph-setup/secret-manager-wrapper.tar.gz ./ + tar -xvzf secret-manager-wrapper.tar.gz + +start-bk-prod-morph-prod-testnet-to-morph-staking-oracle-holesky: /data/secret-manager-wrapper ./staking-oracle \ No newline at end of file diff --git a/bindings/bin/distribute_deployed.hex b/bindings/bin/distribute_deployed.hex index de3304d9..f8c4dfac 100644 --- a/bindings/bin/distribute_deployed.hex +++ b/bindings/bin/distribute_deployed.hex @@ -1 +1 @@ -0x608060405234801561000f575f80fd5b5060043610610163575f3560e01c8063a766c529116100c7578063cd4281d01161007d578063d557714111610063578063d55771411461033e578063de6ac93314610365578063f2fde38b14610388575f80fd5b8063cd4281d014610304578063cdd0c50e1461032b575f80fd5b8063b809af0f116100ad578063b809af0f146102b6578063bf2dca0a146102c9578063c4d66de8146102f1575f80fd5b8063a766c5291461027b578063ac2ac640146102a3575f80fd5b8063807de4431161011c578063921ae9b811610102578063921ae9b8146102245780639889be5114610247578063996cba6814610268575f80fd5b8063807de443146101d45780638da5cb5b14610213575f80fd5b80635cf20c7b1161014c5780635cf20c7b146101a6578063715018a6146101b95780637f683ee3146101c1575f80fd5b8063273d8e82146101675780634eedab3214610191575b5f80fd5b61017a610175366004612512565b61039b565b60405161018892919061259d565b60405180910390f35b6101a461019f3660046125ca565b610729565b005b6101a46101b43660046125ca565b6107c7565b6101a46109a6565b6101a46101cf3660046125f2565b6109b9565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610188565b6033546001600160a01b03166101fb565b610237610232366004612512565b610bff565b6040516101889493929190612631565b61025a6102553660046126b0565b610f3c565b604051908152602001610188565b6101a46102763660046126e1565b611213565b61025a610289366004612512565b6001600160a01b03165f9081526067602052604090205490565b6101a46102b1366004612512565b611337565b6101a46102c4366004612727565b611480565b61025a6102d7366004612512565b6001600160a01b03165f9081526068602052604090205490565b6101a46102ff366004612512565b6115be565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b6101a46103393660046127ce565b611788565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b6103786103733660046126b0565b611ae8565b6040519015158152602001610188565b6101a4610396366004612512565b611b13565b6001600160a01b0381165f90815260696020526040812060609182916103c090611ba3565b9050805f0361043c5760405162461bcd60e51b815260206004820152602860248201527f696e76616c69642064656c656761746f72206f72206e6f2072656d61696e696e60448201527f672072657761726400000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b8067ffffffffffffffff8111156104555761045561286a565b60405190808252806020026020018201604052801561047e578160200160208202803683370190505b5092508067ffffffffffffffff81111561049a5761049a61286a565b6040519080825280602002602001820160405280156104c3578160200160208202803683370190505b5091505f5b6001600160a01b0385165f9081526069602052604090206104e890611ba3565b811015610722576001600160a01b0385165f9081526069602052604081206105109083611bac565b6001600160a01b038088165f908152606960209081526040808320938516835260039093019052908120549192509081908190805b6065548110156106bf576001600160a01b038087165f9081526066602090815260408083208584528252808320938f168352600490930190522054156105b9576001600160a01b038087165f9081526066602090815260408083208584528252808320938f16835260049093019052205492505b6001600160a01b0386165f9081526066602090815260408083208484529091529020600101541561060d576001600160a01b0386165f90815260666020908152604080832084845290915290206001015493505b6001600160a01b0386165f908152606660209081526040808320848452909152902054849061063d9085906128c4565b61064791906128db565b6106519086612913565b6001600160a01b03808d165f908152606960209081526040808320938b16835260029093019052205490955060ff1680156106b357506001600160a01b03808c165f908152606960209081526040808320938a16835260049093019052205481145b6106bf57600101610545565b50848987815181106106d3576106d3612926565b60200260200101906001600160a01b031690816001600160a01b0316815250508388878151811061070657610706612926565b60209081029190910101525050600190930192506104c8915050565b5050915091565b610731611bbe565b6001600160a01b0382165f908152606760205260409020545b8181116107a8576001600160a01b0383165f908152606660209081526040808320848452909152812081815560018101829055906002820181818161078f82826124c9565b50505050505080806107a090612953565b91505061074a565b6001600160a01b039092165f9081526067602052604090209190915550565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461083f5760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6065545f036108905760405162461bcd60e51b815260206004820152600e60248201527f6e6f74206d696e746564207965740000000000000000000000000000000000006044820152606401610433565b5f8115806108ab575060016065546108a8919061298a565b82115b6108b557816108c4565b60016065546108c4919061298a565b90505f805b6001600160a01b0385165f9081526069602052604090206108e990611ba3565b81101561098f576001600160a01b0385165f9081526069602052604081206109119083611bac565b6001600160a01b0387165f9081526069602052604090209091506109359082611c18565b801561096957506001600160a01b038087165f90815260696020908152604080832093851683526003909301905220548410155b1561098657610979818786611c39565b6109839084612913565b92505b506001016108c9565b5080156109a0576109a0848261208d565b50505050565b6109ae611bbe565b6109b75f6122e3565b565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610a315760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6001600160a01b0384165f9081526066602090815260408083208584529091529020600101819055811580610a8d57506001600160a01b038084165f908152606960209081526040808320938816835260039093019052205482145b15610b72576001600160a01b0384165f9081526066602090815260408083208584529091529020610ac1906002018461234c565b506001600160a01b038085165f90815260666020908152604080832086845282528083209387168352600490930181528282208290556069905220610b06908561234c565b506001600160a01b038381165f908152606960209081526040808320938816835260028401825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560038401825280832083905560049093019052908120556109a0565b6001600160a01b038084165f9081526069602090815260408083209388168352600290930190522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155610bd0908361298a565b6001600160a01b038085165f908152606960209081526040808320938916835260049093019052205550505050565b6001600160a01b0381165f908152606960205260408120606091829182918291610c2890611ba3565b90505f8167ffffffffffffffff811115610c4457610c4461286a565b604051908082528060200260200182016040528015610c6d578160200160208202803683370190505b5090505f8267ffffffffffffffff811115610c8a57610c8a61286a565b604051908082528060200260200182016040528015610cb3578160200160208202803683370190505b5090505f8367ffffffffffffffff811115610cd057610cd061286a565b604051908082528060200260200182016040528015610cf9578160200160208202803683370190505b5090505f8467ffffffffffffffff811115610d1657610d1661286a565b604051908082528060200260200182016040528015610d3f578160200160208202803683370190505b5090505f5b85811015610f2b576001600160a01b038b165f908152606960205260409020610d6d9082611bac565b858281518110610d7f57610d7f612926565b60200260200101906001600160a01b031690816001600160a01b03168152505060695f8c6001600160a01b03166001600160a01b031681526020019081526020015f206002015f868381518110610dd857610dd8612926565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f9054906101000a900460ff16848281518110610e1e57610e1e612926565b9115156020928302919091018201526001600160a01b038c165f908152606990915260408120865160039091019190879084908110610e5f57610e5f612926565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054838281518110610e9957610e99612926565b60200260200101818152505060695f8c6001600160a01b03166001600160a01b031681526020019081526020015f206004015f868381518110610ede57610ede612926565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054828281518110610f1857610f18612926565b6020908102919091010152600101610d44565b509299919850965090945092505050565b6001600160a01b0381165f908152606960205260408120610f5c90611ba3565b5f03610fd05760405162461bcd60e51b815260206004820152602860248201527f696e76616c69642064656c656761746f72206f72206e6f2072656d61696e696e60448201527f67207265776172640000000000000000000000000000000000000000000000006064820152608401610433565b6001600160a01b0382165f908152606960205260409020610ff19084611c18565b6110625760405162461bcd60e51b8152602060048201526024808201527f6e6f2072656d61696e696e6720726577617264206f66207468652064656c656760448201527f61746565000000000000000000000000000000000000000000000000000000006064820152608401610433565b6001600160a01b038083165f9081526069602090815260408083209387168352600390930190529081205481905b60655481101561120a576001600160a01b038087165f9081526066602090815260408083208584528252808320938916835260049093019052205415611104576001600160a01b038087165f9081526066602090815260408083208584528252808320938916835260049093019052205491505b6001600160a01b0386165f90815260666020908152604080832084845290915290206001015415611158576001600160a01b0386165f90815260666020908152604080832084845290915290206001015492505b6001600160a01b0386165f90815260666020908152604080832084845290915290205483906111889084906128c4565b61119291906128db565b61119c9085612913565b6001600160a01b038087165f908152606960209081526040808320938b16835260029093019052205490945060ff1680156111fe57506001600160a01b038086165f908152606960209081526040808320938a16835260049093019052205481145b61120a57600101611090565b50505092915050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461128b5760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6065545f036112dc5760405162461bcd60e51b815260206004820152600e60248201527f6e6f74206d696e746564207965740000000000000000000000000000000000006044820152606401610433565b5f8115806112f7575060016065546112f4919061298a565b82115b6113015781611310565b6001606554611310919061298a565b90505f61131e858584611c39565b9050801561133057611330848261208d565b5050505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146113af5760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6001600160a01b0381165f908152606860205260409020546114135760405162461bcd60e51b815260206004820152601660248201527f6e6f20636f6d6d697373696f6e20746f20636c61696d000000000000000000006044820152606401610433565b6001600160a01b0381165f9081526068602052604081208054919055611439828261208d565b816001600160a01b03167f8e14daa5332205b1634040e1054e93d1f5396ec8bf0115d133b7fbaf4a52e4118260405161147491815260200190565b60405180910390a25050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146114f85760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6001600160a01b0386165f90815260666020908152604080832087845290915290206001810183905561152e9060020186612360565b506001600160a01b038087165f90815260666020908152604080832088845282528083209389168352600490930190522083905580156115b6576001600160a01b0385165f9081526069602052604090206115899087612360565b506001600160a01b038086165f908152606960209081526040808320938a16835260039093019052208490555b505050505050565b5f54610100900460ff16158080156115dc57505f54600160ff909116105b806115f55750303b1580156115f557505f5460ff166001145b6116675760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610433565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156116c3575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b0382166117195760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964206f776e6572206164647265737300000000000000000000006044820152606401610433565b611722826122e3565b8015611784575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146118005760405162461bcd60e51b815260206004820152601c60248201527f6f6e6c79207265636f726420636f6e747261637420616c6c6f776564000000006044820152606401610433565b60658054905f61180f83612953565b9190505550866001606554611824919061298a565b146118715760405162461bcd60e51b815260206004820152601360248201527f696e76616c69642065706f636820696e646578000000000000000000000000006044820152606401610433565b828514801561187f57508085145b6118cb5760405162461bcd60e51b815260206004820152601360248201527f696e76616c69642064617461206c656e677468000000000000000000000000006044820152606401610433565b5f5b85811015611ade578484828181106118e7576118e7612926565b9050602002013560665f89898581811061190357611903612926565b90506020020160208101906119189190612512565b6001600160a01b0316815260208082019290925260409081015f9081208c825290925281209190915560669088888481811061195657611956612926565b905060200201602081019061196b9190612512565b6001600160a01b0316815260208082019290925260409081015f9081208b82529092529020600101541580156119a057505f88115b15611a615760665f8888848181106119ba576119ba612926565b90506020020160208101906119cf9190612512565b6001600160a01b03166001600160a01b031681526020019081526020015f205f60018a6119fc919061298a565b81526020019081526020015f206001015460665f898985818110611a2257611a22612926565b9050602002016020810190611a379190612512565b6001600160a01b0316815260208082019290925260409081015f9081208c82529092529020600101555b828282818110611a7357611a73612926565b9050602002013560685f898985818110611a8f57611a8f612926565b9050602002016020810190611aa49190612512565b6001600160a01b03166001600160a01b031681526020019081526020015f205f828254611ad19190612913565b90915550506001016118cd565b5050505050505050565b6001600160a01b0382165f908152606960205260408120611b099083611c18565b1590505b92915050565b611b1b611bbe565b6001600160a01b038116611b975760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610433565b611ba0816122e3565b50565b5f611b0d825490565b5f611bb78383612374565b9392505050565b6033546001600160a01b031633146109b75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610433565b6001600160a01b0381165f9081526001830160205260408120541515611bb7565b6001600160a01b0382165f908152606960205260408120611c5a9085611c18565b611ca65760405162461bcd60e51b815260206004820152601360248201527f6e6f2072656d61696e696e6720726577617264000000000000000000000000006044820152606401610433565b6001600160a01b038084165f9081526069602090815260408083209388168352600390930190522054821015611d1e5760405162461bcd60e51b815260206004820152601260248201527f616c6c2072657761726420636c61696d656400000000000000000000000000006044820152606401610433565b6001600160a01b038084165f9081526069602090815260408083209388168352600390930190529081205481905b848111611f5b576001600160a01b038088165f9081526066602090815260408083208584528252808320938a16835260049093019052205415611dbd576001600160a01b038088165f9081526066602090815260408083208584528252808320938a16835260049093019052205491505b6001600160a01b0387165f90815260666020908152604080832084845290915290206001015415611e11576001600160a01b0387165f90815260666020908152604080832084845290915290206001015492505b6001600160a01b0387165f9081526066602090815260408083208484529091529020548390611e419084906128c4565b611e4b91906128db565b611e559085612913565b6001600160a01b038088165f908152606960209081526040808320938c16835260029093019052205490945060ff168015611eb757506001600160a01b038087165f908152606960209081526040808320938b16835260049093019052205481145b15611f49576001600160a01b0386165f908152606960205260409020611edd908861234c565b506001600160a01b038681165f908152606960209081526040808320938b16835260028401825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556003840182528083208390556004909301905290812055611f5b565b80611f5381612953565b915050611d4c565b50611f67846001612913565b6001600160a01b038087165f908152606960209081526040808320938b16835260039093018152828220939093556066909252812090611fa8866001612913565b81526020019081526020015f206004015f866001600160a01b03166001600160a01b031681526020019081526020015f20545f0361202e576001600160a01b0386165f9081526066602052604081208291612004876001612913565b815260208082019290925260409081015f9081206001600160a01b038a1682526004019092529020555b856001600160a01b0316856001600160a01b03167f7a84a08b02c91f3c62d572853f966fc799bbd121e8ad7833a4494ab8dcfcb404868660405161207c929190918252602082015260400190565b60405180910390a350509392505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561210a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061212e919061299d565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152602482018590529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303815f875af11580156121b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121dc91906129b4565b506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561225a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061227e919061299d565b90505f83118015612297575082612295828461298a565b145b6109a05760405162461bcd60e51b815260206004820152601b60248201527f6d6f72706820746f6b656e207472616e73666572206661696c656400000000006044820152606401610433565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f611bb7836001600160a01b03841661239a565b5f611bb7836001600160a01b03841661247d565b5f825f01828154811061238957612389612926565b905f5260205f200154905092915050565b5f8181526001830160205260408120548015612474575f6123bc60018361298a565b85549091505f906123cf9060019061298a565b905081811461242e575f865f0182815481106123ed576123ed612926565b905f5260205f200154905080875f01848154811061240d5761240d612926565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061243f5761243f6129cf565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611b0d565b5f915050611b0d565b5f8181526001830160205260408120546124c257508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155611b0d565b505f611b0d565b5080545f8255905f5260205f2090810190611ba091905b808211156124f3575f81556001016124e0565b5090565b80356001600160a01b038116811461250d575f80fd5b919050565b5f60208284031215612522575f80fd5b611bb7826124f7565b5f815180845260208085019450602084015f5b838110156125635781516001600160a01b03168752958201959082019060010161253e565b509495945050505050565b5f815180845260208085019450602084015f5b8381101561256357815187529582019590820190600101612581565b604081525f6125af604083018561252b565b82810360208401526125c1818561256e565b95945050505050565b5f80604083850312156125db575f80fd5b6125e4836124f7565b946020939093013593505050565b5f805f8060808587031215612605575f80fd5b61260e856124f7565b935061261c602086016124f7565b93969395505050506040820135916060013590565b608081525f612643608083018761252b565b8281036020848101919091528651808352878201928201905f5b8181101561267b57845115158352938301939183019160010161265d565b5050848103604086015261268f818861256e565b9250505082810360608401526126a5818561256e565b979650505050505050565b5f80604083850312156126c1575f80fd5b6126ca836124f7565b91506126d8602084016124f7565b90509250929050565b5f805f606084860312156126f3575f80fd5b6126fc846124f7565b925061270a602085016124f7565b9150604084013590509250925092565b8015158114611ba0575f80fd5b5f805f805f8060c0878903121561273c575f80fd5b612745876124f7565b9550612753602088016124f7565b945060408701359350606087013592506080870135915060a08701356127788161271a565b809150509295509295509295565b5f8083601f840112612796575f80fd5b50813567ffffffffffffffff8111156127ad575f80fd5b6020830191508360208260051b85010111156127c7575f80fd5b9250929050565b5f805f805f805f6080888a0312156127e4575f80fd5b87359650602088013567ffffffffffffffff80821115612802575f80fd5b61280e8b838c01612786565b909850965060408a0135915080821115612826575f80fd5b6128328b838c01612786565b909650945060608a013591508082111561284a575f80fd5b506128578a828b01612786565b989b979a50959850939692959293505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082028115828204841417611b0d57611b0d612897565b5f8261290e577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b80820180821115611b0d57611b0d612897565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361298357612983612897565b5060010190565b81810381811115611b0d57611b0d612897565b5f602082840312156129ad575f80fd5b5051919050565b5f602082840312156129c4575f80fd5b8151611bb78161271a565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea164736f6c6343000818000a +0x608060405234801561000f575f80fd5b5060043610610163575f3560e01c8063a766c529116100c7578063cd4281d01161007d578063d557714111610063578063d55771411461033e578063de6ac93314610365578063f2fde38b14610388575f80fd5b8063cd4281d014610304578063cdd0c50e1461032b575f80fd5b8063b809af0f116100ad578063b809af0f146102b6578063bf2dca0a146102c9578063c4d66de8146102f1575f80fd5b8063a766c5291461027b578063ac2ac640146102a3575f80fd5b8063807de4431161011c578063921ae9b811610102578063921ae9b8146102245780639889be5114610247578063996cba6814610268575f80fd5b8063807de443146101d45780638da5cb5b14610213575f80fd5b80635cf20c7b1161014c5780635cf20c7b146101a6578063715018a6146101b95780637f683ee3146101c1575f80fd5b8063273d8e82146101675780634eedab3214610191575b5f80fd5b61017a610175366004612537565b61039b565b6040516101889291906125c2565b60405180910390f35b6101a461019f3660046125ef565b610729565b005b6101a46101b43660046125ef565b6107c7565b6101a46109c3565b6101a46101cf366004612617565b6109d6565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610188565b6033546001600160a01b03166101fb565b610237610232366004612537565b610c1c565b6040516101889493929190612656565b61025a6102553660046126d5565b610f59565b604051908152602001610188565b6101a4610276366004612706565b611230565b61025a610289366004612537565b6001600160a01b03165f9081526067602052604090205490565b6101a46102b1366004612537565b611355565b6101a46102c436600461274c565b61149e565b61025a6102d7366004612537565b6001600160a01b03165f9081526068602052604090205490565b6101a46102ff366004612537565b6115dc565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b6101a46103393660046127f3565b6117a6565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b6103786103733660046126d5565b611b06565b6040519015158152602001610188565b6101a4610396366004612537565b611b31565b6001600160a01b0381165f90815260696020526040812060609182916103c090611bc1565b9050805f0361043c5760405162461bcd60e51b815260206004820152602860248201527f696e76616c69642064656c656761746f72206f72206e6f2072656d61696e696e60448201527f672072657761726400000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b8067ffffffffffffffff8111156104555761045561288f565b60405190808252806020026020018201604052801561047e578160200160208202803683370190505b5092508067ffffffffffffffff81111561049a5761049a61288f565b6040519080825280602002602001820160405280156104c3578160200160208202803683370190505b5091505f5b6001600160a01b0385165f9081526069602052604090206104e890611bc1565b811015610722576001600160a01b0385165f9081526069602052604081206105109083611bca565b6001600160a01b038088165f908152606960209081526040808320938516835260039093019052908120549192509081908190805b6065548110156106bf576001600160a01b038087165f9081526066602090815260408083208584528252808320938f168352600490930190522054156105b9576001600160a01b038087165f9081526066602090815260408083208584528252808320938f16835260049093019052205492505b6001600160a01b0386165f9081526066602090815260408083208484529091529020600101541561060d576001600160a01b0386165f90815260666020908152604080832084845290915290206001015493505b6001600160a01b0386165f908152606660209081526040808320848452909152902054849061063d9085906128e9565b6106479190612900565b6106519086612938565b6001600160a01b03808d165f908152606960209081526040808320938b16835260029093019052205490955060ff1680156106b357506001600160a01b03808c165f908152606960209081526040808320938a16835260049093019052205481145b6106bf57600101610545565b50848987815181106106d3576106d361294b565b60200260200101906001600160a01b031690816001600160a01b031681525050838887815181106107065761070661294b565b60209081029190910101525050600190930192506104c8915050565b5050915091565b610731611bdc565b6001600160a01b0382165f908152606760205260409020545b8181116107a8576001600160a01b0383165f908152606660209081526040808320848452909152812081815560018101829055906002820181818161078f82826124ee565b50505050505080806107a090612978565b91505061074a565b6001600160a01b039092165f9081526067602052604090209190915550565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461083f5760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6065545f036108905760405162461bcd60e51b815260206004820152600e60248201527f6e6f74206d696e746564207965740000000000000000000000000000000000006044820152606401610433565b5f8115806108ab575060016065546108a891906129af565b82115b6108b557816108c4565b60016065546108c491906129af565b90505f805b6001600160a01b0385165f9081526069602052604090206108e990611bc1565b8110156109ac576001600160a01b0385165f90815260696020526040812081906109139084611bca565b6001600160a01b0388165f9081526069602052604090209091506109379082611c36565b801561096b57506001600160a01b038088165f90815260696020908152604080832093851683526003909301905220548510155b15610992575f8061097d838a89611c57565b909250905061098c8287612938565b95509250505b816109a557826109a181612978565b9350505b50506108c9565b5080156109bd576109bd84826120b2565b50505050565b6109cb611bdc565b6109d45f612308565b565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610a4e5760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6001600160a01b0384165f9081526066602090815260408083208584529091529020600101819055811580610aaa57506001600160a01b038084165f908152606960209081526040808320938816835260039093019052205482145b15610b8f576001600160a01b0384165f9081526066602090815260408083208584529091529020610ade9060020184612371565b506001600160a01b038085165f90815260666020908152604080832086845282528083209387168352600490930181528282208290556069905220610b239085612371565b506001600160a01b038381165f908152606960209081526040808320938816835260028401825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560038401825280832083905560049093019052908120556109bd565b6001600160a01b038084165f9081526069602090815260408083209388168352600290930190522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155610bed90836129af565b6001600160a01b038085165f908152606960209081526040808320938916835260049093019052205550505050565b6001600160a01b0381165f908152606960205260408120606091829182918291610c4590611bc1565b90505f8167ffffffffffffffff811115610c6157610c6161288f565b604051908082528060200260200182016040528015610c8a578160200160208202803683370190505b5090505f8267ffffffffffffffff811115610ca757610ca761288f565b604051908082528060200260200182016040528015610cd0578160200160208202803683370190505b5090505f8367ffffffffffffffff811115610ced57610ced61288f565b604051908082528060200260200182016040528015610d16578160200160208202803683370190505b5090505f8467ffffffffffffffff811115610d3357610d3361288f565b604051908082528060200260200182016040528015610d5c578160200160208202803683370190505b5090505f5b85811015610f48576001600160a01b038b165f908152606960205260409020610d8a9082611bca565b858281518110610d9c57610d9c61294b565b60200260200101906001600160a01b031690816001600160a01b03168152505060695f8c6001600160a01b03166001600160a01b031681526020019081526020015f206002015f868381518110610df557610df561294b565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f9054906101000a900460ff16848281518110610e3b57610e3b61294b565b9115156020928302919091018201526001600160a01b038c165f908152606990915260408120865160039091019190879084908110610e7c57610e7c61294b565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054838281518110610eb657610eb661294b565b60200260200101818152505060695f8c6001600160a01b03166001600160a01b031681526020019081526020015f206004015f868381518110610efb57610efb61294b565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054828281518110610f3557610f3561294b565b6020908102919091010152600101610d61565b509299919850965090945092505050565b6001600160a01b0381165f908152606960205260408120610f7990611bc1565b5f03610fed5760405162461bcd60e51b815260206004820152602860248201527f696e76616c69642064656c656761746f72206f72206e6f2072656d61696e696e60448201527f67207265776172640000000000000000000000000000000000000000000000006064820152608401610433565b6001600160a01b0382165f90815260696020526040902061100e9084611c36565b61107f5760405162461bcd60e51b8152602060048201526024808201527f6e6f2072656d61696e696e6720726577617264206f66207468652064656c656760448201527f61746565000000000000000000000000000000000000000000000000000000006064820152608401610433565b6001600160a01b038083165f9081526069602090815260408083209387168352600390930190529081205481905b606554811015611227576001600160a01b038087165f9081526066602090815260408083208584528252808320938916835260049093019052205415611121576001600160a01b038087165f9081526066602090815260408083208584528252808320938916835260049093019052205491505b6001600160a01b0386165f90815260666020908152604080832084845290915290206001015415611175576001600160a01b0386165f90815260666020908152604080832084845290915290206001015492505b6001600160a01b0386165f90815260666020908152604080832084845290915290205483906111a59084906128e9565b6111af9190612900565b6111b99085612938565b6001600160a01b038087165f908152606960209081526040808320938b16835260029093019052205490945060ff16801561121b57506001600160a01b038086165f908152606960209081526040808320938a16835260049093019052205481145b611227576001016110ad565b50505092915050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146112a85760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6065545f036112f95760405162461bcd60e51b815260206004820152600e60248201527f6e6f74206d696e746564207965740000000000000000000000000000000000006044820152606401610433565b5f8115806113145750600160655461131191906129af565b82115b61131e578161132d565b600160655461132d91906129af565b90505f61133b858584611c57565b509050801561134e5761134e84826120b2565b5050505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146113cd5760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6001600160a01b0381165f908152606860205260409020546114315760405162461bcd60e51b815260206004820152601660248201527f6e6f20636f6d6d697373696f6e20746f20636c61696d000000000000000000006044820152606401610433565b6001600160a01b0381165f908152606860205260408120805491905561145782826120b2565b816001600160a01b03167f8e14daa5332205b1634040e1054e93d1f5396ec8bf0115d133b7fbaf4a52e4118260405161149291815260200190565b60405180910390a25050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146115165760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6001600160a01b0386165f90815260666020908152604080832087845290915290206001810183905561154c9060020186612385565b506001600160a01b038087165f90815260666020908152604080832088845282528083209389168352600490930190522083905580156115d4576001600160a01b0385165f9081526069602052604090206115a79087612385565b506001600160a01b038086165f908152606960209081526040808320938a16835260039093019052208490555b505050505050565b5f54610100900460ff16158080156115fa57505f54600160ff909116105b806116135750303b15801561161357505f5460ff166001145b6116855760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610433565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156116e1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b0382166117375760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964206f776e6572206164647265737300000000000000000000006044820152606401610433565b61174082612308565b80156117a2575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461181e5760405162461bcd60e51b815260206004820152601c60248201527f6f6e6c79207265636f726420636f6e747261637420616c6c6f776564000000006044820152606401610433565b60658054905f61182d83612978565b919050555086600160655461184291906129af565b1461188f5760405162461bcd60e51b815260206004820152601360248201527f696e76616c69642065706f636820696e646578000000000000000000000000006044820152606401610433565b828514801561189d57508085145b6118e95760405162461bcd60e51b815260206004820152601360248201527f696e76616c69642064617461206c656e677468000000000000000000000000006044820152606401610433565b5f5b85811015611afc578484828181106119055761190561294b565b9050602002013560665f8989858181106119215761192161294b565b90506020020160208101906119369190612537565b6001600160a01b0316815260208082019290925260409081015f9081208c82529092528120919091556066908888848181106119745761197461294b565b90506020020160208101906119899190612537565b6001600160a01b0316815260208082019290925260409081015f9081208b82529092529020600101541580156119be57505f88115b15611a7f5760665f8888848181106119d8576119d861294b565b90506020020160208101906119ed9190612537565b6001600160a01b03166001600160a01b031681526020019081526020015f205f60018a611a1a91906129af565b81526020019081526020015f206001015460665f898985818110611a4057611a4061294b565b9050602002016020810190611a559190612537565b6001600160a01b0316815260208082019290925260409081015f9081208c82529092529020600101555b828282818110611a9157611a9161294b565b9050602002013560685f898985818110611aad57611aad61294b565b9050602002016020810190611ac29190612537565b6001600160a01b03166001600160a01b031681526020019081526020015f205f828254611aef9190612938565b90915550506001016118eb565b5050505050505050565b6001600160a01b0382165f908152606960205260408120611b279083611c36565b1590505b92915050565b611b39611bdc565b6001600160a01b038116611bb55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610433565b611bbe81612308565b50565b5f611b2b825490565b5f611bd58383612399565b9392505050565b6033546001600160a01b031633146109d45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610433565b6001600160a01b0381165f9081526001830160205260408120541515611bd5565b6001600160a01b0382165f9081526069602052604081208190611c7a9086611c36565b611cc65760405162461bcd60e51b815260206004820152601360248201527f6e6f2072656d61696e696e6720726577617264000000000000000000000000006044820152606401610433565b6001600160a01b038085165f9081526069602090815260408083209389168352600390930190522054831015611d3e5760405162461bcd60e51b815260206004820152601260248201527f616c6c2072657761726420636c61696d656400000000000000000000000000006044820152606401610433565b6001600160a01b038085165f9081526069602090815260408083209389168352600390930190529081205481905b858111611f7f576001600160a01b038089165f9081526066602090815260408083208584528252808320938b16835260049093019052205415611ddd576001600160a01b038089165f9081526066602090815260408083208584528252808320938b16835260049093019052205491505b6001600160a01b0388165f90815260666020908152604080832084845290915290206001015415611e31576001600160a01b0388165f90815260666020908152604080832084845290915290206001015492505b6001600160a01b0388165f9081526066602090815260408083208484529091529020548390611e619084906128e9565b611e6b9190612900565b611e759086612938565b6001600160a01b038089165f908152606960209081526040808320938d16835260029093019052205490955060ff168015611ed757506001600160a01b038088165f908152606960209081526040808320938c16835260049093019052205481145b15611f6d576001600160a01b0387165f90815260696020526040902060019450611f019089612371565b506001600160a01b038781165f908152606960209081526040808320938c16835260028401825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556003840182528083208390556004909301905290812055611f7f565b80611f7781612978565b915050611d6c565b50611f8b856001612938565b6001600160a01b038088165f908152606960209081526040808320938c16835260039093018152828220939093556066909252812090611fcc876001612938565b81526020019081526020015f206004015f876001600160a01b03166001600160a01b031681526020019081526020015f20545f03612052576001600160a01b0387165f9081526066602052604081208291612028886001612938565b815260208082019290925260409081015f9081206001600160a01b038b1682526004019092529020555b866001600160a01b0316866001600160a01b03167f7a84a08b02c91f3c62d572853f966fc799bbd121e8ad7833a4494ab8dcfcb40487876040516120a0929190918252602082015260400190565b60405180910390a35050935093915050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561212f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061215391906129c2565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152602482018590529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303815f875af11580156121dd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061220191906129d9565b506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561227f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a391906129c2565b90505f831180156122bc5750826122ba82846129af565b145b6109bd5760405162461bcd60e51b815260206004820152601b60248201527f6d6f72706820746f6b656e207472616e73666572206661696c656400000000006044820152606401610433565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f611bd5836001600160a01b0384166123bf565b5f611bd5836001600160a01b0384166124a2565b5f825f0182815481106123ae576123ae61294b565b905f5260205f200154905092915050565b5f8181526001830160205260408120548015612499575f6123e16001836129af565b85549091505f906123f4906001906129af565b9050818114612453575f865f0182815481106124125761241261294b565b905f5260205f200154905080875f0184815481106124325761243261294b565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080612464576124646129f4565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611b2b565b5f915050611b2b565b5f8181526001830160205260408120546124e757508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155611b2b565b505f611b2b565b5080545f8255905f5260205f2090810190611bbe91905b80821115612518575f8155600101612505565b5090565b80356001600160a01b0381168114612532575f80fd5b919050565b5f60208284031215612547575f80fd5b611bd58261251c565b5f815180845260208085019450602084015f5b838110156125885781516001600160a01b031687529582019590820190600101612563565b509495945050505050565b5f815180845260208085019450602084015f5b83811015612588578151875295820195908201906001016125a6565b604081525f6125d46040830185612550565b82810360208401526125e68185612593565b95945050505050565b5f8060408385031215612600575f80fd5b6126098361251c565b946020939093013593505050565b5f805f806080858703121561262a575f80fd5b6126338561251c565b93506126416020860161251c565b93969395505050506040820135916060013590565b608081525f6126686080830187612550565b8281036020848101919091528651808352878201928201905f5b818110156126a0578451151583529383019391830191600101612682565b505084810360408601526126b48188612593565b9250505082810360608401526126ca8185612593565b979650505050505050565b5f80604083850312156126e6575f80fd5b6126ef8361251c565b91506126fd6020840161251c565b90509250929050565b5f805f60608486031215612718575f80fd5b6127218461251c565b925061272f6020850161251c565b9150604084013590509250925092565b8015158114611bbe575f80fd5b5f805f805f8060c08789031215612761575f80fd5b61276a8761251c565b95506127786020880161251c565b945060408701359350606087013592506080870135915060a087013561279d8161273f565b809150509295509295509295565b5f8083601f8401126127bb575f80fd5b50813567ffffffffffffffff8111156127d2575f80fd5b6020830191508360208260051b85010111156127ec575f80fd5b9250929050565b5f805f805f805f6080888a031215612809575f80fd5b87359650602088013567ffffffffffffffff80821115612827575f80fd5b6128338b838c016127ab565b909850965060408a013591508082111561284b575f80fd5b6128578b838c016127ab565b909650945060608a013591508082111561286f575f80fd5b5061287c8a828b016127ab565b989b979a50959850939692959293505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082028115828204841417611b2b57611b2b6128bc565b5f82612933577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b80820180821115611b2b57611b2b6128bc565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036129a8576129a86128bc565b5060010190565b81810381811115611b2b57611b2b6128bc565b5f602082840312156129d2575f80fd5b5051919050565b5f602082840312156129e9575f80fd5b8151611bd58161273f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea164736f6c6343000818000a diff --git a/bindings/bin/gov_deployed.hex b/bindings/bin/gov_deployed.hex index c6ac23fb..bd4d5d5d 100644 --- a/bindings/bin/gov_deployed.hex +++ b/bindings/bin/gov_deployed.hex @@ -1 +1 @@ -0x608060405234801561000f575f80fd5b5060043610610163575f3560e01c806377c79380116100c757806396dea9361161007d578063e5aec99511610063578063e5aec9951461036a578063f2fde38b14610373578063f92ad21914610386575f80fd5b806396dea936146102e3578063b511328d1461032c575f80fd5b806385963052116100ad57806385963052146102955780638da5cb5b1461029e5780638e21d5fb146102bc575f80fd5b806377c7938014610240578063807de44314610249575f80fd5b806349c1a5811161011c578063639661901161010257806363966190146101fd578063715018a61461020657806374c260cf1461020e575f80fd5b806349c1a581146101c75780635bcfadb5146101ea575f80fd5b8063132002fc1161014c578063132002fc1461018f578063237a4b96146101ab5780634428c1a4146101be575f80fd5b80630121b93f146101675780630d61b5191461017c575b5f80fd5b61017a6101753660046115d6565b610399565b005b61017a61018a3660046115d6565b610690565b610198606b5481565b6040519081526020015b60405180910390f35b6101986101b93660046115ed565b610744565b610198606a5481565b6101da6101d5366004611624565b610a34565b60405190151581526020016101a2565b61017a6101f83660046115d6565b610a54565b610198606c5481565b61017a610b23565b61022161021c3660046115d6565b610b36565b60408051931515845291151560208401521515908201526060016101a2565b61019860675481565b6102707f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a2565b61019860655481565b60335473ffffffffffffffffffffffffffffffffffffffff16610270565b6102707f000000000000000000000000000000000000000000000000000000000000000081565b6103116102f13660046115d6565b606e6020525f908152604090208054600182015460029092015490919083565b604080519384526020840192909252908201526060016101a2565b61035561033a3660046115d6565b606f6020525f90815260409020805460019091015460ff1682565b604080519283529015156020830152016101a2565b61019860695481565b61017a610381366004611652565b610c23565b61017a610394366004611674565b610cc0565b5f73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016636d46e987336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa15801561043e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061046291906116b4565b9050806104b65760405162461bcd60e51b815260206004820152601660248201527f6f6e6c792073657175656e63657220616c6c6f7765640000000000000000000060448201526064015b60405180910390fd5b606c548211156105085760405162461bcd60e51b815260206004820152601260248201527f696e76616c69642070726f706f73616c4944000000000000000000000000000060448201526064016104ad565b606d5482101561055a5760405162461bcd60e51b815260206004820152600f60248201527f70726f706f73616c207072756e6564000000000000000000000000000000000060448201526064016104ad565b5f828152606f60205260409020805460019091015460ff168061057b575080155b8061058557504281105b156105d25760405162461bcd60e51b815260206004820152601060248201527f766f74696e672068617320656e6465640000000000000000000000000000000060448201526064016104ad565b6105e9335f8581526070602052604090209061108e565b1561065c5760405162461bcd60e51b815260206004820152602960248201527f73657175656e63657220616c726561647920766f74656420666f72207468697360448201527f2070726f706f73616c000000000000000000000000000000000000000000000060648201526084016104ad565b610673335f858152607060205260409020906110bc565b5061067d836110dd565b1561068b5761068b83611214565b505050565b5f8061069b83610b36565b509150915081156106ee5760405162461bcd60e51b815260206004820152601060248201527f766f74696e672068617320656e6465640000000000000000000000000000000060448201526064016104ad565b8061073b5760405162461bcd60e51b815260206004820181905260248201527f70726f706f73616c20686173206e6f74206265656e207061737365642079657460448201526064016104ad565b61068b83611214565b5f8073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016636d46e987336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa1580156107ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061080e91906116b4565b90508061085d5760405162461bcd60e51b815260206004820152601660248201527f6f6e6c792073657175656e63657220616c6c6f7765640000000000000000000060448201526064016104ad565b82604001355f036108b05760405162461bcd60e51b815260206004820152601460248201527f696e76616c696420726f6c6c75702065706f636800000000000000000000000060448201526064016104ad565b82351515806108c25750602083013515155b61090e5760405162461bcd60e51b815260206004820152601460248201527f696e76616c696420626174636820706172616d7300000000000000000000000060448201526064016104ad565b606c8054905f61091d83611700565b9091555050606c545f908152606e60205260409020839061095582828135815560208201356001820155604082013560028201555050565b9050506040518060400160405280606b54426109719190611737565b81525f6020918201819052606c548152606f82526040902082518155910151600190910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905533606c54604080518635815260208088013590820152818701359181019190915273ffffffffffffffffffffffffffffffffffffffff92909216917f66e5b37817dfa9935ab8e631ce7774a2e773d56cc8ea6815ac65f1fbac6420849060600160405180910390a35050606c54919050565b5f828152607060205260408120610a4b908361108e565b90505b92915050565b610a5c61147f565b5f81118015610a6d5750606b548114155b610ade5760405162461bcd60e51b8152602060048201526024808201527f696e76616c6964206e65772070726f706f73616c20766f74696e67206475726160448201527f74696f6e0000000000000000000000000000000000000000000000000000000060648201526084016104ad565b606b80549082905560408051828152602081018490527ffe810823e41a0cf27003f3eac9c17098028ba0aece75bd9783a8da7f75fb3aa3910160405180910390a15050565b610b2b61147f565b610b345f6114e6565b565b5f805f606c54841115610b8b5760405162461bcd60e51b815260206004820152601260248201527f696e76616c69642070726f706f73616c4944000000000000000000000000000060448201526064016104ad565b606d54841015610bdd5760405162461bcd60e51b815260206004820152600f60248201527f70726f706f73616c207072756e6564000000000000000000000000000000000060448201526064016104ad565b5f848152606f602052604090206001810154905460ff909116908180610c01575080155b80610c0b57504281105b610c14876110dd565b90979096509194509092505050565b610c2b61147f565b73ffffffffffffffffffffffffffffffffffffffff8116610cb45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104ad565b610cbd816114e6565b50565b5f54610100900460ff1615808015610cde57505f54600160ff909116105b80610cf75750303b158015610cf757505f5460ff166001145b610d695760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104ad565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610dc5575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff8616610e285760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964206f776e65722061646472657373000000000000000000000060448201526064016104ad565b5f8511610e775760405162461bcd60e51b815260206004820181905260248201527f696e76616c69642070726f706f73616c20766f74696e67206475726174696f6e60448201526064016104ad565b5f8211610ec65760405162461bcd60e51b815260206004820152601460248201527f696e76616c696420726f6c6c75702065706f636800000000000000000000000060448201526064016104ad565b83151580610ed357508215155b610f1f5760405162461bcd60e51b815260206004820152601460248201527f696e76616c696420626174636820706172616d7300000000000000000000000060448201526064016104ad565b610f28866114e6565b606b85905560658490556067839055606982905542606a55604080515f8152602081018790527ffe810823e41a0cf27003f3eac9c17098028ba0aece75bd9783a8da7f75fb3aa3910160405180910390a1604080515f8152602081018690527fa044538eba1b21d23eb13fa35811ca9d1d7ff9ef1c81ee4dc594fca08412531b910160405180910390a1604080515f8152602081018590527fab2cb47d396c5d12c082ac9b6512d332af2767ca8e1fa5bcef40fa6970626569910160405180910390a1604080515f8152602081018490527f9b20ee151d057f4f3ece7fdf4ca1370cf143f181760e7712b722572f2dcba88f910160405180910390a18015611086575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526001830160205260408120541515610a4b565b5f610a4b8373ffffffffffffffffffffffffffffffffffffffff841661155c565b5f807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166377d7dffb6040518163ffffffff1660e01b81526004015f60405180830381865afa158015611147573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261118c9190810190611787565b90505f805b82518110156111f1576111d68382815181106111af576111af611865565b602002602001015160705f8881526020019081526020015f2061108e90919063ffffffff16565b156111e9576111e6826001611737565b91505b600101611191565b506003825160026112029190611892565b61120c91906118a9565b109392505050565b5f818152606e60205260409020546065541461128357606580545f838152606e60205260409081902054928390555190917fa044538eba1b21d23eb13fa35811ca9d1d7ff9ef1c81ee4dc594fca08412531b9161127991848252602082015260400190565b60405180910390a1505b5f818152606e6020526040902060010154606754146112f857606780545f838152606e60205260409081902060010154928390555190917fab2cb47d396c5d12c082ac9b6512d332af2767ca8e1fa5bcef40fa6970626569916112ee91848252602082015260400190565b60405180910390a1505b5f818152606e60205260409020600201546069541461136c57606980545f838152606e6020908152604091829020600201805490945542606a55925481518381529384015290917f9b20ee151d057f4f3ece7fdf4ca1370cf143f181760e7712b722572f2dcba88f910160405180910390a1505b5f818152606f60205260409020600190810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169091179055606d545b8181101561142b575f818152606e6020908152604080832083815560018082018590556002909101849055606f83528184208481550180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556070909152812090818161141b82826115a8565b5050600190920191506113ab9050565b50606d8190556065546067546069546040805193845260208401929092529082015281907fd31188695e1c2a2d02b755e14fa986aca41d391c337437b9159eaed8347e7f1c9060600160405180910390a250565b60335473ffffffffffffffffffffffffffffffffffffffff163314610b345760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104ad565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f8181526001830160205260408120546115a157508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610a4e565b505f610a4e565b5080545f8255905f5260205f2090810190610cbd91905b808211156115d2575f81556001016115bf565b5090565b5f602082840312156115e6575f80fd5b5035919050565b5f606082840312156115fd575f80fd5b50919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610cbd575f80fd5b5f8060408385031215611635575f80fd5b82359150602083013561164781611603565b809150509250929050565b5f60208284031215611662575f80fd5b813561166d81611603565b9392505050565b5f805f805f60a08688031215611688575f80fd5b853561169381611603565b97602087013597506040870135966060810135965060800135945092505050565b5f602082840312156116c4575f80fd5b8151801515811461166d575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611730576117306116d3565b5060010190565b80820180821115610a4e57610a4e6116d3565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b805161178281611603565b919050565b5f6020808385031215611798575f80fd5b825167ffffffffffffffff808211156117af575f80fd5b818501915085601f8301126117c2575f80fd5b8151818111156117d4576117d461174a565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811085821117156118175761181761174a565b604052918252848201925083810185019188831115611834575f80fd5b938501935b828510156118595761184a85611777565b84529385019392850192611839565b98975050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8082028115828204841417610a4e57610a4e6116d3565b5f826118dc577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b50049056fea164736f6c6343000818000a +0x608060405234801561000f575f80fd5b5060043610610184575f3560e01c8063807de443116100dd578063b511328d11610088578063e5aec99511610063578063e5aec995146103b0578063f2fde38b146103b9578063f92ad219146103cc575f80fd5b8063b511328d14610356578063d5cc89ba14610394578063d7693075146103a7575f80fd5b80638e21d5fb116100b85780638e21d5fb146102dd57806396dea93614610304578063a83d07371461034d575f80fd5b8063807de4431461026a57806385963052146102b65780638da5cb5b146102bf575f80fd5b806349c1a5811161013d578063715018a611610118578063715018a61461022757806374c260cf1461022f57806377c7938014610261575f80fd5b806349c1a581146101e85780635bcfadb51461020b578063639661901461021e575f80fd5b8063132002fc1161016d578063132002fc146101b0578063237a4b96146101cc5780634428c1a4146101df575f80fd5b80630121b93f146101885780630d61b5191461019d575b5f80fd5b61019b610196366004611764565b6103df565b005b61019b6101ab366004611764565b610727565b6101b9606b5481565b6040519081526020015b60405180910390f35b6101b96101da36600461177b565b6107db565b6101b9606a5481565b6101fb6101f63660046117b2565b610acb565b60405190151581526020016101c3565b61019b610219366004611764565b610aeb565b6101b9606c5481565b61019b610bba565b61024261023d366004611764565b610bcd565b60408051931515845291151560208401521515908201526060016101c3565b6101b960675481565b6102917f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c3565b6101b960655481565b60335473ffffffffffffffffffffffffffffffffffffffff16610291565b6102917f000000000000000000000000000000000000000000000000000000000000000081565b610332610312366004611764565b606e6020525f908152604090208054600182015460029092015490919083565b604080519384526020840192909252908201526060016101c3565b6101b960715481565b61037f610364366004611764565b606f6020525f90815260409020805460019091015460ff1682565b604080519283529015156020830152016101c3565b61019b6103a2366004611764565b610d25565b6101b9606d5481565b6101b960695481565b61019b6103c73660046117e0565b610e38565b61019b6103da366004611802565b610ed5565b5f73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016636d46e987336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015610484573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104a89190611842565b9050806104fc5760405162461bcd60e51b815260206004820152601660248201527f6f6e6c792073657175656e63657220616c6c6f7765640000000000000000000060448201526064015b60405180910390fd5b606c5482111561054e5760405162461bcd60e51b815260206004820152601260248201527f696e76616c69642070726f706f73616c4944000000000000000000000000000060448201526064016104f3565b607154821161059f5760405162461bcd60e51b815260206004820152601260248201527f657870697265642070726f706f73616c4944000000000000000000000000000060448201526064016104f3565b606d548210156105f15760405162461bcd60e51b815260206004820152600f60248201527f70726f706f73616c207072756e6564000000000000000000000000000000000060448201526064016104f3565b5f828152606f60205260409020805460019091015460ff1680610612575080155b8061061c57504281105b156106695760405162461bcd60e51b815260206004820152601060248201527f766f74696e672068617320656e6465640000000000000000000000000000000060448201526064016104f3565b610680335f858152607060205260409020906112a3565b156106f35760405162461bcd60e51b815260206004820152602960248201527f73657175656e63657220616c726561647920766f74656420666f72207468697360448201527f2070726f706f73616c000000000000000000000000000000000000000000000060648201526084016104f3565b61070a335f858152607060205260409020906112d1565b50610714836112f2565b156107225761072283611429565b505050565b5f8061073283610bcd565b509150915081156107855760405162461bcd60e51b815260206004820152601060248201527f766f74696e672068617320656e6465640000000000000000000000000000000060448201526064016104f3565b806107d25760405162461bcd60e51b815260206004820181905260248201527f70726f706f73616c20686173206e6f74206265656e207061737365642079657460448201526064016104f3565b61072283611429565b5f8073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016636d46e987336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015610881573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108a59190611842565b9050806108f45760405162461bcd60e51b815260206004820152601660248201527f6f6e6c792073657175656e63657220616c6c6f7765640000000000000000000060448201526064016104f3565b82604001355f036109475760405162461bcd60e51b815260206004820152601460248201527f696e76616c696420726f6c6c75702065706f636800000000000000000000000060448201526064016104f3565b82351515806109595750602083013515155b6109a55760405162461bcd60e51b815260206004820152601460248201527f696e76616c696420626174636820706172616d7300000000000000000000000060448201526064016104f3565b606c8054905f6109b48361188e565b9091555050606c545f908152606e6020526040902083906109ec82828135815560208201356001820155604082013560028201555050565b9050506040518060400160405280606b5442610a0891906118c5565b81525f6020918201819052606c548152606f82526040902082518155910151600190910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905533606c54604080518635815260208088013590820152818701359181019190915273ffffffffffffffffffffffffffffffffffffffff92909216917f66e5b37817dfa9935ab8e631ce7774a2e773d56cc8ea6815ac65f1fbac6420849060600160405180910390a35050606c54919050565b5f828152607060205260408120610ae290836112a3565b90505b92915050565b610af361160d565b5f81118015610b045750606b548114155b610b755760405162461bcd60e51b8152602060048201526024808201527f696e76616c6964206e65772070726f706f73616c20766f74696e67206475726160448201527f74696f6e0000000000000000000000000000000000000000000000000000000060648201526084016104f3565b606b80549082905560408051828152602081018490527ffe810823e41a0cf27003f3eac9c17098028ba0aece75bd9783a8da7f75fb3aa3910160405180910390a15050565b610bc261160d565b610bcb5f611674565b565b5f805f606c54841115610c225760405162461bcd60e51b815260206004820152601260248201527f696e76616c69642070726f706f73616c4944000000000000000000000000000060448201526064016104f3565b607154841015610c745760405162461bcd60e51b815260206004820152601060248201527f657870697265642070726f706f73616c0000000000000000000000000000000060448201526064016104f3565b606d54841015610cc65760405162461bcd60e51b815260206004820152600f60248201527f70726f706f73616c207072756e6564000000000000000000000000000000000060448201526064016104f3565b6071548403610cdd57506001915081905080610d1e565b5f848152606f602052604090206001810154905460ff909116908180610d01575080155b80610d0b57504281105b610d14876112f2565b8394509450945050505b9193909250565b6071548110610d9c5760405162461bcd60e51b815260206004820152603e60248201527f6f6e6c7920616c6c6f7720746f2064656c657465207468652070726f706f736160448201527f6c206265666f72206c6174657374207061737365642070726f706f73616c000060648201526084016104f3565b606d545b818111610e26575f818152606e6020908152604080832083815560018082018590556002909101849055606f83528184208481550180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560709091528120908181610e0f8282611736565b505050508080610e1e9061188e565b915050610da0565b50610e328160016118c5565b606d5550565b610e4061160d565b73ffffffffffffffffffffffffffffffffffffffff8116610ec95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104f3565b610ed281611674565b50565b5f54610100900460ff1615808015610ef357505f54600160ff909116105b80610f0c5750303b158015610f0c57505f5460ff166001145b610f7e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104f3565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610fda575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff861661103d5760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964206f776e65722061646472657373000000000000000000000060448201526064016104f3565b5f851161108c5760405162461bcd60e51b815260206004820181905260248201527f696e76616c69642070726f706f73616c20766f74696e67206475726174696f6e60448201526064016104f3565b5f82116110db5760405162461bcd60e51b815260206004820152601460248201527f696e76616c696420726f6c6c75702065706f636800000000000000000000000060448201526064016104f3565b831515806110e857508215155b6111345760405162461bcd60e51b815260206004820152601460248201527f696e76616c696420626174636820706172616d7300000000000000000000000060448201526064016104f3565b61113d86611674565b606b85905560658490556067839055606982905542606a55604080515f8152602081018790527ffe810823e41a0cf27003f3eac9c17098028ba0aece75bd9783a8da7f75fb3aa3910160405180910390a1604080515f8152602081018690527fa044538eba1b21d23eb13fa35811ca9d1d7ff9ef1c81ee4dc594fca08412531b910160405180910390a1604080515f8152602081018590527fab2cb47d396c5d12c082ac9b6512d332af2767ca8e1fa5bcef40fa6970626569910160405180910390a1604080515f8152602081018490527f9b20ee151d057f4f3ece7fdf4ca1370cf143f181760e7712b722572f2dcba88f910160405180910390a1801561129b575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526001830160205260408120541515610ae2565b5f610ae28373ffffffffffffffffffffffffffffffffffffffff84166116ea565b5f807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166377d7dffb6040518163ffffffff1660e01b81526004015f60405180830381865afa15801561135c573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526113a19190810190611915565b90505f805b8251811015611406576113eb8382815181106113c4576113c46119f3565b602002602001015160705f8881526020019081526020015f206112a390919063ffffffff16565b156113fe576113fb8260016118c5565b91505b6001016113a6565b506003825160026114179190611a20565b6114219190611a37565b109392505050565b60718190555f818152606e60205260409020546065541461149d57606580545f838152606e60205260409081902054928390555190917fa044538eba1b21d23eb13fa35811ca9d1d7ff9ef1c81ee4dc594fca08412531b9161149391848252602082015260400190565b60405180910390a1505b5f818152606e60205260409020600101546067541461151257606780545f838152606e60205260409081902060010154928390555190917fab2cb47d396c5d12c082ac9b6512d332af2767ca8e1fa5bcef40fa69706265699161150891848252602082015260400190565b60405180910390a1505b5f818152606e60205260409020600201546069541461158657606980545f838152606e6020908152604091829020600201805490945542606a55925481518381529384015290917f9b20ee151d057f4f3ece7fdf4ca1370cf143f181760e7712b722572f2dcba88f910160405180910390a1505b5f818152606f6020908152604091829020600190810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690911790556065546067546069548451928352928201529182015281907fd31188695e1c2a2d02b755e14fa986aca41d391c337437b9159eaed8347e7f1c9060600160405180910390a250565b60335473ffffffffffffffffffffffffffffffffffffffff163314610bcb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104f3565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f81815260018301602052604081205461172f57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610ae5565b505f610ae5565b5080545f8255905f5260205f2090810190610ed291905b80821115611760575f815560010161174d565b5090565b5f60208284031215611774575f80fd5b5035919050565b5f6060828403121561178b575f80fd5b50919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610ed2575f80fd5b5f80604083850312156117c3575f80fd5b8235915060208301356117d581611791565b809150509250929050565b5f602082840312156117f0575f80fd5b81356117fb81611791565b9392505050565b5f805f805f60a08688031215611816575f80fd5b853561182181611791565b97602087013597506040870135966060810135965060800135945092505050565b5f60208284031215611852575f80fd5b815180151581146117fb575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036118be576118be611861565b5060010190565b80820180821115610ae557610ae5611861565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b805161191081611791565b919050565b5f6020808385031215611926575f80fd5b825167ffffffffffffffff8082111561193d575f80fd5b818501915085601f830112611950575f80fd5b815181811115611962576119626118d8565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811085821117156119a5576119a56118d8565b6040529182528482019250838101850191888311156119c2575f80fd5b938501935b828510156119e7576119d885611905565b845293850193928501926119c7565b98975050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8082028115828204841417610ae557610ae5611861565b5f82611a6a577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b50049056fea164736f6c6343000818000a diff --git a/bindings/bin/l1crossdomainmessenger_deployed.hex b/bindings/bin/l1crossdomainmessenger_deployed.hex index d7e24332..a401e8da 100644 --- a/bindings/bin/l1crossdomainmessenger_deployed.hex +++ b/bindings/bin/l1crossdomainmessenger_deployed.hex @@ -1 +1 @@ -0x6080604052600436106101a7575f3560e01c806386fa4b73116100e7578063c0c53b8b11610087578063e70fc93b11610062578063e70fc93b146104f9578063ea7ec51414610524578063ecc7042814610550578063f2fde38b14610564575f80fd5b8063c0c53b8b1461049c578063cb23bcb5146104bb578063d87e7df1146104da575f80fd5b8063a14238e7116100c2578063a14238e71461040e578063b2267a7b1461043c578063b604bf4c1461044f578063bedb86fb1461047d575f80fd5b806386fa4b73146103af5780638da5cb5b146103ce578063946130d8146103eb575f80fd5b806355004105116101525780636e296e451161012d5780636e296e45146102de578063715018a6146102fd578063797594b014610311578063846d4d7a14610330575f80fd5b806355004105146102a15780635c975abb146102b45780635f7b1577146102cb575f80fd5b80633b70c18a116101825780633b70c18a1461022c578063407c195514610263578063478222c214610282575f80fd5b806329907acd146101ba5780632a6cccb2146101d9578063340735f7146101f8575f80fd5b366101b6576101b4610583565b005b5f80fd5b3480156101c5575f80fd5b506101b46101d436600461283a565b6105e4565b3480156101e4575f80fd5b506101b46101f33660046128a7565b610966565b348015610203575f80fd5b506102176102123660046128de565b610a2d565b60405190151581526020015b60405180910390f35b348015610237575f80fd5b5060fe5461024b906001600160a01b031681565b6040516001600160a01b039091168152602001610223565b34801561026e575f80fd5b506101b461027d36600461291a565b610af6565b34801561028d575f80fd5b5060cb5461024b906001600160a01b031681565b6101b46102af366004612931565b610bb9565b3480156102bf575f80fd5b5060655460ff16610217565b6101b46102d93660046129c8565b611201565b3480156102e9575f80fd5b5060c95461024b906001600160a01b031681565b348015610308575f80fd5b506101b4611255565b34801561031c575f80fd5b5060ca5461024b906001600160a01b031681565b34801561033b575f80fd5b5061038661034a36600461291a565b6101006020525f90815260409020546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041682565b604080516fffffffffffffffffffffffffffffffff938416815292909116602083015201610223565b3480156103ba575f80fd5b506101b46103c9366004612a66565b611266565b3480156103d9575f80fd5b506033546001600160a01b031661024b565b3480156103f6575f80fd5b5061040060ff5481565b604051908152602001610223565b348015610419575f80fd5b5061021761042836600461291a565b60fa6020525f908152604090205460ff1681565b6101b461044a366004612aef565b611732565b34801561045a575f80fd5b5061021761046936600461291a565b60fc6020525f908152604090205460ff1681565b348015610488575f80fd5b506101b4610497366004612b57565b61174d565b3480156104a7575f80fd5b506101b46104b6366004612b72565b61176e565b3480156104c6575f80fd5b5060fd5461024b906001600160a01b031681565b3480156104e5575f80fd5b506101b46104f43660046128a7565b6119d1565b348015610504575f80fd5b5061040061051336600461291a565b60fb6020525f908152604090205481565b34801561052f575f80fd5b5061040061053e36600461291a565b6101016020525f908152604090205481565b34801561055b575f80fd5b50610400611ac7565b34801561056f575f80fd5b506101b461057e3660046128a7565b611b50565b6033546001600160a01b031633146105e25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b565b6105ec611bdd565b60c9546001600160a01b031661dead146106485760405162461bcd60e51b815260206004820152601f60248201527f4d65737361676520697320616c726561647920696e20657865637574696f6e0060448201526064016105d9565b60fe546001600160a01b03165f6106628787878787611c30565b90505f818051906020012090505f60fb5f8381526020019081526020015f2054116106f55760405162461bcd60e51b815260206004820152602660248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f717565756564000000000000000000000000000000000000000000000000000060648201526084016105d9565b5f81815260fc602052604090205460ff16156107535760405162461bcd60e51b815260206004820152601760248201527f4d65737361676520616c72656164792064726f7070656400000000000000000060448201526064016105d9565b5f818152610100602052604081205470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16908190036107935750845b6040517f91652461000000000000000000000000000000000000000000000000000000008152600481018290526001600160a01b038516906391652461906024015f604051808303815f87803b1580156107eb575f80fd5b505af11580156107fd573d5f803e3d5ffd5b5050505f918252506101016020526040902054801561083d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01610793565b5f82815260fc6020526040808220805460ff191660011790555187917fbd05aabbf548001ebdd6ac80c02f1cfb3b39165f2fae1d420075f22e781ef63b91a260c980547fffffffffffffffffffffffff000000000000000000000000000000000000000016736f297c61b5c92ef107ffd30cd56affe5a273e8411790556040517f14298c510000000000000000000000000000000000000000000000000000000081526001600160a01b038a16906314298c51908990610901908990600401612c1d565b5f604051808303818588803b158015610918575f80fd5b505af115801561092a573d5f803e3d5ffd5b505060c980547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055505050505050505050505050565b61096e610583565b6001600160a01b0381166109c45760405162461bcd60e51b815260206004820152601d60248201527f6665655661756c742063616e6e6f74206265206164647265737328302900000060448201526064016105d9565b60cb80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f4aadc32827849f797733838c61302f7f56d2b6db28caa175eb3f7f8e5aba25f5905f90a35050565b5f84815b6020811015610aea578085901c600116600103610a9757858160208110610a5a57610a5a612c2f565b602002013582604051602001610a7a929190918252602082015260400190565b604051602081830303815290604052805190602001209150610ae2565b81868260208110610aaa57610aaa612c2f565b6020020135604051602001610ac9929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b600101610a31565b50909114949350505050565b610afe610583565b5f8111610b735760405162461bcd60e51b815260206004820152602360248201527f7265706c61792074696d6573206d75737420626520677265617465722074686160448201527f6e2030000000000000000000000000000000000000000000000000000000000060648201526084016105d9565b60ff80549082905560408051828152602081018490527fd700562df02eb66951f6f5275df7ebd7c0ec58b3422915789b3b1877aab2e52b91015b60405180910390a15050565b610bc1611bdd565b60c9546001600160a01b031661dead14610c1d5760405162461bcd60e51b815260206004820152601f60248201527f4d65737361676520697320616c726561647920696e20657865637574696f6e0060448201526064016105d9565b60fe5460ca546001600160a01b0391821691165f610c3e8a8a8a8a8a611c30565b90505f818051906020012090505f60fb5f8381526020019081526020015f205411610cd15760405162461bcd60e51b815260206004820152602660248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f717565756564000000000000000000000000000000000000000000000000000060648201526084016105d9565b5f81815260fc602052604090205460ff1615610d2f5760405162461bcd60e51b815260206004820152601760248201527f4d65737361676520616c72656164792064726f7070656400000000000000000060448201526064016105d9565b6040517f3e4cbbe60000000000000000000000000000000000000000000000000000000081526001600160a01b038c8116600483015263ffffffff881660248301525f9190861690633e4cbbe690604401602060405180830381865afa158015610d9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dbf9190612c5c565b905080341015610e115760405162461bcd60e51b815260206004820152601e60248201527f496e73756666696369656e74206d73672e76616c756520666f7220666565000060448201526064016105d9565b8015610eb95760cb546040515f916001600160a01b03169083908381818185875af1925050503d805f8114610e61576040519150601f19603f3d011682016040523d82523d5f602084013e610e66565b606091505b5050905080610eb75760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f206465647563742074686520666565000000000000000060448201526064016105d9565b505b5f856001600160a01b031663fd0ad31e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ef6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f1a9190612c5c565b6040517f9b1597820000000000000000000000000000000000000000000000000000000081529091506001600160a01b03871690639b15978290610f669088908c908990600401612c73565b5f604051808303815f87803b158015610f7d575f80fd5b505af1158015610f8f573d5f803e3d5ffd5b5050505f848152610100602090815260408083208151808301909252546fffffffffffffffffffffffffffffffff80821683527001000000000000000000000000000000009091041691810182905292509003610fff575f8281526101016020526040902060018c019055611030565b80602001516001016fffffffffffffffffffffffffffffffff166101015f8481526020019081526020015f20819055505b6fffffffffffffffffffffffffffffffff808316602083015260ff5482519091161061109e5760405162461bcd60e51b815260206004820152601b60248201527f457863656564206d6178696d756d207265706c61792074696d6573000000000060448201526064016105d9565b80516fffffffffffffffffffffffffffffffff600191909101811682525f858152610100602090815260409091208351919093015182167001000000000000000000000000000000000291161790556001600160a01b038c166110fe3390565b6001600160a01b03168b7fa3a1251805b1fc7915884575b42e1fb862e814f0f5c9d670d08bf84697053d618e858d8f60405161113d9493929190612ca9565b60405180910390a4348281039083146111f1575f886001600160a01b0316826040515f6040518083038185875af1925050503d805f8114611199576040519150601f19603f3d011682016040523d82523d5f602084013e61119e565b606091505b50509050806111ef5760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f20726566756e642074686520666565000000000000000060448201526064016105d9565b505b5050505050505050505050505050565b611209611bdd565b61124d868686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250889250879150611ccc9050565b505050505050565b61125d610583565b6105e25f612118565b61126e611bdd565b60c9546001600160a01b031661dead146112ca5760405162461bcd60e51b815260206004820152601f60248201527f4d65737361676520697320616c726561647920696e20657865637574696f6e0060448201526064016105d9565b60fe546001600160a01b039081169087160361134e5760405162461bcd60e51b815260206004820152602760248201527f4d657373656e6765723a20466f7262696420746f2063616c6c206d657373616760448201527f652071756575650000000000000000000000000000000000000000000000000060648201526084016105d9565b61135786612181565b60c9546001600160a01b03908116908816036113db5760405162461bcd60e51b815260206004820152602160248201527f4d657373656e6765723a20496e76616c6964206d6573736167652073656e646560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016105d9565b5f6113e98888888888611c30565b80516020918201205f81815260fa90925260409091205490915060ff16156114795760405162461bcd60e51b815260206004820152603060248201527f4d657373656e6765723a207769746864726177616c2068617320616c7265616460448201527f79206265656e2066696e616c697a65640000000000000000000000000000000060648201526084016105d9565b60fd546040517f04d77215000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b03909116905f9082906304d7721590602401602060405180830381865afa1580156114dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115019190612cdd565b9050806115765760405162461bcd60e51b815260206004820152602760248201527f4d657373656e6765723a207769746864726177616c526f6f74206e6f7420666960448201527f6e616c697a65640000000000000000000000000000000000000000000000000060648201526084016105d9565b61158283868987610a2d565b6115f45760405162461bcd60e51b815260206004820152602d60248201527f4d657373656e6765723a20696e76616c6964207769746864726177616c20696e60448201527f636c7573696f6e2070726f6f660000000000000000000000000000000000000060648201526084016105d9565b5060c980547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038b8116919091179091556040515f918a16908990611642908990612cf8565b5f6040518083038185875af1925050503d805f811461167c576040519150601f19603f3d011682016040523d82523d5f602084013e611681565b606091505b505060c980547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055905080156116fb575f83815260fa6020526040808220805460ff191660011790555184917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611726565b60405183907f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f905f90a25b50505050505050505050565b61173a611bdd565b6117478484848433611ccc565b50505050565b611755610583565b8015611766576117636121d9565b50565b611763612233565b5f54610100900460ff161580801561178c57505f54600160ff909116105b806117a55750303b1580156117a557505f5460ff166001145b6118175760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105d9565b5f805460ff191660011790558015611855575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b038316158061187257506001600160a01b038216155b8061188457506001600160a01b038416155b156118bb576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118d97353000000000000000000000000000000000000078561226c565b60fd80546001600160a01b038086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fe805492851692909116919091179055600360ff8190556040517fd700562df02eb66951f6f5275df7ebd7c0ec58b3422915789b3b1877aab2e52b91611962915f9190918252602082015260400190565b60405180910390a18015611747575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b6119d9610583565b6001600160a01b038116611a555760405162461bcd60e51b815260206004820152602360248201527f726f6c6c757020616464726573732063616e6e6f74206265206164647265737360448201527f283029000000000000000000000000000000000000000000000000000000000060648201526084016105d9565b60fd80546001600160a01b038381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f5272c8ad4bd643b1130291ea29bebd9b3bc583057a6e4d047eb7077039a956309101610bad565b60fe54604080517ffd0ad31e00000000000000000000000000000000000000000000000000000000815290515f926001600160a01b03169163fd0ad31e9160048083019260209291908290030181865afa158015611b27573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b4b9190612c5c565b905090565b611b58610583565b6001600160a01b038116611bd45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016105d9565b61176381612118565b60655460ff16156105e25760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016105d9565b60608585858585604051602401611c4b959493929190612d13565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8ef1332e00000000000000000000000000000000000000000000000000000000179052905095945050505050565b611cd4612384565b60fe5460ca54604080517ffd0ad31e00000000000000000000000000000000000000000000000000000000815290516001600160a01b0393841693909216915f91849163fd0ad31e916004808201926020929091908290030181865afa158015611d40573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d649190612c5c565b90505f611d74338a8a858b611c30565b90505f6001600160a01b038516633e4cbbe6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602481018a9052604401602060405180830381865afa158015611de8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e0c9190612c5c565b9050611e188982612d55565b341015611e675760405162461bcd60e51b815260206004820152601660248201527f496e73756666696369656e74206d73672e76616c75650000000000000000000060448201526064016105d9565b8015611f0f5760cb546040515f916001600160a01b03169083908381818185875af1925050503d805f8114611eb7576040519150601f19603f3d011682016040523d82523d5f602084013e611ebc565b606091505b5050905080611f0d5760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f206465647563742074686520666565000000000000000060448201526064016105d9565b505b6040517f9b1597820000000000000000000000000000000000000000000000000000000081526001600160a01b03861690639b15978290611f589087908b908790600401612d8d565b5f604051808303815f87803b158015611f6f575f80fd5b505af1158015611f81573d5f803e3d5ffd5b505050505f8280519060200120905060fb5f8281526020019081526020015f20545f14611ff05760405162461bcd60e51b815260206004820152601260248201527f4475706c696361746564206d657373616765000000000000000000000000000060448201526064016105d9565b5f81815260fb602052604090204290556001600160a01b038b16336001600160a01b03167f104371f3b442861a2a7b82a070afbbaab748bb13757bf47769e170e37809ec1e8c878c8e6040516120499493929190612db4565b60405180910390a3348290038a8103908b14612100575f886001600160a01b0316826040515f6040518083038185875af1925050503d805f81146120a8576040519150601f19603f3d011682016040523d82523d5f602084013e6120ad565b606091505b50509050806120fe5760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f20726566756e642074686520666565000000000000000060448201526064016105d9565b505b505050505050506121116001609755565b5050505050565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b306001600160a01b038216036117635760405162461bcd60e51b815260206004820152601e60248201527f4d657373656e6765723a20466f7262696420746f2063616c6c2073656c66000060448201526064016105d9565b6121e1611bdd565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586122163390565b6040516001600160a01b03909116815260200160405180910390a1565b61223b6123e4565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33612216565b5f54610100900460ff166122e85760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d9565b6122f0612436565b6122f86124ba565b61230061253e565b60c980547fffffffffffffffffffffffff000000000000000000000000000000000000000090811661dead1790915560ca80546001600160a01b03858116919093161790558116156123805760cb80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383161790555b5050565b6002609754036123d65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016105d9565b6002609755565b6001609755565b60655460ff166105e25760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016105d9565b5f54610100900460ff166124b25760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d9565b6105e26125c2565b5f54610100900460ff166125365760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d9565b6105e2612647565b5f54610100900460ff166125ba5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d9565b6105e26126cf565b5f54610100900460ff1661263e5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d9565b6105e233612118565b5f54610100900460ff166126c35760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d9565b6065805460ff19169055565b5f54610100900460ff166123dd5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d9565b80356001600160a01b0381168114612761575f80fd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126127a2575f80fd5b813567ffffffffffffffff808211156127bd576127bd612766565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561280357612803612766565b8160405283815286602085880101111561281b575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f60a0868803121561284e575f80fd5b6128578661274b565b94506128656020870161274b565b93506040860135925060608601359150608086013567ffffffffffffffff81111561288e575f80fd5b61289a88828901612793565b9150509295509295909350565b5f602082840312156128b7575f80fd5b6128c08261274b565b9392505050565b8061040081018310156128d8575f80fd5b92915050565b5f805f8061046085870312156128f2575f80fd5b8435935061290386602087016128c7565b939693955050505061042082013591610440013590565b5f6020828403121561292a575f80fd5b5035919050565b5f805f805f805f60e0888a031215612947575f80fd5b6129508861274b565b965061295e6020890161274b565b95506040880135945060608801359350608088013567ffffffffffffffff811115612987575f80fd5b6129938a828b01612793565b93505060a088013563ffffffff811681146129ac575f80fd5b91506129ba60c0890161274b565b905092959891949750929550565b5f805f805f8060a087890312156129dd575f80fd5b6129e68761274b565b955060208701359450604087013567ffffffffffffffff80821115612a09575f80fd5b818901915089601f830112612a1c575f80fd5b813581811115612a2a575f80fd5b8a6020828501011115612a3b575f80fd5b60208301965080955050505060608701359150612a5a6080880161274b565b90509295509295509295565b5f805f805f805f6104c0888a031215612a7d575f80fd5b612a868861274b565b9650612a946020890161274b565b95506040880135945060608801359350608088013567ffffffffffffffff811115612abd575f80fd5b612ac98a828b01612793565b935050612ad98960a08a016128c7565b91506104a0880135905092959891949750929550565b5f805f8060808587031215612b02575f80fd5b612b0b8561274b565b935060208501359250604085013567ffffffffffffffff811115612b2d575f80fd5b612b3987828801612793565b949793965093946060013593505050565b8015158114611763575f80fd5b5f60208284031215612b67575f80fd5b81356128c081612b4a565b5f805f60608486031215612b84575f80fd5b612b8d8461274b565b9250612b9b6020850161274b565b9150612ba96040850161274b565b90509250925092565b5f5b83811015612bcc578181015183820152602001612bb4565b50505f910152565b5f8151808452612beb816020860160208601612bb2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6128c06020830184612bd4565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215612c6c575f80fd5b5051919050565b6001600160a01b038416815263ffffffff83166020820152606060408201525f612ca06060830184612bd4565b95945050505050565b84815283602082015263ffffffff83166040820152608060608201525f612cd36080830184612bd4565b9695505050505050565b5f60208284031215612ced575f80fd5b81516128c081612b4a565b5f8251612d09818460208701612bb2565b9190910192915050565b5f6001600160a01b03808816835280871660208401525084604083015283606083015260a06080830152612d4a60a0830184612bd4565b979650505050505050565b808201808211156128d8577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6001600160a01b0384168152826020820152606060408201525f612ca06060830184612bd4565b848152836020820152826040820152608060608201525f612cd36080830184612bd456fea164736f6c6343000818000a +0x60806040526004361061019c575f3560e01c806386fa4b73116100dc578063c0c53b8b11610087578063e70fc93b11610062578063e70fc93b146104cf578063ea7ec514146104fa578063ecc7042814610526578063f2fde38b1461053a575f80fd5b8063c0c53b8b14610472578063cb23bcb514610491578063d87e7df1146104b0575f80fd5b8063a14238e7116100b7578063a14238e714610412578063b2267a7b14610440578063bedb86fb14610453575f80fd5b806386fa4b73146103b35780638da5cb5b146103d2578063946130d8146103ef575f80fd5b806355004105116101475780636e296e45116101225780636e296e45146102e2578063715018a614610301578063797594b014610315578063846d4d7a14610334575f80fd5b806355004105146102a55780635c975abb146102b85780635f7b1577146102cf575f80fd5b80633b70c18a116101775780633b70c18a14610230578063407c195514610267578063478222c214610286575f80fd5b806305804dd7146101af5780632a6cccb2146101f2578063340735f714610211575f80fd5b366101ab576101a9610559565b005b5f80fd5b3480156101ba575f80fd5b506101dd6101c9366004612435565b60fc6020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b3480156101fd575f80fd5b506101a961020c366004612467565b6105ba565b34801561021c575f80fd5b506101dd61022b36600461249e565b610681565b34801561023b575f80fd5b5060fe5461024f906001600160a01b031681565b6040516001600160a01b0390911681526020016101e9565b348015610272575f80fd5b506101a9610281366004612435565b61074a565b348015610291575f80fd5b5060cb5461024f906001600160a01b031681565b6101a96102b33660046125ae565b61080d565b3480156102c3575f80fd5b5060655460ff166101dd565b6101a96102dd366004612645565b610e55565b3480156102ed575f80fd5b5060c95461024f906001600160a01b031681565b34801561030c575f80fd5b506101a9610ea9565b348015610320575f80fd5b5060ca5461024f906001600160a01b031681565b34801561033f575f80fd5b5061038a61034e366004612435565b6101006020525f90815260409020546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041682565b604080516fffffffffffffffffffffffffffffffff9384168152929091166020830152016101e9565b3480156103be575f80fd5b506101a96103cd3660046126e3565b610eba565b3480156103dd575f80fd5b506033546001600160a01b031661024f565b3480156103fa575f80fd5b5061040460ff5481565b6040519081526020016101e9565b34801561041d575f80fd5b506101dd61042c366004612435565b60fa6020525f908152604090205460ff1681565b6101a961044e36600461276c565b6113a4565b34801561045e575f80fd5b506101a961046d3660046127d4565b6113bf565b34801561047d575f80fd5b506101a961048c3660046127ef565b6113e0565b34801561049c575f80fd5b5060fd5461024f906001600160a01b031681565b3480156104bb575f80fd5b506101a96104ca366004612467565b611661565b3480156104da575f80fd5b506104046104e9366004612435565b60fb6020525f908152604090205481565b348015610505575f80fd5b50610404610514366004612435565b6101016020525f908152604090205481565b348015610531575f80fd5b50610404611757565b348015610545575f80fd5b506101a9610554366004612467565b6117e0565b6033546001600160a01b031633146105b85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b565b6105c2610559565b6001600160a01b0381166106185760405162461bcd60e51b815260206004820152601d60248201527f6665655661756c742063616e6e6f74206265206164647265737328302900000060448201526064016105af565b60cb80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f4aadc32827849f797733838c61302f7f56d2b6db28caa175eb3f7f8e5aba25f5905f90a35050565b5f84815b602081101561073e578085901c6001166001036106eb578581602081106106ae576106ae61282f565b6020020135826040516020016106ce929190918252602082015260400190565b604051602081830303815290604052805190602001209150610736565b818682602081106106fe576106fe61282f565b602002013560405160200161071d929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b600101610685565b50909114949350505050565b610752610559565b5f81116107c75760405162461bcd60e51b815260206004820152602360248201527f7265706c61792074696d6573206d75737420626520677265617465722074686160448201527f6e2030000000000000000000000000000000000000000000000000000000000060648201526084016105af565b60ff80549082905560408051828152602081018490527fd700562df02eb66951f6f5275df7ebd7c0ec58b3422915789b3b1877aab2e52b91015b60405180910390a15050565b61081561186d565b60c9546001600160a01b031661dead146108715760405162461bcd60e51b815260206004820152601f60248201527f4d65737361676520697320616c726561647920696e20657865637574696f6e0060448201526064016105af565b60fe5460ca546001600160a01b0391821691165f6108928a8a8a8a8a6118c0565b90505f818051906020012090505f60fb5f8381526020019081526020015f2054116109255760405162461bcd60e51b815260206004820152602660248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f717565756564000000000000000000000000000000000000000000000000000060648201526084016105af565b5f81815260fc602052604090205460ff16156109835760405162461bcd60e51b815260206004820152601760248201527f4d65737361676520616c72656164792064726f7070656400000000000000000060448201526064016105af565b6040517f3e4cbbe60000000000000000000000000000000000000000000000000000000081526001600160a01b038c8116600483015263ffffffff881660248301525f9190861690633e4cbbe690604401602060405180830381865afa1580156109ef573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a13919061285c565b905080341015610a655760405162461bcd60e51b815260206004820152601e60248201527f496e73756666696369656e74206d73672e76616c756520666f7220666565000060448201526064016105af565b8015610b0d5760cb546040515f916001600160a01b03169083908381818185875af1925050503d805f8114610ab5576040519150601f19603f3d011682016040523d82523d5f602084013e610aba565b606091505b5050905080610b0b5760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f206465647563742074686520666565000000000000000060448201526064016105af565b505b5f856001600160a01b031663fd0ad31e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b4a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b6e919061285c565b6040517f9b1597820000000000000000000000000000000000000000000000000000000081529091506001600160a01b03871690639b15978290610bba9088908c9089906004016128de565b5f604051808303815f87803b158015610bd1575f80fd5b505af1158015610be3573d5f803e3d5ffd5b5050505f848152610100602090815260408083208151808301909252546fffffffffffffffffffffffffffffffff80821683527001000000000000000000000000000000009091041691810182905292509003610c53575f8281526101016020526040902060018c019055610c84565b80602001516001016fffffffffffffffffffffffffffffffff166101015f8481526020019081526020015f20819055505b6fffffffffffffffffffffffffffffffff808316602083015260ff54825190911610610cf25760405162461bcd60e51b815260206004820152601b60248201527f457863656564206d6178696d756d207265706c61792074696d6573000000000060448201526064016105af565b80516fffffffffffffffffffffffffffffffff600191909101811682525f858152610100602090815260409091208351919093015182167001000000000000000000000000000000000291161790556001600160a01b038c16610d523390565b6001600160a01b03168b7fa3a1251805b1fc7915884575b42e1fb862e814f0f5c9d670d08bf84697053d618e858d8f604051610d919493929190612914565b60405180910390a434828103908314610e45575f886001600160a01b0316826040515f6040518083038185875af1925050503d805f8114610ded576040519150601f19603f3d011682016040523d82523d5f602084013e610df2565b606091505b5050905080610e435760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f20726566756e642074686520666565000000000000000060448201526064016105af565b505b5050505050505050505050505050565b610e5d61186d565b610ea1868686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525088925087915061195c9050565b505050505050565b610eb1610559565b6105b85f611da8565b610ec261186d565b60c9546001600160a01b031661dead14610f1e5760405162461bcd60e51b815260206004820152601f60248201527f4d65737361676520697320616c726561647920696e20657865637574696f6e0060448201526064016105af565b60fe546001600160a01b0390811690871603610fa25760405162461bcd60e51b815260206004820152602760248201527f4d657373656e6765723a20466f7262696420746f2063616c6c206d657373616760448201527f652071756575650000000000000000000000000000000000000000000000000060648201526084016105af565b610fab86611e11565b60c9546001600160a01b039081169088160361102f5760405162461bcd60e51b815260206004820152602160248201527f4d657373656e6765723a20496e76616c6964206d6573736167652073656e646560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016105af565b5f61103d88888888886118c0565b80516020918201205f81815260fa90925260409091205490915060ff16156110cd5760405162461bcd60e51b815260206004820152603060248201527f4d657373656e6765723a207769746864726177616c2068617320616c7265616460448201527f79206265656e2066696e616c697a65640000000000000000000000000000000060648201526084016105af565b60fd546040517f04d77215000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b03909116905f9082906304d7721590602401602060405180830381865afa158015611131573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111559190612948565b9050806111ca5760405162461bcd60e51b815260206004820152602760248201527f4d657373656e6765723a207769746864726177616c526f6f74206e6f7420666960448201527f6e616c697a65640000000000000000000000000000000000000000000000000060648201526084016105af565b6111d683868987610681565b6112485760405162461bcd60e51b815260206004820152602d60248201527f4d657373656e6765723a20696e76616c6964207769746864726177616c20696e60448201527f636c7573696f6e2070726f6f660000000000000000000000000000000000000060648201526084016105af565b5060c980547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038b8116919091179091556040515f918a16908990611296908990612963565b5f6040518083038185875af1925050503d805f81146112d0576040519150601f19603f3d011682016040523d82523d5f602084013e6112d5565b606091505b505060c980547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790559050801561136d575f83815260fa602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555184917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611398565b60405183907f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f905f90a25b50505050505050505050565b6113ac61186d565b6113b9848484843361195c565b50505050565b6113c7610559565b80156113d8576113d5611e69565b50565b6113d5611ee1565b5f54610100900460ff16158080156113fe57505f54600160ff909116105b806114175750303b15801561141757505f5460ff166001145b6114895760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105af565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156114e5575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b038316158061150257506001600160a01b038216155b8061151457506001600160a01b038416155b1561154b576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61156973530000000000000000000000000000000000000785611f38565b60fd80546001600160a01b038086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fe805492851692909116919091179055600360ff8190556040517fd700562df02eb66951f6f5275df7ebd7c0ec58b3422915789b3b1877aab2e52b916115f2915f9190918252602082015260400190565b60405180910390a180156113b9575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b611669610559565b6001600160a01b0381166116e55760405162461bcd60e51b815260206004820152602360248201527f726f6c6c757020616464726573732063616e6e6f74206265206164647265737360448201527f283029000000000000000000000000000000000000000000000000000000000060648201526084016105af565b60fd80546001600160a01b038381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f5272c8ad4bd643b1130291ea29bebd9b3bc583057a6e4d047eb7077039a956309101610801565b60fe54604080517ffd0ad31e00000000000000000000000000000000000000000000000000000000815290515f926001600160a01b03169163fd0ad31e9160048083019260209291908290030181865afa1580156117b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117db919061285c565b905090565b6117e8610559565b6001600160a01b0381166118645760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016105af565b6113d581611da8565b60655460ff16156105b85760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016105af565b606085858585856040516024016118db95949392919061297e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8ef1332e00000000000000000000000000000000000000000000000000000000179052905095945050505050565b611964612050565b60fe5460ca54604080517ffd0ad31e00000000000000000000000000000000000000000000000000000000815290516001600160a01b0393841693909216915f91849163fd0ad31e916004808201926020929091908290030181865afa1580156119d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119f4919061285c565b90505f611a04338a8a858b6118c0565b90505f6001600160a01b038516633e4cbbe6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602481018a9052604401602060405180830381865afa158015611a78573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a9c919061285c565b9050611aa889826129c0565b341015611af75760405162461bcd60e51b815260206004820152601660248201527f496e73756666696369656e74206d73672e76616c75650000000000000000000060448201526064016105af565b8015611b9f5760cb546040515f916001600160a01b03169083908381818185875af1925050503d805f8114611b47576040519150601f19603f3d011682016040523d82523d5f602084013e611b4c565b606091505b5050905080611b9d5760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f206465647563742074686520666565000000000000000060448201526064016105af565b505b6040517f9b1597820000000000000000000000000000000000000000000000000000000081526001600160a01b03861690639b15978290611be89087908b9087906004016129f8565b5f604051808303815f87803b158015611bff575f80fd5b505af1158015611c11573d5f803e3d5ffd5b505050505f8280519060200120905060fb5f8281526020019081526020015f20545f14611c805760405162461bcd60e51b815260206004820152601260248201527f4475706c696361746564206d657373616765000000000000000000000000000060448201526064016105af565b5f81815260fb602052604090204290556001600160a01b038b16336001600160a01b03167f104371f3b442861a2a7b82a070afbbaab748bb13757bf47769e170e37809ec1e8c878c8e604051611cd99493929190612a1f565b60405180910390a3348290038a8103908b14611d90575f886001600160a01b0316826040515f6040518083038185875af1925050503d805f8114611d38576040519150601f19603f3d011682016040523d82523d5f602084013e611d3d565b606091505b5050905080611d8e5760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f20726566756e642074686520666565000000000000000060448201526064016105af565b505b50505050505050611da16001609755565b5050505050565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b306001600160a01b038216036113d55760405162461bcd60e51b815260206004820152601e60248201527f4d657373656e6765723a20466f7262696420746f2063616c6c2073656c66000060448201526064016105af565b611e7161186d565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611ec43390565b6040516001600160a01b03909116815260200160405180910390a1565b611ee96120b0565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33611ec4565b5f54610100900460ff16611fb45760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105af565b611fbc612102565b611fc4612186565b611fcc61220a565b60c980547fffffffffffffffffffffffff000000000000000000000000000000000000000090811661dead1790915560ca80546001600160a01b038581169190931617905581161561204c5760cb80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383161790555b5050565b6002609754036120a25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016105af565b6002609755565b6001609755565b60655460ff166105b85760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016105af565b5f54610100900460ff1661217e5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105af565b6105b861228e565b5f54610100900460ff166122025760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105af565b6105b8612313565b5f54610100900460ff166122865760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105af565b6105b86123b9565b5f54610100900460ff1661230a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105af565b6105b833611da8565b5f54610100900460ff1661238f5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105af565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b5f54610100900460ff166120a95760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105af565b5f60208284031215612445575f80fd5b5035919050565b80356001600160a01b0381168114612462575f80fd5b919050565b5f60208284031215612477575f80fd5b6124808261244c565b9392505050565b806104008101831015612498575f80fd5b92915050565b5f805f8061046085870312156124b2575f80fd5b843593506124c38660208701612487565b939693955050505061042082013591610440013590565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112612516575f80fd5b813567ffffffffffffffff80821115612531576125316124da565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715612577576125776124da565b8160405283815286602085880101111561258f575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a0312156125c4575f80fd5b6125cd8861244c565b96506125db6020890161244c565b95506040880135945060608801359350608088013567ffffffffffffffff811115612604575f80fd5b6126108a828b01612507565b93505060a088013563ffffffff81168114612629575f80fd5b915061263760c0890161244c565b905092959891949750929550565b5f805f805f8060a0878903121561265a575f80fd5b6126638761244c565b955060208701359450604087013567ffffffffffffffff80821115612686575f80fd5b818901915089601f830112612699575f80fd5b8135818111156126a7575f80fd5b8a60208285010111156126b8575f80fd5b602083019650809550505050606087013591506126d76080880161244c565b90509295509295509295565b5f805f805f805f6104c0888a0312156126fa575f80fd5b6127038861244c565b96506127116020890161244c565b95506040880135945060608801359350608088013567ffffffffffffffff81111561273a575f80fd5b6127468a828b01612507565b9350506127568960a08a01612487565b91506104a0880135905092959891949750929550565b5f805f806080858703121561277f575f80fd5b6127888561244c565b935060208501359250604085013567ffffffffffffffff8111156127aa575f80fd5b6127b687828801612507565b949793965093946060013593505050565b80151581146113d5575f80fd5b5f602082840312156127e4575f80fd5b8135612480816127c7565b5f805f60608486031215612801575f80fd5b61280a8461244c565b92506128186020850161244c565b91506128266040850161244c565b90509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6020828403121561286c575f80fd5b5051919050565b5f5b8381101561288d578181015183820152602001612875565b50505f910152565b5f81518084526128ac816020860160208601612873565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6001600160a01b038416815263ffffffff83166020820152606060408201525f61290b6060830184612895565b95945050505050565b84815283602082015263ffffffff83166040820152608060608201525f61293e6080830184612895565b9695505050505050565b5f60208284031215612958575f80fd5b8151612480816127c7565b5f8251612974818460208701612873565b9190910192915050565b5f6001600160a01b03808816835280871660208401525084604083015283606083015260a060808301526129b560a0830184612895565b979650505050505050565b80820180821115612498577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6001600160a01b0384168152826020820152606060408201525f61290b6060830184612895565b848152836020820152826040820152608060608201525f61293e608083018461289556fea164736f6c6343000818000a diff --git a/bindings/bin/l1lidogateway_deployed.hex b/bindings/bin/l1lidogateway_deployed.hex index 6033c470..16f3a6fa 100644 --- a/bindings/bin/l1lidogateway_deployed.hex +++ b/bindings/bin/l1lidogateway_deployed.hex @@ -1 +1 @@ -0x6080604052600436106101d0575f3560e01c80639010d07c116100fd578063d547741f11610092578063f27ebced11610062578063f27ebced14610574578063f2fde38b14610593578063f887ea40146105b2578063fadcc54a146105d1575f80fd5b8063d547741f146104fb578063e3b523e31461051a578063e8bac93b1461054d578063f219fa6614610561575f80fd5b8063c01e1bd6116100cd578063c01e1bd61461046b578063c0c53b8b1461049e578063c676ad29146104bd578063ca15c873146104dc575f80fd5b80639010d07c1461040557806391d1485414610424578063ac67e1af14610443578063ad960ce114610457575f80fd5b80635e4c57a411610173578063797594b011610143578063797594b01461038357806384bd13b0146103a25780638d7601c0146103b55780638da5cb5b146103e8575f80fd5b80635e4c57a4146102df5780635ed2c220146102f35780636f18bd221461032e578063715018a61461036f575f80fd5b80632f2ff15d116101ae5780632f2ff15d1461020f5780633cb747bf1461022e57806356eff2671461026a5780635777bf501461029d575f80fd5b80630aea8c26146101d457806314298c51146101e957806321425ee0146101fc575b5f80fd5b6101e76101e23660046129e2565b610604565b005b6101e76101f7366004612a96565b610618565b6101e761020a366004612ad5565b61089d565b34801561021a575f80fd5b506101e7610229366004612b07565b6108d6565b348015610239575f80fd5b5060995461024d906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610275575f80fd5b5061024d7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102a8575f80fd5b507fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff165b6040519015158152602001610261565b3480156102ea575f80fd5b506101e76108ec565b3480156102fe575f80fd5b507fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff166102cf565b348015610339575f80fd5b506103617f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d681565b604051908152602001610261565b34801561037a575f80fd5b506101e7610a1e565b34801561038e575f80fd5b5060975461024d906001600160a01b031681565b6101e76103b0366004612b35565b610a31565b3480156103c0575f80fd5b506103617f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c81565b3480156103f3575f80fd5b506065546001600160a01b031661024d565b348015610410575f80fd5b5061024d61041f366004612bc7565b610c21565b34801561042f575f80fd5b506102cf61043e366004612b07565b610c60565b34801561044e575f80fd5b506101e7610c96565b348015610462575f80fd5b506101e7610dc4565b348015610476575f80fd5b5061024d7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104a9575f80fd5b506101e76104b8366004612be7565b610eda565b3480156104c8575f80fd5b5061024d6104d7366004612c2f565b611018565b3480156104e7575f80fd5b506103616104f6366004612c51565b6110ad565b348015610506575f80fd5b506101e7610515366004612b07565b6110e2565b348015610525575f80fd5b506103617f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d81565b348015610558575f80fd5b506101e76110f4565b6101e761056f366004612c68565b61120f565b34801561057f575f80fd5b506101e761058e366004612cab565b61121b565b34801561059e575f80fd5b506101e76105ad366004612c2f565b611330565b3480156105bd575f80fd5b5060985461024d906001600160a01b031681565b3480156105dc575f80fd5b506103617f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a81565b61061185858585856113c0565b5050505050565b6099546001600160a01b03163381146106785760405162461bcd60e51b815260206004820152601760248201527f6f6e6c79206d657373656e6765722063616e2063616c6c00000000000000000060448201526064015b60405180910390fd5b806001600160a01b0316636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106d89190612d04565b6001600160a01b0316736f297c61b5c92ef107ffd30cd56affe5a273e8416001600160a01b03161461074c5760405162461bcd60e51b815260206004820152601b60248201527f6f6e6c792063616c6c656420696e2064726f7020636f6e746578740000000000604482015260640161066f565b610754611780565b7f8431f5c10000000000000000000000000000000000000000000000000000000061078260045f8587612d1f565b61078b91612d46565b7fffffffff0000000000000000000000000000000000000000000000000000000016146107fa5760405162461bcd60e51b815260206004820152601060248201527f696e76616c69642073656c6563746f7200000000000000000000000000000000604482015260640161066f565b5f808061080a8560048189612d1f565b8101906108179190612d8e565b50945050935050925061082b8383836117d9565b61083f6001600160a01b038416838361187d565b816001600160a01b0316836001600160a01b03167fdbdf8eb487847e4c0f22847f5dac07f2d3690f96f581a6ae4b102769917645a88360405161088491815260200190565b60405180910390a350505061089860018055565b505050565b6108988333845f5b6040519080825280601f01601f1916602001820160405280156108cf576020820181803683370190505b50856113c0565b6108de61192c565b6108e88282611986565b5050565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff1615610948576040517f4f2c8be200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109727f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a33610c60565b6109a8576040517f3d39c5f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560405133907fc36a428b063177e3f28b3b5d340c08f77827847b2ee30114ccf0c40e519c420a905f90a2565b610a2661192c565b610a2f5f6119fc565b565b6099546001600160a01b0316338114610a8c5760405162461bcd60e51b815260206004820152601760248201527f6f6e6c79206d657373656e6765722063616e2063616c6c000000000000000000604482015260640161066f565b806001600160a01b0316636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ac8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aec9190612d04565b6097546001600160a01b03908116911614610b495760405162461bcd60e51b815260206004820152601860248201527f6f6e6c792063616c6c20627920636f756e746572706172740000000000000000604482015260640161066f565b610b51611780565b610b6088888888888888611a65565b610b746001600160a01b038916868661187d565b610bb38584848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250611be092505050565b856001600160a01b0316876001600160a01b0316896001600160a01b03167fc6f985873b37805705f6bce756dce3d1ff4b603e298d506288cce499926846a788888888604051610c069493929190612e19565b60405180910390a4610c1760018055565b5050505050505050565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260408120610c579083611c74565b90505b92915050565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260408120610c579083611c7f565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff16610cf1576040517fa185a6b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d1b7f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d633610c60565b610d51576040517fadd9524c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560405133907f9ca4d309bbfd23c65db3dc38c1712862f5812c7139937e2655de86e803f73bb9905f90a2565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff16610e24576040517f77d195b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e4e7f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c33610c60565b610e84576040517f9e60ca7e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec805461ff001916905560405133907f644eeba8ede48fefc32ada09fb240c5f6c0f06507ab1d296d5af41f1521d9fcb905f90a2565b5f54610100900460ff1615808015610ef857505f54600160ff909116105b80610f115750303b158015610f1157505f5460ff166001145b610f835760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161066f565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610fc2575f805461ff0019166101001790555b610fcd848484611ca0565b8015611012575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b5f817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614611085576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b507f000000000000000000000000000000000000000000000000000000000000000092915050565b5f8181527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260408120610c5a90611de3565b6110ea61192c565b6108e88282611dec565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff1615611155576040517ff74ad25400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61117f7f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d33610c60565b6111b5576040517f5c16894300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec805461ff00191661010017905560405133907fb2ed3603bd9051f0182ebfb75f12a21059b4d31b578a2a05c8d0245e9e2d3204905f90a2565b6110128484845f6108a5565b5f54600290610100900460ff1615801561123b57505f5460ff8083169116105b6112ad5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161066f565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff8316176101001790556112e985858585611e62565b5f805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b61133861192c565b6001600160a01b0381166113b45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161066f565b6113bd816119fc565b50565b6113c8611780565b847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614611434576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b846001600160a01b038116611475576040517fef6b416200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff166114d0576040517fa185a6b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845f03611509576040517f14fc8bd900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611515888787612043565b8051919850965090915015611556576040517fb286dd6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f887f0000000000000000000000000000000000000000000000000000000000000000838a8a8a60405160240161159296959493929190612eab565b60408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8431f5c10000000000000000000000000000000000000000000000000000000017905260995482517fecc7042800000000000000000000000000000000000000000000000000000000815292519394505f936001600160a01b039091169263ecc704289260048083019391928290030181865afa15801561164b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061166f9190612ef8565b6099546097546040517f5f7b15770000000000000000000000000000000000000000000000000000000081529293506001600160a01b0391821692635f7b15779234926116c9929116905f9088908d908b90600401612f0f565b5f604051808303818588803b1580156116e0575f80fd5b505af11580156116f2573d5f803e3d5ffd5b5050505050826001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168b6001600160a01b03167f1a6c38816de45937fd5cd974f9694fe10e64163ba12a92abf0f4b6b23ad886728c8c8c8760405161176a9493929190612f51565b60405180910390a4505050505061061160018055565b6002600154036117d25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161066f565b6002600155565b827f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614611845576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3415611012576040517f3ddcf11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516001600160a01b0383166024820152604481018290526108989084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612299565b60018055565b6065546001600160a01b03163314610a2f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161066f565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed602052604090206119bc908261237f565b156108e85760405133906001600160a01b0383169084907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d905f90a45050565b606580546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614611ad1576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614611b3d576040517f6251ce6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff16611b9d576040517f77d195b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3415611bd5576040517f3ddcf11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050505050565b5f8151118015611bf957505f826001600160a01b03163b115b156108e8576040517f444b281f0000000000000000000000000000000000000000000000000000000081526001600160a01b0383169063444b281f90611c43908490600401612f89565b5f604051808303815f87803b158015611c5a575f80fd5b505af1158015611c6c573d5f803e3d5ffd5b505050505050565b5f610c578383612393565b6001600160a01b0381165f9081526001830160205260408120541515610c57565b6001600160a01b038316611cf65760405162461bcd60e51b815260206004820152601860248201527f7a65726f20636f756e7465727061727420616464726573730000000000000000604482015260640161066f565b6001600160a01b038116611d4c5760405162461bcd60e51b815260206004820152601660248201527f7a65726f206d657373656e676572206164647265737300000000000000000000604482015260640161066f565b611d546123b9565b611d5c61243d565b609780546001600160a01b038086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560998054848416921691909117905582161561089857609880546001600160a01b0384167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179055505050565b5f610c5a825490565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260409020611e2290826124c1565b156108e85760405133906001600160a01b0383169084907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b905f90a45050565b5f54610100900460ff16611ede5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161066f565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117815560405133907fc36a428b063177e3f28b3b5d340c08f77827847b2ee30114ccf0c40e519c420a905f90a2805461ff001916610100178155611f663390565b6001600160a01b03167fb2ed3603bd9051f0182ebfb75f12a21059b4d31b578a2a05c8d0245e9e2d320460405160405180910390a2611fc57f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a86611986565b611fef7f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d685611986565b6120197f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d84611986565b6106117f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c83611986565b6098545f908190606090339081906001600160a01b031681900361211357858060200190518101906120759190612f9b565b6040517fc52a3bbc0000000000000000000000000000000000000000000000000000000081526001600160a01b0380841660048301528b81166024830152604482018b905291985091925083169063c52a3bbc906064016020604051808303815f875af11580156120e8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061210c9190612ef8565b965061223d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f906001600160a01b038a16906370a0823190602401602060405180830381865afa158015612170573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121949190612ef8565b90506121ab6001600160a01b038a1683308b6124d5565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa158015612208573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061222c9190612ef8565b90506122388282613023565b985050505b5f871161228c5760405162461bcd60e51b815260206004820152601360248201527f6465706f736974207a65726f20616d6f756e7400000000000000000000000000604482015260640161066f565b9795965093949350505050565b5f6122ed826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166125269092919063ffffffff16565b905080515f148061230d57508080602001905181019061230d919061305b565b6108985760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161066f565b5f610c57836001600160a01b03841661253c565b5f825f0182815481106123a8576123a861307a565b905f5260205f200154905092915050565b5f54610100900460ff166124355760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161066f565b610a2f612588565b5f54610100900460ff166124b95760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161066f565b610a2f612604565b5f610c57836001600160a01b038416612689565b6040516001600160a01b03808516602483015283166044820152606481018290526110129085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016118c2565b606061253484845f8561276c565b949350505050565b5f81815260018301602052604081205461258157508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610c5a565b505f610c5a565b5f54610100900460ff166119265760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161066f565b5f54610100900460ff166126805760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161066f565b610a2f336119fc565b5f8181526001830160205260408120548015612763575f6126ab600183613023565b85549091505f906126be90600190613023565b905081811461271d575f865f0182815481106126dc576126dc61307a565b905f5260205f200154905080875f0184815481106126fc576126fc61307a565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061272e5761272e6130a7565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610c5a565b5f915050610c5a565b6060824710156127e45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161066f565b5f80866001600160a01b031685876040516127ff91906130d4565b5f6040518083038185875af1925050503d805f8114612839576040519150601f19603f3d011682016040523d82523d5f602084013e61283e565b606091505b509150915061284f8783838761285a565b979650505050505050565b606083156128c85782515f036128c1576001600160a01b0385163b6128c15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161066f565b5081612534565b61253483838151156128dd5781518083602001fd5b8060405162461bcd60e51b815260040161066f9190612f89565b6001600160a01b03811681146113bd575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156129615761296161290b565b604052919050565b5f67ffffffffffffffff8211156129825761298261290b565b50601f01601f191660200190565b5f82601f83011261299f575f80fd5b81356129b26129ad82612969565b612938565b8181528460208386010111156129c6575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f60a086880312156129f6575f80fd5b8535612a01816128f7565b94506020860135612a11816128f7565b935060408601359250606086013567ffffffffffffffff811115612a33575f80fd5b612a3f88828901612990565b95989497509295608001359392505050565b5f8083601f840112612a61575f80fd5b50813567ffffffffffffffff811115612a78575f80fd5b602083019150836020828501011115612a8f575f80fd5b9250929050565b5f8060208385031215612aa7575f80fd5b823567ffffffffffffffff811115612abd575f80fd5b612ac985828601612a51565b90969095509350505050565b5f805f60608486031215612ae7575f80fd5b8335612af2816128f7565b95602085013595506040909401359392505050565b5f8060408385031215612b18575f80fd5b823591506020830135612b2a816128f7565b809150509250929050565b5f805f805f805f60c0888a031215612b4b575f80fd5b8735612b56816128f7565b96506020880135612b66816128f7565b95506040880135612b76816128f7565b94506060880135612b86816128f7565b93506080880135925060a088013567ffffffffffffffff811115612ba8575f80fd5b612bb48a828b01612a51565b989b979a50959850939692959293505050565b5f8060408385031215612bd8575f80fd5b50508035926020909101359150565b5f805f60608486031215612bf9575f80fd5b8335612c04816128f7565b92506020840135612c14816128f7565b91506040840135612c24816128f7565b809150509250925092565b5f60208284031215612c3f575f80fd5b8135612c4a816128f7565b9392505050565b5f60208284031215612c61575f80fd5b5035919050565b5f805f8060808587031215612c7b575f80fd5b8435612c86816128f7565b93506020850135612c96816128f7565b93969395505050506040820135916060013590565b5f805f8060808587031215612cbe575f80fd5b8435612cc9816128f7565b93506020850135612cd9816128f7565b92506040850135612ce9816128f7565b91506060850135612cf9816128f7565b939692955090935050565b5f60208284031215612d14575f80fd5b8151612c4a816128f7565b5f8085851115612d2d575f80fd5b83861115612d39575f80fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015612d865780818660040360031b1b83161692505b505092915050565b5f805f805f8060c08789031215612da3575f80fd5b8635612dae816128f7565b95506020870135612dbe816128f7565b94506040870135612dce816128f7565b93506060870135612dde816128f7565b92506080870135915060a087013567ffffffffffffffff811115612e00575f80fd5b612e0c89828a01612990565b9150509295509295509295565b6001600160a01b038516815283602082015260606040820152816060820152818360808301375f818301608090810191909152601f909201601f191601019392505050565b5f5b83811015612e78578181015183820152602001612e60565b50505f910152565b5f8151808452612e97816020860160208601612e5e565b601f01601f19169290920160200192915050565b5f6001600160a01b0380891683528088166020840152808716604084015280861660608401525083608083015260c060a0830152612eec60c0830184612e80565b98975050505050505050565b5f60208284031215612f08575f80fd5b5051919050565b5f6001600160a01b03808816835286602084015260a06040840152612f3760a0840187612e80565b606084019590955292909216608090910152509392505050565b6001600160a01b0385168152836020820152608060408201525f612f786080830185612e80565b905082606083015295945050505050565b602081525f610c576020830184612e80565b5f8060408385031215612fac575f80fd5b8251612fb7816128f7565b602084015190925067ffffffffffffffff811115612fd3575f80fd5b8301601f81018513612fe3575f80fd5b8051612ff16129ad82612969565b818152866020838501011115613005575f80fd5b613016826020830160208601612e5e565b8093505050509250929050565b81810381811115610c5a577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6020828403121561306b575f80fd5b81518015158114612c4a575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f82516130e5818460208701612e5e565b919091019291505056fea164736f6c6343000818000a +0x6080604052600436106101d0575f3560e01c80639010d07c116100fd578063d547741f11610092578063f27ebced11610062578063f27ebced14610574578063f2fde38b14610593578063f887ea40146105b2578063fadcc54a146105d1575f80fd5b8063d547741f146104fb578063e3b523e31461051a578063e8bac93b1461054d578063f219fa6614610561575f80fd5b8063c01e1bd6116100cd578063c01e1bd61461046b578063c0c53b8b1461049e578063c676ad29146104bd578063ca15c873146104dc575f80fd5b80639010d07c1461040557806391d1485414610424578063ac67e1af14610443578063ad960ce114610457575f80fd5b80635e4c57a411610173578063797594b011610143578063797594b01461038357806384bd13b0146103a25780638d7601c0146103b55780638da5cb5b146103e8575f80fd5b80635e4c57a4146102df5780635ed2c220146102f35780636f18bd221461032e578063715018a61461036f575f80fd5b80632f2ff15d116101ae5780632f2ff15d1461020f5780633cb747bf1461022e57806356eff2671461026a5780635777bf501461029d575f80fd5b80630aea8c26146101d457806314298c51146101e957806321425ee0146101fc575b5f80fd5b6101e76101e23660046129c6565b610604565b005b6101e76101f7366004612a7a565b610618565b6101e761020a366004612ab9565b61089d565b34801561021a575f80fd5b506101e7610229366004612aeb565b6108d6565b348015610239575f80fd5b5060995461024d906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610275575f80fd5b5061024d7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102a8575f80fd5b507fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff165b6040519015158152602001610261565b3480156102ea575f80fd5b506101e76108ec565b3480156102fe575f80fd5b507fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff166102cf565b348015610339575f80fd5b506103617f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d681565b604051908152602001610261565b34801561037a575f80fd5b506101e7610a1e565b34801561038e575f80fd5b5060975461024d906001600160a01b031681565b6101e76103b0366004612b19565b610a31565b3480156103c0575f80fd5b506103617f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c81565b3480156103f3575f80fd5b506065546001600160a01b031661024d565b348015610410575f80fd5b5061024d61041f366004612bab565b610c21565b34801561042f575f80fd5b506102cf61043e366004612aeb565b610c60565b34801561044e575f80fd5b506101e7610c96565b348015610462575f80fd5b506101e7610dc4565b348015610476575f80fd5b5061024d7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104a9575f80fd5b506101e76104b8366004612bcb565b610eda565b3480156104c8575f80fd5b5061024d6104d7366004612c13565b611018565b3480156104e7575f80fd5b506103616104f6366004612c35565b6110ad565b348015610506575f80fd5b506101e7610515366004612aeb565b6110e2565b348015610525575f80fd5b506103617f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d81565b348015610558575f80fd5b506101e76110f4565b6101e761056f366004612c4c565b61120f565b34801561057f575f80fd5b506101e761058e366004612c8f565b61121b565b34801561059e575f80fd5b506101e76105ad366004612c13565b611330565b3480156105bd575f80fd5b5060985461024d906001600160a01b031681565b3480156105dc575f80fd5b506103617f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a81565b61061185858585856113c0565b5050505050565b6099546001600160a01b03163381146106785760405162461bcd60e51b815260206004820152601760248201527f6f6e6c79206d657373656e6765722063616e2063616c6c00000000000000000060448201526064015b60405180910390fd5b806001600160a01b0316636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106d89190612ce8565b6001600160a01b0316736f297c61b5c92ef107ffd30cd56affe5a273e8416001600160a01b03161461074c5760405162461bcd60e51b815260206004820152601b60248201527f6f6e6c792063616c6c656420696e2064726f7020636f6e746578740000000000604482015260640161066f565b610754611764565b7f8431f5c10000000000000000000000000000000000000000000000000000000061078260045f8587612d03565b61078b91612d2a565b7fffffffff0000000000000000000000000000000000000000000000000000000016146107fa5760405162461bcd60e51b815260206004820152601060248201527f696e76616c69642073656c6563746f7200000000000000000000000000000000604482015260640161066f565b5f808061080a8560048189612d03565b8101906108179190612d72565b50945050935050925061082b8383836117bd565b61083f6001600160a01b0384168383611861565b816001600160a01b0316836001600160a01b03167fdbdf8eb487847e4c0f22847f5dac07f2d3690f96f581a6ae4b102769917645a88360405161088491815260200190565b60405180910390a350505061089860018055565b505050565b6108988333845f5b6040519080825280601f01601f1916602001820160405280156108cf576020820181803683370190505b50856113c0565b6108de611910565b6108e8828261196a565b5050565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff1615610948576040517f4f2c8be200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109727f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a33610c60565b6109a8576040517f3d39c5f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560405133907fc36a428b063177e3f28b3b5d340c08f77827847b2ee30114ccf0c40e519c420a905f90a2565b610a26611910565b610a2f5f6119e0565b565b6099546001600160a01b0316338114610a8c5760405162461bcd60e51b815260206004820152601760248201527f6f6e6c79206d657373656e6765722063616e2063616c6c000000000000000000604482015260640161066f565b806001600160a01b0316636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ac8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aec9190612ce8565b6097546001600160a01b03908116911614610b495760405162461bcd60e51b815260206004820152601860248201527f6f6e6c792063616c6c20627920636f756e746572706172740000000000000000604482015260640161066f565b610b51611764565b610b6088888888888888611a49565b610b746001600160a01b0389168686611861565b610bb38584848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250611bc492505050565b856001600160a01b0316876001600160a01b0316896001600160a01b03167fc6f985873b37805705f6bce756dce3d1ff4b603e298d506288cce499926846a788888888604051610c069493929190612dfd565b60405180910390a4610c1760018055565b5050505050505050565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260408120610c579083611c58565b90505b92915050565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260408120610c579083611c63565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff16610cf1576040517fa185a6b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d1b7f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d633610c60565b610d51576040517fadd9524c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560405133907f9ca4d309bbfd23c65db3dc38c1712862f5812c7139937e2655de86e803f73bb9905f90a2565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff16610e24576040517f77d195b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e4e7f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c33610c60565b610e84576040517f9e60ca7e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec805461ff001916905560405133907f644eeba8ede48fefc32ada09fb240c5f6c0f06507ab1d296d5af41f1521d9fcb905f90a2565b5f54610100900460ff1615808015610ef857505f54600160ff909116105b80610f115750303b158015610f1157505f5460ff166001145b610f835760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161066f565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610fc2575f805461ff0019166101001790555b610fcd848484611c84565b8015611012575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b5f817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614611085576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b507f000000000000000000000000000000000000000000000000000000000000000092915050565b5f8181527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260408120610c5a90611dc7565b6110ea611910565b6108e88282611dd0565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff1615611155576040517ff74ad25400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61117f7f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d33610c60565b6111b5576040517f5c16894300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec805461ff00191661010017905560405133907fb2ed3603bd9051f0182ebfb75f12a21059b4d31b578a2a05c8d0245e9e2d3204905f90a2565b6110128484845f6108a5565b5f54600290610100900460ff1615801561123b57505f5460ff8083169116105b6112ad5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161066f565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff8316176101001790556112e985858585611e46565b5f805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b611338611910565b6001600160a01b0381166113b45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161066f565b6113bd816119e0565b50565b6113c8611764565b847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614611434576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b846001600160a01b038116611475576040517fef6b416200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff166114d0576040517fa185a6b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845f03611509576040517f14fc8bd900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611515888787612027565b8051919850965090915015611556576040517fb286dd6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f0000000000000000000000000000000000000000000000000000000000000000905f90611595908b90849086908d908d908d90602401612e8f565b60408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8431f5c10000000000000000000000000000000000000000000000000000000017905260995482517fecc7042800000000000000000000000000000000000000000000000000000000815292519394505f936001600160a01b039091169263ecc704289260048083019391928290030181865afa15801561164e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116729190612edc565b6099546097546040517f5f7b15770000000000000000000000000000000000000000000000000000000081529293506001600160a01b0391821692635f7b15779234926116cc929116905f9088908e908c90600401612ef3565b5f604051808303818588803b1580156116e3575f80fd5b505af11580156116f5573d5f803e3d5ffd5b5050505050836001600160a01b0316836001600160a01b03168c6001600160a01b03167f1a6c38816de45937fd5cd974f9694fe10e64163ba12a92abf0f4b6b23ad886728d8d8d8760405161174d9493929190612f35565b60405180910390a450505050505061061160018055565b6002600154036117b65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161066f565b6002600155565b827f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614611829576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3415611012576040517f3ddcf11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516001600160a01b0383166024820152604481018290526108989084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261227d565b60018055565b6065546001600160a01b03163314610a2f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161066f565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed602052604090206119a09082612363565b156108e85760405133906001600160a01b0383169084907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d905f90a45050565b606580546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614611ab5576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614611b21576040517f6251ce6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff16611b81576040517f77d195b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3415611bb9576040517f3ddcf11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050505050565b5f8151118015611bdd57505f826001600160a01b03163b115b156108e8576040517f444b281f0000000000000000000000000000000000000000000000000000000081526001600160a01b0383169063444b281f90611c27908490600401612f6d565b5f604051808303815f87803b158015611c3e575f80fd5b505af1158015611c50573d5f803e3d5ffd5b505050505050565b5f610c578383612377565b6001600160a01b0381165f9081526001830160205260408120541515610c57565b6001600160a01b038316611cda5760405162461bcd60e51b815260206004820152601860248201527f7a65726f20636f756e7465727061727420616464726573730000000000000000604482015260640161066f565b6001600160a01b038116611d305760405162461bcd60e51b815260206004820152601660248201527f7a65726f206d657373656e676572206164647265737300000000000000000000604482015260640161066f565b611d3861239d565b611d40612421565b609780546001600160a01b038086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560998054848416921691909117905582161561089857609880546001600160a01b0384167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179055505050565b5f610c5a825490565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260409020611e0690826124a5565b156108e85760405133906001600160a01b0383169084907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b905f90a45050565b5f54610100900460ff16611ec25760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161066f565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117815560405133907fc36a428b063177e3f28b3b5d340c08f77827847b2ee30114ccf0c40e519c420a905f90a2805461ff001916610100178155611f4a3390565b6001600160a01b03167fb2ed3603bd9051f0182ebfb75f12a21059b4d31b578a2a05c8d0245e9e2d320460405160405180910390a2611fa97f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a8661196a565b611fd37f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d68561196a565b611ffd7f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d8461196a565b6106117f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c8361196a565b6098545f908190606090339081906001600160a01b03168190036120f757858060200190518101906120599190612f7f565b6040517fc52a3bbc0000000000000000000000000000000000000000000000000000000081526001600160a01b0380841660048301528b81166024830152604482018b905291985091925083169063c52a3bbc906064016020604051808303815f875af11580156120cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120f09190612edc565b9650612221565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f906001600160a01b038a16906370a0823190602401602060405180830381865afa158015612154573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121789190612edc565b905061218f6001600160a01b038a1683308b6124b9565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa1580156121ec573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122109190612edc565b905061221c8282613007565b985050505b5f87116122705760405162461bcd60e51b815260206004820152601360248201527f6465706f736974207a65726f20616d6f756e7400000000000000000000000000604482015260640161066f565b9795965093949350505050565b5f6122d1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661250a9092919063ffffffff16565b905080515f14806122f15750808060200190518101906122f1919061303f565b6108985760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161066f565b5f610c57836001600160a01b038416612520565b5f825f01828154811061238c5761238c61305e565b905f5260205f200154905092915050565b5f54610100900460ff166124195760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161066f565b610a2f61256c565b5f54610100900460ff1661249d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161066f565b610a2f6125e8565b5f610c57836001600160a01b03841661266d565b6040516001600160a01b03808516602483015283166044820152606481018290526110129085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016118a6565b606061251884845f85612750565b949350505050565b5f81815260018301602052604081205461256557508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610c5a565b505f610c5a565b5f54610100900460ff1661190a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161066f565b5f54610100900460ff166126645760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161066f565b610a2f336119e0565b5f8181526001830160205260408120548015612747575f61268f600183613007565b85549091505f906126a290600190613007565b9050818114612701575f865f0182815481106126c0576126c061305e565b905f5260205f200154905080875f0184815481106126e0576126e061305e565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806127125761271261308b565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610c5a565b5f915050610c5a565b6060824710156127c85760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161066f565b5f80866001600160a01b031685876040516127e391906130b8565b5f6040518083038185875af1925050503d805f811461281d576040519150601f19603f3d011682016040523d82523d5f602084013e612822565b606091505b50915091506128338783838761283e565b979650505050505050565b606083156128ac5782515f036128a5576001600160a01b0385163b6128a55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161066f565b5081612518565b61251883838151156128c15781518083602001fd5b8060405162461bcd60e51b815260040161066f9190612f6d565b6001600160a01b03811681146113bd575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612945576129456128ef565b604052919050565b5f67ffffffffffffffff821115612966576129666128ef565b50601f01601f191660200190565b5f82601f830112612983575f80fd5b81356129966129918261294d565b61291c565b8181528460208386010111156129aa575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f60a086880312156129da575f80fd5b85356129e5816128db565b945060208601356129f5816128db565b935060408601359250606086013567ffffffffffffffff811115612a17575f80fd5b612a2388828901612974565b95989497509295608001359392505050565b5f8083601f840112612a45575f80fd5b50813567ffffffffffffffff811115612a5c575f80fd5b602083019150836020828501011115612a73575f80fd5b9250929050565b5f8060208385031215612a8b575f80fd5b823567ffffffffffffffff811115612aa1575f80fd5b612aad85828601612a35565b90969095509350505050565b5f805f60608486031215612acb575f80fd5b8335612ad6816128db565b95602085013595506040909401359392505050565b5f8060408385031215612afc575f80fd5b823591506020830135612b0e816128db565b809150509250929050565b5f805f805f805f60c0888a031215612b2f575f80fd5b8735612b3a816128db565b96506020880135612b4a816128db565b95506040880135612b5a816128db565b94506060880135612b6a816128db565b93506080880135925060a088013567ffffffffffffffff811115612b8c575f80fd5b612b988a828b01612a35565b989b979a50959850939692959293505050565b5f8060408385031215612bbc575f80fd5b50508035926020909101359150565b5f805f60608486031215612bdd575f80fd5b8335612be8816128db565b92506020840135612bf8816128db565b91506040840135612c08816128db565b809150509250925092565b5f60208284031215612c23575f80fd5b8135612c2e816128db565b9392505050565b5f60208284031215612c45575f80fd5b5035919050565b5f805f8060808587031215612c5f575f80fd5b8435612c6a816128db565b93506020850135612c7a816128db565b93969395505050506040820135916060013590565b5f805f8060808587031215612ca2575f80fd5b8435612cad816128db565b93506020850135612cbd816128db565b92506040850135612ccd816128db565b91506060850135612cdd816128db565b939692955090935050565b5f60208284031215612cf8575f80fd5b8151612c2e816128db565b5f8085851115612d11575f80fd5b83861115612d1d575f80fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015612d6a5780818660040360031b1b83161692505b505092915050565b5f805f805f8060c08789031215612d87575f80fd5b8635612d92816128db565b95506020870135612da2816128db565b94506040870135612db2816128db565b93506060870135612dc2816128db565b92506080870135915060a087013567ffffffffffffffff811115612de4575f80fd5b612df089828a01612974565b9150509295509295509295565b6001600160a01b038516815283602082015260606040820152816060820152818360808301375f818301608090810191909152601f909201601f191601019392505050565b5f5b83811015612e5c578181015183820152602001612e44565b50505f910152565b5f8151808452612e7b816020860160208601612e42565b601f01601f19169290920160200192915050565b5f6001600160a01b0380891683528088166020840152808716604084015280861660608401525083608083015260c060a0830152612ed060c0830184612e64565b98975050505050505050565b5f60208284031215612eec575f80fd5b5051919050565b5f6001600160a01b03808816835286602084015260a06040840152612f1b60a0840187612e64565b606084019590955292909216608090910152509392505050565b6001600160a01b0385168152836020820152608060408201525f612f5c6080830185612e64565b905082606083015295945050505050565b602081525f610c576020830184612e64565b5f8060408385031215612f90575f80fd5b8251612f9b816128db565b602084015190925067ffffffffffffffff811115612fb7575f80fd5b8301601f81018513612fc7575f80fd5b8051612fd56129918261294d565b818152866020838501011115612fe9575f80fd5b612ffa826020830160208601612e42565b8093505050509250929050565b81810381811115610c5a577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6020828403121561304f575f80fd5b81518015158114612c2e575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f82516130c9818460208701612e42565b919091019291505056fea164736f6c6343000818000a diff --git a/bindings/bin/l1messagequeuewithgaspriceoracle_deployed.hex b/bindings/bin/l1messagequeuewithgaspriceoracle_deployed.hex index 029ef9d7..a0cd87ec 100644 --- a/bindings/bin/l1messagequeuewithgaspriceoracle_deployed.hex +++ b/bindings/bin/l1messagequeuewithgaspriceoracle_deployed.hex @@ -1 +1 @@ -0x608060405234801561000f575f80fd5b50600436106101a5575f3560e01c80639b159782116100e8578063d5ad4a9711610093578063e172d3a11161006e578063e172d3a1146103ca578063e3176bd5146103e4578063f2fde38b146103ed578063fd0ad31e14610400575f80fd5b8063d5ad4a9714610391578063d99bc80e146103a4578063da35a26f146103b7575f80fd5b8063bb7862ca116100c3578063bb7862ca14610337578063bdc6f0a014610357578063c27606771461036a575f80fd5b80639b15978214610308578063a85006ca1461031b578063ae453cd514610324575f80fd5b80635f9cd92e116101535780638770d7071161012e5780638770d707146102645780638da5cb5b146102b057806391652461146102ce578063927ede2d146102e1575f80fd5b80635f9cd92e14610236578063715018a6146102495780637d82191a14610251575f80fd5b806355f613ce1161018357806355f613ce146102055780635ad9945a1461021a5780635e45da231461022d575f80fd5b806329aa604b146101a95780633e4cbbe6146101cf5780633e6dada1146101e2575b5f80fd5b6101bc6101b73660046114fc565b610408565b6040519081526020015b60405180910390f35b6101bc6101dd366004611536565b610427565b6101f56101f03660046114fc565b6104db565b60405190151581526020016101c6565b61021861021336600461155e565b610521565b005b6101bc6102283660046115cc565b610715565b6101bc60685481565b610218610244366004611648565b610905565b61021861099a565b6101f561025f3660046114fc565b6109ad565b61028b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c6565b60335473ffffffffffffffffffffffffffffffffffffffff1661028b565b6102186102dc3660046114fc565b6109e0565b61028b7f000000000000000000000000000000000000000000000000000000000000000081565b610218610316366004611661565b610bff565b6101bc60675481565b6101bc6103323660046114fc565b610ce1565b606b5461028b9073ffffffffffffffffffffffffffffffffffffffff1681565b6102186103653660046116b7565b610d57565b61028b7f000000000000000000000000000000000000000000000000000000000000000081565b61021861039f3660046114fc565b610e88565b6102186103b23660046114fc565b610ed6565b6102186103c536600461172a565b610f1c565b6101bc6103d8366004611754565b60100261520801919050565b6101bc60655481565b6102186103fb366004611648565b6110d1565b6066546101bc565b60668181548110610417575f80fd5b5f91825260209091200154905081565b606b546040517fefc7840100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301525f92169063efc7840190602401602060405180830381865afa158015610495573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104b99190611793565b156104c557505f6104d5565b6065546104d290836117b9565b90505b92915050565b600881901c5f908152606a6020526040812054600160ff84161b16151580156104d55750600882901c5f90815260696020526040902054600160ff84161b1615156104d5565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146105ab5760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c792063616c6c61626c652062792074686520726f6c6c7570000000000060448201526064015b60405180910390fd5b6101008211156105fd5760405162461bcd60e51b815260206004820152601560248201527f706f7020746f6f206d616e79206d65737361676573000000000000000000000060448201526064016105a2565b826067541461064e5760405162461bcd60e51b815260206004820152601460248201527f737461727420696e646578206d69736d6174636800000000000000000000000060448201526064016105a2565b600883901c5f818152606a6020526040902080546001851b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0193841660ff871681811b9092179092559092919061010081860111156106c557600182015f908152606a6020526040902061010082900385901c90555b50505081830160675560408051848152602081018490529081018290527fc77f792f838ae38399ac31acc3348389aeb110ce7bedf3cfdbdd5e6679267970906060015b60405180910390a1505050565b5f607e816107bf565b5f8161072c57506001919050565b5b81156107425760089190911c9060010161072d565b919050565b80608083106001811461077f5761075d8461071e565b60808101835360018301925084816020036008021b83528083019250506107a0565b848415166001811461079357848353610798565b608083535b506001820191505b509392505050565b806094815360609290921b60018301525060150190565b600560405101806107d260018c83610747565b90506107e060018983610747565b90506107ec89826107a8565b90506107fa60018b83610747565b905060018614600181146108625760388710600181146108475761081d8861071e565b8060b701845360018401935088816020036008021b8452808401935050878984379187019161085c565b87608001835360018301925087898437918701915b50610873565b6108705f89355f1a84610747565b91505b5061087e8c826107a8565b90508181035f8060388310600181146108b15761089a8461071e565b60f78101600882021b8517935060010191506108bc565b8360c0019250600191505b5086816008021b821791506001810190508060080292508451831c8284610100031b17915080850394505080845250508181038220925050508092505050979650505050505050565b61090d61116e565b606b5460405173ffffffffffffffffffffffffffffffffffffffff8084169216907ff91b2a410a89d46f14ee984a57e6d7892c217f116905371180998e20cef237e5905f90a3606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6109a261116e565b6109ab5f6111d5565b565b5f60675482106109be57505f919050565b600882901c5f908152606a6020526040902054600160ff84161b1615156104d5565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610a8b5760405162461bcd60e51b815260206004820152602b60248201527f4f6e6c792063616c6c61626c6520627920746865204c3143726f7373446f6d6160448201527f696e4d657373656e67657200000000000000000000000000000000000000000060648201526084016105a2565b6067548110610adc5760405162461bcd60e51b815260206004820152601b60248201527f63616e6e6f742064726f702070656e64696e67206d657373616765000000000060448201526064016105a2565b600881901c5f908152606a6020526040902054600160ff83161b16610b435760405162461bcd60e51b815260206004820152601860248201527f64726f70206e6f6e2d736b6970706564206d657373616765000000000000000060448201526064016105a2565b600881901c5f90815260696020526040902054600160ff83161b1615610bab5760405162461bcd60e51b815260206004820152601760248201527f6d65737361676520616c72656164792064726f7070656400000000000000000060448201526064016105a2565b600881901c5f9081526069602052604090208054600160ff84161b1790556040518181527f43a375005206d20a83abc71722cba68c24434a8dc1f583775be7c3fde0396cbf9060200160405180910390a150565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610caa5760405162461bcd60e51b815260206004820152602b60248201527f4f6e6c792063616c6c61626c6520627920746865204c3143726f7373446f6d6160448201527f696e4d657373656e67657200000000000000000000000000000000000000000060648201526084016105a2565b610cb583838361124b565b3373111100000000000000000000000000000000111101610cda81865f878787611347565b5050505050565b6066545f908210610d345760405162461bcd60e51b815260206004820152601a60248201527f6d65737361676520696e646578206f7574206f662072616e676500000000000060448201526064016105a2565b60668281548110610d4757610d476117f5565b905f5260205f2001549050919050565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610e025760405162461bcd60e51b815260206004820152602660248201527f4f6e6c792063616c6c61626c652062792074686520456e666f7263656454784760448201527f617465776179000000000000000000000000000000000000000000000000000060648201526084016105a2565b73ffffffffffffffffffffffffffffffffffffffff86163b15610e675760405162461bcd60e51b815260206004820152600860248201527f6f6e6c7920454f4100000000000000000000000000000000000000000000000060448201526064016105a2565b610e7283838361124b565b610e80868686868686611347565b505050505050565b610e9061116e565b606880549082905560408051828152602081018490527fa030881e03ff723954dd0d35500564afab9603555d09d4456a32436f2b2373c591015b60405180910390a15050565b610ede61116e565b606580549082905560408051828152602081018490527fc5271ba80b67178cc31f04a3755325121400925878dc608432b6fcaead3663299101610eca565b5f54610100900460ff1615808015610f3a57505f54600160ff909116105b80610f535750303b158015610f5357505f5460ff166001145b610fc55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105a2565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611021575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6110296113f8565b6068839055606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841617905580156110cc575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001610708565b505050565b6110d961116e565b73ffffffffffffffffffffffffffffffffffffffff81166111625760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016105a2565b61116b816111d5565b50565b60335473ffffffffffffffffffffffffffffffffffffffff1633146109ab5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105a2565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6068548311156112c35760405162461bcd60e51b815260206004820152602560248201527f476173206c696d6974206d757374206e6f7420657863656564206d617847617360448201527f4c696d697400000000000000000000000000000000000000000000000000000060648201526084016105a2565b6010810261520801808410156113415760405162461bcd60e51b815260206004820152603360248201527f496e73756666696369656e7420676173206c696d69742c206d7573742062652060448201527f61626f766520696e7472696e736963206761730000000000000000000000000060648201526084016105a2565b50505050565b6066545f61135a8883888a898989610715565b606680546001810182555f919091527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e943540181905560405190915073ffffffffffffffffffffffffffffffffffffffff80891691908a16907f69cfcb8e6d4192b8aba9902243912587f37e550d75c1fa801491fce26717f37e906113e6908a9087908b908b908b90611822565b60405180910390a35050505050505050565b5f54610100900460ff166114745760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105a2565b6109ab5f54610100900460ff166114f35760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105a2565b6109ab336111d5565b5f6020828403121561150c575f80fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610742575f80fd5b5f8060408385031215611547575f80fd5b61155083611513565b946020939093013593505050565b5f805f60608486031215611570575f80fd5b505081359360208301359350604090920135919050565b5f8083601f840112611597575f80fd5b50813567ffffffffffffffff8111156115ae575f80fd5b6020830191508360208285010111156115c5575f80fd5b9250929050565b5f805f805f805f60c0888a0312156115e2575f80fd5b6115eb88611513565b9650602088013595506040880135945061160760608901611513565b93506080880135925060a088013567ffffffffffffffff811115611629575f80fd5b6116358a828b01611587565b989b979a50959850939692959293505050565b5f60208284031215611658575f80fd5b6104d282611513565b5f805f8060608587031215611674575f80fd5b61167d85611513565b935060208501359250604085013567ffffffffffffffff81111561169f575f80fd5b6116ab87828801611587565b95989497509550505050565b5f805f805f8060a087890312156116cc575f80fd5b6116d587611513565b95506116e360208801611513565b94506040870135935060608701359250608087013567ffffffffffffffff81111561170c575f80fd5b61171889828a01611587565b979a9699509497509295939492505050565b5f806040838503121561173b575f80fd5b8235915061174b60208401611513565b90509250929050565b5f8060208385031215611765575f80fd5b823567ffffffffffffffff81111561177b575f80fd5b61178785828601611587565b90969095509350505050565b5f602082840312156117a3575f80fd5b815180151581146117b2575f80fd5b9392505050565b80820281158282048414176104d5577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b85815267ffffffffffffffff8516602082015283604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010194935050505056fea164736f6c6343000818000a +0x608060405234801561000f575f80fd5b5060043610610184575f3560e01c8063a85006ca116100dd578063d99bc80e11610088578063e3176bd511610063578063e3176bd51461037a578063f2fde38b14610383578063fd0ad31e14610396575f80fd5b8063d99bc80e1461033a578063da35a26f1461034d578063e172d3a114610360575f80fd5b8063bdc6f0a0116100b8578063bdc6f0a0146102ed578063c276067714610300578063d5ad4a9714610327575f80fd5b8063a85006ca146102b1578063ae453cd5146102ba578063bb7862ca146102cd575f80fd5b80635f9cd92e1161013d5780638da5cb5b116101185780638da5cb5b14610259578063927ede2d146102775780639b1597821461029e575f80fd5b80635f9cd92e146101f2578063715018a6146102055780638770d7071461020d575f80fd5b80633e4cbbe61161016d5780633e4cbbe6146101c35780635ad9945a146101d65780635e45da23146101e9575f80fd5b806329aa604b146101885780633c7f5283146101ae575b5f80fd5b61019b610196366004611173565b61039e565b6040519081526020015b60405180910390f35b6101c16101bc36600461118a565b6103bd565b005b61019b6101d13660046111cd565b61052e565b61019b6101e436600461123a565b6105e2565b61019b60685481565b6101c16102003660046112b6565b6107d2565b6101c1610867565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a5565b60335473ffffffffffffffffffffffffffffffffffffffff16610234565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b6101c16102ac3660046112cf565b61087a565b61019b60675481565b61019b6102c8366004611173565b61095c565b606b546102349073ffffffffffffffffffffffffffffffffffffffff1681565b6101c16102fb366004611325565b6109d2565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b6101c1610335366004611173565b610b03565b6101c1610348366004611173565b610b49565b6101c161035b366004611398565b610b8f565b61019b61036e3660046113c2565b60100261520801919050565b61019b60655481565b6101c16103913660046112b6565b610d48565b60665461019b565b606681815481106103ad575f80fd5b5f91825260209091200154905081565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146104475760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c792063616c6c61626c652062792074686520726f6c6c7570000000000060448201526064015b60405180910390fd5b6101008111156104995760405162461bcd60e51b815260206004820152601560248201527f706f7020746f6f206d616e79206d657373616765730000000000000000000000604482015260640161043e565b81606754146104ea5760405162461bcd60e51b815260206004820152601460248201527f737461727420696e646578206d69736d61746368000000000000000000000000604482015260640161043e565b80820160675560408051838152602081018390527f3d48b97f20730c965868963266b0d25d8abe3f06babb60fc3b2b80c9e8907f2691015b60405180910390a15050565b606b546040517fefc7840100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301525f92169063efc7840190602401602060405180830381865afa15801561059c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105c09190611401565b156105cc57505f6105dc565b6065546105d99083611427565b90505b92915050565b5f607e8161068c565b5f816105f957506001919050565b5b811561060f5760089190911c906001016105fa565b919050565b80608083106001811461064c5761062a846105eb565b60808101835360018301925084816020036008021b835280830192505061066d565b848415166001811461066057848353610665565b608083535b506001820191505b509392505050565b806094815360609290921b60018301525060150190565b6005604051018061069f60018c83610614565b90506106ad60018983610614565b90506106b98982610675565b90506106c760018b83610614565b9050600186146001811461072f576038871060018114610714576106ea886105eb565b8060b701845360018401935088816020036008021b84528084019350508789843791870191610729565b87608001835360018301925087898437918701915b50610740565b61073d5f89355f1a84610614565b91505b5061074b8c82610675565b90508181035f80603883106001811461077e57610767846105eb565b60f78101600882021b851793506001019150610789565b8360c0019250600191505b5086816008021b821791506001810190508060080292508451831c8284610100031b17915080850394505080845250508181038220925050508092505050979650505050505050565b6107da610de5565b606b5460405173ffffffffffffffffffffffffffffffffffffffff8084169216907ff91b2a410a89d46f14ee984a57e6d7892c217f116905371180998e20cef237e5905f90a3606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b61086f610de5565b6108785f610e4c565b565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146109255760405162461bcd60e51b815260206004820152602b60248201527f4f6e6c792063616c6c61626c6520627920746865204c3143726f7373446f6d6160448201527f696e4d657373656e676572000000000000000000000000000000000000000000606482015260840161043e565b610930838383610ec2565b337311110000000000000000000000000000000011110161095581865f878787610fbe565b5050505050565b6066545f9082106109af5760405162461bcd60e51b815260206004820152601a60248201527f6d65737361676520696e646578206f7574206f662072616e6765000000000000604482015260640161043e565b606682815481106109c2576109c2611463565b905f5260205f2001549050919050565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610a7d5760405162461bcd60e51b815260206004820152602660248201527f4f6e6c792063616c6c61626c652062792074686520456e666f7263656454784760448201527f6174657761790000000000000000000000000000000000000000000000000000606482015260840161043e565b73ffffffffffffffffffffffffffffffffffffffff86163b15610ae25760405162461bcd60e51b815260206004820152600860248201527f6f6e6c7920454f41000000000000000000000000000000000000000000000000604482015260640161043e565b610aed838383610ec2565b610afb868686868686610fbe565b505050505050565b610b0b610de5565b606880549082905560408051828152602081018490527fa030881e03ff723954dd0d35500564afab9603555d09d4456a32436f2b2373c59101610522565b610b51610de5565b606580549082905560408051828152602081018490527fc5271ba80b67178cc31f04a3755325121400925878dc608432b6fcaead3663299101610522565b5f54610100900460ff1615808015610bad57505f54600160ff909116105b80610bc65750303b158015610bc657505f5460ff166001145b610c385760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161043e565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610c94575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610c9c61106f565b6068839055606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790558015610d43575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610d50610de5565b73ffffffffffffffffffffffffffffffffffffffff8116610dd95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161043e565b610de281610e4c565b50565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108785760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161043e565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b606854831115610f3a5760405162461bcd60e51b815260206004820152602560248201527f476173206c696d6974206d757374206e6f7420657863656564206d617847617360448201527f4c696d6974000000000000000000000000000000000000000000000000000000606482015260840161043e565b601081026152080180841015610fb85760405162461bcd60e51b815260206004820152603360248201527f496e73756666696369656e7420676173206c696d69742c206d7573742062652060448201527f61626f766520696e7472696e7369632067617300000000000000000000000000606482015260840161043e565b50505050565b6066545f610fd18883888a8989896105e2565b606680546001810182555f919091527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e943540181905560405190915073ffffffffffffffffffffffffffffffffffffffff80891691908a16907f69cfcb8e6d4192b8aba9902243912587f37e550d75c1fa801491fce26717f37e9061105d908a9087908b908b908b90611490565b60405180910390a35050505050505050565b5f54610100900460ff166110eb5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161043e565b6108785f54610100900460ff1661116a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161043e565b61087833610e4c565b5f60208284031215611183575f80fd5b5035919050565b5f806040838503121561119b575f80fd5b50508035926020909101359150565b803573ffffffffffffffffffffffffffffffffffffffff8116811461060f575f80fd5b5f80604083850312156111de575f80fd5b6111e7836111aa565b946020939093013593505050565b5f8083601f840112611205575f80fd5b50813567ffffffffffffffff81111561121c575f80fd5b602083019150836020828501011115611233575f80fd5b9250929050565b5f805f805f805f60c0888a031215611250575f80fd5b611259886111aa565b96506020880135955060408801359450611275606089016111aa565b93506080880135925060a088013567ffffffffffffffff811115611297575f80fd5b6112a38a828b016111f5565b989b979a50959850939692959293505050565b5f602082840312156112c6575f80fd5b6105d9826111aa565b5f805f80606085870312156112e2575f80fd5b6112eb856111aa565b935060208501359250604085013567ffffffffffffffff81111561130d575f80fd5b611319878288016111f5565b95989497509550505050565b5f805f805f8060a0878903121561133a575f80fd5b611343876111aa565b9550611351602088016111aa565b94506040870135935060608701359250608087013567ffffffffffffffff81111561137a575f80fd5b61138689828a016111f5565b979a9699509497509295939492505050565b5f80604083850312156113a9575f80fd5b823591506113b9602084016111aa565b90509250929050565b5f80602083850312156113d3575f80fd5b823567ffffffffffffffff8111156113e9575f80fd5b6113f5858286016111f5565b90969095509350505050565b5f60208284031215611411575f80fd5b81518015158114611420575f80fd5b9392505050565b80820281158282048414176105dc577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b85815267ffffffffffffffff8516602082015283604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010194935050505056fea164736f6c6343000818000a diff --git a/bindings/bin/l1staking_deployed.hex b/bindings/bin/l1staking_deployed.hex index 401476f3..d2d93e24 100644 --- a/bindings/bin/l1staking_deployed.hex +++ b/bindings/bin/l1staking_deployed.hex @@ -1 +1 @@ -0x6080604052600436106102f8575f3560e01c80637a9262a211610191578063ab8c53dc116100dc578063d51c90a911610087578063e2a6ad5f11610062578063e2a6ad5f1461090c578063f2fde38b1461092b578063f4fe7fef1461094a575f80fd5b8063d51c90a91461087f578063dd4785f514610894578063df155033146108d5575f80fd5b8063c7cd469a116100b7578063c7cd469a14610822578063cde4cd1114610841578063d096c3c614610860575f80fd5b8063ab8c53dc146107cf578063ae81de53146107e4578063bfa02ba914610803575f80fd5b8063927ede2d1161013c5780639fb82db9116101175780639fb82db91461077d578063a3066aab14610791578063a4f209b0146107b0575f80fd5b8063927ede2d146106f05780639b19251a146107235780639d48f41714610751575f80fd5b80638a565ac31161016c5780638a565ac3146106865780638da5cb5b146106a55780639168ae72146106c2575f80fd5b80637a9262a2146106085780638142951a14610634578063831cfb5814610653575f80fd5b806341de239b11610251578063692c565b116101fc57806374fe27b7116101d757806374fe27b714610588578063797adbde146105ae5780637a4e87c3146105cd575f80fd5b8063692c565b146105265780636f1e853314610555578063715018a614610574575f80fd5b80634d64903a1161022c5780634d64903a146104dd57806352d472eb146104f25780636801579114610507575f80fd5b806341de239b1461048857806343352d611461049d57806345bc4d10146104be575f80fd5b8063320ff860116102b15780633cb747bf1161028c5780633cb747bf1461042e5780633ccfd60b146104605780633ee2a1f914610474575f80fd5b8063320ff860146103b257806335928991146103d15780633a9bbede146103f0575f80fd5b80632a28e5a3116102e15780632a28e5a31461033a5780632e407a6f1461034f578063303afb9e1461037b575f80fd5b80630d13fd7b146102fc5780632108db3514610325575b5f80fd5b348015610307575f80fd5b506103126101a65481565b6040519081526020015b60405180910390f35b348015610330575f80fd5b50610312609c5481565b61034d610348366004613407565b610969565b005b34801561035a575f80fd5b50610312610369366004613461565b6101a16020525f908152604090205481565b348015610386575f80fd5b5061039a610395366004613481565b610d64565b6040516001600160a01b03909116815260200161031c565b3480156103bd575f80fd5b5061034d6103cc366004613498565b610d83565b3480156103dc575f80fd5b5061034d6103eb366004613481565b61109e565b3480156103fb575f80fd5b5061041e61040a366004613461565b609f6020525f908152604090205460ff1681565b604051901515815260200161031c565b348015610439575f80fd5b507f000000000000000000000000000000000000000000000000000000000000000061039a565b34801561046b575f80fd5b5061034d61114b565b34801561047f575f80fd5b5061034d611317565b348015610493575f80fd5b5061031260995481565b3480156104a8575f80fd5b506104b1611329565b60405161031c9190613540565b3480156104c9575f80fd5b506103126104d8366004613481565b61136f565b3480156104e8575f80fd5b5061031260985481565b3480156104fd575f80fd5b50610312609a5481565b348015610512575f80fd5b5061041e610521366004613461565b611675565b348015610531575f80fd5b5061041e610540366004613481565b6101a46020525f908152604090205460ff1681565b348015610560575f80fd5b5061041e61056f366004613461565b611710565b34801561057f575f80fd5b5061034d611789565b348015610593575f80fd5b5061041e6105a23660046135c2565b60019695505050505050565b3480156105b9575f80fd5b5061039a6105c8366004613481565b61179a565b3480156105d8575f80fd5b5061041e6105e7366004613668565b80516020818301810180516101a38252928201919093012091525460ff1681565b348015610613575f80fd5b50610312610622366004613461565b6101a56020525f908152604090205481565b34801561063f575f80fd5b5061034d61064e3660046136a2565b6117c3565b34801561065e575f80fd5b5061039a7f000000000000000000000000000000000000000000000000000000000000000081565b348015610691575f80fd5b5061034d6106a0366004613481565b611c85565b3480156106b0575f80fd5b506033546001600160a01b031661039a565b3480156106cd575f80fd5b506106e16106dc366004613461565b611d28565b60405161031c9392919061373d565b3480156106fb575f80fd5b5061039a7f000000000000000000000000000000000000000000000000000000000000000081565b34801561072e575f80fd5b5061041e61073d366004613461565b609e6020525f908152604090205460ff1681565b34801561075c575f80fd5b5061077061076b366004613481565b611ddb565b60405161031c919061376d565b348015610788575f80fd5b50610770611ef8565b34801561079c575f80fd5b5061034d6107ab366004613461565b6120a6565b3480156107bb575f80fd5b5061034d6107ca366004613481565b6121d6565b3480156107da575f80fd5b50610312609d5481565b3480156107ef575f80fd5b5061034d6107fe366004613481565b612286565b34801561080e575f80fd5b5060975461039a906001600160a01b031681565b34801561082d575f80fd5b5061034d61083c3660046137b9565b612329565b34801561084c575f80fd5b5061034d61085b366004613461565b6124ca565b34801561086b575f80fd5b5061031261087a366004613461565b612538565b34801561088a575f80fd5b50610312609b5481565b34801561089f575f80fd5b506108c36108ae366004613461565b61019f6020525f908152604090205460ff1681565b60405160ff909116815260200161031c565b3480156108e0575f80fd5b5061041e6108ef366004613461565b6001600160a01b03165f9081526101a16020526040902054151590565b348015610917575f80fd5b50610312610926366004613820565b6125b2565b348015610936575f80fd5b5061034d610945366004613461565b6126e4565b348015610955575f80fd5b5061034d610964366004613481565b612771565b335f818152609e602052604090205460ff166109cc5760405162461bcd60e51b815260206004820152601060248201527f6e6f7420696e2077686974656c6973740000000000000000000000000000000060448201526064015b60405180910390fd5b335f9081526101a260205260409020546001600160a01b031615610a325760405162461bcd60e51b815260206004820152601260248201527f616c72656164792072656769737465726564000000000000000000000000000060448201526064016109c3565b8215801590610a5057505f8381526101a4602052604090205460ff16155b610a9c5760405162461bcd60e51b815260206004820152601960248201527f696e76616c69642074656e6465726d696e74207075626b65790000000000000060448201526064016109c3565b8151610100148015610acf57506101a382604051610aba919061385f565b9081526040519081900360200190205460ff16155b610b1b5760405162461bcd60e51b815260206004820152601260248201527f696e76616c696420626c73207075626b6579000000000000000000000000000060448201526064016109c3565b6098543414610b6c5760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964207374616b696e672076616c7565000000000000000000000060448201526064016109c3565b6040518060600160405280610b7e3390565b6001600160a01b03908116825260208083018790526040928301869052335f9081526101a28252839020845181547fffffffffffffffffffffffff00000000000000000000000000000000000000001693169290921782558301516001820155908201516002820190610bf1908261390f565b50905050610c04610bff3390565b612814565b60016101a383604051610c17919061385f565b90815260408051918290036020908101909220805493151560ff199485161790555f8681526101a49092529020805490911660011790557fb9c7babb56df9f2da4a30811a6c778e4e68af88b72712d56cf62c5516e20e199610c763390565b8484604051610c879392919061373d565b60405180910390a1335f9081526101a26020908152604091829020825160608101845281546001600160a01b03168152600182015492810192909252600281018054610d5f9484019190610cda9061387a565b80601f0160208091040260200160405190810160405280929190818152602001828054610d069061387a565b8015610d515780601f10610d2857610100808354040283529160200191610d51565b820191905f5260205f20905b815481529060010190602001808311610d3457829003601f168201915b505050505081525050612922565b505050565b60a08160ff8110610d73575f80fd5b01546001600160a01b0316905081565b610d8b612a4a565b5f5b815181101561105a57610db8828281518110610dab57610dab613a0d565b6020026020010151611675565b610e2a5760405162461bcd60e51b815260206004820152602160248201527f6f6e6c7920616374697665207374616b65722063616e2062652072656d6f766560448201527f640000000000000000000000000000000000000000000000000000000000000060648201526084016109c3565b6101a55f838381518110610e4057610e40613a0d565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20545f14610eb65760405162461bcd60e51b815260206004820152600b60248201527f7769746864726177696e6700000000000000000000000000000000000000000060448201526064016109c3565b609954610ec39043613a67565b6101a55f848481518110610ed957610ed9613a0d565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2081905550610f26828281518110610f1957610f19613a0d565b6020026020010151612aa4565b818181518110610f3857610f38613a0d565b60200260200101516001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d56101a55f858581518110610f8057610f80613a0d565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054604051610fb791815260200190565b60405180910390a2609e5f838381518110610fd457610fd4613a0d565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81549060ff02191690556001609f5f84848151811061102157611021613a0d565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101610d8d565b507f3f446646c03e618be8238a586960d6d625f35c653cdca1ef59609993e8ed2c848160405161108a919061376d565b60405180910390a161109b81612b96565b50565b6110a6612a4a565b5f811180156110b857506101a6548114155b6111045760405162461bcd60e51b815260206004820152601f60248201527f696e76616c6964206368616c6c656e6765206465706f7369742076616c75650060448201526064016109c3565b6101a680549082905560408051828152602081018490527f36f971a40478225aeb80cfbf5e80306e8cb76d3bf7d56fdc5e490945cddb7d5591015b60405180910390a15050565b61115433611675565b6111a05760405162461bcd60e51b815260206004820152601260248201527f6f6e6c7920616374697665207374616b6572000000000000000000000000000060448201526064016109c3565b335f9081526101a56020526040902054156111fd5760405162461bcd60e51b815260206004820152600b60248201527f7769746864726177696e6700000000000000000000000000000000000000000060448201526064016109c3565b60995461120a9043613a67565b335f8181526101a5602052604090209190915561122690612aa4565b335f8181526101a560209081526040918290205491519182527f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5910160405180910390a2335f908152609e60209081526040808320805460ff19908116909155609f83528184208054909116600190811790915581518181528083019092529091828101908036833701905050905033815f815181106112c8576112c8613a0d565b60200260200101906001600160a01b031690816001600160a01b0316815250507f3f446646c03e618be8238a586960d6d625f35c653cdca1ef59609993e8ed2c848160405161108a919061376d565b61131f612a4a565b611327612c8e565b565b6113316132d4565b60408051611fe08101918290529060a09060ff9082845b81546001600160a01b03168152600190910190602001808311611348575050505050905090565b6097545f906001600160a01b0316336001600160a01b0316146113d45760405162461bcd60e51b815260206004820152601460248201527f6f6e6c7920726f6c6c757020636f6e747261637400000000000000000000000060448201526064016109c3565b6113dc612f59565b5f6113e683611ddb565b90505f805b8251811015611598575f6101a55f85848151811061140b5761140b613a0d565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054111561148e576101a55f84838151811061144f5761144f613a0d565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f9055609854826114879190613a67565b9150611590565b6114c88382815181106114a3576114a3613a0d565b60200260200101516001600160a01b03165f9081526101a16020526040902054151590565b611590576098546114d99083613a67565b91506114f0838281518110610f1957610f19613a0d565b609e5f84838151811061150557611505613a0d565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81549060ff02191690556001609f5f85848151811061155257611552613a0d565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b6001016113eb565b505f6064609a54836115aa9190613a7a565b6115b49190613a91565b90506115c08183613ac9565b609d5f8282546115d09190613a67565b90915550506097546115eb906001600160a01b031682612fb2565b7f654f4a61849f1b3ad10abb283d27f02d5fece7b820acc5a3b874713b58748b5a8360405161161a919061376d565b60405180910390a17f3f446646c03e618be8238a586960d6d625f35c653cdca1ef59609993e8ed2c8483604051611651919061376d565b60405180910390a161166283612b96565b925050506116706001606555565b919050565b6001600160a01b0381165f90815261019f602052604081205460ff16810361169e57505f919050565b6001600160a01b0382165f81815261019f602052604090205460a0906116c99060019060ff16613adc565b60ff1660ff81106116dc576116dc613a0d565b01546001600160a01b031614801561170a57506001600160a01b0382165f9081526101a16020526040902054155b92915050565b6001600160a01b0381165f90815261019f602052604081205460ff16810361173957505f919050565b6001600160a01b0382165f81815261019f602052604090205460a0906117649060019060ff16613adc565b60ff1660ff811061177757611777613a0d565b01546001600160a01b03161492915050565b611791612a4a565b6113275f613062565b6101a081815481106117aa575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f54610100900460ff16158080156117e157505f54600160ff909116105b806117fa5750303b1580156117fa57505f5460ff166001145b61186c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016109c3565b5f805460ff1916600117905580156118aa575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b0388166119005760405162461bcd60e51b815260206004820152601760248201527f696e76616c696420726f6c6c757020636f6e747261637400000000000000000060448201526064016109c3565b5f871161194f5760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964207374616b696e672076616c7565000000000000000000000060448201526064016109c3565b5f861161199e5760405162461bcd60e51b815260206004820152601f60248201527f696e76616c6964206368616c6c656e6765206465706f7369742076616c75650060448201526064016109c3565b5f85116119ed5760405162461bcd60e51b815260206004820152601e60248201527f696e76616c6964207769746864726177616c206c6f636b20626c6f636b73000060448201526064016109c3565b5f8311611a3c5760405162461bcd60e51b815260206004820152601c60248201527f696e76616c696420676173206c696d697420616464207374616b65720000000060448201526064016109c3565b5f8211611a8b5760405162461bcd60e51b815260206004820181905260248201527f696e76616c696420676173206c696d69742072656d6f7665207374616b65727360448201526064016109c3565b5f84118015611a9b575060648411155b611b0c5760405162461bcd60e51b8152602060048201526024808201527f696e76616c6964206368616c6c656e676572207265776172642070657263656e60448201527f746167650000000000000000000000000000000000000000000000000000000060648201526084016109c3565b611b146130cb565b611b1c61314f565b609780547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038a16179055609a84905560988790556101a68690556099859055609b839055609c829055604080515f8152602081018590527f0ef80fb82bf5439b8591744c0fde771f5d93dce7a7970b1e9b7828cdc3970e9c910160405180910390a1604080515f8152602081018490527fdd4b37d1f14888147fe4be2cfaedcbf148fd07ececc856d0433241b8b6e4a7f7910160405180910390a1604080515f8152602081018690527fa46de936426e045703b2d34a292a19fde92b329018db8e0da750033876b655ba910160405180910390a18015611c7b575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b611c8d612a4a565b5f81118015611c9e5750609c548114155b611cea5760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964206e657720676173206c696d6974000000000000000000000060448201526064016109c3565b609c80549082905560408051828152602081018490527fdd4b37d1f14888147fe4be2cfaedcbf148fd07ececc856d0433241b8b6e4a7f7910161113f565b6101a26020525f90815260409020805460018201546002830180546001600160a01b03909316939192611d5a9061387a565b80601f0160208091040260200160405190810160405280929190818152602001828054611d869061387a565b8015611dd15780601f10611da857610100808354040283529160200191611dd1565b820191905f5260205f20905b815481529060010190602001808311611db457829003601f168201915b5050505050905083565b6060600182901c5f5b8115611e0b57611df5816001613a67565b9050611e02600183613ac9565b82169150611de4565b8067ffffffffffffffff811115611e2457611e2461333d565b604051908082528060200260200182016040528015611e4d578160200160208202803683370190505b5092505f60015b60ff8160ff1611611eef57600160ff82161b861615611edd5760a0611e7a600183613adc565b60ff1660ff8110611e8d57611e8d613a0d565b015485516001600160a01b0390911690869084908110611eaf57611eaf613a0d565b6001600160a01b0390921660209283029190910190910152611ed2826001613a67565b915082821015611eef575b80611ee781613af5565b915050611e54565b50505050919050565b6040805160ff80825261200082019092526060915f91829160208201611fe0803683370190505090505f5b60ff811015611fc7575f60a08260ff8110611f4057611f40613a0d565b01546001600160a01b031614801590611f8857506101a15f60a08360ff8110611f6b57611f6b613a0d565b01546001600160a01b0316815260208101919091526040015f2054155b15611fbf5782611f9781613b13565b9350506001828281518110611fae57611fae613a0d565b911515602092830291909101909101525b600101611f23565b505f8267ffffffffffffffff811115611fe257611fe261333d565b60405190808252806020026020018201604052801561200b578160200160208202803683370190505b5090505f805b60ff81101561209c5783818151811061202c5761202c613a0d565b6020026020010151156120945760a08160ff811061204c5761204c613a0d565b015483516001600160a01b039091169084908490811061206e5761206e613a0d565b6001600160a01b03909216602092830291909101909101528161209081613b13565b9250505b600101612011565b5090949350505050565b6120ae612f59565b335f9081526101a5602052604090205461210a5760405162461bcd60e51b815260206004820152601460248201527f7769746864726177616c206e6f7420657869737400000000000000000000000060448201526064016109c3565b335f9081526101a560205260409020544310156121695760405162461bcd60e51b815260206004820152601160248201527f7769746864726177616c206c6f636b656400000000000000000000000000000060448201526064016109c3565b335f9081526101a56020526040812055612181612c8e565b604080516001600160a01b0383168152905133917f89309c9b2aeaffbdce717113df9427298b20448c05919bf889e05f8c3094254b919081900360200190a26121cc81609854612fb2565b61109b6001606555565b6121de612a4a565b5f811180156121ee575060648111155b80156121fc5750609a548114155b6122485760405162461bcd60e51b815260206004820152601960248201527f696e76616c6964207265776172642070657263656e746167650000000000000060448201526064016109c3565b609a80549082905560408051828152602081018490527fa46de936426e045703b2d34a292a19fde92b329018db8e0da750033876b655ba910161113f565b61228e612a4a565b5f8111801561229f5750609b548114155b6122eb5760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964206e657720676173206c696d6974000000000000000000000060448201526064016109c3565b609b80549082905560408051828152602081018490527f0ef80fb82bf5439b8591744c0fde771f5d93dce7a7970b1e9b7828cdc3970e9c910161113f565b612331612a4a565b5f5b8381101561242957609f5f86868481811061235057612350613a0d565b90506020020160208101906123659190613461565b6001600160a01b0316815260208101919091526040015f205460ff16156123ce5760405162461bcd60e51b815260206004820152600f60248201527f696e2072656d6f766564206c697374000000000000000000000000000000000060448201526064016109c3565b6001609e5f8787858181106123e5576123e5613a0d565b90506020020160208101906123fa9190613461565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055600101612333565b505f5b8181101561248657609e5f84848481811061244957612449613a0d565b905060200201602081019061245e9190613461565b6001600160a01b0316815260208101919091526040015f20805460ff1916905560010161242c565b507fe375867e538b40218c1b3db2ccceaf875eb073e38b510449e6088c1539ac8622848484846040516124bc9493929190613b8f565b60405180910390a150505050565b6124d2612a4a565b6124da612f59565b609d546124e78282612fb2565b5f609d55604080516001600160a01b0384168152602081018390527fa1fefb6c5328a92a416e321ed50997303fe7135fd88c28b0592b21ce42b5cdd9910160405180910390a15061109b6001606555565b5f61254282611710565b61258e5760405162461bcd60e51b815260206004820152600e60248201527f696e76616c6964207374616b657200000000000000000000000000000000000060448201526064016109c3565b506001600160a01b03165f90815261019f6020526040902054600160ff9091161b90565b5f60ff8211156126045760405162461bcd60e51b815260206004820152601c60248201527f7374616b657273206c656e677468206f7574206f6620626f756e64730000000060448201526064016109c3565b5f5b828110156126dd5761263884848381811061262357612623613a0d565b905060200201602081019061056f9190613461565b6126845760405162461bcd60e51b815260206004820152600e60248201527f696e76616c6964207374616b657200000000000000000000000000000000000060448201526064016109c3565b61019f5f85858481811061269a5761269a613a0d565b90506020020160208101906126af9190613461565b6001600160a01b0316815260208101919091526040015f2054600160ff90911681901b929092179101612606565b5092915050565b6126ec612a4a565b6001600160a01b0381166127685760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109c3565b61109b81613062565b612779612a4a565b5f8111801561278a57506098548114155b6127d65760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964207374616b696e672076616c7565000000000000000000000060448201526064016109c3565b609880549082905560408051828152602081018490527f91e3ed304d49776a78bbe0df6bf7156f5433763621e5e728a3c2adfe7de74368910161113f565b5f5b60ff8160ff1610156128d9575f60a060ff80841690811061283957612839613a0d565b01546001600160a01b0316036128d1578160a08260ff1660ff811061286057612860613a0d565b0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790556128a2816001613bc0565b6001600160a01b03929092165f90815261019f60205260409020805460ff191660ff9093169290921790915550565b600101612816565b5060405162461bcd60e51b815260206004820152600960248201527f736c6f742066756c6c000000000000000000000000000000000000000000000060448201526064016109c3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b2267a7b7f00000000000000000000000000000000000000000000000000000000000000005f846040516024016129849190613bd9565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f6d454d5100000000000000000000000000000000000000000000000000000000179052609b5490517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b168152612a1a9493929190600401613c10565b5f604051808303815f87803b158015612a31575f80fd5b505af1158015612a43573d5f803e3d5ffd5b5050505050565b6033546001600160a01b031633146113275760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c3565b6001600160a01b0381165f9081526101a1602052604090205415612b0a5760405162461bcd60e51b815260206004820152601560248201527f616c726561647920696e2064656c6574654c697374000000000000000000000060448201526064016109c3565b6101a080546001810182555f919091527f7980fe0f714a613298681d64b7b8ffa7b148338dd52429f307d72798d5c317c40180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038316179055609954612b7a9043613a67565b6001600160a01b039091165f9081526101a16020526040902055565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b2267a7b7f00000000000000000000000000000000000000000000000000000000000000005f84604051602401612bf8919061376d565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0be67fcc00000000000000000000000000000000000000000000000000000000179052609c5490517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b168152612a1a9493929190600401613c10565b5f5b6101a05481101561109b57436101a15f6101a08481548110612cb457612cb4613a0d565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205411612f475760a0600161019f5f6101a08581548110612cf957612cf9613a0d565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054612d2a919060ff16613adc565b60ff1660ff8110612d3d57612d3d613a0d565b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556101a0805461019f915f9184908110612d7f57612d7f613a0d565b5f9182526020808320909101546001600160a01b031683528201929092526040018120805460ff191690556101a080546101a292919084908110612dc557612dc5613a0d565b5f9182526020808320909101546001600160a01b03168352820192909252604001812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001681556001810182905590612e2360028301826132f3565b50506101a15f6101a08381548110612e3d57612e3d613a0d565b5f9182526020808320909101546001600160a01b031683528201929092526040018120556101a08054612e7290600190613ac9565b81548110612e8257612e82613a0d565b5f918252602090912001546101a080546001600160a01b039092169183908110612eae57612eae613a0d565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506101a0805480612eeb57612eeb613c48565b5f8281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055612c90565b80612f5181613b13565b915050612c90565b600260655403612fab5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109c3565b6002606555565b8015613057575f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613001576040519150601f19603f3d011682016040523d82523d5f602084013e613006565b606091505b5050905080610d5f5760405162461bcd60e51b815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c6564000000000060448201526064016109c3565b5050565b6001606555565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff166131475760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109c3565b6113276131d3565b5f54610100900460ff166131cb5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109c3565b611327613258565b5f54610100900460ff1661324f5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109c3565b61132733613062565b5f54610100900460ff1661305b5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109c3565b60405180611fe0016040528060ff906020820280368337509192915050565b5080546132ff9061387a565b5f825580601f1061330e575050565b601f0160209004905f5260205f209081019061109b91905b80821115613339575f8155600101613326565b5090565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156133935761339361333d565b604052919050565b5f82601f8301126133aa575f80fd5b813567ffffffffffffffff8111156133c4576133c461333d565b6133d76020601f19601f8401160161336a565b8181528460208386010111156133eb575f80fd5b816020850160208301375f918101602001919091529392505050565b5f8060408385031215613418575f80fd5b82359150602083013567ffffffffffffffff811115613435575f80fd5b6134418582860161339b565b9150509250929050565b80356001600160a01b0381168114611670575f80fd5b5f60208284031215613471575f80fd5b61347a8261344b565b9392505050565b5f60208284031215613491575f80fd5b5035919050565b5f60208083850312156134a9575f80fd5b823567ffffffffffffffff808211156134c0575f80fd5b818501915085601f8301126134d3575f80fd5b8135818111156134e5576134e561333d565b8060051b91506134f684830161336a565b818152918301840191848101908884111561350f575f80fd5b938501935b83851015613534576135258561344b565b82529385019390850190613514565b98975050505050505050565b611fe0810181835f5b60ff8110156135715781516001600160a01b0316835260209283019290910190600101613549565b50505092915050565b5f8083601f84011261358a575f80fd5b50813567ffffffffffffffff8111156135a1575f80fd5b6020830191508360208260051b85010111156135bb575f80fd5b9250929050565b5f805f805f80608087890312156135d7575f80fd5b86359550602087013567ffffffffffffffff808211156135f5575f80fd5b6136018a838b0161357a565b9097509550604089013594506060890135915080821115613620575f80fd5b818901915089601f830112613633575f80fd5b813581811115613641575f80fd5b8a6020828501011115613652575f80fd5b6020830194508093505050509295509295509295565b5f60208284031215613678575f80fd5b813567ffffffffffffffff81111561368e575f80fd5b61369a8482850161339b565b949350505050565b5f805f805f805f60e0888a0312156136b8575f80fd5b6136c18861344b565b9960208901359950604089013598606081013598506080810135975060a0810135965060c00135945092505050565b5f5b8381101561370a5781810151838201526020016136f2565b50505f910152565b5f81518084526137298160208601602086016136f0565b601f01601f19169290920160200192915050565b6001600160a01b0384168152826020820152606060408201525f6137646060830184613712565b95945050505050565b602080825282518282018190525f9190848201906040850190845b818110156137ad5783516001600160a01b031683529284019291840191600101613788565b50909695505050505050565b5f805f80604085870312156137cc575f80fd5b843567ffffffffffffffff808211156137e3575f80fd5b6137ef8883890161357a565b90965094506020870135915080821115613807575f80fd5b506138148782880161357a565b95989497509550505050565b5f8060208385031215613831575f80fd5b823567ffffffffffffffff811115613847575f80fd5b6138538582860161357a565b90969095509350505050565b5f82516138708184602087016136f0565b9190910192915050565b600181811c9082168061388e57607f821691505b6020821081036138c5577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f821115610d5f57805f5260205f20601f840160051c810160208510156138f05750805b601f840160051c820191505b81811015612a43575f81556001016138fc565b815167ffffffffffffffff8111156139295761392961333d565b61393d81613937845461387a565b846138cb565b602080601f83116001811461398f575f84156139595750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613a05565b5f85815260208120601f198616915b828110156139bd5788860151825594840194600190910190840161399e565b50858210156139f957878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b505060018460011b0185555b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561170a5761170a613a3a565b808202811582820484141761170a5761170a613a3a565b5f82613ac4577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b8181038181111561170a5761170a613a3a565b60ff828116828216039081111561170a5761170a613a3a565b5f60ff821660ff8103613b0a57613b0a613a3a565b60010192915050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b4357613b43613a3a565b5060010190565b8183525f60208085019450825f5b85811015613b84576001600160a01b03613b718361344b565b1687529582019590820190600101613b58565b509495945050505050565b604081525f613ba2604083018688613b4a565b8281036020840152613bb5818587613b4a565b979650505050505050565b60ff818116838216019081111561170a5761170a613a3a565b602081526001600160a01b038251166020820152602082015160408201525f604083015160608084015261369a6080840182613712565b6001600160a01b0385168152836020820152608060408201525f613c376080830185613712565b905082606083015295945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea164736f6c6343000818000a +0x608060405260043610610303575f3560e01c80638142951a11610191578063ae81de53116100dc578063d51c90a911610087578063e2a6ad5f11610062578063e2a6ad5f1461092d578063f2fde38b1461094c578063f4fe7fef1461096b575f80fd5b8063d51c90a9146108a0578063dd4785f5146108b5578063df155033146108f6575f80fd5b8063c7cd469a116100b7578063c7cd469a14610843578063cde4cd1114610862578063d096c3c614610881575f80fd5b8063ae81de53146107ef578063affed0e01461080e578063bfa02ba914610824575f80fd5b80639b19251a1161013c578063a3066aab11610117578063a3066aab1461079c578063a4f209b0146107bb578063ab8c53dc146107da575f80fd5b80639b19251a1461072e5780639d48f4171461075c5780639fb82db914610788575f80fd5b80638da5cb5b1161016c5780638da5cb5b146106b05780639168ae72146106cd578063927ede2d146106fb575f80fd5b80638142951a1461063f578063831cfb581461065e5780638a565ac314610691575f80fd5b806343352d61116102515780636f1e8533116101fc578063797adbde116101d7578063797adbde146105b95780637a4e87c3146105d85780637a9262a214610613575f80fd5b80636f1e853314610560578063715018a61461057f57806374fe27b714610593575f80fd5b806352d472eb1161022c57806352d472eb146104fd5780636801579114610512578063692c565b14610531575f80fd5b806343352d61146104a857806345bc4d10146104c95780634d64903a146104e8575f80fd5b806335928991116102b15780633ccfd60b1161028c5780633ccfd60b1461046b5780633ee2a1f91461047f57806341de239b14610493575f80fd5b806335928991146103dc5780633a9bbede146103fb5780633cb747bf14610439575f80fd5b80632e407a6f116102e15780632e407a6f1461035a578063303afb9e14610386578063320ff860146103bd575f80fd5b80630d13fd7b146103075780632108db35146103305780632a28e5a314610345575b5f80fd5b348015610312575f80fd5b5061031d6101a65481565b6040519081526020015b60405180910390f35b34801561033b575f80fd5b5061031d609c5481565b6103586103533660046134c8565b61098a565b005b348015610365575f80fd5b5061031d610374366004613522565b6101a16020525f908152604090205481565b348015610391575f80fd5b506103a56103a0366004613542565b610d85565b6040516001600160a01b039091168152602001610327565b3480156103c8575f80fd5b506103586103d7366004613559565b610da4565b3480156103e7575f80fd5b506103586103f6366004613542565b6110bf565b348015610406575f80fd5b50610429610415366004613522565b609f6020525f908152604090205460ff1681565b6040519015158152602001610327565b348015610444575f80fd5b507f00000000000000000000000000000000000000000000000000000000000000006103a5565b348015610476575f80fd5b5061035861116c565b34801561048a575f80fd5b50610358611338565b34801561049e575f80fd5b5061031d60995481565b3480156104b3575f80fd5b506104bc61134a565b6040516103279190613601565b3480156104d4575f80fd5b5061031d6104e3366004613542565b611390565b3480156104f3575f80fd5b5061031d60985481565b348015610508575f80fd5b5061031d609a5481565b34801561051d575f80fd5b5061042961052c366004613522565b6116c9565b34801561053c575f80fd5b5061042961054b366004613542565b6101a46020525f908152604090205460ff1681565b34801561056b575f80fd5b5061042961057a366004613522565b611764565b34801561058a575f80fd5b506103586117dd565b34801561059e575f80fd5b506104296105ad366004613683565b60019695505050505050565b3480156105c4575f80fd5b506103a56105d3366004613542565b6117ee565b3480156105e3575f80fd5b506104296105f2366004613729565b80516020818301810180516101a38252928201919093012091525460ff1681565b34801561061e575f80fd5b5061031d61062d366004613522565b6101a56020525f908152604090205481565b34801561064a575f80fd5b50610358610659366004613763565b611817565b348015610669575f80fd5b506103a57f000000000000000000000000000000000000000000000000000000000000000081565b34801561069c575f80fd5b506103586106ab366004613542565b611cd9565b3480156106bb575f80fd5b506033546001600160a01b03166103a5565b3480156106d8575f80fd5b506106ec6106e7366004613522565b611d7c565b604051610327939291906137fe565b348015610706575f80fd5b506103a57f000000000000000000000000000000000000000000000000000000000000000081565b348015610739575f80fd5b50610429610748366004613522565b609e6020525f908152604090205460ff1681565b348015610767575f80fd5b5061077b610776366004613542565b611e2f565b6040516103279190613871565b348015610793575f80fd5b5061077b611f4c565b3480156107a7575f80fd5b506103586107b6366004613522565b6120fa565b3480156107c6575f80fd5b506103586107d5366004613542565b61222a565b3480156107e5575f80fd5b5061031d609d5481565b3480156107fa575f80fd5b50610358610809366004613542565b6122da565b348015610819575f80fd5b5061031d6101a75481565b34801561082f575f80fd5b506097546103a5906001600160a01b031681565b34801561084e575f80fd5b5061035861085d366004613883565b61237d565b34801561086d575f80fd5b5061035861087c366004613522565b61251e565b34801561088c575f80fd5b5061031d61089b366004613522565b61258c565b3480156108ab575f80fd5b5061031d609b5481565b3480156108c0575f80fd5b506108e46108cf366004613522565b61019f6020525f908152604090205460ff1681565b60405160ff9091168152602001610327565b348015610901575f80fd5b50610429610910366004613522565b6001600160a01b03165f9081526101a16020526040902054151590565b348015610938575f80fd5b5061031d6109473660046138ea565b612606565b348015610957575f80fd5b50610358610966366004613522565b612738565b348015610976575f80fd5b50610358610985366004613542565b6127c5565b335f818152609e602052604090205460ff166109ed5760405162461bcd60e51b815260206004820152601060248201527f6e6f7420696e2077686974656c6973740000000000000000000000000000000060448201526064015b60405180910390fd5b335f9081526101a260205260409020546001600160a01b031615610a535760405162461bcd60e51b815260206004820152601260248201527f616c72656164792072656769737465726564000000000000000000000000000060448201526064016109e4565b8215801590610a7157505f8381526101a4602052604090205460ff16155b610abd5760405162461bcd60e51b815260206004820152601960248201527f696e76616c69642074656e6465726d696e74207075626b65790000000000000060448201526064016109e4565b8151610100148015610af057506101a382604051610adb9190613929565b9081526040519081900360200190205460ff16155b610b3c5760405162461bcd60e51b815260206004820152601260248201527f696e76616c696420626c73207075626b6579000000000000000000000000000060448201526064016109e4565b6098543414610b8d5760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964207374616b696e672076616c7565000000000000000000000060448201526064016109e4565b6040518060600160405280610b9f3390565b6001600160a01b03908116825260208083018790526040928301869052335f9081526101a28252839020845181547fffffffffffffffffffffffff00000000000000000000000000000000000000001693169290921782558301516001820155908201516002820190610c1290826139e0565b50905050610c25610c203390565b612868565b60016101a383604051610c389190613929565b90815260408051918290036020908101909220805493151560ff199485161790555f8681526101a49092529020805490911660011790557fb9c7babb56df9f2da4a30811a6c778e4e68af88b72712d56cf62c5516e20e199610c973390565b8484604051610ca8939291906137fe565b60405180910390a1335f9081526101a26020908152604091829020825160608101845281546001600160a01b03168152600182015492810192909252600281018054610d809484019190610cfb90613944565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2790613944565b8015610d725780601f10610d4957610100808354040283529160200191610d72565b820191905f5260205f20905b815481529060010190602001808311610d5557829003601f168201915b505050505081525050612976565b505050565b60a08160ff8110610d94575f80fd5b01546001600160a01b0316905081565b610dac612ab7565b5f5b815181101561107b57610dd9828281518110610dcc57610dcc613ade565b60200260200101516116c9565b610e4b5760405162461bcd60e51b815260206004820152602160248201527f6f6e6c7920616374697665207374616b65722063616e2062652072656d6f766560448201527f640000000000000000000000000000000000000000000000000000000000000060648201526084016109e4565b6101a55f838381518110610e6157610e61613ade565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20545f14610ed75760405162461bcd60e51b815260206004820152600b60248201527f7769746864726177696e6700000000000000000000000000000000000000000060448201526064016109e4565b609954610ee49043613b38565b6101a55f848481518110610efa57610efa613ade565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2081905550610f47828281518110610f3a57610f3a613ade565b6020026020010151612b11565b818181518110610f5957610f59613ade565b60200260200101516001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d56101a55f858581518110610fa157610fa1613ade565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054604051610fd891815260200190565b60405180910390a2609e5f838381518110610ff557610ff5613ade565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81549060ff02191690556001609f5f84848151811061104257611042613ade565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101610dae565b507f3f446646c03e618be8238a586960d6d625f35c653cdca1ef59609993e8ed2c84816040516110ab9190613871565b60405180910390a16110bc81612c03565b50565b6110c7612ab7565b5f811180156110d957506101a6548114155b6111255760405162461bcd60e51b815260206004820152601f60248201527f696e76616c6964206368616c6c656e6765206465706f7369742076616c75650060448201526064016109e4565b6101a680549082905560408051828152602081018490527f36f971a40478225aeb80cfbf5e80306e8cb76d3bf7d56fdc5e490945cddb7d5591015b60405180910390a15050565b611175336116c9565b6111c15760405162461bcd60e51b815260206004820152601260248201527f6f6e6c7920616374697665207374616b6572000000000000000000000000000060448201526064016109e4565b335f9081526101a560205260409020541561121e5760405162461bcd60e51b815260206004820152600b60248201527f7769746864726177696e6700000000000000000000000000000000000000000060448201526064016109e4565b60995461122b9043613b38565b335f8181526101a5602052604090209190915561124790612b11565b335f8181526101a560209081526040918290205491519182527f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5910160405180910390a2335f908152609e60209081526040808320805460ff19908116909155609f83528184208054909116600190811790915581518181528083019092529091828101908036833701905050905033815f815181106112e9576112e9613ade565b60200260200101906001600160a01b031690816001600160a01b0316815250507f3f446646c03e618be8238a586960d6d625f35c653cdca1ef59609993e8ed2c84816040516110ab9190613871565b611340612ab7565b611348612d00565b565b611352613395565b60408051611fe08101918290529060a09060ff9082845b81546001600160a01b03168152600190910190602001808311611369575050505050905090565b6097545f906001600160a01b0316336001600160a01b0316146113f55760405162461bcd60e51b815260206004820152601460248201527f6f6e6c7920726f6c6c757020636f6e747261637400000000000000000000000060448201526064016109e4565b6113fd61301a565b5f61140783611e2f565b90505f805b82518110156115ec575f6001600160a01b031683828151811061143157611431613ade565b60200260200101516001600160a01b031603156115e4575f6101a55f85848151811061145f5761145f613ade565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205411156114e2576101a55f8483815181106114a3576114a3613ade565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f9055609854826114db9190613b38565b91506115e4565b61151c8382815181106114f7576114f7613ade565b60200260200101516001600160a01b03165f9081526101a16020526040902054151590565b6115e45760985461152d9083613b38565b9150611544838281518110610f3a57610f3a613ade565b609e5f84838151811061155957611559613ade565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81549060ff02191690556001609f5f8584815181106115a6576115a6613ade565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b60010161140c565b505f6064609a54836115fe9190613b4b565b6116089190613b62565b90506116148183613b9a565b609d5f8282546116249190613b38565b909155505060975461163f906001600160a01b031682613073565b7f654f4a61849f1b3ad10abb283d27f02d5fece7b820acc5a3b874713b58748b5a8360405161166e9190613871565b60405180910390a17f3f446646c03e618be8238a586960d6d625f35c653cdca1ef59609993e8ed2c84836040516116a59190613871565b60405180910390a16116b683612c03565b925050506116c46001606555565b919050565b6001600160a01b0381165f90815261019f602052604081205460ff1681036116f257505f919050565b6001600160a01b0382165f81815261019f602052604090205460a09061171d9060019060ff16613bad565b60ff1660ff811061173057611730613ade565b01546001600160a01b031614801561175e57506001600160a01b0382165f9081526101a16020526040902054155b92915050565b6001600160a01b0381165f90815261019f602052604081205460ff16810361178d57505f919050565b6001600160a01b0382165f81815261019f602052604090205460a0906117b89060019060ff16613bad565b60ff1660ff81106117cb576117cb613ade565b01546001600160a01b03161492915050565b6117e5612ab7565b6113485f613123565b6101a081815481106117fe575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f54610100900460ff161580801561183557505f54600160ff909116105b8061184e5750303b15801561184e57505f5460ff166001145b6118c05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016109e4565b5f805460ff1916600117905580156118fe575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b0388166119545760405162461bcd60e51b815260206004820152601760248201527f696e76616c696420726f6c6c757020636f6e747261637400000000000000000060448201526064016109e4565b5f87116119a35760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964207374616b696e672076616c7565000000000000000000000060448201526064016109e4565b5f86116119f25760405162461bcd60e51b815260206004820152601f60248201527f696e76616c6964206368616c6c656e6765206465706f7369742076616c75650060448201526064016109e4565b5f8511611a415760405162461bcd60e51b815260206004820152601e60248201527f696e76616c6964207769746864726177616c206c6f636b20626c6f636b73000060448201526064016109e4565b5f8311611a905760405162461bcd60e51b815260206004820152601c60248201527f696e76616c696420676173206c696d697420616464207374616b65720000000060448201526064016109e4565b5f8211611adf5760405162461bcd60e51b815260206004820181905260248201527f696e76616c696420676173206c696d69742072656d6f7665207374616b65727360448201526064016109e4565b5f84118015611aef575060648411155b611b605760405162461bcd60e51b8152602060048201526024808201527f696e76616c6964206368616c6c656e676572207265776172642070657263656e60448201527f746167650000000000000000000000000000000000000000000000000000000060648201526084016109e4565b611b6861318c565b611b70613210565b609780547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038a16179055609a84905560988790556101a68690556099859055609b839055609c829055604080515f8152602081018590527f0ef80fb82bf5439b8591744c0fde771f5d93dce7a7970b1e9b7828cdc3970e9c910160405180910390a1604080515f8152602081018490527fdd4b37d1f14888147fe4be2cfaedcbf148fd07ececc856d0433241b8b6e4a7f7910160405180910390a1604080515f8152602081018690527fa46de936426e045703b2d34a292a19fde92b329018db8e0da750033876b655ba910160405180910390a18015611ccf575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b611ce1612ab7565b5f81118015611cf25750609c548114155b611d3e5760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964206e657720676173206c696d6974000000000000000000000060448201526064016109e4565b609c80549082905560408051828152602081018490527fdd4b37d1f14888147fe4be2cfaedcbf148fd07ececc856d0433241b8b6e4a7f79101611160565b6101a26020525f90815260409020805460018201546002830180546001600160a01b03909316939192611dae90613944565b80601f0160208091040260200160405190810160405280929190818152602001828054611dda90613944565b8015611e255780601f10611dfc57610100808354040283529160200191611e25565b820191905f5260205f20905b815481529060010190602001808311611e0857829003601f168201915b5050505050905083565b6060600182901c5f5b8115611e5f57611e49816001613b38565b9050611e56600183613b9a565b82169150611e38565b8067ffffffffffffffff811115611e7857611e786133fe565b604051908082528060200260200182016040528015611ea1578160200160208202803683370190505b5092505f60015b60ff8160ff1611611f4357600160ff82161b861615611f315760a0611ece600183613bad565b60ff1660ff8110611ee157611ee1613ade565b015485516001600160a01b0390911690869084908110611f0357611f03613ade565b6001600160a01b0390921660209283029190910190910152611f26826001613b38565b915082821015611f43575b80611f3b81613bc6565b915050611ea8565b50505050919050565b6040805160ff80825261200082019092526060915f91829160208201611fe0803683370190505090505f5b60ff81101561201b575f60a08260ff8110611f9457611f94613ade565b01546001600160a01b031614801590611fdc57506101a15f60a08360ff8110611fbf57611fbf613ade565b01546001600160a01b0316815260208101919091526040015f2054155b156120135782611feb81613be4565b935050600182828151811061200257612002613ade565b911515602092830291909101909101525b600101611f77565b505f8267ffffffffffffffff811115612036576120366133fe565b60405190808252806020026020018201604052801561205f578160200160208202803683370190505b5090505f805b60ff8110156120f05783818151811061208057612080613ade565b6020026020010151156120e85760a08160ff81106120a0576120a0613ade565b015483516001600160a01b03909116908490849081106120c2576120c2613ade565b6001600160a01b0390921660209283029190910190910152816120e481613be4565b9250505b600101612065565b5090949350505050565b61210261301a565b335f9081526101a5602052604090205461215e5760405162461bcd60e51b815260206004820152601460248201527f7769746864726177616c206e6f7420657869737400000000000000000000000060448201526064016109e4565b335f9081526101a560205260409020544310156121bd5760405162461bcd60e51b815260206004820152601160248201527f7769746864726177616c206c6f636b656400000000000000000000000000000060448201526064016109e4565b335f9081526101a560205260408120556121d5612d00565b604080516001600160a01b0383168152905133917f89309c9b2aeaffbdce717113df9427298b20448c05919bf889e05f8c3094254b919081900360200190a261222081609854613073565b6110bc6001606555565b612232612ab7565b5f81118015612242575060648111155b80156122505750609a548114155b61229c5760405162461bcd60e51b815260206004820152601960248201527f696e76616c6964207265776172642070657263656e746167650000000000000060448201526064016109e4565b609a80549082905560408051828152602081018490527fa46de936426e045703b2d34a292a19fde92b329018db8e0da750033876b655ba9101611160565b6122e2612ab7565b5f811180156122f35750609b548114155b61233f5760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964206e657720676173206c696d6974000000000000000000000060448201526064016109e4565b609b80549082905560408051828152602081018490527f0ef80fb82bf5439b8591744c0fde771f5d93dce7a7970b1e9b7828cdc3970e9c9101611160565b612385612ab7565b5f5b8381101561247d57609f5f8686848181106123a4576123a4613ade565b90506020020160208101906123b99190613522565b6001600160a01b0316815260208101919091526040015f205460ff16156124225760405162461bcd60e51b815260206004820152600f60248201527f696e2072656d6f766564206c697374000000000000000000000000000000000060448201526064016109e4565b6001609e5f87878581811061243957612439613ade565b905060200201602081019061244e9190613522565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055600101612387565b505f5b818110156124da57609e5f84848481811061249d5761249d613ade565b90506020020160208101906124b29190613522565b6001600160a01b0316815260208101919091526040015f20805460ff19169055600101612480565b507fe375867e538b40218c1b3db2ccceaf875eb073e38b510449e6088c1539ac8622848484846040516125109493929190613c55565b60405180910390a150505050565b612526612ab7565b61252e61301a565b609d5461253b8282613073565b5f609d55604080516001600160a01b0384168152602081018390527fa1fefb6c5328a92a416e321ed50997303fe7135fd88c28b0592b21ce42b5cdd9910160405180910390a1506110bc6001606555565b5f61259682611764565b6125e25760405162461bcd60e51b815260206004820152600e60248201527f696e76616c6964207374616b657200000000000000000000000000000000000060448201526064016109e4565b506001600160a01b03165f90815261019f6020526040902054600160ff9091161b90565b5f60ff8211156126585760405162461bcd60e51b815260206004820152601c60248201527f7374616b657273206c656e677468206f7574206f6620626f756e64730000000060448201526064016109e4565b5f5b828110156127315761268c84848381811061267757612677613ade565b905060200201602081019061057a9190613522565b6126d85760405162461bcd60e51b815260206004820152600e60248201527f696e76616c6964207374616b657200000000000000000000000000000000000060448201526064016109e4565b61019f5f8585848181106126ee576126ee613ade565b90506020020160208101906127039190613522565b6001600160a01b0316815260208101919091526040015f2054600160ff90911681901b92909217910161265a565b5092915050565b612740612ab7565b6001600160a01b0381166127bc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109e4565b6110bc81613123565b6127cd612ab7565b5f811180156127de57506098548114155b61282a5760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964207374616b696e672076616c7565000000000000000000000060448201526064016109e4565b609880549082905560408051828152602081018490527f91e3ed304d49776a78bbe0df6bf7156f5433763621e5e728a3c2adfe7de743689101611160565b5f5b60ff8160ff16101561292d575f60a060ff80841690811061288d5761288d613ade565b01546001600160a01b031603612925578160a08260ff1660ff81106128b4576128b4613ade565b0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790556128f6816001613c86565b6001600160a01b03929092165f90815261019f60205260409020805460ff191660ff9093169290921790915550565b60010161286a565b5060405162461bcd60e51b815260206004820152600960248201527f736c6f742066756c6c000000000000000000000000000000000000000000000060448201526064016109e4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b2267a7b7f00000000000000000000000000000000000000000000000000000000000000005f6101a754856040516024016129dd929190613c9f565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f7046529b00000000000000000000000000000000000000000000000000000000179052609b5490517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b168152612a739493929190600401613cdd565b5f604051808303815f87803b158015612a8a575f80fd5b505af1158015612a9c573d5f803e3d5ffd5b505050506101a7546001612ab09190613b38565b6101a75550565b6033546001600160a01b031633146113485760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109e4565b6001600160a01b0381165f9081526101a1602052604090205415612b775760405162461bcd60e51b815260206004820152601560248201527f616c726561647920696e2064656c6574654c697374000000000000000000000060448201526064016109e4565b6101a080546001810182555f919091527f7980fe0f714a613298681d64b7b8ffa7b148338dd52429f307d72798d5c317c40180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038316179055609954612be79043613b38565b6001600160a01b039091165f9081526101a16020526040902055565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b2267a7b7f00000000000000000000000000000000000000000000000000000000000000005f6101a75485604051602401612c6a929190613d15565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcce6cf9f00000000000000000000000000000000000000000000000000000000179052609c5490517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b168152612a739493929190600401613cdd565b5f5b6101a0548110156110bc575f6001600160a01b03166101a08281548110612d2b57612d2b613ade565b5f918252602090912001546001600160a01b031603612e66576101a15f6101a08381548110612d5c57612d5c613ade565b5f9182526020808320909101546001600160a01b031683528201929092526040018120556101a08054612d9190600190613b9a565b81548110612da157612da1613ade565b5f918252602090912001546101a080546001600160a01b039092169183908110612dcd57612dcd613ade565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506101a0805480612e0a57612e0a613d2d565b5f8281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055612d02565b436101a15f6101a08481548110612e7f57612e7f613ade565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054116130085760a0600161019f5f6101a08581548110612ec457612ec4613ade565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054612ef5919060ff16613bad565b60ff1660ff8110612f0857612f08613ade565b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556101a0805461019f915f9184908110612f4a57612f4a613ade565b5f9182526020808320909101546001600160a01b031683528201929092526040018120805460ff191690556101a080546101a292919084908110612f9057612f90613ade565b5f9182526020808320909101546001600160a01b03168352820192909252604001812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001681556001810182905590612fee60028301826133b4565b50506101a15f6101a08381548110612d5c57612d5c613ade565b8061301281613be4565b915050612d02565b60026065540361306c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109e4565b6002606555565b8015613118575f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146130c2576040519150601f19603f3d011682016040523d82523d5f602084013e6130c7565b606091505b5050905080610d805760405162461bcd60e51b815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c6564000000000060448201526064016109e4565b5050565b6001606555565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff166132085760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109e4565b611348613294565b5f54610100900460ff1661328c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109e4565b611348613319565b5f54610100900460ff166133105760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109e4565b61134833613123565b5f54610100900460ff1661311c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109e4565b60405180611fe0016040528060ff906020820280368337509192915050565b5080546133c090613944565b5f825580601f106133cf575050565b601f0160209004905f5260205f20908101906110bc91905b808211156133fa575f81556001016133e7565b5090565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613454576134546133fe565b604052919050565b5f82601f83011261346b575f80fd5b813567ffffffffffffffff811115613485576134856133fe565b6134986020601f19601f8401160161342b565b8181528460208386010111156134ac575f80fd5b816020850160208301375f918101602001919091529392505050565b5f80604083850312156134d9575f80fd5b82359150602083013567ffffffffffffffff8111156134f6575f80fd5b6135028582860161345c565b9150509250929050565b80356001600160a01b03811681146116c4575f80fd5b5f60208284031215613532575f80fd5b61353b8261350c565b9392505050565b5f60208284031215613552575f80fd5b5035919050565b5f602080838503121561356a575f80fd5b823567ffffffffffffffff80821115613581575f80fd5b818501915085601f830112613594575f80fd5b8135818111156135a6576135a66133fe565b8060051b91506135b784830161342b565b81815291830184019184810190888411156135d0575f80fd5b938501935b838510156135f5576135e68561350c565b825293850193908501906135d5565b98975050505050505050565b611fe0810181835f5b60ff8110156136325781516001600160a01b031683526020928301929091019060010161360a565b50505092915050565b5f8083601f84011261364b575f80fd5b50813567ffffffffffffffff811115613662575f80fd5b6020830191508360208260051b850101111561367c575f80fd5b9250929050565b5f805f805f8060808789031215613698575f80fd5b86359550602087013567ffffffffffffffff808211156136b6575f80fd5b6136c28a838b0161363b565b90975095506040890135945060608901359150808211156136e1575f80fd5b818901915089601f8301126136f4575f80fd5b813581811115613702575f80fd5b8a6020828501011115613713575f80fd5b6020830194508093505050509295509295509295565b5f60208284031215613739575f80fd5b813567ffffffffffffffff81111561374f575f80fd5b61375b8482850161345c565b949350505050565b5f805f805f805f60e0888a031215613779575f80fd5b6137828861350c565b9960208901359950604089013598606081013598506080810135975060a0810135965060c00135945092505050565b5f5b838110156137cb5781810151838201526020016137b3565b50505f910152565b5f81518084526137ea8160208601602086016137b1565b601f01601f19169290920160200192915050565b6001600160a01b0384168152826020820152606060408201525f61382560608301846137d3565b95945050505050565b5f815180845260208085019450602084015f5b838110156138665781516001600160a01b031687529582019590820190600101613841565b509495945050505050565b602081525f61353b602083018461382e565b5f805f8060408587031215613896575f80fd5b843567ffffffffffffffff808211156138ad575f80fd5b6138b98883890161363b565b909650945060208701359150808211156138d1575f80fd5b506138de8782880161363b565b95989497509550505050565b5f80602083850312156138fb575f80fd5b823567ffffffffffffffff811115613911575f80fd5b61391d8582860161363b565b90969095509350505050565b5f825161393a8184602087016137b1565b9190910192915050565b600181811c9082168061395857607f821691505b60208210810361398f577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f821115610d8057805f5260205f20601f840160051c810160208510156139ba5750805b601f840160051c820191505b818110156139d9575f81556001016139c6565b5050505050565b815167ffffffffffffffff8111156139fa576139fa6133fe565b613a0e81613a088454613944565b84613995565b602080601f831160018114613a60575f8415613a2a5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613ad6565b5f85815260208120601f198616915b82811015613a8e57888601518255948401946001909101908401613a6f565b5085821015613aca57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b505060018460011b0185555b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561175e5761175e613b0b565b808202811582820484141761175e5761175e613b0b565b5f82613b95577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b8181038181111561175e5761175e613b0b565b60ff828116828216039081111561175e5761175e613b0b565b5f60ff821660ff8103613bdb57613bdb613b0b565b60010192915050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613c1457613c14613b0b565b5060010190565b8183525f60208085019450825f5b85811015613866576001600160a01b03613c428361350c565b1687529582019590820190600101613c29565b604081525f613c68604083018688613c1b565b8281036020840152613c7b818587613c1b565b979650505050505050565b60ff818116838216019081111561175e5761175e613b0b565b828152604060208201526001600160a01b038251166040820152602082015160608201525f60408301516060608084015261382560a08401826137d3565b6001600160a01b0385168152836020820152608060408201525f613d0460808301856137d3565b905082606083015295945050505050565b828152604060208201525f61375b604083018461382e565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea164736f6c6343000818000a diff --git a/bindings/bin/l2lidogateway_deployed.hex b/bindings/bin/l2lidogateway_deployed.hex index 68ff19c1..bd0fad2a 100644 --- a/bindings/bin/l2lidogateway_deployed.hex +++ b/bindings/bin/l2lidogateway_deployed.hex @@ -1 +1 @@ -0x6080604052600436106101d0575f3560e01c80639010d07c116100fd578063ca15c87311610092578063f27ebced11610062578063f27ebced14610580578063f2fde38b1461059f578063f887ea40146105be578063fadcc54a146105dd575f80fd5b8063ca15c873146104fb578063d547741f1461051a578063e3b523e314610539578063e8bac93b1461056c575f80fd5b8063ad960ce1116100cd578063ad960ce114610476578063c01e1bd61461048a578063c0c53b8b146104bd578063c676ad29146104dc575f80fd5b80639010d07c1461041157806391d1485414610430578063a93a4af91461044f578063ac67e1af14610462575f80fd5b80635ed2c22011610173578063797594b011610143578063797594b01461038f5780638431f5c1146103ae5780638d7601c0146103c15780638da5cb5b146103f4575f80fd5b80635ed2c220146102ec5780636c07ea43146103275780636f18bd221461033a578063715018a61461037b575f80fd5b806356eff267116101ae57806356eff26714610250578063575361b6146102835780635777bf50146102965780635e4c57a4146102d8575f80fd5b80632f2ff15d146101d45780633cb747bf146101f557806354bbd59c14610231575b5f80fd5b3480156101df575f80fd5b506101f36101ee36600461211c565b610610565b005b348015610200575f80fd5b50609954610214906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561023c575f80fd5b5061021461024b36600461214a565b610626565b34801561025b575f80fd5b506102147f000000000000000000000000000000000000000000000000000000000000000081565b6101f36102913660046121b1565b6106bb565b3480156102a1575f80fd5b507fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff165b6040519015158152602001610228565b3480156102e3575f80fd5b506101f3610706565b3480156102f7575f80fd5b507fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff166102c8565b6101f3610335366004612227565b610838565b348015610345575f80fd5b5061036d7f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d681565b604051908152602001610228565b348015610386575f80fd5b506101f3610876565b34801561039a575f80fd5b50609754610214906001600160a01b031681565b6101f36103bc366004612259565b610889565b3480156103cc575f80fd5b5061036d7f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c81565b3480156103ff575f80fd5b506065546001600160a01b0316610214565b34801561041c575f80fd5b5061021461042b3660046122eb565b610bff565b34801561043b575f80fd5b506102c861044a36600461211c565b610c3e565b6101f361045d36600461230b565b610c74565b34801561046d575f80fd5b506101f3610c86565b348015610481575f80fd5b506101f3610db4565b348015610495575f80fd5b506102147f000000000000000000000000000000000000000000000000000000000000000081565b3480156104c8575f80fd5b506101f36104d736600461234e565b610eca565b3480156104e7575f80fd5b506102146104f636600461214a565b611007565b348015610506575f80fd5b5061036d610515366004612396565b61109c565b348015610525575f80fd5b506101f361053436600461211c565b6110d1565b348015610544575f80fd5b5061036d7f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d81565b348015610577575f80fd5b506101f36110e3565b34801561058b575f80fd5b506101f361059a3660046123ad565b6111fe565b3480156105aa575f80fd5b506101f36105b936600461214a565b611313565b3480156105c9575f80fd5b50609854610214906001600160a01b031681565b3480156105e8575f80fd5b5061036d7f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a81565b6106186113a3565b61062282826113fd565b5050565b5f817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614610693576040517f6251ce6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b507f000000000000000000000000000000000000000000000000000000000000000092915050565b6106fe86868686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250889250611473915050565b505050505050565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff1615610762576040517f4f2c8be200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61078c7f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a33610c3e565b6107c2576040517f3d39c5f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560405133907fc36a428b063177e3f28b3b5d340c08f77827847b2ee30114ccf0c40e519c420a905f90a2565b6108718333845f5b6040519080825280601f01601f19166020018201604052801561086a576020820181803683370190505b5085611473565b505050565b61087e6113a3565b6108875f6118eb565b565b6099546001600160a01b03163381146108e95760405162461bcd60e51b815260206004820152601760248201527f6f6e6c79206d657373656e6765722063616e2063616c6c00000000000000000060448201526064015b60405180910390fd5b806001600160a01b0316636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015610925573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109499190612433565b6097546001600160a01b039081169116146109a65760405162461bcd60e51b815260206004820152601860248201527f6f6e6c792063616c6c20627920636f756e74657270617274000000000000000060448201526064016108e0565b6109ae611954565b877f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614610a1a576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b877f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614610a86576040517f6251ce6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff16610ae1576040517fa185a6b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3415610b19576040517f3ddcf11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038881166004830152602482018890528a16906340c10f19906044015f604051808303815f87803b158015610b79575f80fd5b505af1158015610b8b573d5f803e3d5ffd5b50505050876001600160a01b0316896001600160a01b03168b6001600160a01b03167f165ba69f6ab40c50cade6f65431801e5f9c7d7830b7545391920db039133ba348a8a8a8a604051610be2949392919061244e565b60405180910390a45050610bf560018055565b5050505050505050565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260408120610c3590836119b3565b90505b92915050565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260408120610c3590836119be565b610c808484845f610840565b50505050565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff16610ce1576040517fa185a6b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d0b7f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d633610c3e565b610d41576040517fadd9524c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560405133907f9ca4d309bbfd23c65db3dc38c1712862f5812c7139937e2655de86e803f73bb9905f90a2565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff16610e14576040517f77d195b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e3e7f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c33610c3e565b610e74576040517f9e60ca7e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec805461ff001916905560405133907f644eeba8ede48fefc32ada09fb240c5f6c0f06507ab1d296d5af41f1521d9fcb905f90a2565b5f54610100900460ff1615808015610ee857505f54600160ff909116105b80610f015750303b158015610f0157505f5460ff166001145b610f735760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016108e0565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610fb2575f805461ff0019166101001790555b610fbd8484846119df565b8015610c80575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b5f817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614611074576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b507f000000000000000000000000000000000000000000000000000000000000000092915050565b5f8181527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260408120610c3890611b22565b6110d96113a3565b6106228282611b2b565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff1615611144576040517ff74ad25400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61116e7f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d33610c3e565b6111a4576040517f5c16894300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec805461ff00191661010017905560405133907fb2ed3603bd9051f0182ebfb75f12a21059b4d31b578a2a05c8d0245e9e2d3204905f90a2565b5f54600290610100900460ff1615801561121e57505f5460ff8083169116105b6112905760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016108e0565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff8316176101001790556112cc85858585611ba1565b5f805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b61131b6113a3565b6001600160a01b0381166113975760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108e0565b6113a0816118eb565b50565b6065546001600160a01b031633146108875760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e0565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed602052604090206114339082611d82565b156106225760405133906001600160a01b0383169084907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d905f90a45050565b61147b611954565b847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316146114e7576040517f6251ce6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b846001600160a01b038116611528576040517fef6b416200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff16611588576040517f77d195b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845f036115c1576040517f6c18829600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60985433906001600160a01b03168190036115ef57848060200190518101906115ea91906124d3565b955090505b845115611628576040517f998bcee200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f9dc29fac0000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015260248201889052891690639dc29fac906044015f604051808303815f87803b158015611688575f80fd5b505af115801561169a573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000089838a8a8a6040516024016116da969594939291906125f8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84bd13b00000000000000000000000000000000000000000000000000000000017905260995482517fecc7042800000000000000000000000000000000000000000000000000000000815292519394505f936001600160a01b039091169263ecc704289260048083019391928290030181865afa1580156117b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117d59190612645565b6099546097546040517fb2267a7b0000000000000000000000000000000000000000000000000000000081529293506001600160a01b039182169263b2267a7b92349261182d929116905f9088908d9060040161265c565b5f604051808303818588803b158015611844575f80fd5b505af1158015611856573d5f803e3d5ffd5b5050505050826001600160a01b03168a6001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167fa9967b740f3fc69dfbf4744b4b1c7dfdb0b1b63f1fa4cf573bcdcb9f3ac687c48c8c8c876040516118ce949392919061265c565b60405180910390a450505050506118e460018055565b5050505050565b606580546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6002600154036119a65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108e0565b6002600155565b60018055565b5f610c358383611d96565b6001600160a01b0381165f9081526001830160205260408120541515610c35565b6001600160a01b038316611a355760405162461bcd60e51b815260206004820152601860248201527f7a65726f20636f756e746572706172742061646472657373000000000000000060448201526064016108e0565b6001600160a01b038116611a8b5760405162461bcd60e51b815260206004820152601660248201527f7a65726f206d657373656e67657220616464726573730000000000000000000060448201526064016108e0565b611a93611dbc565b611a9b611e40565b609780546001600160a01b038086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560998054848416921691909117905582161561087157609880546001600160a01b0384167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179055505050565b5f610c38825490565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260409020611b619082611ec4565b156106225760405133906001600160a01b0383169084907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b905f90a45050565b5f54610100900460ff16611c1d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108e0565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117815560405133907fc36a428b063177e3f28b3b5d340c08f77827847b2ee30114ccf0c40e519c420a905f90a2805461ff001916610100178155611ca53390565b6001600160a01b03167fb2ed3603bd9051f0182ebfb75f12a21059b4d31b578a2a05c8d0245e9e2d320460405160405180910390a2611d047f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a866113fd565b611d2e7f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d6856113fd565b611d587f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d846113fd565b6118e47f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c836113fd565b5f610c35836001600160a01b038416611ed8565b5f825f018281548110611dab57611dab612694565b905f5260205f200154905092915050565b5f54610100900460ff16611e385760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108e0565b610887611f24565b5f54610100900460ff16611ebc5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108e0565b610887611fa0565b5f610c35836001600160a01b038416612025565b5f818152600183016020526040812054611f1d57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610c38565b505f610c38565b5f54610100900460ff166119ad5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108e0565b5f54610100900460ff1661201c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108e0565b610887336118eb565b5f81815260018301602052604081205480156120ff575f6120476001836126c1565b85549091505f9061205a906001906126c1565b90508181146120b9575f865f01828154811061207857612078612694565b905f5260205f200154905080875f01848154811061209857612098612694565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806120ca576120ca6126f9565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610c38565b5f915050610c38565b6001600160a01b03811681146113a0575f80fd5b5f806040838503121561212d575f80fd5b82359150602083013561213f81612108565b809150509250929050565b5f6020828403121561215a575f80fd5b813561216581612108565b9392505050565b5f8083601f84011261217c575f80fd5b50813567ffffffffffffffff811115612193575f80fd5b6020830191508360208285010111156121aa575f80fd5b9250929050565b5f805f805f8060a087890312156121c6575f80fd5b86356121d181612108565b955060208701356121e181612108565b945060408701359350606087013567ffffffffffffffff811115612203575f80fd5b61220f89828a0161216c565b979a9699509497949695608090950135949350505050565b5f805f60608486031215612239575f80fd5b833561224481612108565b95602085013595506040909401359392505050565b5f805f805f805f60c0888a03121561226f575f80fd5b873561227a81612108565b9650602088013561228a81612108565b9550604088013561229a81612108565b945060608801356122aa81612108565b93506080880135925060a088013567ffffffffffffffff8111156122cc575f80fd5b6122d88a828b0161216c565b989b979a50959850939692959293505050565b5f80604083850312156122fc575f80fd5b50508035926020909101359150565b5f805f806080858703121561231e575f80fd5b843561232981612108565b9350602085013561233981612108565b93969395505050506040820135916060013590565b5f805f60608486031215612360575f80fd5b833561236b81612108565b9250602084013561237b81612108565b9150604084013561238b81612108565b809150509250925092565b5f602082840312156123a6575f80fd5b5035919050565b5f805f80608085870312156123c0575f80fd5b84356123cb81612108565b935060208501356123db81612108565b925060408501356123eb81612108565b915060608501356123fb81612108565b939692955090935050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215612443575f80fd5b815161216581612108565b6001600160a01b038516815283602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f5b838110156124cb5781810151838201526020016124b3565b50505f910152565b5f80604083850312156124e4575f80fd5b82516124ef81612108565b602084015190925067ffffffffffffffff8082111561250c575f80fd5b818501915085601f83011261251f575f80fd5b81518181111561253157612531612406565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561257757612577612406565b8160405282815288602084870101111561258f575f80fd5b6125a08360208301602088016124b1565b80955050505050509250929050565b5f81518084526125c68160208601602086016124b1565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b5f6001600160a01b0380891683528088166020840152808716604084015280861660608401525083608083015260c060a083015261263960c08301846125af565b98975050505050505050565b5f60208284031215612655575f80fd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f61268360808301856125af565b905082606083015295945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b81810381811115610c38577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea164736f6c6343000818000a +0x6080604052600436106101d0575f3560e01c80639010d07c116100fd578063ca15c87311610092578063f27ebced11610062578063f27ebced14610580578063f2fde38b1461059f578063f887ea40146105be578063fadcc54a146105dd575f80fd5b8063ca15c873146104fb578063d547741f1461051a578063e3b523e314610539578063e8bac93b1461056c575f80fd5b8063ad960ce1116100cd578063ad960ce114610476578063c01e1bd61461048a578063c0c53b8b146104bd578063c676ad29146104dc575f80fd5b80639010d07c1461041157806391d1485414610430578063a93a4af91461044f578063ac67e1af14610462575f80fd5b80635ed2c22011610173578063797594b011610143578063797594b01461038f5780638431f5c1146103ae5780638d7601c0146103c15780638da5cb5b146103f4575f80fd5b80635ed2c220146102ec5780636c07ea43146103275780636f18bd221461033a578063715018a61461037b575f80fd5b806356eff267116101ae57806356eff26714610250578063575361b6146102835780635777bf50146102965780635e4c57a4146102d8575f80fd5b80632f2ff15d146101d45780633cb747bf146101f557806354bbd59c14610231575b5f80fd5b3480156101df575f80fd5b506101f36101ee366004612100565b610610565b005b348015610200575f80fd5b50609954610214906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561023c575f80fd5b5061021461024b36600461212e565b610626565b34801561025b575f80fd5b506102147f000000000000000000000000000000000000000000000000000000000000000081565b6101f3610291366004612195565b6106bb565b3480156102a1575f80fd5b507fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff165b6040519015158152602001610228565b3480156102e3575f80fd5b506101f3610706565b3480156102f7575f80fd5b507fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff166102c8565b6101f361033536600461220b565b610838565b348015610345575f80fd5b5061036d7f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d681565b604051908152602001610228565b348015610386575f80fd5b506101f3610876565b34801561039a575f80fd5b50609754610214906001600160a01b031681565b6101f36103bc36600461223d565b610889565b3480156103cc575f80fd5b5061036d7f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c81565b3480156103ff575f80fd5b506065546001600160a01b0316610214565b34801561041c575f80fd5b5061021461042b3660046122cf565b610bff565b34801561043b575f80fd5b506102c861044a366004612100565b610c3e565b6101f361045d3660046122ef565b610c74565b34801561046d575f80fd5b506101f3610c86565b348015610481575f80fd5b506101f3610db4565b348015610495575f80fd5b506102147f000000000000000000000000000000000000000000000000000000000000000081565b3480156104c8575f80fd5b506101f36104d7366004612332565b610eca565b3480156104e7575f80fd5b506102146104f636600461212e565b611007565b348015610506575f80fd5b5061036d61051536600461237a565b61109c565b348015610525575f80fd5b506101f3610534366004612100565b6110d1565b348015610544575f80fd5b5061036d7f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d81565b348015610577575f80fd5b506101f36110e3565b34801561058b575f80fd5b506101f361059a366004612391565b6111fe565b3480156105aa575f80fd5b506101f36105b936600461212e565b611313565b3480156105c9575f80fd5b50609854610214906001600160a01b031681565b3480156105e8575f80fd5b5061036d7f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a81565b6106186113a3565b61062282826113fd565b5050565b5f817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614610693576040517f6251ce6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b507f000000000000000000000000000000000000000000000000000000000000000092915050565b6106fe86868686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250889250611473915050565b505050505050565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff1615610762576040517f4f2c8be200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61078c7f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a33610c3e565b6107c2576040517f3d39c5f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560405133907fc36a428b063177e3f28b3b5d340c08f77827847b2ee30114ccf0c40e519c420a905f90a2565b6108718333845f5b6040519080825280601f01601f19166020018201604052801561086a576020820181803683370190505b5085611473565b505050565b61087e6113a3565b6108875f6118cf565b565b6099546001600160a01b03163381146108e95760405162461bcd60e51b815260206004820152601760248201527f6f6e6c79206d657373656e6765722063616e2063616c6c00000000000000000060448201526064015b60405180910390fd5b806001600160a01b0316636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015610925573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109499190612417565b6097546001600160a01b039081169116146109a65760405162461bcd60e51b815260206004820152601860248201527f6f6e6c792063616c6c20627920636f756e74657270617274000000000000000060448201526064016108e0565b6109ae611938565b877f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614610a1a576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b877f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614610a86576040517f6251ce6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff16610ae1576040517fa185a6b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3415610b19576040517f3ddcf11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038881166004830152602482018890528a16906340c10f19906044015f604051808303815f87803b158015610b79575f80fd5b505af1158015610b8b573d5f803e3d5ffd5b50505050876001600160a01b0316896001600160a01b03168b6001600160a01b03167f165ba69f6ab40c50cade6f65431801e5f9c7d7830b7545391920db039133ba348a8a8a8a604051610be29493929190612432565b60405180910390a45050610bf560018055565b5050505050505050565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260408120610c359083611997565b90505b92915050565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260408120610c3590836119a2565b610c808484845f610840565b50505050565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff16610ce1576040517fa185a6b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d0b7f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d633610c3e565b610d41576040517fadd9524c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560405133907f9ca4d309bbfd23c65db3dc38c1712862f5812c7139937e2655de86e803f73bb9905f90a2565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff16610e14576040517f77d195b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e3e7f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c33610c3e565b610e74576040517f9e60ca7e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec805461ff001916905560405133907f644eeba8ede48fefc32ada09fb240c5f6c0f06507ab1d296d5af41f1521d9fcb905f90a2565b5f54610100900460ff1615808015610ee857505f54600160ff909116105b80610f015750303b158015610f0157505f5460ff166001145b610f735760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016108e0565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610fb2575f805461ff0019166101001790555b610fbd8484846119c3565b8015610c80575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b5f817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614611074576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b507f000000000000000000000000000000000000000000000000000000000000000092915050565b5f8181527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260408120610c3890611b06565b6110d96113a3565b6106228282611b0f565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff1615611144576040517ff74ad25400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61116e7f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d33610c3e565b6111a4576040517f5c16894300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec805461ff00191661010017905560405133907fb2ed3603bd9051f0182ebfb75f12a21059b4d31b578a2a05c8d0245e9e2d3204905f90a2565b5f54600290610100900460ff1615801561121e57505f5460ff8083169116105b6112905760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016108e0565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff8316176101001790556112cc85858585611b85565b5f805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b61131b6113a3565b6001600160a01b0381166113975760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108e0565b6113a0816118cf565b50565b6065546001600160a01b031633146108875760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e0565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed602052604090206114339082611d66565b156106225760405133906001600160a01b0383169084907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d905f90a45050565b61147b611938565b847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316146114e7576040517f6251ce6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b846001600160a01b038116611528576040517fef6b416200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff16611588576040517f77d195b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845f036115c1576040517f6c18829600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60985433906001600160a01b03168190036115ef57848060200190518101906115ea91906124b7565b955090505b845115611628576040517f998bcee200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f9dc29fac0000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015260248201889052891690639dc29fac906044015f604051808303815f87803b158015611688575f80fd5b505af115801561169a573d5f803e3d5ffd5b50506040517f000000000000000000000000000000000000000000000000000000000000000092505f91506116dd9083908c9086908d908d908d906024016125dc565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84bd13b00000000000000000000000000000000000000000000000000000000017905260995482517fecc7042800000000000000000000000000000000000000000000000000000000815292519394505f936001600160a01b039091169263ecc704289260048083019391928290030181865afa1580156117b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117d89190612629565b6099546097546040517fb2267a7b0000000000000000000000000000000000000000000000000000000081529293506001600160a01b039182169263b2267a7b923492611830929116905f9088908e90600401612640565b5f604051808303818588803b158015611847575f80fd5b505af1158015611859573d5f803e3d5ffd5b5050505050836001600160a01b03168b6001600160a01b0316846001600160a01b03167fa9967b740f3fc69dfbf4744b4b1c7dfdb0b1b63f1fa4cf573bcdcb9f3ac687c48d8d8d876040516118b19493929190612640565b60405180910390a45050505050506118c860018055565b5050505050565b606580546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60026001540361198a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108e0565b6002600155565b60018055565b5f610c358383611d7a565b6001600160a01b0381165f9081526001830160205260408120541515610c35565b6001600160a01b038316611a195760405162461bcd60e51b815260206004820152601860248201527f7a65726f20636f756e746572706172742061646472657373000000000000000060448201526064016108e0565b6001600160a01b038116611a6f5760405162461bcd60e51b815260206004820152601660248201527f7a65726f206d657373656e67657220616464726573730000000000000000000060448201526064016108e0565b611a77611da0565b611a7f611e24565b609780546001600160a01b038086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560998054848416921691909117905582161561087157609880546001600160a01b0384167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179055505050565b5f610c38825490565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260409020611b459082611ea8565b156106225760405133906001600160a01b0383169084907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b905f90a45050565b5f54610100900460ff16611c015760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108e0565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117815560405133907fc36a428b063177e3f28b3b5d340c08f77827847b2ee30114ccf0c40e519c420a905f90a2805461ff001916610100178155611c893390565b6001600160a01b03167fb2ed3603bd9051f0182ebfb75f12a21059b4d31b578a2a05c8d0245e9e2d320460405160405180910390a2611ce87f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a866113fd565b611d127f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d6856113fd565b611d3c7f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d846113fd565b6118c87f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c836113fd565b5f610c35836001600160a01b038416611ebc565b5f825f018281548110611d8f57611d8f612678565b905f5260205f200154905092915050565b5f54610100900460ff16611e1c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108e0565b610887611f08565b5f54610100900460ff16611ea05760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108e0565b610887611f84565b5f610c35836001600160a01b038416612009565b5f818152600183016020526040812054611f0157508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610c38565b505f610c38565b5f54610100900460ff166119915760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108e0565b5f54610100900460ff166120005760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108e0565b610887336118cf565b5f81815260018301602052604081205480156120e3575f61202b6001836126a5565b85549091505f9061203e906001906126a5565b905081811461209d575f865f01828154811061205c5761205c612678565b905f5260205f200154905080875f01848154811061207c5761207c612678565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806120ae576120ae6126dd565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610c38565b5f915050610c38565b6001600160a01b03811681146113a0575f80fd5b5f8060408385031215612111575f80fd5b823591506020830135612123816120ec565b809150509250929050565b5f6020828403121561213e575f80fd5b8135612149816120ec565b9392505050565b5f8083601f840112612160575f80fd5b50813567ffffffffffffffff811115612177575f80fd5b60208301915083602082850101111561218e575f80fd5b9250929050565b5f805f805f8060a087890312156121aa575f80fd5b86356121b5816120ec565b955060208701356121c5816120ec565b945060408701359350606087013567ffffffffffffffff8111156121e7575f80fd5b6121f389828a01612150565b979a9699509497949695608090950135949350505050565b5f805f6060848603121561221d575f80fd5b8335612228816120ec565b95602085013595506040909401359392505050565b5f805f805f805f60c0888a031215612253575f80fd5b873561225e816120ec565b9650602088013561226e816120ec565b9550604088013561227e816120ec565b9450606088013561228e816120ec565b93506080880135925060a088013567ffffffffffffffff8111156122b0575f80fd5b6122bc8a828b01612150565b989b979a50959850939692959293505050565b5f80604083850312156122e0575f80fd5b50508035926020909101359150565b5f805f8060808587031215612302575f80fd5b843561230d816120ec565b9350602085013561231d816120ec565b93969395505050506040820135916060013590565b5f805f60608486031215612344575f80fd5b833561234f816120ec565b9250602084013561235f816120ec565b9150604084013561236f816120ec565b809150509250925092565b5f6020828403121561238a575f80fd5b5035919050565b5f805f80608085870312156123a4575f80fd5b84356123af816120ec565b935060208501356123bf816120ec565b925060408501356123cf816120ec565b915060608501356123df816120ec565b939692955090935050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215612427575f80fd5b8151612149816120ec565b6001600160a01b038516815283602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f5b838110156124af578181015183820152602001612497565b50505f910152565b5f80604083850312156124c8575f80fd5b82516124d3816120ec565b602084015190925067ffffffffffffffff808211156124f0575f80fd5b818501915085601f830112612503575f80fd5b815181811115612515576125156123ea565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561255b5761255b6123ea565b81604052828152886020848701011115612573575f80fd5b612584836020830160208801612495565b80955050505050509250929050565b5f81518084526125aa816020860160208601612495565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b5f6001600160a01b0380891683528088166020840152808716604084015280861660608401525083608083015260c060a083015261261d60c0830184612593565b98975050505050505050565b5f60208284031215612639575f80fd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6126676080830185612593565b905082606083015295945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b81810381811115610c38577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea164736f6c6343000818000a diff --git a/bindings/bin/l2staking_deployed.hex b/bindings/bin/l2staking_deployed.hex index 7eec5970..c99442dd 100644 --- a/bindings/bin/l2staking_deployed.hex +++ b/bindings/bin/l2staking_deployed.hex @@ -1 +1 @@ -0x608060405234801561000f575f80fd5b50600436106102cc575f3560e01c8063715018a61161017c578063927ede2d116100dd578063d557714111610093578063f0261bc21161006e578063f0261bc21461068a578063f2fde38b14610693578063fad99f98146106a6575f80fd5b8063d55771411461063b578063e10911b114610662578063ed70b3431461066a575f80fd5b8063b5d2e0dc116100c3578063b5d2e0dc146105d1578063c64814dd146105f0578063d31d83d91461061a575f80fd5b8063927ede2d1461059d57806396ab994d146105c4575f80fd5b806384d7d1d4116101325780638e21d5fb116101185780638e21d5fb146105355780639168ae721461055c57806391bd43a41461057e575f80fd5b806384d7d1d4146105015780638da5cb5b14610524575f80fd5b8063766718081161016257806376671808146104b35780637b05afb5146104bb578063831cfb58146104da575f80fd5b8063715018a6146104a3578063746c8ae1146104ab575f80fd5b80633385ccc21161023157806340b5c837116101e7578063459598a2116101c2578063459598a21461047557806346cdc18a146104885780636d454d5114610490575f80fd5b806340b5c8371461044757806343352d611461045a578063439162b514610462575f80fd5b80633c323a1b116102175780633c323a1b146103d35780633cb747bf146103e65780633d9353fe14610420575f80fd5b80633385ccc2146103b75780633b802421146103ca575f80fd5b8063174e31c4116102865780632cc138be1161026c5780632cc138be146103855780632e787be31461038e57806330158eea14610397575f80fd5b8063174e31c41461035f57806319fac8fd14610372575f80fd5b80630eb573af116102b65780630eb573af1461030b5780630f3b70591461031e57806312a3e94714610356575f80fd5b806243b758146102d05780630be67fcc146102f6575b5f80fd5b6102e36102de366004614148565b6106ae565b6040519081526020015b60405180910390f35b6103096103043660046141ab565b6106d4565b005b6103096103193660046141ea565b610bf9565b61033161032c366004614201565b610d0c565b604080516001600160a01b0390941684526020840192909252908201526060016102ed565b6102e3609a5481565b61030961036d366004614201565b610d54565b6103096103803660046141ea565b610ecc565b6102e360985481565b6102e360995481565b6103aa6103a53660046141ab565b610fee565b6040516102ed919061428c565b6103096103c5366004614148565b611215565b6102e3609c5481565b6103096103e1366004614201565b611870565b7f00000000000000000000000000000000000000000000000000000000000000005b6040516001600160a01b0390911681526020016102ed565b6104087f000000000000000000000000000000000000000000000000000000000000000081565b6103096104553660046141ea565b611f0a565b6103aa61201d565b610309610470366004614332565b612239565b6104086104833660046141ea565b612775565b609d546102e3565b61030961049e3660046143a0565b61279d565b610309612a6e565b610309612a81565b6102e3612d71565b6102e36104c9366004614148565b60a06020525f908152604090205481565b6104087f000000000000000000000000000000000000000000000000000000000000000081565b61051461050f366004614148565b612de5565b60405190151581526020016102ed565b6033546001600160a01b0316610408565b6104087f000000000000000000000000000000000000000000000000000000000000000081565b61056f61056a366004614148565b612e0f565b6040516102ed939291906143d7565b6102e361058c366004614148565b60a16020525f908152604090205481565b6104087f000000000000000000000000000000000000000000000000000000000000000081565b6097546105149060ff1681565b6102e36105df366004614148565b609e6020525f908152604090205481565b6102e36105fe366004614407565b60a360209081525f928352604080842090915290825290205481565b61062d61062836600461443e565b612ec1565b6040516102ed9291906144b3565b6104087f000000000000000000000000000000000000000000000000000000000000000081565b61030961303b565b61067d610678366004614148565b6133d5565b6040516102ed91906144d3565b6102e3609b5481565b6103096106a1366004614148565b61346b565b6103096134f8565b6001600160a01b0381165f90815260a2602052604081206106ce906135a6565b92915050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156107bc57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa15801561078d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b19190614534565b6001600160a01b0316145b6108335760405162461bcd60e51b815260206004820152602c60248201527f7374616b696e673a206f6e6c79206f74686572207374616b696e6720636f6e7460448201527f7261637420616c6c6f776564000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5f805b82811015610bac57609b54609e5f8686858181106108565761085661454f565b905060200201602081019061086b9190614148565b6001600160a01b03166001600160a01b031681526020019081526020015f20541161089557600191505b5f609e5f8686858181106108ab576108ab61454f565b90506020020160208101906108c09190614148565b6001600160a01b03166001600160a01b031681526020019081526020015f20541115610b23575f6001609e5f8787868181106108fe576108fe61454f565b90506020020160208101906109139190614148565b6001600160a01b03166001600160a01b031681526020019081526020015f205461093d91906145a9565b90505b609d5461094f906001906145a9565b811015610a2157609d6109638260016145bc565b815481106109735761097361454f565b5f91825260209091200154609d80546001600160a01b03909216918390811061099e5761099e61454f565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506001609e5f609d84815481106109e1576109e161454f565b5f9182526020808320909101546001600160a01b0316835282019290925260400181208054909190610a149084906145a9565b9091555050600101610940565b50609d805480610a3357610a336145cf565b5f8281526020812082015f1990810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055909101909155609e90858584818110610a8357610a8361454f565b9050602002016020810190610a989190614148565b6001600160a01b03166001600160a01b031681526020019081526020015f205f90555f60a15f868685818110610ad057610ad061454f565b9050602002016020810190610ae59190614148565b6001600160a01b03166001600160a01b031681526020019081526020015f20541115610b23576001609c5f828254610b1d91906145a9565b90915550505b609f5f858584818110610b3857610b3861454f565b9050602002016020810190610b4d9190614148565b6001600160a01b0316815260208101919091526040015f90812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001681556001810182905590610ba260028301826140ea565b5050600101610836565b507f3511bf213f9290ba907e91e12a43e8471251e1879580ae5509292a3514c23f618383604051610bde9291906145fc565b60405180910390a18015610bf457610bf46135af565b505050565b610c0161372f565b5f81118015610c1257506099548114155b610c845760405162461bcd60e51b815260206004820152602260248201527f696e76616c6964206e65772073657175656e63657220736574206d617820736960448201527f7a65000000000000000000000000000000000000000000000000000000000000606482015260840161082a565b609980549082905560408051828152602081018490527f98b982a120d9be7d9c68d85a1aed8158d1d52e517175bfb3eb4280692f19b1ed910160405180910390a16097545f9060ff16610cd957609d54610cdd565b609c545b90505f6099548210610cf157609954610cf3565b815b9050609b548114610d0657610d066135af565b50505050565b60a4602052815f5260405f208181548110610d25575f80fd5b5f9182526020909120600390910201805460018201546002909201546001600160a01b03909116935090915083565b610d5c613789565b6001600160a01b038216610e12576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016635cf20c7b336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602481018490526044015f604051808303815f87803b158015610df7575f80fd5b505af1158015610e09573d5f803e3d5ffd5b50505050610ebe565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663996cba6883336040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03928316600482015291166024820152604481018490526064015f604051808303815f87803b158015610ea7575f80fd5b505af1158015610eb9573d5f803e3d5ffd5b505050505b610ec86001606555565b5050565b335f908152609e6020526040902054610f275760405162461bcd60e51b815260206004820152601360248201527f6f6e6c79207374616b657220616c6c6f77656400000000000000000000000000604482015260640161082a565b6014811115610f785760405162461bcd60e51b815260206004820152601260248201527f696e76616c696420636f6d6d697373696f6e0000000000000000000000000000604482015260640161082a565b335f90815260a06020526040812082905560975460ff16610f99575f610fac565b610fa1612d71565b610fac9060016145bc565b604080518481526020810183905291925033917f6e500db30ce535d38852e318f333e9be41a3fec6c65d234ebb06203c896db9a5910160405180910390a25050565b60605f8267ffffffffffffffff81111561100a5761100a614649565b60405190808252806020026020018201604052801561105657816020015b60408051606080820183525f8083526020830152918101919091528152602001906001900390816110285790505b5090505f5b8381101561120d576040518060600160405280609f5f8888868181106110835761108361454f565b90506020020160208101906110989190614148565b6001600160a01b03908116825260208083019390935260409091015f908120549091168352910190609f908888868181106110d5576110d561454f565b90506020020160208101906110ea9190614148565b6001600160a01b03166001600160a01b031681526020019081526020015f20600101548152602001609f5f8888868181106111275761112761454f565b905060200201602081019061113c9190614148565b6001600160a01b03166001600160a01b031681526020019081526020015f20600201805461116990614676565b80601f016020809104026020016040519081016040528092919081815260200182805461119590614676565b80156111e05780601f106111b7576101008083540402835291602001916111e0565b820191905f5260205f20905b8154815290600101906020018083116111c357829003601f168201915b50505050508152508282815181106111fa576111fa61454f565b602090810291909101015260010161105b565b509392505050565b61121d613789565b6001600160a01b0381165f90815260a36020908152604080832033845290915290205461128c5760405162461bcd60e51b815260206004820152601660248201527f7374616b696e6720616d6f756e74206973207a65726f00000000000000000000604482015260640161082a565b6001600160a01b0381165f908152609e60205260408120546097549015919060ff166112b8575f6112cb565b6112c0612d71565b6112cb9060016145bc565b6097549091505f9060ff1680156112e0575082155b6112ea57816112f7565b609a546112f790836145bc565b604080516060810182526001600160a01b038781168083525f81815260a36020908152858220338084528183528784208054848901908152888a018b815283875260a486528a87208054600180820183559189528789208c5160039092020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001691909b16178a558251908a015551600290980197909755908452908252829055925191815260a1909252928120805494955091936113b99084906145a9565b90915550506001600160a01b0385165f90815260a2602052604090206113df90336137e9565b506001600160a01b0385165f908152609e602052604090205484158015611408575060975460ff165b80156114155750609c5481105b1561168c576001600160a01b0386165f908152609e602052604081205461143e906001906145a9565b90505b6001609c5461145091906145a9565b81101561168a5760a15f609d838154811061146d5761146d61454f565b5f9182526020808320909101546001600160a01b031683528201929092526040018120549060a190609d6114a28560016145bc565b815481106114b2576114b261454f565b5f9182526020808320909101546001600160a01b031683528201929092526040019020541115611682575f609d82815481106114f0576114f061454f565b5f918252602090912001546001600160a01b03169050609d6115138360016145bc565b815481106115235761152361454f565b5f91825260209091200154609d80546001600160a01b03909216918490811061154e5761154e61454f565b5f91825260209091200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905580609d61159c8460016145bc565b815481106115ac576115ac61454f565b5f91825260209091200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790556115f78260016145bc565b609e5f609d858154811061160d5761160d61454f565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205561163c8260026145bc565b609e5f609d61164c8660016145bc565b8154811061165c5761165c61454f565b5f9182526020808320909101546001600160a01b03168352820192909252604001902055505b600101611441565b505b841580156116af57506001600160a01b0386165f90815260a16020526040902054155b156116cc576001609c5f8282546116c691906145a9565b90915550505b6001600160a01b038681165f81815260a160205260408082205481517f7f683ee30000000000000000000000000000000000000000000000000000000081526004810194909452336024850152604484018990526064840152517f000000000000000000000000000000000000000000000000000000000000000090931692637f683ee392608480820193929182900301818387803b15801561176d575f80fd5b505af115801561177f573d5f803e3d5ffd5b5050505061178a3390565b6001600160a01b0316866001600160a01b03167f92039db29d8c0a1aa1433fe109c69488c8c5e51b23c9de7d303ad80c1fef778c846020015187876040516117e5939291909283526020830191909152604082015260600190565b60405180910390a3841580156117fd575060975460ff165b801561180b5750609b548111155b80156118515750609b546001600160a01b0387165f908152609e602052604090205411806118515750609c546001600160a01b0387165f908152609e6020526040902054115b1561185e5761185e6135af565b505050505061186d6001606555565b50565b6001600160a01b0382165f908152609e602052604090205482906118d65760405162461bcd60e51b815260206004820152600a60248201527f6e6f74207374616b657200000000000000000000000000000000000000000000604482015260640161082a565b6118de613789565b5f821161192d5760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964207374616b6520616d6f756e74000000000000000000000000604482015260640161082a565b6119373384613804565b156119845760405162461bcd60e51b815260206004820152601660248201527f756e64656c65676174696f6e20756e636c61696d656400000000000000000000604482015260640161082a565b6001600160a01b0383165f90815260a360209081526040808320338452909152902054611a02576119b5338461388d565b15611a025760405162461bcd60e51b815260206004820152601060248201527f72657761726420756e636c61696d656400000000000000000000000000000000604482015260640161082a565b6001600160a01b0383165f90815260a1602052604081208054849290611a299084906145bc565b90915550506001600160a01b0383165f90815260a36020908152604080832033845290915281208054849290611a609084906145bc565b90915550506001600160a01b0383165f90815260a260205260409020611a869033613942565b506001600160a01b0383165f90815260a16020526040902054829003611abe576001609c5f828254611ab891906145bc565b90915550505b6001600160a01b0383165f908152609e602052604090205460975460ff168015611ae85750600181115b15611d39575f611af96001836145a9565b90505b8015611d375760a15f609d611b126001856145a9565b81548110611b2257611b2261454f565b905f5260205f20015f9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020015f205460a15f609d8481548110611b7357611b7361454f565b5f9182526020808320909101546001600160a01b031683528201929092526040019020541115611d25575f609d611bab6001846145a9565b81548110611bbb57611bbb61454f565b5f91825260209091200154609d80546001600160a01b0390921692509083908110611be857611be861454f565b5f918252602090912001546001600160a01b0316609d611c096001856145a9565b81548110611c1957611c1961454f565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555080609d8381548110611c5857611c5861454f565b5f918252602082200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0393909316929092179091558290609e90609d611caa6001856145a9565b81548110611cba57611cba61454f565b5f9182526020808320909101546001600160a01b03168352820192909252604001902055611ce98260016145bc565b609e5f609d8581548110611cff57611cff61454f565b5f9182526020808320909101546001600160a01b03168352820192909252604001902055505b80611d2f816146c1565b915050611afc565b505b6097545f9060ff16611d4b575f611d5e565b611d53612d71565b611d5e9060016145bc565b6001600160a01b0386165f81815260a36020908152604080832033808552908352928190205481519081529182018990528181018590525193945090927fc4ad67bad2c1f682946a406d840f1b273f5cd5a53fcc1a03d078d92bfa2e07d09181900360600190a36001600160a01b038581165f81815260a360209081526040808320338085528184528285205486865260a18552838620548287529290945282517fb809af0f000000000000000000000000000000000000000000000000000000008152600481019690965260248601526044850187905260648501839052608485015290881460a4840152517f00000000000000000000000000000000000000000000000000000000000000009093169263b809af0f9260c480820193929182900301818387803b158015611e92575f80fd5b505af1158015611ea4573d5f803e3d5ffd5b50505050611eb9611eb23390565b3086613956565b60975460ff168015611ecc5750609b5482115b8015611ef157506099546001600160a01b0386165f908152609e602052604090205411155b15611efe57611efe6135af565b5050610bf46001606555565b611f1261372f565b60975460ff1615611f655760405162461bcd60e51b815260206004820152601660248201527f72657761726420616c7265616479207374617274656400000000000000000000604482015260640161082a565b4281118015611f7e5750611f7c6201518082614703565b155b8015611f8c57506098548114155b611fd85760405162461bcd60e51b815260206004820152601960248201527f696e76616c6964207265776172642073746172742074696d6500000000000000604482015260640161082a565b609880549082905560408051828152602081018490527f91c38708087fb4ba51bd0e6a106cc1fbaf340479a2e81d18f2341e8c78f97555910160405180910390a15050565b609d546060905f9067ffffffffffffffff81111561203d5761203d614649565b60405190808252806020026020018201604052801561208957816020015b60408051606080820183525f80835260208301529181019190915281526020019060019003908161205b5790505b5090505f5b609d54811015612233576040518060600160405280609f5f609d85815481106120b9576120b961454f565b5f9182526020808320909101546001600160a01b0390811684528382019490945260409092018120549092168352609d80549390910192609f929190869081106121055761210561454f565b905f5260205f20015f9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020015f20600101548152602001609f5f609d858154811061215e5761215e61454f565b5f9182526020808320909101546001600160a01b031683528201929092526040019020600201805461218f90614676565b80601f01602080910402602001604051908101604052809291908181526020018280546121bb90614676565b80156122065780601f106121dd57610100808354040283529160200191612206565b820191905f5260205f20905b8154815290600101906020018083116121e957829003601f168201915b50505050508152508282815181106122205761222061454f565b602090810291909101015260010161208e565b50919050565b5f54610100900460ff161580801561225757505f54600160ff909116105b806122705750303b15801561227057505f5460ff166001145b6122e25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161082a565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561233e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b0387166123945760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964206f776e657220616464726573730000000000000000000000604482015260640161082a565b5f86116124095760405162461bcd60e51b815260206004820152602260248201527f73657175656e6365727353697a65206d7573742067726561746572207468616e60448201527f2030000000000000000000000000000000000000000000000000000000000000606482015260840161082a565b5f85116124585760405162461bcd60e51b815260206004820152601c60248201527f696e76616c696420756e64656c65676174654c6f636b45706f63687300000000604482015260640161082a565b4284118015612471575061246f6201518085614703565b155b6124bd5760405162461bcd60e51b815260206004820152601960248201527f696e76616c6964207265776172642073746172742074696d6500000000000000604482015260640161082a565b8161250a5760405162461bcd60e51b815260206004820152601760248201527f696e76616c696420696e697469616c207374616b657273000000000000000000604482015260640161082a565b61251387613bc3565b61251b613c2c565b6099869055609a8590556098849055609b8290555f5b609b548110156126975783838281811061254d5761254d61454f565b905060200281019061255f9190614716565b609f5f8686858181106125745761257461454f565b90506020028101906125869190614716565b612594906020810190614148565b6001600160a01b0316815260208101919091526040015f206125b682826147f7565b905050609d8484838181106125cd576125cd61454f565b90506020028101906125df9190614716565b6125ed906020810190614148565b8154600180820184555f93845260209093200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790556126419082906145bc565b609e5f8686858181106126565761265661454f565b90506020028101906126689190614716565b612676906020810190614148565b6001600160a01b0316815260208101919091526040015f2055600101612531565b50604080515f8152602081018890527f98b982a120d9be7d9c68d85a1aed8158d1d52e517175bfb3eb4280692f19b1ed910160405180910390a1604080515f8152602081018690527f91c38708087fb4ba51bd0e6a106cc1fbaf340479a2e81d18f2341e8c78f97555910160405180910390a1801561276c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b609d8181548110612784575f80fd5b5f918252602090912001546001600160a01b0316905081565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561288557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015612856573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061287a9190614534565b6001600160a01b0316145b6128f75760405162461bcd60e51b815260206004820152602c60248201527f7374616b696e673a206f6e6c79206f74686572207374616b696e6720636f6e7460448201527f7261637420616c6c6f7765640000000000000000000000000000000000000000606482015260840161082a565b609e5f6129076020840184614148565b6001600160a01b03166001600160a01b031681526020019081526020015f20545f036129b457609d61293c6020830183614148565b81546001810183555f928352602080842090910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039390931692909217909155609d5491609e9161299a90850185614148565b6001600160a01b0316815260208101919091526040015f20555b80609f5f6129c56020840184614148565b6001600160a01b0316815260208101919091526040015f206129e782826147f7565b506129f790506020820182614148565b6001600160a01b03167f058ecb29c230cd5df283c89e996187ed521393fe4546cd1b097921c4b2de293d6020830135612a336040850185614752565b604051612a4293929190614969565b60405180910390a260975460ff16158015612a615750609954609d5411155b1561186d5761186d6135af565b612a7661372f565b612a7f5f613bc3565b565b612a8961372f565b609854421015612b005760405162461bcd60e51b8152602060048201526024808201527f63616e2774207374617274206265666f7265207265776172642073746172742060448201527f74696d6500000000000000000000000000000000000000000000000000000000606482015260840161082a565b5f609c5411612b515760405162461bcd60e51b815260206004820152600e60248201527f6e6f6e652063616e646964617465000000000000000000000000000000000000604482015260640161082a565b609780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091555b609d54811015612d0e575f5b81811015612d055760a15f609d8381548110612baa57612baa61454f565b905f5260205f20015f9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020015f205460a15f609d8581548110612bfb57612bfb61454f565b5f9182526020808320909101546001600160a01b031683528201929092526040019020541115612cfd575f609d8281548110612c3957612c3961454f565b5f91825260209091200154609d80546001600160a01b0390921692509084908110612c6657612c6661454f565b5f91825260209091200154609d80546001600160a01b039092169184908110612c9157612c9161454f565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555080609d8481548110612cd057612cd061454f565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550505b600101612b8c565b50600101612b80565b505f5b609d54811015612d6857612d268160016145bc565b609e5f609d8481548110612d3c57612d3c61454f565b5f9182526020808320909101546001600160a01b03168352820192909252604001902055600101612d11565b50612a7f6135af565b5f609854421015612dc45760405162461bcd60e51b815260206004820152601960248201527f726577617264206973206e6f7420737461727465642079657400000000000000604482015260640161082a565b6201518060985442612dd691906145a9565b612de091906149bc565b905090565b6001600160a01b0381165f90815260a36020908152604080832033845290915281205415156106ce565b609f6020525f90815260409020805460018201546002830180546001600160a01b03909316939192612e4090614676565b80601f0160208091040260200160405190810160405280929190818152602001828054612e6c90614676565b8015612eb75780601f10612e8e57610100808354040283529160200191612eb7565b820191905f5260205f20905b815481529060010190602001808311612e9a57829003601f168201915b5050505050905083565b5f60605f8411612f135760405162461bcd60e51b815260206004820152601160248201527f696e76616c696420706167652073697a65000000000000000000000000000000604482015260640161082a565b6001600160a01b0385165f90815260a260205260409020612f33906135a6565b91508367ffffffffffffffff811115612f4e57612f4e614649565b604051908082528060200260200182016040528015612f77578160200160208202803683370190505b5090505f612f8584866149cf565b90505f6001612f9486826145bc565b612f9e90886149cf565b612fa891906145a9565b9050612fb56001856145a9565b811115612fca57612fc76001856145a9565b90505b815b818111613030576001600160a01b0388165f90815260a260205260409020612ff49082613cb0565b8482815181106130065761300661454f565b6001600160a01b039092166020928302919091019091015280613028816149e6565b915050612fcc565b505050935093915050565b613043613789565b335f90815260a46020526040812054815b8181101561336f5760975460ff1615806130a45750613071612d71565b335f90815260a4602052604090208054839081106130915761309161454f565b905f5260205f2090600302016002015411155b1561335d57335f90815260a4602052604090208054829081106130c9576130c961454f565b905f5260205f20906003020160010154836130e491906145bc565b335f90815260a46020526040812080549295509091839081106131095761310961454f565b5f91825260208220600390910201546001600160a01b0316915060a48161312d3390565b6001600160a01b03166001600160a01b031681526020019081526020015f20838154811061315d5761315d61454f565b905f5260205f2090600302016002015490505f60a45f61317a3390565b6001600160a01b03166001600160a01b031681526020019081526020015f2084815481106131aa576131aa61454f565b905f5260205f2090600302016001015490506001856131c991906145a9565b84101561329957335f90815260a4602052604090206131e96001876145a9565b815481106131f9576131f961454f565b905f5260205f20906003020160a45f61320f3390565b6001600160a01b03166001600160a01b031681526020019081526020015f20858154811061323f5761323f61454f565b5f9182526020909120825460039092020180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909216919091178155600180830154908201556002918201549101555b335f90815260a4602052604090208054806132b6576132b66145cf565b5f8281526020812060035f199093019283020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001681556001818101839055600290910191909155915561330c90866145a9565b604080518481526020810184905291965033916001600160a01b038616917f921046659ea3b3b3f8e8fefd2bece3121b2d929ead94c696a75beedee477fdb6910160405180910390a3505050613054565b6133688160016145bc565b9050613054565b505f82116133bf5760405162461bcd60e51b815260206004820152601760248201527f6e6f204d6f72706820746f6b656e20746f20636c61696d000000000000000000604482015260640161082a565b6133c93383613cbb565b5050612a7f6001606555565b6001600160a01b0381165f90815260a460209081526040808320805482518185028101850190935280835260609492939192909184015b82821015613460575f848152602090819020604080516060810182526003860290920180546001600160a01b031683526001808201548486015260029091015491830191909152908352909201910161340c565b505050509050919050565b61347361372f565b6001600160a01b0381166134ef5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161082a565b61186d81613bc3565b613500613789565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663ac2ac640336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b0390911660048201526024015f604051808303815f87803b158015613586575f80fd5b505af1158015613598573d5f803e3d5ffd5b50505050612a7f6001606555565b5f6106ce825490565b60995460975460ff16156135d357609954609c5410156135ce5750609c545b6135e4565b609954609d5410156135e45750609d545b5f8167ffffffffffffffff8111156135fe576135fe614649565b604051908082528060200260200182016040528015613627578160200160208202803683370190505b5090505f5b8281101561369457609d81815481106136475761364761454f565b905f5260205f20015f9054906101000a90046001600160a01b03168282815181106136745761367461454f565b6001600160a01b039092166020928302919091019091015260010161362c565b506040517f9b8201a40000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639b8201a4906136fa9084906004016149fe565b5f604051808303815f87803b158015613711575f80fd5b505af1158015613723573d5f803e3d5ffd5b50509151609b55505050565b6033546001600160a01b03163314612a7f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161082a565b6002606554036137db5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161082a565b6002606555565b6001606555565b5f6137fd836001600160a01b038416613f19565b9392505050565b5f805b6001600160a01b0384165f90815260a46020526040902054811015613884576001600160a01b038481165f90815260a460205260409020805491851691839081106138545761385461454f565b5f9182526020909120600390910201546001600160a01b03160361387c5760019150506106ce565b600101613807565b505f9392505050565b6040517fde6ac9330000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015282811660248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063de6ac93390604401602060405180830381865afa158015613916573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061393a9190614a10565b159392505050565b5f6137fd836001600160a01b038416613ffc565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa1580156139d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139fb9190614a2f565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301528581166024830152604482018590529192507f0000000000000000000000000000000000000000000000000000000000000000909116906323b872dd906064016020604051808303815f875af1158015613a8d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ab19190614a10565b506040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015613b33573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b579190614a2f565b90505f83118015613b70575082613b6e83836145a9565b145b613bbc5760405162461bcd60e51b815260206004820152601b60248201527f6d6f72706820746f6b656e207472616e73666572206661696c65640000000000604482015260640161082a565b5050505050565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff16613ca85760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161082a565b612a7f614048565b5f6137fd83836140c4565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015613d3c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d609190614a2f565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152602482018590529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303815f875af1158015613dea573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e0e9190614a10565b506040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015613e90573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613eb49190614a2f565b90505f83118015613ecd575082613ecb83836145a9565b145b610d065760405162461bcd60e51b815260206004820152601b60248201527f6d6f72706820746f6b656e207472616e73666572206661696c65640000000000604482015260640161082a565b5f8181526001830160205260408120548015613ff3575f613f3b6001836145a9565b85549091505f90613f4e906001906145a9565b9050818114613fad575f865f018281548110613f6c57613f6c61454f565b905f5260205f200154905080875f018481548110613f8c57613f8c61454f565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080613fbe57613fbe6145cf565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506106ce565b5f9150506106ce565b5f81815260018301602052604081205461404157508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556106ce565b505f6106ce565b5f54610100900460ff166137e25760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161082a565b5f825f0182815481106140d9576140d961454f565b905f5260205f200154905092915050565b5080546140f690614676565b5f825580601f10614105575050565b601f0160209004905f5260205f209081019061186d91905b80821115614130575f815560010161411d565b5090565b6001600160a01b038116811461186d575f80fd5b5f60208284031215614158575f80fd5b81356137fd81614134565b5f8083601f840112614173575f80fd5b50813567ffffffffffffffff81111561418a575f80fd5b6020830191508360208260051b85010111156141a4575f80fd5b9250929050565b5f80602083850312156141bc575f80fd5b823567ffffffffffffffff8111156141d2575f80fd5b6141de85828601614163565b90969095509350505050565b5f602082840312156141fa575f80fd5b5035919050565b5f8060408385031215614212575f80fd5b823561421d81614134565b946020939093013593505050565b5f81518084525f5b8181101561424f57602081850181015186830182015201614233565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b83811015614324578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0018552815180516001600160a01b03168452878101518885015286015160608785018190526143108186018361422b565b9689019694505050908601906001016142b3565b509098975050505050505050565b5f805f805f8060a08789031215614347575f80fd5b863561435281614134565b9550602087013594506040870135935060608701359250608087013567ffffffffffffffff811115614382575f80fd5b61438e89828a01614163565b979a9699509497509295939492505050565b5f602082840312156143b0575f80fd5b813567ffffffffffffffff8111156143c6575f80fd5b8201606081850312156137fd575f80fd5b6001600160a01b0384168152826020820152606060408201525f6143fe606083018461422b565b95945050505050565b5f8060408385031215614418575f80fd5b823561442381614134565b9150602083013561443381614134565b809150509250929050565b5f805f60608486031215614450575f80fd5b833561445b81614134565b95602085013595506040909401359392505050565b5f815180845260208085019450602084015f5b838110156144a85781516001600160a01b031687529582019590820190600101614483565b509495945050505050565b828152604060208201525f6144cb6040830184614470565b949350505050565b602080825282518282018190525f919060409081850190868401855b8281101561452757815180516001600160a01b03168552868101518786015285015185850152606090930192908501906001016144ef565b5091979650505050505050565b5f60208284031215614544575f80fd5b81516137fd81614134565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b818103818111156106ce576106ce61457c565b808201808211156106ce576106ce61457c565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b60208082528181018390525f908460408401835b8681101561463e57823561462381614134565b6001600160a01b031682529183019190830190600101614610565b509695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b600181811c9082168061468a57607f821691505b602082108103612233577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f816146cf576146cf61457c565b505f190190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82614711576147116146d6565b500690565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112614748575f80fd5b9190910192915050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614785575f80fd5b83018035915067ffffffffffffffff82111561479f575f80fd5b6020019150368190038213156141a4575f80fd5b601f821115610bf457805f5260205f20601f840160051c810160208510156147d85750805b601f840160051c820191505b81811015613bbc575f81556001016147e4565b813561480281614134565b6001600160a01b0381167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550600160208084013560018401556002830160408501357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1863603018112614879575f80fd5b8501803567ffffffffffffffff811115614891575f80fd5b80360384830113156148a1575f80fd5b6148b5816148af8554614676565b856147b3565b5f601f8211600181146148e8575f83156148d157508382018601355b5f19600385901b1c1916600184901b17855561495e565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08516915b8281101561493457868501890135825593880193908901908801614915565b5084821015614952575f1960f88660031b161c198885880101351681555b505060018360011b0185555b505050505050505050565b83815260406020820152816040820152818360608301375f818301606090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010192915050565b5f826149ca576149ca6146d6565b500490565b80820281158282048414176106ce576106ce61457c565b5f5f1982036149f7576149f761457c565b5060010190565b602081525f6137fd6020830184614470565b5f60208284031215614a20575f80fd5b815180151581146137fd575f80fd5b5f60208284031215614a3f575f80fd5b505191905056fea164736f6c6343000818000a +0x608060405234801561000f575f80fd5b50600436106102ec575f3560e01c8063746c8ae111610192578063affed0e0116100e8578063e10911b111610093578063f2fde38b1161006e578063f2fde38b146106cf578063fad99f98146106e2578063fc6facc6146106ea575f80fd5b8063e10911b11461069e578063ed70b343146106a6578063f0261bc2146106c6575f80fd5b8063cce6cf9f116100c3578063cce6cf9f14610643578063d31d83d914610656578063d557714114610677575f80fd5b8063affed0e0146105f1578063b5d2e0dc146105fa578063c64814dd14610619575f80fd5b80638da5cb5b1161014857806391bd43a41161012357806391bd43a41461059e578063927ede2d146105bd57806396ab994d146105e4575f80fd5b80638da5cb5b146105445780638e21d5fb146105555780639168ae721461057c575f80fd5b80637b05afb5116101785780637b05afb5146104db578063831cfb58146104fa57806384d7d1d414610521575f80fd5b8063746c8ae1146104cb57806376671808146104d3575f80fd5b80633b8024211161024757806343352d61116101fd57806346cdc18a116101d857806346cdc18a146104a85780637046529b146104b0578063715018a6146104c3575f80fd5b806343352d611461047a578063439162b514610482578063459598a214610495575f80fd5b80633cb747bf1161022d5780633cb747bf146104065780633d9353fe1461044057806340b5c83714610467575f80fd5b80633b802421146103ea5780633c323a1b146103f3575f80fd5b8063174e31c4116102a75780632e787be3116102825780632e787be3146103ae57806330158eea146103b75780633385ccc2146103d7575f80fd5b8063174e31c41461037f57806319fac8fd146103925780632cc138be146103a5575f80fd5b80630eb573af116102d75780630eb573af1461032b5780630f3b70591461033e57806312a3e94714610376575f80fd5b806243b758146102f05780629c6f0c14610316575b5f80fd5b6103036102fe36600461465b565b6106fd565b6040519081526020015b60405180910390f35b610329610324366004614676565b610723565b005b6103296103393660046146c0565b610901565b61035161034c3660046146d7565b610a14565b604080516001600160a01b03909416845260208401929092529082015260600161030d565b610303609a5481565b61032961038d3660046146d7565b610a5c565b6103296103a03660046146c0565b610bd4565b61030360985481565b61030360995481565b6103ca6103c5366004614749565b610cf6565b60405161030d91906147e9565b6103296103e536600461465b565b610f1d565b610303609c5481565b6103296104013660046146d7565b611557565b7f00000000000000000000000000000000000000000000000000000000000000005b6040516001600160a01b03909116815260200161030d565b6104287f000000000000000000000000000000000000000000000000000000000000000081565b6103296104753660046146c0565b611be6565b6103ca611cf9565b61032961049036600461488f565b611f15565b6104286104a33660046146c0565b612446565b609d54610303565b6103296104be366004614676565b61246e565b6103296125c8565b6103296125db565b6103036128cb565b6103036104e936600461465b565b60a06020525f908152604090205481565b6104287f000000000000000000000000000000000000000000000000000000000000000081565b61053461052f36600461465b565b61293f565b604051901515815260200161030d565b6033546001600160a01b0316610428565b6104287f000000000000000000000000000000000000000000000000000000000000000081565b61058f61058a36600461465b565b612969565b60405161030d939291906148fd565b6103036105ac36600461465b565b60a16020525f908152604090205481565b6104287f000000000000000000000000000000000000000000000000000000000000000081565b6097546105349060ff1681565b61030360a55481565b61030361060836600461465b565b609e6020525f908152604090205481565b61030361062736600461492d565b60a360209081525f928352604080842090915290825290205481565b610329610651366004614959565b612a1b565b6106696106643660046149a1565b612f87565b60405161030d929190614a16565b6104287f000000000000000000000000000000000000000000000000000000000000000081565b610329613115565b6106b96106b436600461465b565b613499565b60405161030d9190614a36565b610303609b5481565b6103296106dd36600461465b565b61352f565b6103296135bc565b6103296106f8366004614959565b61366a565b6001600160a01b0381165f90815260a26020526040812061071d90613a35565b92915050565b61072b613a3e565b8160a55481146107825760405162461bcd60e51b815260206004820152600d60248201527f696e76616c6964206e6f6e63650000000000000000000000000000000000000060448201526064015b60405180910390fd5b61078d836001614ac4565b60a555609e5f6107a0602085018561465b565b6001600160a01b03166001600160a01b031681526020019081526020015f20545f0361084257609d6107d5602084018461465b565b81546001810183555f9283526020808420909101805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039390931692909217909155609d5491609e916108289086018661465b565b6001600160a01b0316815260208101919091526040015f20555b81609f5f610853602084018461465b565b6001600160a01b0316815260208101919091526040015f206108758282614bf4565b506108859050602083018361465b565b6001600160a01b03167f058ecb29c230cd5df283c89e996187ed521393fe4546cd1b097921c4b2de293d60208401356108c16040860186614ad7565b6040516108d093929190614d5b565b60405180910390a260975460ff161580156108ef5750609954609d5411155b156108fc576108fc613a98565b505050565b610909613a3e565b5f8111801561091a57506099548114155b61098c5760405162461bcd60e51b815260206004820152602260248201527f696e76616c6964206e65772073657175656e63657220736574206d617820736960448201527f7a650000000000000000000000000000000000000000000000000000000000006064820152608401610779565b609980549082905560408051828152602081018490527f98b982a120d9be7d9c68d85a1aed8158d1d52e517175bfb3eb4280692f19b1ed910160405180910390a16097545f9060ff166109e157609d546109e5565b609c545b90505f60995482106109f9576099546109fb565b815b9050609b548114610a0e57610a0e613a98565b50505050565b60a4602052815f5260405f208181548110610a2d575f80fd5b5f9182526020909120600390910201805460018201546002909201546001600160a01b03909116935090915083565b610a64613c18565b6001600160a01b038216610b1a576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016635cf20c7b336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602481018490526044015f604051808303815f87803b158015610aff575f80fd5b505af1158015610b11573d5f803e3d5ffd5b50505050610bc6565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663996cba6883336040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03928316600482015291166024820152604481018490526064015f604051808303815f87803b158015610baf575f80fd5b505af1158015610bc1573d5f803e3d5ffd5b505050505b610bd06001606555565b5050565b335f908152609e6020526040902054610c2f5760405162461bcd60e51b815260206004820152601360248201527f6f6e6c79207374616b657220616c6c6f776564000000000000000000000000006044820152606401610779565b6014811115610c805760405162461bcd60e51b815260206004820152601260248201527f696e76616c696420636f6d6d697373696f6e00000000000000000000000000006044820152606401610779565b335f90815260a06020526040812082905560975460ff16610ca1575f610cb4565b610ca96128cb565b610cb4906001614ac4565b604080518481526020810183905291925033917f6e500db30ce535d38852e318f333e9be41a3fec6c65d234ebb06203c896db9a5910160405180910390a25050565b60605f8267ffffffffffffffff811115610d1257610d12614b38565b604051908082528060200260200182016040528015610d5e57816020015b60408051606080820183525f808352602083015291810191909152815260200190600190039081610d305790505b5090505f5b83811015610f15576040518060600160405280609f5f888886818110610d8b57610d8b614dae565b9050602002016020810190610da0919061465b565b6001600160a01b03908116825260208083019390935260409091015f908120549091168352910190609f90888886818110610ddd57610ddd614dae565b9050602002016020810190610df2919061465b565b6001600160a01b03166001600160a01b031681526020019081526020015f20600101548152602001609f5f888886818110610e2f57610e2f614dae565b9050602002016020810190610e44919061465b565b6001600160a01b03166001600160a01b031681526020019081526020015f206002018054610e7190614b65565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9d90614b65565b8015610ee85780601f10610ebf57610100808354040283529160200191610ee8565b820191905f5260205f20905b815481529060010190602001808311610ecb57829003601f168201915b5050505050815250828281518110610f0257610f02614dae565b6020908102919091010152600101610d63565b509392505050565b610f25613c18565b6001600160a01b0381165f90815260a360209081526040808320338452909152902054610f945760405162461bcd60e51b815260206004820152601660248201527f7374616b696e6720616d6f756e74206973207a65726f000000000000000000006044820152606401610779565b6001600160a01b0381165f908152609e60205260408120546097549015919060ff16610fc0575f610fd3565b610fc86128cb565b610fd3906001614ac4565b6097549091505f9060ff168015610fe8575082155b610ff25781610fff565b609a54610fff9083614ac4565b604080516060810182526001600160a01b038781168083525f81815260a36020908152858220338084528183528784208054848901908152888a018b815283875260a486528a87208054600180820183559189528789208c51600390920201805473ffffffffffffffffffffffffffffffffffffffff191691909b16178a558251908a015551600290980197909755908452908252829055925191815260a1909252928120805494955091936110b6908490614ddb565b90915550506001600160a01b0385165f90815260a2602052604090206110dc9033613c78565b506001600160a01b0385165f908152609e602052604090205484158015611105575060975460ff165b80156111125750609c5481105b15611373576001600160a01b0386165f908152609e602052604081205461113b90600190614ddb565b90505b6001609c5461114d9190614ddb565b8110156113715760a15f609d838154811061116a5761116a614dae565b5f9182526020808320909101546001600160a01b031683528201929092526040018120549060a190609d61119f856001614ac4565b815481106111af576111af614dae565b5f9182526020808320909101546001600160a01b031683528201929092526040019020541115611369575f609d82815481106111ed576111ed614dae565b5f918252602090912001546001600160a01b03169050609d611210836001614ac4565b8154811061122057611220614dae565b5f91825260209091200154609d80546001600160a01b03909216918490811061124b5761124b614dae565b5f918252602090912001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039290921691909117905580609d61128e846001614ac4565b8154811061129e5761129e614dae565b5f918252602090912001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790556112de826001614ac4565b609e5f609d85815481106112f4576112f4614dae565b5f9182526020808320909101546001600160a01b03168352820192909252604001902055611323826002614ac4565b609e5f609d611333866001614ac4565b8154811061134357611343614dae565b5f9182526020808320909101546001600160a01b03168352820192909252604001902055505b60010161113e565b505b8415801561139657506001600160a01b0386165f90815260a16020526040902054155b156113b3576001609c5f8282546113ad9190614ddb565b90915550505b6001600160a01b038681165f81815260a160205260408082205481517f7f683ee30000000000000000000000000000000000000000000000000000000081526004810194909452336024850152604484018990526064840152517f000000000000000000000000000000000000000000000000000000000000000090931692637f683ee392608480820193929182900301818387803b158015611454575f80fd5b505af1158015611466573d5f803e3d5ffd5b505050506114713390565b6001600160a01b0316866001600160a01b03167f92039db29d8c0a1aa1433fe109c69488c8c5e51b23c9de7d303ad80c1fef778c846020015187876040516114cc939291909283526020830191909152604082015260600190565b60405180910390a3841580156114e4575060975460ff165b80156114f25750609b548111155b80156115385750609b546001600160a01b0387165f908152609e602052604090205411806115385750609c546001600160a01b0387165f908152609e6020526040902054115b1561154557611545613a98565b50505050506115546001606555565b50565b6001600160a01b0382165f908152609e602052604090205482906115bd5760405162461bcd60e51b815260206004820152600a60248201527f6e6f74207374616b6572000000000000000000000000000000000000000000006044820152606401610779565b6115c5613c18565b5f82116116145760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964207374616b6520616d6f756e740000000000000000000000006044820152606401610779565b61161e3384613c93565b1561166b5760405162461bcd60e51b815260206004820152601660248201527f756e64656c65676174696f6e20756e636c61696d6564000000000000000000006044820152606401610779565b6001600160a01b0383165f90815260a3602090815260408083203384529091529020546116e95761169c3384613d1c565b156116e95760405162461bcd60e51b815260206004820152601060248201527f72657761726420756e636c61696d6564000000000000000000000000000000006044820152606401610779565b6001600160a01b0383165f90815260a1602052604081208054849290611710908490614ac4565b90915550506001600160a01b0383165f90815260a36020908152604080832033845290915281208054849290611747908490614ac4565b90915550506001600160a01b0383165f90815260a26020526040902061176d9033613dd1565b506001600160a01b0383165f90815260a160205260409020548290036117a5576001609c5f82825461179f9190614ac4565b90915550505b6001600160a01b0383165f908152609e602052604090205460975460ff1680156117cf5750600181115b15611a15575f6117e0600183614ddb565b90505b8015611a135760a15f609d6117f9600185614ddb565b8154811061180957611809614dae565b905f5260205f20015f9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020015f205460a15f609d848154811061185a5761185a614dae565b5f9182526020808320909101546001600160a01b031683528201929092526040019020541115611a01575f609d611892600184614ddb565b815481106118a2576118a2614dae565b5f91825260209091200154609d80546001600160a01b03909216925090839081106118cf576118cf614dae565b5f918252602090912001546001600160a01b0316609d6118f0600185614ddb565b8154811061190057611900614dae565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555080609d838154811061193f5761193f614dae565b5f9182526020822001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0393909316929092179091558290609e90609d611986600185614ddb565b8154811061199657611996614dae565b5f9182526020808320909101546001600160a01b031683528201929092526040019020556119c5826001614ac4565b609e5f609d85815481106119db576119db614dae565b5f9182526020808320909101546001600160a01b03168352820192909252604001902055505b80611a0b81614dee565b9150506117e3565b505b6097545f9060ff16611a27575f611a3a565b611a2f6128cb565b611a3a906001614ac4565b6001600160a01b0386165f81815260a36020908152604080832033808552908352928190205481519081529182018990528181018590525193945090927fc4ad67bad2c1f682946a406d840f1b273f5cd5a53fcc1a03d078d92bfa2e07d09181900360600190a36001600160a01b038581165f81815260a360209081526040808320338085528184528285205486865260a18552838620548287529290945282517fb809af0f000000000000000000000000000000000000000000000000000000008152600481019690965260248601526044850187905260648501839052608485015290881460a4840152517f00000000000000000000000000000000000000000000000000000000000000009093169263b809af0f9260c480820193929182900301818387803b158015611b6e575f80fd5b505af1158015611b80573d5f803e3d5ffd5b50505050611b95611b8e3390565b3086613de5565b60975460ff168015611ba85750609b5482115b8015611bcd57506099546001600160a01b0386165f908152609e602052604090205411155b15611bda57611bda613a98565b50506108fc6001606555565b611bee613a3e565b60975460ff1615611c415760405162461bcd60e51b815260206004820152601660248201527f72657761726420616c72656164792073746172746564000000000000000000006044820152606401610779565b4281118015611c5a5750611c586201518082614e30565b155b8015611c6857506098548114155b611cb45760405162461bcd60e51b815260206004820152601960248201527f696e76616c6964207265776172642073746172742074696d65000000000000006044820152606401610779565b609880549082905560408051828152602081018490527f91c38708087fb4ba51bd0e6a106cc1fbaf340479a2e81d18f2341e8c78f97555910160405180910390a15050565b609d546060905f9067ffffffffffffffff811115611d1957611d19614b38565b604051908082528060200260200182016040528015611d6557816020015b60408051606080820183525f808352602083015291810191909152815260200190600190039081611d375790505b5090505f5b609d54811015611f0f576040518060600160405280609f5f609d8581548110611d9557611d95614dae565b5f9182526020808320909101546001600160a01b0390811684528382019490945260409092018120549092168352609d80549390910192609f92919086908110611de157611de1614dae565b905f5260205f20015f9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020015f20600101548152602001609f5f609d8581548110611e3a57611e3a614dae565b5f9182526020808320909101546001600160a01b0316835282019290925260400190206002018054611e6b90614b65565b80601f0160208091040260200160405190810160405280929190818152602001828054611e9790614b65565b8015611ee25780601f10611eb957610100808354040283529160200191611ee2565b820191905f5260205f20905b815481529060010190602001808311611ec557829003601f168201915b5050505050815250828281518110611efc57611efc614dae565b6020908102919091010152600101611d6a565b50919050565b5f54610100900460ff1615808015611f3357505f54600160ff909116105b80611f4c5750303b158015611f4c57505f5460ff166001145b611fbe5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610779565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561201a575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b0387166120705760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964206f776e6572206164647265737300000000000000000000006044820152606401610779565b5f86116120e55760405162461bcd60e51b815260206004820152602260248201527f73657175656e6365727353697a65206d7573742067726561746572207468616e60448201527f20300000000000000000000000000000000000000000000000000000000000006064820152608401610779565b5f85116121345760405162461bcd60e51b815260206004820152601c60248201527f696e76616c696420756e64656c65676174654c6f636b45706f636873000000006044820152606401610779565b428411801561214d575061214b6201518085614e30565b155b6121995760405162461bcd60e51b815260206004820152601960248201527f696e76616c6964207265776172642073746172742074696d65000000000000006044820152606401610779565b816121e65760405162461bcd60e51b815260206004820152601760248201527f696e76616c696420696e697469616c207374616b6572730000000000000000006044820152606401610779565b6121ef87614096565b6121f76140f4565b6099869055609a8590556098849055609b8290555f5b609b548110156123685783838281811061222957612229614dae565b905060200281019061223b9190614e43565b609f5f86868581811061225057612250614dae565b90506020028101906122629190614e43565b61227090602081019061465b565b6001600160a01b0316815260208101919091526040015f206122928282614bf4565b905050609d8484838181106122a9576122a9614dae565b90506020028101906122bb9190614e43565b6122c990602081019061465b565b8154600180820184555f938452602090932001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055612312908290614ac4565b609e5f86868581811061232757612327614dae565b90506020028101906123399190614e43565b61234790602081019061465b565b6001600160a01b0316815260208101919091526040015f205560010161220d565b50604080515f8152602081018890527f98b982a120d9be7d9c68d85a1aed8158d1d52e517175bfb3eb4280692f19b1ed910160405180910390a1604080515f8152602081018690527f91c38708087fb4ba51bd0e6a106cc1fbaf340479a2e81d18f2341e8c78f97555910160405180910390a1801561243d575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b609d8181548110612455575f80fd5b5f918252602090912001546001600160a01b0316905081565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561255657507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015612527573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061254b9190614e7f565b6001600160a01b0316145b61072b5760405162461bcd60e51b815260206004820152602c60248201527f7374616b696e673a206f6e6c79206f74686572207374616b696e6720636f6e7460448201527f7261637420616c6c6f77656400000000000000000000000000000000000000006064820152608401610779565b6125d0613a3e565b6125d95f614096565b565b6125e3613a3e565b60985442101561265a5760405162461bcd60e51b8152602060048201526024808201527f63616e2774207374617274206265666f7265207265776172642073746172742060448201527f74696d65000000000000000000000000000000000000000000000000000000006064820152608401610779565b5f609c54116126ab5760405162461bcd60e51b815260206004820152600e60248201527f6e6f6e652063616e6469646174650000000000000000000000000000000000006044820152606401610779565b609780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091555b609d54811015612868575f5b8181101561285f5760a15f609d838154811061270457612704614dae565b905f5260205f20015f9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020015f205460a15f609d858154811061275557612755614dae565b5f9182526020808320909101546001600160a01b031683528201929092526040019020541115612857575f609d828154811061279357612793614dae565b5f91825260209091200154609d80546001600160a01b03909216925090849081106127c0576127c0614dae565b5f91825260209091200154609d80546001600160a01b0390921691849081106127eb576127eb614dae565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555080609d848154811061282a5761282a614dae565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550505b6001016126e6565b506001016126da565b505f5b609d548110156128c257612880816001614ac4565b609e5f609d848154811061289657612896614dae565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205560010161286b565b506125d9613a98565b5f60985442101561291e5760405162461bcd60e51b815260206004820152601960248201527f726577617264206973206e6f74207374617274656420796574000000000000006044820152606401610779565b62015180609854426129309190614ddb565b61293a9190614e9a565b905090565b6001600160a01b0381165f90815260a360209081526040808320338452909152812054151561071d565b609f6020525f90815260409020805460018201546002830180546001600160a01b0390931693919261299a90614b65565b80601f01602080910402602001604051908101604052809291908181526020018280546129c690614b65565b8015612a115780601f106129e857610100808354040283529160200191612a11565b820191905f5260205f20905b8154815290600101906020018083116129f457829003601f168201915b5050505050905083565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015612b0357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ad4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612af89190614e7f565b6001600160a01b0316145b612b755760405162461bcd60e51b815260206004820152602c60248201527f7374616b696e673a206f6e6c79206f74686572207374616b696e6720636f6e7460448201527f7261637420616c6c6f77656400000000000000000000000000000000000000006064820152608401610779565b8260a5548114612bc75760405162461bcd60e51b815260206004820152600d60248201527f696e76616c6964206e6f6e6365000000000000000000000000000000000000006044820152606401610779565b612bd2846001614ac4565b60a5555f805b83811015612f3857609b54609e5f878785818110612bf857612bf8614dae565b9050602002016020810190612c0d919061465b565b6001600160a01b03166001600160a01b031681526020019081526020015f205411612c3757600191505b5f609e5f878785818110612c4d57612c4d614dae565b9050602002016020810190612c62919061465b565b6001600160a01b03166001600160a01b031681526020019081526020015f20541115612eba575f6001609e5f888886818110612ca057612ca0614dae565b9050602002016020810190612cb5919061465b565b6001600160a01b03166001600160a01b031681526020019081526020015f2054612cdf9190614ddb565b90505b609d54612cf190600190614ddb565b811015612dc357609d612d05826001614ac4565b81548110612d1557612d15614dae565b5f91825260209091200154609d80546001600160a01b039092169183908110612d4057612d40614dae565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506001609e5f609d8481548110612d8357612d83614dae565b5f9182526020808320909101546001600160a01b0316835282019290925260400181208054909190612db6908490614ddb565b9091555050600101612ce2565b50609d805480612dd557612dd5614ead565b5f8281526020812082015f19908101805473ffffffffffffffffffffffffffffffffffffffff19169055909101909155609e90868684818110612e1a57612e1a614dae565b9050602002016020810190612e2f919061465b565b6001600160a01b03166001600160a01b031681526020019081526020015f205f90555f60a15f878785818110612e6757612e67614dae565b9050602002016020810190612e7c919061465b565b6001600160a01b03166001600160a01b031681526020019081526020015f20541115612eba576001609c5f828254612eb49190614ddb565b90915550505b609f5f868684818110612ecf57612ecf614dae565b9050602002016020810190612ee4919061465b565b6001600160a01b0316815260208101919091526040015f908120805473ffffffffffffffffffffffffffffffffffffffff191681556001810182905590612f2e60028301826145fd565b5050600101612bd8565b507f3511bf213f9290ba907e91e12a43e8471251e1879580ae5509292a3514c23f618484604051612f6a929190614eda565b60405180910390a18015612f8057612f80613a98565b5050505050565b5f60605f8411612fd95760405162461bcd60e51b815260206004820152601160248201527f696e76616c696420706167652073697a650000000000000000000000000000006044820152606401610779565b6001600160a01b0385165f90815260a260205260409020612ff990613a35565b91508367ffffffffffffffff81111561301457613014614b38565b60405190808252806020026020018201604052801561303d578160200160208202803683370190505b5090505f61304b8486614f27565b90505f600161305a8682614ac4565b6130649088614f27565b61306e9190614ddb565b905061307b600185614ddb565b8111156130905761308d600185614ddb565b90505b815f5b828211613109576130c7826130a781614f3e565b6001600160a01b038c165f90815260a26020526040902090945090614178565b85826130d281614f3e565b9350815181106130e4576130e4614dae565b60200260200101906001600160a01b031690816001600160a01b031681525050613093565b50505050935093915050565b61311d613c18565b335f90815260a46020526040812054815b818110156134335760975460ff16158061317e575061314b6128cb565b335f90815260a46020526040902080548390811061316b5761316b614dae565b905f5260205f2090600302016002015411155b1561342157335f90815260a4602052604090208054829081106131a3576131a3614dae565b905f5260205f20906003020160010154836131be9190614ac4565b335f90815260a46020526040812080549295509091839081106131e3576131e3614dae565b5f91825260208220600390910201546001600160a01b0316915060a4816132073390565b6001600160a01b03166001600160a01b031681526020019081526020015f20838154811061323757613237614dae565b905f5260205f2090600302016002015490505f60a45f6132543390565b6001600160a01b03166001600160a01b031681526020019081526020015f20848154811061328457613284614dae565b905f5260205f2090600302016001015490506001856132a39190614ddb565b84101561336857335f90815260a4602052604090206132c3600187614ddb565b815481106132d3576132d3614dae565b905f5260205f20906003020160a45f6132e93390565b6001600160a01b03166001600160a01b031681526020019081526020015f20858154811061331957613319614dae565b5f91825260209091208254600390920201805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03909216919091178155600180830154908201556002918201549101555b335f90815260a46020526040902080548061338557613385614ead565b5f8281526020812060035f1990930192830201805473ffffffffffffffffffffffffffffffffffffffff19168155600181810183905560029091019190915591556133d09086614ddb565b604080518481526020810184905291965033916001600160a01b038616917f921046659ea3b3b3f8e8fefd2bece3121b2d929ead94c696a75beedee477fdb6910160405180910390a350505061312e565b61342c816001614ac4565b905061312e565b505f82116134835760405162461bcd60e51b815260206004820152601760248201527f6e6f204d6f72706820746f6b656e20746f20636c61696d0000000000000000006044820152606401610779565b61348d3383614183565b50506125d96001606555565b6001600160a01b0381165f90815260a460209081526040808320805482518185028101850190935280835260609492939192909184015b82821015613524575f848152602090819020604080516060810182526003860290920180546001600160a01b03168352600180820154848601526002909101549183019190915290835290920191016134d0565b505050509050919050565b613537613a3e565b6001600160a01b0381166135b35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610779565b61155481614096565b6135c4613c18565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663ac2ac640336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b0390911660048201526024015f604051808303815f87803b15801561364a575f80fd5b505af115801561365c573d5f803e3d5ffd5b505050506125d96001606555565b613672613a3e565b8260a55481146136c45760405162461bcd60e51b815260206004820152600d60248201527f696e76616c6964206e6f6e6365000000000000000000000000000000000000006044820152606401610779565b6136cf846001614ac4565b60a5555f805b83811015612f3857609b54609e5f8787858181106136f5576136f5614dae565b905060200201602081019061370a919061465b565b6001600160a01b03166001600160a01b031681526020019081526020015f20541161373457600191505b5f609e5f87878581811061374a5761374a614dae565b905060200201602081019061375f919061465b565b6001600160a01b03166001600160a01b031681526020019081526020015f205411156139b7575f6001609e5f88888681811061379d5761379d614dae565b90506020020160208101906137b2919061465b565b6001600160a01b03166001600160a01b031681526020019081526020015f20546137dc9190614ddb565b90505b609d546137ee90600190614ddb565b8110156138c057609d613802826001614ac4565b8154811061381257613812614dae565b5f91825260209091200154609d80546001600160a01b03909216918390811061383d5761383d614dae565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506001609e5f609d848154811061388057613880614dae565b5f9182526020808320909101546001600160a01b03168352820192909252604001812080549091906138b3908490614ddb565b90915550506001016137df565b50609d8054806138d2576138d2614ead565b5f8281526020812082015f19908101805473ffffffffffffffffffffffffffffffffffffffff19169055909101909155609e9086868481811061391757613917614dae565b905060200201602081019061392c919061465b565b6001600160a01b03166001600160a01b031681526020019081526020015f205f90555f60a15f87878581811061396457613964614dae565b9050602002016020810190613979919061465b565b6001600160a01b03166001600160a01b031681526020019081526020015f205411156139b7576001609c5f8282546139b19190614ddb565b90915550505b609f5f8686848181106139cc576139cc614dae565b90506020020160208101906139e1919061465b565b6001600160a01b0316815260208101919091526040015f908120805473ffffffffffffffffffffffffffffffffffffffff191681556001810182905590613a2b60028301826145fd565b50506001016136d5565b5f61071d825490565b6033546001600160a01b031633146125d95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610779565b60995460975460ff1615613abc57609954609c541015613ab75750609c545b613acd565b609954609d541015613acd5750609d545b5f8167ffffffffffffffff811115613ae757613ae7614b38565b604051908082528060200260200182016040528015613b10578160200160208202803683370190505b5090505f5b82811015613b7d57609d8181548110613b3057613b30614dae565b905f5260205f20015f9054906101000a90046001600160a01b0316828281518110613b5d57613b5d614dae565b6001600160a01b0390921660209283029190910190910152600101613b15565b506040517f9b8201a40000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639b8201a490613be3908490600401614f56565b5f604051808303815f87803b158015613bfa575f80fd5b505af1158015613c0c573d5f803e3d5ffd5b50509151609b55505050565b600260655403613c6a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610779565b6002606555565b6001606555565b5f613c8c836001600160a01b03841661442c565b9392505050565b5f805b6001600160a01b0384165f90815260a46020526040902054811015613d13576001600160a01b038481165f90815260a46020526040902080549185169183908110613ce357613ce3614dae565b5f9182526020909120600390910201546001600160a01b031603613d0b57600191505061071d565b600101613c96565b505f9392505050565b6040517fde6ac9330000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015282811660248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063de6ac93390604401602060405180830381865afa158015613da5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613dc99190614f68565b159392505050565b5f613c8c836001600160a01b03841661450f565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015613e66573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e8a9190614f87565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301528581166024830152604482018590529192507f0000000000000000000000000000000000000000000000000000000000000000909116906323b872dd906064016020604051808303815f875af1158015613f1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f409190614f68565b613f8c5760405162461bcd60e51b815260206004820152601360248201527f7472616e7366657246726f6d206661696c6564000000000000000000000000006044820152606401610779565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa15801561400d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140319190614f87565b90505f8311801561404a5750826140488383614ddb565b145b612f805760405162461bcd60e51b815260206004820152601b60248201527f6d6f72706820746f6b656e207472616e73666572206661696c656400000000006044820152606401610779565b603380546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff166141705760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610779565b6125d961455b565b5f613c8c83836145d7565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015614204573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142289190614f87565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152602482018590529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303815f875af11580156142b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142d69190614f68565b6143225760405162461bcd60e51b815260206004820152600f60248201527f7472616e73666572206661696c656400000000000000000000000000000000006044820152606401610779565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa1580156143a3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143c79190614f87565b90505f831180156143e05750826143de8383614ddb565b145b610a0e5760405162461bcd60e51b815260206004820152601b60248201527f6d6f72706820746f6b656e207472616e73666572206661696c656400000000006044820152606401610779565b5f8181526001830160205260408120548015614506575f61444e600183614ddb565b85549091505f9061446190600190614ddb565b90508181146144c0575f865f01828154811061447f5761447f614dae565b905f5260205f200154905080875f01848154811061449f5761449f614dae565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806144d1576144d1614ead565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f90556001935050505061071d565b5f91505061071d565b5f81815260018301602052604081205461455457508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561071d565b505f61071d565b5f54610100900460ff16613c715760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610779565b5f825f0182815481106145ec576145ec614dae565b905f5260205f200154905092915050565b50805461460990614b65565b5f825580601f10614618575050565b601f0160209004905f5260205f209081019061155491905b80821115614643575f8155600101614630565b5090565b6001600160a01b0381168114611554575f80fd5b5f6020828403121561466b575f80fd5b8135613c8c81614647565b5f8060408385031215614687575f80fd5b82359150602083013567ffffffffffffffff8111156146a4575f80fd5b8301606081860312156146b5575f80fd5b809150509250929050565b5f602082840312156146d0575f80fd5b5035919050565b5f80604083850312156146e8575f80fd5b82356146f381614647565b946020939093013593505050565b5f8083601f840112614711575f80fd5b50813567ffffffffffffffff811115614728575f80fd5b6020830191508360208260051b8501011115614742575f80fd5b9250929050565b5f806020838503121561475a575f80fd5b823567ffffffffffffffff811115614770575f80fd5b61477c85828601614701565b90969095509350505050565b5f81518084525f5b818110156147ac57602081850181015186830182015201614790565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b83811015614881578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0018552815180516001600160a01b031684528781015188850152860151606087850181905261486d81860183614788565b968901969450505090860190600101614810565b509098975050505050505050565b5f805f805f8060a087890312156148a4575f80fd5b86356148af81614647565b9550602087013594506040870135935060608701359250608087013567ffffffffffffffff8111156148df575f80fd5b6148eb89828a01614701565b979a9699509497509295939492505050565b6001600160a01b0384168152826020820152606060408201525f6149246060830184614788565b95945050505050565b5f806040838503121561493e575f80fd5b823561494981614647565b915060208301356146b581614647565b5f805f6040848603121561496b575f80fd5b83359250602084013567ffffffffffffffff811115614988575f80fd5b61499486828701614701565b9497909650939450505050565b5f805f606084860312156149b3575f80fd5b83356149be81614647565b95602085013595506040909401359392505050565b5f815180845260208085019450602084015f5b83811015614a0b5781516001600160a01b0316875295820195908201906001016149e6565b509495945050505050565b828152604060208201525f614a2e60408301846149d3565b949350505050565b602080825282518282018190525f919060409081850190868401855b82811015614a8a57815180516001600160a01b0316855286810151878601528501518585015260609093019290850190600101614a52565b5091979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561071d5761071d614a97565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614b0a575f80fd5b83018035915067ffffffffffffffff821115614b24575f80fd5b602001915036819003821315614742575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b600181811c90821680614b7957607f821691505b602082108103611f0f577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b601f8211156108fc57805f5260205f20601f840160051c81016020851015614bd55750805b601f840160051c820191505b81811015612f80575f8155600101614be1565b8135614bff81614647565b6001600160a01b03811673ffffffffffffffffffffffffffffffffffffffff1983541617825550600160208084013560018401556002830160408501357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1863603018112614c6b575f80fd5b8501803567ffffffffffffffff811115614c83575f80fd5b8036038483011315614c93575f80fd5b614ca781614ca18554614b65565b85614bb0565b5f601f821160018114614cda575f8315614cc357508382018601355b5f19600385901b1c1916600184901b178555614d50565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08516915b82811015614d2657868501890135825593880193908901908801614d07565b5084821015614d44575f1960f88660031b161c198885880101351681555b505060018360011b0185555b505050505050505050565b83815260406020820152816040820152818360608301375f818301606090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010192915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8181038181111561071d5761071d614a97565b5f81614dfc57614dfc614a97565b505f190190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82614e3e57614e3e614e03565b500690565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112614e75575f80fd5b9190910192915050565b5f60208284031215614e8f575f80fd5b8151613c8c81614647565b5f82614ea857614ea8614e03565b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b60208082528181018390525f908460408401835b86811015614f1c578235614f0181614647565b6001600160a01b031682529183019190830190600101614eee565b509695505050505050565b808202811582820484141761071d5761071d614a97565b5f5f198203614f4f57614f4f614a97565b5060010190565b602081525f613c8c60208301846149d3565b5f60208284031215614f78575f80fd5b81518015158114613c8c575f80fd5b5f60208284031215614f97575f80fd5b505191905056fea164736f6c6343000818000a diff --git a/bindings/bin/l2txfeevault_deployed.hex b/bindings/bin/l2txfeevault_deployed.hex index 82032012..5622a70b 100644 --- a/bindings/bin/l2txfeevault_deployed.hex +++ b/bindings/bin/l2txfeevault_deployed.hex @@ -1 +1 @@ -0x608060405260043610610140575f3560e01c806384411d65116100bb578063da13f9a211610071578063f2fde38b11610057578063f2fde38b146103c4578063feec756c146103e3578063ff4f354614610402575f80fd5b8063da13f9a214610377578063eff1337c14610396575f80fd5b80639e7adc79116100a15780639e7adc79146102f5578063a03fa7e314610314578063cc198d7414610333575f80fd5b806384411d65146102b55780638da5cb5b146102ca575f80fd5b80633ccfd60b1161011057806366d003ac116100f657806366d003ac14610256578063708125ad14610282578063715018a6146102a1575f80fd5b80633ccfd60b1461021f578063457e1a4914610233575f80fd5b8063151eeb551461014b5780632ccb1b301461018e5780632e1a7d4d146101af5780633cb747bf146101ce575f80fd5b3661014757005b5f80fd5b348015610156575f80fd5b5061017961016536600461130d565b60056020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b348015610199575f80fd5b506101ad6101a836600461132d565b610421565b005b3480156101ba575f80fd5b506101ad6101c9366004611355565b610750565b3480156101d9575f80fd5b506002546101fa9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610185565b34801561022a575f80fd5b506101ad610a55565b34801561023e575f80fd5b5061024860015481565b604051908152602001610185565b348015610261575f80fd5b506003546101fa9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561028d575f80fd5b506101ad61029c3660046113a8565b610ac8565b3480156102ac575f80fd5b506101ad610ce2565b3480156102c0575f80fd5b5061024860045481565b3480156102d5575f80fd5b505f546101fa9073ffffffffffffffffffffffffffffffffffffffff1681565b348015610300575f80fd5b506101ad61030f36600461130d565b610d53565b34801561031f575f80fd5b506101ad61032e36600461130d565b610e2f565b34801561033e575f80fd5b5061017961034d36600461130d565b73ffffffffffffffffffffffffffffffffffffffff165f9081526006602052604090205460ff1690565b348015610382575f80fd5b506101ad6103913660046113a8565b610ebd565b3480156103a1575f80fd5b506101796103b036600461130d565b60066020525f908152604090205460ff1681565b3480156103cf575f80fd5b506101ad6103de36600461130d565b611018565b3480156103ee575f80fd5b506101ad6103fd36600461130d565b6110ea565b34801561040d575f80fd5b506101ad61041c366004611355565b6111c6565b335f9081526005602052604090205460ff168061045457505f5473ffffffffffffffffffffffffffffffffffffffff1633145b6104a55760405162461bcd60e51b815260206004820152601f60248201527f4665655661756c743a2063616c6c6572206973206e6f7420616c6c6f7765640060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821661052e5760405162461bcd60e51b815260206004820152603060248201527f4665655661756c743a20726563697069656e7420616464726573732063616e6e60448201527f6f74206265206164647265737328302900000000000000000000000000000000606482015260840161049c565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526006602052604090205460ff166105c85760405162461bcd60e51b815260206004820152602760248201527f4665655661756c743a20726563697069656e742061646472657373206e6f742060448201527f616c6c6f77656400000000000000000000000000000000000000000000000000606482015260840161049c565b478082111561063f5760405162461bcd60e51b815260206004820152602a60248201527f4665655661756c743a20696e73756666696369656e742062616c616e6365207460448201527f6f207472616e7366657200000000000000000000000000000000000000000000606482015260840161049c565b60048054830190556003546040805184815273ffffffffffffffffffffffffffffffffffffffff90921660208301523382820152517f0a429aba3d89849a2db0153e4534d95c46a1d83c8109d73893f55ebc44010ff49181900360600190a15f8373ffffffffffffffffffffffffffffffffffffffff16836040515f6040518083038185875af1925050503d805f81146106f4576040519150601f19603f3d011682016040523d82523d5f602084013e6106f9565b606091505b505090508061074a5760405162461bcd60e51b815260206004820152601d60248201527f4665655661756c743a20455448207472616e73666572206661696c6564000000604482015260640161049c565b50505050565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146107b65760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161049c565b60035473ffffffffffffffffffffffffffffffffffffffff166108415760405162461bcd60e51b815260206004820152603060248201527f4665655661756c743a20726563697069656e7420616464726573732063616e6e60448201527f6f74206265206164647265737328302900000000000000000000000000000000606482015260840161049c565b6001548110156108df5760405162461bcd60e51b815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a40161049c565b47808211156109565760405162461bcd60e51b815260206004820152602a60248201527f4665655661756c743a20696e73756666696369656e742062616c616e6365207460448201527f6f20776974686472617700000000000000000000000000000000000000000000606482015260840161049c565b60048054830190556003546040805184815273ffffffffffffffffffffffffffffffffffffffff90921660208301523382820152517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a1600254600354604080516020810182525f80825291517fb2267a7b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9485169463b2267a7b948894610a23949190921692859290600401611498565b5f604051808303818588803b158015610a3a575f80fd5b505af1158015610a4c573d5f803e3d5ffd5b50505050505050565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610abb5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161049c565b47610ac581610750565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610b2e5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161049c565b5f5b8251811015610cdd575f73ffffffffffffffffffffffffffffffffffffffff16838281518110610b6257610b6261152e565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603610bf35760405162461bcd60e51b815260206004820152602660248201527f4665655661756c743a20616464726573732063616e6e6f74206265206164647260448201527f6573732830290000000000000000000000000000000000000000000000000000606482015260840161049c565b8160065f858481518110610c0957610c0961152e565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507fbd84b6b3e1d029fd61a717f6020a8f35b358486e0971c00d4e64b516503f85e7838281518110610c9357610c9361152e565b602002602001015183604051610ccd92919073ffffffffffffffffffffffffffffffffffffffff9290921682521515602082015260400190565b60405180910390a1600101610b30565b505050565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610d485760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161049c565b610d515f611271565b565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610db95760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161049c565b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f1c928c417a10a21c3cddad148c5dba5d710e4b1442d6d8a36de345935ad84612905f90a35050565b335f9081526005602052604090205460ff1680610e6257505f5473ffffffffffffffffffffffffffffffffffffffff1633145b610eae5760405162461bcd60e51b815260206004820152601f60248201527f4665655661756c743a2063616c6c6572206973206e6f7420616c6c6f77656400604482015260640161049c565b47610eb98282610421565b5050565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610f235760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161049c565b5f5b8251811015610cdd578160055f858481518110610f4457610f4461152e565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507fbb5d3e442e800faa1089a4f57bae4f36808d3cf15d051033d78a72147782f24c838281518110610fce57610fce61152e565b60200260200101518360405161100892919073ffffffffffffffffffffffffffffffffffffffff9290921682521515602082015260400190565b60405180910390a1600101610f25565b5f5473ffffffffffffffffffffffffffffffffffffffff16331461107e5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161049c565b73ffffffffffffffffffffffffffffffffffffffff81166110e15760405162461bcd60e51b815260206004820152601d60248201527f6e6577206f776e657220697320746865207a65726f2061646472657373000000604482015260640161049c565b610ac581611271565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146111505760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161049c565b6003805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f7e1e96961a397c8aa26162fe259cc837afc95e33aad4945ddc61c18dabb7a6ad905f90a35050565b5f5473ffffffffffffffffffffffffffffffffffffffff16331461122c5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161049c565b600180549082905560408051828152602081018490527f0d3c80219fe57713b9f9c83d1e51426792d0c14d8e330e65b102571816140965910160405180910390a15050565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611308575f80fd5b919050565b5f6020828403121561131d575f80fd5b611326826112e5565b9392505050565b5f806040838503121561133e575f80fd5b611347836112e5565b946020939093013593505050565b5f60208284031215611365575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b80358015158114611308575f80fd5b5f80604083850312156113b9575f80fd5b823567ffffffffffffffff808211156113d0575f80fd5b818501915085601f8301126113e3575f80fd5b81356020828211156113f7576113f761136c565b8160051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f8301168101818110868211171561143a5761143a61136c565b604052928352818301935084810182019289841115611457575f80fd5b948201945b8386101561147c5761146d866112e5565b8552948201949382019361145c565b965061148b9050878201611399565b9450505050509250929050565b73ffffffffffffffffffffffffffffffffffffffff851681525f60208560208401526080604084015284518060808501525f5b818110156114e75786810183015185820160a0015282016114cb565b505f60a0828601015260a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505082606083015295945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffdfea164736f6c6343000818000a +0x608060405260043610610140575f3560e01c806384411d65116100bb578063da13f9a211610071578063f2fde38b11610057578063f2fde38b146103c4578063feec756c146103e3578063ff4f354614610402575f80fd5b8063da13f9a214610377578063eff1337c14610396575f80fd5b80639e7adc79116100a15780639e7adc79146102f5578063a03fa7e314610314578063cc198d7414610333575f80fd5b806384411d65146102b55780638da5cb5b146102ca575f80fd5b80633ccfd60b1161011057806366d003ac116100f657806366d003ac14610256578063708125ad14610282578063715018a6146102a1575f80fd5b80633ccfd60b1461021f578063457e1a4914610233575f80fd5b8063151eeb551461014b5780632ccb1b301461018e5780632e1a7d4d146101af5780633cb747bf146101ce575f80fd5b3661014757005b5f80fd5b348015610156575f80fd5b506101796101653660046115d6565b60056020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b348015610199575f80fd5b506101ad6101a83660046115f6565b610421565b005b3480156101ba575f80fd5b506101ad6101c936600461161e565b61074d565b3480156101d9575f80fd5b506002546101fa9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610185565b34801561022a575f80fd5b506101ad610add565b34801561023e575f80fd5b5061024860015481565b604051908152602001610185565b348015610261575f80fd5b506003546101fa9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561028d575f80fd5b506101ad61029c366004611671565b610b50565b3480156102ac575f80fd5b506101ad610d6a565b3480156102c0575f80fd5b5061024860045481565b3480156102d5575f80fd5b505f546101fa9073ffffffffffffffffffffffffffffffffffffffff1681565b348015610300575f80fd5b506101ad61030f3660046115d6565b610ddb565b34801561031f575f80fd5b506101ad61032e3660046115d6565b610f40565b34801561033e575f80fd5b5061017961034d3660046115d6565b73ffffffffffffffffffffffffffffffffffffffff165f9081526006602052604090205460ff1690565b348015610382575f80fd5b506101ad610391366004611671565b610fce565b3480156103a1575f80fd5b506101796103b03660046115d6565b60066020525f908152604090205460ff1681565b3480156103cf575f80fd5b506101ad6103de3660046115d6565b6111e3565b3480156103ee575f80fd5b506101ad6103fd3660046115d6565b6112b5565b34801561040d575f80fd5b506101ad61041c36600461161e565b61141a565b335f9081526005602052604090205460ff168061045457505f5473ffffffffffffffffffffffffffffffffffffffff1633145b6104a55760405162461bcd60e51b815260206004820152601f60248201527f4665655661756c743a2063616c6c6572206973206e6f7420616c6c6f7765640060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821661052e5760405162461bcd60e51b815260206004820152603060248201527f4665655661756c743a20726563697069656e7420616464726573732063616e6e60448201527f6f74206265206164647265737328302900000000000000000000000000000000606482015260840161049c565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526006602052604090205460ff166105c85760405162461bcd60e51b815260206004820152602760248201527f4665655661756c743a20726563697069656e742061646472657373206e6f742060448201527f616c6c6f77656400000000000000000000000000000000000000000000000000606482015260840161049c565b478082111561063f5760405162461bcd60e51b815260206004820152602a60248201527f4665655661756c743a20696e73756666696369656e742062616c616e6365207460448201527f6f207472616e7366657200000000000000000000000000000000000000000000606482015260840161049c565b60048054830190556040805183815273ffffffffffffffffffffffffffffffffffffffff85166020820152338183015290517f0a429aba3d89849a2db0153e4534d95c46a1d83c8109d73893f55ebc44010ff49181900360600190a15f8373ffffffffffffffffffffffffffffffffffffffff16836040515f6040518083038185875af1925050503d805f81146106f1576040519150601f19603f3d011682016040523d82523d5f602084013e6106f6565b606091505b50509050806107475760405162461bcd60e51b815260206004820152601d60248201527f4665655661756c743a20455448207472616e73666572206661696c6564000000604482015260640161049c565b50505050565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146107b35760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161049c565b60025473ffffffffffffffffffffffffffffffffffffffff1661083e5760405162461bcd60e51b815260206004820152603060248201527f4665655661756c743a206d657373656e67657220616464726573732063616e6e60448201527f6f74206265206164647265737328302900000000000000000000000000000000606482015260840161049c565b60035473ffffffffffffffffffffffffffffffffffffffff166108c95760405162461bcd60e51b815260206004820152603060248201527f4665655661756c743a20726563697069656e7420616464726573732063616e6e60448201527f6f74206265206164647265737328302900000000000000000000000000000000606482015260840161049c565b6001548110156109675760405162461bcd60e51b815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a40161049c565b47808211156109de5760405162461bcd60e51b815260206004820152602a60248201527f4665655661756c743a20696e73756666696369656e742062616c616e6365207460448201527f6f20776974686472617700000000000000000000000000000000000000000000606482015260840161049c565b60048054830190556003546040805184815273ffffffffffffffffffffffffffffffffffffffff90921660208301523382820152517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a1600254600354604080516020810182525f80825291517fb2267a7b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9485169463b2267a7b948894610aab949190921692859290600401611761565b5f604051808303818588803b158015610ac2575f80fd5b505af1158015610ad4573d5f803e3d5ffd5b50505050505050565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610b435760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161049c565b47610b4d8161074d565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610bb65760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161049c565b5f5b8251811015610d65575f73ffffffffffffffffffffffffffffffffffffffff16838281518110610bea57610bea6117f7565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603610c7b5760405162461bcd60e51b815260206004820152602e60248201527f4665655661756c743a207265636569766520616464726573732063616e6e6f7460448201527f2062652061646472657373283029000000000000000000000000000000000000606482015260840161049c565b8160065f858481518110610c9157610c916117f7565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507fbd84b6b3e1d029fd61a717f6020a8f35b358486e0971c00d4e64b516503f85e7838281518110610d1b57610d1b6117f7565b602002602001015183604051610d5592919073ffffffffffffffffffffffffffffffffffffffff9290921682521515602082015260400190565b60405180910390a1600101610bb8565b505050565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610dd05760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161049c565b610dd95f61153a565b565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610e415760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161049c565b73ffffffffffffffffffffffffffffffffffffffff8116610eca5760405162461bcd60e51b815260206004820152603460248201527f4665655661756c743a206e6577206d657373656e67657220616464726573732060448201527f63616e6e6f742062652061646472657373283029000000000000000000000000606482015260840161049c565b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f1c928c417a10a21c3cddad148c5dba5d710e4b1442d6d8a36de345935ad84612905f90a35050565b335f9081526005602052604090205460ff1680610f7357505f5473ffffffffffffffffffffffffffffffffffffffff1633145b610fbf5760405162461bcd60e51b815260206004820152601f60248201527f4665655661756c743a2063616c6c6572206973206e6f7420616c6c6f77656400604482015260640161049c565b47610fca8282610421565b5050565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146110345760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161049c565b5f5b8251811015610d65575f73ffffffffffffffffffffffffffffffffffffffff16838281518110611068576110686117f7565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16036110f95760405162461bcd60e51b815260206004820152603760248201527f4665655661756c743a207472616e7366657220616c6c6f77656420616464726560448201527f73732063616e6e6f742062652061646472657373283029000000000000000000606482015260840161049c565b8160055f85848151811061110f5761110f6117f7565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507fbb5d3e442e800faa1089a4f57bae4f36808d3cf15d051033d78a72147782f24c838281518110611199576111996117f7565b6020026020010151836040516111d392919073ffffffffffffffffffffffffffffffffffffffff9290921682521515602082015260400190565b60405180910390a1600101611036565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146112495760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161049c565b73ffffffffffffffffffffffffffffffffffffffff81166112ac5760405162461bcd60e51b815260206004820152601d60248201527f6e6577206f776e657220697320746865207a65726f2061646472657373000000604482015260640161049c565b610b4d8161153a565b5f5473ffffffffffffffffffffffffffffffffffffffff16331461131b5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161049c565b73ffffffffffffffffffffffffffffffffffffffff81166113a45760405162461bcd60e51b815260206004820152603460248201527f4665655661756c743a206e657720726563697069656e7420616464726573732060448201527f63616e6e6f742062652061646472657373283029000000000000000000000000606482015260840161049c565b6003805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f7e1e96961a397c8aa26162fe259cc837afc95e33aad4945ddc61c18dabb7a6ad905f90a35050565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146114805760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161049c565b5f81116114f55760405162461bcd60e51b815260206004820152603160248201527f4665655661756c743a206e6577206d696e696d756d207769746864726177206160448201527f6d6f756e742063616e6e6f742062652030000000000000000000000000000000606482015260840161049c565b600180549082905560408051828152602081018490527f0d3c80219fe57713b9f9c83d1e51426792d0c14d8e330e65b102571816140965910160405180910390a15050565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b803573ffffffffffffffffffffffffffffffffffffffff811681146115d1575f80fd5b919050565b5f602082840312156115e6575f80fd5b6115ef826115ae565b9392505050565b5f8060408385031215611607575f80fd5b611610836115ae565b946020939093013593505050565b5f6020828403121561162e575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b803580151581146115d1575f80fd5b5f8060408385031215611682575f80fd5b823567ffffffffffffffff80821115611699575f80fd5b818501915085601f8301126116ac575f80fd5b81356020828211156116c0576116c0611635565b8160051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f8301168101818110868211171561170357611703611635565b604052928352818301935084810182019289841115611720575f80fd5b948201945b8386101561174557611736866115ae565b85529482019493820193611725565b96506117549050878201611662565b9450505050509250929050565b73ffffffffffffffffffffffffffffffffffffffff851681525f60208560208401526080604084015284518060808501525f5b818110156117b05786810183015185820160a001528201611794565b505f60a0828601015260a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505082606083015295945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffdfea164736f6c6343000818000a diff --git a/bindings/bin/l2wstethtoken_deployed.hex b/bindings/bin/l2wstethtoken_deployed.hex index 57abc8d4..2b66e449 100644 --- a/bindings/bin/l2wstethtoken_deployed.hex +++ b/bindings/bin/l2wstethtoken_deployed.hex @@ -1 +1 @@ -0x608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d25780639dc29fac11610088578063c820f14611610063578063c820f14614610354578063d505accf14610367578063dd62ed3e1461037a575f80fd5b80639dc29fac1461031b578063a457c2d71461032e578063a9059cbb14610341575f80fd5b80637ecebe00116100b85780637ecebe00146102e557806384b0196e146102f857806395d89b4114610313575f80fd5b806370a0823114610290578063797594b0146102c5575f80fd5b8063313ce56711610127578063395093511161010d57806339509351146102555780634000aea01461026857806340c10f191461027b575f80fd5b8063313ce5671461021d5780633644e5151461024d575f80fd5b8063116191b611610157578063116191b6146101b357806318160ddd146101f857806323b872dd1461020a575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a6103bf565b6040516101879190611a7e565b60405180910390f35b6101a361019e366004611abf565b61044f565b6040519015158152602001610187565b60cc546101d39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6035545b604051908152602001610187565b6101a3610218366004611ae7565b610468565b60cd5474010000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610187565b6101fc61048b565b6101a3610263366004611abf565b610499565b6101a3610276366004611b20565b6104e4565b61028e610289366004611abf565b61054d565b005b6101fc61029e366004611ba0565b73ffffffffffffffffffffffffffffffffffffffff165f9081526033602052604090205490565b60cd546101d39073ffffffffffffffffffffffffffffffffffffffff1681565b6101fc6102f3366004611ba0565b6105c7565b6103006105f1565b6040516101879796959493929190611bb9565b61017a6106ae565b61028e610329366004611abf565b6106bd565b6101a361033c366004611abf565b61072e565b6101a361034f366004611abf565b6107e4565b61028e610362366004611d5d565b6107f1565b61028e610375366004611ded565b610a08565b6101fc610388366004611e52565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260346020908152604080832093909416825291909152205490565b6060603680546103ce90611e83565b80601f01602080910402602001604051908101604052809291908181526020018280546103fa90611e83565b80156104455780601f1061041c57610100808354040283529160200191610445565b820191905f5260205f20905b81548152906001019060200180831161042857829003601f168201915b5050505050905090565b5f3361045c818585610bae565b60019150505b92915050565b5f33610475858285610d2d565b610480858585610de9565b506001949350505050565b5f61049461100f565b905090565b335f81815260346020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919061045c90829086906104df908790611ece565b610bae565b5f6104ef85856107e4565b5073ffffffffffffffffffffffffffffffffffffffff85163b1561048057610480858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061101892505050565b60cc5473ffffffffffffffffffffffffffffffffffffffff1633146105b95760405162461bcd60e51b815260206004820152600c60248201527f4f6e6c792047617465776179000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6105c382826110a3565b5050565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260996020526040812054610462565b5f6060805f805f60606065545f801b14801561060d5750606654155b6106595760405162461bcd60e51b815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064016105b0565b61066161117c565b61066961118b565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6060603780546103ce90611e83565b60cc5473ffffffffffffffffffffffffffffffffffffffff1633146107245760405162461bcd60e51b815260206004820152600c60248201527f4f6e6c792047617465776179000000000000000000000000000000000000000060448201526064016105b0565b6105c3828261119a565b335f81815260346020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156107d75760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016105b0565b6104808286868403610bae565b5f3361045c818585610de9565b5f54610100900460ff161580801561080f57505f54600160ff909116105b806108285750303b15801561082857505f5460ff166001145b61089a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105b0565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156108f6575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6108ff86611327565b61090986866113e5565b60cd805460cc805473ffffffffffffffffffffffffffffffffffffffff8088167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925590851660ff88167401000000000000000000000000000000000000000002919091167fffffffffffffffffffffff000000000000000000000000000000000000000000909216919091171790558015610a00575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b83421115610a585760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e6500000060448201526064016105b0565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610a868c61146b565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f610aed8261149f565b60408051602081018790529081018590527fff0000000000000000000000000000000000000000000000000000000000000060f888901b166060820152909150610b4c908a9083906061016040516020818303038152906040526114e6565b610b985760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e6174757265000060448201526064016105b0565b610ba3898989610bae565b505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c365760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016105b0565b73ffffffffffffffffffffffffffffffffffffffff8216610cbf5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016105b0565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526034602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152603460209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610de35781811015610dd65760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016105b0565b610de38484848403610bae565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e725760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016105b0565b73ffffffffffffffffffffffffffffffffffffffff8216610efb5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016105b0565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526033602052604090205481811015610f965760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016105b0565b73ffffffffffffffffffffffffffffffffffffffff8085165f8181526033602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906110029086815260200190565b60405180910390a3610de3565b5f61049461155e565b6040517fa4c0ed36000000000000000000000000000000000000000000000000000000008152839073ffffffffffffffffffffffffffffffffffffffff82169063a4c0ed369061107090339087908790600401611f06565b5f604051808303815f87803b158015611087575f80fd5b505af1158015611099573d5f803e3d5ffd5b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff82166111065760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016105b0565b8060355f8282546111179190611ece565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f818152603360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6060606780546103ce90611e83565b6060606880546103ce90611e83565b73ffffffffffffffffffffffffffffffffffffffff82166112235760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016105b0565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260336020526040902054818110156112be5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016105b0565b73ffffffffffffffffffffffffffffffffffffffff83165f8181526033602090815260408083208686039055603580548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d20565b505050565b5f54610100900460ff166113a35760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105b0565b6113e2816040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506115d1565b50565b5f54610100900460ff166114615760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105b0565b6105c38282611674565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526099602052604090208054600181018255905b50919050565b5f6104626114ab61100f565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f805f6114f38585611709565b90925090505f81600481111561150b5761150b611f43565b14801561154357508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b80611554575061155486868661174b565b9695505050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6115886118a3565b6115906118fb565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f54610100900460ff1661164d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105b0565b60676116598382611fbb565b5060686116668282611fbb565b50505f606581905560665550565b5f54610100900460ff166116f05760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105b0565b60366116fc8382611fbb565b5060376113228282611fbb565b5f80825160410361173d576020830151604084015160608501515f1a6117318782858561192b565b94509450505050611744565b505f905060025b9250929050565b5f805f8573ffffffffffffffffffffffffffffffffffffffff16631626ba7e60e01b86866040516024016117809291906120d3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161180991906120f3565b5f60405180830381855afa9150503d805f8114611841576040519150601f19603f3d011682016040523d82523d5f602084013e611846565b606091505b509150915081801561185a57506020815110155b8015611554575080517f1626ba7e0000000000000000000000000000000000000000000000000000000090611898908301602090810190840161210e565b149695505050505050565b5f806118ad61117c565b8051909150156118c4578051602090910120919050565b60655480156118d35792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b5f8061190561118b565b80519091501561191c578051602090910120919050565b60665480156118d35792915050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561196057505f90506003611a0a565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156119b1573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611a04575f60019250925050611a0a565b91505f90505b94509492505050565b5f5b83811015611a2d578181015183820152602001611a15565b50505f910152565b5f8151808452611a4c816020860160208601611a13565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f611a906020830184611a35565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611aba575f80fd5b919050565b5f8060408385031215611ad0575f80fd5b611ad983611a97565b946020939093013593505050565b5f805f60608486031215611af9575f80fd5b611b0284611a97565b9250611b1060208501611a97565b9150604084013590509250925092565b5f805f8060608587031215611b33575f80fd5b611b3c85611a97565b935060208501359250604085013567ffffffffffffffff80821115611b5f575f80fd5b818701915087601f830112611b72575f80fd5b813581811115611b80575f80fd5b886020828501011115611b91575f80fd5b95989497505060200194505050565b5f60208284031215611bb0575f80fd5b611a9082611a97565b7fff00000000000000000000000000000000000000000000000000000000000000881681525f602060e06020840152611bf560e084018a611a35565b8381036040850152611c07818a611a35565b6060850189905273ffffffffffffffffffffffffffffffffffffffff8816608086015260a0850187905284810360c0860152855180825260208088019350909101905f5b81811015611c6757835183529284019291840191600101611c4b565b50909c9b505050505050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112611cb5575f80fd5b813567ffffffffffffffff80821115611cd057611cd0611c79565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611d1657611d16611c79565b81604052838152866020858801011115611d2e575f80fd5b836020870160208301375f602085830101528094505050505092915050565b803560ff81168114611aba575f80fd5b5f805f805f60a08688031215611d71575f80fd5b853567ffffffffffffffff80821115611d88575f80fd5b611d9489838a01611ca6565b96506020880135915080821115611da9575f80fd5b50611db688828901611ca6565b945050611dc560408701611d4d565b9250611dd360608701611a97565b9150611de160808701611a97565b90509295509295909350565b5f805f805f805f60e0888a031215611e03575f80fd5b611e0c88611a97565b9650611e1a60208901611a97565b95506040880135945060608801359350611e3660808901611d4d565b925060a0880135915060c0880135905092959891949750929550565b5f8060408385031215611e63575f80fd5b611e6c83611a97565b9150611e7a60208401611a97565b90509250929050565b600181811c90821680611e9757607f821691505b602082108103611499577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b80820180821115610462577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f611f3a6060830184611a35565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b601f82111561132257805f5260205f20601f840160051c81016020851015611f955750805b601f840160051c820191505b81811015611fb4575f8155600101611fa1565b5050505050565b815167ffffffffffffffff811115611fd557611fd5611c79565b611fe981611fe38454611e83565b84611f70565b602080601f83116001811461203b575f84156120055750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610a00565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561208757888601518255948401946001909101908401612068565b50858210156120c357878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b828152604060208201525f6120eb6040830184611a35565b949350505050565b5f8251612104818460208701611a13565b9190910192915050565b5f6020828403121561211e575f80fd5b505191905056fea164736f6c6343000818000a +0x608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d25780639dc29fac11610088578063c820f14611610063578063c820f14614610354578063d505accf14610367578063dd62ed3e1461037a575f80fd5b80639dc29fac1461031b578063a457c2d71461032e578063a9059cbb14610341575f80fd5b80637ecebe00116100b85780637ecebe00146102e557806384b0196e146102f857806395d89b4114610313575f80fd5b806370a0823114610290578063797594b0146102c5575f80fd5b8063313ce56711610127578063395093511161010d57806339509351146102555780634000aea01461026857806340c10f191461027b575f80fd5b8063313ce5671461021d5780633644e5151461024d575f80fd5b8063116191b611610157578063116191b6146101b357806318160ddd146101f857806323b872dd1461020a575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a6103bf565b6040516101879190611a52565b60405180910390f35b6101a361019e366004611a93565b61044f565b6040519015158152602001610187565b60cc546101d39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6035545b604051908152602001610187565b6101a3610218366004611abb565b610468565b60cd5474010000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610187565b6101fc61048b565b6101a3610263366004611a93565b610499565b6101a3610276366004611af4565b6104e4565b61028e610289366004611a93565b61054d565b005b6101fc61029e366004611b74565b73ffffffffffffffffffffffffffffffffffffffff165f9081526033602052604090205490565b60cd546101d39073ffffffffffffffffffffffffffffffffffffffff1681565b6101fc6102f3366004611b74565b6105c7565b6103006105f1565b6040516101879796959493929190611b8d565b61017a6106ae565b61028e610329366004611a93565b6106bd565b6101a361033c366004611a93565b61072e565b6101a361034f366004611a93565b6107e4565b61028e610362366004611d31565b6107f1565b61028e610375366004611dc1565b610a08565b6101fc610388366004611e26565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260346020908152604080832093909416825291909152205490565b6060603680546103ce90611e57565b80601f01602080910402602001604051908101604052809291908181526020018280546103fa90611e57565b80156104455780601f1061041c57610100808354040283529160200191610445565b820191905f5260205f20905b81548152906001019060200180831161042857829003601f168201915b5050505050905090565b5f3361045c818585610b82565b60019150505b92915050565b5f33610475858285610d01565b610480858585610dbd565b506001949350505050565b5f610494610fe3565b905090565b335f81815260346020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919061045c90829086906104df908790611ea2565b610b82565b5f6104ef85856107e4565b5073ffffffffffffffffffffffffffffffffffffffff85163b1561048057610480858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610fec92505050565b60cc5473ffffffffffffffffffffffffffffffffffffffff1633146105b95760405162461bcd60e51b815260206004820152600c60248201527f4f6e6c792047617465776179000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6105c38282611077565b5050565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260996020526040812054610462565b5f6060805f805f60606065545f801b14801561060d5750606654155b6106595760405162461bcd60e51b815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064016105b0565b610661611150565b61066961115f565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6060603780546103ce90611e57565b60cc5473ffffffffffffffffffffffffffffffffffffffff1633146107245760405162461bcd60e51b815260206004820152600c60248201527f4f6e6c792047617465776179000000000000000000000000000000000000000060448201526064016105b0565b6105c3828261116e565b335f81815260346020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156107d75760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016105b0565b6104808286868403610b82565b5f3361045c818585610dbd565b5f54610100900460ff161580801561080f57505f54600160ff909116105b806108285750303b15801561082857505f5460ff166001145b61089a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105b0565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156108f6575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6108ff866112fb565b61090986866113b9565b60cd805460cc805473ffffffffffffffffffffffffffffffffffffffff8088167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925590851660ff88167401000000000000000000000000000000000000000002919091167fffffffffffffffffffffff000000000000000000000000000000000000000000909216919091171790558015610a00575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b83421115610a42576040517fa5faea8300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610a708c61143f565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f610ad782611473565b60408051602081018790529081018590527fff0000000000000000000000000000000000000000000000000000000000000060f888901b166060820152909150610b36908a9083906061016040516020818303038152906040526114ba565b610b6c576040517f3f88fec700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b77898989610b82565b505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c0a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016105b0565b73ffffffffffffffffffffffffffffffffffffffff8216610c935760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016105b0565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526034602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152603460209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610db75781811015610daa5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016105b0565b610db78484848403610b82565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e465760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016105b0565b73ffffffffffffffffffffffffffffffffffffffff8216610ecf5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016105b0565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526033602052604090205481811015610f6a5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016105b0565b73ffffffffffffffffffffffffffffffffffffffff8085165f8181526033602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610fd69086815260200190565b60405180910390a3610db7565b5f610494611532565b6040517fa4c0ed36000000000000000000000000000000000000000000000000000000008152839073ffffffffffffffffffffffffffffffffffffffff82169063a4c0ed369061104490339087908790600401611eda565b5f604051808303815f87803b15801561105b575f80fd5b505af115801561106d573d5f803e3d5ffd5b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff82166110da5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016105b0565b8060355f8282546110eb9190611ea2565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f818152603360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6060606780546103ce90611e57565b6060606880546103ce90611e57565b73ffffffffffffffffffffffffffffffffffffffff82166111f75760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016105b0565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260336020526040902054818110156112925760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016105b0565b73ffffffffffffffffffffffffffffffffffffffff83165f8181526033602090815260408083208686039055603580548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cf4565b505050565b5f54610100900460ff166113775760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105b0565b6113b6816040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506115a5565b50565b5f54610100900460ff166114355760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105b0565b6105c38282611648565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526099602052604090208054600181018255905b50919050565b5f61046261147f610fe3565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f805f6114c785856116dd565b90925090505f8160048111156114df576114df611f17565b14801561151757508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b80611528575061152886868661171f565b9695505050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61155c611877565b6115646118cf565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f54610100900460ff166116215760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105b0565b606761162d8382611f8f565b50606861163a8282611f8f565b50505f606581905560665550565b5f54610100900460ff166116c45760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105b0565b60366116d08382611f8f565b5060376112f68282611f8f565b5f808251604103611711576020830151604084015160608501515f1a611705878285856118ff565b94509450505050611718565b505f905060025b9250929050565b5f805f8573ffffffffffffffffffffffffffffffffffffffff16631626ba7e60e01b86866040516024016117549291906120a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516117dd91906120c7565b5f60405180830381855afa9150503d805f8114611815576040519150601f19603f3d011682016040523d82523d5f602084013e61181a565b606091505b509150915081801561182e57506020815110155b8015611528575080517f1626ba7e000000000000000000000000000000000000000000000000000000009061186c90830160209081019084016120e2565b149695505050505050565b5f80611881611150565b805190915015611898578051602090910120919050565b60655480156118a75792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b5f806118d961115f565b8051909150156118f0578051602090910120919050565b60665480156118a75792915050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561193457505f905060036119de565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611985573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166119d8575f600192509250506119de565b91505f90505b94509492505050565b5f5b83811015611a015781810151838201526020016119e9565b50505f910152565b5f8151808452611a208160208601602086016119e7565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f611a646020830184611a09565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611a8e575f80fd5b919050565b5f8060408385031215611aa4575f80fd5b611aad83611a6b565b946020939093013593505050565b5f805f60608486031215611acd575f80fd5b611ad684611a6b565b9250611ae460208501611a6b565b9150604084013590509250925092565b5f805f8060608587031215611b07575f80fd5b611b1085611a6b565b935060208501359250604085013567ffffffffffffffff80821115611b33575f80fd5b818701915087601f830112611b46575f80fd5b813581811115611b54575f80fd5b886020828501011115611b65575f80fd5b95989497505060200194505050565b5f60208284031215611b84575f80fd5b611a6482611a6b565b7fff00000000000000000000000000000000000000000000000000000000000000881681525f602060e06020840152611bc960e084018a611a09565b8381036040850152611bdb818a611a09565b6060850189905273ffffffffffffffffffffffffffffffffffffffff8816608086015260a0850187905284810360c0860152855180825260208088019350909101905f5b81811015611c3b57835183529284019291840191600101611c1f565b50909c9b505050505050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112611c89575f80fd5b813567ffffffffffffffff80821115611ca457611ca4611c4d565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611cea57611cea611c4d565b81604052838152866020858801011115611d02575f80fd5b836020870160208301375f602085830101528094505050505092915050565b803560ff81168114611a8e575f80fd5b5f805f805f60a08688031215611d45575f80fd5b853567ffffffffffffffff80821115611d5c575f80fd5b611d6889838a01611c7a565b96506020880135915080821115611d7d575f80fd5b50611d8a88828901611c7a565b945050611d9960408701611d21565b9250611da760608701611a6b565b9150611db560808701611a6b565b90509295509295909350565b5f805f805f805f60e0888a031215611dd7575f80fd5b611de088611a6b565b9650611dee60208901611a6b565b95506040880135945060608801359350611e0a60808901611d21565b925060a0880135915060c0880135905092959891949750929550565b5f8060408385031215611e37575f80fd5b611e4083611a6b565b9150611e4e60208401611a6b565b90509250929050565b600181811c90821680611e6b57607f821691505b60208210810361146d577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b80820180821115610462577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f611f0e6060830184611a09565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b601f8211156112f657805f5260205f20601f840160051c81016020851015611f695750805b601f840160051c820191505b81811015611f88575f8155600101611f75565b5050505050565b815167ffffffffffffffff811115611fa957611fa9611c4d565b611fbd81611fb78454611e57565b84611f44565b602080601f83116001811461200f575f8415611fd95750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610a00565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561205b5788860151825594840194600190910190840161203c565b508582101561209757878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b828152604060208201525f6120bf6040830184611a09565b949350505050565b5f82516120d88184602087016119e7565b9190910192915050565b5f602082840312156120f2575f80fd5b505191905056fea164736f6c6343000818000a diff --git a/bindings/bin/multipleversionrollupverifier_deployed.hex b/bindings/bin/multipleversionrollupverifier_deployed.hex index e0f157cb..d8814354 100644 --- a/bindings/bin/multipleversionrollupverifier_deployed.hex +++ b/bindings/bin/multipleversionrollupverifier_deployed.hex @@ -1 +1 @@ -0x608060405234801561000f575f80fd5b50600436106100c4575f3560e01c8063955123061161007d578063c7065b6a11610058578063c7065b6a146101da578063cb23bcb514610227578063f2fde38b14610247575f80fd5b8063955123061461016c578063bd98b2b01461017f578063c4d66de8146101c7575f80fd5b80635027ad2e116100ad5780635027ad2e1461011a578063715018a6146101475780638da5cb5b1461014f575f80fd5b806328aee03f146100c85780632c09a84814610105575b5f80fd5b6100db6100d6366004610a50565b61025a565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b610118610113366004610a70565b610397565b005b610139610128366004610af0565b5f9081526002602052604090205490565b6040519081526020016100fc565b61011861042f565b5f5473ffffffffffffffffffffffffffffffffffffffff166100db565b61011861017a366004610b2f565b610442565b61019261018d366004610a50565b610779565b6040805167ffffffffffffffff909316835273ffffffffffffffffffffffffffffffffffffffff9091166020830152016100fc565b6101186101d5366004610b76565b6107d1565b6101926101e8366004610af0565b60036020525f908152604090205467ffffffffffffffff81169068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6001546100db9073ffffffffffffffffffffffffffffffffffffffff1681565b610118610255366004610b76565b6108a5565b5f82815260036020908152604080832081518083019092525467ffffffffffffffff81168083526801000000000000000090910473ffffffffffffffffffffffffffffffffffffffff16928201929092529083101561038c575f84815260026020526040902054805b8015610389575f86815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff830190811061030a5761030a610b96565b5f9182526020918290206040805180820190915291015467ffffffffffffffff81168083526801000000000000000090910473ffffffffffffffffffffffffffffffffffffffff16928201929092529350851015610389577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016102c3565b50505b602001519392505050565b5f6103a2868661025a565b6040517fc8bd017600000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063c8bd0176906103fb90879087908790600401610bc3565b5f6040518083038186803b158015610411575f80fd5b505afa158015610423573d5f803e3d5ffd5b50505050505050505050565b61043761095c565b6104405f6109dc565b565b61044a61095c565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663059def616040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d89190610c18565b8267ffffffffffffffff161161051a576040517f9a4ff10400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8381526003602090815260409182902082518084019093525467ffffffffffffffff8082168085526801000000000000000090920473ffffffffffffffffffffffffffffffffffffffff169284019290925290841610156105a8576040517fb0d8c70400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166105f5576040517fa7f9319d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805167ffffffffffffffff808516911610156106ba57602081015173ffffffffffffffffffffffffffffffffffffffff16156106ac575f84815260026020908152604082208054600181018255908352918190208351920180549184015173ffffffffffffffffffffffffffffffffffffffff1668010000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090921667ffffffffffffffff909316929092171790555b67ffffffffffffffff831681525b73ffffffffffffffffffffffffffffffffffffffff82811660208381018281525f8881526003835260409081902086518154935190961668010000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090931667ffffffffffffffff96871617929092179091558051888152938716918401919091528201527f7a98750a395b9ee50a2644ffda039e31f1d5d06de45510275f972bb20b229b309060600160405180910390a150505050565b6002602052815f5260405f208181548110610792575f80fd5b5f9182526020909120015467ffffffffffffffff8116925068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16905082565b6107d961095c565b60015473ffffffffffffffffffffffffffffffffffffffff161561085e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f696e697469616c697a656400000000000000000000000000000000000000000060448201526064015b60405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6108ad61095c565b73ffffffffffffffffffffffffffffffffffffffff8116610950576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610855565b610959816109dc565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610440576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610855565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f8060408385031215610a61575f80fd5b50508035926020909101359150565b5f805f805f60808688031215610a84575f80fd5b8535945060208601359350604086013567ffffffffffffffff80821115610aa9575f80fd5b818801915088601f830112610abc575f80fd5b813581811115610aca575f80fd5b896020828501011115610adb575f80fd5b96999598505060200195606001359392505050565b5f60208284031215610b00575f80fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610b2a575f80fd5b919050565b5f805f60608486031215610b41575f80fd5b83359250602084013567ffffffffffffffff81168114610b5f575f80fd5b9150610b6d60408501610b07565b90509250925092565b5f60208284031215610b86575f80fd5b610b8f82610b07565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b60408152826040820152828460608301375f606084830101525f60607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8601168301019050826020830152949350505050565b5f60208284031215610c28575f80fd5b505191905056fea164736f6c6343000818000a +0x608060405234801561000f575f80fd5b50600436106100c4575f3560e01c8063955123061161007d578063c7065b6a11610058578063c7065b6a146101da578063cb23bcb514610227578063f2fde38b14610247575f80fd5b8063955123061461016c578063bd98b2b01461017f578063c4d66de8146101c7575f80fd5b80635027ad2e116100ad5780635027ad2e1461011a578063715018a6146101475780638da5cb5b1461014f575f80fd5b806328aee03f146100c85780632c09a84814610105575b5f80fd5b6100db6100d6366004610a90565b61025a565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b610118610113366004610ab0565b6103d7565b005b610139610128366004610b30565b5f9081526002602052604090205490565b6040519081526020016100fc565b61011861046f565b5f5473ffffffffffffffffffffffffffffffffffffffff166100db565b61011861017a366004610b6f565b610482565b61019261018d366004610a90565b6107b9565b6040805167ffffffffffffffff909316835273ffffffffffffffffffffffffffffffffffffffff9091166020830152016100fc565b6101186101d5366004610bb6565b610811565b6101926101e8366004610b30565b60036020525f908152604090205467ffffffffffffffff81169068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6001546100db9073ffffffffffffffffffffffffffffffffffffffff1681565b610118610255366004610bb6565b6108e5565b5f82815260036020908152604080832081518083019092525467ffffffffffffffff81168083526801000000000000000090910473ffffffffffffffffffffffffffffffffffffffff1692820192909252908310156103cc575f84815260026020526040812054805b8015610391575f87815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff830190811061030a5761030a610bd6565b5f9182526020918290206040805180820190915291015467ffffffffffffffff81168083526801000000000000000090910473ffffffffffffffffffffffffffffffffffffffff16928201929092529450861061036a5760019250610391565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016102c3565b50816103c9576040517f70f6c8ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505b602001519392505050565b5f6103e2868661025a565b6040517fc8bd017600000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063c8bd01769061043b90879087908790600401610c03565b5f6040518083038186803b158015610451575f80fd5b505afa158015610463573d5f803e3d5ffd5b50505050505050505050565b61047761099c565b6104805f610a1c565b565b61048a61099c565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663059def616040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105189190610c58565b8267ffffffffffffffff161161055a576040517f9a4ff10400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8381526003602090815260409182902082518084019093525467ffffffffffffffff8082168085526801000000000000000090920473ffffffffffffffffffffffffffffffffffffffff169284019290925290841610156105e8576040517fb0d8c70400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216610635576040517fa7f9319d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805167ffffffffffffffff808516911610156106fa57602081015173ffffffffffffffffffffffffffffffffffffffff16156106ec575f84815260026020908152604082208054600181018255908352918190208351920180549184015173ffffffffffffffffffffffffffffffffffffffff1668010000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090921667ffffffffffffffff909316929092171790555b67ffffffffffffffff831681525b73ffffffffffffffffffffffffffffffffffffffff82811660208381018281525f8881526003835260409081902086518154935190961668010000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090931667ffffffffffffffff96871617929092179091558051888152938716918401919091528201527f7a98750a395b9ee50a2644ffda039e31f1d5d06de45510275f972bb20b229b309060600160405180910390a150505050565b6002602052815f5260405f2081815481106107d2575f80fd5b5f9182526020909120015467ffffffffffffffff8116925068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16905082565b61081961099c565b60015473ffffffffffffffffffffffffffffffffffffffff161561089e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f696e697469616c697a656400000000000000000000000000000000000000000060448201526064015b60405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6108ed61099c565b73ffffffffffffffffffffffffffffffffffffffff8116610990576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610895565b61099981610a1c565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610480576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610895565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f8060408385031215610aa1575f80fd5b50508035926020909101359150565b5f805f805f60808688031215610ac4575f80fd5b8535945060208601359350604086013567ffffffffffffffff80821115610ae9575f80fd5b818801915088601f830112610afc575f80fd5b813581811115610b0a575f80fd5b896020828501011115610b1b575f80fd5b96999598505060200195606001359392505050565b5f60208284031215610b40575f80fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610b6a575f80fd5b919050565b5f805f60608486031215610b81575f80fd5b83359250602084013567ffffffffffffffff81168114610b9f575f80fd5b9150610bad60408501610b47565b90509250925092565b5f60208284031215610bc6575f80fd5b610bcf82610b47565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b60408152826040820152828460608301375f606084830101525f60607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8601168301019050826020830152949350505050565b5f60208284031215610c68575f80fd5b505191905056fea164736f6c6343000818000a diff --git a/bindings/bin/rollup_deployed.hex b/bindings/bin/rollup_deployed.hex index aee01dec..8f137b13 100644 --- a/bindings/bin/rollup_deployed.hex +++ b/bindings/bin/rollup_deployed.hex @@ -1 +1 @@ -0x6080604052600436106102f0575f3560e01c80638da5cb5b11610186578063b3e0a509116100dc578063ddd8a3dc11610087578063e3fff1dd11610062578063e3fff1dd14610951578063f2fde38b14610970578063fb1e8b041461098f575f80fd5b8063ddd8a3dc146108fe578063de8b30351461091d578063dff7827e1461093c575f80fd5b8063ce5db8d6116100b7578063ce5db8d6146108b7578063d279c191146108cc578063d63b3549146108eb575f80fd5b8063b3e0a50914610866578063bedb86fb14610885578063cd4edc69146108a4575f80fd5b8063a479265d1161013c578063b31a77d311610117578063b31a77d314610813578063b348442514610828578063b35dac4e14610847575f80fd5b8063a479265d146107b4578063a4f209b0146107c9578063abc8d68d146107e8575f80fd5b8063910129d41161016c578063910129d41461073657806397fc007c14610767578063a415d8dc14610786575f80fd5b80638da5cb5b146106695780638f1d377614610686575f80fd5b80632571098d116102465780635ef7a94a116101f1578063715018a6116101cc578063715018a61461061d578063728cdbca1461063157806388b1ea0914610650575f80fd5b80635ef7a94a146105525780635f77cf1d146105b25780636c578c1d146105fe575f80fd5b80633e001b66116102215780633e001b661461050757806357e0af6c1461051c5780635c975abb1461053b575f80fd5b80632571098d146104865780632b7ac3f3146104b15780633b70c18a146104e8575f80fd5b8063121dcd50116102a657806318af3b2b1161028157806318af3b2b1461040c57806321e2f9e01461043c5780632362f03e1461045b575f80fd5b8063121dcd50146103c357806313361101146103d857806318463fb0146103f7575f80fd5b80630ceb6780116102d65780630ceb67801461036157806310d4458314610382578063116a1f42146103a1575f80fd5b806304d77215146102fb578063059def611461033e575f80fd5b366102f757005b5f80fd5b348015610306575f80fd5b50610329610315366004613f76565b60a36020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b348015610349575f80fd5b50610353609d5481565b604051908152602001610335565b34801561036c575f80fd5b5061038061037b366004613fa8565b6109a4565b005b34801561038d575f80fd5b5061038061039c366004614006565b610a76565b3480156103ac575f80fd5b506103296103bb366004613f76565b609d54101590565b3480156103ce575f80fd5b50610353609e5481565b3480156103e3575f80fd5b506103806103f236600461404e565b610dcf565b348015610402575f80fd5b5061035360a75481565b348015610417575f80fd5b50610329610426366004613f76565b5f90815260a26020526040902060010154421090565b348015610447575f80fd5b50610329610456366004613f76565b6112a4565b348015610466575f80fd5b50610353610475366004613f76565b60a16020525f908152604090205481565b348015610491575f80fd5b506103536104a0366004613f76565b60a06020525f908152604090205481565b3480156104bc575f80fd5b50609c546104d0906001600160a01b031681565b6040516001600160a01b039091168152602001610335565b3480156104f3575f80fd5b50609b546104d0906001600160a01b031681565b348015610512575f80fd5b5061035360aa5481565b348015610527575f80fd5b50610380610536366004613f76565b6112d2565b348015610546575f80fd5b5060655460ff16610329565b34801561055d575f80fd5b5061059261056c366004613f76565b60a26020525f908152604090208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001610335565b3480156105bd575f80fd5b506105e57f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610335565b348015610609575f80fd5b50610380610618366004613fa8565b61137d565b348015610628575f80fd5b5061038061143a565b34801561063c575f80fd5b5061038061064b36600461408d565b61144d565b34801561065b575f80fd5b5060a6546103299060ff1681565b348015610674575f80fd5b506033546001600160a01b03166104d0565b348015610691575f80fd5b506106f26106a0366004613f76565b60a46020525f9081526040902080546001820154600283015460039093015467ffffffffffffffff831693680100000000000000009093046001600160a01b0316929060ff8082169161010090041686565b6040805167ffffffffffffffff90971687526001600160a01b03909516602087015293850192909252606084015215156080830152151560a082015260c001610335565b348015610741575f80fd5b50610329610750366004613f76565b5f90815260a4602052604090206003015460ff1690565b348015610772575f80fd5b50610380610781366004613fa8565b611790565b348015610791575f80fd5b506103296107a0366004613fa8565b609f6020525f908152604090205460ff1681565b3480156107bf575f80fd5b5061035360995481565b3480156107d4575f80fd5b506103806107e3366004613f76565b611873565b3480156107f3575f80fd5b50610353610802366004613fa8565b60a56020525f908152604090205481565b34801561081e575f80fd5b5061035360a85481565b348015610833575f80fd5b506103806108423660046140e8565b611923565b348015610852575f80fd5b50610380610861366004613fa8565b611b68565b348015610871575f80fd5b5061038061088036600461404e565b611bc1565b348015610890575f80fd5b5061038061089f36600461415c565b611eb9565b6103806108b2366004614177565b612014565b3480156108c2575f80fd5b5061035360985481565b3480156108d7575f80fd5b506103806108e6366004613fa8565b6125e0565b6103806108f93660046141ad565b61269f565b348015610909575f80fd5b506097546104d0906001600160a01b031681565b348015610928575f80fd5b50610329610937366004613f76565b612f59565b348015610947575f80fd5b50610353609a5481565b34801561095c575f80fd5b5061038061096b366004613f76565b612fa3565b34801561097b575f80fd5b5061038061098a366004613fa8565b613046565b34801561099a575f80fd5b5061035360a95481565b6109ac6130d3565b6001600160a01b0381165f908152609f602052604090205460ff1615610a195760405162461bcd60e51b815260206004820152601f60248201527f6163636f756e7420697320616c72656164792061206368616c6c656e6765720060448201526064015b60405180910390fd5b6001600160a01b0381165f818152609f6020908152604091829020805460ff1916600190811790915591519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc00991015b60405180910390a250565b610a7e6130d3565b5f8111610acd5760405162461bcd60e51b815260206004820152601560248201527f636f756e74206d757374206265206e6f6e7a65726f00000000000000000000006044820152606401610a10565b5f80610ad9858561312d565b915091505f610aec836001015160c01c90565b5f81815260a160205260409020549091508214610b4b5760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a10565b5f60a181610b598785614247565b81526020019081526020015f205414610bd95760405162461bcd60e51b8152602060048201526024808201527f726576657274696e67206d7573742073746172742066726f6d2074686520656e60448201527f64696e67000000000000000000000000000000000000000000000000000000006064820152608401610a10565b609d548111610c505760405162461bcd60e51b815260206004820152602160248201527f63616e206f6e6c792072657665727420756e46696e616c697a6564206261746360448201527f68000000000000000000000000000000000000000000000000000000000000006064820152608401610a10565b610c5b60018261425a565b609e555b8315610dc757604051829082907ecae2739091badfd91c373f0a16cede691e0cd25bb80cff77dd5caeb4710146905f90a35f81815260a16020526040812055610ca781612f59565b15610d02575f81815260a460209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a59092528220805491929091610cf2908490614247565b909155505060a6805460ff191690555b5f81815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a85415801590610d7f575060a85481145b15610d89575f60a8555b6001015f81815260a160205260409020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90940193915081610c5f575b505050505050565b60a85415610e1f5760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a10565b610e27613148565b5f80610e33848461312d565b915091505f610e46836001015160c01c90565b5f81815260a160205260409020549091508214610ea55760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a10565b610eae816112a4565b610efa5760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610a10565b610f0381612f59565b15610f505760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610a10565b5f81815260a4602052604090206003015460ff1615610fb15760405162461bcd60e51b815260206004820152601660248201527f62617463682073686f756c6420626520726576657274000000000000000000006044820152606401610a10565b5f81815260a260205260409020600101544210156110115760405162461bcd60e51b815260206004820152601960248201527f626174636820696e206368616c6c656e67652077696e646f77000000000000006044820152606401610a10565b605983015160a05f61102460018561425a565b81526020019081526020015f20541461107f5760405162461bcd60e51b815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610a10565b5f81815260a06020526040902054156110da5760405162461bcd60e51b815260206004820152601660248201527f626174636820616c7265616479207665726966696564000000000000000000006044820152606401610a10565b80609d546001011461112e5760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610a10565b609d819055600160a35f611143866099015190565b815260208101919091526040015f20805460ff191691151591909117905560798301515f82815260a0602052604090205561119060f98401601185015160c01c600986015160c01c61319b565b60a25f61119e60018461425a565b815260208101919091526040015f908120818155600180820183905560028201839055600390910182905560a491906111d7908461425a565b815260208082019290925260409081015f90812080547fffffffff00000000000000000000000000000000000000000000000000000000168155600181018290556002810182905560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905583815260a1909252902054817f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d611280866079015190565b60998701516040805192835260208301919091520160405180910390a35050505050565b5f81815260a26020526040812054158015906112cc57505f82815260a1602052604090205415155b92915050565b6112da6130d3565b5f811180156112eb57506099548114155b6113375760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964206e65772070726f6f662077696e646f7700000000000000006044820152606401610a10565b609980549082905560408051828152602081018490527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a6191015b60405180910390a15050565b6113856130d3565b6001600160a01b0381165f908152609f602052604090205460ff166113ec5760405162461bcd60e51b815260206004820152601b60248201527f6163636f756e74206973206e6f742061206368616c6c656e67657200000000006044820152606401610a10565b6001600160a01b0381165f818152609f60209081526040808320805460ff19169055519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc0099101610a6b565b6114426130d3565b61144b5f613264565b565b5f54610100900460ff161580801561146b57505f54600160ff909116105b806114845750303b15801561148457505f5460ff166001145b6114f65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a10565b5f805460ff191660011790558015611534575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b038616158061155157506001600160a01b038516155b15611588576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0387166115de5760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206c31207374616b696e6720636f6e747261637400000000006044820152606401610a10565b6115e66132cd565b6115ee613351565b609780546001600160a01b03808a167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255609b8054898416908316179055609c805492881692909116821790556098859055609984905560a98390556040515f907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96908290a3604080515f8152602081018690527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a437910160405180910390a1604080515f8152602081018590527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a61910160405180910390a1604080515f8152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b0223910160405180910390a18015611787575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b6117986130d3565b6001600160a01b038116158015906117be5750609c546001600160a01b03828116911614155b61180a5760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964206e65772076657269666965720000000000000000000000006044820152606401610a10565b609c80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96905f90a35050565b61187b6130d3565b5f8111801561188b575060648111155b8015611899575060a9548114155b6118e55760405162461bcd60e51b815260206004820152601f60248201527f696e76616c69642070726f6f66207265776172642070657263656e74616765006044820152606401610a10565b60a980549082905560408051828152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b02239101611371565b60a854156119735760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a10565b61197b613148565b5f80611987868661312d565b915091505f61199a836001015160c01c90565b5f81815260a1602052604090205490915082146119f95760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a10565b611a0281612f59565b611a4e5760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610a10565b5f81815260a4602052604090206003810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560a6805460ff191690556099546002909101544291611aa791614247565b11611b1d575f81815260a4602090815260408083206003908101805460ff1916600117905560a2835292819020909201548251808401909352600783527f54696d656f75740000000000000000000000000000000000000000000000000091830191909152611b18918391906133d5565b611787565b611b28838686613531565b61178781336040518060400160405280600d81526020017f50726f6f662073756363657373000000000000000000000000000000000000008152506136e4565b611b706130d3565b60aa80545f909155611b8282826137b0565b604080516001600160a01b0384168152602081018390527fb1b2058a6969e2d25e47bcaebe8ae21c29a23b2752429315b75e2f4f285f3d879101611371565b611bc96130d3565b5f805260a06020527fb84a74ec6ef4d0e83b6006dfaa014ab4026f9f3b97d186e604d29998a4e808ea5415611c405760405162461bcd60e51b815260206004820152601660248201527f67656e6573697320626174636820696d706f72746564000000000000000000006044820152606401610a10565b5f80611c4c848461312d565b915091505f611c5f836001015160c01c90565b90505f611c6d846079015190565b905080611cbc5760405162461bcd60e51b815260206004820152600f60248201527f7a65726f20737461746520726f6f7400000000000000000000000000000000006044820152606401610a10565b600984015160c01c15611d115760405162461bcd60e51b815260206004820152601d60248201527f6c31206d65737361676520706f707065642073686f756c6420626520300000006044820152606401610a10565b5f611d1d856019015190565b03611d6a5760405162461bcd60e51b815260206004820152600e60248201527f7a65726f206461746120686173680000000000000000000000000000000000006044820152606401610a10565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014611d96856039015190565b14611de35760405162461bcd60e51b815260206004820152601660248201527f696e76616c69642076657273696f6e65642068617368000000000000000000006044820152606401610a10565b5f82815260a1602090815260408083208690558051608081018252428082528184019081528183018581526060830186815288875260a2865284872093518455915160018401555160028301555160039091015560a0909152808220839055609e849055609d84905551849184917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a3604080518281525f6020820152849184917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d910160405180910390a3505050505050565b611ec16130d3565b8015611fe257611ecf61385b565b60a65460ff1615611fa15760a7545f90815260a460209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a59092528220805491929091611f23908490614247565b909155505060a7545f90815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a6805460ff191690555b7f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b6040516001600160a01b03909116815260200160405180910390a150565b611fea6138b5565b7f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33611fc4565b50565b335f908152609f602052604090205460ff166120725760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206368616c6c656e67657220616c6c6f776564000000000000006044820152606401610a10565b60a854156120c25760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a10565b6120ca613148565b60a65460ff161561211d5760405162461bcd60e51b815260206004820152601460248201527f616c726561647920696e206368616c6c656e67650000000000000000000000006044820152606401610a10565b8167ffffffffffffffff16609d54106121785760405162461bcd60e51b815260206004820152601760248201527f626174636820616c72656164792066696e616c697a65640000000000000000006044820152606401610a10565b67ffffffffffffffff82165f90815260a1602052604090205481146121df5760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a10565b6121f28267ffffffffffffffff166112a4565b61223e5760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610a10565b67ffffffffffffffff82165f90815260a460205260409020546801000000000000000090046001600160a01b0316156122b95760405162461bcd60e51b815260206004820152601860248201527f626174636820616c7265616479206368616c6c656e67656400000000000000006044820152606401610a10565b67ffffffffffffffff82165f90815260a2602052604090206001015442106123495760405162461bcd60e51b815260206004820152603360248201527f63616e6e6f74206368616c6c656e6765206261746368206f757473696465207460448201527f6865206368616c6c656e67652077696e646f77000000000000000000000000006064820152608401610a10565b60975f9054906101000a90046001600160a01b03166001600160a01b0316630d13fd7b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612399573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123bd919061426d565b34101561240c5760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742076616c756500000000000000000000000000006044820152606401610a10565b67ffffffffffffffff82811660a78190556040805160c0810182528281523360208083018281523484860190815242606086019081525f6080870181815260a0880182815299825260a4909552969096209451855492516001600160a01b031668010000000000000000027fffffffff00000000000000000000000000000000000000000000000000000000909316981697909717178355945160018301559151600282015592516003909301805492511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff941515949094167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909316929092179290921790556001600160a01b03168267ffffffffffffffff167f3a6ea19df25b49e7624e313ce7c1ab23984238e93727260db56a81735b1b99763460405161255e91815260200190565b60405180910390a35f609d5460016125769190614247565b90505b609e5481116125ce578267ffffffffffffffff1681146125bc576099545f82815260a26020526040812060010180549091906125b6908490614247565b90915550505b806125c681614284565b915050612579565b505060a6805460ff1916600117905550565b335f90815260a560205260408120549081900361263f5760405162461bcd60e51b815260206004820152601c60248201527f696e76616c69642062617463684368616c6c656e6765526577617264000000006044820152606401610a10565b335f90815260a5602052604081205561265882826137b0565b816001600160a01b03167f9c25fa83f414ed363c8d39c98fb3e17567b3431cede71eb062c49d2a63ce247a8260405161269391815260200190565b60405180910390a25050565b6097546001600160a01b03166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561270b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061272f91906142bb565b61277b5760405162461bcd60e51b815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f7765640000000000006044820152606401610a10565b60a854156127cb5760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a10565b6127d3613148565b6127e060208301836142d6565b60ff16156128305760405162461bcd60e51b815260206004820152600f60248201527f696e76616c69642076657273696f6e00000000000000000000000000000000006044820152606401610a10565b5f61283e60408401846142f6565b9150508061288e5760405162461bcd60e51b815260206004820152600e60248201527f626174636820697320656d7074790000000000000000000000000000000000006044820152606401610a10565b60808301356128df5760405162461bcd60e51b815260206004820152601b60248201527f70726576696f757320737461746520726f6f74206973207a65726f00000000006044820152606401610a10565b60a08301356129305760405162461bcd60e51b815260206004820152601660248201527f6e657720737461746520726f6f74206973207a65726f000000000000000000006044820152606401610a10565b5f8061294761294260208701876142f6565b61312d565b915091505f61295a836001015160c01c90565b5f81815260a1602052604090205490915082146129b95760405162461bcd60e51b815260206004820152601b60248201527f696e636f727265637420706172656e74206261746368206861736800000000006044820152606401610a10565b5f60a1816129c8846001614247565b81526020019081526020015f205414612a235760405162461bcd60e51b815260206004820152601760248201527f626174636820616c726561647920636f6d6d69747465640000000000000000006044820152606401610a10565b609e548114612a745760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610a10565b5f612a83846011015160c01c90565b90505f8080612ae2612a9860408c018c6142f6565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250879250889150612add905060608f018f6142f6565b6138ee565b948501949384019392509050612afb60608b018b6142f6565b905061010060ff85010460200214612b555760405162461bcd60e51b815260206004820152601360248201527f77726f6e67206269746d6170206c656e677468000000000000000000000000006044820152606401610a10565b600194909401935f804915612b6b575f49612b8d565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440145b90505f612b9d60608d018d6142f6565b612ba9915060f9614247565b90506040519850602081028901604052612bd7898d5f016020810190612bcf91906142d6565b60ff16613a6f565b60c087811b60018b015285811b60098b015286811b60118b015260198a0184905260808d013560598b015260a08d013560798b01528c013560998a0152612c4489612c2560208e018e6142f6565b604051612c33929190614357565b604051809103902060b99190910152565b60d98901889052612c6189612c5c60608f018f6142f6565b613a76565b603989018290528089205f88815260a1602052604081209190915560a65460ff1615612cb65760a7545f90815260a460205260409020600201546099544291612ca991614247565b612cb3919061425a565b90505b60405180608001604052804281526020018260985442612cd69190614247565b612ce09190614247565b8152602001612d318f8060400190612cf891906142f6565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250613a8292505050565b81526097546020909101906001600160a01b031663d096c3c6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015612da5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dc9919061426d565b90525f89815260a2602090815260409182902083518155838201516001820155918301516002830155606090920151600390910155609e8990556097546001600160a01b031692506374fe27b791508c3590612e3190612e2b908f018f6142f6565b5f613ad9565b5f8e8060400190612e4291906142f6565b6040518663ffffffff1660e01b8152600401612e629594939291906143ad565b602060405180830381865afa158015612e7d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ea191906142bb565b612f135760405162461bcd60e51b815260206004820152602160248201527f746865207369676e617475726520766572696669636174696f6e206661696c6560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610a10565b5f86815260a16020526040808220549051909188917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a35050505050505050505050565b5f81815260a460205260408120546801000000000000000090046001600160a01b0316158015906112cc5750505f90815260a46020526040902060030154610100900460ff161590565b612fab6130d3565b5f81118015612fbc57506098548114155b6130085760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206e65772066696e616c697a6520706572696f6400000000006044820152606401610a10565b609880549082905560408051828152602081018490527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a4379101611371565b61304e6130d3565b6001600160a01b0381166130ca5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a10565b61201181613264565b6033546001600160a01b0316331461144b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a10565b5f805f61313a8585613b2d565b812090969095509350505050565b60655460ff161561144b5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a10565b805f036131a757505050565b8082035f805b83811015610dc7576101008185038111156131c757508084035b8651609b546040517f55f613ce0000000000000000000000000000000000000000000000000000000081526004810187905260248101849052604481018390526020909901989194506001600160a01b0316906355f613ce906064015f604051808303815f87803b15801561323a575f80fd5b505af115801561324c573d5f803e3d5ffd5b505050506101008401935050610100810190506131ad565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff166133495760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a10565b61144b613c04565b5f54610100900460ff166133cd5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a10565b61144b613c8c565b60a88390555f83815260a460205260408082205460975491517f45bc4d1000000000000000000000000000000000000000000000000000000000815260048101869052680100000000000000009091046001600160a01b03908116939216906345bc4d10906024016020604051808303815f875af1158015613459573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061347d919061426d565b5f86815260a4602052604090206001015490915061349c908290614247565b5f86815260a460209081526040808320546801000000000000000090046001600160a01b0316835260a5909152812080549091906134db908490614247565b90915550506040516134ee908490614420565b604051908190038120906001600160a01b0384169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b8061357e5760405162461bcd60e51b815260206004820152601360248201527f496e76616c69642062617463682070726f6f66000000000000000000000000006044820152606401610a10565b5f61358d846001015160c01c90565b90505f61359b856039015190565b90505f7f00000000000000000000000000000000000000000000000000000000000000006135ca876059015190565b6079880151609989015160b98a015160198b015160405160c09690961b7fffffffffffffffff000000000000000000000000000000000000000000000000166020870152602886019490945260488501929092526068840152608883015260a882015260c8810183905260e801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120609c549091506001600160a01b0316632c09a84861368c885160f81c90565b858888866040518663ffffffff1660e01b81526004016136b095949392919061444c565b5f6040518083038186803b1580156136c6575f80fd5b505afa1580156136d8573d5f803e3d5ffd5b50505050505050505050565b5f83815260a4602052604081206001015460a954909190606490613708908461447d565b6137129190614494565b905061371e818361425a565b60aa5f82825461372e9190614247565b90915550506001600160a01b0384165f90815260a560205260408120805483929061375a908490614247565b909155505060405161376d908490614420565b604051908190038120906001600160a01b0386169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b8015613857575f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146137ff576040519150601f19603f3d011682016040523d82523d5f602084013e613804565b606091505b50509050806138555760405162461bcd60e51b815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c656400000000006044820152606401610a10565b505b5050565b613863613148565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586138983390565b6040516001600160a01b03909116815260200160405180910390a1565b6138bd613d11565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33613898565b60405185515f9182916020890191908190849061390c908590613d63565b90506002840193505f5b8181101561399057603c81028501805184526020908101517fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000001690840152603a830192505f613966603c8361447d565b6139709087614247565b90505f61398182603a015160f01c90565b97909701965050600101613916565b506020850282016040525b8015613a5b575f6139b085603a015160f01c90565b90506139c083828d8d8d8d613df8565b92505f6139d1866038015160f01c90565b905081811015613a235760405162461bcd60e51b815260206004820152601d60248201527f6e756d20747873206c657373207468616e206e756d204c31206d7367730000006044820152606401610a10565b50998a01999890980197603c93909301927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161399b565b508190039020989197509095505050505050565b8082535050565b808260f9850137505050565b5f805f6020840190506002810191505f613a9d828651613d63565b90505f5b613aac60018361425a565b811015613ac257603c9390930192600101613aa1565b505f613acf845160c01c90565b9695505050505050565b60605f80808080613aec888a018a6145b9565b9550955095509550955050818710613b0a579450613b269350505050565b838710613b1e578295505050505050613b26565b509293505050505b9392505050565b5f8160f9811015613b805760405162461bcd60e51b815260206004820152601d60248201527f626174636820686561646572206c656e67746820746f6f20736d616c6c0000006044820152606401610a10565b6040519150808483378082016040525f613b9e836009015160c01c90565b905061010060ff82010460200260f9018214613bfc5760405162461bcd60e51b815260206004820152601360248201527f77726f6e67206269746d6170206c656e677468000000000000000000000000006044820152606401610a10565b509250929050565b5f54610100900460ff16613c805760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a10565b6065805460ff19169055565b5f54610100900460ff16613d085760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a10565b61144b33613264565b60655460ff1661144b5760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610a10565b5f613d6f835160f01c90565b9050805f03613daa576040517f5168407700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613db5603c8261447d565b613dc0906002614247565b82146112cc576040517f4a969e2d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f855f03613e07575085613acf565b609b546001600160a01b03165f80805b89811015613eed5760ff89169150600889901c811580613e35575082155b15613e44578060200288013593505b600184841c165f03613edc576040517fae453cd5000000000000000000000000000000000000000000000000000000008152600481018a90525f906001600160a01b0387169063ae453cd590602401602060405180830381865afa158015613eae573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ed2919061426d565b8d52506020909b019a5b506001988901989788019701613e17565b505060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff88011681811c60011615613f685760405162461bcd60e51b815260206004820152601b60248201527f63616e6e6f7420736b6970206c617374204c31206d65737361676500000000006044820152606401610a10565b509798975050505050505050565b5f60208284031215613f86575f80fd5b5035919050565b80356001600160a01b0381168114613fa3575f80fd5b919050565b5f60208284031215613fb8575f80fd5b613b2682613f8d565b5f8083601f840112613fd1575f80fd5b50813567ffffffffffffffff811115613fe8575f80fd5b602083019150836020828501011115613fff575f80fd5b9250929050565b5f805f60408486031215614018575f80fd5b833567ffffffffffffffff81111561402e575f80fd5b61403a86828701613fc1565b909790965060209590950135949350505050565b5f806020838503121561405f575f80fd5b823567ffffffffffffffff811115614075575f80fd5b61408185828601613fc1565b90969095509350505050565b5f805f805f8060c087890312156140a2575f80fd5b6140ab87613f8d565b95506140b960208801613f8d565b94506140c760408801613f8d565b9350606087013592506080870135915060a087013590509295509295509295565b5f805f80604085870312156140fb575f80fd5b843567ffffffffffffffff80821115614112575f80fd5b61411e88838901613fc1565b90965094506020870135915080821115614136575f80fd5b5061414387828801613fc1565b95989497509550505050565b8015158114612011575f80fd5b5f6020828403121561416c575f80fd5b8135613b268161414f565b5f8060408385031215614188575f80fd5b823567ffffffffffffffff8116811461419f575f80fd5b946020939093013593505050565b5f80604083850312156141be575f80fd5b823567ffffffffffffffff808211156141d5575f80fd5b9084019060e082870312156141e8575f80fd5b909250602084013590808211156141fd575f80fd5b5083016060818603121561420f575f80fd5b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156112cc576112cc61421a565b818103818111156112cc576112cc61421a565b5f6020828403121561427d575f80fd5b5051919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036142b4576142b461421a565b5060010190565b5f602082840312156142cb575f80fd5b8151613b268161414f565b5f602082840312156142e6575f80fd5b813560ff81168114613b26575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614329575f80fd5b83018035915067ffffffffffffffff821115614343575f80fd5b602001915036819003821315613fff575f80fd5b818382375f9101908152919050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f6080820187835260206080602085015281885180845260a08601915060208a0193505f5b818110156143f75784516001600160a01b0316835293830193918301916001016143d2565b50508760408601528481036060860152614412818789614366565b9a9950505050505050505050565b5f82515f5b8181101561443f5760208186018101518583015201614425565b505f920191825250919050565b858152846020820152608060408201525f61446b608083018587614366565b90508260608301529695505050505050565b80820281158282048414176112cc576112cc61421a565b5f826144c7577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112614508575f80fd5b8135602067ffffffffffffffff80831115614525576145256144cc565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108482111715614568576145686144cc565b6040529384526020818701810194908101925087851115614587575f80fd5b6020870191505b848210156145ae5761459f82613f8d565b8352918301919083019061458e565b979650505050505050565b5f805f805f8060c087890312156145ce575f80fd5b86359550602087013567ffffffffffffffff808211156145ec575f80fd5b6145f88a838b016144f9565b9650604089013595506060890135915080821115614614575f80fd5b6146208a838b016144f9565b94506080890135935060a089013591508082111561463c575f80fd5b5061464989828a016144f9565b915050929550929550929556fea164736f6c6343000818000a +0x608060405260043610610306575f3560e01c8063728cdbca11610191578063b35dac4e116100dc578063ddd8a3dc11610087578063e3fff1dd11610062578063e3fff1dd146109b1578063f2fde38b146109d0578063fb1e8b04146109ef575f80fd5b8063ddd8a3dc1461095e578063de8b30351461097d578063dff7827e1461099c575f80fd5b8063cd4edc69116100b7578063cd4edc6914610917578063ce5db8d61461092a578063d279c1911461093f575f80fd5b8063b35dac4e146108ba578063b3e0a509146108d9578063bedb86fb146108f8575f80fd5b8063a415d8dc1161013c578063abc8d68d11610117578063abc8d68d1461085b578063b31a77d314610886578063b34844251461089b575f80fd5b8063a415d8dc146107f9578063a479265d14610827578063a4f209b01461083c575f80fd5b80638f1d37761161016c5780638f1d3776146106f9578063910129d4146107a957806397fc007c146107da575f80fd5b8063728cdbca146106a457806388b1ea09146106c35780638da5cb5b146106dc575f80fd5b80632b7ac3f3116102515780635ef7a94a116101fc57806368589dfa116101d757806368589dfa146106465780636c578c1d14610671578063715018a614610690575f80fd5b80635ef7a94a1461057b5780635f77cf1d146105db5780636126729014610627575f80fd5b8063428868b51161022c578063428868b51461053257806357e0af6c146105455780635c975abb14610564575f80fd5b80632b7ac3f3146104c75780633b70c18a146104fe5780633e001b661461051d575f80fd5b806313361101116102b157806321e2f9e01161028c57806321e2f9e0146104525780632362f03e146104715780632571098d1461049c575f80fd5b806313361101146103ee57806318463fb01461040d57806318af3b2b14610422575f80fd5b806310d44583116102e157806310d4458314610398578063116a1f42146103b7578063121dcd50146103d9575f80fd5b806304d7721514610311578063059def61146103545780630ceb678014610377575f80fd5b3661030d57005b5f80fd5b34801561031c575f80fd5b5061033f61032b3660046140c8565b60a36020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561035f575f80fd5b50610369609d5481565b60405190815260200161034b565b348015610382575f80fd5b506103966103913660046140fa565b610a04565b005b3480156103a3575f80fd5b506103966103b2366004614158565b610ad6565b3480156103c2575f80fd5b5061033f6103d13660046140c8565b609d54101590565b3480156103e4575f80fd5b50610369609e5481565b3480156103f9575f80fd5b506103966104083660046141a0565b610e2f565b348015610418575f80fd5b5061036960a75481565b34801561042d575f80fd5b5061033f61043c3660046140c8565b5f90815260a26020526040902060010154421090565b34801561045d575f80fd5b5061033f61046c3660046140c8565b611326565b34801561047c575f80fd5b5061036961048b3660046140c8565b60a16020525f908152604090205481565b3480156104a7575f80fd5b506103696104b63660046140c8565b60a06020525f908152604090205481565b3480156104d2575f80fd5b50609c546104e6906001600160a01b031681565b6040516001600160a01b03909116815260200161034b565b348015610509575f80fd5b50609b546104e6906001600160a01b031681565b348015610528575f80fd5b5061036960aa5481565b6103966105403660046141df565b611354565b348015610550575f80fd5b5061039661055f3660046140c8565b611bbb565b34801561056f575f80fd5b5060655460ff1661033f565b348015610586575f80fd5b506105bb6105953660046140c8565b60a26020525f908152604090208054600182015460028301546003909301549192909184565b60408051948552602085019390935291830152606082015260800161034b565b3480156105e6575f80fd5b5061060e7f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff909116815260200161034b565b348015610632575f80fd5b506103966106413660046140c8565b611c66565b348015610651575f80fd5b506103696106603660046140c8565b60ab6020525f908152604090205481565b34801561067c575f80fd5b5061039661068b3660046140fa565b611e7b565b34801561069b575f80fd5b50610396611f38565b3480156106af575f80fd5b506103966106be36600461424c565b611f4b565b3480156106ce575f80fd5b5060a65461033f9060ff1681565b3480156106e7575f80fd5b506033546001600160a01b03166104e6565b348015610704575f80fd5b506107656107133660046140c8565b60a46020525f9081526040902080546001820154600283015460039093015467ffffffffffffffff831693680100000000000000009093046001600160a01b0316929060ff8082169161010090041686565b6040805167ffffffffffffffff90971687526001600160a01b03909516602087015293850192909252606084015215156080830152151560a082015260c00161034b565b3480156107b4575f80fd5b5061033f6107c33660046140c8565b5f90815260a4602052604090206003015460ff1690565b3480156107e5575f80fd5b506103966107f43660046140fa565b61228e565b348015610804575f80fd5b5061033f6108133660046140fa565b609f6020525f908152604090205460ff1681565b348015610832575f80fd5b5061036960995481565b348015610847575f80fd5b506103966108563660046140c8565b612371565b348015610866575f80fd5b506103696108753660046140fa565b60a56020525f908152604090205481565b348015610891575f80fd5b5061036960a85481565b3480156108a6575f80fd5b506103966108b53660046142a7565b612421565b3480156108c5575f80fd5b506103966108d43660046140fa565b612742565b3480156108e4575f80fd5b506103966108f33660046141a0565b61279b565b348015610903575f80fd5b5061039661091236600461431b565b612aeb565b61039661092536600461434d565b612c46565b348015610935575f80fd5b5061036960985481565b34801561094a575f80fd5b506103966109593660046140fa565b613212565b348015610969575f80fd5b506097546104e6906001600160a01b031681565b348015610988575f80fd5b5061033f6109973660046140c8565b6132d1565b3480156109a7575f80fd5b50610369609a5481565b3480156109bc575f80fd5b506103966109cb3660046140c8565b61331b565b3480156109db575f80fd5b506103966109ea3660046140fa565b6133be565b3480156109fa575f80fd5b5061036960a95481565b610a0c61344b565b6001600160a01b0381165f908152609f602052604090205460ff1615610a795760405162461bcd60e51b815260206004820152601f60248201527f6163636f756e7420697320616c72656164792061206368616c6c656e6765720060448201526064015b60405180910390fd5b6001600160a01b0381165f818152609f6020908152604091829020805460ff1916600190811790915591519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc00991015b60405180910390a250565b610ade61344b565b5f8111610b2d5760405162461bcd60e51b815260206004820152601560248201527f636f756e74206d757374206265206e6f6e7a65726f00000000000000000000006044820152606401610a70565b5f80610b3985856134a5565b915091505f610b4c836001015160c01c90565b5f81815260a160205260409020549091508214610bab5760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b5f60a181610bb987856143a2565b81526020019081526020015f205414610c395760405162461bcd60e51b8152602060048201526024808201527f726576657274696e67206d7573742073746172742066726f6d2074686520656e60448201527f64696e67000000000000000000000000000000000000000000000000000000006064820152608401610a70565b609d548111610cb05760405162461bcd60e51b815260206004820152602160248201527f63616e206f6e6c792072657665727420756e46696e616c697a6564206261746360448201527f68000000000000000000000000000000000000000000000000000000000000006064820152608401610a70565b610cbb6001826143b5565b609e555b8315610e2757604051829082907ecae2739091badfd91c373f0a16cede691e0cd25bb80cff77dd5caeb4710146905f90a35f81815260a16020526040812055610d07816132d1565b15610d62575f81815260a460209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a59092528220805491929091610d529084906143a2565b909155505060a6805460ff191690555b5f81815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a85415801590610ddf575060a85481145b15610de9575f60a8555b6001015f81815260a160205260409020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90940193915081610cbf575b505050505050565b60a85415610e7f5760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b610e8761353e565b5f80610e9384846134a5565b915091505f610ea6836001015160c01c90565b5f81815260a160205260409020549091508214610f055760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b610f0e81611326565b610f5a5760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610a70565b610f63816132d1565b15610fb05760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610a70565b5f81815260a4602052604090206003015460ff16156110115760405162461bcd60e51b815260206004820152601660248201527f62617463682073686f756c6420626520726576657274000000000000000000006044820152606401610a70565b5f81815260a260205260409020600101544210156110715760405162461bcd60e51b815260206004820152601960248201527f626174636820696e206368616c6c656e67652077696e646f77000000000000006044820152606401610a70565b605983015160a05f6110846001856143b5565b81526020019081526020015f2054146110df5760405162461bcd60e51b815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610a70565b5f81815260a060205260409020541561113a5760405162461bcd60e51b815260206004820152601660248201527f626174636820616c7265616479207665726966696564000000000000000000006044820152606401610a70565b80609d546001011461118e5760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610a70565b609d819055600160a35f6111a3866099015190565b815260208101919091526040015f20805460ff191691151591909117905560798301515f82815260a060205260409020556111f26111e5846011015160c01c90565b600985015160c01c613591565b60a25f6112006001846143b5565b815260208101919091526040015f908120818155600180820183905560028201839055600390910182905560ab919061123990846143b5565b81526020019081526020015f205f905560a45f60018361125991906143b5565b815260208082019290925260409081015f90812080547fffffffff00000000000000000000000000000000000000000000000000000000168155600181018290556002810182905560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905583815260a1909252902054817f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d611302866079015190565b60998701516040805192835260208301919091520160405180910390a35050505050565b5f81815260a260205260408120541580159061134e57505f82815260a1602052604090205415155b92915050565b6097546001600160a01b03166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156113c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e491906143c8565b6114305760405162461bcd60e51b815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f7765640000000000006044820152606401610a70565b60a854156114805760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b61148861353e565b61149560208301836143e3565b60ff1615806114b357506114ac60208301836143e3565b60ff166001145b6114ff5760405162461bcd60e51b815260206004820152600f60248201527f696e76616c69642076657273696f6e00000000000000000000000000000000006044820152606401610a70565b60808201356115505760405162461bcd60e51b815260206004820152601b60248201527f70726576696f757320737461746520726f6f74206973207a65726f00000000006044820152606401610a70565b60a08201356115a15760405162461bcd60e51b815260206004820152601660248201527f6e657720737461746520726f6f74206973207a65726f000000000000000000006044820152606401610a70565b5f806115b86115b36020860186614403565b6134a5565b915091505f6115cb836001015160c01c90565b90505f60a1816115dc8460016143a2565b81526020019081526020015f2054146116375760405162461bcd60e51b815260206004820152601760248201527f626174636820616c726561647920636f6d6d69747465640000000000000000006044820152606401610a70565b609e5481146116885760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610a70565b5f81815260a1602052604090205482146116e45760405162461bcd60e51b815260206004820152601b60248201527f696e636f727265637420706172656e74206261746368206861736800000000006044820152606401610a70565b5f81815260ab60205260409020546080860135146117445760405162461bcd60e51b815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610a70565b5f611753846011015160c01c90565b90505f61177f6117696060890160408a01614464565b61177960808a0160608b0161447d565b8461364e565b9050611791608088016060890161447d565b6001939093019261ffff1691909101905f8049156117b0575f496117d2565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440145b905060f96117e360208a018a6143e3565b60ff166001036117f257506101015b6040805182810190915296506118178761180f60208c018c6143e3565b60ff16613692565b60c085901b60018801526118458761183560808c0160608d0161447d565b61ffff1660c01b60099190910152565b60c084811b6011890152601988018490526039880183905260808a0135605989015260a08a0135607989015289013560998801526118a98761188a60208b018b614403565b60405161189892919061449e565b604051809103902060b99190910152565b60d9870186905260016118bf60208b018b6143e3565b60ff16106118f1576118f1876118db60608c0160408d01614464565b67ffffffffffffffff1660c01b60f99190910152565b8087205f86815260a1602090815260408083209390935560ab905290812060a08b0135905560a65460ff16156119505760a7545f90815260a460205260409020600201546099544291611943916143a2565b61194d91906143b5565b90505b6040518060800160405280428152602001826098544261197091906143a2565b61197a91906143a2565b815260200161198f60608d0160408e01614464565b67ffffffffffffffff1681526097546020909101906001600160a01b031663d096c3c6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611a0d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a3191906144ad565b90525f87815260a2602090815260409182902083518155838201516001820155918301516002830155606090920151600390910155609e8790556097546001600160a01b031692506374fe27b79150893590611a9990611a93908c018c614403565b5f613699565b5f611aa760408d018d614403565b6040518663ffffffff1660e01b8152600401611ac795949392919061450b565b602060405180830381865afa158015611ae2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b0691906143c8565b611b785760405162461bcd60e51b815260206004820152602160248201527f746865207369676e617475726520766572696669636174696f6e206661696c6560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610a70565b5f84815260a16020526040808220549051909186917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a35050505050505050565b611bc361344b565b5f81118015611bd457506099548114155b611c205760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964206e65772070726f6f662077696e646f7700000000000000006044820152606401610a70565b609980549082905560408051828152602081018490527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a6191015b60405180910390a15050565b5f54600290610100900460ff16158015611c8657505f5460ff8083169116105b611cf85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a70565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055611d335f5460ff1690565b60ff16600214611d855760405162461bcd60e51b815260206004820152601660248201527f6d757374206861766520696e697469616c697a656421000000000000000000006044820152606401610a70565b81611df85760405162461bcd60e51b815260206004820152602760248201527f63616e206e6f742073657420737461746520726f6f742077697468206279746560448201527f73333228302921000000000000000000000000000000000000000000000000006064820152608401610a70565b609e545f90815260ab6020526040902054611e2157609e545f90815260ab602052604090208290555b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611c5a565b611e8361344b565b6001600160a01b0381165f908152609f602052604090205460ff16611eea5760405162461bcd60e51b815260206004820152601b60248201527f6163636f756e74206973206e6f742061206368616c6c656e67657200000000006044820152606401610a70565b6001600160a01b0381165f818152609f60209081526040808320805460ff19169055519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc0099101610acb565b611f4061344b565b611f495f6136ed565b565b5f54610100900460ff1615808015611f6957505f54600160ff909116105b80611f825750303b158015611f8257505f5460ff166001145b611ff45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a70565b5f805460ff191660011790558015612032575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b038616158061204f57506001600160a01b038516155b15612086576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0387166120dc5760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206c31207374616b696e6720636f6e747261637400000000006044820152606401610a70565b6120e4613756565b6120ec6137da565b609780546001600160a01b03808a167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255609b8054898416908316179055609c805492881692909116821790556098859055609984905560a98390556040515f907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96908290a3604080515f8152602081018690527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a437910160405180910390a1604080515f8152602081018590527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a61910160405180910390a1604080515f8152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b0223910160405180910390a18015612285575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b61229661344b565b6001600160a01b038116158015906122bc5750609c546001600160a01b03828116911614155b6123085760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964206e65772076657269666965720000000000000000000000006044820152606401610a70565b609c80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96905f90a35050565b61237961344b565b5f81118015612389575060648111155b8015612397575060a9548114155b6123e35760405162461bcd60e51b815260206004820152601f60248201527f696e76616c69642070726f6f66207265776172642070657263656e74616765006044820152606401610a70565b60a980549082905560408051828152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b02239101611c5a565b60a854156124715760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b61247961353e565b6097546001600160a01b03166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156124e5573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061250991906143c8565b6125555760405162461bcd60e51b815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f7765640000000000006044820152606401610a70565b5f8061256186866134a5565b915091505f612574836001015160c01c90565b5f81815260a1602052604090205490915082146125d35760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b6125dc816132d1565b6126285760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610a70565b5f81815260a4602052604090206003810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560a6805460ff191690556099546002909101544291612681916143a2565b116126f7575f81815260a4602090815260408083206003908101805460ff1916600117905560a2835292819020909201548251808401909352600783527f54696d656f757400000000000000000000000000000000000000000000000000918301919091526126f29183919061385e565b612285565b6127028386866139ba565b61228581336040518060400160405280600d81526020017f50726f6f66207375636365737300000000000000000000000000000000000000815250613b6d565b61274a61344b565b60aa80545f90915561275c8282613c39565b604080516001600160a01b0384168152602081018390527fb1b2058a6969e2d25e47bcaebe8ae21c29a23b2752429315b75e2f4f285f3d879101611c5a565b6127a361344b565b5f805260a06020527fb84a74ec6ef4d0e83b6006dfaa014ab4026f9f3b97d186e604d29998a4e808ea541561281a5760405162461bcd60e51b815260206004820152601660248201527f67656e6573697320626174636820696d706f72746564000000000000000000006044820152606401610a70565b5f8061282684846134a5565b915091505f612839836001015160c01c90565b905080156128895760405162461bcd60e51b815260206004820152601360248201527f696e76616c696420626174636820696e646578000000000000000000000000006044820152606401610a70565b5f612895846079015190565b9050806128e45760405162461bcd60e51b815260206004820152600f60248201527f7a65726f20737461746520726f6f7400000000000000000000000000000000006044820152606401610a70565b600984015160c01c156129395760405162461bcd60e51b815260206004820152601d60248201527f6c31206d65737361676520706f707065642073686f756c6420626520300000006044820152606401610a70565b5f612945856019015190565b036129925760405162461bcd60e51b815260206004820152600e60248201527f7a65726f206461746120686173680000000000000000000000000000000000006044820152606401610a70565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440146129be856039015190565b14612a0b5760405162461bcd60e51b815260206004820152601660248201527f696e76616c69642076657273696f6e65642068617368000000000000000000006044820152606401610a70565b5f82815260a1602090815260408083208690558051608081018252428082528184019081528183018581526060830186815288875260a2865284872093518455915160018401555160028301555160039091015560ab825280832084905560a0909152808220839055609e849055609d84905551849184917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a3604080518281525f6020820152849184917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d910160405180910390a3505050505050565b612af361344b565b8015612c1457612b01613ce4565b60a65460ff1615612bd35760a7545f90815260a460209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a59092528220805491929091612b559084906143a2565b909155505060a7545f90815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a6805460ff191690555b7f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b6040516001600160a01b03909116815260200160405180910390a150565b612c1c613d3e565b7f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33612bf6565b50565b335f908152609f602052604090205460ff16612ca45760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206368616c6c656e67657220616c6c6f776564000000000000006044820152606401610a70565b60a85415612cf45760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b612cfc61353e565b60a65460ff1615612d4f5760405162461bcd60e51b815260206004820152601460248201527f616c726561647920696e206368616c6c656e67650000000000000000000000006044820152606401610a70565b8167ffffffffffffffff16609d5410612daa5760405162461bcd60e51b815260206004820152601760248201527f626174636820616c72656164792066696e616c697a65640000000000000000006044820152606401610a70565b67ffffffffffffffff82165f90815260a160205260409020548114612e115760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b612e248267ffffffffffffffff16611326565b612e705760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610a70565b67ffffffffffffffff82165f90815260a460205260409020546801000000000000000090046001600160a01b031615612eeb5760405162461bcd60e51b815260206004820152601860248201527f626174636820616c7265616479206368616c6c656e67656400000000000000006044820152606401610a70565b67ffffffffffffffff82165f90815260a260205260409020600101544210612f7b5760405162461bcd60e51b815260206004820152603360248201527f63616e6e6f74206368616c6c656e6765206261746368206f757473696465207460448201527f6865206368616c6c656e67652077696e646f77000000000000000000000000006064820152608401610a70565b60975f9054906101000a90046001600160a01b03166001600160a01b0316630d13fd7b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fcb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fef91906144ad565b34101561303e5760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742076616c756500000000000000000000000000006044820152606401610a70565b67ffffffffffffffff82811660a78190556040805160c0810182528281523360208083018281523484860190815242606086019081525f6080870181815260a0880182815299825260a4909552969096209451855492516001600160a01b031668010000000000000000027fffffffff00000000000000000000000000000000000000000000000000000000909316981697909717178355945160018301559151600282015592516003909301805492511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff941515949094167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909316929092179290921790556001600160a01b03168267ffffffffffffffff167f3a6ea19df25b49e7624e313ce7c1ab23984238e93727260db56a81735b1b99763460405161319091815260200190565b60405180910390a35f609d5460016131a891906143a2565b90505b609e548111613200578267ffffffffffffffff1681146131ee576099545f82815260a26020526040812060010180549091906131e89084906143a2565b90915550505b806131f88161457e565b9150506131ab565b505060a6805460ff1916600117905550565b335f90815260a56020526040812054908190036132715760405162461bcd60e51b815260206004820152601c60248201527f696e76616c69642062617463684368616c6c656e6765526577617264000000006044820152606401610a70565b335f90815260a5602052604081205561328a8282613c39565b816001600160a01b03167f9c25fa83f414ed363c8d39c98fb3e17567b3431cede71eb062c49d2a63ce247a826040516132c591815260200190565b60405180910390a25050565b5f81815260a460205260408120546801000000000000000090046001600160a01b03161580159061134e5750505f90815260a46020526040902060030154610100900460ff161590565b61332361344b565b5f8111801561333457506098548114155b6133805760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206e65772066696e616c697a6520706572696f6400000000006044820152606401610a70565b609880549082905560408051828152602081018490527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a4379101611c5a565b6133c661344b565b6001600160a01b0381166134425760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a70565b612c43816136ed565b6033546001600160a01b03163314611f495760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a70565b5f805f6134b28585613d77565b90505f8160ff165f036134d3576134c98686613de7565b9094509050613530565b8160ff166001036134e8576134c98686613e50565b60405162461bcd60e51b815260206004820152601960248201527f556e737570706f727465642062617463682076657273696f6e000000000000006044820152606401610a70565b808420925050509250929050565b60655460ff1615611f495760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a70565b805f0361359c575050565b8082035f5b82811015613648576101008184038111156135bb57508083035b609b546040517f3c7f528300000000000000000000000000000000000000000000000000000000815260048101859052602481018390526001600160a01b0390911690633c7f5283906044015f604051808303815f87803b15801561361e575f80fd5b505af1158015613630573d5f803e3d5ffd5b505050506101008301925050610100810190506135a1565b50505050565b6040805160c085901b815260f084901b6008820152600a60208502820181019092525f9181016136838161ffff871686613ea3565b82900390912095945050505050565b8082535050565b60605f808080806136ac888a018a6146a2565b95509550955095509550508187106136ca5794506136e69350505050565b8387106136de5782955050505050506136e6565b509293505050505b9392505050565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff166137d25760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b611f49613f69565b5f54610100900460ff166138565760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b611f49613ff1565b60a88390555f83815260a460205260408082205460975491517f45bc4d1000000000000000000000000000000000000000000000000000000000815260048101869052680100000000000000009091046001600160a01b03908116939216906345bc4d10906024016020604051808303815f875af11580156138e2573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061390691906144ad565b5f86815260a460205260409020600101549091506139259082906143a2565b5f86815260a460209081526040808320546801000000000000000090046001600160a01b0316835260a5909152812080549091906139649084906143a2565b909155505060405161397790849061473f565b604051908190038120906001600160a01b0384169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b80613a075760405162461bcd60e51b815260206004820152601360248201527f496e76616c69642062617463682070726f6f66000000000000000000000000006044820152606401610a70565b5f613a16846001015160c01c90565b90505f613a24856039015190565b90505f7f0000000000000000000000000000000000000000000000000000000000000000613a53876059015190565b6079880151609989015160b98a015160198b015160405160c09690961b7fffffffffffffffff000000000000000000000000000000000000000000000000166020870152602886019490945260488501929092526068840152608883015260a882015260c8810183905260e801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120609c549091506001600160a01b0316632c09a848613b15885160f81c90565b858888866040518663ffffffff1660e01b8152600401613b3995949392919061476b565b5f6040518083038186803b158015613b4f575f80fd5b505afa158015613b61573d5f803e3d5ffd5b50505050505050505050565b5f83815260a4602052604081206001015460a954909190606490613b91908461479c565b613b9b91906147b3565b9050613ba781836143b5565b60aa5f828254613bb791906143a2565b90915550506001600160a01b0384165f90815260a5602052604081208054839290613be39084906143a2565b9091555050604051613bf690849061473f565b604051908190038120906001600160a01b0386169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b8015613ce0575f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613c88576040519150601f19603f3d011682016040523d82523d5f602084013e613c8d565b606091505b5050905080613cde5760405162461bcd60e51b815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c656400000000006044820152606401610a70565b505b5050565b613cec61353e565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613d213390565b6040516001600160a01b03909116815260200160405180910390a1565b613d46614076565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33613d21565b5f81613dc55760405162461bcd60e51b815260206004820152601260248201527f456d7074792062617463682068656164657200000000000000000000000000006044820152606401610a70565b82825f818110613dd757613dd76147eb565b919091013560f81c949350505050565b5f8160f9811015613e3a5760405162461bcd60e51b815260206004820152601d60248201527f626174636820686561646572206c656e67746820746f6f20736d616c6c0000006044820152606401610a70565b6040519150808483378082016040529250929050565b5f816101018114613e3a5760405162461bcd60e51b815260206004820181905260248201527f626174636820686561646572206c656e67746820697320696e636f72726563746044820152606401610a70565b5f825f03613eb25750826136e6565b609b546001600160a01b03165f5b84811015613f5f576040517fae453cd5000000000000000000000000000000000000000000000000000000008152600481018590525f906001600160a01b0384169063ae453cd590602401602060405180830381865afa158015613f26573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f4a91906144ad565b87525060209095019460019384019301613ec0565b5093949350505050565b5f54610100900460ff16613fe55760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b6065805460ff19169055565b5f54610100900460ff1661406d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b611f49336136ed565b60655460ff16611f495760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610a70565b5f602082840312156140d8575f80fd5b5035919050565b80356001600160a01b03811681146140f5575f80fd5b919050565b5f6020828403121561410a575f80fd5b6136e6826140df565b5f8083601f840112614123575f80fd5b50813567ffffffffffffffff81111561413a575f80fd5b602083019150836020828501011115614151575f80fd5b9250929050565b5f805f6040848603121561416a575f80fd5b833567ffffffffffffffff811115614180575f80fd5b61418c86828701614113565b909790965060209590950135949350505050565b5f80602083850312156141b1575f80fd5b823567ffffffffffffffff8111156141c7575f80fd5b6141d385828601614113565b90969095509350505050565b5f80604083850312156141f0575f80fd5b823567ffffffffffffffff80821115614207575f80fd5b9084019060e0828703121561421a575f80fd5b9092506020840135908082111561422f575f80fd5b50830160608186031215614241575f80fd5b809150509250929050565b5f805f805f8060c08789031215614261575f80fd5b61426a876140df565b9550614278602088016140df565b9450614286604088016140df565b9350606087013592506080870135915060a087013590509295509295509295565b5f805f80604085870312156142ba575f80fd5b843567ffffffffffffffff808211156142d1575f80fd5b6142dd88838901614113565b909650945060208701359150808211156142f5575f80fd5b5061430287828801614113565b95989497509550505050565b8015158114612c43575f80fd5b5f6020828403121561432b575f80fd5b81356136e68161430e565b803567ffffffffffffffff811681146140f5575f80fd5b5f806040838503121561435e575f80fd5b61436783614336565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561134e5761134e614375565b8181038181111561134e5761134e614375565b5f602082840312156143d8575f80fd5b81516136e68161430e565b5f602082840312156143f3575f80fd5b813560ff811681146136e6575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614436575f80fd5b83018035915067ffffffffffffffff821115614450575f80fd5b602001915036819003821315614151575f80fd5b5f60208284031215614474575f80fd5b6136e682614336565b5f6020828403121561448d575f80fd5b813561ffff811681146136e6575f80fd5b818382375f9101908152919050565b5f602082840312156144bd575f80fd5b5051919050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f6080820187835260206080602085015281885180845260a08601915060208a0193505f5b818110156145555784516001600160a01b031683529383019391830191600101614530565b505087604086015284810360608601526145708187896144c4565b9a9950505050505050505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036145ae576145ae614375565b5060010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126145f1575f80fd5b8135602067ffffffffffffffff8083111561460e5761460e6145b5565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108482111715614651576146516145b5565b6040529384526020818701810194908101925087851115614670575f80fd5b6020870191505b8482101561469757614688826140df565b83529183019190830190614677565b979650505050505050565b5f805f805f8060c087890312156146b7575f80fd5b86359550602087013567ffffffffffffffff808211156146d5575f80fd5b6146e18a838b016145e2565b96506040890135955060608901359150808211156146fd575f80fd5b6147098a838b016145e2565b94506080890135935060a0890135915080821115614725575f80fd5b5061473289828a016145e2565b9150509295509295509295565b5f82515f5b8181101561475e5760208186018101518583015201614744565b505f920191825250919050565b858152846020820152608060408201525f61478a6080830185876144c4565b90508260608301529695505050505050565b808202811582820484141761134e5761134e614375565b5f826147e6577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffdfea164736f6c6343000818000a diff --git a/bindings/bindings/distribute.go b/bindings/bindings/distribute.go index d251237d..3632a94b 100644 --- a/bindings/bindings/distribute.go +++ b/bindings/bindings/distribute.go @@ -32,7 +32,7 @@ var ( // DistributeMetaData contains all meta data concerning the Distribute contract. var DistributeMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"CommissionClaimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"upToEpoch\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"RewardClaimed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"L2_STAKING_CONTRACT\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MORPH_TOKEN_CONTRACT\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"RECORD_CONTRACT\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"targetEpochIndex\",\"type\":\"uint256\"}],\"name\":\"claim\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"targetEpochIndex\",\"type\":\"uint256\"}],\"name\":\"claimAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"}],\"name\":\"claimCommission\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"targetEpochIndex\",\"type\":\"uint256\"}],\"name\":\"cleanDistributions\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"}],\"name\":\"isRewardClaimed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"claimed\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"effectiveEpoch\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalAmount\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"newDelegation\",\"type\":\"bool\"}],\"name\":\"notifyDelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"effectiveEpoch\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"totalAmount\",\"type\":\"uint256\"}],\"name\":\"notifyUndelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"}],\"name\":\"queryAllUnclaimed\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"delegatees\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"rewards\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"}],\"name\":\"queryAllUnclaimedEpochs\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"},{\"internalType\":\"bool[]\",\"name\":\"\",\"type\":\"bool[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"}],\"name\":\"queryOldestDistribution\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"epochIndex\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"}],\"name\":\"queryUnclaimed\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"reward\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"}],\"name\":\"queryUnclaimedCommission\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"epochIndex\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"sequencers\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"delegatorRewards\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"commissionsAmount\",\"type\":\"uint256[]\"}],\"name\":\"updateEpochReward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60e060405234801562000010575f80fd5b5073530000000000000000000000000000000000001360805273530000000000000000000000000000000000001560a05273530000000000000000000000000000000000001260c0526200006362000069565b62000127565b5f54610100900460ff1615620000d55760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161462000125575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b60805160a05160c051612a09620001915f395f8181610309015261178b01525f81816101d9015281816107ca015281816109bc015281816112160152818161133a015261148301525f8181610343015281816120bd01528181612170015261220d0152612a095ff3fe608060405234801561000f575f80fd5b5060043610610163575f3560e01c8063a766c529116100c7578063cd4281d01161007d578063d557714111610063578063d55771411461033e578063de6ac93314610365578063f2fde38b14610388575f80fd5b8063cd4281d014610304578063cdd0c50e1461032b575f80fd5b8063b809af0f116100ad578063b809af0f146102b6578063bf2dca0a146102c9578063c4d66de8146102f1575f80fd5b8063a766c5291461027b578063ac2ac640146102a3575f80fd5b8063807de4431161011c578063921ae9b811610102578063921ae9b8146102245780639889be5114610247578063996cba6814610268575f80fd5b8063807de443146101d45780638da5cb5b14610213575f80fd5b80635cf20c7b1161014c5780635cf20c7b146101a6578063715018a6146101b95780637f683ee3146101c1575f80fd5b8063273d8e82146101675780634eedab3214610191575b5f80fd5b61017a610175366004612512565b61039b565b60405161018892919061259d565b60405180910390f35b6101a461019f3660046125ca565b610729565b005b6101a46101b43660046125ca565b6107c7565b6101a46109a6565b6101a46101cf3660046125f2565b6109b9565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610188565b6033546001600160a01b03166101fb565b610237610232366004612512565b610bff565b6040516101889493929190612631565b61025a6102553660046126b0565b610f3c565b604051908152602001610188565b6101a46102763660046126e1565b611213565b61025a610289366004612512565b6001600160a01b03165f9081526067602052604090205490565b6101a46102b1366004612512565b611337565b6101a46102c4366004612727565b611480565b61025a6102d7366004612512565b6001600160a01b03165f9081526068602052604090205490565b6101a46102ff366004612512565b6115be565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b6101a46103393660046127ce565b611788565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b6103786103733660046126b0565b611ae8565b6040519015158152602001610188565b6101a4610396366004612512565b611b13565b6001600160a01b0381165f90815260696020526040812060609182916103c090611ba3565b9050805f0361043c5760405162461bcd60e51b815260206004820152602860248201527f696e76616c69642064656c656761746f72206f72206e6f2072656d61696e696e60448201527f672072657761726400000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b8067ffffffffffffffff8111156104555761045561286a565b60405190808252806020026020018201604052801561047e578160200160208202803683370190505b5092508067ffffffffffffffff81111561049a5761049a61286a565b6040519080825280602002602001820160405280156104c3578160200160208202803683370190505b5091505f5b6001600160a01b0385165f9081526069602052604090206104e890611ba3565b811015610722576001600160a01b0385165f9081526069602052604081206105109083611bac565b6001600160a01b038088165f908152606960209081526040808320938516835260039093019052908120549192509081908190805b6065548110156106bf576001600160a01b038087165f9081526066602090815260408083208584528252808320938f168352600490930190522054156105b9576001600160a01b038087165f9081526066602090815260408083208584528252808320938f16835260049093019052205492505b6001600160a01b0386165f9081526066602090815260408083208484529091529020600101541561060d576001600160a01b0386165f90815260666020908152604080832084845290915290206001015493505b6001600160a01b0386165f908152606660209081526040808320848452909152902054849061063d9085906128c4565b61064791906128db565b6106519086612913565b6001600160a01b03808d165f908152606960209081526040808320938b16835260029093019052205490955060ff1680156106b357506001600160a01b03808c165f908152606960209081526040808320938a16835260049093019052205481145b6106bf57600101610545565b50848987815181106106d3576106d3612926565b60200260200101906001600160a01b031690816001600160a01b0316815250508388878151811061070657610706612926565b60209081029190910101525050600190930192506104c8915050565b5050915091565b610731611bbe565b6001600160a01b0382165f908152606760205260409020545b8181116107a8576001600160a01b0383165f908152606660209081526040808320848452909152812081815560018101829055906002820181818161078f82826124c9565b50505050505080806107a090612953565b91505061074a565b6001600160a01b039092165f9081526067602052604090209190915550565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461083f5760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6065545f036108905760405162461bcd60e51b815260206004820152600e60248201527f6e6f74206d696e746564207965740000000000000000000000000000000000006044820152606401610433565b5f8115806108ab575060016065546108a8919061298a565b82115b6108b557816108c4565b60016065546108c4919061298a565b90505f805b6001600160a01b0385165f9081526069602052604090206108e990611ba3565b81101561098f576001600160a01b0385165f9081526069602052604081206109119083611bac565b6001600160a01b0387165f9081526069602052604090209091506109359082611c18565b801561096957506001600160a01b038087165f90815260696020908152604080832093851683526003909301905220548410155b1561098657610979818786611c39565b6109839084612913565b92505b506001016108c9565b5080156109a0576109a0848261208d565b50505050565b6109ae611bbe565b6109b75f6122e3565b565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610a315760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6001600160a01b0384165f9081526066602090815260408083208584529091529020600101819055811580610a8d57506001600160a01b038084165f908152606960209081526040808320938816835260039093019052205482145b15610b72576001600160a01b0384165f9081526066602090815260408083208584529091529020610ac1906002018461234c565b506001600160a01b038085165f90815260666020908152604080832086845282528083209387168352600490930181528282208290556069905220610b06908561234c565b506001600160a01b038381165f908152606960209081526040808320938816835260028401825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560038401825280832083905560049093019052908120556109a0565b6001600160a01b038084165f9081526069602090815260408083209388168352600290930190522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155610bd0908361298a565b6001600160a01b038085165f908152606960209081526040808320938916835260049093019052205550505050565b6001600160a01b0381165f908152606960205260408120606091829182918291610c2890611ba3565b90505f8167ffffffffffffffff811115610c4457610c4461286a565b604051908082528060200260200182016040528015610c6d578160200160208202803683370190505b5090505f8267ffffffffffffffff811115610c8a57610c8a61286a565b604051908082528060200260200182016040528015610cb3578160200160208202803683370190505b5090505f8367ffffffffffffffff811115610cd057610cd061286a565b604051908082528060200260200182016040528015610cf9578160200160208202803683370190505b5090505f8467ffffffffffffffff811115610d1657610d1661286a565b604051908082528060200260200182016040528015610d3f578160200160208202803683370190505b5090505f5b85811015610f2b576001600160a01b038b165f908152606960205260409020610d6d9082611bac565b858281518110610d7f57610d7f612926565b60200260200101906001600160a01b031690816001600160a01b03168152505060695f8c6001600160a01b03166001600160a01b031681526020019081526020015f206002015f868381518110610dd857610dd8612926565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f9054906101000a900460ff16848281518110610e1e57610e1e612926565b9115156020928302919091018201526001600160a01b038c165f908152606990915260408120865160039091019190879084908110610e5f57610e5f612926565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054838281518110610e9957610e99612926565b60200260200101818152505060695f8c6001600160a01b03166001600160a01b031681526020019081526020015f206004015f868381518110610ede57610ede612926565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054828281518110610f1857610f18612926565b6020908102919091010152600101610d44565b509299919850965090945092505050565b6001600160a01b0381165f908152606960205260408120610f5c90611ba3565b5f03610fd05760405162461bcd60e51b815260206004820152602860248201527f696e76616c69642064656c656761746f72206f72206e6f2072656d61696e696e60448201527f67207265776172640000000000000000000000000000000000000000000000006064820152608401610433565b6001600160a01b0382165f908152606960205260409020610ff19084611c18565b6110625760405162461bcd60e51b8152602060048201526024808201527f6e6f2072656d61696e696e6720726577617264206f66207468652064656c656760448201527f61746565000000000000000000000000000000000000000000000000000000006064820152608401610433565b6001600160a01b038083165f9081526069602090815260408083209387168352600390930190529081205481905b60655481101561120a576001600160a01b038087165f9081526066602090815260408083208584528252808320938916835260049093019052205415611104576001600160a01b038087165f9081526066602090815260408083208584528252808320938916835260049093019052205491505b6001600160a01b0386165f90815260666020908152604080832084845290915290206001015415611158576001600160a01b0386165f90815260666020908152604080832084845290915290206001015492505b6001600160a01b0386165f90815260666020908152604080832084845290915290205483906111889084906128c4565b61119291906128db565b61119c9085612913565b6001600160a01b038087165f908152606960209081526040808320938b16835260029093019052205490945060ff1680156111fe57506001600160a01b038086165f908152606960209081526040808320938a16835260049093019052205481145b61120a57600101611090565b50505092915050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461128b5760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6065545f036112dc5760405162461bcd60e51b815260206004820152600e60248201527f6e6f74206d696e746564207965740000000000000000000000000000000000006044820152606401610433565b5f8115806112f7575060016065546112f4919061298a565b82115b6113015781611310565b6001606554611310919061298a565b90505f61131e858584611c39565b9050801561133057611330848261208d565b5050505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146113af5760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6001600160a01b0381165f908152606860205260409020546114135760405162461bcd60e51b815260206004820152601660248201527f6e6f20636f6d6d697373696f6e20746f20636c61696d000000000000000000006044820152606401610433565b6001600160a01b0381165f9081526068602052604081208054919055611439828261208d565b816001600160a01b03167f8e14daa5332205b1634040e1054e93d1f5396ec8bf0115d133b7fbaf4a52e4118260405161147491815260200190565b60405180910390a25050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146114f85760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6001600160a01b0386165f90815260666020908152604080832087845290915290206001810183905561152e9060020186612360565b506001600160a01b038087165f90815260666020908152604080832088845282528083209389168352600490930190522083905580156115b6576001600160a01b0385165f9081526069602052604090206115899087612360565b506001600160a01b038086165f908152606960209081526040808320938a16835260039093019052208490555b505050505050565b5f54610100900460ff16158080156115dc57505f54600160ff909116105b806115f55750303b1580156115f557505f5460ff166001145b6116675760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610433565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156116c3575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b0382166117195760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964206f776e6572206164647265737300000000000000000000006044820152606401610433565b611722826122e3565b8015611784575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146118005760405162461bcd60e51b815260206004820152601c60248201527f6f6e6c79207265636f726420636f6e747261637420616c6c6f776564000000006044820152606401610433565b60658054905f61180f83612953565b9190505550866001606554611824919061298a565b146118715760405162461bcd60e51b815260206004820152601360248201527f696e76616c69642065706f636820696e646578000000000000000000000000006044820152606401610433565b828514801561187f57508085145b6118cb5760405162461bcd60e51b815260206004820152601360248201527f696e76616c69642064617461206c656e677468000000000000000000000000006044820152606401610433565b5f5b85811015611ade578484828181106118e7576118e7612926565b9050602002013560665f89898581811061190357611903612926565b90506020020160208101906119189190612512565b6001600160a01b0316815260208082019290925260409081015f9081208c825290925281209190915560669088888481811061195657611956612926565b905060200201602081019061196b9190612512565b6001600160a01b0316815260208082019290925260409081015f9081208b82529092529020600101541580156119a057505f88115b15611a615760665f8888848181106119ba576119ba612926565b90506020020160208101906119cf9190612512565b6001600160a01b03166001600160a01b031681526020019081526020015f205f60018a6119fc919061298a565b81526020019081526020015f206001015460665f898985818110611a2257611a22612926565b9050602002016020810190611a379190612512565b6001600160a01b0316815260208082019290925260409081015f9081208c82529092529020600101555b828282818110611a7357611a73612926565b9050602002013560685f898985818110611a8f57611a8f612926565b9050602002016020810190611aa49190612512565b6001600160a01b03166001600160a01b031681526020019081526020015f205f828254611ad19190612913565b90915550506001016118cd565b5050505050505050565b6001600160a01b0382165f908152606960205260408120611b099083611c18565b1590505b92915050565b611b1b611bbe565b6001600160a01b038116611b975760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610433565b611ba0816122e3565b50565b5f611b0d825490565b5f611bb78383612374565b9392505050565b6033546001600160a01b031633146109b75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610433565b6001600160a01b0381165f9081526001830160205260408120541515611bb7565b6001600160a01b0382165f908152606960205260408120611c5a9085611c18565b611ca65760405162461bcd60e51b815260206004820152601360248201527f6e6f2072656d61696e696e6720726577617264000000000000000000000000006044820152606401610433565b6001600160a01b038084165f9081526069602090815260408083209388168352600390930190522054821015611d1e5760405162461bcd60e51b815260206004820152601260248201527f616c6c2072657761726420636c61696d656400000000000000000000000000006044820152606401610433565b6001600160a01b038084165f9081526069602090815260408083209388168352600390930190529081205481905b848111611f5b576001600160a01b038088165f9081526066602090815260408083208584528252808320938a16835260049093019052205415611dbd576001600160a01b038088165f9081526066602090815260408083208584528252808320938a16835260049093019052205491505b6001600160a01b0387165f90815260666020908152604080832084845290915290206001015415611e11576001600160a01b0387165f90815260666020908152604080832084845290915290206001015492505b6001600160a01b0387165f9081526066602090815260408083208484529091529020548390611e419084906128c4565b611e4b91906128db565b611e559085612913565b6001600160a01b038088165f908152606960209081526040808320938c16835260029093019052205490945060ff168015611eb757506001600160a01b038087165f908152606960209081526040808320938b16835260049093019052205481145b15611f49576001600160a01b0386165f908152606960205260409020611edd908861234c565b506001600160a01b038681165f908152606960209081526040808320938b16835260028401825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556003840182528083208390556004909301905290812055611f5b565b80611f5381612953565b915050611d4c565b50611f67846001612913565b6001600160a01b038087165f908152606960209081526040808320938b16835260039093018152828220939093556066909252812090611fa8866001612913565b81526020019081526020015f206004015f866001600160a01b03166001600160a01b031681526020019081526020015f20545f0361202e576001600160a01b0386165f9081526066602052604081208291612004876001612913565b815260208082019290925260409081015f9081206001600160a01b038a1682526004019092529020555b856001600160a01b0316856001600160a01b03167f7a84a08b02c91f3c62d572853f966fc799bbd121e8ad7833a4494ab8dcfcb404868660405161207c929190918252602082015260400190565b60405180910390a350509392505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561210a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061212e919061299d565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152602482018590529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303815f875af11580156121b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121dc91906129b4565b506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561225a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061227e919061299d565b90505f83118015612297575082612295828461298a565b145b6109a05760405162461bcd60e51b815260206004820152601b60248201527f6d6f72706820746f6b656e207472616e73666572206661696c656400000000006044820152606401610433565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f611bb7836001600160a01b03841661239a565b5f611bb7836001600160a01b03841661247d565b5f825f01828154811061238957612389612926565b905f5260205f200154905092915050565b5f8181526001830160205260408120548015612474575f6123bc60018361298a565b85549091505f906123cf9060019061298a565b905081811461242e575f865f0182815481106123ed576123ed612926565b905f5260205f200154905080875f01848154811061240d5761240d612926565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061243f5761243f6129cf565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611b0d565b5f915050611b0d565b5f8181526001830160205260408120546124c257508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155611b0d565b505f611b0d565b5080545f8255905f5260205f2090810190611ba091905b808211156124f3575f81556001016124e0565b5090565b80356001600160a01b038116811461250d575f80fd5b919050565b5f60208284031215612522575f80fd5b611bb7826124f7565b5f815180845260208085019450602084015f5b838110156125635781516001600160a01b03168752958201959082019060010161253e565b509495945050505050565b5f815180845260208085019450602084015f5b8381101561256357815187529582019590820190600101612581565b604081525f6125af604083018561252b565b82810360208401526125c1818561256e565b95945050505050565b5f80604083850312156125db575f80fd5b6125e4836124f7565b946020939093013593505050565b5f805f8060808587031215612605575f80fd5b61260e856124f7565b935061261c602086016124f7565b93969395505050506040820135916060013590565b608081525f612643608083018761252b565b8281036020848101919091528651808352878201928201905f5b8181101561267b57845115158352938301939183019160010161265d565b5050848103604086015261268f818861256e565b9250505082810360608401526126a5818561256e565b979650505050505050565b5f80604083850312156126c1575f80fd5b6126ca836124f7565b91506126d8602084016124f7565b90509250929050565b5f805f606084860312156126f3575f80fd5b6126fc846124f7565b925061270a602085016124f7565b9150604084013590509250925092565b8015158114611ba0575f80fd5b5f805f805f8060c0878903121561273c575f80fd5b612745876124f7565b9550612753602088016124f7565b945060408701359350606087013592506080870135915060a08701356127788161271a565b809150509295509295509295565b5f8083601f840112612796575f80fd5b50813567ffffffffffffffff8111156127ad575f80fd5b6020830191508360208260051b85010111156127c7575f80fd5b9250929050565b5f805f805f805f6080888a0312156127e4575f80fd5b87359650602088013567ffffffffffffffff80821115612802575f80fd5b61280e8b838c01612786565b909850965060408a0135915080821115612826575f80fd5b6128328b838c01612786565b909650945060608a013591508082111561284a575f80fd5b506128578a828b01612786565b989b979a50959850939692959293505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082028115828204841417611b0d57611b0d612897565b5f8261290e577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b80820180821115611b0d57611b0d612897565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361298357612983612897565b5060010190565b81810381811115611b0d57611b0d612897565b5f602082840312156129ad575f80fd5b5051919050565b5f602082840312156129c4575f80fd5b8151611bb78161271a565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea164736f6c6343000818000a", + Bin: "0x60e060405234801562000010575f80fd5b5073530000000000000000000000000000000000001360805273530000000000000000000000000000000000001560a05273530000000000000000000000000000000000001260c0526200006362000069565b62000127565b5f54610100900460ff1615620000d55760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161462000125575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b60805160a05160c051612a2e620001915f395f818161030901526117a901525f81816101d9015281816107ca015281816109d9015281816112330152818161135801526114a101525f8181610343015281816120e20152818161219501526122320152612a2e5ff3fe608060405234801561000f575f80fd5b5060043610610163575f3560e01c8063a766c529116100c7578063cd4281d01161007d578063d557714111610063578063d55771411461033e578063de6ac93314610365578063f2fde38b14610388575f80fd5b8063cd4281d014610304578063cdd0c50e1461032b575f80fd5b8063b809af0f116100ad578063b809af0f146102b6578063bf2dca0a146102c9578063c4d66de8146102f1575f80fd5b8063a766c5291461027b578063ac2ac640146102a3575f80fd5b8063807de4431161011c578063921ae9b811610102578063921ae9b8146102245780639889be5114610247578063996cba6814610268575f80fd5b8063807de443146101d45780638da5cb5b14610213575f80fd5b80635cf20c7b1161014c5780635cf20c7b146101a6578063715018a6146101b95780637f683ee3146101c1575f80fd5b8063273d8e82146101675780634eedab3214610191575b5f80fd5b61017a610175366004612537565b61039b565b6040516101889291906125c2565b60405180910390f35b6101a461019f3660046125ef565b610729565b005b6101a46101b43660046125ef565b6107c7565b6101a46109c3565b6101a46101cf366004612617565b6109d6565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610188565b6033546001600160a01b03166101fb565b610237610232366004612537565b610c1c565b6040516101889493929190612656565b61025a6102553660046126d5565b610f59565b604051908152602001610188565b6101a4610276366004612706565b611230565b61025a610289366004612537565b6001600160a01b03165f9081526067602052604090205490565b6101a46102b1366004612537565b611355565b6101a46102c436600461274c565b61149e565b61025a6102d7366004612537565b6001600160a01b03165f9081526068602052604090205490565b6101a46102ff366004612537565b6115dc565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b6101a46103393660046127f3565b6117a6565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b6103786103733660046126d5565b611b06565b6040519015158152602001610188565b6101a4610396366004612537565b611b31565b6001600160a01b0381165f90815260696020526040812060609182916103c090611bc1565b9050805f0361043c5760405162461bcd60e51b815260206004820152602860248201527f696e76616c69642064656c656761746f72206f72206e6f2072656d61696e696e60448201527f672072657761726400000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b8067ffffffffffffffff8111156104555761045561288f565b60405190808252806020026020018201604052801561047e578160200160208202803683370190505b5092508067ffffffffffffffff81111561049a5761049a61288f565b6040519080825280602002602001820160405280156104c3578160200160208202803683370190505b5091505f5b6001600160a01b0385165f9081526069602052604090206104e890611bc1565b811015610722576001600160a01b0385165f9081526069602052604081206105109083611bca565b6001600160a01b038088165f908152606960209081526040808320938516835260039093019052908120549192509081908190805b6065548110156106bf576001600160a01b038087165f9081526066602090815260408083208584528252808320938f168352600490930190522054156105b9576001600160a01b038087165f9081526066602090815260408083208584528252808320938f16835260049093019052205492505b6001600160a01b0386165f9081526066602090815260408083208484529091529020600101541561060d576001600160a01b0386165f90815260666020908152604080832084845290915290206001015493505b6001600160a01b0386165f908152606660209081526040808320848452909152902054849061063d9085906128e9565b6106479190612900565b6106519086612938565b6001600160a01b03808d165f908152606960209081526040808320938b16835260029093019052205490955060ff1680156106b357506001600160a01b03808c165f908152606960209081526040808320938a16835260049093019052205481145b6106bf57600101610545565b50848987815181106106d3576106d361294b565b60200260200101906001600160a01b031690816001600160a01b031681525050838887815181106107065761070661294b565b60209081029190910101525050600190930192506104c8915050565b5050915091565b610731611bdc565b6001600160a01b0382165f908152606760205260409020545b8181116107a8576001600160a01b0383165f908152606660209081526040808320848452909152812081815560018101829055906002820181818161078f82826124ee565b50505050505080806107a090612978565b91505061074a565b6001600160a01b039092165f9081526067602052604090209190915550565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461083f5760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6065545f036108905760405162461bcd60e51b815260206004820152600e60248201527f6e6f74206d696e746564207965740000000000000000000000000000000000006044820152606401610433565b5f8115806108ab575060016065546108a891906129af565b82115b6108b557816108c4565b60016065546108c491906129af565b90505f805b6001600160a01b0385165f9081526069602052604090206108e990611bc1565b8110156109ac576001600160a01b0385165f90815260696020526040812081906109139084611bca565b6001600160a01b0388165f9081526069602052604090209091506109379082611c36565b801561096b57506001600160a01b038088165f90815260696020908152604080832093851683526003909301905220548510155b15610992575f8061097d838a89611c57565b909250905061098c8287612938565b95509250505b816109a557826109a181612978565b9350505b50506108c9565b5080156109bd576109bd84826120b2565b50505050565b6109cb611bdc565b6109d45f612308565b565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610a4e5760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6001600160a01b0384165f9081526066602090815260408083208584529091529020600101819055811580610aaa57506001600160a01b038084165f908152606960209081526040808320938816835260039093019052205482145b15610b8f576001600160a01b0384165f9081526066602090815260408083208584529091529020610ade9060020184612371565b506001600160a01b038085165f90815260666020908152604080832086845282528083209387168352600490930181528282208290556069905220610b239085612371565b506001600160a01b038381165f908152606960209081526040808320938816835260028401825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560038401825280832083905560049093019052908120556109bd565b6001600160a01b038084165f9081526069602090815260408083209388168352600290930190522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155610bed90836129af565b6001600160a01b038085165f908152606960209081526040808320938916835260049093019052205550505050565b6001600160a01b0381165f908152606960205260408120606091829182918291610c4590611bc1565b90505f8167ffffffffffffffff811115610c6157610c6161288f565b604051908082528060200260200182016040528015610c8a578160200160208202803683370190505b5090505f8267ffffffffffffffff811115610ca757610ca761288f565b604051908082528060200260200182016040528015610cd0578160200160208202803683370190505b5090505f8367ffffffffffffffff811115610ced57610ced61288f565b604051908082528060200260200182016040528015610d16578160200160208202803683370190505b5090505f8467ffffffffffffffff811115610d3357610d3361288f565b604051908082528060200260200182016040528015610d5c578160200160208202803683370190505b5090505f5b85811015610f48576001600160a01b038b165f908152606960205260409020610d8a9082611bca565b858281518110610d9c57610d9c61294b565b60200260200101906001600160a01b031690816001600160a01b03168152505060695f8c6001600160a01b03166001600160a01b031681526020019081526020015f206002015f868381518110610df557610df561294b565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f9054906101000a900460ff16848281518110610e3b57610e3b61294b565b9115156020928302919091018201526001600160a01b038c165f908152606990915260408120865160039091019190879084908110610e7c57610e7c61294b565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054838281518110610eb657610eb661294b565b60200260200101818152505060695f8c6001600160a01b03166001600160a01b031681526020019081526020015f206004015f868381518110610efb57610efb61294b565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054828281518110610f3557610f3561294b565b6020908102919091010152600101610d61565b509299919850965090945092505050565b6001600160a01b0381165f908152606960205260408120610f7990611bc1565b5f03610fed5760405162461bcd60e51b815260206004820152602860248201527f696e76616c69642064656c656761746f72206f72206e6f2072656d61696e696e60448201527f67207265776172640000000000000000000000000000000000000000000000006064820152608401610433565b6001600160a01b0382165f90815260696020526040902061100e9084611c36565b61107f5760405162461bcd60e51b8152602060048201526024808201527f6e6f2072656d61696e696e6720726577617264206f66207468652064656c656760448201527f61746565000000000000000000000000000000000000000000000000000000006064820152608401610433565b6001600160a01b038083165f9081526069602090815260408083209387168352600390930190529081205481905b606554811015611227576001600160a01b038087165f9081526066602090815260408083208584528252808320938916835260049093019052205415611121576001600160a01b038087165f9081526066602090815260408083208584528252808320938916835260049093019052205491505b6001600160a01b0386165f90815260666020908152604080832084845290915290206001015415611175576001600160a01b0386165f90815260666020908152604080832084845290915290206001015492505b6001600160a01b0386165f90815260666020908152604080832084845290915290205483906111a59084906128e9565b6111af9190612900565b6111b99085612938565b6001600160a01b038087165f908152606960209081526040808320938b16835260029093019052205490945060ff16801561121b57506001600160a01b038086165f908152606960209081526040808320938a16835260049093019052205481145b611227576001016110ad565b50505092915050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146112a85760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6065545f036112f95760405162461bcd60e51b815260206004820152600e60248201527f6e6f74206d696e746564207965740000000000000000000000000000000000006044820152606401610433565b5f8115806113145750600160655461131191906129af565b82115b61131e578161132d565b600160655461132d91906129af565b90505f61133b858584611c57565b509050801561134e5761134e84826120b2565b5050505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146113cd5760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6001600160a01b0381165f908152606860205260409020546114315760405162461bcd60e51b815260206004820152601660248201527f6e6f20636f6d6d697373696f6e20746f20636c61696d000000000000000000006044820152606401610433565b6001600160a01b0381165f908152606860205260408120805491905561145782826120b2565b816001600160a01b03167f8e14daa5332205b1634040e1054e93d1f5396ec8bf0115d133b7fbaf4a52e4118260405161149291815260200190565b60405180910390a25050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146115165760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6001600160a01b0386165f90815260666020908152604080832087845290915290206001810183905561154c9060020186612385565b506001600160a01b038087165f90815260666020908152604080832088845282528083209389168352600490930190522083905580156115d4576001600160a01b0385165f9081526069602052604090206115a79087612385565b506001600160a01b038086165f908152606960209081526040808320938a16835260039093019052208490555b505050505050565b5f54610100900460ff16158080156115fa57505f54600160ff909116105b806116135750303b15801561161357505f5460ff166001145b6116855760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610433565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156116e1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b0382166117375760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964206f776e6572206164647265737300000000000000000000006044820152606401610433565b61174082612308565b80156117a2575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461181e5760405162461bcd60e51b815260206004820152601c60248201527f6f6e6c79207265636f726420636f6e747261637420616c6c6f776564000000006044820152606401610433565b60658054905f61182d83612978565b919050555086600160655461184291906129af565b1461188f5760405162461bcd60e51b815260206004820152601360248201527f696e76616c69642065706f636820696e646578000000000000000000000000006044820152606401610433565b828514801561189d57508085145b6118e95760405162461bcd60e51b815260206004820152601360248201527f696e76616c69642064617461206c656e677468000000000000000000000000006044820152606401610433565b5f5b85811015611afc578484828181106119055761190561294b565b9050602002013560665f8989858181106119215761192161294b565b90506020020160208101906119369190612537565b6001600160a01b0316815260208082019290925260409081015f9081208c82529092528120919091556066908888848181106119745761197461294b565b90506020020160208101906119899190612537565b6001600160a01b0316815260208082019290925260409081015f9081208b82529092529020600101541580156119be57505f88115b15611a7f5760665f8888848181106119d8576119d861294b565b90506020020160208101906119ed9190612537565b6001600160a01b03166001600160a01b031681526020019081526020015f205f60018a611a1a91906129af565b81526020019081526020015f206001015460665f898985818110611a4057611a4061294b565b9050602002016020810190611a559190612537565b6001600160a01b0316815260208082019290925260409081015f9081208c82529092529020600101555b828282818110611a9157611a9161294b565b9050602002013560685f898985818110611aad57611aad61294b565b9050602002016020810190611ac29190612537565b6001600160a01b03166001600160a01b031681526020019081526020015f205f828254611aef9190612938565b90915550506001016118eb565b5050505050505050565b6001600160a01b0382165f908152606960205260408120611b279083611c36565b1590505b92915050565b611b39611bdc565b6001600160a01b038116611bb55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610433565b611bbe81612308565b50565b5f611b2b825490565b5f611bd58383612399565b9392505050565b6033546001600160a01b031633146109d45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610433565b6001600160a01b0381165f9081526001830160205260408120541515611bd5565b6001600160a01b0382165f9081526069602052604081208190611c7a9086611c36565b611cc65760405162461bcd60e51b815260206004820152601360248201527f6e6f2072656d61696e696e6720726577617264000000000000000000000000006044820152606401610433565b6001600160a01b038085165f9081526069602090815260408083209389168352600390930190522054831015611d3e5760405162461bcd60e51b815260206004820152601260248201527f616c6c2072657761726420636c61696d656400000000000000000000000000006044820152606401610433565b6001600160a01b038085165f9081526069602090815260408083209389168352600390930190529081205481905b858111611f7f576001600160a01b038089165f9081526066602090815260408083208584528252808320938b16835260049093019052205415611ddd576001600160a01b038089165f9081526066602090815260408083208584528252808320938b16835260049093019052205491505b6001600160a01b0388165f90815260666020908152604080832084845290915290206001015415611e31576001600160a01b0388165f90815260666020908152604080832084845290915290206001015492505b6001600160a01b0388165f9081526066602090815260408083208484529091529020548390611e619084906128e9565b611e6b9190612900565b611e759086612938565b6001600160a01b038089165f908152606960209081526040808320938d16835260029093019052205490955060ff168015611ed757506001600160a01b038088165f908152606960209081526040808320938c16835260049093019052205481145b15611f6d576001600160a01b0387165f90815260696020526040902060019450611f019089612371565b506001600160a01b038781165f908152606960209081526040808320938c16835260028401825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556003840182528083208390556004909301905290812055611f7f565b80611f7781612978565b915050611d6c565b50611f8b856001612938565b6001600160a01b038088165f908152606960209081526040808320938c16835260039093018152828220939093556066909252812090611fcc876001612938565b81526020019081526020015f206004015f876001600160a01b03166001600160a01b031681526020019081526020015f20545f03612052576001600160a01b0387165f9081526066602052604081208291612028886001612938565b815260208082019290925260409081015f9081206001600160a01b038b1682526004019092529020555b866001600160a01b0316866001600160a01b03167f7a84a08b02c91f3c62d572853f966fc799bbd121e8ad7833a4494ab8dcfcb40487876040516120a0929190918252602082015260400190565b60405180910390a35050935093915050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561212f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061215391906129c2565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152602482018590529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303815f875af11580156121dd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061220191906129d9565b506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561227f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a391906129c2565b90505f831180156122bc5750826122ba82846129af565b145b6109bd5760405162461bcd60e51b815260206004820152601b60248201527f6d6f72706820746f6b656e207472616e73666572206661696c656400000000006044820152606401610433565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f611bd5836001600160a01b0384166123bf565b5f611bd5836001600160a01b0384166124a2565b5f825f0182815481106123ae576123ae61294b565b905f5260205f200154905092915050565b5f8181526001830160205260408120548015612499575f6123e16001836129af565b85549091505f906123f4906001906129af565b9050818114612453575f865f0182815481106124125761241261294b565b905f5260205f200154905080875f0184815481106124325761243261294b565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080612464576124646129f4565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611b2b565b5f915050611b2b565b5f8181526001830160205260408120546124e757508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155611b2b565b505f611b2b565b5080545f8255905f5260205f2090810190611bbe91905b80821115612518575f8155600101612505565b5090565b80356001600160a01b0381168114612532575f80fd5b919050565b5f60208284031215612547575f80fd5b611bd58261251c565b5f815180845260208085019450602084015f5b838110156125885781516001600160a01b031687529582019590820190600101612563565b509495945050505050565b5f815180845260208085019450602084015f5b83811015612588578151875295820195908201906001016125a6565b604081525f6125d46040830185612550565b82810360208401526125e68185612593565b95945050505050565b5f8060408385031215612600575f80fd5b6126098361251c565b946020939093013593505050565b5f805f806080858703121561262a575f80fd5b6126338561251c565b93506126416020860161251c565b93969395505050506040820135916060013590565b608081525f6126686080830187612550565b8281036020848101919091528651808352878201928201905f5b818110156126a0578451151583529383019391830191600101612682565b505084810360408601526126b48188612593565b9250505082810360608401526126ca8185612593565b979650505050505050565b5f80604083850312156126e6575f80fd5b6126ef8361251c565b91506126fd6020840161251c565b90509250929050565b5f805f60608486031215612718575f80fd5b6127218461251c565b925061272f6020850161251c565b9150604084013590509250925092565b8015158114611bbe575f80fd5b5f805f805f8060c08789031215612761575f80fd5b61276a8761251c565b95506127786020880161251c565b945060408701359350606087013592506080870135915060a087013561279d8161273f565b809150509295509295509295565b5f8083601f8401126127bb575f80fd5b50813567ffffffffffffffff8111156127d2575f80fd5b6020830191508360208260051b85010111156127ec575f80fd5b9250929050565b5f805f805f805f6080888a031215612809575f80fd5b87359650602088013567ffffffffffffffff80821115612827575f80fd5b6128338b838c016127ab565b909850965060408a013591508082111561284b575f80fd5b6128578b838c016127ab565b909650945060608a013591508082111561286f575f80fd5b5061287c8a828b016127ab565b989b979a50959850939692959293505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082028115828204841417611b2b57611b2b6128bc565b5f82612933577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b80820180821115611b2b57611b2b6128bc565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036129a8576129a86128bc565b5060010190565b81810381811115611b2b57611b2b6128bc565b5f602082840312156129d2575f80fd5b5051919050565b5f602082840312156129e9575f80fd5b8151611bd58161273f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea164736f6c6343000818000a", } // DistributeABI is the input ABI used to generate the binding from. diff --git a/bindings/bindings/distribute_more.go b/bindings/bindings/distribute_more.go index c64d807e..decb59f6 100644 --- a/bindings/bindings/distribute_more.go +++ b/bindings/bindings/distribute_more.go @@ -13,7 +13,7 @@ const DistributeStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\": var DistributeStorageLayout = new(solc.StorageLayout) -var DistributeDeployedBin = "0x608060405234801561000f575f80fd5b5060043610610163575f3560e01c8063a766c529116100c7578063cd4281d01161007d578063d557714111610063578063d557714114610372578063de6ac93314610399578063f2fde38b146103bc575f80fd5b8063cd4281d014610338578063cdd0c50e1461035f575f80fd5b8063b809af0f116100ad578063b809af0f146102dd578063bf2dca0a146102f0578063c4d66de814610325575f80fd5b8063a766c52914610295578063ac2ac640146102ca575f80fd5b8063807de4431161011c578063921ae9b811610102578063921ae9b81461023e5780639889be5114610261578063996cba6814610282575f80fd5b8063807de443146101d45780638da5cb5b14610220575f80fd5b80635cf20c7b1161014c5780635cf20c7b146101a6578063715018a6146101b95780637f683ee3146101c1575f80fd5b8063273d8e82146101675780634eedab3214610191575b5f80fd5b61017a610175366004612ca3565b6103cf565b604051610188929190612d3b565b60405180910390f35b6101a461019f366004612d68565b610820565b005b6101a46101b4366004612d68565b6108e5565b6101a4610b39565b6101a46101cf366004612d90565b610b4c565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610188565b60335473ffffffffffffffffffffffffffffffffffffffff166101fb565b61025161024c366004612ca3565b610e14565b6040516101889493929190612dcf565b61027461026f366004612e4e565b611214565b604051908152602001610188565b6101a4610290366004612e7f565b6115a1565b6102746102a3366004612ca3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526067602052604090205490565b6101a46102d8366004612ca3565b611706565b6101a46102eb366004612ec5565b6118b7565b6102746102fe366004612ca3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526068602052604090205490565b6101a4610333366004612ca3565b611a50565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b6101a461036d366004612f6c565b611c5b565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b6103ac6103a7366004612e4e565b612071565b6040519015158152602001610188565b6101a46103ca366004612ca3565b6120a9565b73ffffffffffffffffffffffffffffffffffffffff81165f908152606960205260408120606091829161040190612160565b9050805f03610497576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f696e76616c69642064656c656761746f72206f72206e6f2072656d61696e696e60448201527f672072657761726400000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b8067ffffffffffffffff8111156104b0576104b0613008565b6040519080825280602002602001820160405280156104d9578160200160208202803683370190505b5092508067ffffffffffffffff8111156104f5576104f5613008565b60405190808252806020026020018201604052801561051e578160200160208202803683370190505b5091505f5b73ffffffffffffffffffffffffffffffffffffffff85165f90815260696020526040902061055090612160565b8110156108195773ffffffffffffffffffffffffffffffffffffffff85165f9081526069602052604081206105859083612169565b73ffffffffffffffffffffffffffffffffffffffff8088165f908152606960209081526040808320938516835260039093019052908120549192509081908190805b60655481101561079c5773ffffffffffffffffffffffffffffffffffffffff8087165f9081526066602090815260408083208584528252808320938f168352600490930190522054156106555773ffffffffffffffffffffffffffffffffffffffff8087165f9081526066602090815260408083208584528252808320938f16835260049093019052205492505b73ffffffffffffffffffffffffffffffffffffffff86165f908152606660209081526040808320848452909152902060010154156106c35773ffffffffffffffffffffffffffffffffffffffff86165f90815260666020908152604080832084845290915290206001015493505b73ffffffffffffffffffffffffffffffffffffffff86165f9081526066602090815260408083208484529091529020548490610700908590613062565b61070a9190613079565b61071490866130b1565b73ffffffffffffffffffffffffffffffffffffffff808d165f908152606960209081526040808320938b16835260029093019052205490955060ff168015610790575073ffffffffffffffffffffffffffffffffffffffff808c165f908152606960209081526040808320938a16835260049093019052205481145b61079c576001016105c7565b50848987815181106107b0576107b06130c4565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838887815181106107fd576107fd6130c4565b6020908102919091010152505060019093019250610523915050565b5050915091565b61082861217b565b73ffffffffffffffffffffffffffffffffffffffff82165f908152606760205260409020545b8181116108b95773ffffffffffffffffffffffffffffffffffffffff83165f90815260666020908152604080832084845290915281208181556001810182905590600282018181816108a08282612c4d565b50505050505080806108b1906130f1565b91505061084e565b73ffffffffffffffffffffffffffffffffffffffff9092165f9081526067602052604090209190915550565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f776564604482015260640161048e565b6065545f036109ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f6e6f74206d696e74656420796574000000000000000000000000000000000000604482015260640161048e565b5f811580610a0a57506001606554610a079190613128565b82115b610a145781610a23565b6001606554610a239190613128565b90505f805b73ffffffffffffffffffffffffffffffffffffffff85165f908152606960205260409020610a5590612160565b811015610b225773ffffffffffffffffffffffffffffffffffffffff85165f908152606960205260408120610a8a9083612169565b73ffffffffffffffffffffffffffffffffffffffff87165f908152606960205260409020909150610abb90826121fc565b8015610afc575073ffffffffffffffffffffffffffffffffffffffff8087165f90815260696020908152604080832093851683526003909301905220548410155b15610b1957610b0c81878661222a565b610b1690846130b1565b92505b50600101610a28565b508015610b3357610b3384826127a9565b50505050565b610b4161217b565b610b4a5f612a40565b565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610beb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f776564604482015260640161048e565b73ffffffffffffffffffffffffffffffffffffffff84165f9081526066602090815260408083208584529091529020600101819055811580610c61575073ffffffffffffffffffffffffffffffffffffffff8084165f908152606960209081526040808320938816835260039093019052205482145b15610d6d5773ffffffffffffffffffffffffffffffffffffffff84165f9081526066602090815260408083208584529091529020610ca29060020184612ab6565b5073ffffffffffffffffffffffffffffffffffffffff8085165f90815260666020908152604080832086845282528083209387168352600490930181528282208290556069905220610cf49085612ab6565b5073ffffffffffffffffffffffffffffffffffffffff8381165f908152606960209081526040808320938816835260028401825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556003840182528083208390556004909301905290812055610b33565b73ffffffffffffffffffffffffffffffffffffffff8084165f9081526069602090815260408083209388168352600290930190522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155610dd89083613128565b73ffffffffffffffffffffffffffffffffffffffff8085165f908152606960209081526040808320938916835260049093019052205550505050565b73ffffffffffffffffffffffffffffffffffffffff81165f908152606960205260408120606091829182918291610e4a90612160565b90505f8167ffffffffffffffff811115610e6657610e66613008565b604051908082528060200260200182016040528015610e8f578160200160208202803683370190505b5090505f8267ffffffffffffffff811115610eac57610eac613008565b604051908082528060200260200182016040528015610ed5578160200160208202803683370190505b5090505f8367ffffffffffffffff811115610ef257610ef2613008565b604051908082528060200260200182016040528015610f1b578160200160208202803683370190505b5090505f8467ffffffffffffffff811115610f3857610f38613008565b604051908082528060200260200182016040528015610f61578160200160208202803683370190505b5090505f5b858110156112035773ffffffffffffffffffffffffffffffffffffffff8b165f908152606960205260409020610f9c9082612169565b858281518110610fae57610fae6130c4565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060695f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015f86838151811061103b5761103b6130c4565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1684828151811061109b5761109b6130c4565b91151560209283029190910182015273ffffffffffffffffffffffffffffffffffffffff8c165f9081526069909152604081208651600390910191908790849081106110e9576110e96130c4565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205483828151811061113d5761113d6130c4565b60200260200101818152505060695f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206004015f86838151811061119c5761119c6130c4565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20548282815181106111f0576111f06130c4565b6020908102919091010152600101610f66565b509299919850965090945092505050565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260696020526040812061124190612160565b5f036112cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f696e76616c69642064656c656761746f72206f72206e6f2072656d61696e696e60448201527f6720726577617264000000000000000000000000000000000000000000000000606482015260840161048e565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526069602052604090206112fd90846121fc565b611388576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f6e6f2072656d61696e696e6720726577617264206f66207468652064656c656760448201527f6174656500000000000000000000000000000000000000000000000000000000606482015260840161048e565b73ffffffffffffffffffffffffffffffffffffffff8083165f9081526069602090815260408083209387168352600390930190529081205481905b6065548110156115985773ffffffffffffffffffffffffffffffffffffffff8087165f90815260666020908152604080832085845282528083209389168352600490930190522054156114515773ffffffffffffffffffffffffffffffffffffffff8087165f9081526066602090815260408083208584528252808320938916835260049093019052205491505b73ffffffffffffffffffffffffffffffffffffffff86165f908152606660209081526040808320848452909152902060010154156114bf5773ffffffffffffffffffffffffffffffffffffffff86165f90815260666020908152604080832084845290915290206001015492505b73ffffffffffffffffffffffffffffffffffffffff86165f90815260666020908152604080832084845290915290205483906114fc908490613062565b6115069190613079565b61151090856130b1565b73ffffffffffffffffffffffffffffffffffffffff8087165f908152606960209081526040808320938b16835260029093019052205490945060ff16801561158c575073ffffffffffffffffffffffffffffffffffffffff8086165f908152606960209081526040808320938a16835260049093019052205481145b611598576001016113c3565b50505092915050565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614611640576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f776564604482015260640161048e565b6065545f036116ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f6e6f74206d696e74656420796574000000000000000000000000000000000000604482015260640161048e565b5f8115806116c6575060016065546116c39190613128565b82115b6116d057816116df565b60016065546116df9190613128565b90505f6116ed85858461222a565b905080156116ff576116ff84826127a9565b5050505050565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146117a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f776564604482015260640161048e565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260686020526040902054611830576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6e6f20636f6d6d697373696f6e20746f20636c61696d00000000000000000000604482015260640161048e565b73ffffffffffffffffffffffffffffffffffffffff81165f908152606860205260408120805491905561186382826127a9565b8173ffffffffffffffffffffffffffffffffffffffff167f8e14daa5332205b1634040e1054e93d1f5396ec8bf0115d133b7fbaf4a52e411826040516118ab91815260200190565b60405180910390a25050565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614611956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f776564604482015260640161048e565b73ffffffffffffffffffffffffffffffffffffffff86165f9081526066602090815260408083208784529091529020600181018390556119999060020186612ad7565b5073ffffffffffffffffffffffffffffffffffffffff8087165f9081526066602090815260408083208884528252808320938916835260049093019052208390558015611a485773ffffffffffffffffffffffffffffffffffffffff85165f908152606960205260409020611a0e9087612ad7565b5073ffffffffffffffffffffffffffffffffffffffff8086165f908152606960209081526040808320938a16835260039093019052208490555b505050505050565b5f54610100900460ff1615808015611a6e57505f54600160ff909116105b80611a875750303b158015611a8757505f5460ff166001145b611b13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161048e565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611b6f575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff8216611bec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c6964206f776e657220616464726573730000000000000000000000604482015260640161048e565b611bf582612a40565b8015611c57575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614611cfa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6f6e6c79207265636f726420636f6e747261637420616c6c6f77656400000000604482015260640161048e565b60658054905f611d09836130f1565b9190505550866001606554611d1e9190613128565b14611d85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c69642065706f636820696e64657800000000000000000000000000604482015260640161048e565b8285148015611d9357508085145b611df9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c69642064617461206c656e67746800000000000000000000000000604482015260640161048e565b5f5b8581101561206757848482818110611e1557611e156130c4565b9050602002013560665f898985818110611e3157611e316130c4565b9050602002016020810190611e469190612ca3565b73ffffffffffffffffffffffffffffffffffffffff16815260208082019290925260409081015f9081208c8252909252812091909155606690888884818110611e9157611e916130c4565b9050602002016020810190611ea69190612ca3565b73ffffffffffffffffffffffffffffffffffffffff16815260208082019290925260409081015f9081208b8252909252902060010154158015611ee857505f88115b15611fd05760665f888884818110611f0257611f026130c4565b9050602002016020810190611f179190612ca3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60018a611f5e9190613128565b81526020019081526020015f206001015460665f898985818110611f8457611f846130c4565b9050602002016020810190611f999190612ca3565b73ffffffffffffffffffffffffffffffffffffffff16815260208082019290925260409081015f9081208c82529092529020600101555b828282818110611fe257611fe26130c4565b9050602002013560685f898985818110611ffe57611ffe6130c4565b90506020020160208101906120139190612ca3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461205a91906130b1565b9091555050600101611dfb565b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260696020526040812061209f90836121fc565b1590505b92915050565b6120b161217b565b73ffffffffffffffffffffffffffffffffffffffff8116612154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161048e565b61215d81612a40565b50565b5f6120a3825490565b5f6121748383612af8565b9392505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314610b4a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161048e565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526001830160205260408120541515612174565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260696020526040812061225890856121fc565b6122be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f6e6f2072656d61696e696e672072657761726400000000000000000000000000604482015260640161048e565b73ffffffffffffffffffffffffffffffffffffffff8084165f908152606960209081526040808320938816835260039093019052205482101561235d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f616c6c2072657761726420636c61696d65640000000000000000000000000000604482015260640161048e565b73ffffffffffffffffffffffffffffffffffffffff8084165f9081526069602090815260408083209388168352600390930190529081205481905b84811161261c5773ffffffffffffffffffffffffffffffffffffffff8088165f9081526066602090815260408083208584528252808320938a168352600490930190522054156124235773ffffffffffffffffffffffffffffffffffffffff8088165f9081526066602090815260408083208584528252808320938a16835260049093019052205491505b73ffffffffffffffffffffffffffffffffffffffff87165f908152606660209081526040808320848452909152902060010154156124915773ffffffffffffffffffffffffffffffffffffffff87165f90815260666020908152604080832084845290915290206001015492505b73ffffffffffffffffffffffffffffffffffffffff87165f90815260666020908152604080832084845290915290205483906124ce908490613062565b6124d89190613079565b6124e290856130b1565b73ffffffffffffffffffffffffffffffffffffffff8088165f908152606960209081526040808320938c16835260029093019052205490945060ff16801561255e575073ffffffffffffffffffffffffffffffffffffffff8087165f908152606960209081526040808320938b16835260049093019052205481145b1561260a5773ffffffffffffffffffffffffffffffffffffffff86165f9081526069602052604090206125919088612ab6565b5073ffffffffffffffffffffffffffffffffffffffff8681165f908152606960209081526040808320938b16835260028401825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600384018252808320839055600490930190529081205561261c565b80612614816130f1565b915050612398565b506126288460016130b1565b73ffffffffffffffffffffffffffffffffffffffff8087165f908152606960209081526040808320938b168352600390930181528282209390935560669092528120906126768660016130b1565b81526020019081526020015f206004015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20545f036127305773ffffffffffffffffffffffffffffffffffffffff86165f90815260666020526040812082916126f98760016130b1565b815260208082019290925260409081015f90812073ffffffffffffffffffffffffffffffffffffffff8a1682526004019092529020555b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f7a84a08b02c91f3c62d572853f966fc799bbd121e8ad7833a4494ab8dcfcb4048686604051612798929190918252602082015260400190565b60405180910390a350509392505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612833573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612857919061313b565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303815f875af11580156128ee573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129129190613152565b506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa15801561299d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129c1919061313b565b90505f831180156129da5750826129d88284613128565b145b610b33576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6d6f72706820746f6b656e207472616e73666572206661696c65640000000000604482015260640161048e565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f6121748373ffffffffffffffffffffffffffffffffffffffff8416612b1e565b5f6121748373ffffffffffffffffffffffffffffffffffffffff8416612c01565b5f825f018281548110612b0d57612b0d6130c4565b905f5260205f200154905092915050565b5f8181526001830160205260408120548015612bf8575f612b40600183613128565b85549091505f90612b5390600190613128565b9050818114612bb2575f865f018281548110612b7157612b716130c4565b905f5260205f200154905080875f018481548110612b9157612b916130c4565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080612bc357612bc361316d565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506120a3565b5f9150506120a3565b5f818152600183016020526040812054612c4657508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556120a3565b505f6120a3565b5080545f8255905f5260205f209081019061215d91905b80821115612c77575f8155600101612c64565b5090565b803573ffffffffffffffffffffffffffffffffffffffff81168114612c9e575f80fd5b919050565b5f60208284031215612cb3575f80fd5b61217482612c7b565b5f815180845260208085019450602084015f5b83811015612d0157815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101612ccf565b509495945050505050565b5f815180845260208085019450602084015f5b83811015612d0157815187529582019590820190600101612d1f565b604081525f612d4d6040830185612cbc565b8281036020840152612d5f8185612d0c565b95945050505050565b5f8060408385031215612d79575f80fd5b612d8283612c7b565b946020939093013593505050565b5f805f8060808587031215612da3575f80fd5b612dac85612c7b565b9350612dba60208601612c7b565b93969395505050506040820135916060013590565b608081525f612de16080830187612cbc565b8281036020848101919091528651808352878201928201905f5b81811015612e19578451151583529383019391830191600101612dfb565b50508481036040860152612e2d8188612d0c565b925050508281036060840152612e438185612d0c565b979650505050505050565b5f8060408385031215612e5f575f80fd5b612e6883612c7b565b9150612e7660208401612c7b565b90509250929050565b5f805f60608486031215612e91575f80fd5b612e9a84612c7b565b9250612ea860208501612c7b565b9150604084013590509250925092565b801515811461215d575f80fd5b5f805f805f8060c08789031215612eda575f80fd5b612ee387612c7b565b9550612ef160208801612c7b565b945060408701359350606087013592506080870135915060a0870135612f1681612eb8565b809150509295509295509295565b5f8083601f840112612f34575f80fd5b50813567ffffffffffffffff811115612f4b575f80fd5b6020830191508360208260051b8501011115612f65575f80fd5b9250929050565b5f805f805f805f6080888a031215612f82575f80fd5b87359650602088013567ffffffffffffffff80821115612fa0575f80fd5b612fac8b838c01612f24565b909850965060408a0135915080821115612fc4575f80fd5b612fd08b838c01612f24565b909650945060608a0135915080821115612fe8575f80fd5b50612ff58a828b01612f24565b989b979a50959850939692959293505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820281158282048414176120a3576120a3613035565b5f826130ac577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b808201808211156120a3576120a3613035565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361312157613121613035565b5060010190565b818103818111156120a3576120a3613035565b5f6020828403121561314b575f80fd5b5051919050565b5f60208284031215613162575f80fd5b815161217481612eb8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea164736f6c6343000818000a" +var DistributeDeployedBin = "0x608060405234801561000f575f80fd5b5060043610610163575f3560e01c8063a766c529116100c7578063cd4281d01161007d578063d557714111610063578063d557714114610372578063de6ac93314610399578063f2fde38b146103bc575f80fd5b8063cd4281d014610338578063cdd0c50e1461035f575f80fd5b8063b809af0f116100ad578063b809af0f146102dd578063bf2dca0a146102f0578063c4d66de814610325575f80fd5b8063a766c52914610295578063ac2ac640146102ca575f80fd5b8063807de4431161011c578063921ae9b811610102578063921ae9b81461023e5780639889be5114610261578063996cba6814610282575f80fd5b8063807de443146101d45780638da5cb5b14610220575f80fd5b80635cf20c7b1161014c5780635cf20c7b146101a6578063715018a6146101b95780637f683ee3146101c1575f80fd5b8063273d8e82146101675780634eedab3214610191575b5f80fd5b61017a610175366004612cc8565b6103cf565b604051610188929190612d60565b60405180910390f35b6101a461019f366004612d8d565b610820565b005b6101a46101b4366004612d8d565b6108e5565b6101a4610b56565b6101a46101cf366004612db5565b610b69565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610188565b60335473ffffffffffffffffffffffffffffffffffffffff166101fb565b61025161024c366004612cc8565b610e31565b6040516101889493929190612df4565b61027461026f366004612e73565b611231565b604051908152602001610188565b6101a4610290366004612ea4565b6115be565b6102746102a3366004612cc8565b73ffffffffffffffffffffffffffffffffffffffff165f9081526067602052604090205490565b6101a46102d8366004612cc8565b611724565b6101a46102eb366004612eea565b6118d5565b6102746102fe366004612cc8565b73ffffffffffffffffffffffffffffffffffffffff165f9081526068602052604090205490565b6101a4610333366004612cc8565b611a6e565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b6101a461036d366004612f91565b611c79565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b6103ac6103a7366004612e73565b61208f565b6040519015158152602001610188565b6101a46103ca366004612cc8565b6120c7565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260696020526040812060609182916104019061217e565b9050805f03610497576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f696e76616c69642064656c656761746f72206f72206e6f2072656d61696e696e60448201527f672072657761726400000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b8067ffffffffffffffff8111156104b0576104b061302d565b6040519080825280602002602001820160405280156104d9578160200160208202803683370190505b5092508067ffffffffffffffff8111156104f5576104f561302d565b60405190808252806020026020018201604052801561051e578160200160208202803683370190505b5091505f5b73ffffffffffffffffffffffffffffffffffffffff85165f9081526069602052604090206105509061217e565b8110156108195773ffffffffffffffffffffffffffffffffffffffff85165f9081526069602052604081206105859083612187565b73ffffffffffffffffffffffffffffffffffffffff8088165f908152606960209081526040808320938516835260039093019052908120549192509081908190805b60655481101561079c5773ffffffffffffffffffffffffffffffffffffffff8087165f9081526066602090815260408083208584528252808320938f168352600490930190522054156106555773ffffffffffffffffffffffffffffffffffffffff8087165f9081526066602090815260408083208584528252808320938f16835260049093019052205492505b73ffffffffffffffffffffffffffffffffffffffff86165f908152606660209081526040808320848452909152902060010154156106c35773ffffffffffffffffffffffffffffffffffffffff86165f90815260666020908152604080832084845290915290206001015493505b73ffffffffffffffffffffffffffffffffffffffff86165f9081526066602090815260408083208484529091529020548490610700908590613087565b61070a919061309e565b61071490866130d6565b73ffffffffffffffffffffffffffffffffffffffff808d165f908152606960209081526040808320938b16835260029093019052205490955060ff168015610790575073ffffffffffffffffffffffffffffffffffffffff808c165f908152606960209081526040808320938a16835260049093019052205481145b61079c576001016105c7565b50848987815181106107b0576107b06130e9565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838887815181106107fd576107fd6130e9565b6020908102919091010152505060019093019250610523915050565b5050915091565b610828612199565b73ffffffffffffffffffffffffffffffffffffffff82165f908152606760205260409020545b8181116108b95773ffffffffffffffffffffffffffffffffffffffff83165f90815260666020908152604080832084845290915281208181556001810182905590600282018181816108a08282612c72565b50505050505080806108b190613116565b91505061084e565b73ffffffffffffffffffffffffffffffffffffffff9092165f9081526067602052604090209190915550565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f776564604482015260640161048e565b6065545f036109ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f6e6f74206d696e74656420796574000000000000000000000000000000000000604482015260640161048e565b5f811580610a0a57506001606554610a07919061314d565b82115b610a145781610a23565b6001606554610a23919061314d565b90505f805b73ffffffffffffffffffffffffffffffffffffffff85165f908152606960205260409020610a559061217e565b811015610b3f5773ffffffffffffffffffffffffffffffffffffffff85165f9081526069602052604081208190610a8c9084612187565b73ffffffffffffffffffffffffffffffffffffffff88165f908152606960205260409020909150610abd908261221a565b8015610afe575073ffffffffffffffffffffffffffffffffffffffff8088165f90815260696020908152604080832093851683526003909301905220548510155b15610b25575f80610b10838a89612248565b9092509050610b1f82876130d6565b95509250505b81610b385782610b3481613116565b9350505b5050610a28565b508015610b5057610b5084826127ce565b50505050565b610b5e612199565b610b675f612a65565b565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610c08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f776564604482015260640161048e565b73ffffffffffffffffffffffffffffffffffffffff84165f9081526066602090815260408083208584529091529020600101819055811580610c7e575073ffffffffffffffffffffffffffffffffffffffff8084165f908152606960209081526040808320938816835260039093019052205482145b15610d8a5773ffffffffffffffffffffffffffffffffffffffff84165f9081526066602090815260408083208584529091529020610cbf9060020184612adb565b5073ffffffffffffffffffffffffffffffffffffffff8085165f90815260666020908152604080832086845282528083209387168352600490930181528282208290556069905220610d119085612adb565b5073ffffffffffffffffffffffffffffffffffffffff8381165f908152606960209081526040808320938816835260028401825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556003840182528083208390556004909301905290812055610b50565b73ffffffffffffffffffffffffffffffffffffffff8084165f9081526069602090815260408083209388168352600290930190522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155610df5908361314d565b73ffffffffffffffffffffffffffffffffffffffff8085165f908152606960209081526040808320938916835260049093019052205550505050565b73ffffffffffffffffffffffffffffffffffffffff81165f908152606960205260408120606091829182918291610e679061217e565b90505f8167ffffffffffffffff811115610e8357610e8361302d565b604051908082528060200260200182016040528015610eac578160200160208202803683370190505b5090505f8267ffffffffffffffff811115610ec957610ec961302d565b604051908082528060200260200182016040528015610ef2578160200160208202803683370190505b5090505f8367ffffffffffffffff811115610f0f57610f0f61302d565b604051908082528060200260200182016040528015610f38578160200160208202803683370190505b5090505f8467ffffffffffffffff811115610f5557610f5561302d565b604051908082528060200260200182016040528015610f7e578160200160208202803683370190505b5090505f5b858110156112205773ffffffffffffffffffffffffffffffffffffffff8b165f908152606960205260409020610fb99082612187565b858281518110610fcb57610fcb6130e9565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060695f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015f868381518110611058576110586130e9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168482815181106110b8576110b86130e9565b91151560209283029190910182015273ffffffffffffffffffffffffffffffffffffffff8c165f908152606990915260408120865160039091019190879084908110611106576111066130e9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205483828151811061115a5761115a6130e9565b60200260200101818152505060695f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206004015f8683815181106111b9576111b96130e9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205482828151811061120d5761120d6130e9565b6020908102919091010152600101610f83565b509299919850965090945092505050565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260696020526040812061125e9061217e565b5f036112ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f696e76616c69642064656c656761746f72206f72206e6f2072656d61696e696e60448201527f6720726577617264000000000000000000000000000000000000000000000000606482015260840161048e565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260696020526040902061131a908461221a565b6113a5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f6e6f2072656d61696e696e6720726577617264206f66207468652064656c656760448201527f6174656500000000000000000000000000000000000000000000000000000000606482015260840161048e565b73ffffffffffffffffffffffffffffffffffffffff8083165f9081526069602090815260408083209387168352600390930190529081205481905b6065548110156115b55773ffffffffffffffffffffffffffffffffffffffff8087165f908152606660209081526040808320858452825280832093891683526004909301905220541561146e5773ffffffffffffffffffffffffffffffffffffffff8087165f9081526066602090815260408083208584528252808320938916835260049093019052205491505b73ffffffffffffffffffffffffffffffffffffffff86165f908152606660209081526040808320848452909152902060010154156114dc5773ffffffffffffffffffffffffffffffffffffffff86165f90815260666020908152604080832084845290915290206001015492505b73ffffffffffffffffffffffffffffffffffffffff86165f9081526066602090815260408083208484529091529020548390611519908490613087565b611523919061309e565b61152d90856130d6565b73ffffffffffffffffffffffffffffffffffffffff8087165f908152606960209081526040808320938b16835260029093019052205490945060ff1680156115a9575073ffffffffffffffffffffffffffffffffffffffff8086165f908152606960209081526040808320938a16835260049093019052205481145b6115b5576001016113e0565b50505092915050565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff161461165d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f776564604482015260640161048e565b6065545f036116c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f6e6f74206d696e74656420796574000000000000000000000000000000000000604482015260640161048e565b5f8115806116e3575060016065546116e0919061314d565b82115b6116ed57816116fc565b60016065546116fc919061314d565b90505f61170a858584612248565b509050801561171d5761171d84826127ce565b5050505050565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146117c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f776564604482015260640161048e565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526068602052604090205461184e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6e6f20636f6d6d697373696f6e20746f20636c61696d00000000000000000000604482015260640161048e565b73ffffffffffffffffffffffffffffffffffffffff81165f908152606860205260408120805491905561188182826127ce565b8173ffffffffffffffffffffffffffffffffffffffff167f8e14daa5332205b1634040e1054e93d1f5396ec8bf0115d133b7fbaf4a52e411826040516118c991815260200190565b60405180910390a25050565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614611974576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f776564604482015260640161048e565b73ffffffffffffffffffffffffffffffffffffffff86165f9081526066602090815260408083208784529091529020600181018390556119b79060020186612afc565b5073ffffffffffffffffffffffffffffffffffffffff8087165f9081526066602090815260408083208884528252808320938916835260049093019052208390558015611a665773ffffffffffffffffffffffffffffffffffffffff85165f908152606960205260409020611a2c9087612afc565b5073ffffffffffffffffffffffffffffffffffffffff8086165f908152606960209081526040808320938a16835260039093019052208490555b505050505050565b5f54610100900460ff1615808015611a8c57505f54600160ff909116105b80611aa55750303b158015611aa557505f5460ff166001145b611b31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161048e565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611b8d575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff8216611c0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c6964206f776e657220616464726573730000000000000000000000604482015260640161048e565b611c1382612a65565b8015611c75575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614611d18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6f6e6c79207265636f726420636f6e747261637420616c6c6f77656400000000604482015260640161048e565b60658054905f611d2783613116565b9190505550866001606554611d3c919061314d565b14611da3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c69642065706f636820696e64657800000000000000000000000000604482015260640161048e565b8285148015611db157508085145b611e17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c69642064617461206c656e67746800000000000000000000000000604482015260640161048e565b5f5b8581101561208557848482818110611e3357611e336130e9565b9050602002013560665f898985818110611e4f57611e4f6130e9565b9050602002016020810190611e649190612cc8565b73ffffffffffffffffffffffffffffffffffffffff16815260208082019290925260409081015f9081208c8252909252812091909155606690888884818110611eaf57611eaf6130e9565b9050602002016020810190611ec49190612cc8565b73ffffffffffffffffffffffffffffffffffffffff16815260208082019290925260409081015f9081208b8252909252902060010154158015611f0657505f88115b15611fee5760665f888884818110611f2057611f206130e9565b9050602002016020810190611f359190612cc8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60018a611f7c919061314d565b81526020019081526020015f206001015460665f898985818110611fa257611fa26130e9565b9050602002016020810190611fb79190612cc8565b73ffffffffffffffffffffffffffffffffffffffff16815260208082019290925260409081015f9081208c82529092529020600101555b828282818110612000576120006130e9565b9050602002013560685f89898581811061201c5761201c6130e9565b90506020020160208101906120319190612cc8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461207891906130d6565b9091555050600101611e19565b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526069602052604081206120bd908361221a565b1590505b92915050565b6120cf612199565b73ffffffffffffffffffffffffffffffffffffffff8116612172576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161048e565b61217b81612a65565b50565b5f6120c1825490565b5f6121928383612b1d565b9392505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314610b67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161048e565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526001830160205260408120541515612192565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526069602052604081208190612278908661221a565b6122de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f6e6f2072656d61696e696e672072657761726400000000000000000000000000604482015260640161048e565b73ffffffffffffffffffffffffffffffffffffffff8085165f908152606960209081526040808320938916835260039093019052205483101561237d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f616c6c2072657761726420636c61696d65640000000000000000000000000000604482015260640161048e565b73ffffffffffffffffffffffffffffffffffffffff8085165f9081526069602090815260408083209389168352600390930190529081205481905b8581116126405773ffffffffffffffffffffffffffffffffffffffff8089165f9081526066602090815260408083208584528252808320938b168352600490930190522054156124435773ffffffffffffffffffffffffffffffffffffffff8089165f9081526066602090815260408083208584528252808320938b16835260049093019052205491505b73ffffffffffffffffffffffffffffffffffffffff88165f908152606660209081526040808320848452909152902060010154156124b15773ffffffffffffffffffffffffffffffffffffffff88165f90815260666020908152604080832084845290915290206001015492505b73ffffffffffffffffffffffffffffffffffffffff88165f90815260666020908152604080832084845290915290205483906124ee908490613087565b6124f8919061309e565b61250290866130d6565b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606960209081526040808320938d16835260029093019052205490955060ff16801561257e575073ffffffffffffffffffffffffffffffffffffffff8088165f908152606960209081526040808320938c16835260049093019052205481145b1561262e5773ffffffffffffffffffffffffffffffffffffffff87165f908152606960205260409020600194506125b59089612adb565b5073ffffffffffffffffffffffffffffffffffffffff8781165f908152606960209081526040808320938c16835260028401825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556003840182528083208390556004909301905290812055612640565b8061263881613116565b9150506123b8565b5061264c8560016130d6565b73ffffffffffffffffffffffffffffffffffffffff8088165f908152606960209081526040808320938c1683526003909301815282822093909355606690925281209061269a8760016130d6565b81526020019081526020015f206004015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20545f036127545773ffffffffffffffffffffffffffffffffffffffff87165f908152606660205260408120829161271d8860016130d6565b815260208082019290925260409081015f90812073ffffffffffffffffffffffffffffffffffffffff8b1682526004019092529020555b8673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f7a84a08b02c91f3c62d572853f966fc799bbd121e8ad7833a4494ab8dcfcb40487876040516127bc929190918252602082015260400190565b60405180910390a35050935093915050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612858573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061287c9190613160565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303815f875af1158015612913573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129379190613177565b506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156129c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129e69190613160565b90505f831180156129ff5750826129fd828461314d565b145b610b50576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6d6f72706820746f6b656e207472616e73666572206661696c65640000000000604482015260640161048e565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f6121928373ffffffffffffffffffffffffffffffffffffffff8416612b43565b5f6121928373ffffffffffffffffffffffffffffffffffffffff8416612c26565b5f825f018281548110612b3257612b326130e9565b905f5260205f200154905092915050565b5f8181526001830160205260408120548015612c1d575f612b6560018361314d565b85549091505f90612b789060019061314d565b9050818114612bd7575f865f018281548110612b9657612b966130e9565b905f5260205f200154905080875f018481548110612bb657612bb66130e9565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080612be857612be8613192565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506120c1565b5f9150506120c1565b5f818152600183016020526040812054612c6b57508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556120c1565b505f6120c1565b5080545f8255905f5260205f209081019061217b91905b80821115612c9c575f8155600101612c89565b5090565b803573ffffffffffffffffffffffffffffffffffffffff81168114612cc3575f80fd5b919050565b5f60208284031215612cd8575f80fd5b61219282612ca0565b5f815180845260208085019450602084015f5b83811015612d2657815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101612cf4565b509495945050505050565b5f815180845260208085019450602084015f5b83811015612d2657815187529582019590820190600101612d44565b604081525f612d726040830185612ce1565b8281036020840152612d848185612d31565b95945050505050565b5f8060408385031215612d9e575f80fd5b612da783612ca0565b946020939093013593505050565b5f805f8060808587031215612dc8575f80fd5b612dd185612ca0565b9350612ddf60208601612ca0565b93969395505050506040820135916060013590565b608081525f612e066080830187612ce1565b8281036020848101919091528651808352878201928201905f5b81811015612e3e578451151583529383019391830191600101612e20565b50508481036040860152612e528188612d31565b925050508281036060840152612e688185612d31565b979650505050505050565b5f8060408385031215612e84575f80fd5b612e8d83612ca0565b9150612e9b60208401612ca0565b90509250929050565b5f805f60608486031215612eb6575f80fd5b612ebf84612ca0565b9250612ecd60208501612ca0565b9150604084013590509250925092565b801515811461217b575f80fd5b5f805f805f8060c08789031215612eff575f80fd5b612f0887612ca0565b9550612f1660208801612ca0565b945060408701359350606087013592506080870135915060a0870135612f3b81612edd565b809150509295509295509295565b5f8083601f840112612f59575f80fd5b50813567ffffffffffffffff811115612f70575f80fd5b6020830191508360208260051b8501011115612f8a575f80fd5b9250929050565b5f805f805f805f6080888a031215612fa7575f80fd5b87359650602088013567ffffffffffffffff80821115612fc5575f80fd5b612fd18b838c01612f49565b909850965060408a0135915080821115612fe9575f80fd5b612ff58b838c01612f49565b909650945060608a013591508082111561300d575f80fd5b5061301a8a828b01612f49565b989b979a50959850939692959293505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820281158282048414176120c1576120c161305a565b5f826130d1577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b808201808211156120c1576120c161305a565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036131465761314661305a565b5060010190565b818103818111156120c1576120c161305a565b5f60208284031215613170575f80fd5b5051919050565b5f60208284031215613187575f80fd5b815161219281612edd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea164736f6c6343000818000a" func init() { if err := json.Unmarshal([]byte(DistributeStorageLayoutJSON), DistributeStorageLayout); err != nil { diff --git a/bindings/bindings/gov.go b/bindings/bindings/gov.go index 52a93518..464d964e 100644 --- a/bindings/bindings/gov.go +++ b/bindings/bindings/gov.go @@ -38,8 +38,8 @@ type IGovProposalData struct { // GovMetaData contains all meta data concerning the Gov contract. var GovMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldBatchBlockInterval\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBatchBlockInterval\",\"type\":\"uint256\"}],\"name\":\"BatchBlockIntervalUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldBatchTimeout\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBatchTimeout\",\"type\":\"uint256\"}],\"name\":\"BatchTimeoutUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"proposalID\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"creator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"batchBlockInterval\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"batchTimeout\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"rollupEpoch\",\"type\":\"uint256\"}],\"name\":\"ProposalCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"proposalID\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"batchBlockInterval\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"batchTimeout\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"rollupEpoch\",\"type\":\"uint256\"}],\"name\":\"ProposalExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"odlRollupEpoch\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newRollupEpoch\",\"type\":\"uint256\"}],\"name\":\"RollupEpochUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldProposalVotingDuration\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newProposalVotingDuration\",\"type\":\"uint256\"}],\"name\":\"VotingDurationUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"L2_STAKING_CONTRACT\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SEQUENCER_CONTRACT\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batchBlockInterval\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batchTimeout\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchBlockInterval\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"batchTimeout\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rollupEpoch\",\"type\":\"uint256\"}],\"internalType\":\"structIGov.ProposalData\",\"name\":\"proposal\",\"type\":\"tuple\"}],\"name\":\"createProposal\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentProposalID\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalID\",\"type\":\"uint256\"}],\"name\":\"executeProposal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_votingDuration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_batchBlockInterval\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_batchTimeout\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_rollupEpoch\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalID\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"}],\"name\":\"isVoted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalID\",\"type\":\"uint256\"}],\"name\":\"proposalData\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"batchBlockInterval\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"batchTimeout\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rollupEpoch\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalID\",\"type\":\"uint256\"}],\"name\":\"proposalInfos\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"expirationTime\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"executed\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalID\",\"type\":\"uint256\"}],\"name\":\"proposalStatus\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rollupEpoch\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rollupEpochUpdateTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_votingDuration\",\"type\":\"uint256\"}],\"name\":\"setVotingDuration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalID\",\"type\":\"uint256\"}],\"name\":\"vote\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"votingDuration\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x60c060405234801561000f575f80fd5b5073530000000000000000000000000000000000001560805273530000000000000000000000000000000000001760a05261004861004d565b610109565b5f54610100900460ff16156100b85760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610107575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b60805160a0516118ee61013f5f395f81816102c1015281816103b10152818161075d01526110e101525f61024e01526118ee5ff3fe608060405234801561000f575f80fd5b5060043610610163575f3560e01c806377c79380116100c757806396dea9361161007d578063e5aec99511610063578063e5aec9951461036a578063f2fde38b14610373578063f92ad21914610386575f80fd5b806396dea936146102e3578063b511328d1461032c575f80fd5b806385963052116100ad57806385963052146102955780638da5cb5b1461029e5780638e21d5fb146102bc575f80fd5b806377c7938014610240578063807de44314610249575f80fd5b806349c1a5811161011c578063639661901161010257806363966190146101fd578063715018a61461020657806374c260cf1461020e575f80fd5b806349c1a581146101c75780635bcfadb5146101ea575f80fd5b8063132002fc1161014c578063132002fc1461018f578063237a4b96146101ab5780634428c1a4146101be575f80fd5b80630121b93f146101675780630d61b5191461017c575b5f80fd5b61017a6101753660046115d6565b610399565b005b61017a61018a3660046115d6565b610690565b610198606b5481565b6040519081526020015b60405180910390f35b6101986101b93660046115ed565b610744565b610198606a5481565b6101da6101d5366004611624565b610a34565b60405190151581526020016101a2565b61017a6101f83660046115d6565b610a54565b610198606c5481565b61017a610b23565b61022161021c3660046115d6565b610b36565b60408051931515845291151560208401521515908201526060016101a2565b61019860675481565b6102707f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a2565b61019860655481565b60335473ffffffffffffffffffffffffffffffffffffffff16610270565b6102707f000000000000000000000000000000000000000000000000000000000000000081565b6103116102f13660046115d6565b606e6020525f908152604090208054600182015460029092015490919083565b604080519384526020840192909252908201526060016101a2565b61035561033a3660046115d6565b606f6020525f90815260409020805460019091015460ff1682565b604080519283529015156020830152016101a2565b61019860695481565b61017a610381366004611652565b610c23565b61017a610394366004611674565b610cc0565b5f73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016636d46e987336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa15801561043e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061046291906116b4565b9050806104b65760405162461bcd60e51b815260206004820152601660248201527f6f6e6c792073657175656e63657220616c6c6f7765640000000000000000000060448201526064015b60405180910390fd5b606c548211156105085760405162461bcd60e51b815260206004820152601260248201527f696e76616c69642070726f706f73616c4944000000000000000000000000000060448201526064016104ad565b606d5482101561055a5760405162461bcd60e51b815260206004820152600f60248201527f70726f706f73616c207072756e6564000000000000000000000000000000000060448201526064016104ad565b5f828152606f60205260409020805460019091015460ff168061057b575080155b8061058557504281105b156105d25760405162461bcd60e51b815260206004820152601060248201527f766f74696e672068617320656e6465640000000000000000000000000000000060448201526064016104ad565b6105e9335f8581526070602052604090209061108e565b1561065c5760405162461bcd60e51b815260206004820152602960248201527f73657175656e63657220616c726561647920766f74656420666f72207468697360448201527f2070726f706f73616c000000000000000000000000000000000000000000000060648201526084016104ad565b610673335f858152607060205260409020906110bc565b5061067d836110dd565b1561068b5761068b83611214565b505050565b5f8061069b83610b36565b509150915081156106ee5760405162461bcd60e51b815260206004820152601060248201527f766f74696e672068617320656e6465640000000000000000000000000000000060448201526064016104ad565b8061073b5760405162461bcd60e51b815260206004820181905260248201527f70726f706f73616c20686173206e6f74206265656e207061737365642079657460448201526064016104ad565b61068b83611214565b5f8073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016636d46e987336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa1580156107ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061080e91906116b4565b90508061085d5760405162461bcd60e51b815260206004820152601660248201527f6f6e6c792073657175656e63657220616c6c6f7765640000000000000000000060448201526064016104ad565b82604001355f036108b05760405162461bcd60e51b815260206004820152601460248201527f696e76616c696420726f6c6c75702065706f636800000000000000000000000060448201526064016104ad565b82351515806108c25750602083013515155b61090e5760405162461bcd60e51b815260206004820152601460248201527f696e76616c696420626174636820706172616d7300000000000000000000000060448201526064016104ad565b606c8054905f61091d83611700565b9091555050606c545f908152606e60205260409020839061095582828135815560208201356001820155604082013560028201555050565b9050506040518060400160405280606b54426109719190611737565b81525f6020918201819052606c548152606f82526040902082518155910151600190910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905533606c54604080518635815260208088013590820152818701359181019190915273ffffffffffffffffffffffffffffffffffffffff92909216917f66e5b37817dfa9935ab8e631ce7774a2e773d56cc8ea6815ac65f1fbac6420849060600160405180910390a35050606c54919050565b5f828152607060205260408120610a4b908361108e565b90505b92915050565b610a5c61147f565b5f81118015610a6d5750606b548114155b610ade5760405162461bcd60e51b8152602060048201526024808201527f696e76616c6964206e65772070726f706f73616c20766f74696e67206475726160448201527f74696f6e0000000000000000000000000000000000000000000000000000000060648201526084016104ad565b606b80549082905560408051828152602081018490527ffe810823e41a0cf27003f3eac9c17098028ba0aece75bd9783a8da7f75fb3aa3910160405180910390a15050565b610b2b61147f565b610b345f6114e6565b565b5f805f606c54841115610b8b5760405162461bcd60e51b815260206004820152601260248201527f696e76616c69642070726f706f73616c4944000000000000000000000000000060448201526064016104ad565b606d54841015610bdd5760405162461bcd60e51b815260206004820152600f60248201527f70726f706f73616c207072756e6564000000000000000000000000000000000060448201526064016104ad565b5f848152606f602052604090206001810154905460ff909116908180610c01575080155b80610c0b57504281105b610c14876110dd565b90979096509194509092505050565b610c2b61147f565b73ffffffffffffffffffffffffffffffffffffffff8116610cb45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104ad565b610cbd816114e6565b50565b5f54610100900460ff1615808015610cde57505f54600160ff909116105b80610cf75750303b158015610cf757505f5460ff166001145b610d695760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104ad565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610dc5575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff8616610e285760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964206f776e65722061646472657373000000000000000000000060448201526064016104ad565b5f8511610e775760405162461bcd60e51b815260206004820181905260248201527f696e76616c69642070726f706f73616c20766f74696e67206475726174696f6e60448201526064016104ad565b5f8211610ec65760405162461bcd60e51b815260206004820152601460248201527f696e76616c696420726f6c6c75702065706f636800000000000000000000000060448201526064016104ad565b83151580610ed357508215155b610f1f5760405162461bcd60e51b815260206004820152601460248201527f696e76616c696420626174636820706172616d7300000000000000000000000060448201526064016104ad565b610f28866114e6565b606b85905560658490556067839055606982905542606a55604080515f8152602081018790527ffe810823e41a0cf27003f3eac9c17098028ba0aece75bd9783a8da7f75fb3aa3910160405180910390a1604080515f8152602081018690527fa044538eba1b21d23eb13fa35811ca9d1d7ff9ef1c81ee4dc594fca08412531b910160405180910390a1604080515f8152602081018590527fab2cb47d396c5d12c082ac9b6512d332af2767ca8e1fa5bcef40fa6970626569910160405180910390a1604080515f8152602081018490527f9b20ee151d057f4f3ece7fdf4ca1370cf143f181760e7712b722572f2dcba88f910160405180910390a18015611086575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526001830160205260408120541515610a4b565b5f610a4b8373ffffffffffffffffffffffffffffffffffffffff841661155c565b5f807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166377d7dffb6040518163ffffffff1660e01b81526004015f60405180830381865afa158015611147573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261118c9190810190611787565b90505f805b82518110156111f1576111d68382815181106111af576111af611865565b602002602001015160705f8881526020019081526020015f2061108e90919063ffffffff16565b156111e9576111e6826001611737565b91505b600101611191565b506003825160026112029190611892565b61120c91906118a9565b109392505050565b5f818152606e60205260409020546065541461128357606580545f838152606e60205260409081902054928390555190917fa044538eba1b21d23eb13fa35811ca9d1d7ff9ef1c81ee4dc594fca08412531b9161127991848252602082015260400190565b60405180910390a1505b5f818152606e6020526040902060010154606754146112f857606780545f838152606e60205260409081902060010154928390555190917fab2cb47d396c5d12c082ac9b6512d332af2767ca8e1fa5bcef40fa6970626569916112ee91848252602082015260400190565b60405180910390a1505b5f818152606e60205260409020600201546069541461136c57606980545f838152606e6020908152604091829020600201805490945542606a55925481518381529384015290917f9b20ee151d057f4f3ece7fdf4ca1370cf143f181760e7712b722572f2dcba88f910160405180910390a1505b5f818152606f60205260409020600190810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169091179055606d545b8181101561142b575f818152606e6020908152604080832083815560018082018590556002909101849055606f83528184208481550180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556070909152812090818161141b82826115a8565b5050600190920191506113ab9050565b50606d8190556065546067546069546040805193845260208401929092529082015281907fd31188695e1c2a2d02b755e14fa986aca41d391c337437b9159eaed8347e7f1c9060600160405180910390a250565b60335473ffffffffffffffffffffffffffffffffffffffff163314610b345760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104ad565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f8181526001830160205260408120546115a157508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610a4e565b505f610a4e565b5080545f8255905f5260205f2090810190610cbd91905b808211156115d2575f81556001016115bf565b5090565b5f602082840312156115e6575f80fd5b5035919050565b5f606082840312156115fd575f80fd5b50919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610cbd575f80fd5b5f8060408385031215611635575f80fd5b82359150602083013561164781611603565b809150509250929050565b5f60208284031215611662575f80fd5b813561166d81611603565b9392505050565b5f805f805f60a08688031215611688575f80fd5b853561169381611603565b97602087013597506040870135966060810135965060800135945092505050565b5f602082840312156116c4575f80fd5b8151801515811461166d575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611730576117306116d3565b5060010190565b80820180821115610a4e57610a4e6116d3565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b805161178281611603565b919050565b5f6020808385031215611798575f80fd5b825167ffffffffffffffff808211156117af575f80fd5b818501915085601f8301126117c2575f80fd5b8151818111156117d4576117d461174a565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811085821117156118175761181761174a565b604052918252848201925083810185019188831115611834575f80fd5b938501935b828510156118595761184a85611777565b84529385019392850192611839565b98975050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8082028115828204841417610a4e57610a4e6116d3565b5f826118dc577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b50049056fea164736f6c6343000818000a", + ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldBatchBlockInterval\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBatchBlockInterval\",\"type\":\"uint256\"}],\"name\":\"BatchBlockIntervalUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldBatchTimeout\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newBatchTimeout\",\"type\":\"uint256\"}],\"name\":\"BatchTimeoutUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"proposalID\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"creator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"batchBlockInterval\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"batchTimeout\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"rollupEpoch\",\"type\":\"uint256\"}],\"name\":\"ProposalCreated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"proposalID\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"batchBlockInterval\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"batchTimeout\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"rollupEpoch\",\"type\":\"uint256\"}],\"name\":\"ProposalExecuted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"odlRollupEpoch\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newRollupEpoch\",\"type\":\"uint256\"}],\"name\":\"RollupEpochUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldProposalVotingDuration\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newProposalVotingDuration\",\"type\":\"uint256\"}],\"name\":\"VotingDurationUpdated\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"L2_STAKING_CONTRACT\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SEQUENCER_CONTRACT\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batchBlockInterval\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batchTimeout\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"deleteTo\",\"type\":\"uint256\"}],\"name\":\"cleanUpExpiredProposals\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"batchBlockInterval\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"batchTimeout\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rollupEpoch\",\"type\":\"uint256\"}],\"internalType\":\"structIGov.ProposalData\",\"name\":\"proposal\",\"type\":\"tuple\"}],\"name\":\"createProposal\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentProposalID\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalID\",\"type\":\"uint256\"}],\"name\":\"executeProposal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_votingDuration\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_batchBlockInterval\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_batchTimeout\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_rollupEpoch\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalID\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"voter\",\"type\":\"address\"}],\"name\":\"isVoted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestExecutedProposalID\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalID\",\"type\":\"uint256\"}],\"name\":\"proposalData\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"batchBlockInterval\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"batchTimeout\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"rollupEpoch\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalID\",\"type\":\"uint256\"}],\"name\":\"proposalInfos\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"expirationTime\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"executed\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalID\",\"type\":\"uint256\"}],\"name\":\"proposalStatus\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rollupEpoch\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rollupEpochUpdateTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_votingDuration\",\"type\":\"uint256\"}],\"name\":\"setVotingDuration\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"undeletedProposalStart\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"proposalID\",\"type\":\"uint256\"}],\"name\":\"vote\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"votingDuration\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + Bin: "0x60c060405234801561000f575f80fd5b5073530000000000000000000000000000000000001560805273530000000000000000000000000000000000001760a05261004861004d565b610109565b5f54610100900460ff16156100b85760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614610107575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b60805160a051611a7c61013f5f395f81816102e2015281816103f7015281816107f401526112f601525f61026f0152611a7c5ff3fe608060405234801561000f575f80fd5b5060043610610184575f3560e01c8063807de443116100dd578063b511328d11610088578063e5aec99511610063578063e5aec995146103b0578063f2fde38b146103b9578063f92ad219146103cc575f80fd5b8063b511328d14610356578063d5cc89ba14610394578063d7693075146103a7575f80fd5b80638e21d5fb116100b85780638e21d5fb146102dd57806396dea93614610304578063a83d07371461034d575f80fd5b8063807de4431461026a57806385963052146102b65780638da5cb5b146102bf575f80fd5b806349c1a5811161013d578063715018a611610118578063715018a61461022757806374c260cf1461022f57806377c7938014610261575f80fd5b806349c1a581146101e85780635bcfadb51461020b578063639661901461021e575f80fd5b8063132002fc1161016d578063132002fc146101b0578063237a4b96146101cc5780634428c1a4146101df575f80fd5b80630121b93f146101885780630d61b5191461019d575b5f80fd5b61019b610196366004611764565b6103df565b005b61019b6101ab366004611764565b610727565b6101b9606b5481565b6040519081526020015b60405180910390f35b6101b96101da36600461177b565b6107db565b6101b9606a5481565b6101fb6101f63660046117b2565b610acb565b60405190151581526020016101c3565b61019b610219366004611764565b610aeb565b6101b9606c5481565b61019b610bba565b61024261023d366004611764565b610bcd565b60408051931515845291151560208401521515908201526060016101c3565b6101b960675481565b6102917f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c3565b6101b960655481565b60335473ffffffffffffffffffffffffffffffffffffffff16610291565b6102917f000000000000000000000000000000000000000000000000000000000000000081565b610332610312366004611764565b606e6020525f908152604090208054600182015460029092015490919083565b604080519384526020840192909252908201526060016101c3565b6101b960715481565b61037f610364366004611764565b606f6020525f90815260409020805460019091015460ff1682565b604080519283529015156020830152016101c3565b61019b6103a2366004611764565b610d25565b6101b9606d5481565b6101b960695481565b61019b6103c73660046117e0565b610e38565b61019b6103da366004611802565b610ed5565b5f73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016636d46e987336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015610484573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104a89190611842565b9050806104fc5760405162461bcd60e51b815260206004820152601660248201527f6f6e6c792073657175656e63657220616c6c6f7765640000000000000000000060448201526064015b60405180910390fd5b606c5482111561054e5760405162461bcd60e51b815260206004820152601260248201527f696e76616c69642070726f706f73616c4944000000000000000000000000000060448201526064016104f3565b607154821161059f5760405162461bcd60e51b815260206004820152601260248201527f657870697265642070726f706f73616c4944000000000000000000000000000060448201526064016104f3565b606d548210156105f15760405162461bcd60e51b815260206004820152600f60248201527f70726f706f73616c207072756e6564000000000000000000000000000000000060448201526064016104f3565b5f828152606f60205260409020805460019091015460ff1680610612575080155b8061061c57504281105b156106695760405162461bcd60e51b815260206004820152601060248201527f766f74696e672068617320656e6465640000000000000000000000000000000060448201526064016104f3565b610680335f858152607060205260409020906112a3565b156106f35760405162461bcd60e51b815260206004820152602960248201527f73657175656e63657220616c726561647920766f74656420666f72207468697360448201527f2070726f706f73616c000000000000000000000000000000000000000000000060648201526084016104f3565b61070a335f858152607060205260409020906112d1565b50610714836112f2565b156107225761072283611429565b505050565b5f8061073283610bcd565b509150915081156107855760405162461bcd60e51b815260206004820152601060248201527f766f74696e672068617320656e6465640000000000000000000000000000000060448201526064016104f3565b806107d25760405162461bcd60e51b815260206004820181905260248201527f70726f706f73616c20686173206e6f74206265656e207061737365642079657460448201526064016104f3565b61072283611429565b5f8073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016636d46e987336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015610881573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108a59190611842565b9050806108f45760405162461bcd60e51b815260206004820152601660248201527f6f6e6c792073657175656e63657220616c6c6f7765640000000000000000000060448201526064016104f3565b82604001355f036109475760405162461bcd60e51b815260206004820152601460248201527f696e76616c696420726f6c6c75702065706f636800000000000000000000000060448201526064016104f3565b82351515806109595750602083013515155b6109a55760405162461bcd60e51b815260206004820152601460248201527f696e76616c696420626174636820706172616d7300000000000000000000000060448201526064016104f3565b606c8054905f6109b48361188e565b9091555050606c545f908152606e6020526040902083906109ec82828135815560208201356001820155604082013560028201555050565b9050506040518060400160405280606b5442610a0891906118c5565b81525f6020918201819052606c548152606f82526040902082518155910151600190910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905533606c54604080518635815260208088013590820152818701359181019190915273ffffffffffffffffffffffffffffffffffffffff92909216917f66e5b37817dfa9935ab8e631ce7774a2e773d56cc8ea6815ac65f1fbac6420849060600160405180910390a35050606c54919050565b5f828152607060205260408120610ae290836112a3565b90505b92915050565b610af361160d565b5f81118015610b045750606b548114155b610b755760405162461bcd60e51b8152602060048201526024808201527f696e76616c6964206e65772070726f706f73616c20766f74696e67206475726160448201527f74696f6e0000000000000000000000000000000000000000000000000000000060648201526084016104f3565b606b80549082905560408051828152602081018490527ffe810823e41a0cf27003f3eac9c17098028ba0aece75bd9783a8da7f75fb3aa3910160405180910390a15050565b610bc261160d565b610bcb5f611674565b565b5f805f606c54841115610c225760405162461bcd60e51b815260206004820152601260248201527f696e76616c69642070726f706f73616c4944000000000000000000000000000060448201526064016104f3565b607154841015610c745760405162461bcd60e51b815260206004820152601060248201527f657870697265642070726f706f73616c0000000000000000000000000000000060448201526064016104f3565b606d54841015610cc65760405162461bcd60e51b815260206004820152600f60248201527f70726f706f73616c207072756e6564000000000000000000000000000000000060448201526064016104f3565b6071548403610cdd57506001915081905080610d1e565b5f848152606f602052604090206001810154905460ff909116908180610d01575080155b80610d0b57504281105b610d14876112f2565b8394509450945050505b9193909250565b6071548110610d9c5760405162461bcd60e51b815260206004820152603e60248201527f6f6e6c7920616c6c6f7720746f2064656c657465207468652070726f706f736160448201527f6c206265666f72206c6174657374207061737365642070726f706f73616c000060648201526084016104f3565b606d545b818111610e26575f818152606e6020908152604080832083815560018082018590556002909101849055606f83528184208481550180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560709091528120908181610e0f8282611736565b505050508080610e1e9061188e565b915050610da0565b50610e328160016118c5565b606d5550565b610e4061160d565b73ffffffffffffffffffffffffffffffffffffffff8116610ec95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104f3565b610ed281611674565b50565b5f54610100900460ff1615808015610ef357505f54600160ff909116105b80610f0c5750303b158015610f0c57505f5460ff166001145b610f7e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104f3565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610fda575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff861661103d5760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964206f776e65722061646472657373000000000000000000000060448201526064016104f3565b5f851161108c5760405162461bcd60e51b815260206004820181905260248201527f696e76616c69642070726f706f73616c20766f74696e67206475726174696f6e60448201526064016104f3565b5f82116110db5760405162461bcd60e51b815260206004820152601460248201527f696e76616c696420726f6c6c75702065706f636800000000000000000000000060448201526064016104f3565b831515806110e857508215155b6111345760405162461bcd60e51b815260206004820152601460248201527f696e76616c696420626174636820706172616d7300000000000000000000000060448201526064016104f3565b61113d86611674565b606b85905560658490556067839055606982905542606a55604080515f8152602081018790527ffe810823e41a0cf27003f3eac9c17098028ba0aece75bd9783a8da7f75fb3aa3910160405180910390a1604080515f8152602081018690527fa044538eba1b21d23eb13fa35811ca9d1d7ff9ef1c81ee4dc594fca08412531b910160405180910390a1604080515f8152602081018590527fab2cb47d396c5d12c082ac9b6512d332af2767ca8e1fa5bcef40fa6970626569910160405180910390a1604080515f8152602081018490527f9b20ee151d057f4f3ece7fdf4ca1370cf143f181760e7712b722572f2dcba88f910160405180910390a1801561129b575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526001830160205260408120541515610ae2565b5f610ae28373ffffffffffffffffffffffffffffffffffffffff84166116ea565b5f807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166377d7dffb6040518163ffffffff1660e01b81526004015f60405180830381865afa15801561135c573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526113a19190810190611915565b90505f805b8251811015611406576113eb8382815181106113c4576113c46119f3565b602002602001015160705f8881526020019081526020015f206112a390919063ffffffff16565b156113fe576113fb8260016118c5565b91505b6001016113a6565b506003825160026114179190611a20565b6114219190611a37565b109392505050565b60718190555f818152606e60205260409020546065541461149d57606580545f838152606e60205260409081902054928390555190917fa044538eba1b21d23eb13fa35811ca9d1d7ff9ef1c81ee4dc594fca08412531b9161149391848252602082015260400190565b60405180910390a1505b5f818152606e60205260409020600101546067541461151257606780545f838152606e60205260409081902060010154928390555190917fab2cb47d396c5d12c082ac9b6512d332af2767ca8e1fa5bcef40fa69706265699161150891848252602082015260400190565b60405180910390a1505b5f818152606e60205260409020600201546069541461158657606980545f838152606e6020908152604091829020600201805490945542606a55925481518381529384015290917f9b20ee151d057f4f3ece7fdf4ca1370cf143f181760e7712b722572f2dcba88f910160405180910390a1505b5f818152606f6020908152604091829020600190810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690911790556065546067546069548451928352928201529182015281907fd31188695e1c2a2d02b755e14fa986aca41d391c337437b9159eaed8347e7f1c9060600160405180910390a250565b60335473ffffffffffffffffffffffffffffffffffffffff163314610bcb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104f3565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f81815260018301602052604081205461172f57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610ae5565b505f610ae5565b5080545f8255905f5260205f2090810190610ed291905b80821115611760575f815560010161174d565b5090565b5f60208284031215611774575f80fd5b5035919050565b5f6060828403121561178b575f80fd5b50919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610ed2575f80fd5b5f80604083850312156117c3575f80fd5b8235915060208301356117d581611791565b809150509250929050565b5f602082840312156117f0575f80fd5b81356117fb81611791565b9392505050565b5f805f805f60a08688031215611816575f80fd5b853561182181611791565b97602087013597506040870135966060810135965060800135945092505050565b5f60208284031215611852575f80fd5b815180151581146117fb575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036118be576118be611861565b5060010190565b80820180821115610ae557610ae5611861565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b805161191081611791565b919050565b5f6020808385031215611926575f80fd5b825167ffffffffffffffff8082111561193d575f80fd5b818501915085601f830112611950575f80fd5b815181811115611962576119626118d8565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811085821117156119a5576119a56118d8565b6040529182528482019250838101850191888311156119c2575f80fd5b938501935b828510156119e7576119d885611905565b845293850193928501926119c7565b98975050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8082028115828204841417610ae557610ae5611861565b5f82611a6a577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b50049056fea164736f6c6343000818000a", } // GovABI is the input ABI used to generate the binding from. @@ -395,6 +395,37 @@ func (_Gov *GovCallerSession) IsVoted(proposalID *big.Int, voter common.Address) return _Gov.Contract.IsVoted(&_Gov.CallOpts, proposalID, voter) } +// LatestExecutedProposalID is a free data retrieval call binding the contract method 0xa83d0737. +// +// Solidity: function latestExecutedProposalID() view returns(uint256) +func (_Gov *GovCaller) LatestExecutedProposalID(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Gov.contract.Call(opts, &out, "latestExecutedProposalID") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// LatestExecutedProposalID is a free data retrieval call binding the contract method 0xa83d0737. +// +// Solidity: function latestExecutedProposalID() view returns(uint256) +func (_Gov *GovSession) LatestExecutedProposalID() (*big.Int, error) { + return _Gov.Contract.LatestExecutedProposalID(&_Gov.CallOpts) +} + +// LatestExecutedProposalID is a free data retrieval call binding the contract method 0xa83d0737. +// +// Solidity: function latestExecutedProposalID() view returns(uint256) +func (_Gov *GovCallerSession) LatestExecutedProposalID() (*big.Int, error) { + return _Gov.Contract.LatestExecutedProposalID(&_Gov.CallOpts) +} + // Owner is a free data retrieval call binding the contract method 0x8da5cb5b. // // Solidity: function owner() view returns(address) @@ -616,6 +647,37 @@ func (_Gov *GovCallerSession) RollupEpochUpdateTime() (*big.Int, error) { return _Gov.Contract.RollupEpochUpdateTime(&_Gov.CallOpts) } +// UndeletedProposalStart is a free data retrieval call binding the contract method 0xd7693075. +// +// Solidity: function undeletedProposalStart() view returns(uint256) +func (_Gov *GovCaller) UndeletedProposalStart(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Gov.contract.Call(opts, &out, "undeletedProposalStart") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// UndeletedProposalStart is a free data retrieval call binding the contract method 0xd7693075. +// +// Solidity: function undeletedProposalStart() view returns(uint256) +func (_Gov *GovSession) UndeletedProposalStart() (*big.Int, error) { + return _Gov.Contract.UndeletedProposalStart(&_Gov.CallOpts) +} + +// UndeletedProposalStart is a free data retrieval call binding the contract method 0xd7693075. +// +// Solidity: function undeletedProposalStart() view returns(uint256) +func (_Gov *GovCallerSession) UndeletedProposalStart() (*big.Int, error) { + return _Gov.Contract.UndeletedProposalStart(&_Gov.CallOpts) +} + // VotingDuration is a free data retrieval call binding the contract method 0x132002fc. // // Solidity: function votingDuration() view returns(uint256) @@ -647,6 +709,27 @@ func (_Gov *GovCallerSession) VotingDuration() (*big.Int, error) { return _Gov.Contract.VotingDuration(&_Gov.CallOpts) } +// CleanUpExpiredProposals is a paid mutator transaction binding the contract method 0xd5cc89ba. +// +// Solidity: function cleanUpExpiredProposals(uint256 deleteTo) returns() +func (_Gov *GovTransactor) CleanUpExpiredProposals(opts *bind.TransactOpts, deleteTo *big.Int) (*types.Transaction, error) { + return _Gov.contract.Transact(opts, "cleanUpExpiredProposals", deleteTo) +} + +// CleanUpExpiredProposals is a paid mutator transaction binding the contract method 0xd5cc89ba. +// +// Solidity: function cleanUpExpiredProposals(uint256 deleteTo) returns() +func (_Gov *GovSession) CleanUpExpiredProposals(deleteTo *big.Int) (*types.Transaction, error) { + return _Gov.Contract.CleanUpExpiredProposals(&_Gov.TransactOpts, deleteTo) +} + +// CleanUpExpiredProposals is a paid mutator transaction binding the contract method 0xd5cc89ba. +// +// Solidity: function cleanUpExpiredProposals(uint256 deleteTo) returns() +func (_Gov *GovTransactorSession) CleanUpExpiredProposals(deleteTo *big.Int) (*types.Transaction, error) { + return _Gov.Contract.CleanUpExpiredProposals(&_Gov.TransactOpts, deleteTo) +} + // CreateProposal is a paid mutator transaction binding the contract method 0x237a4b96. // // Solidity: function createProposal((uint256,uint256,uint256) proposal) returns(uint256) diff --git a/bindings/bindings/gov_more.go b/bindings/bindings/gov_more.go index 52fed296..dd15ac15 100644 --- a/bindings/bindings/gov_more.go +++ b/bindings/bindings/gov_more.go @@ -9,11 +9,11 @@ import ( "morph-l2/bindings/solc" ) -const GovStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"contracts/l2/staking/Gov.sol:Gov\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"contracts/l2/staking/Gov.sol:Gov\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"contracts/l2/staking/Gov.sol:Gov\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_array(t_uint256)1018_storage\"},{\"astId\":1003,\"contract\":\"contracts/l2/staking/Gov.sol:Gov\",\"label\":\"_owner\",\"offset\":0,\"slot\":\"51\",\"type\":\"t_address\"},{\"astId\":1004,\"contract\":\"contracts/l2/staking/Gov.sol:Gov\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"52\",\"type\":\"t_array(t_uint256)1017_storage\"},{\"astId\":1005,\"contract\":\"contracts/l2/staking/Gov.sol:Gov\",\"label\":\"batchBlockInterval\",\"offset\":0,\"slot\":\"101\",\"type\":\"t_uint256\"},{\"astId\":1006,\"contract\":\"contracts/l2/staking/Gov.sol:Gov\",\"label\":\"batchMaxBytes\",\"offset\":0,\"slot\":\"102\",\"type\":\"t_uint256\"},{\"astId\":1007,\"contract\":\"contracts/l2/staking/Gov.sol:Gov\",\"label\":\"batchTimeout\",\"offset\":0,\"slot\":\"103\",\"type\":\"t_uint256\"},{\"astId\":1008,\"contract\":\"contracts/l2/staking/Gov.sol:Gov\",\"label\":\"maxChunks\",\"offset\":0,\"slot\":\"104\",\"type\":\"t_uint256\"},{\"astId\":1009,\"contract\":\"contracts/l2/staking/Gov.sol:Gov\",\"label\":\"rollupEpoch\",\"offset\":0,\"slot\":\"105\",\"type\":\"t_uint256\"},{\"astId\":1010,\"contract\":\"contracts/l2/staking/Gov.sol:Gov\",\"label\":\"rollupEpochUpdateTime\",\"offset\":0,\"slot\":\"106\",\"type\":\"t_uint256\"},{\"astId\":1011,\"contract\":\"contracts/l2/staking/Gov.sol:Gov\",\"label\":\"votingDuration\",\"offset\":0,\"slot\":\"107\",\"type\":\"t_uint256\"},{\"astId\":1012,\"contract\":\"contracts/l2/staking/Gov.sol:Gov\",\"label\":\"currentProposalID\",\"offset\":0,\"slot\":\"108\",\"type\":\"t_uint256\"},{\"astId\":1013,\"contract\":\"contracts/l2/staking/Gov.sol:Gov\",\"label\":\"undeletedProposalStart\",\"offset\":0,\"slot\":\"109\",\"type\":\"t_uint256\"},{\"astId\":1014,\"contract\":\"contracts/l2/staking/Gov.sol:Gov\",\"label\":\"proposalData\",\"offset\":0,\"slot\":\"110\",\"type\":\"t_mapping(t_uint256,t_struct(ProposalData)1020_storage)\"},{\"astId\":1015,\"contract\":\"contracts/l2/staking/Gov.sol:Gov\",\"label\":\"proposalInfos\",\"offset\":0,\"slot\":\"111\",\"type\":\"t_mapping(t_uint256,t_struct(ProposalInfo)1021_storage)\"},{\"astId\":1016,\"contract\":\"contracts/l2/staking/Gov.sol:Gov\",\"label\":\"votes\",\"offset\":0,\"slot\":\"112\",\"type\":\"t_mapping(t_uint256,t_struct(AddressSet)1019_storage)\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_bytes32)dyn_storage\":{\"encoding\":\"dynamic_array\",\"label\":\"bytes32[]\",\"numberOfBytes\":\"32\"},\"t_array(t_uint256)1017_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\"},\"t_array(t_uint256)1018_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[50]\",\"numberOfBytes\":\"1600\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_mapping(t_bytes32,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_uint256\"},\"t_mapping(t_uint256,t_struct(AddressSet)1019_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e struct EnumerableSetUpgradeable.AddressSet)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_struct(AddressSet)1019_storage\"},\"t_mapping(t_uint256,t_struct(ProposalData)1020_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e struct IGov.ProposalData)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_struct(ProposalData)1020_storage\"},\"t_mapping(t_uint256,t_struct(ProposalInfo)1021_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e struct IGov.ProposalInfo)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_struct(ProposalInfo)1021_storage\"},\"t_struct(AddressSet)1019_storage\":{\"encoding\":\"inplace\",\"label\":\"struct EnumerableSetUpgradeable.AddressSet\",\"numberOfBytes\":\"64\"},\"t_struct(ProposalData)1020_storage\":{\"encoding\":\"inplace\",\"label\":\"struct IGov.ProposalData\",\"numberOfBytes\":\"96\"},\"t_struct(ProposalInfo)1021_storage\":{\"encoding\":\"inplace\",\"label\":\"struct IGov.ProposalInfo\",\"numberOfBytes\":\"64\"},\"t_struct(Set)1022_storage\":{\"encoding\":\"inplace\",\"label\":\"struct EnumerableSetUpgradeable.Set\",\"numberOfBytes\":\"64\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}" +const GovStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"contracts/l2/staking/Gov.sol:Gov\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"contracts/l2/staking/Gov.sol:Gov\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"contracts/l2/staking/Gov.sol:Gov\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_array(t_uint256)1019_storage\"},{\"astId\":1003,\"contract\":\"contracts/l2/staking/Gov.sol:Gov\",\"label\":\"_owner\",\"offset\":0,\"slot\":\"51\",\"type\":\"t_address\"},{\"astId\":1004,\"contract\":\"contracts/l2/staking/Gov.sol:Gov\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"52\",\"type\":\"t_array(t_uint256)1018_storage\"},{\"astId\":1005,\"contract\":\"contracts/l2/staking/Gov.sol:Gov\",\"label\":\"batchBlockInterval\",\"offset\":0,\"slot\":\"101\",\"type\":\"t_uint256\"},{\"astId\":1006,\"contract\":\"contracts/l2/staking/Gov.sol:Gov\",\"label\":\"batchMaxBytes\",\"offset\":0,\"slot\":\"102\",\"type\":\"t_uint256\"},{\"astId\":1007,\"contract\":\"contracts/l2/staking/Gov.sol:Gov\",\"label\":\"batchTimeout\",\"offset\":0,\"slot\":\"103\",\"type\":\"t_uint256\"},{\"astId\":1008,\"contract\":\"contracts/l2/staking/Gov.sol:Gov\",\"label\":\"maxChunks\",\"offset\":0,\"slot\":\"104\",\"type\":\"t_uint256\"},{\"astId\":1009,\"contract\":\"contracts/l2/staking/Gov.sol:Gov\",\"label\":\"rollupEpoch\",\"offset\":0,\"slot\":\"105\",\"type\":\"t_uint256\"},{\"astId\":1010,\"contract\":\"contracts/l2/staking/Gov.sol:Gov\",\"label\":\"rollupEpochUpdateTime\",\"offset\":0,\"slot\":\"106\",\"type\":\"t_uint256\"},{\"astId\":1011,\"contract\":\"contracts/l2/staking/Gov.sol:Gov\",\"label\":\"votingDuration\",\"offset\":0,\"slot\":\"107\",\"type\":\"t_uint256\"},{\"astId\":1012,\"contract\":\"contracts/l2/staking/Gov.sol:Gov\",\"label\":\"currentProposalID\",\"offset\":0,\"slot\":\"108\",\"type\":\"t_uint256\"},{\"astId\":1013,\"contract\":\"contracts/l2/staking/Gov.sol:Gov\",\"label\":\"undeletedProposalStart\",\"offset\":0,\"slot\":\"109\",\"type\":\"t_uint256\"},{\"astId\":1014,\"contract\":\"contracts/l2/staking/Gov.sol:Gov\",\"label\":\"proposalData\",\"offset\":0,\"slot\":\"110\",\"type\":\"t_mapping(t_uint256,t_struct(ProposalData)1021_storage)\"},{\"astId\":1015,\"contract\":\"contracts/l2/staking/Gov.sol:Gov\",\"label\":\"proposalInfos\",\"offset\":0,\"slot\":\"111\",\"type\":\"t_mapping(t_uint256,t_struct(ProposalInfo)1022_storage)\"},{\"astId\":1016,\"contract\":\"contracts/l2/staking/Gov.sol:Gov\",\"label\":\"votes\",\"offset\":0,\"slot\":\"112\",\"type\":\"t_mapping(t_uint256,t_struct(AddressSet)1020_storage)\"},{\"astId\":1017,\"contract\":\"contracts/l2/staking/Gov.sol:Gov\",\"label\":\"latestExecutedProposalID\",\"offset\":0,\"slot\":\"113\",\"type\":\"t_uint256\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_bytes32)dyn_storage\":{\"encoding\":\"dynamic_array\",\"label\":\"bytes32[]\",\"numberOfBytes\":\"32\"},\"t_array(t_uint256)1018_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\"},\"t_array(t_uint256)1019_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[50]\",\"numberOfBytes\":\"1600\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_mapping(t_bytes32,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_uint256\"},\"t_mapping(t_uint256,t_struct(AddressSet)1020_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e struct EnumerableSetUpgradeable.AddressSet)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_struct(AddressSet)1020_storage\"},\"t_mapping(t_uint256,t_struct(ProposalData)1021_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e struct IGov.ProposalData)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_struct(ProposalData)1021_storage\"},\"t_mapping(t_uint256,t_struct(ProposalInfo)1022_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e struct IGov.ProposalInfo)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_struct(ProposalInfo)1022_storage\"},\"t_struct(AddressSet)1020_storage\":{\"encoding\":\"inplace\",\"label\":\"struct EnumerableSetUpgradeable.AddressSet\",\"numberOfBytes\":\"64\"},\"t_struct(ProposalData)1021_storage\":{\"encoding\":\"inplace\",\"label\":\"struct IGov.ProposalData\",\"numberOfBytes\":\"96\"},\"t_struct(ProposalInfo)1022_storage\":{\"encoding\":\"inplace\",\"label\":\"struct IGov.ProposalInfo\",\"numberOfBytes\":\"64\"},\"t_struct(Set)1023_storage\":{\"encoding\":\"inplace\",\"label\":\"struct EnumerableSetUpgradeable.Set\",\"numberOfBytes\":\"64\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}" var GovStorageLayout = new(solc.StorageLayout) -var GovDeployedBin = "0x608060405234801561000f575f80fd5b5060043610610163575f3560e01c806377c79380116100c757806396dea9361161007d578063e5aec99511610063578063e5aec9951461036a578063f2fde38b14610373578063f92ad21914610386575f80fd5b806396dea936146102e3578063b511328d1461032c575f80fd5b806385963052116100ad57806385963052146102955780638da5cb5b1461029e5780638e21d5fb146102bc575f80fd5b806377c7938014610240578063807de44314610249575f80fd5b806349c1a5811161011c578063639661901161010257806363966190146101fd578063715018a61461020657806374c260cf1461020e575f80fd5b806349c1a581146101c75780635bcfadb5146101ea575f80fd5b8063132002fc1161014c578063132002fc1461018f578063237a4b96146101ab5780634428c1a4146101be575f80fd5b80630121b93f146101675780630d61b5191461017c575b5f80fd5b61017a6101753660046117de565b610399565b005b61017a61018a3660046117de565b610712565b610198606b5481565b6040519081526020015b60405180910390f35b6101986101b93660046117f5565b6107fa565b610198606a5481565b6101da6101d536600461182c565b610b38565b60405190151581526020016101a2565b61017a6101f83660046117de565b610b58565b610198606c5481565b61017a610c41565b61022161021c3660046117de565b610c54565b60408051931515845291151560208401521515908201526060016101a2565b61019860675481565b6102707f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a2565b61019860655481565b60335473ffffffffffffffffffffffffffffffffffffffff16610270565b6102707f000000000000000000000000000000000000000000000000000000000000000081565b6103116102f13660046117de565b606e6020525f908152604090208054600182015460029092015490919083565b604080519384526020840192909252908201526060016101a2565b61035561033a3660046117de565b606f6020525f90815260409020805460019091015460ff1682565b604080519283529015156020830152016101a2565b61019860695481565b61017a61038136600461185a565b610d75565b61017a61039436600461187c565b610e2c565b5f73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016636d46e987336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa15801561043e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061046291906118bc565b9050806104d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6f6e6c792073657175656e63657220616c6c6f7765640000000000000000000060448201526064015b60405180910390fd5b606c5482111561053c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e76616c69642070726f706f73616c4944000000000000000000000000000060448201526064016104c7565b606d548210156105a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f70726f706f73616c207072756e6564000000000000000000000000000000000060448201526064016104c7565b5f828152606f60205260409020805460019091015460ff16806105c9575080155b806105d357504281105b1561063a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f766f74696e672068617320656e6465640000000000000000000000000000000060448201526064016104c7565b610651335f8581526070602052604090209061127c565b156106de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f73657175656e63657220616c726561647920766f74656420666f72207468697360448201527f2070726f706f73616c000000000000000000000000000000000000000000000060648201526084016104c7565b6106f5335f858152607060205260409020906112aa565b506106ff836112cb565b1561070d5761070d83611402565b505050565b5f8061071d83610c54565b5091509150811561078a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f766f74696e672068617320656e6465640000000000000000000000000000000060448201526064016104c7565b806107f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f70726f706f73616c20686173206e6f74206265656e207061737365642079657460448201526064016104c7565b61070d83611402565b5f8073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016636d46e987336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa1580156108a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c491906118bc565b90508061092d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6f6e6c792073657175656e63657220616c6c6f7765640000000000000000000060448201526064016104c7565b82604001355f0361099a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e76616c696420726f6c6c75702065706f636800000000000000000000000060448201526064016104c7565b82351515806109ac5750602083013515155b610a12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e76616c696420626174636820706172616d7300000000000000000000000060448201526064016104c7565b606c8054905f610a2183611908565b9091555050606c545f908152606e602052604090208390610a5982828135815560208201356001820155604082013560028201555050565b9050506040518060400160405280606b5442610a75919061193f565b81525f6020918201819052606c548152606f82526040902082518155910151600190910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905533606c54604080518635815260208088013590820152818701359181019190915273ffffffffffffffffffffffffffffffffffffffff92909216917f66e5b37817dfa9935ab8e631ce7774a2e773d56cc8ea6815ac65f1fbac6420849060600160405180910390a35050606c54919050565b5f828152607060205260408120610b4f908361127c565b90505b92915050565b610b6061166d565b5f81118015610b715750606b548114155b610bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f696e76616c6964206e65772070726f706f73616c20766f74696e67206475726160448201527f74696f6e0000000000000000000000000000000000000000000000000000000060648201526084016104c7565b606b80549082905560408051828152602081018490527ffe810823e41a0cf27003f3eac9c17098028ba0aece75bd9783a8da7f75fb3aa3910160405180910390a15050565b610c4961166d565b610c525f6116ee565b565b5f805f606c54841115610cc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e76616c69642070726f706f73616c4944000000000000000000000000000060448201526064016104c7565b606d54841015610d2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f70726f706f73616c207072756e6564000000000000000000000000000000000060448201526064016104c7565b5f848152606f602052604090206001810154905460ff909116908180610d53575080155b80610d5d57504281105b610d66876112cb565b90979096509194509092505050565b610d7d61166d565b73ffffffffffffffffffffffffffffffffffffffff8116610e20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104c7565b610e29816116ee565b50565b5f54610100900460ff1615808015610e4a57505f54600160ff909116105b80610e635750303b158015610e6357505f5460ff166001145b610eef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104c7565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610f4b575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff8616610fc8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c6964206f776e65722061646472657373000000000000000000000060448201526064016104c7565b5f8511611031576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f696e76616c69642070726f706f73616c20766f74696e67206475726174696f6e60448201526064016104c7565b5f821161109a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e76616c696420726f6c6c75702065706f636800000000000000000000000060448201526064016104c7565b831515806110a757508215155b61110d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e76616c696420626174636820706172616d7300000000000000000000000060448201526064016104c7565b611116866116ee565b606b85905560658490556067839055606982905542606a55604080515f8152602081018790527ffe810823e41a0cf27003f3eac9c17098028ba0aece75bd9783a8da7f75fb3aa3910160405180910390a1604080515f8152602081018690527fa044538eba1b21d23eb13fa35811ca9d1d7ff9ef1c81ee4dc594fca08412531b910160405180910390a1604080515f8152602081018590527fab2cb47d396c5d12c082ac9b6512d332af2767ca8e1fa5bcef40fa6970626569910160405180910390a1604080515f8152602081018490527f9b20ee151d057f4f3ece7fdf4ca1370cf143f181760e7712b722572f2dcba88f910160405180910390a18015611274575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526001830160205260408120541515610b4f565b5f610b4f8373ffffffffffffffffffffffffffffffffffffffff8416611764565b5f807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166377d7dffb6040518163ffffffff1660e01b81526004015f60405180830381865afa158015611335573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261137a919081019061198f565b90505f805b82518110156113df576113c483828151811061139d5761139d611a6d565b602002602001015160705f8881526020019081526020015f2061127c90919063ffffffff16565b156113d7576113d482600161193f565b91505b60010161137f565b506003825160026113f09190611a9a565b6113fa9190611ab1565b109392505050565b5f818152606e60205260409020546065541461147157606580545f838152606e60205260409081902054928390555190917fa044538eba1b21d23eb13fa35811ca9d1d7ff9ef1c81ee4dc594fca08412531b9161146791848252602082015260400190565b60405180910390a1505b5f818152606e6020526040902060010154606754146114e657606780545f838152606e60205260409081902060010154928390555190917fab2cb47d396c5d12c082ac9b6512d332af2767ca8e1fa5bcef40fa6970626569916114dc91848252602082015260400190565b60405180910390a1505b5f818152606e60205260409020600201546069541461155a57606980545f838152606e6020908152604091829020600201805490945542606a55925481518381529384015290917f9b20ee151d057f4f3ece7fdf4ca1370cf143f181760e7712b722572f2dcba88f910160405180910390a1505b5f818152606f60205260409020600190810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169091179055606d545b81811015611619575f818152606e6020908152604080832083815560018082018590556002909101849055606f83528184208481550180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556070909152812090818161160982826117b0565b5050600190920191506115999050565b50606d8190556065546067546069546040805193845260208401929092529082015281907fd31188695e1c2a2d02b755e14fa986aca41d391c337437b9159eaed8347e7f1c9060600160405180910390a250565b60335473ffffffffffffffffffffffffffffffffffffffff163314610c52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104c7565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f8181526001830160205260408120546117a957508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610b52565b505f610b52565b5080545f8255905f5260205f2090810190610e2991905b808211156117da575f81556001016117c7565b5090565b5f602082840312156117ee575f80fd5b5035919050565b5f60608284031215611805575f80fd5b50919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610e29575f80fd5b5f806040838503121561183d575f80fd5b82359150602083013561184f8161180b565b809150509250929050565b5f6020828403121561186a575f80fd5b81356118758161180b565b9392505050565b5f805f805f60a08688031215611890575f80fd5b853561189b8161180b565b97602087013597506040870135966060810135965060800135945092505050565b5f602082840312156118cc575f80fd5b81518015158114611875575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611938576119386118db565b5060010190565b80820180821115610b5257610b526118db565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b805161198a8161180b565b919050565b5f60208083850312156119a0575f80fd5b825167ffffffffffffffff808211156119b7575f80fd5b818501915085601f8301126119ca575f80fd5b8151818111156119dc576119dc611952565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108582111715611a1f57611a1f611952565b604052918252848201925083810185019188831115611a3c575f80fd5b938501935b82851015611a6157611a528561197f565b84529385019392850192611a41565b98975050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8082028115828204841417610b5257610b526118db565b5f82611ae4577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b50049056fea164736f6c6343000818000a" +var GovDeployedBin = "0x608060405234801561000f575f80fd5b5060043610610184575f3560e01c8063807de443116100dd578063b511328d11610088578063e5aec99511610063578063e5aec995146103b0578063f2fde38b146103b9578063f92ad219146103cc575f80fd5b8063b511328d14610356578063d5cc89ba14610394578063d7693075146103a7575f80fd5b80638e21d5fb116100b85780638e21d5fb146102dd57806396dea93614610304578063a83d07371461034d575f80fd5b8063807de4431461026a57806385963052146102b65780638da5cb5b146102bf575f80fd5b806349c1a5811161013d578063715018a611610118578063715018a61461022757806374c260cf1461022f57806377c7938014610261575f80fd5b806349c1a581146101e85780635bcfadb51461020b578063639661901461021e575f80fd5b8063132002fc1161016d578063132002fc146101b0578063237a4b96146101cc5780634428c1a4146101df575f80fd5b80630121b93f146101885780630d61b5191461019d575b5f80fd5b61019b6101963660046119ba565b6103df565b005b61019b6101ab3660046119ba565b6107c3565b6101b9606b5481565b6040519081526020015b60405180910390f35b6101b96101da3660046119d1565b6108ab565b6101b9606a5481565b6101fb6101f6366004611a08565b610be9565b60405190151581526020016101c3565b61019b6102193660046119ba565b610c09565b6101b9606c5481565b61019b610cf2565b61024261023d3660046119ba565b610d05565b60408051931515845291151560208401521515908201526060016101c3565b6101b960675481565b6102917f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c3565b6101b960655481565b60335473ffffffffffffffffffffffffffffffffffffffff16610291565b6102917f000000000000000000000000000000000000000000000000000000000000000081565b6103326103123660046119ba565b606e6020525f908152604090208054600182015460029092015490919083565b604080519384526020840192909252908201526060016101c3565b6101b960715481565b61037f6103643660046119ba565b606f6020525f90815260409020805460019091015460ff1682565b604080519283529015156020830152016101c3565b61019b6103a23660046119ba565b610eab565b6101b9606d5481565b6101b960695481565b61019b6103c7366004611a36565b610fd8565b61019b6103da366004611a58565b61108f565b5f73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016636d46e987336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015610484573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104a89190611a98565b905080610516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6f6e6c792073657175656e63657220616c6c6f7765640000000000000000000060448201526064015b60405180910390fd5b606c54821115610582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e76616c69642070726f706f73616c49440000000000000000000000000000604482015260640161050d565b60715482116105ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f657870697265642070726f706f73616c49440000000000000000000000000000604482015260640161050d565b606d54821015610659576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f70726f706f73616c207072756e65640000000000000000000000000000000000604482015260640161050d565b5f828152606f60205260409020805460019091015460ff168061067a575080155b8061068457504281105b156106eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f766f74696e672068617320656e64656400000000000000000000000000000000604482015260640161050d565b610702335f858152607060205260409020906114df565b1561078f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f73657175656e63657220616c726561647920766f74656420666f72207468697360448201527f2070726f706f73616c0000000000000000000000000000000000000000000000606482015260840161050d565b6107a6335f8581526070602052604090209061150d565b506107b08361152e565b156107be576107be83611665565b505050565b5f806107ce83610d05565b5091509150811561083b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f766f74696e672068617320656e64656400000000000000000000000000000000604482015260640161050d565b806108a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f70726f706f73616c20686173206e6f74206265656e2070617373656420796574604482015260640161050d565b6107be83611665565b5f8073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016636d46e987336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015610951573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109759190611a98565b9050806109de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6f6e6c792073657175656e63657220616c6c6f77656400000000000000000000604482015260640161050d565b82604001355f03610a4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e76616c696420726f6c6c75702065706f6368000000000000000000000000604482015260640161050d565b8235151580610a5d5750602083013515155b610ac3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e76616c696420626174636820706172616d73000000000000000000000000604482015260640161050d565b606c8054905f610ad283611ae4565b9091555050606c545f908152606e602052604090208390610b0a82828135815560208201356001820155604082013560028201555050565b9050506040518060400160405280606b5442610b269190611b1b565b81525f6020918201819052606c548152606f82526040902082518155910151600190910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905533606c54604080518635815260208088013590820152818701359181019190915273ffffffffffffffffffffffffffffffffffffffff92909216917f66e5b37817dfa9935ab8e631ce7774a2e773d56cc8ea6815ac65f1fbac6420849060600160405180910390a35050606c54919050565b5f828152607060205260408120610c0090836114df565b90505b92915050565b610c11611849565b5f81118015610c225750606b548114155b610cad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f696e76616c6964206e65772070726f706f73616c20766f74696e67206475726160448201527f74696f6e00000000000000000000000000000000000000000000000000000000606482015260840161050d565b606b80549082905560408051828152602081018490527ffe810823e41a0cf27003f3eac9c17098028ba0aece75bd9783a8da7f75fb3aa3910160405180910390a15050565b610cfa611849565b610d035f6118ca565b565b5f805f606c54841115610d74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e76616c69642070726f706f73616c49440000000000000000000000000000604482015260640161050d565b607154841015610de0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f657870697265642070726f706f73616c00000000000000000000000000000000604482015260640161050d565b606d54841015610e4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f70726f706f73616c207072756e65640000000000000000000000000000000000604482015260640161050d565b6071548403610e6357506001915081905080610ea4565b5f848152606f602052604090206001810154905460ff909116908180610e87575080155b80610e9157504281105b610e9a8761152e565b8394509450945050505b9193909250565b6071548110610f3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f6f6e6c7920616c6c6f7720746f2064656c657465207468652070726f706f736160448201527f6c206265666f72206c6174657374207061737365642070726f706f73616c0000606482015260840161050d565b606d545b818111610fc6575f818152606e6020908152604080832083815560018082018590556002909101849055606f83528184208481550180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560709091528120908181610faf828261198c565b505050508080610fbe90611ae4565b915050610f40565b50610fd2816001611b1b565b606d5550565b610fe0611849565b73ffffffffffffffffffffffffffffffffffffffff8116611083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161050d565b61108c816118ca565b50565b5f54610100900460ff16158080156110ad57505f54600160ff909116105b806110c65750303b1580156110c657505f5460ff166001145b611152576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161050d565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156111ae575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff861661122b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c6964206f776e657220616464726573730000000000000000000000604482015260640161050d565b5f8511611294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f696e76616c69642070726f706f73616c20766f74696e67206475726174696f6e604482015260640161050d565b5f82116112fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e76616c696420726f6c6c75702065706f6368000000000000000000000000604482015260640161050d565b8315158061130a57508215155b611370576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e76616c696420626174636820706172616d73000000000000000000000000604482015260640161050d565b611379866118ca565b606b85905560658490556067839055606982905542606a55604080515f8152602081018790527ffe810823e41a0cf27003f3eac9c17098028ba0aece75bd9783a8da7f75fb3aa3910160405180910390a1604080515f8152602081018690527fa044538eba1b21d23eb13fa35811ca9d1d7ff9ef1c81ee4dc594fca08412531b910160405180910390a1604080515f8152602081018590527fab2cb47d396c5d12c082ac9b6512d332af2767ca8e1fa5bcef40fa6970626569910160405180910390a1604080515f8152602081018490527f9b20ee151d057f4f3ece7fdf4ca1370cf143f181760e7712b722572f2dcba88f910160405180910390a180156114d7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526001830160205260408120541515610c00565b5f610c008373ffffffffffffffffffffffffffffffffffffffff8416611940565b5f807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166377d7dffb6040518163ffffffff1660e01b81526004015f60405180830381865afa158015611598573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526115dd9190810190611b6b565b90505f805b82518110156116425761162783828151811061160057611600611c49565b602002602001015160705f8881526020019081526020015f206114df90919063ffffffff16565b1561163a57611637826001611b1b565b91505b6001016115e2565b506003825160026116539190611c76565b61165d9190611c8d565b109392505050565b60718190555f818152606e6020526040902054606554146116d957606580545f838152606e60205260409081902054928390555190917fa044538eba1b21d23eb13fa35811ca9d1d7ff9ef1c81ee4dc594fca08412531b916116cf91848252602082015260400190565b60405180910390a1505b5f818152606e60205260409020600101546067541461174e57606780545f838152606e60205260409081902060010154928390555190917fab2cb47d396c5d12c082ac9b6512d332af2767ca8e1fa5bcef40fa69706265699161174491848252602082015260400190565b60405180910390a1505b5f818152606e6020526040902060020154606954146117c257606980545f838152606e6020908152604091829020600201805490945542606a55925481518381529384015290917f9b20ee151d057f4f3ece7fdf4ca1370cf143f181760e7712b722572f2dcba88f910160405180910390a1505b5f818152606f6020908152604091829020600190810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690911790556065546067546069548451928352928201529182015281907fd31188695e1c2a2d02b755e14fa986aca41d391c337437b9159eaed8347e7f1c9060600160405180910390a250565b60335473ffffffffffffffffffffffffffffffffffffffff163314610d03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161050d565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f81815260018301602052604081205461198557508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610c03565b505f610c03565b5080545f8255905f5260205f209081019061108c91905b808211156119b6575f81556001016119a3565b5090565b5f602082840312156119ca575f80fd5b5035919050565b5f606082840312156119e1575f80fd5b50919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461108c575f80fd5b5f8060408385031215611a19575f80fd5b823591506020830135611a2b816119e7565b809150509250929050565b5f60208284031215611a46575f80fd5b8135611a51816119e7565b9392505050565b5f805f805f60a08688031215611a6c575f80fd5b8535611a77816119e7565b97602087013597506040870135966060810135965060800135945092505050565b5f60208284031215611aa8575f80fd5b81518015158114611a51575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611b1457611b14611ab7565b5060010190565b80820180821115610c0357610c03611ab7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b8051611b66816119e7565b919050565b5f6020808385031215611b7c575f80fd5b825167ffffffffffffffff80821115611b93575f80fd5b818501915085601f830112611ba6575f80fd5b815181811115611bb857611bb8611b2e565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108582111715611bfb57611bfb611b2e565b604052918252848201925083810185019188831115611c18575f80fd5b938501935b82851015611c3d57611c2e85611b5b565b84529385019392850192611c1d565b98975050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8082028115828204841417610c0357610c03611ab7565b5f82611cc0577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b50049056fea164736f6c6343000818000a" func init() { if err := json.Unmarshal([]byte(GovStorageLayoutJSON), GovStorageLayout); err != nil { diff --git a/bindings/bindings/l1crossdomainmessenger.go b/bindings/bindings/l1crossdomainmessenger.go index 87775ad2..2f47f0b2 100644 --- a/bindings/bindings/l1crossdomainmessenger.go +++ b/bindings/bindings/l1crossdomainmessenger.go @@ -31,8 +31,8 @@ var ( // L1CrossDomainMessengerMetaData contains all meta data concerning the L1CrossDomainMessenger contract. var L1CrossDomainMessengerMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ErrZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"name\":\"DropMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageHash\",\"type\":\"bytes32\"}],\"name\":\"FailedRelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageHash\",\"type\":\"bytes32\"}],\"name\":\"RelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"oldNonce\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"ReplayMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"SentMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_oldFeeVault\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_newFeeVault\",\"type\":\"address\"}],\"name\":\"UpdateFeeVault\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldMaxReplayTimes\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newMaxReplayTimes\",\"type\":\"uint256\"}],\"name\":\"UpdateMaxReplayTimes\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldRollup\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newRollup\",\"type\":\"address\"}],\"name\":\"UpdateRollup\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"counterpart\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"}],\"name\":\"dropMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"feeVault\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"finalizedWithdrawals\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_feeVault\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_rollup\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_messageQueue\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"isL1MessageDropped\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxReplayTimes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageQueue\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"messageSendTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"prevReplayIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[32]\",\"name\":\"_withdrawalProof\",\"type\":\"bytes32[32]\"},{\"internalType\":\"bytes32\",\"name\":\"_withdrawalRoot\",\"type\":\"bytes32\"}],\"name\":\"proveAndRelayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_newGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"_refundAddress\",\"type\":\"address\"}],\"name\":\"replayMessage\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"replayStates\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"times\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"lastIndex\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rollup\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_refundAddress\",\"type\":\"address\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_status\",\"type\":\"bool\"}],\"name\":\"setPause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newFeeVault\",\"type\":\"address\"}],\"name\":\"updateFeeVault\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newMaxReplayTimes\",\"type\":\"uint256\"}],\"name\":\"updateMaxReplayTimes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newRollup\",\"type\":\"address\"}],\"name\":\"updateRollup\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"leafHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[32]\",\"name\":\"smtProof\",\"type\":\"bytes32[32]\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"verifyMerkleProof\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"xDomainMessageSender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x608060405234801562000010575f80fd5b506200001b62000021565b620000df565b5f54610100900460ff16156200008d5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614620000dd575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b612de580620000ed5f395ff3fe6080604052600436106101a7575f3560e01c806386fa4b73116100e7578063c0c53b8b11610087578063e70fc93b11610062578063e70fc93b146104f9578063ea7ec51414610524578063ecc7042814610550578063f2fde38b14610564575f80fd5b8063c0c53b8b1461049c578063cb23bcb5146104bb578063d87e7df1146104da575f80fd5b8063a14238e7116100c2578063a14238e71461040e578063b2267a7b1461043c578063b604bf4c1461044f578063bedb86fb1461047d575f80fd5b806386fa4b73146103af5780638da5cb5b146103ce578063946130d8146103eb575f80fd5b806355004105116101525780636e296e451161012d5780636e296e45146102de578063715018a6146102fd578063797594b014610311578063846d4d7a14610330575f80fd5b806355004105146102a15780635c975abb146102b45780635f7b1577146102cb575f80fd5b80633b70c18a116101825780633b70c18a1461022c578063407c195514610263578063478222c214610282575f80fd5b806329907acd146101ba5780632a6cccb2146101d9578063340735f7146101f8575f80fd5b366101b6576101b4610583565b005b5f80fd5b3480156101c5575f80fd5b506101b46101d436600461283a565b6105e4565b3480156101e4575f80fd5b506101b46101f33660046128a7565b610966565b348015610203575f80fd5b506102176102123660046128de565b610a2d565b60405190151581526020015b60405180910390f35b348015610237575f80fd5b5060fe5461024b906001600160a01b031681565b6040516001600160a01b039091168152602001610223565b34801561026e575f80fd5b506101b461027d36600461291a565b610af6565b34801561028d575f80fd5b5060cb5461024b906001600160a01b031681565b6101b46102af366004612931565b610bb9565b3480156102bf575f80fd5b5060655460ff16610217565b6101b46102d93660046129c8565b611201565b3480156102e9575f80fd5b5060c95461024b906001600160a01b031681565b348015610308575f80fd5b506101b4611255565b34801561031c575f80fd5b5060ca5461024b906001600160a01b031681565b34801561033b575f80fd5b5061038661034a36600461291a565b6101006020525f90815260409020546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041682565b604080516fffffffffffffffffffffffffffffffff938416815292909116602083015201610223565b3480156103ba575f80fd5b506101b46103c9366004612a66565b611266565b3480156103d9575f80fd5b506033546001600160a01b031661024b565b3480156103f6575f80fd5b5061040060ff5481565b604051908152602001610223565b348015610419575f80fd5b5061021761042836600461291a565b60fa6020525f908152604090205460ff1681565b6101b461044a366004612aef565b611732565b34801561045a575f80fd5b5061021761046936600461291a565b60fc6020525f908152604090205460ff1681565b348015610488575f80fd5b506101b4610497366004612b57565b61174d565b3480156104a7575f80fd5b506101b46104b6366004612b72565b61176e565b3480156104c6575f80fd5b5060fd5461024b906001600160a01b031681565b3480156104e5575f80fd5b506101b46104f43660046128a7565b6119d1565b348015610504575f80fd5b5061040061051336600461291a565b60fb6020525f908152604090205481565b34801561052f575f80fd5b5061040061053e36600461291a565b6101016020525f908152604090205481565b34801561055b575f80fd5b50610400611ac7565b34801561056f575f80fd5b506101b461057e3660046128a7565b611b50565b6033546001600160a01b031633146105e25760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b565b6105ec611bdd565b60c9546001600160a01b031661dead146106485760405162461bcd60e51b815260206004820152601f60248201527f4d65737361676520697320616c726561647920696e20657865637574696f6e0060448201526064016105d9565b60fe546001600160a01b03165f6106628787878787611c30565b90505f818051906020012090505f60fb5f8381526020019081526020015f2054116106f55760405162461bcd60e51b815260206004820152602660248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f717565756564000000000000000000000000000000000000000000000000000060648201526084016105d9565b5f81815260fc602052604090205460ff16156107535760405162461bcd60e51b815260206004820152601760248201527f4d65737361676520616c72656164792064726f7070656400000000000000000060448201526064016105d9565b5f818152610100602052604081205470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff16908190036107935750845b6040517f91652461000000000000000000000000000000000000000000000000000000008152600481018290526001600160a01b038516906391652461906024015f604051808303815f87803b1580156107eb575f80fd5b505af11580156107fd573d5f803e3d5ffd5b5050505f918252506101016020526040902054801561083d577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01610793565b5f82815260fc6020526040808220805460ff191660011790555187917fbd05aabbf548001ebdd6ac80c02f1cfb3b39165f2fae1d420075f22e781ef63b91a260c980547fffffffffffffffffffffffff000000000000000000000000000000000000000016736f297c61b5c92ef107ffd30cd56affe5a273e8411790556040517f14298c510000000000000000000000000000000000000000000000000000000081526001600160a01b038a16906314298c51908990610901908990600401612c1d565b5f604051808303818588803b158015610918575f80fd5b505af115801561092a573d5f803e3d5ffd5b505060c980547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055505050505050505050505050565b61096e610583565b6001600160a01b0381166109c45760405162461bcd60e51b815260206004820152601d60248201527f6665655661756c742063616e6e6f74206265206164647265737328302900000060448201526064016105d9565b60cb80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f4aadc32827849f797733838c61302f7f56d2b6db28caa175eb3f7f8e5aba25f5905f90a35050565b5f84815b6020811015610aea578085901c600116600103610a9757858160208110610a5a57610a5a612c2f565b602002013582604051602001610a7a929190918252602082015260400190565b604051602081830303815290604052805190602001209150610ae2565b81868260208110610aaa57610aaa612c2f565b6020020135604051602001610ac9929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b600101610a31565b50909114949350505050565b610afe610583565b5f8111610b735760405162461bcd60e51b815260206004820152602360248201527f7265706c61792074696d6573206d75737420626520677265617465722074686160448201527f6e2030000000000000000000000000000000000000000000000000000000000060648201526084016105d9565b60ff80549082905560408051828152602081018490527fd700562df02eb66951f6f5275df7ebd7c0ec58b3422915789b3b1877aab2e52b91015b60405180910390a15050565b610bc1611bdd565b60c9546001600160a01b031661dead14610c1d5760405162461bcd60e51b815260206004820152601f60248201527f4d65737361676520697320616c726561647920696e20657865637574696f6e0060448201526064016105d9565b60fe5460ca546001600160a01b0391821691165f610c3e8a8a8a8a8a611c30565b90505f818051906020012090505f60fb5f8381526020019081526020015f205411610cd15760405162461bcd60e51b815260206004820152602660248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f717565756564000000000000000000000000000000000000000000000000000060648201526084016105d9565b5f81815260fc602052604090205460ff1615610d2f5760405162461bcd60e51b815260206004820152601760248201527f4d65737361676520616c72656164792064726f7070656400000000000000000060448201526064016105d9565b6040517f3e4cbbe60000000000000000000000000000000000000000000000000000000081526001600160a01b038c8116600483015263ffffffff881660248301525f9190861690633e4cbbe690604401602060405180830381865afa158015610d9b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610dbf9190612c5c565b905080341015610e115760405162461bcd60e51b815260206004820152601e60248201527f496e73756666696369656e74206d73672e76616c756520666f7220666565000060448201526064016105d9565b8015610eb95760cb546040515f916001600160a01b03169083908381818185875af1925050503d805f8114610e61576040519150601f19603f3d011682016040523d82523d5f602084013e610e66565b606091505b5050905080610eb75760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f206465647563742074686520666565000000000000000060448201526064016105d9565b505b5f856001600160a01b031663fd0ad31e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ef6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610f1a9190612c5c565b6040517f9b1597820000000000000000000000000000000000000000000000000000000081529091506001600160a01b03871690639b15978290610f669088908c908990600401612c73565b5f604051808303815f87803b158015610f7d575f80fd5b505af1158015610f8f573d5f803e3d5ffd5b5050505f848152610100602090815260408083208151808301909252546fffffffffffffffffffffffffffffffff80821683527001000000000000000000000000000000009091041691810182905292509003610fff575f8281526101016020526040902060018c019055611030565b80602001516001016fffffffffffffffffffffffffffffffff166101015f8481526020019081526020015f20819055505b6fffffffffffffffffffffffffffffffff808316602083015260ff5482519091161061109e5760405162461bcd60e51b815260206004820152601b60248201527f457863656564206d6178696d756d207265706c61792074696d6573000000000060448201526064016105d9565b80516fffffffffffffffffffffffffffffffff600191909101811682525f858152610100602090815260409091208351919093015182167001000000000000000000000000000000000291161790556001600160a01b038c166110fe3390565b6001600160a01b03168b7fa3a1251805b1fc7915884575b42e1fb862e814f0f5c9d670d08bf84697053d618e858d8f60405161113d9493929190612ca9565b60405180910390a4348281039083146111f1575f886001600160a01b0316826040515f6040518083038185875af1925050503d805f8114611199576040519150601f19603f3d011682016040523d82523d5f602084013e61119e565b606091505b50509050806111ef5760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f20726566756e642074686520666565000000000000000060448201526064016105d9565b505b5050505050505050505050505050565b611209611bdd565b61124d868686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250889250879150611ccc9050565b505050505050565b61125d610583565b6105e25f612118565b61126e611bdd565b60c9546001600160a01b031661dead146112ca5760405162461bcd60e51b815260206004820152601f60248201527f4d65737361676520697320616c726561647920696e20657865637574696f6e0060448201526064016105d9565b60fe546001600160a01b039081169087160361134e5760405162461bcd60e51b815260206004820152602760248201527f4d657373656e6765723a20466f7262696420746f2063616c6c206d657373616760448201527f652071756575650000000000000000000000000000000000000000000000000060648201526084016105d9565b61135786612181565b60c9546001600160a01b03908116908816036113db5760405162461bcd60e51b815260206004820152602160248201527f4d657373656e6765723a20496e76616c6964206d6573736167652073656e646560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016105d9565b5f6113e98888888888611c30565b80516020918201205f81815260fa90925260409091205490915060ff16156114795760405162461bcd60e51b815260206004820152603060248201527f4d657373656e6765723a207769746864726177616c2068617320616c7265616460448201527f79206265656e2066696e616c697a65640000000000000000000000000000000060648201526084016105d9565b60fd546040517f04d77215000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b03909116905f9082906304d7721590602401602060405180830381865afa1580156114dd573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115019190612cdd565b9050806115765760405162461bcd60e51b815260206004820152602760248201527f4d657373656e6765723a207769746864726177616c526f6f74206e6f7420666960448201527f6e616c697a65640000000000000000000000000000000000000000000000000060648201526084016105d9565b61158283868987610a2d565b6115f45760405162461bcd60e51b815260206004820152602d60248201527f4d657373656e6765723a20696e76616c6964207769746864726177616c20696e60448201527f636c7573696f6e2070726f6f660000000000000000000000000000000000000060648201526084016105d9565b5060c980547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038b8116919091179091556040515f918a16908990611642908990612cf8565b5f6040518083038185875af1925050503d805f811461167c576040519150601f19603f3d011682016040523d82523d5f602084013e611681565b606091505b505060c980547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055905080156116fb575f83815260fa6020526040808220805460ff191660011790555184917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611726565b60405183907f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f905f90a25b50505050505050505050565b61173a611bdd565b6117478484848433611ccc565b50505050565b611755610583565b8015611766576117636121d9565b50565b611763612233565b5f54610100900460ff161580801561178c57505f54600160ff909116105b806117a55750303b1580156117a557505f5460ff166001145b6118175760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105d9565b5f805460ff191660011790558015611855575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b038316158061187257506001600160a01b038216155b8061188457506001600160a01b038416155b156118bb576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6118d97353000000000000000000000000000000000000078561226c565b60fd80546001600160a01b038086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fe805492851692909116919091179055600360ff8190556040517fd700562df02eb66951f6f5275df7ebd7c0ec58b3422915789b3b1877aab2e52b91611962915f9190918252602082015260400190565b60405180910390a18015611747575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b6119d9610583565b6001600160a01b038116611a555760405162461bcd60e51b815260206004820152602360248201527f726f6c6c757020616464726573732063616e6e6f74206265206164647265737360448201527f283029000000000000000000000000000000000000000000000000000000000060648201526084016105d9565b60fd80546001600160a01b038381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f5272c8ad4bd643b1130291ea29bebd9b3bc583057a6e4d047eb7077039a956309101610bad565b60fe54604080517ffd0ad31e00000000000000000000000000000000000000000000000000000000815290515f926001600160a01b03169163fd0ad31e9160048083019260209291908290030181865afa158015611b27573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b4b9190612c5c565b905090565b611b58610583565b6001600160a01b038116611bd45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016105d9565b61176381612118565b60655460ff16156105e25760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016105d9565b60608585858585604051602401611c4b959493929190612d13565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8ef1332e00000000000000000000000000000000000000000000000000000000179052905095945050505050565b611cd4612384565b60fe5460ca54604080517ffd0ad31e00000000000000000000000000000000000000000000000000000000815290516001600160a01b0393841693909216915f91849163fd0ad31e916004808201926020929091908290030181865afa158015611d40573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d649190612c5c565b90505f611d74338a8a858b611c30565b90505f6001600160a01b038516633e4cbbe6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602481018a9052604401602060405180830381865afa158015611de8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e0c9190612c5c565b9050611e188982612d55565b341015611e675760405162461bcd60e51b815260206004820152601660248201527f496e73756666696369656e74206d73672e76616c75650000000000000000000060448201526064016105d9565b8015611f0f5760cb546040515f916001600160a01b03169083908381818185875af1925050503d805f8114611eb7576040519150601f19603f3d011682016040523d82523d5f602084013e611ebc565b606091505b5050905080611f0d5760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f206465647563742074686520666565000000000000000060448201526064016105d9565b505b6040517f9b1597820000000000000000000000000000000000000000000000000000000081526001600160a01b03861690639b15978290611f589087908b908790600401612d8d565b5f604051808303815f87803b158015611f6f575f80fd5b505af1158015611f81573d5f803e3d5ffd5b505050505f8280519060200120905060fb5f8281526020019081526020015f20545f14611ff05760405162461bcd60e51b815260206004820152601260248201527f4475706c696361746564206d657373616765000000000000000000000000000060448201526064016105d9565b5f81815260fb602052604090204290556001600160a01b038b16336001600160a01b03167f104371f3b442861a2a7b82a070afbbaab748bb13757bf47769e170e37809ec1e8c878c8e6040516120499493929190612db4565b60405180910390a3348290038a8103908b14612100575f886001600160a01b0316826040515f6040518083038185875af1925050503d805f81146120a8576040519150601f19603f3d011682016040523d82523d5f602084013e6120ad565b606091505b50509050806120fe5760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f20726566756e642074686520666565000000000000000060448201526064016105d9565b505b505050505050506121116001609755565b5050505050565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b306001600160a01b038216036117635760405162461bcd60e51b815260206004820152601e60248201527f4d657373656e6765723a20466f7262696420746f2063616c6c2073656c66000060448201526064016105d9565b6121e1611bdd565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586122163390565b6040516001600160a01b03909116815260200160405180910390a1565b61223b6123e4565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33612216565b5f54610100900460ff166122e85760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d9565b6122f0612436565b6122f86124ba565b61230061253e565b60c980547fffffffffffffffffffffffff000000000000000000000000000000000000000090811661dead1790915560ca80546001600160a01b03858116919093161790558116156123805760cb80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383161790555b5050565b6002609754036123d65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016105d9565b6002609755565b6001609755565b60655460ff166105e25760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016105d9565b5f54610100900460ff166124b25760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d9565b6105e26125c2565b5f54610100900460ff166125365760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d9565b6105e2612647565b5f54610100900460ff166125ba5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d9565b6105e26126cf565b5f54610100900460ff1661263e5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d9565b6105e233612118565b5f54610100900460ff166126c35760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d9565b6065805460ff19169055565b5f54610100900460ff166123dd5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105d9565b80356001600160a01b0381168114612761575f80fd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126127a2575f80fd5b813567ffffffffffffffff808211156127bd576127bd612766565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190828211818310171561280357612803612766565b8160405283815286602085880101111561281b575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f60a0868803121561284e575f80fd5b6128578661274b565b94506128656020870161274b565b93506040860135925060608601359150608086013567ffffffffffffffff81111561288e575f80fd5b61289a88828901612793565b9150509295509295909350565b5f602082840312156128b7575f80fd5b6128c08261274b565b9392505050565b8061040081018310156128d8575f80fd5b92915050565b5f805f8061046085870312156128f2575f80fd5b8435935061290386602087016128c7565b939693955050505061042082013591610440013590565b5f6020828403121561292a575f80fd5b5035919050565b5f805f805f805f60e0888a031215612947575f80fd5b6129508861274b565b965061295e6020890161274b565b95506040880135945060608801359350608088013567ffffffffffffffff811115612987575f80fd5b6129938a828b01612793565b93505060a088013563ffffffff811681146129ac575f80fd5b91506129ba60c0890161274b565b905092959891949750929550565b5f805f805f8060a087890312156129dd575f80fd5b6129e68761274b565b955060208701359450604087013567ffffffffffffffff80821115612a09575f80fd5b818901915089601f830112612a1c575f80fd5b813581811115612a2a575f80fd5b8a6020828501011115612a3b575f80fd5b60208301965080955050505060608701359150612a5a6080880161274b565b90509295509295509295565b5f805f805f805f6104c0888a031215612a7d575f80fd5b612a868861274b565b9650612a946020890161274b565b95506040880135945060608801359350608088013567ffffffffffffffff811115612abd575f80fd5b612ac98a828b01612793565b935050612ad98960a08a016128c7565b91506104a0880135905092959891949750929550565b5f805f8060808587031215612b02575f80fd5b612b0b8561274b565b935060208501359250604085013567ffffffffffffffff811115612b2d575f80fd5b612b3987828801612793565b949793965093946060013593505050565b8015158114611763575f80fd5b5f60208284031215612b67575f80fd5b81356128c081612b4a565b5f805f60608486031215612b84575f80fd5b612b8d8461274b565b9250612b9b6020850161274b565b9150612ba96040850161274b565b90509250925092565b5f5b83811015612bcc578181015183820152602001612bb4565b50505f910152565b5f8151808452612beb816020860160208601612bb2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f6128c06020830184612bd4565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215612c6c575f80fd5b5051919050565b6001600160a01b038416815263ffffffff83166020820152606060408201525f612ca06060830184612bd4565b95945050505050565b84815283602082015263ffffffff83166040820152608060608201525f612cd36080830184612bd4565b9695505050505050565b5f60208284031215612ced575f80fd5b81516128c081612b4a565b5f8251612d09818460208701612bb2565b9190910192915050565b5f6001600160a01b03808816835280871660208401525084604083015283606083015260a06080830152612d4a60a0830184612bd4565b979650505050505050565b808201808211156128d8577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6001600160a01b0384168152826020820152606060408201525f612ca06060830184612bd4565b848152836020820152826040820152608060608201525f612cd36080830184612bd456fea164736f6c6343000818000a", + ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ErrZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageHash\",\"type\":\"bytes32\"}],\"name\":\"FailedRelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"messageHash\",\"type\":\"bytes32\"}],\"name\":\"RelayedMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"oldNonce\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"ReplayMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"messageNonce\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"message\",\"type\":\"bytes\"}],\"name\":\"SentMessage\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_oldFeeVault\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_newFeeVault\",\"type\":\"address\"}],\"name\":\"UpdateFeeVault\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldMaxReplayTimes\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newMaxReplayTimes\",\"type\":\"uint256\"}],\"name\":\"UpdateMaxReplayTimes\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"oldRollup\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"newRollup\",\"type\":\"address\"}],\"name\":\"UpdateRollup\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"__isL1MessageDropped\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"counterpart\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"feeVault\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"finalizedWithdrawals\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_feeVault\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_rollup\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_messageQueue\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxReplayTimes\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageNonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageQueue\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"messageSendTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"prevReplayIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"bytes32[32]\",\"name\":\"_withdrawalProof\",\"type\":\"bytes32[32]\"},{\"internalType\":\"bytes32\",\"name\":\"_withdrawalRoot\",\"type\":\"bytes32\"}],\"name\":\"proveAndRelayMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_messageNonce\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint32\",\"name\":\"_newGasLimit\",\"type\":\"uint32\"},{\"internalType\":\"address\",\"name\":\"_refundAddress\",\"type\":\"address\"}],\"name\":\"replayMessage\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"name\":\"replayStates\",\"outputs\":[{\"internalType\":\"uint128\",\"name\":\"times\",\"type\":\"uint128\"},{\"internalType\":\"uint128\",\"name\":\"lastIndex\",\"type\":\"uint128\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rollup\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_refundAddress\",\"type\":\"address\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"}],\"name\":\"sendMessage\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_status\",\"type\":\"bool\"}],\"name\":\"setPause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newFeeVault\",\"type\":\"address\"}],\"name\":\"updateFeeVault\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newMaxReplayTimes\",\"type\":\"uint256\"}],\"name\":\"updateMaxReplayTimes\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newRollup\",\"type\":\"address\"}],\"name\":\"updateRollup\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"leafHash\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32[32]\",\"name\":\"smtProof\",\"type\":\"bytes32[32]\"},{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"},{\"internalType\":\"bytes32\",\"name\":\"root\",\"type\":\"bytes32\"}],\"name\":\"verifyMerkleProof\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"xDomainMessageSender\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x608060405234801562000010575f80fd5b506200001b62000021565b620000df565b5f54610100900460ff16156200008d5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614620000dd575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b612a5080620000ed5f395ff3fe60806040526004361061019c575f3560e01c806386fa4b73116100dc578063c0c53b8b11610087578063e70fc93b11610062578063e70fc93b146104cf578063ea7ec514146104fa578063ecc7042814610526578063f2fde38b1461053a575f80fd5b8063c0c53b8b14610472578063cb23bcb514610491578063d87e7df1146104b0575f80fd5b8063a14238e7116100b7578063a14238e714610412578063b2267a7b14610440578063bedb86fb14610453575f80fd5b806386fa4b73146103b35780638da5cb5b146103d2578063946130d8146103ef575f80fd5b806355004105116101475780636e296e45116101225780636e296e45146102e2578063715018a614610301578063797594b014610315578063846d4d7a14610334575f80fd5b806355004105146102a55780635c975abb146102b85780635f7b1577146102cf575f80fd5b80633b70c18a116101775780633b70c18a14610230578063407c195514610267578063478222c214610286575f80fd5b806305804dd7146101af5780632a6cccb2146101f2578063340735f714610211575f80fd5b366101ab576101a9610559565b005b5f80fd5b3480156101ba575f80fd5b506101dd6101c9366004612435565b60fc6020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b3480156101fd575f80fd5b506101a961020c366004612467565b6105ba565b34801561021c575f80fd5b506101dd61022b36600461249e565b610681565b34801561023b575f80fd5b5060fe5461024f906001600160a01b031681565b6040516001600160a01b0390911681526020016101e9565b348015610272575f80fd5b506101a9610281366004612435565b61074a565b348015610291575f80fd5b5060cb5461024f906001600160a01b031681565b6101a96102b33660046125ae565b61080d565b3480156102c3575f80fd5b5060655460ff166101dd565b6101a96102dd366004612645565b610e55565b3480156102ed575f80fd5b5060c95461024f906001600160a01b031681565b34801561030c575f80fd5b506101a9610ea9565b348015610320575f80fd5b5060ca5461024f906001600160a01b031681565b34801561033f575f80fd5b5061038a61034e366004612435565b6101006020525f90815260409020546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041682565b604080516fffffffffffffffffffffffffffffffff9384168152929091166020830152016101e9565b3480156103be575f80fd5b506101a96103cd3660046126e3565b610eba565b3480156103dd575f80fd5b506033546001600160a01b031661024f565b3480156103fa575f80fd5b5061040460ff5481565b6040519081526020016101e9565b34801561041d575f80fd5b506101dd61042c366004612435565b60fa6020525f908152604090205460ff1681565b6101a961044e36600461276c565b6113a4565b34801561045e575f80fd5b506101a961046d3660046127d4565b6113bf565b34801561047d575f80fd5b506101a961048c3660046127ef565b6113e0565b34801561049c575f80fd5b5060fd5461024f906001600160a01b031681565b3480156104bb575f80fd5b506101a96104ca366004612467565b611661565b3480156104da575f80fd5b506104046104e9366004612435565b60fb6020525f908152604090205481565b348015610505575f80fd5b50610404610514366004612435565b6101016020525f908152604090205481565b348015610531575f80fd5b50610404611757565b348015610545575f80fd5b506101a9610554366004612467565b6117e0565b6033546001600160a01b031633146105b85760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b565b6105c2610559565b6001600160a01b0381166106185760405162461bcd60e51b815260206004820152601d60248201527f6665655661756c742063616e6e6f74206265206164647265737328302900000060448201526064016105af565b60cb80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f4aadc32827849f797733838c61302f7f56d2b6db28caa175eb3f7f8e5aba25f5905f90a35050565b5f84815b602081101561073e578085901c6001166001036106eb578581602081106106ae576106ae61282f565b6020020135826040516020016106ce929190918252602082015260400190565b604051602081830303815290604052805190602001209150610736565b818682602081106106fe576106fe61282f565b602002013560405160200161071d929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b600101610685565b50909114949350505050565b610752610559565b5f81116107c75760405162461bcd60e51b815260206004820152602360248201527f7265706c61792074696d6573206d75737420626520677265617465722074686160448201527f6e2030000000000000000000000000000000000000000000000000000000000060648201526084016105af565b60ff80549082905560408051828152602081018490527fd700562df02eb66951f6f5275df7ebd7c0ec58b3422915789b3b1877aab2e52b91015b60405180910390a15050565b61081561186d565b60c9546001600160a01b031661dead146108715760405162461bcd60e51b815260206004820152601f60248201527f4d65737361676520697320616c726561647920696e20657865637574696f6e0060448201526064016105af565b60fe5460ca546001600160a01b0391821691165f6108928a8a8a8a8a6118c0565b90505f818051906020012090505f60fb5f8381526020019081526020015f2054116109255760405162461bcd60e51b815260206004820152602660248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f717565756564000000000000000000000000000000000000000000000000000060648201526084016105af565b5f81815260fc602052604090205460ff16156109835760405162461bcd60e51b815260206004820152601760248201527f4d65737361676520616c72656164792064726f7070656400000000000000000060448201526064016105af565b6040517f3e4cbbe60000000000000000000000000000000000000000000000000000000081526001600160a01b038c8116600483015263ffffffff881660248301525f9190861690633e4cbbe690604401602060405180830381865afa1580156109ef573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610a13919061285c565b905080341015610a655760405162461bcd60e51b815260206004820152601e60248201527f496e73756666696369656e74206d73672e76616c756520666f7220666565000060448201526064016105af565b8015610b0d5760cb546040515f916001600160a01b03169083908381818185875af1925050503d805f8114610ab5576040519150601f19603f3d011682016040523d82523d5f602084013e610aba565b606091505b5050905080610b0b5760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f206465647563742074686520666565000000000000000060448201526064016105af565b505b5f856001600160a01b031663fd0ad31e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610b4a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b6e919061285c565b6040517f9b1597820000000000000000000000000000000000000000000000000000000081529091506001600160a01b03871690639b15978290610bba9088908c9089906004016128de565b5f604051808303815f87803b158015610bd1575f80fd5b505af1158015610be3573d5f803e3d5ffd5b5050505f848152610100602090815260408083208151808301909252546fffffffffffffffffffffffffffffffff80821683527001000000000000000000000000000000009091041691810182905292509003610c53575f8281526101016020526040902060018c019055610c84565b80602001516001016fffffffffffffffffffffffffffffffff166101015f8481526020019081526020015f20819055505b6fffffffffffffffffffffffffffffffff808316602083015260ff54825190911610610cf25760405162461bcd60e51b815260206004820152601b60248201527f457863656564206d6178696d756d207265706c61792074696d6573000000000060448201526064016105af565b80516fffffffffffffffffffffffffffffffff600191909101811682525f858152610100602090815260409091208351919093015182167001000000000000000000000000000000000291161790556001600160a01b038c16610d523390565b6001600160a01b03168b7fa3a1251805b1fc7915884575b42e1fb862e814f0f5c9d670d08bf84697053d618e858d8f604051610d919493929190612914565b60405180910390a434828103908314610e45575f886001600160a01b0316826040515f6040518083038185875af1925050503d805f8114610ded576040519150601f19603f3d011682016040523d82523d5f602084013e610df2565b606091505b5050905080610e435760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f20726566756e642074686520666565000000000000000060448201526064016105af565b505b5050505050505050505050505050565b610e5d61186d565b610ea1868686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525088925087915061195c9050565b505050505050565b610eb1610559565b6105b85f611da8565b610ec261186d565b60c9546001600160a01b031661dead14610f1e5760405162461bcd60e51b815260206004820152601f60248201527f4d65737361676520697320616c726561647920696e20657865637574696f6e0060448201526064016105af565b60fe546001600160a01b0390811690871603610fa25760405162461bcd60e51b815260206004820152602760248201527f4d657373656e6765723a20466f7262696420746f2063616c6c206d657373616760448201527f652071756575650000000000000000000000000000000000000000000000000060648201526084016105af565b610fab86611e11565b60c9546001600160a01b039081169088160361102f5760405162461bcd60e51b815260206004820152602160248201527f4d657373656e6765723a20496e76616c6964206d6573736167652073656e646560448201527f720000000000000000000000000000000000000000000000000000000000000060648201526084016105af565b5f61103d88888888886118c0565b80516020918201205f81815260fa90925260409091205490915060ff16156110cd5760405162461bcd60e51b815260206004820152603060248201527f4d657373656e6765723a207769746864726177616c2068617320616c7265616460448201527f79206265656e2066696e616c697a65640000000000000000000000000000000060648201526084016105af565b60fd546040517f04d77215000000000000000000000000000000000000000000000000000000008152600481018490526001600160a01b03909116905f9082906304d7721590602401602060405180830381865afa158015611131573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906111559190612948565b9050806111ca5760405162461bcd60e51b815260206004820152602760248201527f4d657373656e6765723a207769746864726177616c526f6f74206e6f7420666960448201527f6e616c697a65640000000000000000000000000000000000000000000000000060648201526084016105af565b6111d683868987610681565b6112485760405162461bcd60e51b815260206004820152602d60248201527f4d657373656e6765723a20696e76616c6964207769746864726177616c20696e60448201527f636c7573696f6e2070726f6f660000000000000000000000000000000000000060648201526084016105af565b5060c980547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038b8116919091179091556040515f918a16908990611296908990612963565b5f6040518083038185875af1925050503d805f81146112d0576040519150601f19603f3d011682016040523d82523d5f602084013e6112d5565b606091505b505060c980547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead1790559050801561136d575f83815260fa602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555184917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611398565b60405183907f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f905f90a25b50505050505050505050565b6113ac61186d565b6113b9848484843361195c565b50505050565b6113c7610559565b80156113d8576113d5611e69565b50565b6113d5611ee1565b5f54610100900460ff16158080156113fe57505f54600160ff909116105b806114175750303b15801561141757505f5460ff166001145b6114895760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105af565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156114e5575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b038316158061150257506001600160a01b038216155b8061151457506001600160a01b038416155b1561154b576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61156973530000000000000000000000000000000000000785611f38565b60fd80546001600160a01b038086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fe805492851692909116919091179055600360ff8190556040517fd700562df02eb66951f6f5275df7ebd7c0ec58b3422915789b3b1877aab2e52b916115f2915f9190918252602082015260400190565b60405180910390a180156113b9575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b611669610559565b6001600160a01b0381166116e55760405162461bcd60e51b815260206004820152602360248201527f726f6c6c757020616464726573732063616e6e6f74206265206164647265737360448201527f283029000000000000000000000000000000000000000000000000000000000060648201526084016105af565b60fd80546001600160a01b038381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f5272c8ad4bd643b1130291ea29bebd9b3bc583057a6e4d047eb7077039a956309101610801565b60fe54604080517ffd0ad31e00000000000000000000000000000000000000000000000000000000815290515f926001600160a01b03169163fd0ad31e9160048083019260209291908290030181865afa1580156117b7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117db919061285c565b905090565b6117e8610559565b6001600160a01b0381166118645760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016105af565b6113d581611da8565b60655460ff16156105b85760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a207061757365640000000000000000000000000000000060448201526064016105af565b606085858585856040516024016118db95949392919061297e565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8ef1332e00000000000000000000000000000000000000000000000000000000179052905095945050505050565b611964612050565b60fe5460ca54604080517ffd0ad31e00000000000000000000000000000000000000000000000000000000815290516001600160a01b0393841693909216915f91849163fd0ad31e916004808201926020929091908290030181865afa1580156119d0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906119f4919061285c565b90505f611a04338a8a858b6118c0565b90505f6001600160a01b038516633e4cbbe6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602481018a9052604401602060405180830381865afa158015611a78573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a9c919061285c565b9050611aa889826129c0565b341015611af75760405162461bcd60e51b815260206004820152601660248201527f496e73756666696369656e74206d73672e76616c75650000000000000000000060448201526064016105af565b8015611b9f5760cb546040515f916001600160a01b03169083908381818185875af1925050503d805f8114611b47576040519150601f19603f3d011682016040523d82523d5f602084013e611b4c565b606091505b5050905080611b9d5760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f206465647563742074686520666565000000000000000060448201526064016105af565b505b6040517f9b1597820000000000000000000000000000000000000000000000000000000081526001600160a01b03861690639b15978290611be89087908b9087906004016129f8565b5f604051808303815f87803b158015611bff575f80fd5b505af1158015611c11573d5f803e3d5ffd5b505050505f8280519060200120905060fb5f8281526020019081526020015f20545f14611c805760405162461bcd60e51b815260206004820152601260248201527f4475706c696361746564206d657373616765000000000000000000000000000060448201526064016105af565b5f81815260fb602052604090204290556001600160a01b038b16336001600160a01b03167f104371f3b442861a2a7b82a070afbbaab748bb13757bf47769e170e37809ec1e8c878c8e604051611cd99493929190612a1f565b60405180910390a3348290038a8103908b14611d90575f886001600160a01b0316826040515f6040518083038185875af1925050503d805f8114611d38576040519150601f19603f3d011682016040523d82523d5f602084013e611d3d565b606091505b5050905080611d8e5760405162461bcd60e51b815260206004820152601860248201527f4661696c656420746f20726566756e642074686520666565000000000000000060448201526064016105af565b505b50505050505050611da16001609755565b5050505050565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b306001600160a01b038216036113d55760405162461bcd60e51b815260206004820152601e60248201527f4d657373656e6765723a20466f7262696420746f2063616c6c2073656c66000060448201526064016105af565b611e7161186d565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611ec43390565b6040516001600160a01b03909116815260200160405180910390a1565b611ee96120b0565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33611ec4565b5f54610100900460ff16611fb45760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105af565b611fbc612102565b611fc4612186565b611fcc61220a565b60c980547fffffffffffffffffffffffff000000000000000000000000000000000000000090811661dead1790915560ca80546001600160a01b038581169190931617905581161561204c5760cb80547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383161790555b5050565b6002609754036120a25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016105af565b6002609755565b6001609755565b60655460ff166105b85760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f742070617573656400000000000000000000000060448201526064016105af565b5f54610100900460ff1661217e5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105af565b6105b861228e565b5f54610100900460ff166122025760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105af565b6105b8612313565b5f54610100900460ff166122865760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105af565b6105b86123b9565b5f54610100900460ff1661230a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105af565b6105b833611da8565b5f54610100900460ff1661238f5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105af565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b5f54610100900460ff166120a95760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105af565b5f60208284031215612445575f80fd5b5035919050565b80356001600160a01b0381168114612462575f80fd5b919050565b5f60208284031215612477575f80fd5b6124808261244c565b9392505050565b806104008101831015612498575f80fd5b92915050565b5f805f8061046085870312156124b2575f80fd5b843593506124c38660208701612487565b939693955050505061042082013591610440013590565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112612516575f80fd5b813567ffffffffffffffff80821115612531576125316124da565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715612577576125776124da565b8160405283815286602085880101111561258f575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a0312156125c4575f80fd5b6125cd8861244c565b96506125db6020890161244c565b95506040880135945060608801359350608088013567ffffffffffffffff811115612604575f80fd5b6126108a828b01612507565b93505060a088013563ffffffff81168114612629575f80fd5b915061263760c0890161244c565b905092959891949750929550565b5f805f805f8060a0878903121561265a575f80fd5b6126638761244c565b955060208701359450604087013567ffffffffffffffff80821115612686575f80fd5b818901915089601f830112612699575f80fd5b8135818111156126a7575f80fd5b8a60208285010111156126b8575f80fd5b602083019650809550505050606087013591506126d76080880161244c565b90509295509295509295565b5f805f805f805f6104c0888a0312156126fa575f80fd5b6127038861244c565b96506127116020890161244c565b95506040880135945060608801359350608088013567ffffffffffffffff81111561273a575f80fd5b6127468a828b01612507565b9350506127568960a08a01612487565b91506104a0880135905092959891949750929550565b5f805f806080858703121561277f575f80fd5b6127888561244c565b935060208501359250604085013567ffffffffffffffff8111156127aa575f80fd5b6127b687828801612507565b949793965093946060013593505050565b80151581146113d5575f80fd5b5f602082840312156127e4575f80fd5b8135612480816127c7565b5f805f60608486031215612801575f80fd5b61280a8461244c565b92506128186020850161244c565b91506128266040850161244c565b90509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6020828403121561286c575f80fd5b5051919050565b5f5b8381101561288d578181015183820152602001612875565b50505f910152565b5f81518084526128ac816020860160208601612873565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b6001600160a01b038416815263ffffffff83166020820152606060408201525f61290b6060830184612895565b95945050505050565b84815283602082015263ffffffff83166040820152608060608201525f61293e6080830184612895565b9695505050505050565b5f60208284031215612958575f80fd5b8151612480816127c7565b5f8251612974818460208701612873565b9190910192915050565b5f6001600160a01b03808816835280871660208401525084604083015283606083015260a060808301526129b560a0830184612895565b979650505050505050565b80820180821115612498577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b6001600160a01b0384168152826020820152606060408201525f61290b6060830184612895565b848152836020820152826040820152608060608201525f61293e608083018461289556fea164736f6c6343000818000a", } // L1CrossDomainMessengerABI is the input ABI used to generate the binding from. @@ -202,6 +202,37 @@ func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactorRaw) Transact(opt return _L1CrossDomainMessenger.Contract.contract.Transact(opts, method, params...) } +// IsL1MessageDropped is a free data retrieval call binding the contract method 0x05804dd7. +// +// Solidity: function __isL1MessageDropped(bytes32 ) view returns(bool) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) IsL1MessageDropped(opts *bind.CallOpts, arg0 [32]byte) (bool, error) { + var out []interface{} + err := _L1CrossDomainMessenger.contract.Call(opts, &out, "__isL1MessageDropped", arg0) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsL1MessageDropped is a free data retrieval call binding the contract method 0x05804dd7. +// +// Solidity: function __isL1MessageDropped(bytes32 ) view returns(bool) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) IsL1MessageDropped(arg0 [32]byte) (bool, error) { + return _L1CrossDomainMessenger.Contract.IsL1MessageDropped(&_L1CrossDomainMessenger.CallOpts, arg0) +} + +// IsL1MessageDropped is a free data retrieval call binding the contract method 0x05804dd7. +// +// Solidity: function __isL1MessageDropped(bytes32 ) view returns(bool) +func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) IsL1MessageDropped(arg0 [32]byte) (bool, error) { + return _L1CrossDomainMessenger.Contract.IsL1MessageDropped(&_L1CrossDomainMessenger.CallOpts, arg0) +} + // Counterpart is a free data retrieval call binding the contract method 0x797594b0. // // Solidity: function counterpart() view returns(address) @@ -295,37 +326,6 @@ func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) FinalizedWit return _L1CrossDomainMessenger.Contract.FinalizedWithdrawals(&_L1CrossDomainMessenger.CallOpts, arg0) } -// IsL1MessageDropped is a free data retrieval call binding the contract method 0xb604bf4c. -// -// Solidity: function isL1MessageDropped(bytes32 ) view returns(bool) -func (_L1CrossDomainMessenger *L1CrossDomainMessengerCaller) IsL1MessageDropped(opts *bind.CallOpts, arg0 [32]byte) (bool, error) { - var out []interface{} - err := _L1CrossDomainMessenger.contract.Call(opts, &out, "isL1MessageDropped", arg0) - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// IsL1MessageDropped is a free data retrieval call binding the contract method 0xb604bf4c. -// -// Solidity: function isL1MessageDropped(bytes32 ) view returns(bool) -func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) IsL1MessageDropped(arg0 [32]byte) (bool, error) { - return _L1CrossDomainMessenger.Contract.IsL1MessageDropped(&_L1CrossDomainMessenger.CallOpts, arg0) -} - -// IsL1MessageDropped is a free data retrieval call binding the contract method 0xb604bf4c. -// -// Solidity: function isL1MessageDropped(bytes32 ) view returns(bool) -func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) IsL1MessageDropped(arg0 [32]byte) (bool, error) { - return _L1CrossDomainMessenger.Contract.IsL1MessageDropped(&_L1CrossDomainMessenger.CallOpts, arg0) -} - // MaxReplayTimes is a free data retrieval call binding the contract method 0x946130d8. // // Solidity: function maxReplayTimes() view returns(uint256) @@ -681,27 +681,6 @@ func (_L1CrossDomainMessenger *L1CrossDomainMessengerCallerSession) XDomainMessa return _L1CrossDomainMessenger.Contract.XDomainMessageSender(&_L1CrossDomainMessenger.CallOpts) } -// DropMessage is a paid mutator transaction binding the contract method 0x29907acd. -// -// Solidity: function dropMessage(address _from, address _to, uint256 _value, uint256 _messageNonce, bytes _message) returns() -func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactor) DropMessage(opts *bind.TransactOpts, _from common.Address, _to common.Address, _value *big.Int, _messageNonce *big.Int, _message []byte) (*types.Transaction, error) { - return _L1CrossDomainMessenger.contract.Transact(opts, "dropMessage", _from, _to, _value, _messageNonce, _message) -} - -// DropMessage is a paid mutator transaction binding the contract method 0x29907acd. -// -// Solidity: function dropMessage(address _from, address _to, uint256 _value, uint256 _messageNonce, bytes _message) returns() -func (_L1CrossDomainMessenger *L1CrossDomainMessengerSession) DropMessage(_from common.Address, _to common.Address, _value *big.Int, _messageNonce *big.Int, _message []byte) (*types.Transaction, error) { - return _L1CrossDomainMessenger.Contract.DropMessage(&_L1CrossDomainMessenger.TransactOpts, _from, _to, _value, _messageNonce, _message) -} - -// DropMessage is a paid mutator transaction binding the contract method 0x29907acd. -// -// Solidity: function dropMessage(address _from, address _to, uint256 _value, uint256 _messageNonce, bytes _message) returns() -func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactorSession) DropMessage(_from common.Address, _to common.Address, _value *big.Int, _messageNonce *big.Int, _message []byte) (*types.Transaction, error) { - return _L1CrossDomainMessenger.Contract.DropMessage(&_L1CrossDomainMessenger.TransactOpts, _from, _to, _value, _messageNonce, _message) -} - // Initialize is a paid mutator transaction binding the contract method 0xc0c53b8b. // // Solidity: function initialize(address _feeVault, address _rollup, address _messageQueue) returns() @@ -954,150 +933,6 @@ func (_L1CrossDomainMessenger *L1CrossDomainMessengerTransactorSession) Receive( return _L1CrossDomainMessenger.Contract.Receive(&_L1CrossDomainMessenger.TransactOpts) } -// L1CrossDomainMessengerDropMessageIterator is returned from FilterDropMessage and is used to iterate over the raw logs and unpacked data for DropMessage events raised by the L1CrossDomainMessenger contract. -type L1CrossDomainMessengerDropMessageIterator struct { - Event *L1CrossDomainMessengerDropMessage // 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 *L1CrossDomainMessengerDropMessageIterator) 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(L1CrossDomainMessengerDropMessage) - 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(L1CrossDomainMessengerDropMessage) - 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 *L1CrossDomainMessengerDropMessageIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *L1CrossDomainMessengerDropMessageIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// L1CrossDomainMessengerDropMessage represents a DropMessage event raised by the L1CrossDomainMessenger contract. -type L1CrossDomainMessengerDropMessage struct { - Nonce *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterDropMessage is a free log retrieval operation binding the contract event 0xbd05aabbf548001ebdd6ac80c02f1cfb3b39165f2fae1d420075f22e781ef63b. -// -// Solidity: event DropMessage(uint256 indexed nonce) -func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) FilterDropMessage(opts *bind.FilterOpts, nonce []*big.Int) (*L1CrossDomainMessengerDropMessageIterator, error) { - - var nonceRule []interface{} - for _, nonceItem := range nonce { - nonceRule = append(nonceRule, nonceItem) - } - - logs, sub, err := _L1CrossDomainMessenger.contract.FilterLogs(opts, "DropMessage", nonceRule) - if err != nil { - return nil, err - } - return &L1CrossDomainMessengerDropMessageIterator{contract: _L1CrossDomainMessenger.contract, event: "DropMessage", logs: logs, sub: sub}, nil -} - -// WatchDropMessage is a free log subscription operation binding the contract event 0xbd05aabbf548001ebdd6ac80c02f1cfb3b39165f2fae1d420075f22e781ef63b. -// -// Solidity: event DropMessage(uint256 indexed nonce) -func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) WatchDropMessage(opts *bind.WatchOpts, sink chan<- *L1CrossDomainMessengerDropMessage, nonce []*big.Int) (event.Subscription, error) { - - var nonceRule []interface{} - for _, nonceItem := range nonce { - nonceRule = append(nonceRule, nonceItem) - } - - logs, sub, err := _L1CrossDomainMessenger.contract.WatchLogs(opts, "DropMessage", nonceRule) - 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(L1CrossDomainMessengerDropMessage) - if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "DropMessage", 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 -} - -// ParseDropMessage is a log parse operation binding the contract event 0xbd05aabbf548001ebdd6ac80c02f1cfb3b39165f2fae1d420075f22e781ef63b. -// -// Solidity: event DropMessage(uint256 indexed nonce) -func (_L1CrossDomainMessenger *L1CrossDomainMessengerFilterer) ParseDropMessage(log types.Log) (*L1CrossDomainMessengerDropMessage, error) { - event := new(L1CrossDomainMessengerDropMessage) - if err := _L1CrossDomainMessenger.contract.UnpackLog(event, "DropMessage", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - // L1CrossDomainMessengerFailedRelayedMessageIterator is returned from FilterFailedRelayedMessage and is used to iterate over the raw logs and unpacked data for FailedRelayedMessage events raised by the L1CrossDomainMessenger contract. type L1CrossDomainMessengerFailedRelayedMessageIterator struct { Event *L1CrossDomainMessengerFailedRelayedMessage // Event containing the contract specifics and raw log diff --git a/bindings/bindings/l1crossdomainmessenger_more.go b/bindings/bindings/l1crossdomainmessenger_more.go index 558c5cf3..2cd2a6c1 100644 --- a/bindings/bindings/l1crossdomainmessenger_more.go +++ b/bindings/bindings/l1crossdomainmessenger_more.go @@ -9,11 +9,11 @@ import ( "morph-l2/bindings/solc" ) -const L1CrossDomainMessengerStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_array(t_uint256)1023_storage\"},{\"astId\":1003,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"_owner\",\"offset\":0,\"slot\":\"51\",\"type\":\"t_address\"},{\"astId\":1004,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"52\",\"type\":\"t_array(t_uint256)1022_storage\"},{\"astId\":1005,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"_paused\",\"offset\":0,\"slot\":\"101\",\"type\":\"t_bool\"},{\"astId\":1006,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"102\",\"type\":\"t_array(t_uint256)1022_storage\"},{\"astId\":1007,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"_status\",\"offset\":0,\"slot\":\"151\",\"type\":\"t_uint256\"},{\"astId\":1008,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"152\",\"type\":\"t_array(t_uint256)1022_storage\"},{\"astId\":1009,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"xDomainMessageSender\",\"offset\":0,\"slot\":\"201\",\"type\":\"t_address\"},{\"astId\":1010,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"counterpart\",\"offset\":0,\"slot\":\"202\",\"type\":\"t_address\"},{\"astId\":1011,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"feeVault\",\"offset\":0,\"slot\":\"203\",\"type\":\"t_address\"},{\"astId\":1012,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"204\",\"type\":\"t_array(t_uint256)1021_storage\"},{\"astId\":1013,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"finalizedWithdrawals\",\"offset\":0,\"slot\":\"250\",\"type\":\"t_mapping(t_bytes32,t_bool)\"},{\"astId\":1014,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"messageSendTimestamp\",\"offset\":0,\"slot\":\"251\",\"type\":\"t_mapping(t_bytes32,t_uint256)\"},{\"astId\":1015,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"isL1MessageDropped\",\"offset\":0,\"slot\":\"252\",\"type\":\"t_mapping(t_bytes32,t_bool)\"},{\"astId\":1016,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"rollup\",\"offset\":0,\"slot\":\"253\",\"type\":\"t_address\"},{\"astId\":1017,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"messageQueue\",\"offset\":0,\"slot\":\"254\",\"type\":\"t_address\"},{\"astId\":1018,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"maxReplayTimes\",\"offset\":0,\"slot\":\"255\",\"type\":\"t_uint256\"},{\"astId\":1019,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"replayStates\",\"offset\":0,\"slot\":\"256\",\"type\":\"t_mapping(t_bytes32,t_struct(ReplayState)1024_storage)\"},{\"astId\":1020,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"prevReplayIndex\",\"offset\":0,\"slot\":\"257\",\"type\":\"t_mapping(t_uint256,t_uint256)\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_uint256)1021_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[46]\",\"numberOfBytes\":\"1472\"},\"t_array(t_uint256)1022_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\"},\"t_array(t_uint256)1023_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[50]\",\"numberOfBytes\":\"1600\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_mapping(t_bytes32,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_bool\"},\"t_mapping(t_bytes32,t_struct(ReplayState)1024_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e struct L1CrossDomainMessenger.ReplayState)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_struct(ReplayState)1024_storage\"},\"t_mapping(t_bytes32,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_uint256\"},\"t_mapping(t_uint256,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_uint256\"},\"t_struct(ReplayState)1024_storage\":{\"encoding\":\"inplace\",\"label\":\"struct L1CrossDomainMessenger.ReplayState\",\"numberOfBytes\":\"32\"},\"t_uint128\":{\"encoding\":\"inplace\",\"label\":\"uint128\",\"numberOfBytes\":\"16\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}" +const L1CrossDomainMessengerStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_array(t_uint256)1023_storage\"},{\"astId\":1003,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"_owner\",\"offset\":0,\"slot\":\"51\",\"type\":\"t_address\"},{\"astId\":1004,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"52\",\"type\":\"t_array(t_uint256)1022_storage\"},{\"astId\":1005,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"_paused\",\"offset\":0,\"slot\":\"101\",\"type\":\"t_bool\"},{\"astId\":1006,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"102\",\"type\":\"t_array(t_uint256)1022_storage\"},{\"astId\":1007,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"_status\",\"offset\":0,\"slot\":\"151\",\"type\":\"t_uint256\"},{\"astId\":1008,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"152\",\"type\":\"t_array(t_uint256)1022_storage\"},{\"astId\":1009,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"xDomainMessageSender\",\"offset\":0,\"slot\":\"201\",\"type\":\"t_address\"},{\"astId\":1010,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"counterpart\",\"offset\":0,\"slot\":\"202\",\"type\":\"t_address\"},{\"astId\":1011,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"feeVault\",\"offset\":0,\"slot\":\"203\",\"type\":\"t_address\"},{\"astId\":1012,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"204\",\"type\":\"t_array(t_uint256)1021_storage\"},{\"astId\":1013,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"finalizedWithdrawals\",\"offset\":0,\"slot\":\"250\",\"type\":\"t_mapping(t_bytes32,t_bool)\"},{\"astId\":1014,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"messageSendTimestamp\",\"offset\":0,\"slot\":\"251\",\"type\":\"t_mapping(t_bytes32,t_uint256)\"},{\"astId\":1015,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"__isL1MessageDropped\",\"offset\":0,\"slot\":\"252\",\"type\":\"t_mapping(t_bytes32,t_bool)\"},{\"astId\":1016,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"rollup\",\"offset\":0,\"slot\":\"253\",\"type\":\"t_address\"},{\"astId\":1017,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"messageQueue\",\"offset\":0,\"slot\":\"254\",\"type\":\"t_address\"},{\"astId\":1018,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"maxReplayTimes\",\"offset\":0,\"slot\":\"255\",\"type\":\"t_uint256\"},{\"astId\":1019,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"replayStates\",\"offset\":0,\"slot\":\"256\",\"type\":\"t_mapping(t_bytes32,t_struct(ReplayState)1024_storage)\"},{\"astId\":1020,\"contract\":\"contracts/l1/L1CrossDomainMessenger.sol:L1CrossDomainMessenger\",\"label\":\"prevReplayIndex\",\"offset\":0,\"slot\":\"257\",\"type\":\"t_mapping(t_uint256,t_uint256)\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_uint256)1021_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[46]\",\"numberOfBytes\":\"1472\"},\"t_array(t_uint256)1022_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\"},\"t_array(t_uint256)1023_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[50]\",\"numberOfBytes\":\"1600\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_mapping(t_bytes32,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_bool\"},\"t_mapping(t_bytes32,t_struct(ReplayState)1024_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e struct L1CrossDomainMessenger.ReplayState)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_struct(ReplayState)1024_storage\"},\"t_mapping(t_bytes32,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_uint256\"},\"t_mapping(t_uint256,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_uint256\"},\"t_struct(ReplayState)1024_storage\":{\"encoding\":\"inplace\",\"label\":\"struct L1CrossDomainMessenger.ReplayState\",\"numberOfBytes\":\"32\"},\"t_uint128\":{\"encoding\":\"inplace\",\"label\":\"uint128\",\"numberOfBytes\":\"16\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}" var L1CrossDomainMessengerStorageLayout = new(solc.StorageLayout) -var L1CrossDomainMessengerDeployedBin = "0x6080604052600436106101a7575f3560e01c806386fa4b73116100e7578063c0c53b8b11610087578063e70fc93b11610062578063e70fc93b14610554578063ea7ec5141461057f578063ecc70428146105ab578063f2fde38b146105bf575f80fd5b8063c0c53b8b146104ea578063cb23bcb514610509578063d87e7df114610535575f80fd5b8063a14238e7116100c2578063a14238e71461045c578063b2267a7b1461048a578063b604bf4c1461049d578063bedb86fb146104cb575f80fd5b806386fa4b73146103f05780638da5cb5b1461040f578063946130d814610439575f80fd5b806355004105116101525780636e296e451161012d5780636e296e4514610305578063715018a614610331578063797594b014610345578063846d4d7a14610371575f80fd5b806355004105146102c85780635c975abb146102db5780635f7b1577146102f2575f80fd5b80633b70c18a116101825780633b70c18a1461022c578063407c19551461027d578063478222c21461029c575f80fd5b806329907acd146101ba5780632a6cccb2146101d9578063340735f7146101f8575f80fd5b366101b6576101b46105de565b005b5f80fd5b3480156101c5575f80fd5b506101b46101d4366004612f3a565b610666565b3480156101e4575f80fd5b506101b46101f3366004612fa7565b610a88565b348015610203575f80fd5b50610217610212366004612fde565b610b83565b60405190151581526020015b60405180910390f35b348015610237575f80fd5b5060fe546102589073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610223565b348015610288575f80fd5b506101b461029736600461301a565b610c4c565b3480156102a7575f80fd5b5060cb546102589073ffffffffffffffffffffffffffffffffffffffff1681565b6101b46102d6366004613031565b610d29565b3480156102e6575f80fd5b5060655460ff16610217565b6101b46103003660046130c8565b61149c565b348015610310575f80fd5b5060c9546102589073ffffffffffffffffffffffffffffffffffffffff1681565b34801561033c575f80fd5b506101b46114f0565b348015610350575f80fd5b5060ca546102589073ffffffffffffffffffffffffffffffffffffffff1681565b34801561037c575f80fd5b506103c761038b36600461301a565b6101006020525f90815260409020546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041682565b604080516fffffffffffffffffffffffffffffffff938416815292909116602083015201610223565b3480156103fb575f80fd5b506101b461040a366004613166565b611501565b34801561041a575f80fd5b5060335473ffffffffffffffffffffffffffffffffffffffff16610258565b348015610444575f80fd5b5061044e60ff5481565b604051908152602001610223565b348015610467575f80fd5b5061021761047636600461301a565b60fa6020525f908152604090205460ff1681565b6101b46104983660046131ef565b611ac8565b3480156104a8575f80fd5b506102176104b736600461301a565b60fc6020525f908152604090205460ff1681565b3480156104d6575f80fd5b506101b46104e5366004613257565b611ae3565b3480156104f5575f80fd5b506101b4610504366004613272565b611b04565b348015610514575f80fd5b5060fd546102589073ffffffffffffffffffffffffffffffffffffffff1681565b348015610540575f80fd5b506101b461054f366004612fa7565b611dd3565b34801561055f575f80fd5b5061044e61056e36600461301a565b60fb6020525f908152604090205481565b34801561058a575f80fd5b5061044e61059936600461301a565b6101016020525f908152604090205481565b3480156105b6575f80fd5b5061044e611efd565b3480156105ca575f80fd5b506101b46105d9366004612fa7565b611f93565b60335473ffffffffffffffffffffffffffffffffffffffff163314610664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b565b61066e612047565b60c95473ffffffffffffffffffffffffffffffffffffffff1661dead146106f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d65737361676520697320616c726561647920696e20657865637574696f6e00604482015260640161065b565b60fe5473ffffffffffffffffffffffffffffffffffffffff165f61071887878787876120b4565b90505f818051906020012090505f60fb5f8381526020019081526020015f2054116107c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f7175657565640000000000000000000000000000000000000000000000000000606482015260840161065b565b5f81815260fc602052604090205460ff161561083d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d65737361676520616c72656164792064726f70706564000000000000000000604482015260640161065b565b5f818152610100602052604081205470010000000000000000000000000000000090046fffffffffffffffffffffffffffffffff169081900361087d5750845b6040517f916524610000000000000000000000000000000000000000000000000000000081526004810182905273ffffffffffffffffffffffffffffffffffffffff8516906391652461906024015f604051808303815f87803b1580156108e2575f80fd5b505af11580156108f4573d5f803e3d5ffd5b5050505f9182525061010160205260409020548015610934577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161087d565b5f82815260fc602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555187917fbd05aabbf548001ebdd6ac80c02f1cfb3b39165f2fae1d420075f22e781ef63b91a260c980547fffffffffffffffffffffffff000000000000000000000000000000000000000016736f297c61b5c92ef107ffd30cd56affe5a273e8411790556040517f14298c5100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8a16906314298c51908990610a2390899060040161331d565b5f604051808303818588803b158015610a3a575f80fd5b505af1158015610a4c573d5f803e3d5ffd5b505060c980547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead179055505050505050505050505050565b610a906105de565b73ffffffffffffffffffffffffffffffffffffffff8116610b0d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6665655661756c742063616e6e6f742062652061646472657373283029000000604482015260640161065b565b60cb805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f4aadc32827849f797733838c61302f7f56d2b6db28caa175eb3f7f8e5aba25f5905f90a35050565b5f84815b6020811015610c40578085901c600116600103610bed57858160208110610bb057610bb061332f565b602002013582604051602001610bd0929190918252602082015260400190565b604051602081830303815290604052805190602001209150610c38565b81868260208110610c0057610c0061332f565b6020020135604051602001610c1f929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b600101610b87565b50909114949350505050565b610c546105de565b5f8111610ce3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f7265706c61792074696d6573206d75737420626520677265617465722074686160448201527f6e20300000000000000000000000000000000000000000000000000000000000606482015260840161065b565b60ff80549082905560408051828152602081018490527fd700562df02eb66951f6f5275df7ebd7c0ec58b3422915789b3b1877aab2e52b91015b60405180910390a15050565b610d31612047565b60c95473ffffffffffffffffffffffffffffffffffffffff1661dead14610db4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d65737361676520697320616c726561647920696e20657865637574696f6e00604482015260640161065b565b60fe5460ca5473ffffffffffffffffffffffffffffffffffffffff91821691165f610de28a8a8a8a8a6120b4565b90505f818051906020012090505f60fb5f8381526020019081526020015f205411610e8f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f7175657565640000000000000000000000000000000000000000000000000000606482015260840161065b565b5f81815260fc602052604090205460ff1615610f07576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d65737361676520616c72656164792064726f70706564000000000000000000604482015260640161065b565b6040517f3e4cbbe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c8116600483015263ffffffff881660248301525f9190861690633e4cbbe690604401602060405180830381865afa158015610f80573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610fa4919061335c565b905080341015611010576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f496e73756666696369656e74206d73672e76616c756520666f72206665650000604482015260640161065b565b80156110df5760cb546040515f9173ffffffffffffffffffffffffffffffffffffffff169083908381818185875af1925050503d805f811461106d576040519150601f19603f3d011682016040523d82523d5f602084013e611072565b606091505b50509050806110dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4661696c656420746f2064656475637420746865206665650000000000000000604482015260640161065b565b505b5f8573ffffffffffffffffffffffffffffffffffffffff1663fd0ad31e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015611129573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061114d919061335c565b6040517f9b15978200000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff871690639b159782906111a69088908c908990600401613373565b5f604051808303815f87803b1580156111bd575f80fd5b505af11580156111cf573d5f803e3d5ffd5b5050505f848152610100602090815260408083208151808301909252546fffffffffffffffffffffffffffffffff8082168352700100000000000000000000000000000000909104169181018290529250900361123f575f8281526101016020526040902060018c019055611270565b80602001516001016fffffffffffffffffffffffffffffffff166101015f8481526020019081526020015f20819055505b6fffffffffffffffffffffffffffffffff808316602083015260ff548251909116106112f8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f457863656564206d6178696d756d207265706c61792074696d65730000000000604482015260640161065b565b80516fffffffffffffffffffffffffffffffff600191909101811682525f8581526101006020908152604090912083519190930151821670010000000000000000000000000000000002911617905573ffffffffffffffffffffffffffffffffffffffff8c166113653390565b73ffffffffffffffffffffffffffffffffffffffff168b7fa3a1251805b1fc7915884575b42e1fb862e814f0f5c9d670d08bf84697053d618e858d8f6040516113b194939291906133b6565b60405180910390a43482810390831461148c575f8873ffffffffffffffffffffffffffffffffffffffff16826040515f6040518083038185875af1925050503d805f811461141a576040519150601f19603f3d011682016040523d82523d5f602084013e61141f565b606091505b505090508061148a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4661696c656420746f20726566756e6420746865206665650000000000000000604482015260640161065b565b505b5050505050505050505050505050565b6114a4612047565b6114e8868686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508892508791506121509050565b505050505050565b6114f86105de565b6106645f61266c565b611509612047565b60c95473ffffffffffffffffffffffffffffffffffffffff1661dead1461158c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d65737361676520697320616c726561647920696e20657865637574696f6e00604482015260640161065b565b60fe5473ffffffffffffffffffffffffffffffffffffffff90811690871603611637576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d657373656e6765723a20466f7262696420746f2063616c6c206d657373616760448201527f6520717565756500000000000000000000000000000000000000000000000000606482015260840161065b565b611640866126e2565b60c95473ffffffffffffffffffffffffffffffffffffffff908116908816036116eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4d657373656e6765723a20496e76616c6964206d6573736167652073656e646560448201527f7200000000000000000000000000000000000000000000000000000000000000606482015260840161065b565b5f6116f988888888886120b4565b80516020918201205f81815260fa90925260409091205490915060ff16156117a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4d657373656e6765723a207769746864726177616c2068617320616c7265616460448201527f79206265656e2066696e616c697a656400000000000000000000000000000000606482015260840161065b565b60fd546040517f04d772150000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff909116905f9082906304d7721590602401602060405180830381865afa158015611814573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061183891906133ea565b9050806118c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d657373656e6765723a207769746864726177616c526f6f74206e6f7420666960448201527f6e616c697a656400000000000000000000000000000000000000000000000000606482015260840161065b565b6118d383868987610b83565b61195f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4d657373656e6765723a20696e76616c6964207769746864726177616c20696e60448201527f636c7573696f6e2070726f6f6600000000000000000000000000000000000000606482015260840161065b565b5060c980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8b8116919091179091556040515f918a169089906119ba908990613405565b5f6040518083038185875af1925050503d805f81146119f4576040519150601f19603f3d011682016040523d82523d5f602084013e6119f9565b606091505b505060c980547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905590508015611a91575f83815260fa602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555184917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611abc565b60405183907f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f905f90a25b50505050505050505050565b611ad0612047565b611add8484848433612150565b50505050565b611aeb6105de565b8015611afc57611af9612761565b50565b611af96127e6565b5f54610100900460ff1615808015611b2257505f54600160ff909116105b80611b3b5750303b158015611b3b57505f5460ff166001145b611bc7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161065b565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611c23575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff83161580611c5a575073ffffffffffffffffffffffffffffffffffffffff8216155b80611c79575073ffffffffffffffffffffffffffffffffffffffff8416155b15611cb0576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611cce7353000000000000000000000000000000000000078561283d565b60fd805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fe805492851692909116919091179055600360ff8190556040517fd700562df02eb66951f6f5275df7ebd7c0ec58b3422915789b3b1877aab2e52b91611d64915f9190918252602082015260400190565b60405180910390a18015611add575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b611ddb6105de565b73ffffffffffffffffffffffffffffffffffffffff8116611e7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f726f6c6c757020616464726573732063616e6e6f74206265206164647265737360448201527f2830290000000000000000000000000000000000000000000000000000000000606482015260840161065b565b60fd805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f5272c8ad4bd643b1130291ea29bebd9b3bc583057a6e4d047eb7077039a956309101610d1d565b60fe54604080517ffd0ad31e00000000000000000000000000000000000000000000000000000000815290515f9273ffffffffffffffffffffffffffffffffffffffff169163fd0ad31e9160048083019260209291908290030181865afa158015611f6a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611f8e919061335c565b905090565b611f9b6105de565b73ffffffffffffffffffffffffffffffffffffffff811661203e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161065b565b611af98161266c565b60655460ff1615610664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a2070617573656400000000000000000000000000000000604482015260640161065b565b606085858585856040516024016120cf959493929190613420565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8ef1332e00000000000000000000000000000000000000000000000000000000179052905095945050505050565b612158612989565b60fe5460ca54604080517ffd0ad31e000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff93841693909216915f91849163fd0ad31e916004808201926020929091908290030181865afa1580156121d1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121f5919061335c565b90505f612205338a8a858b6120b4565b90505f73ffffffffffffffffffffffffffffffffffffffff8516633e4cbbe6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018a9052604401602060405180830381865afa158015612293573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122b7919061335c565b90506122c3898261346f565b34101561232c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e73756666696369656e74206d73672e76616c756500000000000000000000604482015260640161065b565b80156123fb5760cb546040515f9173ffffffffffffffffffffffffffffffffffffffff169083908381818185875af1925050503d805f8114612389576040519150601f19603f3d011682016040523d82523d5f602084013e61238e565b606091505b50509050806123f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4661696c656420746f2064656475637420746865206665650000000000000000604482015260640161065b565b505b6040517f9b15978200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861690639b159782906124519087908b9087906004016134a7565b5f604051808303815f87803b158015612468575f80fd5b505af115801561247a573d5f803e3d5ffd5b505050505f8280519060200120905060fb5f8281526020019081526020015f20545f14612503576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4475706c696361746564206d6573736167650000000000000000000000000000604482015260640161065b565b5f81815260fb6020526040902042905573ffffffffffffffffffffffffffffffffffffffff8b163373ffffffffffffffffffffffffffffffffffffffff167f104371f3b442861a2a7b82a070afbbaab748bb13757bf47769e170e37809ec1e8c878c8e60405161257694939291906134db565b60405180910390a3348290038a8103908b14612654575f8873ffffffffffffffffffffffffffffffffffffffff16826040515f6040518083038185875af1925050503d805f81146125e2576040519150601f19603f3d011682016040523d82523d5f602084013e6125e7565b606091505b5050905080612652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4661696c656420746f20726566756e6420746865206665650000000000000000604482015260640161065b565b505b505050505050506126656001609755565b5050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b3073ffffffffffffffffffffffffffffffffffffffff821603611af9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4d657373656e6765723a20466f7262696420746f2063616c6c2073656c660000604482015260640161065b565b612769612047565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586127bc3390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6127ee612a03565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336127bc565b5f54610100900460ff166128d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161065b565b6128db612a6f565b6128e3612b0d565b6128eb612bab565b60c980547fffffffffffffffffffffffff000000000000000000000000000000000000000090811661dead1790915560ca805473ffffffffffffffffffffffffffffffffffffffff858116919093161790558116156129855760cb80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b5050565b6002609754036129f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161065b565b6002609755565b6001609755565b60655460ff16610664576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f7420706175736564000000000000000000000000604482015260640161065b565b5f54610100900460ff16612b05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161065b565b610664612c49565b5f54610100900460ff16612ba3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161065b565b610664612ce8565b5f54610100900460ff16612c41576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161065b565b610664612da8565b5f54610100900460ff16612cdf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161065b565b6106643361266c565b5f54610100900460ff16612d7e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161065b565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b5f54610100900460ff166129fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161065b565b803573ffffffffffffffffffffffffffffffffffffffff81168114612e61575f80fd5b919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112612ea2575f80fd5b813567ffffffffffffffff80821115612ebd57612ebd612e66565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715612f0357612f03612e66565b81604052838152866020858801011115612f1b575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f60a08688031215612f4e575f80fd5b612f5786612e3e565b9450612f6560208701612e3e565b93506040860135925060608601359150608086013567ffffffffffffffff811115612f8e575f80fd5b612f9a88828901612e93565b9150509295509295909350565b5f60208284031215612fb7575f80fd5b612fc082612e3e565b9392505050565b806104008101831015612fd8575f80fd5b92915050565b5f805f806104608587031215612ff2575f80fd5b843593506130038660208701612fc7565b939693955050505061042082013591610440013590565b5f6020828403121561302a575f80fd5b5035919050565b5f805f805f805f60e0888a031215613047575f80fd5b61305088612e3e565b965061305e60208901612e3e565b95506040880135945060608801359350608088013567ffffffffffffffff811115613087575f80fd5b6130938a828b01612e93565b93505060a088013563ffffffff811681146130ac575f80fd5b91506130ba60c08901612e3e565b905092959891949750929550565b5f805f805f8060a087890312156130dd575f80fd5b6130e687612e3e565b955060208701359450604087013567ffffffffffffffff80821115613109575f80fd5b818901915089601f83011261311c575f80fd5b81358181111561312a575f80fd5b8a602082850101111561313b575f80fd5b6020830196508095505050506060870135915061315a60808801612e3e565b90509295509295509295565b5f805f805f805f6104c0888a03121561317d575f80fd5b61318688612e3e565b965061319460208901612e3e565b95506040880135945060608801359350608088013567ffffffffffffffff8111156131bd575f80fd5b6131c98a828b01612e93565b9350506131d98960a08a01612fc7565b91506104a0880135905092959891949750929550565b5f805f8060808587031215613202575f80fd5b61320b85612e3e565b935060208501359250604085013567ffffffffffffffff81111561322d575f80fd5b61323987828801612e93565b949793965093946060013593505050565b8015158114611af9575f80fd5b5f60208284031215613267575f80fd5b8135612fc08161324a565b5f805f60608486031215613284575f80fd5b61328d84612e3e565b925061329b60208501612e3e565b91506132a960408501612e3e565b90509250925092565b5f5b838110156132cc5781810151838201526020016132b4565b50505f910152565b5f81518084526132eb8160208601602086016132b2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f612fc060208301846132d4565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f6020828403121561336c575f80fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff8416815263ffffffff83166020820152606060408201525f6133ad60608301846132d4565b95945050505050565b84815283602082015263ffffffff83166040820152608060608201525f6133e060808301846132d4565b9695505050505050565b5f602082840312156133fa575f80fd5b8151612fc08161324a565b5f82516134168184602087016132b2565b9190910192915050565b5f73ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a0608083015261346460a08301846132d4565b979650505050505050565b80820180821115612fd8577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f6133ad60608301846132d4565b848152836020820152826040820152608060608201525f6133e060808301846132d456fea164736f6c6343000818000a" +var L1CrossDomainMessengerDeployedBin = "0x60806040526004361061019c575f3560e01c806386fa4b73116100dc578063c0c53b8b11610087578063e70fc93b11610062578063e70fc93b1461052a578063ea7ec51414610555578063ecc7042814610581578063f2fde38b14610595575f80fd5b8063c0c53b8b146104c0578063cb23bcb5146104df578063d87e7df11461050b575f80fd5b8063a14238e7116100b7578063a14238e714610460578063b2267a7b1461048e578063bedb86fb146104a1575f80fd5b806386fa4b73146103f45780638da5cb5b14610413578063946130d81461043d575f80fd5b806355004105116101475780636e296e45116101225780636e296e4514610309578063715018a614610335578063797594b014610349578063846d4d7a14610375575f80fd5b806355004105146102cc5780635c975abb146102df5780635f7b1577146102f6575f80fd5b80633b70c18a116101775780633b70c18a14610230578063407c195514610281578063478222c2146102a0575f80fd5b806305804dd7146101af5780632a6cccb2146101f2578063340735f714610211575f80fd5b366101ab576101a96105b4565b005b5f80fd5b3480156101ba575f80fd5b506101dd6101c93660046129f2565b60fc6020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b3480156101fd575f80fd5b506101a961020c366004612a31565b61063c565b34801561021c575f80fd5b506101dd61022b366004612a68565b610737565b34801561023b575f80fd5b5060fe5461025c9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101e9565b34801561028c575f80fd5b506101a961029b3660046129f2565b610800565b3480156102ab575f80fd5b5060cb5461025c9073ffffffffffffffffffffffffffffffffffffffff1681565b6101a96102da366004612b78565b6108dd565b3480156102ea575f80fd5b5060655460ff166101dd565b6101a9610304366004612c0f565b611050565b348015610314575f80fd5b5060c95461025c9073ffffffffffffffffffffffffffffffffffffffff1681565b348015610340575f80fd5b506101a96110a4565b348015610354575f80fd5b5060ca5461025c9073ffffffffffffffffffffffffffffffffffffffff1681565b348015610380575f80fd5b506103cb61038f3660046129f2565b6101006020525f90815260409020546fffffffffffffffffffffffffffffffff8082169170010000000000000000000000000000000090041682565b604080516fffffffffffffffffffffffffffffffff9384168152929091166020830152016101e9565b3480156103ff575f80fd5b506101a961040e366004612cad565b6110b5565b34801561041e575f80fd5b5060335473ffffffffffffffffffffffffffffffffffffffff1661025c565b348015610448575f80fd5b5061045260ff5481565b6040519081526020016101e9565b34801561046b575f80fd5b506101dd61047a3660046129f2565b60fa6020525f908152604090205460ff1681565b6101a961049c366004612d36565b61167c565b3480156104ac575f80fd5b506101a96104bb366004612d9e565b611697565b3480156104cb575f80fd5b506101a96104da366004612db9565b6116b8565b3480156104ea575f80fd5b5060fd5461025c9073ffffffffffffffffffffffffffffffffffffffff1681565b348015610516575f80fd5b506101a9610525366004612a31565b611987565b348015610535575f80fd5b506104526105443660046129f2565b60fb6020525f908152604090205481565b348015610560575f80fd5b5061045261056f3660046129f2565b6101016020525f908152604090205481565b34801561058c575f80fd5b50610452611ab1565b3480156105a0575f80fd5b506101a96105af366004612a31565b611b47565b60335473ffffffffffffffffffffffffffffffffffffffff16331461063a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064015b60405180910390fd5b565b6106446105b4565b73ffffffffffffffffffffffffffffffffffffffff81166106c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6665655661756c742063616e6e6f7420626520616464726573732830290000006044820152606401610631565b60cb805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f4aadc32827849f797733838c61302f7f56d2b6db28caa175eb3f7f8e5aba25f5905f90a35050565b5f84815b60208110156107f4578085901c6001166001036107a15785816020811061076457610764612df9565b602002013582604051602001610784929190918252602082015260400190565b6040516020818303038152906040528051906020012091506107ec565b818682602081106107b4576107b4612df9565b60200201356040516020016107d3929190918252602082015260400190565b6040516020818303038152906040528051906020012091505b60010161073b565b50909114949350505050565b6108086105b4565b5f8111610897576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f7265706c61792074696d6573206d75737420626520677265617465722074686160448201527f6e203000000000000000000000000000000000000000000000000000000000006064820152608401610631565b60ff80549082905560408051828152602081018490527fd700562df02eb66951f6f5275df7ebd7c0ec58b3422915789b3b1877aab2e52b91015b60405180910390a15050565b6108e5611bfb565b60c95473ffffffffffffffffffffffffffffffffffffffff1661dead14610968576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d65737361676520697320616c726561647920696e20657865637574696f6e006044820152606401610631565b60fe5460ca5473ffffffffffffffffffffffffffffffffffffffff91821691165f6109968a8a8a8a8a611c68565b90505f818051906020012090505f60fb5f8381526020019081526020015f205411610a43576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f50726f7669646564206d65737361676520686173206e6f74206265656e20656e60448201527f71756575656400000000000000000000000000000000000000000000000000006064820152608401610631565b5f81815260fc602052604090205460ff1615610abb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f4d65737361676520616c72656164792064726f707065640000000000000000006044820152606401610631565b6040517f3e4cbbe600000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8c8116600483015263ffffffff881660248301525f9190861690633e4cbbe690604401602060405180830381865afa158015610b34573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610b589190612e26565b905080341015610bc4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f496e73756666696369656e74206d73672e76616c756520666f722066656500006044820152606401610631565b8015610c935760cb546040515f9173ffffffffffffffffffffffffffffffffffffffff169083908381818185875af1925050503d805f8114610c21576040519150601f19603f3d011682016040523d82523d5f602084013e610c26565b606091505b5050905080610c91576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4661696c656420746f20646564756374207468652066656500000000000000006044820152606401610631565b505b5f8573ffffffffffffffffffffffffffffffffffffffff1663fd0ad31e6040518163ffffffff1660e01b8152600401602060405180830381865afa158015610cdd573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610d019190612e26565b6040517f9b15978200000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff871690639b15978290610d5a9088908c908990600401612ea8565b5f604051808303815f87803b158015610d71575f80fd5b505af1158015610d83573d5f803e3d5ffd5b5050505f848152610100602090815260408083208151808301909252546fffffffffffffffffffffffffffffffff80821683527001000000000000000000000000000000009091041691810182905292509003610df3575f8281526101016020526040902060018c019055610e24565b80602001516001016fffffffffffffffffffffffffffffffff166101015f8481526020019081526020015f20819055505b6fffffffffffffffffffffffffffffffff808316602083015260ff54825190911610610eac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f457863656564206d6178696d756d207265706c61792074696d657300000000006044820152606401610631565b80516fffffffffffffffffffffffffffffffff600191909101811682525f8581526101006020908152604090912083519190930151821670010000000000000000000000000000000002911617905573ffffffffffffffffffffffffffffffffffffffff8c16610f193390565b73ffffffffffffffffffffffffffffffffffffffff168b7fa3a1251805b1fc7915884575b42e1fb862e814f0f5c9d670d08bf84697053d618e858d8f604051610f659493929190612eeb565b60405180910390a434828103908314611040575f8873ffffffffffffffffffffffffffffffffffffffff16826040515f6040518083038185875af1925050503d805f8114610fce576040519150601f19603f3d011682016040523d82523d5f602084013e610fd3565b606091505b505090508061103e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4661696c656420746f20726566756e64207468652066656500000000000000006044820152606401610631565b505b5050505050505050505050505050565b611058611bfb565b61109c868686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250889250879150611d049050565b505050505050565b6110ac6105b4565b61063a5f612220565b6110bd611bfb565b60c95473ffffffffffffffffffffffffffffffffffffffff1661dead14611140576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4d65737361676520697320616c726561647920696e20657865637574696f6e006044820152606401610631565b60fe5473ffffffffffffffffffffffffffffffffffffffff908116908716036111eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d657373656e6765723a20466f7262696420746f2063616c6c206d657373616760448201527f65207175657565000000000000000000000000000000000000000000000000006064820152608401610631565b6111f486612296565b60c95473ffffffffffffffffffffffffffffffffffffffff9081169088160361129f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f4d657373656e6765723a20496e76616c6964206d6573736167652073656e646560448201527f72000000000000000000000000000000000000000000000000000000000000006064820152608401610631565b5f6112ad8888888888611c68565b80516020918201205f81815260fa90925260409091205490915060ff1615611357576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4d657373656e6765723a207769746864726177616c2068617320616c7265616460448201527f79206265656e2066696e616c697a6564000000000000000000000000000000006064820152608401610631565b60fd546040517f04d772150000000000000000000000000000000000000000000000000000000081526004810184905273ffffffffffffffffffffffffffffffffffffffff909116905f9082906304d7721590602401602060405180830381865afa1580156113c8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113ec9190612f1f565b90508061147b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4d657373656e6765723a207769746864726177616c526f6f74206e6f7420666960448201527f6e616c697a6564000000000000000000000000000000000000000000000000006064820152608401610631565b61148783868987610737565b611513576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f4d657373656e6765723a20696e76616c6964207769746864726177616c20696e60448201527f636c7573696f6e2070726f6f66000000000000000000000000000000000000006064820152608401610631565b5060c980547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8b8116919091179091556040515f918a1690899061156e908990612f3a565b5f6040518083038185875af1925050503d805f81146115a8576040519150601f19603f3d011682016040523d82523d5f602084013e6115ad565b606091505b505060c980547fffffffffffffffffffffffff00000000000000000000000000000000000000001661dead17905590508015611645575f83815260fa602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790555184917f4641df4a962071e12719d8c8c8e5ac7fc4d97b927346a3d7a335b1f7517e133c91a2611670565b60405183907f99d0e048484baa1b1540b1367cb128acd7ab2946d1ed91ec10e3c85e4bf51b8f905f90a25b50505050505050505050565b611684611bfb565b6116918484848433611d04565b50505050565b61169f6105b4565b80156116b0576116ad612315565b50565b6116ad61239a565b5f54610100900460ff16158080156116d657505f54600160ff909116105b806116ef5750303b1580156116ef57505f5460ff166001145b61177b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610631565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156117d7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff8316158061180e575073ffffffffffffffffffffffffffffffffffffffff8216155b8061182d575073ffffffffffffffffffffffffffffffffffffffff8416155b15611864576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611882735300000000000000000000000000000000000007856123f1565b60fd805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560fe805492851692909116919091179055600360ff8190556040517fd700562df02eb66951f6f5275df7ebd7c0ec58b3422915789b3b1877aab2e52b91611918915f9190918252602082015260400190565b60405180910390a18015611691575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b61198f6105b4565b73ffffffffffffffffffffffffffffffffffffffff8116611a32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f726f6c6c757020616464726573732063616e6e6f74206265206164647265737360448201527f28302900000000000000000000000000000000000000000000000000000000006064820152608401610631565b60fd805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff000000000000000000000000000000000000000083168117909355604080519190921680825260208201939093527f5272c8ad4bd643b1130291ea29bebd9b3bc583057a6e4d047eb7077039a9563091016108d1565b60fe54604080517ffd0ad31e00000000000000000000000000000000000000000000000000000000815290515f9273ffffffffffffffffffffffffffffffffffffffff169163fd0ad31e9160048083019260209291908290030181865afa158015611b1e573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b429190612e26565b905090565b611b4f6105b4565b73ffffffffffffffffffffffffffffffffffffffff8116611bf2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610631565b6116ad81612220565b60655460ff161561063a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610631565b60608585858585604051602401611c83959493929190612f55565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8ef1332e00000000000000000000000000000000000000000000000000000000179052905095945050505050565b611d0c61253d565b60fe5460ca54604080517ffd0ad31e000000000000000000000000000000000000000000000000000000008152905173ffffffffffffffffffffffffffffffffffffffff93841693909216915f91849163fd0ad31e916004808201926020929091908290030181865afa158015611d85573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611da99190612e26565b90505f611db9338a8a858b611c68565b90505f73ffffffffffffffffffffffffffffffffffffffff8516633e4cbbe6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018a9052604401602060405180830381865afa158015611e47573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e6b9190612e26565b9050611e778982612fa4565b341015611ee0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f496e73756666696369656e74206d73672e76616c7565000000000000000000006044820152606401610631565b8015611faf5760cb546040515f9173ffffffffffffffffffffffffffffffffffffffff169083908381818185875af1925050503d805f8114611f3d576040519150601f19603f3d011682016040523d82523d5f602084013e611f42565b606091505b5050905080611fad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4661696c656420746f20646564756374207468652066656500000000000000006044820152606401610631565b505b6040517f9b15978200000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff861690639b159782906120059087908b908790600401612fdc565b5f604051808303815f87803b15801561201c575f80fd5b505af115801561202e573d5f803e3d5ffd5b505050505f8280519060200120905060fb5f8281526020019081526020015f20545f146120b7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f4475706c696361746564206d65737361676500000000000000000000000000006044820152606401610631565b5f81815260fb6020526040902042905573ffffffffffffffffffffffffffffffffffffffff8b163373ffffffffffffffffffffffffffffffffffffffff167f104371f3b442861a2a7b82a070afbbaab748bb13757bf47769e170e37809ec1e8c878c8e60405161212a9493929190613010565b60405180910390a3348290038a8103908b14612208575f8873ffffffffffffffffffffffffffffffffffffffff16826040515f6040518083038185875af1925050503d805f8114612196576040519150601f19603f3d011682016040523d82523d5f602084013e61219b565b606091505b5050905080612206576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f4661696c656420746f20726566756e64207468652066656500000000000000006044820152606401610631565b505b505050505050506122196001609755565b5050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b3073ffffffffffffffffffffffffffffffffffffffff8216036116ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f4d657373656e6765723a20466f7262696420746f2063616c6c2073656c6600006044820152606401610631565b61231d611bfb565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586123703390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b6123a26125b7565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33612370565b5f54610100900460ff16612487576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610631565b61248f612623565b6124976126c1565b61249f61275f565b60c980547fffffffffffffffffffffffff000000000000000000000000000000000000000090811661dead1790915560ca805473ffffffffffffffffffffffffffffffffffffffff858116919093161790558116156125395760cb80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790555b5050565b6002609754036125a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610631565b6002609755565b6001609755565b60655460ff1661063a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610631565b5f54610100900460ff166126b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610631565b61063a6127fd565b5f54610100900460ff16612757576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610631565b61063a61289c565b5f54610100900460ff166127f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610631565b61063a61295c565b5f54610100900460ff16612893576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610631565b61063a33612220565b5f54610100900460ff16612932576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610631565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b5f54610100900460ff166125b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610631565b5f60208284031215612a02575f80fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114612a2c575f80fd5b919050565b5f60208284031215612a41575f80fd5b612a4a82612a09565b9392505050565b806104008101831015612a62575f80fd5b92915050565b5f805f806104608587031215612a7c575f80fd5b84359350612a8d8660208701612a51565b939693955050505061042082013591610440013590565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112612ae0575f80fd5b813567ffffffffffffffff80821115612afb57612afb612aa4565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715612b4157612b41612aa4565b81604052838152866020858801011115612b59575f80fd5b836020870160208301375f602085830101528094505050505092915050565b5f805f805f805f60e0888a031215612b8e575f80fd5b612b9788612a09565b9650612ba560208901612a09565b95506040880135945060608801359350608088013567ffffffffffffffff811115612bce575f80fd5b612bda8a828b01612ad1565b93505060a088013563ffffffff81168114612bf3575f80fd5b9150612c0160c08901612a09565b905092959891949750929550565b5f805f805f8060a08789031215612c24575f80fd5b612c2d87612a09565b955060208701359450604087013567ffffffffffffffff80821115612c50575f80fd5b818901915089601f830112612c63575f80fd5b813581811115612c71575f80fd5b8a6020828501011115612c82575f80fd5b60208301965080955050505060608701359150612ca160808801612a09565b90509295509295509295565b5f805f805f805f6104c0888a031215612cc4575f80fd5b612ccd88612a09565b9650612cdb60208901612a09565b95506040880135945060608801359350608088013567ffffffffffffffff811115612d04575f80fd5b612d108a828b01612ad1565b935050612d208960a08a01612a51565b91506104a0880135905092959891949750929550565b5f805f8060808587031215612d49575f80fd5b612d5285612a09565b935060208501359250604085013567ffffffffffffffff811115612d74575f80fd5b612d8087828801612ad1565b949793965093946060013593505050565b80151581146116ad575f80fd5b5f60208284031215612dae575f80fd5b8135612a4a81612d91565b5f805f60608486031215612dcb575f80fd5b612dd484612a09565b9250612de260208501612a09565b9150612df060408501612a09565b90509250925092565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215612e36575f80fd5b5051919050565b5f5b83811015612e57578181015183820152602001612e3f565b50505f910152565b5f8151808452612e76816020860160208601612e3d565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff8416815263ffffffff83166020820152606060408201525f612ee26060830184612e5f565b95945050505050565b84815283602082015263ffffffff83166040820152608060608201525f612f156080830184612e5f565b9695505050505050565b5f60208284031215612f2f575f80fd5b8151612a4a81612d91565b5f8251612f4b818460208701612e3d565b9190910192915050565b5f73ffffffffffffffffffffffffffffffffffffffff808816835280871660208401525084604083015283606083015260a06080830152612f9960a0830184612e5f565b979650505050505050565b80820180821115612a62577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f612ee26060830184612e5f565b848152836020820152826040820152608060608201525f612f156080830184612e5f56fea164736f6c6343000818000a" func init() { if err := json.Unmarshal([]byte(L1CrossDomainMessengerStorageLayoutJSON), L1CrossDomainMessengerStorageLayout); err != nil { diff --git a/bindings/bindings/l1lidogateway.go b/bindings/bindings/l1lidogateway.go index 70d975c8..70c4caf6 100644 --- a/bindings/bindings/l1lidogateway.go +++ b/bindings/bindings/l1lidogateway.go @@ -31,8 +31,8 @@ var ( // L1LidoGatewayMetaData contains all meta data concerning the L1LidoGateway contract. var L1LidoGatewayMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1Token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_l2Token\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"DepositAndCallIsNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorAccountIsZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorCallerIsNotDepositsDisabler\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorCallerIsNotDepositsEnabler\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorCallerIsNotWithdrawalsDisabler\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorCallerIsNotWithdrawalsEnabler\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorDepositZeroAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorDepositsDisabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorDepositsEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorNonZeroMsgValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorUnsupportedL1Token\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorUnsupportedL2Token\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorWithdrawalsDisabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorWithdrawalsEnabled\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"l1Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"l2Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"name\":\"DepositERC20\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"disabler\",\"type\":\"address\"}],\"name\":\"DepositsDisabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"enabler\",\"type\":\"address\"}],\"name\":\"DepositsEnabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"l1Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"l2Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"FinalizeWithdrawERC20\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"RefundERC20\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"disabler\",\"type\":\"address\"}],\"name\":\"WithdrawalsDisabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"enabler\",\"type\":\"address\"}],\"name\":\"WithdrawalsEnabled\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEPOSITS_DISABLER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEPOSITS_ENABLER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WITHDRAWALS_DISABLER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WITHDRAWALS_ENABLER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"counterpart\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"}],\"name\":\"depositERC20\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"}],\"name\":\"depositERC20\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"}],\"name\":\"depositERC20AndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"disableDeposits\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"disableWithdrawals\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enableDeposits\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enableWithdrawals\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1Token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_l2Token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"finalizeWithdrawERC20\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1Token\",\"type\":\"address\"}],\"name\":\"getL2ERC20Address\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_role\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getRoleMember\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_role\",\"type\":\"bytes32\"}],\"name\":\"getRoleMemberCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_counterpart\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_messenger\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_depositsEnabler\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_depositsDisabler\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_withdrawalsEnabler\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_withdrawalsDisabler\",\"type\":\"address\"}],\"name\":\"initializeV2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isDepositsEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isWithdrawalsEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1Token\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2Token\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messenger\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"}],\"name\":\"onDropMessage\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"router\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x60c060405234801562000010575f80fd5b5060405162003368380380620033688339810160408190526200003391620001dc565b6001600160a01b03808316608081905290821660a0526200009b5760405162461bcd60e51b815260206004820152601460248201527f7a65726f206c31746f6b656e206164647265737300000000000000000000000060448201526064015b60405180910390fd5b6001600160a01b038116620000f35760405162461bcd60e51b815260206004820152601460248201527f7a65726f206c32546f6b656e2061646472657373000000000000000000000000604482015260640162000092565b620000fd62000105565b505062000212565b5f54610100900460ff16156200016e5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840162000092565b5f5460ff90811614620001be575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b80516001600160a01b0381168114620001d7575f80fd5b919050565b5f8060408385031215620001ee575f80fd5b620001f983620001c0565b91506200020960208401620001c0565b90509250929050565b60805160a0516130fc6200026c5f395f818161027b015281816110880152818161155a015281816117030152611ad401525f818161047c0152818161101c015281816113cb015281816117dc0152611a6801526130fc5ff3fe6080604052600436106101d0575f3560e01c80639010d07c116100fd578063d547741f11610092578063f27ebced11610062578063f27ebced14610574578063f2fde38b14610593578063f887ea40146105b2578063fadcc54a146105d1575f80fd5b8063d547741f146104fb578063e3b523e31461051a578063e8bac93b1461054d578063f219fa6614610561575f80fd5b8063c01e1bd6116100cd578063c01e1bd61461046b578063c0c53b8b1461049e578063c676ad29146104bd578063ca15c873146104dc575f80fd5b80639010d07c1461040557806391d1485414610424578063ac67e1af14610443578063ad960ce114610457575f80fd5b80635e4c57a411610173578063797594b011610143578063797594b01461038357806384bd13b0146103a25780638d7601c0146103b55780638da5cb5b146103e8575f80fd5b80635e4c57a4146102df5780635ed2c220146102f35780636f18bd221461032e578063715018a61461036f575f80fd5b80632f2ff15d116101ae5780632f2ff15d1461020f5780633cb747bf1461022e57806356eff2671461026a5780635777bf501461029d575f80fd5b80630aea8c26146101d457806314298c51146101e957806321425ee0146101fc575b5f80fd5b6101e76101e23660046129e2565b610604565b005b6101e76101f7366004612a96565b610618565b6101e761020a366004612ad5565b61089d565b34801561021a575f80fd5b506101e7610229366004612b07565b6108d6565b348015610239575f80fd5b5060995461024d906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610275575f80fd5b5061024d7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102a8575f80fd5b507fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff165b6040519015158152602001610261565b3480156102ea575f80fd5b506101e76108ec565b3480156102fe575f80fd5b507fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff166102cf565b348015610339575f80fd5b506103617f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d681565b604051908152602001610261565b34801561037a575f80fd5b506101e7610a1e565b34801561038e575f80fd5b5060975461024d906001600160a01b031681565b6101e76103b0366004612b35565b610a31565b3480156103c0575f80fd5b506103617f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c81565b3480156103f3575f80fd5b506065546001600160a01b031661024d565b348015610410575f80fd5b5061024d61041f366004612bc7565b610c21565b34801561042f575f80fd5b506102cf61043e366004612b07565b610c60565b34801561044e575f80fd5b506101e7610c96565b348015610462575f80fd5b506101e7610dc4565b348015610476575f80fd5b5061024d7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104a9575f80fd5b506101e76104b8366004612be7565b610eda565b3480156104c8575f80fd5b5061024d6104d7366004612c2f565b611018565b3480156104e7575f80fd5b506103616104f6366004612c51565b6110ad565b348015610506575f80fd5b506101e7610515366004612b07565b6110e2565b348015610525575f80fd5b506103617f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d81565b348015610558575f80fd5b506101e76110f4565b6101e761056f366004612c68565b61120f565b34801561057f575f80fd5b506101e761058e366004612cab565b61121b565b34801561059e575f80fd5b506101e76105ad366004612c2f565b611330565b3480156105bd575f80fd5b5060985461024d906001600160a01b031681565b3480156105dc575f80fd5b506103617f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a81565b61061185858585856113c0565b5050505050565b6099546001600160a01b03163381146106785760405162461bcd60e51b815260206004820152601760248201527f6f6e6c79206d657373656e6765722063616e2063616c6c00000000000000000060448201526064015b60405180910390fd5b806001600160a01b0316636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106d89190612d04565b6001600160a01b0316736f297c61b5c92ef107ffd30cd56affe5a273e8416001600160a01b03161461074c5760405162461bcd60e51b815260206004820152601b60248201527f6f6e6c792063616c6c656420696e2064726f7020636f6e746578740000000000604482015260640161066f565b610754611780565b7f8431f5c10000000000000000000000000000000000000000000000000000000061078260045f8587612d1f565b61078b91612d46565b7fffffffff0000000000000000000000000000000000000000000000000000000016146107fa5760405162461bcd60e51b815260206004820152601060248201527f696e76616c69642073656c6563746f7200000000000000000000000000000000604482015260640161066f565b5f808061080a8560048189612d1f565b8101906108179190612d8e565b50945050935050925061082b8383836117d9565b61083f6001600160a01b038416838361187d565b816001600160a01b0316836001600160a01b03167fdbdf8eb487847e4c0f22847f5dac07f2d3690f96f581a6ae4b102769917645a88360405161088491815260200190565b60405180910390a350505061089860018055565b505050565b6108988333845f5b6040519080825280601f01601f1916602001820160405280156108cf576020820181803683370190505b50856113c0565b6108de61192c565b6108e88282611986565b5050565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff1615610948576040517f4f2c8be200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109727f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a33610c60565b6109a8576040517f3d39c5f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560405133907fc36a428b063177e3f28b3b5d340c08f77827847b2ee30114ccf0c40e519c420a905f90a2565b610a2661192c565b610a2f5f6119fc565b565b6099546001600160a01b0316338114610a8c5760405162461bcd60e51b815260206004820152601760248201527f6f6e6c79206d657373656e6765722063616e2063616c6c000000000000000000604482015260640161066f565b806001600160a01b0316636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ac8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aec9190612d04565b6097546001600160a01b03908116911614610b495760405162461bcd60e51b815260206004820152601860248201527f6f6e6c792063616c6c20627920636f756e746572706172740000000000000000604482015260640161066f565b610b51611780565b610b6088888888888888611a65565b610b746001600160a01b038916868661187d565b610bb38584848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250611be092505050565b856001600160a01b0316876001600160a01b0316896001600160a01b03167fc6f985873b37805705f6bce756dce3d1ff4b603e298d506288cce499926846a788888888604051610c069493929190612e19565b60405180910390a4610c1760018055565b5050505050505050565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260408120610c579083611c74565b90505b92915050565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260408120610c579083611c7f565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff16610cf1576040517fa185a6b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d1b7f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d633610c60565b610d51576040517fadd9524c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560405133907f9ca4d309bbfd23c65db3dc38c1712862f5812c7139937e2655de86e803f73bb9905f90a2565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff16610e24576040517f77d195b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e4e7f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c33610c60565b610e84576040517f9e60ca7e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec805461ff001916905560405133907f644eeba8ede48fefc32ada09fb240c5f6c0f06507ab1d296d5af41f1521d9fcb905f90a2565b5f54610100900460ff1615808015610ef857505f54600160ff909116105b80610f115750303b158015610f1157505f5460ff166001145b610f835760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161066f565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610fc2575f805461ff0019166101001790555b610fcd848484611ca0565b8015611012575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b5f817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614611085576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b507f000000000000000000000000000000000000000000000000000000000000000092915050565b5f8181527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260408120610c5a90611de3565b6110ea61192c565b6108e88282611dec565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff1615611155576040517ff74ad25400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61117f7f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d33610c60565b6111b5576040517f5c16894300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec805461ff00191661010017905560405133907fb2ed3603bd9051f0182ebfb75f12a21059b4d31b578a2a05c8d0245e9e2d3204905f90a2565b6110128484845f6108a5565b5f54600290610100900460ff1615801561123b57505f5460ff8083169116105b6112ad5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161066f565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff8316176101001790556112e985858585611e62565b5f805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b61133861192c565b6001600160a01b0381166113b45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161066f565b6113bd816119fc565b50565b6113c8611780565b847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614611434576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b846001600160a01b038116611475576040517fef6b416200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff166114d0576040517fa185a6b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845f03611509576040517f14fc8bd900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611515888787612043565b8051919850965090915015611556576040517fb286dd6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f887f0000000000000000000000000000000000000000000000000000000000000000838a8a8a60405160240161159296959493929190612eab565b60408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8431f5c10000000000000000000000000000000000000000000000000000000017905260995482517fecc7042800000000000000000000000000000000000000000000000000000000815292519394505f936001600160a01b039091169263ecc704289260048083019391928290030181865afa15801561164b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061166f9190612ef8565b6099546097546040517f5f7b15770000000000000000000000000000000000000000000000000000000081529293506001600160a01b0391821692635f7b15779234926116c9929116905f9088908d908b90600401612f0f565b5f604051808303818588803b1580156116e0575f80fd5b505af11580156116f2573d5f803e3d5ffd5b5050505050826001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03168b6001600160a01b03167f1a6c38816de45937fd5cd974f9694fe10e64163ba12a92abf0f4b6b23ad886728c8c8c8760405161176a9493929190612f51565b60405180910390a4505050505061061160018055565b6002600154036117d25760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161066f565b6002600155565b827f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614611845576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3415611012576040517f3ddcf11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516001600160a01b0383166024820152604481018290526108989084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612299565b60018055565b6065546001600160a01b03163314610a2f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161066f565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed602052604090206119bc908261237f565b156108e85760405133906001600160a01b0383169084907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d905f90a45050565b606580546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614611ad1576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614611b3d576040517f6251ce6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff16611b9d576040517f77d195b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3415611bd5576040517f3ddcf11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050505050565b5f8151118015611bf957505f826001600160a01b03163b115b156108e8576040517f444b281f0000000000000000000000000000000000000000000000000000000081526001600160a01b0383169063444b281f90611c43908490600401612f89565b5f604051808303815f87803b158015611c5a575f80fd5b505af1158015611c6c573d5f803e3d5ffd5b505050505050565b5f610c578383612393565b6001600160a01b0381165f9081526001830160205260408120541515610c57565b6001600160a01b038316611cf65760405162461bcd60e51b815260206004820152601860248201527f7a65726f20636f756e7465727061727420616464726573730000000000000000604482015260640161066f565b6001600160a01b038116611d4c5760405162461bcd60e51b815260206004820152601660248201527f7a65726f206d657373656e676572206164647265737300000000000000000000604482015260640161066f565b611d546123b9565b611d5c61243d565b609780546001600160a01b038086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560998054848416921691909117905582161561089857609880546001600160a01b0384167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179055505050565b5f610c5a825490565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260409020611e2290826124c1565b156108e85760405133906001600160a01b0383169084907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b905f90a45050565b5f54610100900460ff16611ede5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161066f565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117815560405133907fc36a428b063177e3f28b3b5d340c08f77827847b2ee30114ccf0c40e519c420a905f90a2805461ff001916610100178155611f663390565b6001600160a01b03167fb2ed3603bd9051f0182ebfb75f12a21059b4d31b578a2a05c8d0245e9e2d320460405160405180910390a2611fc57f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a86611986565b611fef7f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d685611986565b6120197f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d84611986565b6106117f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c83611986565b6098545f908190606090339081906001600160a01b031681900361211357858060200190518101906120759190612f9b565b6040517fc52a3bbc0000000000000000000000000000000000000000000000000000000081526001600160a01b0380841660048301528b81166024830152604482018b905291985091925083169063c52a3bbc906064016020604051808303815f875af11580156120e8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061210c9190612ef8565b965061223d565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f906001600160a01b038a16906370a0823190602401602060405180830381865afa158015612170573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121949190612ef8565b90506121ab6001600160a01b038a1683308b6124d5565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa158015612208573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061222c9190612ef8565b90506122388282613023565b985050505b5f871161228c5760405162461bcd60e51b815260206004820152601360248201527f6465706f736974207a65726f20616d6f756e7400000000000000000000000000604482015260640161066f565b9795965093949350505050565b5f6122ed826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b03166125269092919063ffffffff16565b905080515f148061230d57508080602001905181019061230d919061305b565b6108985760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161066f565b5f610c57836001600160a01b03841661253c565b5f825f0182815481106123a8576123a861307a565b905f5260205f200154905092915050565b5f54610100900460ff166124355760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161066f565b610a2f612588565b5f54610100900460ff166124b95760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161066f565b610a2f612604565b5f610c57836001600160a01b038416612689565b6040516001600160a01b03808516602483015283166044820152606481018290526110129085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016118c2565b606061253484845f8561276c565b949350505050565b5f81815260018301602052604081205461258157508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610c5a565b505f610c5a565b5f54610100900460ff166119265760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161066f565b5f54610100900460ff166126805760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161066f565b610a2f336119fc565b5f8181526001830160205260408120548015612763575f6126ab600183613023565b85549091505f906126be90600190613023565b905081811461271d575f865f0182815481106126dc576126dc61307a565b905f5260205f200154905080875f0184815481106126fc576126fc61307a565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061272e5761272e6130a7565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610c5a565b5f915050610c5a565b6060824710156127e45760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161066f565b5f80866001600160a01b031685876040516127ff91906130d4565b5f6040518083038185875af1925050503d805f8114612839576040519150601f19603f3d011682016040523d82523d5f602084013e61283e565b606091505b509150915061284f8783838761285a565b979650505050505050565b606083156128c85782515f036128c1576001600160a01b0385163b6128c15760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161066f565b5081612534565b61253483838151156128dd5781518083602001fd5b8060405162461bcd60e51b815260040161066f9190612f89565b6001600160a01b03811681146113bd575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156129615761296161290b565b604052919050565b5f67ffffffffffffffff8211156129825761298261290b565b50601f01601f191660200190565b5f82601f83011261299f575f80fd5b81356129b26129ad82612969565b612938565b8181528460208386010111156129c6575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f60a086880312156129f6575f80fd5b8535612a01816128f7565b94506020860135612a11816128f7565b935060408601359250606086013567ffffffffffffffff811115612a33575f80fd5b612a3f88828901612990565b95989497509295608001359392505050565b5f8083601f840112612a61575f80fd5b50813567ffffffffffffffff811115612a78575f80fd5b602083019150836020828501011115612a8f575f80fd5b9250929050565b5f8060208385031215612aa7575f80fd5b823567ffffffffffffffff811115612abd575f80fd5b612ac985828601612a51565b90969095509350505050565b5f805f60608486031215612ae7575f80fd5b8335612af2816128f7565b95602085013595506040909401359392505050565b5f8060408385031215612b18575f80fd5b823591506020830135612b2a816128f7565b809150509250929050565b5f805f805f805f60c0888a031215612b4b575f80fd5b8735612b56816128f7565b96506020880135612b66816128f7565b95506040880135612b76816128f7565b94506060880135612b86816128f7565b93506080880135925060a088013567ffffffffffffffff811115612ba8575f80fd5b612bb48a828b01612a51565b989b979a50959850939692959293505050565b5f8060408385031215612bd8575f80fd5b50508035926020909101359150565b5f805f60608486031215612bf9575f80fd5b8335612c04816128f7565b92506020840135612c14816128f7565b91506040840135612c24816128f7565b809150509250925092565b5f60208284031215612c3f575f80fd5b8135612c4a816128f7565b9392505050565b5f60208284031215612c61575f80fd5b5035919050565b5f805f8060808587031215612c7b575f80fd5b8435612c86816128f7565b93506020850135612c96816128f7565b93969395505050506040820135916060013590565b5f805f8060808587031215612cbe575f80fd5b8435612cc9816128f7565b93506020850135612cd9816128f7565b92506040850135612ce9816128f7565b91506060850135612cf9816128f7565b939692955090935050565b5f60208284031215612d14575f80fd5b8151612c4a816128f7565b5f8085851115612d2d575f80fd5b83861115612d39575f80fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015612d865780818660040360031b1b83161692505b505092915050565b5f805f805f8060c08789031215612da3575f80fd5b8635612dae816128f7565b95506020870135612dbe816128f7565b94506040870135612dce816128f7565b93506060870135612dde816128f7565b92506080870135915060a087013567ffffffffffffffff811115612e00575f80fd5b612e0c89828a01612990565b9150509295509295509295565b6001600160a01b038516815283602082015260606040820152816060820152818360808301375f818301608090810191909152601f909201601f191601019392505050565b5f5b83811015612e78578181015183820152602001612e60565b50505f910152565b5f8151808452612e97816020860160208601612e5e565b601f01601f19169290920160200192915050565b5f6001600160a01b0380891683528088166020840152808716604084015280861660608401525083608083015260c060a0830152612eec60c0830184612e80565b98975050505050505050565b5f60208284031215612f08575f80fd5b5051919050565b5f6001600160a01b03808816835286602084015260a06040840152612f3760a0840187612e80565b606084019590955292909216608090910152509392505050565b6001600160a01b0385168152836020820152608060408201525f612f786080830185612e80565b905082606083015295945050505050565b602081525f610c576020830184612e80565b5f8060408385031215612fac575f80fd5b8251612fb7816128f7565b602084015190925067ffffffffffffffff811115612fd3575f80fd5b8301601f81018513612fe3575f80fd5b8051612ff16129ad82612969565b818152866020838501011115613005575f80fd5b613016826020830160208601612e5e565b8093505050509250929050565b81810381811115610c5a577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6020828403121561306b575f80fd5b81518015158114612c4a575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f82516130e5818460208701612e5e565b919091019291505056fea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1Token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_l2Token\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"DepositAndCallIsNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorAccountIsZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorCallerIsNotDepositsDisabler\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorCallerIsNotDepositsEnabler\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorCallerIsNotWithdrawalsDisabler\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorCallerIsNotWithdrawalsEnabler\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorDepositZeroAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorDepositsDisabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorDepositsEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorNonZeroMsgValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorUnsupportedL1Token\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorUnsupportedL2Token\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorWithdrawalsDisabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorWithdrawalsEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"l1Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"l2Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"name\":\"DepositERC20\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"disabler\",\"type\":\"address\"}],\"name\":\"DepositsDisabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"enabler\",\"type\":\"address\"}],\"name\":\"DepositsEnabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"l1Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"l2Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"FinalizeWithdrawERC20\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"recipient\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"RefundERC20\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"disabler\",\"type\":\"address\"}],\"name\":\"WithdrawalsDisabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"enabler\",\"type\":\"address\"}],\"name\":\"WithdrawalsEnabled\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEPOSITS_DISABLER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEPOSITS_ENABLER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WITHDRAWALS_DISABLER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WITHDRAWALS_ENABLER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"counterpart\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"}],\"name\":\"depositERC20\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"}],\"name\":\"depositERC20\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"}],\"name\":\"depositERC20AndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"disableDeposits\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"disableWithdrawals\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enableDeposits\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enableWithdrawals\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1Token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_l2Token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"finalizeWithdrawERC20\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1Token\",\"type\":\"address\"}],\"name\":\"getL2ERC20Address\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_role\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getRoleMember\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_role\",\"type\":\"bytes32\"}],\"name\":\"getRoleMemberCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_counterpart\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_messenger\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_depositsEnabler\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_depositsDisabler\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_withdrawalsEnabler\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_withdrawalsDisabler\",\"type\":\"address\"}],\"name\":\"initializeV2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isDepositsEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isWithdrawalsEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1Token\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2Token\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messenger\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_message\",\"type\":\"bytes\"}],\"name\":\"onDropMessage\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"router\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x60c060405234801562000010575f80fd5b50604051620032d1380380620032d1833981016040819052620000339162000168565b6001600160a01b03808316608081905290821660a05215806200005d57506001600160a01b038116155b156200007c5760405163a7f9319d60e01b815260040160405180910390fd5b620000866200008e565b50506200019e565b5f54610100900460ff1615620000fa5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146200014a575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b80516001600160a01b038116811462000163575f80fd5b919050565b5f80604083850312156200017a575f80fd5b62000185836200014c565b915062000195602084016200014c565b90509250929050565b60805160a0516130e0620001f15f395f818161027b015281816110880152818161155b0152611ab801525f818161047c0152818161101c015281816113cb015281816117c00152611a4c01526130e05ff3fe6080604052600436106101d0575f3560e01c80639010d07c116100fd578063d547741f11610092578063f27ebced11610062578063f27ebced14610574578063f2fde38b14610593578063f887ea40146105b2578063fadcc54a146105d1575f80fd5b8063d547741f146104fb578063e3b523e31461051a578063e8bac93b1461054d578063f219fa6614610561575f80fd5b8063c01e1bd6116100cd578063c01e1bd61461046b578063c0c53b8b1461049e578063c676ad29146104bd578063ca15c873146104dc575f80fd5b80639010d07c1461040557806391d1485414610424578063ac67e1af14610443578063ad960ce114610457575f80fd5b80635e4c57a411610173578063797594b011610143578063797594b01461038357806384bd13b0146103a25780638d7601c0146103b55780638da5cb5b146103e8575f80fd5b80635e4c57a4146102df5780635ed2c220146102f35780636f18bd221461032e578063715018a61461036f575f80fd5b80632f2ff15d116101ae5780632f2ff15d1461020f5780633cb747bf1461022e57806356eff2671461026a5780635777bf501461029d575f80fd5b80630aea8c26146101d457806314298c51146101e957806321425ee0146101fc575b5f80fd5b6101e76101e23660046129c6565b610604565b005b6101e76101f7366004612a7a565b610618565b6101e761020a366004612ab9565b61089d565b34801561021a575f80fd5b506101e7610229366004612aeb565b6108d6565b348015610239575f80fd5b5060995461024d906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b348015610275575f80fd5b5061024d7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102a8575f80fd5b507fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff165b6040519015158152602001610261565b3480156102ea575f80fd5b506101e76108ec565b3480156102fe575f80fd5b507fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff166102cf565b348015610339575f80fd5b506103617f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d681565b604051908152602001610261565b34801561037a575f80fd5b506101e7610a1e565b34801561038e575f80fd5b5060975461024d906001600160a01b031681565b6101e76103b0366004612b19565b610a31565b3480156103c0575f80fd5b506103617f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c81565b3480156103f3575f80fd5b506065546001600160a01b031661024d565b348015610410575f80fd5b5061024d61041f366004612bab565b610c21565b34801561042f575f80fd5b506102cf61043e366004612aeb565b610c60565b34801561044e575f80fd5b506101e7610c96565b348015610462575f80fd5b506101e7610dc4565b348015610476575f80fd5b5061024d7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104a9575f80fd5b506101e76104b8366004612bcb565b610eda565b3480156104c8575f80fd5b5061024d6104d7366004612c13565b611018565b3480156104e7575f80fd5b506103616104f6366004612c35565b6110ad565b348015610506575f80fd5b506101e7610515366004612aeb565b6110e2565b348015610525575f80fd5b506103617f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d81565b348015610558575f80fd5b506101e76110f4565b6101e761056f366004612c4c565b61120f565b34801561057f575f80fd5b506101e761058e366004612c8f565b61121b565b34801561059e575f80fd5b506101e76105ad366004612c13565b611330565b3480156105bd575f80fd5b5060985461024d906001600160a01b031681565b3480156105dc575f80fd5b506103617f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a81565b61061185858585856113c0565b5050505050565b6099546001600160a01b03163381146106785760405162461bcd60e51b815260206004820152601760248201527f6f6e6c79206d657373656e6765722063616e2063616c6c00000000000000000060448201526064015b60405180910390fd5b806001600160a01b0316636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa1580156106b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106d89190612ce8565b6001600160a01b0316736f297c61b5c92ef107ffd30cd56affe5a273e8416001600160a01b03161461074c5760405162461bcd60e51b815260206004820152601b60248201527f6f6e6c792063616c6c656420696e2064726f7020636f6e746578740000000000604482015260640161066f565b610754611764565b7f8431f5c10000000000000000000000000000000000000000000000000000000061078260045f8587612d03565b61078b91612d2a565b7fffffffff0000000000000000000000000000000000000000000000000000000016146107fa5760405162461bcd60e51b815260206004820152601060248201527f696e76616c69642073656c6563746f7200000000000000000000000000000000604482015260640161066f565b5f808061080a8560048189612d03565b8101906108179190612d72565b50945050935050925061082b8383836117bd565b61083f6001600160a01b0384168383611861565b816001600160a01b0316836001600160a01b03167fdbdf8eb487847e4c0f22847f5dac07f2d3690f96f581a6ae4b102769917645a88360405161088491815260200190565b60405180910390a350505061089860018055565b505050565b6108988333845f5b6040519080825280601f01601f1916602001820160405280156108cf576020820181803683370190505b50856113c0565b6108de611910565b6108e8828261196a565b5050565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff1615610948576040517f4f2c8be200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6109727f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a33610c60565b6109a8576040517f3d39c5f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560405133907fc36a428b063177e3f28b3b5d340c08f77827847b2ee30114ccf0c40e519c420a905f90a2565b610a26611910565b610a2f5f6119e0565b565b6099546001600160a01b0316338114610a8c5760405162461bcd60e51b815260206004820152601760248201527f6f6e6c79206d657373656e6765722063616e2063616c6c000000000000000000604482015260640161066f565b806001600160a01b0316636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015610ac8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610aec9190612ce8565b6097546001600160a01b03908116911614610b495760405162461bcd60e51b815260206004820152601860248201527f6f6e6c792063616c6c20627920636f756e746572706172740000000000000000604482015260640161066f565b610b51611764565b610b6088888888888888611a49565b610b746001600160a01b0389168686611861565b610bb38584848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250611bc492505050565b856001600160a01b0316876001600160a01b0316896001600160a01b03167fc6f985873b37805705f6bce756dce3d1ff4b603e298d506288cce499926846a788888888604051610c069493929190612dfd565b60405180910390a4610c1760018055565b5050505050505050565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260408120610c579083611c58565b90505b92915050565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260408120610c579083611c63565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff16610cf1576040517fa185a6b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d1b7f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d633610c60565b610d51576040517fadd9524c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560405133907f9ca4d309bbfd23c65db3dc38c1712862f5812c7139937e2655de86e803f73bb9905f90a2565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff16610e24576040517f77d195b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e4e7f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c33610c60565b610e84576040517f9e60ca7e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec805461ff001916905560405133907f644eeba8ede48fefc32ada09fb240c5f6c0f06507ab1d296d5af41f1521d9fcb905f90a2565b5f54610100900460ff1615808015610ef857505f54600160ff909116105b80610f115750303b158015610f1157505f5460ff166001145b610f835760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161066f565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610fc2575f805461ff0019166101001790555b610fcd848484611c84565b8015611012575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b5f817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614611085576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b507f000000000000000000000000000000000000000000000000000000000000000092915050565b5f8181527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260408120610c5a90611dc7565b6110ea611910565b6108e88282611dd0565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff1615611155576040517ff74ad25400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61117f7f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d33610c60565b6111b5576040517f5c16894300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec805461ff00191661010017905560405133907fb2ed3603bd9051f0182ebfb75f12a21059b4d31b578a2a05c8d0245e9e2d3204905f90a2565b6110128484845f6108a5565b5f54600290610100900460ff1615801561123b57505f5460ff8083169116105b6112ad5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161066f565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff8316176101001790556112e985858585611e46565b5f805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b611338611910565b6001600160a01b0381166113b45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161066f565b6113bd816119e0565b50565b6113c8611764565b847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614611434576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b846001600160a01b038116611475576040517fef6b416200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff166114d0576040517fa185a6b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845f03611509576040517f14fc8bd900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f611515888787612027565b8051919850965090915015611556576040517fb286dd6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f0000000000000000000000000000000000000000000000000000000000000000905f90611595908b90849086908d908d908d90602401612e8f565b60408051601f19818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8431f5c10000000000000000000000000000000000000000000000000000000017905260995482517fecc7042800000000000000000000000000000000000000000000000000000000815292519394505f936001600160a01b039091169263ecc704289260048083019391928290030181865afa15801561164e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116729190612edc565b6099546097546040517f5f7b15770000000000000000000000000000000000000000000000000000000081529293506001600160a01b0391821692635f7b15779234926116cc929116905f9088908e908c90600401612ef3565b5f604051808303818588803b1580156116e3575f80fd5b505af11580156116f5573d5f803e3d5ffd5b5050505050836001600160a01b0316836001600160a01b03168c6001600160a01b03167f1a6c38816de45937fd5cd974f9694fe10e64163ba12a92abf0f4b6b23ad886728d8d8d8760405161174d9493929190612f35565b60405180910390a450505050505061061160018055565b6002600154036117b65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161066f565b6002600155565b827f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614611829576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3415611012576040517f3ddcf11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040516001600160a01b0383166024820152604481018290526108989084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b60408051601f198184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009093169290921790915261227d565b60018055565b6065546001600160a01b03163314610a2f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161066f565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed602052604090206119a09082612363565b156108e85760405133906001600160a01b0383169084907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d905f90a45050565b606580546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614611ab5576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b867f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614611b21576040517f6251ce6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff16611b81576040517f77d195b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3415611bb9576040517f3ddcf11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050505050565b5f8151118015611bdd57505f826001600160a01b03163b115b156108e8576040517f444b281f0000000000000000000000000000000000000000000000000000000081526001600160a01b0383169063444b281f90611c27908490600401612f6d565b5f604051808303815f87803b158015611c3e575f80fd5b505af1158015611c50573d5f803e3d5ffd5b505050505050565b5f610c578383612377565b6001600160a01b0381165f9081526001830160205260408120541515610c57565b6001600160a01b038316611cda5760405162461bcd60e51b815260206004820152601860248201527f7a65726f20636f756e7465727061727420616464726573730000000000000000604482015260640161066f565b6001600160a01b038116611d305760405162461bcd60e51b815260206004820152601660248201527f7a65726f206d657373656e676572206164647265737300000000000000000000604482015260640161066f565b611d3861239d565b611d40612421565b609780546001600160a01b038086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560998054848416921691909117905582161561089857609880546001600160a01b0384167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179055505050565b5f610c5a825490565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260409020611e0690826124a5565b156108e85760405133906001600160a01b0383169084907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b905f90a45050565b5f54610100900460ff16611ec25760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161066f565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117815560405133907fc36a428b063177e3f28b3b5d340c08f77827847b2ee30114ccf0c40e519c420a905f90a2805461ff001916610100178155611f4a3390565b6001600160a01b03167fb2ed3603bd9051f0182ebfb75f12a21059b4d31b578a2a05c8d0245e9e2d320460405160405180910390a2611fa97f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a8661196a565b611fd37f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d68561196a565b611ffd7f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d8461196a565b6106117f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c8361196a565b6098545f908190606090339081906001600160a01b03168190036120f757858060200190518101906120599190612f7f565b6040517fc52a3bbc0000000000000000000000000000000000000000000000000000000081526001600160a01b0380841660048301528b81166024830152604482018b905291985091925083169063c52a3bbc906064016020604051808303815f875af11580156120cc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906120f09190612edc565b9650612221565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f906001600160a01b038a16906370a0823190602401602060405180830381865afa158015612154573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121789190612edc565b905061218f6001600160a01b038a1683308b6124b9565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f906001600160a01b038b16906370a0823190602401602060405180830381865afa1580156121ec573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122109190612edc565b905061221c8282613007565b985050505b5f87116122705760405162461bcd60e51b815260206004820152601360248201527f6465706f736974207a65726f20616d6f756e7400000000000000000000000000604482015260640161066f565b9795965093949350505050565b5f6122d1826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b031661250a9092919063ffffffff16565b905080515f14806122f15750808060200190518101906122f1919061303f565b6108985760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f74207375636365656400000000000000000000000000000000000000000000606482015260840161066f565b5f610c57836001600160a01b038416612520565b5f825f01828154811061238c5761238c61305e565b905f5260205f200154905092915050565b5f54610100900460ff166124195760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161066f565b610a2f61256c565b5f54610100900460ff1661249d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161066f565b610a2f6125e8565b5f610c57836001600160a01b03841661266d565b6040516001600160a01b03808516602483015283166044820152606481018290526110129085907f23b872dd00000000000000000000000000000000000000000000000000000000906084016118a6565b606061251884845f85612750565b949350505050565b5f81815260018301602052604081205461256557508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610c5a565b505f610c5a565b5f54610100900460ff1661190a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161066f565b5f54610100900460ff166126645760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161066f565b610a2f336119e0565b5f8181526001830160205260408120548015612747575f61268f600183613007565b85549091505f906126a290600190613007565b9050818114612701575f865f0182815481106126c0576126c061305e565b905f5260205f200154905080875f0184815481106126e0576126e061305e565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806127125761271261308b565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610c5a565b5f915050610c5a565b6060824710156127c85760405162461bcd60e51b815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c0000000000000000000000000000000000000000000000000000606482015260840161066f565b5f80866001600160a01b031685876040516127e391906130b8565b5f6040518083038185875af1925050503d805f811461281d576040519150601f19603f3d011682016040523d82523d5f602084013e612822565b606091505b50915091506128338783838761283e565b979650505050505050565b606083156128ac5782515f036128a5576001600160a01b0385163b6128a55760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e7472616374000000604482015260640161066f565b5081612518565b61251883838151156128c15781518083602001fd5b8060405162461bcd60e51b815260040161066f9190612f6d565b6001600160a01b03811681146113bd575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715612945576129456128ef565b604052919050565b5f67ffffffffffffffff821115612966576129666128ef565b50601f01601f191660200190565b5f82601f830112612983575f80fd5b81356129966129918261294d565b61291c565b8181528460208386010111156129aa575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f60a086880312156129da575f80fd5b85356129e5816128db565b945060208601356129f5816128db565b935060408601359250606086013567ffffffffffffffff811115612a17575f80fd5b612a2388828901612974565b95989497509295608001359392505050565b5f8083601f840112612a45575f80fd5b50813567ffffffffffffffff811115612a5c575f80fd5b602083019150836020828501011115612a73575f80fd5b9250929050565b5f8060208385031215612a8b575f80fd5b823567ffffffffffffffff811115612aa1575f80fd5b612aad85828601612a35565b90969095509350505050565b5f805f60608486031215612acb575f80fd5b8335612ad6816128db565b95602085013595506040909401359392505050565b5f8060408385031215612afc575f80fd5b823591506020830135612b0e816128db565b809150509250929050565b5f805f805f805f60c0888a031215612b2f575f80fd5b8735612b3a816128db565b96506020880135612b4a816128db565b95506040880135612b5a816128db565b94506060880135612b6a816128db565b93506080880135925060a088013567ffffffffffffffff811115612b8c575f80fd5b612b988a828b01612a35565b989b979a50959850939692959293505050565b5f8060408385031215612bbc575f80fd5b50508035926020909101359150565b5f805f60608486031215612bdd575f80fd5b8335612be8816128db565b92506020840135612bf8816128db565b91506040840135612c08816128db565b809150509250925092565b5f60208284031215612c23575f80fd5b8135612c2e816128db565b9392505050565b5f60208284031215612c45575f80fd5b5035919050565b5f805f8060808587031215612c5f575f80fd5b8435612c6a816128db565b93506020850135612c7a816128db565b93969395505050506040820135916060013590565b5f805f8060808587031215612ca2575f80fd5b8435612cad816128db565b93506020850135612cbd816128db565b92506040850135612ccd816128db565b91506060850135612cdd816128db565b939692955090935050565b5f60208284031215612cf8575f80fd5b8151612c2e816128db565b5f8085851115612d11575f80fd5b83861115612d1d575f80fd5b5050820193919092039150565b7fffffffff000000000000000000000000000000000000000000000000000000008135818116916004851015612d6a5780818660040360031b1b83161692505b505092915050565b5f805f805f8060c08789031215612d87575f80fd5b8635612d92816128db565b95506020870135612da2816128db565b94506040870135612db2816128db565b93506060870135612dc2816128db565b92506080870135915060a087013567ffffffffffffffff811115612de4575f80fd5b612df089828a01612974565b9150509295509295509295565b6001600160a01b038516815283602082015260606040820152816060820152818360808301375f818301608090810191909152601f909201601f191601019392505050565b5f5b83811015612e5c578181015183820152602001612e44565b50505f910152565b5f8151808452612e7b816020860160208601612e42565b601f01601f19169290920160200192915050565b5f6001600160a01b0380891683528088166020840152808716604084015280861660608401525083608083015260c060a0830152612ed060c0830184612e64565b98975050505050505050565b5f60208284031215612eec575f80fd5b5051919050565b5f6001600160a01b03808816835286602084015260a06040840152612f1b60a0840187612e64565b606084019590955292909216608090910152509392505050565b6001600160a01b0385168152836020820152608060408201525f612f5c6080830185612e64565b905082606083015295945050505050565b602081525f610c576020830184612e64565b5f8060408385031215612f90575f80fd5b8251612f9b816128db565b602084015190925067ffffffffffffffff811115612fb7575f80fd5b8301601f81018513612fc7575f80fd5b8051612fd56129918261294d565b818152866020838501011115612fe9575f80fd5b612ffa826020830160208601612e42565b8093505050509250929050565b81810381811115610c5a577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6020828403121561304f575f80fd5b81518015158114612c2e575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f82516130c9818460208701612e42565b919091019291505056fea164736f6c6343000818000a", } // L1LidoGatewayABI is the input ABI used to generate the binding from. diff --git a/bindings/bindings/l1lidogateway_more.go b/bindings/bindings/l1lidogateway_more.go index bd41e634..7d00319c 100644 --- a/bindings/bindings/l1lidogateway_more.go +++ b/bindings/bindings/l1lidogateway_more.go @@ -13,7 +13,7 @@ const L1LidoGatewayStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract var L1LidoGatewayStorageLayout = new(solc.StorageLayout) -var L1LidoGatewayDeployedBin = "0x6080604052600436106101d0575f3560e01c80639010d07c116100fd578063d547741f11610092578063f27ebced11610062578063f27ebced146105a8578063f2fde38b146105c7578063f887ea40146105e6578063fadcc54a14610612575f80fd5b8063d547741f1461052f578063e3b523e31461054e578063e8bac93b14610581578063f219fa6614610595575f80fd5b8063c01e1bd6116100cd578063c01e1bd61461049f578063c0c53b8b146104d2578063c676ad29146104f1578063ca15c87314610510575f80fd5b80639010d07c1461043957806391d1485414610458578063ac67e1af14610477578063ad960ce11461048b575f80fd5b80635e4c57a411610173578063797594b011610143578063797594b01461039d57806384bd13b0146103c95780638d7601c0146103dc5780638da5cb5b1461040f575f80fd5b80635e4c57a4146102f95780635ed2c2201461030d5780636f18bd2214610348578063715018a614610389575f80fd5b80632f2ff15d116101ae5780632f2ff15d1461020f5780633cb747bf1461022e57806356eff267146102845780635777bf50146102b7575f80fd5b80630aea8c26146101d457806314298c51146101e957806321425ee0146101fc575b5f80fd5b6101e76101e236600461305d565b610645565b005b6101e76101f7366004613111565b610659565b6101e761020a366004613150565b610987565b34801561021a575f80fd5b506101e7610229366004613182565b6109c0565b348015610239575f80fd5b5060995461025a9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561028f575f80fd5b5061025a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102c2575f80fd5b507fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff165b604051901515815260200161027b565b348015610304575f80fd5b506101e76109d6565b348015610318575f80fd5b507fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff166102e9565b348015610353575f80fd5b5061037b7f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d681565b60405190815260200161027b565b348015610394575f80fd5b506101e7610b08565b3480156103a8575f80fd5b5060975461025a9073ffffffffffffffffffffffffffffffffffffffff1681565b6101e76103d73660046131b0565b610b1b565b3480156103e7575f80fd5b5061037b7f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c81565b34801561041a575f80fd5b5060655473ffffffffffffffffffffffffffffffffffffffff1661025a565b348015610444575f80fd5b5061025a610453366004613242565b610d9a565b348015610463575f80fd5b506102e9610472366004613182565b610dd9565b348015610482575f80fd5b506101e7610e0f565b348015610496575f80fd5b506101e7610f3d565b3480156104aa575f80fd5b5061025a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd575f80fd5b506101e76104ec366004613262565b611070565b3480156104fc575f80fd5b5061025a61050b3660046132aa565b611202565b34801561051b575f80fd5b5061037b61052a3660046132cc565b6112b1565b34801561053a575f80fd5b506101e7610549366004613182565b6112e6565b348015610559575f80fd5b5061037b7f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d81565b34801561058c575f80fd5b506101e76112f8565b6101e76105a33660046132e3565b611430565b3480156105b3575f80fd5b506101e76105c2366004613326565b61143c565b3480156105d2575f80fd5b506101e76105e13660046132aa565b611588565b3480156105f1575f80fd5b5060985461025a9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561061d575f80fd5b5061037b7f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a81565b610652858585858561163f565b5050505050565b60995473ffffffffffffffffffffffffffffffffffffffff163381146106e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f6f6e6c79206d657373656e6765722063616e2063616c6c00000000000000000060448201526064015b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015610729573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074d919061337f565b73ffffffffffffffffffffffffffffffffffffffff16736f297c61b5c92ef107ffd30cd56affe5a273e84173ffffffffffffffffffffffffffffffffffffffff16146107f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6f6e6c792063616c6c656420696e2064726f7020636f6e74657874000000000060448201526064016106d7565b6107fd611a85565b7f8431f5c10000000000000000000000000000000000000000000000000000000061082b60045f858761339a565b610834916133c1565b7fffffffff0000000000000000000000000000000000000000000000000000000016146108bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f696e76616c69642073656c6563746f720000000000000000000000000000000060448201526064016106d7565b5f80806108cd856004818961339a565b8101906108da9190613409565b5094505093505092506108ee838383611af8565b61090f73ffffffffffffffffffffffffffffffffffffffff84168383611bb6565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fdbdf8eb487847e4c0f22847f5dac07f2d3690f96f581a6ae4b102769917645a88360405161096e91815260200190565b60405180910390a350505061098260018055565b505050565b6109828333845f5b6040519080825280601f01601f1916602001820160405280156109b9576020820181803683370190505b508561163f565b6109c8611c90565b6109d28282611d11565b5050565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff1615610a32576040517f4f2c8be200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a5c7f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a33610dd9565b610a92576040517f3d39c5f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560405133907fc36a428b063177e3f28b3b5d340c08f77827847b2ee30114ccf0c40e519c420a905f90a2565b610b10611c90565b610b195f611d94565b565b60995473ffffffffffffffffffffffffffffffffffffffff16338114610b9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f6f6e6c79206d657373656e6765722063616e2063616c6c00000000000000000060448201526064016106d7565b8073ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015610be6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c0a919061337f565b60975473ffffffffffffffffffffffffffffffffffffffff908116911614610c8e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6f6e6c792063616c6c20627920636f756e74657270617274000000000000000060448201526064016106d7565b610c96611a85565b610ca588888888888888611e0a565b610cc673ffffffffffffffffffffffffffffffffffffffff89168686611bb6565b610d058584848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250611fb992505050565b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fc6f985873b37805705f6bce756dce3d1ff4b603e298d506288cce499926846a788888888604051610d7f9493929190613494565b60405180910390a4610d9060018055565b5050505050505050565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260408120610dd09083612067565b90505b92915050565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260408120610dd09083612072565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff16610e6a576040517fa185a6b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e947f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d633610dd9565b610eca576040517fadd9524c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560405133907f9ca4d309bbfd23c65db3dc38c1712862f5812c7139937e2655de86e803f73bb9905f90a2565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff16610f9d576040517f77d195b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fc77f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c33610dd9565b610ffd576040517f9e60ca7e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405133907f644eeba8ede48fefc32ada09fb240c5f6c0f06507ab1d296d5af41f1521d9fcb905f90a2565b5f54610100900460ff161580801561108e57505f54600160ff909116105b806110a75750303b1580156110a757505f5460ff166001145b611133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016106d7565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561118f575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b61119a8484846120a0565b80156111fc575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b5f817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611289576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b507f000000000000000000000000000000000000000000000000000000000000000092915050565b5f8181527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260408120610dd39061224b565b6112ee611c90565b6109d28282612254565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff1615611359576040517ff74ad25400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113837f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d33610dd9565b6113b9576040517f5c16894300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560405133907fb2ed3603bd9051f0182ebfb75f12a21059b4d31b578a2a05c8d0245e9e2d3204905f90a2565b6111fc8484845f61098f565b5f54600290610100900460ff1615801561145c57505f5460ff8083169116105b6114e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016106d7565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055611524858585856122d7565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b611590611c90565b73ffffffffffffffffffffffffffffffffffffffff8116611633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016106d7565b61163c81611d94565b50565b611647611a85565b847f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146116cd576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff811661171b576040517fef6b416200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff16611776576040517fa185a6b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845f036117af576040517f14fc8bd900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6117bb8887876124fc565b80519198509650909150156117fc576040517fb286dd6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f887f0000000000000000000000000000000000000000000000000000000000000000838a8a8a6040516024016118389695949392919061356f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8431f5c10000000000000000000000000000000000000000000000000000000017905260995482517fecc7042800000000000000000000000000000000000000000000000000000000815292519394505f9373ffffffffffffffffffffffffffffffffffffffff9091169263ecc704289260048083019391928290030181865afa15801561191c573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061194091906135c9565b6099546097546040517f5f7b157700000000000000000000000000000000000000000000000000000000815292935073ffffffffffffffffffffffffffffffffffffffff91821692635f7b15779234926119a7929116905f9088908d908b906004016135e0565b5f604051808303818588803b1580156119be575f80fd5b505af11580156119d0573d5f803e3d5ffd5b50505050508273ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff167f1a6c38816de45937fd5cd974f9694fe10e64163ba12a92abf0f4b6b23ad886728c8c8c87604051611a6f949392919061362f565b60405180910390a4505050505061065260018055565b600260015403611af1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106d7565b6002600155565b827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b7e576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b34156111fc576040517f3ddcf11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526109829084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909316929092179091526127ad565b60018055565b60655473ffffffffffffffffffffffffffffffffffffffff163314610b19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106d7565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260409020611d4790826128ba565b156109d257604051339073ffffffffffffffffffffffffffffffffffffffff83169084907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d905f90a45050565b6065805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b867f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611e90576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b867f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611f16576040517f6251ce6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff16611f76576040517f77d195b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3415611fae576040517f3ddcf11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050505050565b5f8151118015611fdf57505f8273ffffffffffffffffffffffffffffffffffffffff163b115b156109d2576040517f444b281f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063444b281f90612036908490600401613674565b5f604051808303815f87803b15801561204d575f80fd5b505af115801561205f573d5f803e3d5ffd5b505050505050565b5f610dd083836128db565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526001830160205260408120541515610dd0565b73ffffffffffffffffffffffffffffffffffffffff831661211d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f7a65726f20636f756e746572706172742061646472657373000000000000000060448201526064016106d7565b73ffffffffffffffffffffffffffffffffffffffff811661219a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f7a65726f206d657373656e67657220616464726573730000000000000000000060448201526064016106d7565b6121a2612901565b6121aa61299f565b6097805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255609980548484169216919091179055821615610982576098805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179055505050565b5f610dd3825490565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed6020526040902061228a9082612a3d565b156109d257604051339073ffffffffffffffffffffffffffffffffffffffff83169084907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b905f90a45050565b5f54610100900460ff1661236d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106d7565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117815560405133907fc36a428b063177e3f28b3b5d340c08f77827847b2ee30114ccf0c40e519c420a905f90a280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001781556124123390565b73ffffffffffffffffffffffffffffffffffffffff167fb2ed3603bd9051f0182ebfb75f12a21059b4d31b578a2a05c8d0245e9e2d320460405160405180910390a261247e7f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a86611d11565b6124a87f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d685611d11565b6124d27f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d84611d11565b6106527f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c83611d11565b6098545f9081906060903390819073ffffffffffffffffffffffffffffffffffffffff168190036125e6578580602001905181019061253b9190613686565b6040517fc52a3bbc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80841660048301528b81166024830152604482018b905291985091925083169063c52a3bbc906064016020604051808303815f875af11580156125bb573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125df91906135c9565b9650612737565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8a16906370a0823190602401602060405180830381865afa158015612650573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061267491906135c9565b905061269873ffffffffffffffffffffffffffffffffffffffff8a1683308b612a5e565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa158015612702573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061272691906135c9565b9050612732828261370e565b985050505b5f87116127a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f6465706f736974207a65726f20616d6f756e740000000000000000000000000060448201526064016106d7565b9795965093949350505050565b5f61280e826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612abc9092919063ffffffff16565b905080515f148061282e57508080602001905181019061282e9190613746565b610982576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016106d7565b5f610dd08373ffffffffffffffffffffffffffffffffffffffff8416612ad2565b5f825f0182815481106128f0576128f0613765565b905f5260205f200154905092915050565b5f54610100900460ff16612997576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106d7565b610b19612b1e565b5f54610100900460ff16612a35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106d7565b610b19612bb4565b5f610dd08373ffffffffffffffffffffffffffffffffffffffff8416612c53565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526111fc9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611c08565b6060612aca84845f85612d36565b949350505050565b5f818152600183016020526040812054612b1757508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610dd3565b505f610dd3565b5f54610100900460ff16611c8a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106d7565b5f54610100900460ff16612c4a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106d7565b610b1933611d94565b5f8181526001830160205260408120548015612d2d575f612c7560018361370e565b85549091505f90612c889060019061370e565b9050818114612ce7575f865f018281548110612ca657612ca6613765565b905f5260205f200154905080875f018481548110612cc657612cc6613765565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080612cf857612cf8613792565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610dd3565b5f915050610dd3565b606082471015612dc8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016106d7565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051612df091906137bf565b5f6040518083038185875af1925050503d805f8114612e2a576040519150601f19603f3d011682016040523d82523d5f602084013e612e2f565b606091505b5091509150612e4087838387612e4b565b979650505050505050565b60608315612ee05782515f03612ed95773ffffffffffffffffffffffffffffffffffffffff85163b612ed9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106d7565b5081612aca565b612aca8383815115612ef55781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d79190613674565b73ffffffffffffffffffffffffffffffffffffffff8116811461163c575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612fbe57612fbe612f4a565b604052919050565b5f67ffffffffffffffff821115612fdf57612fdf612f4a565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f83011261301a575f80fd5b813561302d61302882612fc6565b612f77565b818152846020838601011115613041575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f60a08688031215613071575f80fd5b853561307c81612f29565b9450602086013561308c81612f29565b935060408601359250606086013567ffffffffffffffff8111156130ae575f80fd5b6130ba8882890161300b565b95989497509295608001359392505050565b5f8083601f8401126130dc575f80fd5b50813567ffffffffffffffff8111156130f3575f80fd5b60208301915083602082850101111561310a575f80fd5b9250929050565b5f8060208385031215613122575f80fd5b823567ffffffffffffffff811115613138575f80fd5b613144858286016130cc565b90969095509350505050565b5f805f60608486031215613162575f80fd5b833561316d81612f29565b95602085013595506040909401359392505050565b5f8060408385031215613193575f80fd5b8235915060208301356131a581612f29565b809150509250929050565b5f805f805f805f60c0888a0312156131c6575f80fd5b87356131d181612f29565b965060208801356131e181612f29565b955060408801356131f181612f29565b9450606088013561320181612f29565b93506080880135925060a088013567ffffffffffffffff811115613223575f80fd5b61322f8a828b016130cc565b989b979a50959850939692959293505050565b5f8060408385031215613253575f80fd5b50508035926020909101359150565b5f805f60608486031215613274575f80fd5b833561327f81612f29565b9250602084013561328f81612f29565b9150604084013561329f81612f29565b809150509250925092565b5f602082840312156132ba575f80fd5b81356132c581612f29565b9392505050565b5f602082840312156132dc575f80fd5b5035919050565b5f805f80608085870312156132f6575f80fd5b843561330181612f29565b9350602085013561331181612f29565b93969395505050506040820135916060013590565b5f805f8060808587031215613339575f80fd5b843561334481612f29565b9350602085013561335481612f29565b9250604085013561336481612f29565b9150606085013561337481612f29565b939692955090935050565b5f6020828403121561338f575f80fd5b81516132c581612f29565b5f80858511156133a8575f80fd5b838611156133b4575f80fd5b5050820193919092039150565b7fffffffff0000000000000000000000000000000000000000000000000000000081358181169160048510156134015780818660040360031b1b83161692505b505092915050565b5f805f805f8060c0878903121561341e575f80fd5b863561342981612f29565b9550602087013561343981612f29565b9450604087013561344981612f29565b9350606087013561345981612f29565b92506080870135915060a087013567ffffffffffffffff81111561347b575f80fd5b61348789828a0161300b565b9150509295509295509295565b73ffffffffffffffffffffffffffffffffffffffff8516815283602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f5b8381101561351e578181015183820152602001613506565b50505f910152565b5f815180845261353d816020860160208601613504565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b5f73ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a08301526135bd60c0830184613526565b98975050505050505050565b5f602082840312156135d9575f80fd5b5051919050565b5f73ffffffffffffffffffffffffffffffffffffffff808816835286602084015260a0604084015261361560a0840187613526565b606084019590955292909216608090910152509392505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152608060408201525f6136636080830185613526565b905082606083015295945050505050565b602081525f610dd06020830184613526565b5f8060408385031215613697575f80fd5b82516136a281612f29565b602084015190925067ffffffffffffffff8111156136be575f80fd5b8301601f810185136136ce575f80fd5b80516136dc61302882612fc6565b8181528660208385010111156136f0575f80fd5b613701826020830160208601613504565b8093505050509250929050565b81810381811115610dd3577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f60208284031215613756575f80fd5b815180151581146132c5575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f82516137d0818460208701613504565b919091019291505056fea164736f6c6343000818000a" +var L1LidoGatewayDeployedBin = "0x6080604052600436106101d0575f3560e01c80639010d07c116100fd578063d547741f11610092578063f27ebced11610062578063f27ebced146105a8578063f2fde38b146105c7578063f887ea40146105e6578063fadcc54a14610612575f80fd5b8063d547741f1461052f578063e3b523e31461054e578063e8bac93b14610581578063f219fa6614610595575f80fd5b8063c01e1bd6116100cd578063c01e1bd61461049f578063c0c53b8b146104d2578063c676ad29146104f1578063ca15c87314610510575f80fd5b80639010d07c1461043957806391d1485414610458578063ac67e1af14610477578063ad960ce11461048b575f80fd5b80635e4c57a411610173578063797594b011610143578063797594b01461039d57806384bd13b0146103c95780638d7601c0146103dc5780638da5cb5b1461040f575f80fd5b80635e4c57a4146102f95780635ed2c2201461030d5780636f18bd2214610348578063715018a614610389575f80fd5b80632f2ff15d116101ae5780632f2ff15d1461020f5780633cb747bf1461022e57806356eff267146102845780635777bf50146102b7575f80fd5b80630aea8c26146101d457806314298c51146101e957806321425ee0146101fc575b5f80fd5b6101e76101e2366004613041565b610645565b005b6101e76101f73660046130f5565b610659565b6101e761020a366004613134565b610987565b34801561021a575f80fd5b506101e7610229366004613166565b6109c0565b348015610239575f80fd5b5060995461025a9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b34801561028f575f80fd5b5061025a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156102c2575f80fd5b507fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff165b604051901515815260200161027b565b348015610304575f80fd5b506101e76109d6565b348015610318575f80fd5b507fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff166102e9565b348015610353575f80fd5b5061037b7f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d681565b60405190815260200161027b565b348015610394575f80fd5b506101e7610b08565b3480156103a8575f80fd5b5060975461025a9073ffffffffffffffffffffffffffffffffffffffff1681565b6101e76103d7366004613194565b610b1b565b3480156103e7575f80fd5b5061037b7f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c81565b34801561041a575f80fd5b5060655473ffffffffffffffffffffffffffffffffffffffff1661025a565b348015610444575f80fd5b5061025a610453366004613226565b610d9a565b348015610463575f80fd5b506102e9610472366004613166565b610dd9565b348015610482575f80fd5b506101e7610e0f565b348015610496575f80fd5b506101e7610f3d565b3480156104aa575f80fd5b5061025a7f000000000000000000000000000000000000000000000000000000000000000081565b3480156104dd575f80fd5b506101e76104ec366004613246565b611070565b3480156104fc575f80fd5b5061025a61050b36600461328e565b611202565b34801561051b575f80fd5b5061037b61052a3660046132b0565b6112b1565b34801561053a575f80fd5b506101e7610549366004613166565b6112e6565b348015610559575f80fd5b5061037b7f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d81565b34801561058c575f80fd5b506101e76112f8565b6101e76105a33660046132c7565b611430565b3480156105b3575f80fd5b506101e76105c236600461330a565b61143c565b3480156105d2575f80fd5b506101e76105e136600461328e565b611588565b3480156105f1575f80fd5b5060985461025a9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561061d575f80fd5b5061037b7f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a81565b610652858585858561163f565b5050505050565b60995473ffffffffffffffffffffffffffffffffffffffff163381146106e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f6f6e6c79206d657373656e6765722063616e2063616c6c00000000000000000060448201526064015b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015610729573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061074d9190613363565b73ffffffffffffffffffffffffffffffffffffffff16736f297c61b5c92ef107ffd30cd56affe5a273e84173ffffffffffffffffffffffffffffffffffffffff16146107f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6f6e6c792063616c6c656420696e2064726f7020636f6e74657874000000000060448201526064016106d7565b6107fd611a69565b7f8431f5c10000000000000000000000000000000000000000000000000000000061082b60045f858761337e565b610834916133a5565b7fffffffff0000000000000000000000000000000000000000000000000000000016146108bd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f696e76616c69642073656c6563746f720000000000000000000000000000000060448201526064016106d7565b5f80806108cd856004818961337e565b8101906108da91906133ed565b5094505093505092506108ee838383611adc565b61090f73ffffffffffffffffffffffffffffffffffffffff84168383611b9a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fdbdf8eb487847e4c0f22847f5dac07f2d3690f96f581a6ae4b102769917645a88360405161096e91815260200190565b60405180910390a350505061098260018055565b505050565b6109828333845f5b6040519080825280601f01601f1916602001820160405280156109b9576020820181803683370190505b508561163f565b6109c8611c74565b6109d28282611cf5565b5050565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff1615610a32576040517f4f2c8be200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a5c7f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a33610dd9565b610a92576040517f3d39c5f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560405133907fc36a428b063177e3f28b3b5d340c08f77827847b2ee30114ccf0c40e519c420a905f90a2565b610b10611c74565b610b195f611d78565b565b60995473ffffffffffffffffffffffffffffffffffffffff16338114610b9d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f6f6e6c79206d657373656e6765722063616e2063616c6c00000000000000000060448201526064016106d7565b8073ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015610be6573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610c0a9190613363565b60975473ffffffffffffffffffffffffffffffffffffffff908116911614610c8e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6f6e6c792063616c6c20627920636f756e74657270617274000000000000000060448201526064016106d7565b610c96611a69565b610ca588888888888888611dee565b610cc673ffffffffffffffffffffffffffffffffffffffff89168686611b9a565b610d058584848080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250611f9d92505050565b8573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff167fc6f985873b37805705f6bce756dce3d1ff4b603e298d506288cce499926846a788888888604051610d7f9493929190613478565b60405180910390a4610d9060018055565b5050505050505050565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260408120610dd0908361204b565b90505b92915050565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260408120610dd09083612056565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff16610e6a576040517fa185a6b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e947f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d633610dd9565b610eca576040517fadd9524c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560405133907f9ca4d309bbfd23c65db3dc38c1712862f5812c7139937e2655de86e803f73bb9905f90a2565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff16610f9d576040517f77d195b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fc77f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c33610dd9565b610ffd576040517f9e60ca7e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405133907f644eeba8ede48fefc32ada09fb240c5f6c0f06507ab1d296d5af41f1521d9fcb905f90a2565b5f54610100900460ff161580801561108e57505f54600160ff909116105b806110a75750303b1580156110a757505f5460ff166001145b611133576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016106d7565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561118f575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b61119a848484612084565b80156111fc575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b5f817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611289576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b507f000000000000000000000000000000000000000000000000000000000000000092915050565b5f8181527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260408120610dd39061222f565b6112ee611c74565b6109d28282612238565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff1615611359576040517ff74ad25400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113837f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d33610dd9565b6113b9576040517f5c16894300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560405133907fb2ed3603bd9051f0182ebfb75f12a21059b4d31b578a2a05c8d0245e9e2d3204905f90a2565b6111fc8484845f61098f565b5f54600290610100900460ff1615801561145c57505f5460ff8083169116105b6114e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016106d7565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055611524858585856122bb565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b611590611c74565b73ffffffffffffffffffffffffffffffffffffffff8116611633576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016106d7565b61163c81611d78565b50565b611647611a69565b847f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146116cd576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff811661171b576040517fef6b416200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff16611776576040517fa185a6b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845f036117af576040517f14fc8bd900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f6117bb8887876124e0565b80519198509650909150156117fc576040517fb286dd6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f0000000000000000000000000000000000000000000000000000000000000000905f9061183b908b90849086908d908d908d90602401613553565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f8431f5c10000000000000000000000000000000000000000000000000000000017905260995482517fecc7042800000000000000000000000000000000000000000000000000000000815292519394505f9373ffffffffffffffffffffffffffffffffffffffff9091169263ecc704289260048083019391928290030181865afa15801561191f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061194391906135ad565b6099546097546040517f5f7b157700000000000000000000000000000000000000000000000000000000815292935073ffffffffffffffffffffffffffffffffffffffff91821692635f7b15779234926119aa929116905f9088908e908c906004016135c4565b5f604051808303818588803b1580156119c1575f80fd5b505af11580156119d3573d5f803e3d5ffd5b50505050508373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff168c73ffffffffffffffffffffffffffffffffffffffff167f1a6c38816de45937fd5cd974f9694fe10e64163ba12a92abf0f4b6b23ad886728d8d8d87604051611a529493929190613613565b60405180910390a450505050505061065260018055565b600260015403611ad5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106d7565b6002600155565b827f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611b62576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b34156111fc576040517f3ddcf11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60405173ffffffffffffffffffffffffffffffffffffffff83166024820152604481018290526109829084907fa9059cbb00000000000000000000000000000000000000000000000000000000906064015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612791565b60018055565b60655473ffffffffffffffffffffffffffffffffffffffff163314610b19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106d7565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260409020611d2b908261289e565b156109d257604051339073ffffffffffffffffffffffffffffffffffffffff83169084907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d905f90a45050565b6065805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b867f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611e74576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b867f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611efa576040517f6251ce6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff16611f5a576040517f77d195b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3415611f92576040517f3ddcf11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505050505050505050565b5f8151118015611fc357505f8273ffffffffffffffffffffffffffffffffffffffff163b115b156109d2576040517f444b281f00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83169063444b281f9061201a908490600401613658565b5f604051808303815f87803b158015612031575f80fd5b505af1158015612043573d5f803e3d5ffd5b505050505050565b5f610dd083836128bf565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526001830160205260408120541515610dd0565b73ffffffffffffffffffffffffffffffffffffffff8316612101576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f7a65726f20636f756e746572706172742061646472657373000000000000000060448201526064016106d7565b73ffffffffffffffffffffffffffffffffffffffff811661217e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f7a65726f206d657373656e67657220616464726573730000000000000000000060448201526064016106d7565b6121866128e5565b61218e612983565b6097805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255609980548484169216919091179055821615610982576098805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179055505050565b5f610dd3825490565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed6020526040902061226e9082612a21565b156109d257604051339073ffffffffffffffffffffffffffffffffffffffff83169084907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b905f90a45050565b5f54610100900460ff16612351576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106d7565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117815560405133907fc36a428b063177e3f28b3b5d340c08f77827847b2ee30114ccf0c40e519c420a905f90a280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001781556123f63390565b73ffffffffffffffffffffffffffffffffffffffff167fb2ed3603bd9051f0182ebfb75f12a21059b4d31b578a2a05c8d0245e9e2d320460405160405180910390a26124627f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a86611cf5565b61248c7f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d685611cf5565b6124b67f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d84611cf5565b6106527f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c83611cf5565b6098545f9081906060903390819073ffffffffffffffffffffffffffffffffffffffff168190036125ca578580602001905181019061251f919061366a565b6040517fc52a3bbc00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff80841660048301528b81166024830152604482018b905291985091925083169063c52a3bbc906064016020604051808303815f875af115801561259f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906125c391906135ad565b965061271b565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8a16906370a0823190602401602060405180830381865afa158015612634573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061265891906135ad565b905061267c73ffffffffffffffffffffffffffffffffffffffff8a1683308b612a42565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f9073ffffffffffffffffffffffffffffffffffffffff8b16906370a0823190602401602060405180830381865afa1580156126e6573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061270a91906135ad565b905061271682826136f2565b985050505b5f8711612784576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f6465706f736974207a65726f20616d6f756e740000000000000000000000000060448201526064016106d7565b9795965093949350505050565b5f6127f2826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c65648152508573ffffffffffffffffffffffffffffffffffffffff16612aa09092919063ffffffff16565b905080515f1480612812575080806020019051810190612812919061372a565b610982576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e60448201527f6f7420737563636565640000000000000000000000000000000000000000000060648201526084016106d7565b5f610dd08373ffffffffffffffffffffffffffffffffffffffff8416612ab6565b5f825f0182815481106128d4576128d4613749565b905f5260205f200154905092915050565b5f54610100900460ff1661297b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106d7565b610b19612b02565b5f54610100900460ff16612a19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106d7565b610b19612b98565b5f610dd08373ffffffffffffffffffffffffffffffffffffffff8416612c37565b60405173ffffffffffffffffffffffffffffffffffffffff808516602483015283166044820152606481018290526111fc9085907f23b872dd0000000000000000000000000000000000000000000000000000000090608401611bec565b6060612aae84845f85612d1a565b949350505050565b5f818152600183016020526040812054612afb57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610dd3565b505f610dd3565b5f54610100900460ff16611c6e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106d7565b5f54610100900460ff16612c2e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016106d7565b610b1933611d78565b5f8181526001830160205260408120548015612d11575f612c596001836136f2565b85549091505f90612c6c906001906136f2565b9050818114612ccb575f865f018281548110612c8a57612c8a613749565b905f5260205f200154905080875f018481548110612caa57612caa613749565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080612cdc57612cdc613776565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610dd3565b5f915050610dd3565b606082471015612dac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f416464726573733a20696e73756666696369656e742062616c616e636520666f60448201527f722063616c6c000000000000000000000000000000000000000000000000000060648201526084016106d7565b5f808673ffffffffffffffffffffffffffffffffffffffff168587604051612dd491906137a3565b5f6040518083038185875af1925050503d805f8114612e0e576040519150601f19603f3d011682016040523d82523d5f602084013e612e13565b606091505b5091509150612e2487838387612e2f565b979650505050505050565b60608315612ec45782515f03612ebd5773ffffffffffffffffffffffffffffffffffffffff85163b612ebd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016106d7565b5081612aae565b612aae8383815115612ed95781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d79190613658565b73ffffffffffffffffffffffffffffffffffffffff8116811461163c575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612fa257612fa2612f2e565b604052919050565b5f67ffffffffffffffff821115612fc357612fc3612f2e565b50601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01660200190565b5f82601f830112612ffe575f80fd5b813561301161300c82612faa565b612f5b565b818152846020838601011115613025575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f805f60a08688031215613055575f80fd5b853561306081612f0d565b9450602086013561307081612f0d565b935060408601359250606086013567ffffffffffffffff811115613092575f80fd5b61309e88828901612fef565b95989497509295608001359392505050565b5f8083601f8401126130c0575f80fd5b50813567ffffffffffffffff8111156130d7575f80fd5b6020830191508360208285010111156130ee575f80fd5b9250929050565b5f8060208385031215613106575f80fd5b823567ffffffffffffffff81111561311c575f80fd5b613128858286016130b0565b90969095509350505050565b5f805f60608486031215613146575f80fd5b833561315181612f0d565b95602085013595506040909401359392505050565b5f8060408385031215613177575f80fd5b82359150602083013561318981612f0d565b809150509250929050565b5f805f805f805f60c0888a0312156131aa575f80fd5b87356131b581612f0d565b965060208801356131c581612f0d565b955060408801356131d581612f0d565b945060608801356131e581612f0d565b93506080880135925060a088013567ffffffffffffffff811115613207575f80fd5b6132138a828b016130b0565b989b979a50959850939692959293505050565b5f8060408385031215613237575f80fd5b50508035926020909101359150565b5f805f60608486031215613258575f80fd5b833561326381612f0d565b9250602084013561327381612f0d565b9150604084013561328381612f0d565b809150509250925092565b5f6020828403121561329e575f80fd5b81356132a981612f0d565b9392505050565b5f602082840312156132c0575f80fd5b5035919050565b5f805f80608085870312156132da575f80fd5b84356132e581612f0d565b935060208501356132f581612f0d565b93969395505050506040820135916060013590565b5f805f806080858703121561331d575f80fd5b843561332881612f0d565b9350602085013561333881612f0d565b9250604085013561334881612f0d565b9150606085013561335881612f0d565b939692955090935050565b5f60208284031215613373575f80fd5b81516132a981612f0d565b5f808585111561338c575f80fd5b83861115613398575f80fd5b5050820193919092039150565b7fffffffff0000000000000000000000000000000000000000000000000000000081358181169160048510156133e55780818660040360031b1b83161692505b505092915050565b5f805f805f8060c08789031215613402575f80fd5b863561340d81612f0d565b9550602087013561341d81612f0d565b9450604087013561342d81612f0d565b9350606087013561343d81612f0d565b92506080870135915060a087013567ffffffffffffffff81111561345f575f80fd5b61346b89828a01612fef565b9150509295509295509295565b73ffffffffffffffffffffffffffffffffffffffff8516815283602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f5b838110156135025781810151838201526020016134ea565b50505f910152565b5f81518084526135218160208601602086016134e8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b5f73ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a08301526135a160c083018461350a565b98975050505050505050565b5f602082840312156135bd575f80fd5b5051919050565b5f73ffffffffffffffffffffffffffffffffffffffff808816835286602084015260a060408401526135f960a084018761350a565b606084019590955292909216608090910152509392505050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152608060408201525f613647608083018561350a565b905082606083015295945050505050565b602081525f610dd0602083018461350a565b5f806040838503121561367b575f80fd5b825161368681612f0d565b602084015190925067ffffffffffffffff8111156136a2575f80fd5b8301601f810185136136b2575f80fd5b80516136c061300c82612faa565b8181528660208385010111156136d4575f80fd5b6136e58260208301602086016134e8565b8093505050509250929050565b81810381811115610dd3577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f6020828403121561373a575f80fd5b815180151581146132a9575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b5f82516137b48184602087016134e8565b919091019291505056fea164736f6c6343000818000a" func init() { if err := json.Unmarshal([]byte(L1LidoGatewayStorageLayoutJSON), L1LidoGatewayStorageLayout); err != nil { diff --git a/bindings/bindings/l1messagequeuewithgaspriceoracle.go b/bindings/bindings/l1messagequeuewithgaspriceoracle.go index 966fbf65..fca2a862 100644 --- a/bindings/bindings/l1messagequeuewithgaspriceoracle.go +++ b/bindings/bindings/l1messagequeuewithgaspriceoracle.go @@ -31,8 +31,8 @@ var ( // L1MessageQueueWithGasPriceOracleMetaData contains all meta data concerning the L1MessageQueueWithGasPriceOracle contract. var L1MessageQueueWithGasPriceOracleMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_messenger\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_rollup\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_enforcedTxGateway\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ErrZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"count\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"skippedBitmap\",\"type\":\"uint256\"}],\"name\":\"DequeueTransaction\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"DropTransaction\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"queueIndex\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"QueueTransaction\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_oldGateway\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_newGateway\",\"type\":\"address\"}],\"name\":\"UpdateEnforcedTxGateway\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_oldGasOracle\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_newGasOracle\",\"type\":\"address\"}],\"name\":\"UpdateGasOracle\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldL2BaseFee\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newL2BaseFee\",\"type\":\"uint256\"}],\"name\":\"UpdateL2BaseFee\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_oldMaxGasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_newMaxGasLimit\",\"type\":\"uint256\"}],\"name\":\"UpdateMaxGasLimit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_oldWhitelistChecker\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_newWhitelistChecker\",\"type\":\"address\"}],\"name\":\"UpdateWhitelistChecker\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ENFORCED_TX_GATEWAAY\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MESSENGER\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ROLLUP_CONTRACT\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"appendCrossDomainMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"appendEnforcedTransaction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_calldata\",\"type\":\"bytes\"}],\"name\":\"calculateIntrinsicGasFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"computeTransactionHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"dropCrossDomainMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"}],\"name\":\"estimateCrossDomainMessageFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"}],\"name\":\"getCrossDomainMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_maxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_whitelistChecker\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"}],\"name\":\"isMessageDropped\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"}],\"name\":\"isMessageSkipped\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2BaseFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"messageQueue\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nextCrossDomainMessageIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingQueueIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_startIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_count\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_skippedBitmap\",\"type\":\"uint256\"}],\"name\":\"popCrossDomainMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newL2BaseFee\",\"type\":\"uint256\"}],\"name\":\"setL2BaseFee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newMaxGasLimit\",\"type\":\"uint256\"}],\"name\":\"updateMaxGasLimit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newWhitelistChecker\",\"type\":\"address\"}],\"name\":\"updateWhitelistChecker\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"whitelistChecker\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x60e060405234801562000010575f80fd5b5060405162001aad38038062001aad833981016040819052620000339162000185565b6001600160a01b03831615806200005157506001600160a01b038216155b806200006457506001600160a01b038116155b156200008357604051630ecc6fdf60e41b815260040160405180910390fd5b6200008d620000ab565b6001600160a01b0392831660805290821660a0521660c052620001cc565b5f54610100900460ff1615620001175760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161462000167575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b80516001600160a01b038116811462000180575f80fd5b919050565b5f805f6060848603121562000198575f80fd5b620001a38462000169565b9250620001b36020850162000169565b9150620001c36040850162000169565b90509250925092565b60805160a05160c05161189a620002135f395f818161036f0152610d5a01525f8181610269015261052401525f81816102e6015281816109e30152610c02015261189a5ff3fe608060405234801561000f575f80fd5b50600436106101a5575f3560e01c80639b159782116100e8578063d5ad4a9711610093578063e172d3a11161006e578063e172d3a1146103ca578063e3176bd5146103e4578063f2fde38b146103ed578063fd0ad31e14610400575f80fd5b8063d5ad4a9714610391578063d99bc80e146103a4578063da35a26f146103b7575f80fd5b8063bb7862ca116100c3578063bb7862ca14610337578063bdc6f0a014610357578063c27606771461036a575f80fd5b80639b15978214610308578063a85006ca1461031b578063ae453cd514610324575f80fd5b80635f9cd92e116101535780638770d7071161012e5780638770d707146102645780638da5cb5b146102b057806391652461146102ce578063927ede2d146102e1575f80fd5b80635f9cd92e14610236578063715018a6146102495780637d82191a14610251575f80fd5b806355f613ce1161018357806355f613ce146102055780635ad9945a1461021a5780635e45da231461022d575f80fd5b806329aa604b146101a95780633e4cbbe6146101cf5780633e6dada1146101e2575b5f80fd5b6101bc6101b73660046114fc565b610408565b6040519081526020015b60405180910390f35b6101bc6101dd366004611536565b610427565b6101f56101f03660046114fc565b6104db565b60405190151581526020016101c6565b61021861021336600461155e565b610521565b005b6101bc6102283660046115cc565b610715565b6101bc60685481565b610218610244366004611648565b610905565b61021861099a565b6101f561025f3660046114fc565b6109ad565b61028b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c6565b60335473ffffffffffffffffffffffffffffffffffffffff1661028b565b6102186102dc3660046114fc565b6109e0565b61028b7f000000000000000000000000000000000000000000000000000000000000000081565b610218610316366004611661565b610bff565b6101bc60675481565b6101bc6103323660046114fc565b610ce1565b606b5461028b9073ffffffffffffffffffffffffffffffffffffffff1681565b6102186103653660046116b7565b610d57565b61028b7f000000000000000000000000000000000000000000000000000000000000000081565b61021861039f3660046114fc565b610e88565b6102186103b23660046114fc565b610ed6565b6102186103c536600461172a565b610f1c565b6101bc6103d8366004611754565b60100261520801919050565b6101bc60655481565b6102186103fb366004611648565b6110d1565b6066546101bc565b60668181548110610417575f80fd5b5f91825260209091200154905081565b606b546040517fefc7840100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301525f92169063efc7840190602401602060405180830381865afa158015610495573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104b99190611793565b156104c557505f6104d5565b6065546104d290836117b9565b90505b92915050565b600881901c5f908152606a6020526040812054600160ff84161b16151580156104d55750600882901c5f90815260696020526040902054600160ff84161b1615156104d5565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146105ab5760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c792063616c6c61626c652062792074686520726f6c6c7570000000000060448201526064015b60405180910390fd5b6101008211156105fd5760405162461bcd60e51b815260206004820152601560248201527f706f7020746f6f206d616e79206d65737361676573000000000000000000000060448201526064016105a2565b826067541461064e5760405162461bcd60e51b815260206004820152601460248201527f737461727420696e646578206d69736d6174636800000000000000000000000060448201526064016105a2565b600883901c5f818152606a6020526040902080546001851b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0193841660ff871681811b9092179092559092919061010081860111156106c557600182015f908152606a6020526040902061010082900385901c90555b50505081830160675560408051848152602081018490529081018290527fc77f792f838ae38399ac31acc3348389aeb110ce7bedf3cfdbdd5e6679267970906060015b60405180910390a1505050565b5f607e816107bf565b5f8161072c57506001919050565b5b81156107425760089190911c9060010161072d565b919050565b80608083106001811461077f5761075d8461071e565b60808101835360018301925084816020036008021b83528083019250506107a0565b848415166001811461079357848353610798565b608083535b506001820191505b509392505050565b806094815360609290921b60018301525060150190565b600560405101806107d260018c83610747565b90506107e060018983610747565b90506107ec89826107a8565b90506107fa60018b83610747565b905060018614600181146108625760388710600181146108475761081d8861071e565b8060b701845360018401935088816020036008021b8452808401935050878984379187019161085c565b87608001835360018301925087898437918701915b50610873565b6108705f89355f1a84610747565b91505b5061087e8c826107a8565b90508181035f8060388310600181146108b15761089a8461071e565b60f78101600882021b8517935060010191506108bc565b8360c0019250600191505b5086816008021b821791506001810190508060080292508451831c8284610100031b17915080850394505080845250508181038220925050508092505050979650505050505050565b61090d61116e565b606b5460405173ffffffffffffffffffffffffffffffffffffffff8084169216907ff91b2a410a89d46f14ee984a57e6d7892c217f116905371180998e20cef237e5905f90a3606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6109a261116e565b6109ab5f6111d5565b565b5f60675482106109be57505f919050565b600882901c5f908152606a6020526040902054600160ff84161b1615156104d5565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610a8b5760405162461bcd60e51b815260206004820152602b60248201527f4f6e6c792063616c6c61626c6520627920746865204c3143726f7373446f6d6160448201527f696e4d657373656e67657200000000000000000000000000000000000000000060648201526084016105a2565b6067548110610adc5760405162461bcd60e51b815260206004820152601b60248201527f63616e6e6f742064726f702070656e64696e67206d657373616765000000000060448201526064016105a2565b600881901c5f908152606a6020526040902054600160ff83161b16610b435760405162461bcd60e51b815260206004820152601860248201527f64726f70206e6f6e2d736b6970706564206d657373616765000000000000000060448201526064016105a2565b600881901c5f90815260696020526040902054600160ff83161b1615610bab5760405162461bcd60e51b815260206004820152601760248201527f6d65737361676520616c72656164792064726f7070656400000000000000000060448201526064016105a2565b600881901c5f9081526069602052604090208054600160ff84161b1790556040518181527f43a375005206d20a83abc71722cba68c24434a8dc1f583775be7c3fde0396cbf9060200160405180910390a150565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610caa5760405162461bcd60e51b815260206004820152602b60248201527f4f6e6c792063616c6c61626c6520627920746865204c3143726f7373446f6d6160448201527f696e4d657373656e67657200000000000000000000000000000000000000000060648201526084016105a2565b610cb583838361124b565b3373111100000000000000000000000000000000111101610cda81865f878787611347565b5050505050565b6066545f908210610d345760405162461bcd60e51b815260206004820152601a60248201527f6d65737361676520696e646578206f7574206f662072616e676500000000000060448201526064016105a2565b60668281548110610d4757610d476117f5565b905f5260205f2001549050919050565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610e025760405162461bcd60e51b815260206004820152602660248201527f4f6e6c792063616c6c61626c652062792074686520456e666f7263656454784760448201527f617465776179000000000000000000000000000000000000000000000000000060648201526084016105a2565b73ffffffffffffffffffffffffffffffffffffffff86163b15610e675760405162461bcd60e51b815260206004820152600860248201527f6f6e6c7920454f4100000000000000000000000000000000000000000000000060448201526064016105a2565b610e7283838361124b565b610e80868686868686611347565b505050505050565b610e9061116e565b606880549082905560408051828152602081018490527fa030881e03ff723954dd0d35500564afab9603555d09d4456a32436f2b2373c591015b60405180910390a15050565b610ede61116e565b606580549082905560408051828152602081018490527fc5271ba80b67178cc31f04a3755325121400925878dc608432b6fcaead3663299101610eca565b5f54610100900460ff1615808015610f3a57505f54600160ff909116105b80610f535750303b158015610f5357505f5460ff166001145b610fc55760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105a2565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611021575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6110296113f8565b6068839055606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff841617905580156110cc575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001610708565b505050565b6110d961116e565b73ffffffffffffffffffffffffffffffffffffffff81166111625760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016105a2565b61116b816111d5565b50565b60335473ffffffffffffffffffffffffffffffffffffffff1633146109ab5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105a2565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6068548311156112c35760405162461bcd60e51b815260206004820152602560248201527f476173206c696d6974206d757374206e6f7420657863656564206d617847617360448201527f4c696d697400000000000000000000000000000000000000000000000000000060648201526084016105a2565b6010810261520801808410156113415760405162461bcd60e51b815260206004820152603360248201527f496e73756666696369656e7420676173206c696d69742c206d7573742062652060448201527f61626f766520696e7472696e736963206761730000000000000000000000000060648201526084016105a2565b50505050565b6066545f61135a8883888a898989610715565b606680546001810182555f919091527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e943540181905560405190915073ffffffffffffffffffffffffffffffffffffffff80891691908a16907f69cfcb8e6d4192b8aba9902243912587f37e550d75c1fa801491fce26717f37e906113e6908a9087908b908b908b90611822565b60405180910390a35050505050505050565b5f54610100900460ff166114745760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105a2565b6109ab5f54610100900460ff166114f35760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105a2565b6109ab336111d5565b5f6020828403121561150c575f80fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610742575f80fd5b5f8060408385031215611547575f80fd5b61155083611513565b946020939093013593505050565b5f805f60608486031215611570575f80fd5b505081359360208301359350604090920135919050565b5f8083601f840112611597575f80fd5b50813567ffffffffffffffff8111156115ae575f80fd5b6020830191508360208285010111156115c5575f80fd5b9250929050565b5f805f805f805f60c0888a0312156115e2575f80fd5b6115eb88611513565b9650602088013595506040880135945061160760608901611513565b93506080880135925060a088013567ffffffffffffffff811115611629575f80fd5b6116358a828b01611587565b989b979a50959850939692959293505050565b5f60208284031215611658575f80fd5b6104d282611513565b5f805f8060608587031215611674575f80fd5b61167d85611513565b935060208501359250604085013567ffffffffffffffff81111561169f575f80fd5b6116ab87828801611587565b95989497509550505050565b5f805f805f8060a087890312156116cc575f80fd5b6116d587611513565b95506116e360208801611513565b94506040870135935060608701359250608087013567ffffffffffffffff81111561170c575f80fd5b61171889828a01611587565b979a9699509497509295939492505050565b5f806040838503121561173b575f80fd5b8235915061174b60208401611513565b90509250929050565b5f8060208385031215611765575f80fd5b823567ffffffffffffffff81111561177b575f80fd5b61178785828601611587565b90969095509350505050565b5f602082840312156117a3575f80fd5b815180151581146117b2575f80fd5b9392505050565b80820281158282048414176104d5577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b85815267ffffffffffffffff8516602082015283604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010194935050505056fea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_messenger\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_rollup\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_enforcedTxGateway\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ErrZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"count\",\"type\":\"uint256\"}],\"name\":\"DequeueTransaction\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"target\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint64\",\"name\":\"queueIndex\",\"type\":\"uint64\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"gasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"QueueTransaction\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_oldGateway\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_newGateway\",\"type\":\"address\"}],\"name\":\"UpdateEnforcedTxGateway\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_oldGasOracle\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_newGasOracle\",\"type\":\"address\"}],\"name\":\"UpdateGasOracle\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldL2BaseFee\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newL2BaseFee\",\"type\":\"uint256\"}],\"name\":\"UpdateL2BaseFee\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_oldMaxGasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"_newMaxGasLimit\",\"type\":\"uint256\"}],\"name\":\"UpdateMaxGasLimit\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_oldWhitelistChecker\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_newWhitelistChecker\",\"type\":\"address\"}],\"name\":\"UpdateWhitelistChecker\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ENFORCED_TX_GATEWAAY\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MESSENGER\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ROLLUP_CONTRACT\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"appendCrossDomainMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"appendEnforcedTransaction\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_calldata\",\"type\":\"bytes\"}],\"name\":\"calculateIntrinsicGasFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_target\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"computeTransactionHash\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_sender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"}],\"name\":\"estimateCrossDomainMessageFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_queueIndex\",\"type\":\"uint256\"}],\"name\":\"getCrossDomainMessage\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_maxGasLimit\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"_whitelistChecker\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2BaseFee\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxGasLimit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"messageQueue\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nextCrossDomainMessageIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"pendingQueueIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_startIndex\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_count\",\"type\":\"uint256\"}],\"name\":\"popCrossDomainMessage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newL2BaseFee\",\"type\":\"uint256\"}],\"name\":\"setL2BaseFee\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newMaxGasLimit\",\"type\":\"uint256\"}],\"name\":\"updateMaxGasLimit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newWhitelistChecker\",\"type\":\"address\"}],\"name\":\"updateWhitelistChecker\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"whitelistChecker\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + Bin: "0x60e060405234801562000010575f80fd5b506040516200171438038062001714833981016040819052620000339162000185565b6001600160a01b03831615806200005157506001600160a01b038216155b806200006457506001600160a01b038116155b156200008357604051630ecc6fdf60e41b815260040160405180910390fd5b6200008d620000ab565b6001600160a01b0392831660805290821660a0521660c052620001cc565b5f54610100900460ff1615620001175760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161462000167575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b80516001600160a01b038116811462000180575f80fd5b919050565b5f805f6060848603121562000198575f80fd5b620001a38462000169565b9250620001b36020850162000169565b9150620001c36040850162000169565b90509250925092565b60805160a05160c0516115086200020c5f395f818161030501526109d501525f818161021201526103c001525f818161027c015261087d01526115085ff3fe608060405234801561000f575f80fd5b5060043610610184575f3560e01c8063a85006ca116100dd578063d99bc80e11610088578063e3176bd511610063578063e3176bd51461037a578063f2fde38b14610383578063fd0ad31e14610396575f80fd5b8063d99bc80e1461033a578063da35a26f1461034d578063e172d3a114610360575f80fd5b8063bdc6f0a0116100b8578063bdc6f0a0146102ed578063c276067714610300578063d5ad4a9714610327575f80fd5b8063a85006ca146102b1578063ae453cd5146102ba578063bb7862ca146102cd575f80fd5b80635f9cd92e1161013d5780638da5cb5b116101185780638da5cb5b14610259578063927ede2d146102775780639b1597821461029e575f80fd5b80635f9cd92e146101f2578063715018a6146102055780638770d7071461020d575f80fd5b80633e4cbbe61161016d5780633e4cbbe6146101c35780635ad9945a146101d65780635e45da23146101e9575f80fd5b806329aa604b146101885780633c7f5283146101ae575b5f80fd5b61019b610196366004611173565b61039e565b6040519081526020015b60405180910390f35b6101c16101bc36600461118a565b6103bd565b005b61019b6101d13660046111cd565b61052e565b61019b6101e436600461123a565b6105e2565b61019b60685481565b6101c16102003660046112b6565b6107d2565b6101c1610867565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a5565b60335473ffffffffffffffffffffffffffffffffffffffff16610234565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b6101c16102ac3660046112cf565b61087a565b61019b60675481565b61019b6102c8366004611173565b61095c565b606b546102349073ffffffffffffffffffffffffffffffffffffffff1681565b6101c16102fb366004611325565b6109d2565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b6101c1610335366004611173565b610b03565b6101c1610348366004611173565b610b49565b6101c161035b366004611398565b610b8f565b61019b61036e3660046113c2565b60100261520801919050565b61019b60655481565b6101c16103913660046112b6565b610d48565b60665461019b565b606681815481106103ad575f80fd5b5f91825260209091200154905081565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146104475760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c792063616c6c61626c652062792074686520726f6c6c7570000000000060448201526064015b60405180910390fd5b6101008111156104995760405162461bcd60e51b815260206004820152601560248201527f706f7020746f6f206d616e79206d657373616765730000000000000000000000604482015260640161043e565b81606754146104ea5760405162461bcd60e51b815260206004820152601460248201527f737461727420696e646578206d69736d61746368000000000000000000000000604482015260640161043e565b80820160675560408051838152602081018390527f3d48b97f20730c965868963266b0d25d8abe3f06babb60fc3b2b80c9e8907f2691015b60405180910390a15050565b606b546040517fefc7840100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301525f92169063efc7840190602401602060405180830381865afa15801561059c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105c09190611401565b156105cc57505f6105dc565b6065546105d99083611427565b90505b92915050565b5f607e8161068c565b5f816105f957506001919050565b5b811561060f5760089190911c906001016105fa565b919050565b80608083106001811461064c5761062a846105eb565b60808101835360018301925084816020036008021b835280830192505061066d565b848415166001811461066057848353610665565b608083535b506001820191505b509392505050565b806094815360609290921b60018301525060150190565b6005604051018061069f60018c83610614565b90506106ad60018983610614565b90506106b98982610675565b90506106c760018b83610614565b9050600186146001811461072f576038871060018114610714576106ea886105eb565b8060b701845360018401935088816020036008021b84528084019350508789843791870191610729565b87608001835360018301925087898437918701915b50610740565b61073d5f89355f1a84610614565b91505b5061074b8c82610675565b90508181035f80603883106001811461077e57610767846105eb565b60f78101600882021b851793506001019150610789565b8360c0019250600191505b5086816008021b821791506001810190508060080292508451831c8284610100031b17915080850394505080845250508181038220925050508092505050979650505050505050565b6107da610de5565b606b5460405173ffffffffffffffffffffffffffffffffffffffff8084169216907ff91b2a410a89d46f14ee984a57e6d7892c217f116905371180998e20cef237e5905f90a3606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b61086f610de5565b6108785f610e4c565b565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146109255760405162461bcd60e51b815260206004820152602b60248201527f4f6e6c792063616c6c61626c6520627920746865204c3143726f7373446f6d6160448201527f696e4d657373656e676572000000000000000000000000000000000000000000606482015260840161043e565b610930838383610ec2565b337311110000000000000000000000000000000011110161095581865f878787610fbe565b5050505050565b6066545f9082106109af5760405162461bcd60e51b815260206004820152601a60248201527f6d65737361676520696e646578206f7574206f662072616e6765000000000000604482015260640161043e565b606682815481106109c2576109c2611463565b905f5260205f2001549050919050565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610a7d5760405162461bcd60e51b815260206004820152602660248201527f4f6e6c792063616c6c61626c652062792074686520456e666f7263656454784760448201527f6174657761790000000000000000000000000000000000000000000000000000606482015260840161043e565b73ffffffffffffffffffffffffffffffffffffffff86163b15610ae25760405162461bcd60e51b815260206004820152600860248201527f6f6e6c7920454f41000000000000000000000000000000000000000000000000604482015260640161043e565b610aed838383610ec2565b610afb868686868686610fbe565b505050505050565b610b0b610de5565b606880549082905560408051828152602081018490527fa030881e03ff723954dd0d35500564afab9603555d09d4456a32436f2b2373c59101610522565b610b51610de5565b606580549082905560408051828152602081018490527fc5271ba80b67178cc31f04a3755325121400925878dc608432b6fcaead3663299101610522565b5f54610100900460ff1615808015610bad57505f54600160ff909116105b80610bc65750303b158015610bc657505f5460ff166001145b610c385760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161043e565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610c94575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610c9c61106f565b6068839055606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790558015610d43575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610d50610de5565b73ffffffffffffffffffffffffffffffffffffffff8116610dd95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161043e565b610de281610e4c565b50565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108785760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161043e565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b606854831115610f3a5760405162461bcd60e51b815260206004820152602560248201527f476173206c696d6974206d757374206e6f7420657863656564206d617847617360448201527f4c696d6974000000000000000000000000000000000000000000000000000000606482015260840161043e565b601081026152080180841015610fb85760405162461bcd60e51b815260206004820152603360248201527f496e73756666696369656e7420676173206c696d69742c206d7573742062652060448201527f61626f766520696e7472696e7369632067617300000000000000000000000000606482015260840161043e565b50505050565b6066545f610fd18883888a8989896105e2565b606680546001810182555f919091527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e943540181905560405190915073ffffffffffffffffffffffffffffffffffffffff80891691908a16907f69cfcb8e6d4192b8aba9902243912587f37e550d75c1fa801491fce26717f37e9061105d908a9087908b908b908b90611490565b60405180910390a35050505050505050565b5f54610100900460ff166110eb5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161043e565b6108785f54610100900460ff1661116a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161043e565b61087833610e4c565b5f60208284031215611183575f80fd5b5035919050565b5f806040838503121561119b575f80fd5b50508035926020909101359150565b803573ffffffffffffffffffffffffffffffffffffffff8116811461060f575f80fd5b5f80604083850312156111de575f80fd5b6111e7836111aa565b946020939093013593505050565b5f8083601f840112611205575f80fd5b50813567ffffffffffffffff81111561121c575f80fd5b602083019150836020828501011115611233575f80fd5b9250929050565b5f805f805f805f60c0888a031215611250575f80fd5b611259886111aa565b96506020880135955060408801359450611275606089016111aa565b93506080880135925060a088013567ffffffffffffffff811115611297575f80fd5b6112a38a828b016111f5565b989b979a50959850939692959293505050565b5f602082840312156112c6575f80fd5b6105d9826111aa565b5f805f80606085870312156112e2575f80fd5b6112eb856111aa565b935060208501359250604085013567ffffffffffffffff81111561130d575f80fd5b611319878288016111f5565b95989497509550505050565b5f805f805f8060a0878903121561133a575f80fd5b611343876111aa565b9550611351602088016111aa565b94506040870135935060608701359250608087013567ffffffffffffffff81111561137a575f80fd5b61138689828a016111f5565b979a9699509497509295939492505050565b5f80604083850312156113a9575f80fd5b823591506113b9602084016111aa565b90509250929050565b5f80602083850312156113d3575f80fd5b823567ffffffffffffffff8111156113e9575f80fd5b6113f5858286016111f5565b90969095509350505050565b5f60208284031215611411575f80fd5b81518015158114611420575f80fd5b9392505050565b80820281158282048414176105dc577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b85815267ffffffffffffffff8516602082015283604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010194935050505056fea164736f6c6343000818000a", } // L1MessageQueueWithGasPriceOracleABI is the input ABI used to generate the binding from. @@ -419,68 +419,6 @@ func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleCallerS return _L1MessageQueueWithGasPriceOracle.Contract.GetCrossDomainMessage(&_L1MessageQueueWithGasPriceOracle.CallOpts, _queueIndex) } -// IsMessageDropped is a free data retrieval call binding the contract method 0x3e6dada1. -// -// Solidity: function isMessageDropped(uint256 _queueIndex) view returns(bool) -func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleCaller) IsMessageDropped(opts *bind.CallOpts, _queueIndex *big.Int) (bool, error) { - var out []interface{} - err := _L1MessageQueueWithGasPriceOracle.contract.Call(opts, &out, "isMessageDropped", _queueIndex) - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// IsMessageDropped is a free data retrieval call binding the contract method 0x3e6dada1. -// -// Solidity: function isMessageDropped(uint256 _queueIndex) view returns(bool) -func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleSession) IsMessageDropped(_queueIndex *big.Int) (bool, error) { - return _L1MessageQueueWithGasPriceOracle.Contract.IsMessageDropped(&_L1MessageQueueWithGasPriceOracle.CallOpts, _queueIndex) -} - -// IsMessageDropped is a free data retrieval call binding the contract method 0x3e6dada1. -// -// Solidity: function isMessageDropped(uint256 _queueIndex) view returns(bool) -func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleCallerSession) IsMessageDropped(_queueIndex *big.Int) (bool, error) { - return _L1MessageQueueWithGasPriceOracle.Contract.IsMessageDropped(&_L1MessageQueueWithGasPriceOracle.CallOpts, _queueIndex) -} - -// IsMessageSkipped is a free data retrieval call binding the contract method 0x7d82191a. -// -// Solidity: function isMessageSkipped(uint256 _queueIndex) view returns(bool) -func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleCaller) IsMessageSkipped(opts *bind.CallOpts, _queueIndex *big.Int) (bool, error) { - var out []interface{} - err := _L1MessageQueueWithGasPriceOracle.contract.Call(opts, &out, "isMessageSkipped", _queueIndex) - - if err != nil { - return *new(bool), err - } - - out0 := *abi.ConvertType(out[0], new(bool)).(*bool) - - return out0, err - -} - -// IsMessageSkipped is a free data retrieval call binding the contract method 0x7d82191a. -// -// Solidity: function isMessageSkipped(uint256 _queueIndex) view returns(bool) -func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleSession) IsMessageSkipped(_queueIndex *big.Int) (bool, error) { - return _L1MessageQueueWithGasPriceOracle.Contract.IsMessageSkipped(&_L1MessageQueueWithGasPriceOracle.CallOpts, _queueIndex) -} - -// IsMessageSkipped is a free data retrieval call binding the contract method 0x7d82191a. -// -// Solidity: function isMessageSkipped(uint256 _queueIndex) view returns(bool) -func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleCallerSession) IsMessageSkipped(_queueIndex *big.Int) (bool, error) { - return _L1MessageQueueWithGasPriceOracle.Contract.IsMessageSkipped(&_L1MessageQueueWithGasPriceOracle.CallOpts, _queueIndex) -} - // L2BaseFee is a free data retrieval call binding the contract method 0xe3176bd5. // // Solidity: function l2BaseFee() view returns(uint256) @@ -740,27 +678,6 @@ func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleTransac return _L1MessageQueueWithGasPriceOracle.Contract.AppendEnforcedTransaction(&_L1MessageQueueWithGasPriceOracle.TransactOpts, _sender, _target, _value, _gasLimit, _data) } -// DropCrossDomainMessage is a paid mutator transaction binding the contract method 0x91652461. -// -// Solidity: function dropCrossDomainMessage(uint256 _index) returns() -func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleTransactor) DropCrossDomainMessage(opts *bind.TransactOpts, _index *big.Int) (*types.Transaction, error) { - return _L1MessageQueueWithGasPriceOracle.contract.Transact(opts, "dropCrossDomainMessage", _index) -} - -// DropCrossDomainMessage is a paid mutator transaction binding the contract method 0x91652461. -// -// Solidity: function dropCrossDomainMessage(uint256 _index) returns() -func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleSession) DropCrossDomainMessage(_index *big.Int) (*types.Transaction, error) { - return _L1MessageQueueWithGasPriceOracle.Contract.DropCrossDomainMessage(&_L1MessageQueueWithGasPriceOracle.TransactOpts, _index) -} - -// DropCrossDomainMessage is a paid mutator transaction binding the contract method 0x91652461. -// -// Solidity: function dropCrossDomainMessage(uint256 _index) returns() -func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleTransactorSession) DropCrossDomainMessage(_index *big.Int) (*types.Transaction, error) { - return _L1MessageQueueWithGasPriceOracle.Contract.DropCrossDomainMessage(&_L1MessageQueueWithGasPriceOracle.TransactOpts, _index) -} - // Initialize is a paid mutator transaction binding the contract method 0xda35a26f. // // Solidity: function initialize(uint256 _maxGasLimit, address _whitelistChecker) returns() @@ -782,25 +699,25 @@ func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleTransac return _L1MessageQueueWithGasPriceOracle.Contract.Initialize(&_L1MessageQueueWithGasPriceOracle.TransactOpts, _maxGasLimit, _whitelistChecker) } -// PopCrossDomainMessage is a paid mutator transaction binding the contract method 0x55f613ce. +// PopCrossDomainMessage is a paid mutator transaction binding the contract method 0x3c7f5283. // -// Solidity: function popCrossDomainMessage(uint256 _startIndex, uint256 _count, uint256 _skippedBitmap) returns() -func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleTransactor) PopCrossDomainMessage(opts *bind.TransactOpts, _startIndex *big.Int, _count *big.Int, _skippedBitmap *big.Int) (*types.Transaction, error) { - return _L1MessageQueueWithGasPriceOracle.contract.Transact(opts, "popCrossDomainMessage", _startIndex, _count, _skippedBitmap) +// Solidity: function popCrossDomainMessage(uint256 _startIndex, uint256 _count) returns() +func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleTransactor) PopCrossDomainMessage(opts *bind.TransactOpts, _startIndex *big.Int, _count *big.Int) (*types.Transaction, error) { + return _L1MessageQueueWithGasPriceOracle.contract.Transact(opts, "popCrossDomainMessage", _startIndex, _count) } -// PopCrossDomainMessage is a paid mutator transaction binding the contract method 0x55f613ce. +// PopCrossDomainMessage is a paid mutator transaction binding the contract method 0x3c7f5283. // -// Solidity: function popCrossDomainMessage(uint256 _startIndex, uint256 _count, uint256 _skippedBitmap) returns() -func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleSession) PopCrossDomainMessage(_startIndex *big.Int, _count *big.Int, _skippedBitmap *big.Int) (*types.Transaction, error) { - return _L1MessageQueueWithGasPriceOracle.Contract.PopCrossDomainMessage(&_L1MessageQueueWithGasPriceOracle.TransactOpts, _startIndex, _count, _skippedBitmap) +// Solidity: function popCrossDomainMessage(uint256 _startIndex, uint256 _count) returns() +func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleSession) PopCrossDomainMessage(_startIndex *big.Int, _count *big.Int) (*types.Transaction, error) { + return _L1MessageQueueWithGasPriceOracle.Contract.PopCrossDomainMessage(&_L1MessageQueueWithGasPriceOracle.TransactOpts, _startIndex, _count) } -// PopCrossDomainMessage is a paid mutator transaction binding the contract method 0x55f613ce. +// PopCrossDomainMessage is a paid mutator transaction binding the contract method 0x3c7f5283. // -// Solidity: function popCrossDomainMessage(uint256 _startIndex, uint256 _count, uint256 _skippedBitmap) returns() -func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleTransactorSession) PopCrossDomainMessage(_startIndex *big.Int, _count *big.Int, _skippedBitmap *big.Int) (*types.Transaction, error) { - return _L1MessageQueueWithGasPriceOracle.Contract.PopCrossDomainMessage(&_L1MessageQueueWithGasPriceOracle.TransactOpts, _startIndex, _count, _skippedBitmap) +// Solidity: function popCrossDomainMessage(uint256 _startIndex, uint256 _count) returns() +func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleTransactorSession) PopCrossDomainMessage(_startIndex *big.Int, _count *big.Int) (*types.Transaction, error) { + return _L1MessageQueueWithGasPriceOracle.Contract.PopCrossDomainMessage(&_L1MessageQueueWithGasPriceOracle.TransactOpts, _startIndex, _count) } // RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. @@ -977,15 +894,14 @@ func (it *L1MessageQueueWithGasPriceOracleDequeueTransactionIterator) Close() er // L1MessageQueueWithGasPriceOracleDequeueTransaction represents a DequeueTransaction event raised by the L1MessageQueueWithGasPriceOracle contract. type L1MessageQueueWithGasPriceOracleDequeueTransaction struct { - StartIndex *big.Int - Count *big.Int - SkippedBitmap *big.Int - Raw types.Log // Blockchain specific contextual infos + StartIndex *big.Int + Count *big.Int + Raw types.Log // Blockchain specific contextual infos } -// FilterDequeueTransaction is a free log retrieval operation binding the contract event 0xc77f792f838ae38399ac31acc3348389aeb110ce7bedf3cfdbdd5e6679267970. +// FilterDequeueTransaction is a free log retrieval operation binding the contract event 0x3d48b97f20730c965868963266b0d25d8abe3f06babb60fc3b2b80c9e8907f26. // -// Solidity: event DequeueTransaction(uint256 startIndex, uint256 count, uint256 skippedBitmap) +// Solidity: event DequeueTransaction(uint256 startIndex, uint256 count) func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleFilterer) FilterDequeueTransaction(opts *bind.FilterOpts) (*L1MessageQueueWithGasPriceOracleDequeueTransactionIterator, error) { logs, sub, err := _L1MessageQueueWithGasPriceOracle.contract.FilterLogs(opts, "DequeueTransaction") @@ -995,9 +911,9 @@ func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleFiltere return &L1MessageQueueWithGasPriceOracleDequeueTransactionIterator{contract: _L1MessageQueueWithGasPriceOracle.contract, event: "DequeueTransaction", logs: logs, sub: sub}, nil } -// WatchDequeueTransaction is a free log subscription operation binding the contract event 0xc77f792f838ae38399ac31acc3348389aeb110ce7bedf3cfdbdd5e6679267970. +// WatchDequeueTransaction is a free log subscription operation binding the contract event 0x3d48b97f20730c965868963266b0d25d8abe3f06babb60fc3b2b80c9e8907f26. // -// Solidity: event DequeueTransaction(uint256 startIndex, uint256 count, uint256 skippedBitmap) +// Solidity: event DequeueTransaction(uint256 startIndex, uint256 count) func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleFilterer) WatchDequeueTransaction(opts *bind.WatchOpts, sink chan<- *L1MessageQueueWithGasPriceOracleDequeueTransaction) (event.Subscription, error) { logs, sub, err := _L1MessageQueueWithGasPriceOracle.contract.WatchLogs(opts, "DequeueTransaction") @@ -1032,9 +948,9 @@ func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleFiltere }), nil } -// ParseDequeueTransaction is a log parse operation binding the contract event 0xc77f792f838ae38399ac31acc3348389aeb110ce7bedf3cfdbdd5e6679267970. +// ParseDequeueTransaction is a log parse operation binding the contract event 0x3d48b97f20730c965868963266b0d25d8abe3f06babb60fc3b2b80c9e8907f26. // -// Solidity: event DequeueTransaction(uint256 startIndex, uint256 count, uint256 skippedBitmap) +// Solidity: event DequeueTransaction(uint256 startIndex, uint256 count) func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleFilterer) ParseDequeueTransaction(log types.Log) (*L1MessageQueueWithGasPriceOracleDequeueTransaction, error) { event := new(L1MessageQueueWithGasPriceOracleDequeueTransaction) if err := _L1MessageQueueWithGasPriceOracle.contract.UnpackLog(event, "DequeueTransaction", log); err != nil { @@ -1044,140 +960,6 @@ func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleFiltere return event, nil } -// L1MessageQueueWithGasPriceOracleDropTransactionIterator is returned from FilterDropTransaction and is used to iterate over the raw logs and unpacked data for DropTransaction events raised by the L1MessageQueueWithGasPriceOracle contract. -type L1MessageQueueWithGasPriceOracleDropTransactionIterator struct { - Event *L1MessageQueueWithGasPriceOracleDropTransaction // 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 *L1MessageQueueWithGasPriceOracleDropTransactionIterator) 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(L1MessageQueueWithGasPriceOracleDropTransaction) - 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(L1MessageQueueWithGasPriceOracleDropTransaction) - 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 *L1MessageQueueWithGasPriceOracleDropTransactionIterator) Error() error { - return it.fail -} - -// Close terminates the iteration process, releasing any pending underlying -// resources. -func (it *L1MessageQueueWithGasPriceOracleDropTransactionIterator) Close() error { - it.sub.Unsubscribe() - return nil -} - -// L1MessageQueueWithGasPriceOracleDropTransaction represents a DropTransaction event raised by the L1MessageQueueWithGasPriceOracle contract. -type L1MessageQueueWithGasPriceOracleDropTransaction struct { - Index *big.Int - Raw types.Log // Blockchain specific contextual infos -} - -// FilterDropTransaction is a free log retrieval operation binding the contract event 0x43a375005206d20a83abc71722cba68c24434a8dc1f583775be7c3fde0396cbf. -// -// Solidity: event DropTransaction(uint256 index) -func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleFilterer) FilterDropTransaction(opts *bind.FilterOpts) (*L1MessageQueueWithGasPriceOracleDropTransactionIterator, error) { - - logs, sub, err := _L1MessageQueueWithGasPriceOracle.contract.FilterLogs(opts, "DropTransaction") - if err != nil { - return nil, err - } - return &L1MessageQueueWithGasPriceOracleDropTransactionIterator{contract: _L1MessageQueueWithGasPriceOracle.contract, event: "DropTransaction", logs: logs, sub: sub}, nil -} - -// WatchDropTransaction is a free log subscription operation binding the contract event 0x43a375005206d20a83abc71722cba68c24434a8dc1f583775be7c3fde0396cbf. -// -// Solidity: event DropTransaction(uint256 index) -func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleFilterer) WatchDropTransaction(opts *bind.WatchOpts, sink chan<- *L1MessageQueueWithGasPriceOracleDropTransaction) (event.Subscription, error) { - - logs, sub, err := _L1MessageQueueWithGasPriceOracle.contract.WatchLogs(opts, "DropTransaction") - 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(L1MessageQueueWithGasPriceOracleDropTransaction) - if err := _L1MessageQueueWithGasPriceOracle.contract.UnpackLog(event, "DropTransaction", 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 -} - -// ParseDropTransaction is a log parse operation binding the contract event 0x43a375005206d20a83abc71722cba68c24434a8dc1f583775be7c3fde0396cbf. -// -// Solidity: event DropTransaction(uint256 index) -func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleFilterer) ParseDropTransaction(log types.Log) (*L1MessageQueueWithGasPriceOracleDropTransaction, error) { - event := new(L1MessageQueueWithGasPriceOracleDropTransaction) - if err := _L1MessageQueueWithGasPriceOracle.contract.UnpackLog(event, "DropTransaction", log); err != nil { - return nil, err - } - event.Raw = log - return event, nil -} - // L1MessageQueueWithGasPriceOracleInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the L1MessageQueueWithGasPriceOracle contract. type L1MessageQueueWithGasPriceOracleInitializedIterator struct { Event *L1MessageQueueWithGasPriceOracleInitialized // Event containing the contract specifics and raw log diff --git a/bindings/bindings/l1messagequeuewithgaspriceoracle_more.go b/bindings/bindings/l1messagequeuewithgaspriceoracle_more.go index 76129153..95974e78 100644 --- a/bindings/bindings/l1messagequeuewithgaspriceoracle_more.go +++ b/bindings/bindings/l1messagequeuewithgaspriceoracle_more.go @@ -9,11 +9,11 @@ import ( "morph-l2/bindings/solc" ) -const L1MessageQueueWithGasPriceOracleStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_array(t_uint256)1013_storage\"},{\"astId\":1003,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"_owner\",\"offset\":0,\"slot\":\"51\",\"type\":\"t_address\"},{\"astId\":1004,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"52\",\"type\":\"t_array(t_uint256)1012_storage\"},{\"astId\":1005,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"l2BaseFee\",\"offset\":0,\"slot\":\"101\",\"type\":\"t_uint256\"},{\"astId\":1006,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"messageQueue\",\"offset\":0,\"slot\":\"102\",\"type\":\"t_array(t_bytes32)dyn_storage\"},{\"astId\":1007,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"pendingQueueIndex\",\"offset\":0,\"slot\":\"103\",\"type\":\"t_uint256\"},{\"astId\":1008,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"maxGasLimit\",\"offset\":0,\"slot\":\"104\",\"type\":\"t_uint256\"},{\"astId\":1009,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"droppedMessageBitmap\",\"offset\":0,\"slot\":\"105\",\"type\":\"t_struct(BitMap)1014_storage\"},{\"astId\":1010,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"skippedMessageBitmap\",\"offset\":0,\"slot\":\"106\",\"type\":\"t_mapping(t_uint256,t_uint256)\"},{\"astId\":1011,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"whitelistChecker\",\"offset\":0,\"slot\":\"107\",\"type\":\"t_address\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_bytes32)dyn_storage\":{\"encoding\":\"dynamic_array\",\"label\":\"bytes32[]\",\"numberOfBytes\":\"32\"},\"t_array(t_uint256)1012_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\"},\"t_array(t_uint256)1013_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[50]\",\"numberOfBytes\":\"1600\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_mapping(t_uint256,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_uint256\"},\"t_struct(BitMap)1014_storage\":{\"encoding\":\"inplace\",\"label\":\"struct BitMapsUpgradeable.BitMap\",\"numberOfBytes\":\"32\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}" +const L1MessageQueueWithGasPriceOracleStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_array(t_uint256)1013_storage\"},{\"astId\":1003,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"_owner\",\"offset\":0,\"slot\":\"51\",\"type\":\"t_address\"},{\"astId\":1004,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"52\",\"type\":\"t_array(t_uint256)1012_storage\"},{\"astId\":1005,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"l2BaseFee\",\"offset\":0,\"slot\":\"101\",\"type\":\"t_uint256\"},{\"astId\":1006,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"messageQueue\",\"offset\":0,\"slot\":\"102\",\"type\":\"t_array(t_bytes32)dyn_storage\"},{\"astId\":1007,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"pendingQueueIndex\",\"offset\":0,\"slot\":\"103\",\"type\":\"t_uint256\"},{\"astId\":1008,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"maxGasLimit\",\"offset\":0,\"slot\":\"104\",\"type\":\"t_uint256\"},{\"astId\":1009,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"__droppedMessageBitmap\",\"offset\":0,\"slot\":\"105\",\"type\":\"t_struct(BitMap)1014_storage\"},{\"astId\":1010,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"__skippedMessageBitmap\",\"offset\":0,\"slot\":\"106\",\"type\":\"t_mapping(t_uint256,t_uint256)\"},{\"astId\":1011,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"whitelistChecker\",\"offset\":0,\"slot\":\"107\",\"type\":\"t_address\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_bytes32)dyn_storage\":{\"encoding\":\"dynamic_array\",\"label\":\"bytes32[]\",\"numberOfBytes\":\"32\"},\"t_array(t_uint256)1012_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\"},\"t_array(t_uint256)1013_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[50]\",\"numberOfBytes\":\"1600\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_mapping(t_uint256,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_uint256\"},\"t_struct(BitMap)1014_storage\":{\"encoding\":\"inplace\",\"label\":\"struct BitMapsUpgradeable.BitMap\",\"numberOfBytes\":\"32\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}" var L1MessageQueueWithGasPriceOracleStorageLayout = new(solc.StorageLayout) -var L1MessageQueueWithGasPriceOracleDeployedBin = "0x608060405234801561000f575f80fd5b50600436106101a5575f3560e01c80639b159782116100e8578063d5ad4a9711610093578063e172d3a11161006e578063e172d3a1146103ca578063e3176bd5146103e4578063f2fde38b146103ed578063fd0ad31e14610400575f80fd5b8063d5ad4a9714610391578063d99bc80e146103a4578063da35a26f146103b7575f80fd5b8063bb7862ca116100c3578063bb7862ca14610337578063bdc6f0a014610357578063c27606771461036a575f80fd5b80639b15978214610308578063a85006ca1461031b578063ae453cd514610324575f80fd5b80635f9cd92e116101535780638770d7071161012e5780638770d707146102645780638da5cb5b146102b057806391652461146102ce578063927ede2d146102e1575f80fd5b80635f9cd92e14610236578063715018a6146102495780637d82191a14610251575f80fd5b806355f613ce1161018357806355f613ce146102055780635ad9945a1461021a5780635e45da231461022d575f80fd5b806329aa604b146101a95780633e4cbbe6146101cf5780633e6dada1146101e2575b5f80fd5b6101bc6101b73660046116d0565b610408565b6040519081526020015b60405180910390f35b6101bc6101dd36600461170a565b610427565b6101f56101f03660046116d0565b6104db565b60405190151581526020016101c6565b610218610213366004611732565b610521565b005b6101bc6102283660046117a0565b610763565b6101bc60685481565b61021861024436600461181c565b610953565b6102186109e8565b6101f561025f3660046116d0565b6109fb565b61028b7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c6565b60335473ffffffffffffffffffffffffffffffffffffffff1661028b565b6102186102dc3660046116d0565b610a2e565b61028b7f000000000000000000000000000000000000000000000000000000000000000081565b610218610316366004611835565b610cb5565b6101bc60675481565b6101bc6103323660046116d0565b610db1565b606b5461028b9073ffffffffffffffffffffffffffffffffffffffff1681565b61021861036536600461188b565b610e41565b61028b7f000000000000000000000000000000000000000000000000000000000000000081565b61021861039f3660046116d0565b610fa6565b6102186103b23660046116d0565b610ff4565b6102186103c53660046118fe565b61103a565b6101bc6103d8366004611928565b60100261520801919050565b6101bc60655481565b6102186103fb36600461181c565b611209565b6066546101bc565b60668181548110610417575f80fd5b5f91825260209091200154905081565b606b546040517fefc7840100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301525f92169063efc7840190602401602060405180830381865afa158015610495573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104b99190611967565b156104c557505f6104d5565b6065546104d2908361198d565b90505b92915050565b600881901c5f908152606a6020526040812054600160ff84161b16151580156104d55750600882901c5f90815260696020526040902054600160ff84161b1615156104d5565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146105c5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4f6e6c792063616c6c61626c652062792074686520726f6c6c7570000000000060448201526064015b60405180910390fd5b610100821115610631576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f706f7020746f6f206d616e79206d65737361676573000000000000000000000060448201526064016105bc565b826067541461069c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f737461727420696e646578206d69736d6174636800000000000000000000000060448201526064016105bc565b600883901c5f818152606a6020526040902080546001851b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0193841660ff871681811b90921790925590929190610100818601111561071357600182015f908152606a6020526040902061010082900385901c90555b50505081830160675560408051848152602081018490529081018290527fc77f792f838ae38399ac31acc3348389aeb110ce7bedf3cfdbdd5e6679267970906060015b60405180910390a1505050565b5f607e8161080d565b5f8161077a57506001919050565b5b81156107905760089190911c9060010161077b565b919050565b8060808310600181146107cd576107ab8461076c565b60808101835360018301925084816020036008021b83528083019250506107ee565b84841516600181146107e1578483536107e6565b608083535b506001820191505b509392505050565b806094815360609290921b60018301525060150190565b6005604051018061082060018c83610795565b905061082e60018983610795565b905061083a89826107f6565b905061084860018b83610795565b905060018614600181146108b05760388710600181146108955761086b8861076c565b8060b701845360018401935088816020036008021b845280840193505087898437918701916108aa565b87608001835360018301925087898437918701915b506108c1565b6108be5f89355f1a84610795565b91505b506108cc8c826107f6565b90508181035f8060388310600181146108ff576108e88461076c565b60f78101600882021b85179350600101915061090a565b8360c0019250600191505b5086816008021b821791506001810190508060080292508451831c8284610100031b17915080850394505080845250508181038220925050508092505050979650505050505050565b61095b6112c0565b606b5460405173ffffffffffffffffffffffffffffffffffffffff8084169216907ff91b2a410a89d46f14ee984a57e6d7892c217f116905371180998e20cef237e5905f90a3606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6109f06112c0565b6109f95f611341565b565b5f6067548210610a0c57505f919050565b600882901c5f908152606a6020526040902054600160ff84161b1615156104d5565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610af3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4f6e6c792063616c6c61626c6520627920746865204c3143726f7373446f6d6160448201527f696e4d657373656e67657200000000000000000000000000000000000000000060648201526084016105bc565b6067548110610b5e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f63616e6e6f742064726f702070656e64696e67206d657373616765000000000060448201526064016105bc565b600881901c5f908152606a6020526040902054600160ff83161b16610bdf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f64726f70206e6f6e2d736b6970706564206d657373616765000000000000000060448201526064016105bc565b600881901c5f90815260696020526040902054600160ff83161b1615610c61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f6d65737361676520616c72656164792064726f7070656400000000000000000060448201526064016105bc565b600881901c5f9081526069602052604090208054600160ff84161b1790556040518181527f43a375005206d20a83abc71722cba68c24434a8dc1f583775be7c3fde0396cbf9060200160405180910390a150565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610d7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4f6e6c792063616c6c61626c6520627920746865204c3143726f7373446f6d6160448201527f696e4d657373656e67657200000000000000000000000000000000000000000060648201526084016105bc565b610d858383836113b7565b3373111100000000000000000000000000000000111101610daa81865f8787876114e7565b5050505050565b6066545f908210610e1e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d65737361676520696e646578206f7574206f662072616e676500000000000060448201526064016105bc565b60668281548110610e3157610e316119c9565b905f5260205f2001549050919050565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610f06576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f6e6c792063616c6c61626c652062792074686520456e666f7263656454784760448201527f617465776179000000000000000000000000000000000000000000000000000060648201526084016105bc565b73ffffffffffffffffffffffffffffffffffffffff86163b15610f85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f6f6e6c7920454f4100000000000000000000000000000000000000000000000060448201526064016105bc565b610f908383836113b7565b610f9e8686868686866114e7565b505050505050565b610fae6112c0565b606880549082905560408051828152602081018490527fa030881e03ff723954dd0d35500564afab9603555d09d4456a32436f2b2373c591015b60405180910390a15050565b610ffc6112c0565b606580549082905560408051828152602081018490527fc5271ba80b67178cc31f04a3755325121400925878dc608432b6fcaead3663299101610fe8565b5f54610100900460ff161580801561105857505f54600160ff909116105b806110715750303b15801561107157505f5460ff166001145b6110fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105bc565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611159575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b611161611598565b6068839055606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790558015611204575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001610756565b505050565b6112116112c0565b73ffffffffffffffffffffffffffffffffffffffff81166112b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016105bc565b6112bd81611341565b50565b60335473ffffffffffffffffffffffffffffffffffffffff1633146109f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016105bc565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b606854831115611449576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f476173206c696d6974206d757374206e6f7420657863656564206d617847617360448201527f4c696d697400000000000000000000000000000000000000000000000000000060648201526084016105bc565b6010810261520801808410156114e1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f496e73756666696369656e7420676173206c696d69742c206d7573742062652060448201527f61626f766520696e7472696e736963206761730000000000000000000000000060648201526084016105bc565b50505050565b6066545f6114fa8883888a898989610763565b606680546001810182555f919091527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e943540181905560405190915073ffffffffffffffffffffffffffffffffffffffff80891691908a16907f69cfcb8e6d4192b8aba9902243912587f37e550d75c1fa801491fce26717f37e90611586908a9087908b908b908b906119f6565b60405180910390a35050505050505050565b5f54610100900460ff1661162e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105bc565b6109f95f54610100900460ff166116c7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105bc565b6109f933611341565b5f602082840312156116e0575f80fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610790575f80fd5b5f806040838503121561171b575f80fd5b611724836116e7565b946020939093013593505050565b5f805f60608486031215611744575f80fd5b505081359360208301359350604090920135919050565b5f8083601f84011261176b575f80fd5b50813567ffffffffffffffff811115611782575f80fd5b602083019150836020828501011115611799575f80fd5b9250929050565b5f805f805f805f60c0888a0312156117b6575f80fd5b6117bf886116e7565b965060208801359550604088013594506117db606089016116e7565b93506080880135925060a088013567ffffffffffffffff8111156117fd575f80fd5b6118098a828b0161175b565b989b979a50959850939692959293505050565b5f6020828403121561182c575f80fd5b6104d2826116e7565b5f805f8060608587031215611848575f80fd5b611851856116e7565b935060208501359250604085013567ffffffffffffffff811115611873575f80fd5b61187f8782880161175b565b95989497509550505050565b5f805f805f8060a087890312156118a0575f80fd5b6118a9876116e7565b95506118b7602088016116e7565b94506040870135935060608701359250608087013567ffffffffffffffff8111156118e0575f80fd5b6118ec89828a0161175b565b979a9699509497509295939492505050565b5f806040838503121561190f575f80fd5b8235915061191f602084016116e7565b90509250929050565b5f8060208385031215611939575f80fd5b823567ffffffffffffffff81111561194f575f80fd5b61195b8582860161175b565b90969095509350505050565b5f60208284031215611977575f80fd5b81518015158114611986575f80fd5b9392505050565b80820281158282048414176104d5577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b85815267ffffffffffffffff8516602082015283604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010194935050505056fea164736f6c6343000818000a" +var L1MessageQueueWithGasPriceOracleDeployedBin = "0x608060405234801561000f575f80fd5b5060043610610184575f3560e01c8063a85006ca116100dd578063d99bc80e11610088578063e3176bd511610063578063e3176bd51461037a578063f2fde38b14610383578063fd0ad31e14610396575f80fd5b8063d99bc80e1461033a578063da35a26f1461034d578063e172d3a114610360575f80fd5b8063bdc6f0a0116100b8578063bdc6f0a0146102ed578063c276067714610300578063d5ad4a9714610327575f80fd5b8063a85006ca146102b1578063ae453cd5146102ba578063bb7862ca146102cd575f80fd5b80635f9cd92e1161013d5780638da5cb5b116101185780638da5cb5b14610259578063927ede2d146102775780639b1597821461029e575f80fd5b80635f9cd92e146101f2578063715018a6146102055780638770d7071461020d575f80fd5b80633e4cbbe61161016d5780633e4cbbe6146101c35780635ad9945a146101d65780635e45da23146101e9575f80fd5b806329aa604b146101885780633c7f5283146101ae575b5f80fd5b61019b6101963660046112df565b61039e565b6040519081526020015b60405180910390f35b6101c16101bc3660046112f6565b6103bd565b005b61019b6101d1366004611339565b61057c565b61019b6101e43660046113a6565b610630565b61019b60685481565b6101c1610200366004611422565b610820565b6101c16108b5565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a5565b60335473ffffffffffffffffffffffffffffffffffffffff16610234565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b6101c16102ac36600461143b565b6108c8565b61019b60675481565b61019b6102c83660046112df565b6109c4565b606b546102349073ffffffffffffffffffffffffffffffffffffffff1681565b6101c16102fb366004611491565b610a54565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b6101c16103353660046112df565b610bb9565b6101c16103483660046112df565b610bff565b6101c161035b366004611504565b610c45565b61019b61036e36600461152e565b60100261520801919050565b61019b60655481565b6101c1610391366004611422565b610e18565b60665461019b565b606681815481106103ad575f80fd5b5f91825260209091200154905081565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610461576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4f6e6c792063616c6c61626c652062792074686520726f6c6c7570000000000060448201526064015b60405180910390fd5b6101008111156104cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f706f7020746f6f206d616e79206d6573736167657300000000000000000000006044820152606401610458565b8160675414610538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f737461727420696e646578206d69736d617463680000000000000000000000006044820152606401610458565b80820160675560408051838152602081018390527f3d48b97f20730c965868963266b0d25d8abe3f06babb60fc3b2b80c9e8907f2691015b60405180910390a15050565b606b546040517fefc7840100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301525f92169063efc7840190602401602060405180830381865afa1580156105ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061060e919061156d565b1561061a57505f61062a565b6065546106279083611593565b90505b92915050565b5f607e816106da565b5f8161064757506001919050565b5b811561065d5760089190911c90600101610648565b919050565b80608083106001811461069a5761067884610639565b60808101835360018301925084816020036008021b83528083019250506106bb565b84841516600181146106ae578483536106b3565b608083535b506001820191505b509392505050565b806094815360609290921b60018301525060150190565b600560405101806106ed60018c83610662565b90506106fb60018983610662565b905061070789826106c3565b905061071560018b83610662565b9050600186146001811461077d5760388710600181146107625761073888610639565b8060b701845360018401935088816020036008021b84528084019350508789843791870191610777565b87608001835360018301925087898437918701915b5061078e565b61078b5f89355f1a84610662565b91505b506107998c826106c3565b90508181035f8060388310600181146107cc576107b584610639565b60f78101600882021b8517935060010191506107d7565b8360c0019250600191505b5086816008021b821791506001810190508060080292508451831c8284610100031b17915080850394505080845250508181038220925050508092505050979650505050505050565b610828610ecf565b606b5460405173ffffffffffffffffffffffffffffffffffffffff8084169216907ff91b2a410a89d46f14ee984a57e6d7892c217f116905371180998e20cef237e5905f90a3606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6108bd610ecf565b6108c65f610f50565b565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff161461098d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4f6e6c792063616c6c61626c6520627920746865204c3143726f7373446f6d6160448201527f696e4d657373656e6765720000000000000000000000000000000000000000006064820152608401610458565b610998838383610fc6565b33731111000000000000000000000000000000001111016109bd81865f8787876110f6565b5050505050565b6066545f908210610a31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d65737361676520696e646578206f7574206f662072616e67650000000000006044820152606401610458565b60668281548110610a4457610a446115cf565b905f5260205f2001549050919050565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610b19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f6e6c792063616c6c61626c652062792074686520456e666f7263656454784760448201527f61746577617900000000000000000000000000000000000000000000000000006064820152608401610458565b73ffffffffffffffffffffffffffffffffffffffff86163b15610b98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f6f6e6c7920454f410000000000000000000000000000000000000000000000006044820152606401610458565b610ba3838383610fc6565b610bb18686868686866110f6565b505050505050565b610bc1610ecf565b606880549082905560408051828152602081018490527fa030881e03ff723954dd0d35500564afab9603555d09d4456a32436f2b2373c59101610570565b610c07610ecf565b606580549082905560408051828152602081018490527fc5271ba80b67178cc31f04a3755325121400925878dc608432b6fcaead3663299101610570565b5f54610100900460ff1615808015610c6357505f54600160ff909116105b80610c7c5750303b158015610c7c57505f5460ff166001145b610d08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610458565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610d64575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610d6c6111a7565b6068839055606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790558015610e13575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610e20610ecf565b73ffffffffffffffffffffffffffffffffffffffff8116610ec3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610458565b610ecc81610f50565b50565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610458565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b606854831115611058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f476173206c696d6974206d757374206e6f7420657863656564206d617847617360448201527f4c696d69740000000000000000000000000000000000000000000000000000006064820152608401610458565b6010810261520801808410156110f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f496e73756666696369656e7420676173206c696d69742c206d7573742062652060448201527f61626f766520696e7472696e73696320676173000000000000000000000000006064820152608401610458565b50505050565b6066545f6111098883888a898989610630565b606680546001810182555f919091527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e943540181905560405190915073ffffffffffffffffffffffffffffffffffffffff80891691908a16907f69cfcb8e6d4192b8aba9902243912587f37e550d75c1fa801491fce26717f37e90611195908a9087908b908b908b906115fc565b60405180910390a35050505050505050565b5f54610100900460ff1661123d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610458565b6108c65f54610100900460ff166112d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610458565b6108c633610f50565b5f602082840312156112ef575f80fd5b5035919050565b5f8060408385031215611307575f80fd5b50508035926020909101359150565b803573ffffffffffffffffffffffffffffffffffffffff8116811461065d575f80fd5b5f806040838503121561134a575f80fd5b61135383611316565b946020939093013593505050565b5f8083601f840112611371575f80fd5b50813567ffffffffffffffff811115611388575f80fd5b60208301915083602082850101111561139f575f80fd5b9250929050565b5f805f805f805f60c0888a0312156113bc575f80fd5b6113c588611316565b965060208801359550604088013594506113e160608901611316565b93506080880135925060a088013567ffffffffffffffff811115611403575f80fd5b61140f8a828b01611361565b989b979a50959850939692959293505050565b5f60208284031215611432575f80fd5b61062782611316565b5f805f806060858703121561144e575f80fd5b61145785611316565b935060208501359250604085013567ffffffffffffffff811115611479575f80fd5b61148587828801611361565b95989497509550505050565b5f805f805f8060a087890312156114a6575f80fd5b6114af87611316565b95506114bd60208801611316565b94506040870135935060608701359250608087013567ffffffffffffffff8111156114e6575f80fd5b6114f289828a01611361565b979a9699509497509295939492505050565b5f8060408385031215611515575f80fd5b8235915061152560208401611316565b90509250929050565b5f806020838503121561153f575f80fd5b823567ffffffffffffffff811115611555575f80fd5b61156185828601611361565b90969095509350505050565b5f6020828403121561157d575f80fd5b8151801515811461158c575f80fd5b9392505050565b808202811582820484141761062a577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b85815267ffffffffffffffff8516602082015283604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010194935050505056fea164736f6c6343000818000a" func init() { if err := json.Unmarshal([]byte(L1MessageQueueWithGasPriceOracleStorageLayoutJSON), L1MessageQueueWithGasPriceOracleStorageLayout); err != nil { diff --git a/bindings/bindings/l1staking.go b/bindings/bindings/l1staking.go index 6ef653ab..f22c3b2d 100644 --- a/bindings/bindings/l1staking.go +++ b/bindings/bindings/l1staking.go @@ -31,8 +31,8 @@ var ( // L1StakingMetaData contains all meta data concerning the L1Staking contract. var L1StakingMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"_messenger\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldChallengeDeposit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newChallengeDeposit\",\"type\":\"uint256\"}],\"name\":\"ChallengeDepositUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"Claimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldGasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newGasLimit\",\"type\":\"uint256\"}],\"name\":\"GasLimitAddStakerUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldGasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newGasLimit\",\"type\":\"uint256\"}],\"name\":\"GasLimitRemoveStakersUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"tmKey\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"blsKey\",\"type\":\"bytes\"}],\"name\":\"Registered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldPercentage\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPercentage\",\"type\":\"uint256\"}],\"name\":\"RewardPercentageUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"SlashRemainingClaimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"stakers\",\"type\":\"address[]\"}],\"name\":\"Slashed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"stakers\",\"type\":\"address[]\"}],\"name\":\"StakersRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldStakingValue\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newStakingValue\",\"type\":\"uint256\"}],\"name\":\"StakingValueUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"add\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"remove\",\"type\":\"address[]\"}],\"name\":\"WhitelistUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unlockHeight\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MESSENGER\",\"outputs\":[{\"internalType\":\"contractICrossDomainMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"OTHER_STAKING\",\"outputs\":[{\"internalType\":\"contractStaking\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"blsPubkey\",\"type\":\"bytes\"}],\"name\":\"blsKeys\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"exist\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"challengeDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"claimSlashRemaining\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"claimWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"cleanStakerStore\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"deleteList\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"stakerAddr\",\"type\":\"address\"}],\"name\":\"deleteableHeight\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"height\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gasLimitAddStaker\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gasLimitRemoveStakers\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getActiveStakers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_staker\",\"type\":\"address\"}],\"name\":\"getStakerBitmap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"bitmap\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStakers\",\"outputs\":[{\"internalType\":\"address[255]\",\"name\":\"\",\"type\":\"address[255]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_stakers\",\"type\":\"address[]\"}],\"name\":\"getStakersBitmap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"bitmap\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"bitmap\",\"type\":\"uint256\"}],\"name\":\"getStakersFromBitmap\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"stakerAddrs\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_rollupContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_stakingValue\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_challengeDeposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_lockBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_rewardPercentage\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimitAdd\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimitRemove\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"isActiveStaker\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"isStaker\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"isStakerInDeleteList\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messenger\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"tmKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"blsKey\",\"type\":\"bytes\"}],\"name\":\"register\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_stakers\",\"type\":\"address[]\"}],\"name\":\"removeStaker\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"stakerAddr\",\"type\":\"address\"}],\"name\":\"removedList\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"removed\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardPercentage\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rollupContract\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"sequencersBitmap\",\"type\":\"uint256\"}],\"name\":\"slash\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"slashRemaining\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"stakerAddr\",\"type\":\"address\"}],\"name\":\"stakerIndexes\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"index\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"stakerSet\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"stakerAddr\",\"type\":\"address\"}],\"name\":\"stakers\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"tmKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"blsKey\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stakingValue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"tmPubkey\",\"type\":\"bytes32\"}],\"name\":\"tmKeys\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"exist\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_challengeDeposit\",\"type\":\"uint256\"}],\"name\":\"updateChallengeDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasLimitAdd\",\"type\":\"uint256\"}],\"name\":\"updateGasLimitAddStaker\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasLimitRemove\",\"type\":\"uint256\"}],\"name\":\"updateGasLimitRemoveStakers\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_rewardPercentage\",\"type\":\"uint256\"}],\"name\":\"updateRewardPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_stakingValue\",\"type\":\"uint256\"}],\"name\":\"updateStakingValue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"add\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"remove\",\"type\":\"address[]\"}],\"name\":\"updateWhitelist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"verifySignature\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"stakerAddr\",\"type\":\"address\"}],\"name\":\"whitelist\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"inWhitelist\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawalLockBlocks\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"withdrawals\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x60c060405234801562000010575f80fd5b5060405162003e1d38038062003e1d833981016040819052620000339162000127565b6001600160a01b03811660805273530000000000000000000000000000000000001560a0526200006262000069565b5062000156565b5f54610100900460ff1615620000d55760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161462000125575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f6020828403121562000138575f80fd5b81516001600160a01b03811681146200014f575f80fd5b9392505050565b60805160a051613c826200019b5f395f8181610664015281816129530152612bc701525f818161043c01528181610701015281816129240152612b980152613c825ff3fe6080604052600436106102f8575f3560e01c80637a9262a211610191578063ab8c53dc116100dc578063d51c90a911610087578063e2a6ad5f11610062578063e2a6ad5f1461090c578063f2fde38b1461092b578063f4fe7fef1461094a575f80fd5b8063d51c90a91461087f578063dd4785f514610894578063df155033146108d5575f80fd5b8063c7cd469a116100b7578063c7cd469a14610822578063cde4cd1114610841578063d096c3c614610860575f80fd5b8063ab8c53dc146107cf578063ae81de53146107e4578063bfa02ba914610803575f80fd5b8063927ede2d1161013c5780639fb82db9116101175780639fb82db91461077d578063a3066aab14610791578063a4f209b0146107b0575f80fd5b8063927ede2d146106f05780639b19251a146107235780639d48f41714610751575f80fd5b80638a565ac31161016c5780638a565ac3146106865780638da5cb5b146106a55780639168ae72146106c2575f80fd5b80637a9262a2146106085780638142951a14610634578063831cfb5814610653575f80fd5b806341de239b11610251578063692c565b116101fc57806374fe27b7116101d757806374fe27b714610588578063797adbde146105ae5780637a4e87c3146105cd575f80fd5b8063692c565b146105265780636f1e853314610555578063715018a614610574575f80fd5b80634d64903a1161022c5780634d64903a146104dd57806352d472eb146104f25780636801579114610507575f80fd5b806341de239b1461048857806343352d611461049d57806345bc4d10146104be575f80fd5b8063320ff860116102b15780633cb747bf1161028c5780633cb747bf1461042e5780633ccfd60b146104605780633ee2a1f914610474575f80fd5b8063320ff860146103b257806335928991146103d15780633a9bbede146103f0575f80fd5b80632a28e5a3116102e15780632a28e5a31461033a5780632e407a6f1461034f578063303afb9e1461037b575f80fd5b80630d13fd7b146102fc5780632108db3514610325575b5f80fd5b348015610307575f80fd5b506103126101a65481565b6040519081526020015b60405180910390f35b348015610330575f80fd5b50610312609c5481565b61034d610348366004613407565b610969565b005b34801561035a575f80fd5b50610312610369366004613461565b6101a16020525f908152604090205481565b348015610386575f80fd5b5061039a610395366004613481565b610d64565b6040516001600160a01b03909116815260200161031c565b3480156103bd575f80fd5b5061034d6103cc366004613498565b610d83565b3480156103dc575f80fd5b5061034d6103eb366004613481565b61109e565b3480156103fb575f80fd5b5061041e61040a366004613461565b609f6020525f908152604090205460ff1681565b604051901515815260200161031c565b348015610439575f80fd5b507f000000000000000000000000000000000000000000000000000000000000000061039a565b34801561046b575f80fd5b5061034d61114b565b34801561047f575f80fd5b5061034d611317565b348015610493575f80fd5b5061031260995481565b3480156104a8575f80fd5b506104b1611329565b60405161031c9190613540565b3480156104c9575f80fd5b506103126104d8366004613481565b61136f565b3480156104e8575f80fd5b5061031260985481565b3480156104fd575f80fd5b50610312609a5481565b348015610512575f80fd5b5061041e610521366004613461565b611675565b348015610531575f80fd5b5061041e610540366004613481565b6101a46020525f908152604090205460ff1681565b348015610560575f80fd5b5061041e61056f366004613461565b611710565b34801561057f575f80fd5b5061034d611789565b348015610593575f80fd5b5061041e6105a23660046135c2565b60019695505050505050565b3480156105b9575f80fd5b5061039a6105c8366004613481565b61179a565b3480156105d8575f80fd5b5061041e6105e7366004613668565b80516020818301810180516101a38252928201919093012091525460ff1681565b348015610613575f80fd5b50610312610622366004613461565b6101a56020525f908152604090205481565b34801561063f575f80fd5b5061034d61064e3660046136a2565b6117c3565b34801561065e575f80fd5b5061039a7f000000000000000000000000000000000000000000000000000000000000000081565b348015610691575f80fd5b5061034d6106a0366004613481565b611c85565b3480156106b0575f80fd5b506033546001600160a01b031661039a565b3480156106cd575f80fd5b506106e16106dc366004613461565b611d28565b60405161031c9392919061373d565b3480156106fb575f80fd5b5061039a7f000000000000000000000000000000000000000000000000000000000000000081565b34801561072e575f80fd5b5061041e61073d366004613461565b609e6020525f908152604090205460ff1681565b34801561075c575f80fd5b5061077061076b366004613481565b611ddb565b60405161031c919061376d565b348015610788575f80fd5b50610770611ef8565b34801561079c575f80fd5b5061034d6107ab366004613461565b6120a6565b3480156107bb575f80fd5b5061034d6107ca366004613481565b6121d6565b3480156107da575f80fd5b50610312609d5481565b3480156107ef575f80fd5b5061034d6107fe366004613481565b612286565b34801561080e575f80fd5b5060975461039a906001600160a01b031681565b34801561082d575f80fd5b5061034d61083c3660046137b9565b612329565b34801561084c575f80fd5b5061034d61085b366004613461565b6124ca565b34801561086b575f80fd5b5061031261087a366004613461565b612538565b34801561088a575f80fd5b50610312609b5481565b34801561089f575f80fd5b506108c36108ae366004613461565b61019f6020525f908152604090205460ff1681565b60405160ff909116815260200161031c565b3480156108e0575f80fd5b5061041e6108ef366004613461565b6001600160a01b03165f9081526101a16020526040902054151590565b348015610917575f80fd5b50610312610926366004613820565b6125b2565b348015610936575f80fd5b5061034d610945366004613461565b6126e4565b348015610955575f80fd5b5061034d610964366004613481565b612771565b335f818152609e602052604090205460ff166109cc5760405162461bcd60e51b815260206004820152601060248201527f6e6f7420696e2077686974656c6973740000000000000000000000000000000060448201526064015b60405180910390fd5b335f9081526101a260205260409020546001600160a01b031615610a325760405162461bcd60e51b815260206004820152601260248201527f616c72656164792072656769737465726564000000000000000000000000000060448201526064016109c3565b8215801590610a5057505f8381526101a4602052604090205460ff16155b610a9c5760405162461bcd60e51b815260206004820152601960248201527f696e76616c69642074656e6465726d696e74207075626b65790000000000000060448201526064016109c3565b8151610100148015610acf57506101a382604051610aba919061385f565b9081526040519081900360200190205460ff16155b610b1b5760405162461bcd60e51b815260206004820152601260248201527f696e76616c696420626c73207075626b6579000000000000000000000000000060448201526064016109c3565b6098543414610b6c5760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964207374616b696e672076616c7565000000000000000000000060448201526064016109c3565b6040518060600160405280610b7e3390565b6001600160a01b03908116825260208083018790526040928301869052335f9081526101a28252839020845181547fffffffffffffffffffffffff00000000000000000000000000000000000000001693169290921782558301516001820155908201516002820190610bf1908261390f565b50905050610c04610bff3390565b612814565b60016101a383604051610c17919061385f565b90815260408051918290036020908101909220805493151560ff199485161790555f8681526101a49092529020805490911660011790557fb9c7babb56df9f2da4a30811a6c778e4e68af88b72712d56cf62c5516e20e199610c763390565b8484604051610c879392919061373d565b60405180910390a1335f9081526101a26020908152604091829020825160608101845281546001600160a01b03168152600182015492810192909252600281018054610d5f9484019190610cda9061387a565b80601f0160208091040260200160405190810160405280929190818152602001828054610d069061387a565b8015610d515780601f10610d2857610100808354040283529160200191610d51565b820191905f5260205f20905b815481529060010190602001808311610d3457829003601f168201915b505050505081525050612922565b505050565b60a08160ff8110610d73575f80fd5b01546001600160a01b0316905081565b610d8b612a4a565b5f5b815181101561105a57610db8828281518110610dab57610dab613a0d565b6020026020010151611675565b610e2a5760405162461bcd60e51b815260206004820152602160248201527f6f6e6c7920616374697665207374616b65722063616e2062652072656d6f766560448201527f640000000000000000000000000000000000000000000000000000000000000060648201526084016109c3565b6101a55f838381518110610e4057610e40613a0d565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20545f14610eb65760405162461bcd60e51b815260206004820152600b60248201527f7769746864726177696e6700000000000000000000000000000000000000000060448201526064016109c3565b609954610ec39043613a67565b6101a55f848481518110610ed957610ed9613a0d565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2081905550610f26828281518110610f1957610f19613a0d565b6020026020010151612aa4565b818181518110610f3857610f38613a0d565b60200260200101516001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d56101a55f858581518110610f8057610f80613a0d565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054604051610fb791815260200190565b60405180910390a2609e5f838381518110610fd457610fd4613a0d565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81549060ff02191690556001609f5f84848151811061102157611021613a0d565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101610d8d565b507f3f446646c03e618be8238a586960d6d625f35c653cdca1ef59609993e8ed2c848160405161108a919061376d565b60405180910390a161109b81612b96565b50565b6110a6612a4a565b5f811180156110b857506101a6548114155b6111045760405162461bcd60e51b815260206004820152601f60248201527f696e76616c6964206368616c6c656e6765206465706f7369742076616c75650060448201526064016109c3565b6101a680549082905560408051828152602081018490527f36f971a40478225aeb80cfbf5e80306e8cb76d3bf7d56fdc5e490945cddb7d5591015b60405180910390a15050565b61115433611675565b6111a05760405162461bcd60e51b815260206004820152601260248201527f6f6e6c7920616374697665207374616b6572000000000000000000000000000060448201526064016109c3565b335f9081526101a56020526040902054156111fd5760405162461bcd60e51b815260206004820152600b60248201527f7769746864726177696e6700000000000000000000000000000000000000000060448201526064016109c3565b60995461120a9043613a67565b335f8181526101a5602052604090209190915561122690612aa4565b335f8181526101a560209081526040918290205491519182527f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5910160405180910390a2335f908152609e60209081526040808320805460ff19908116909155609f83528184208054909116600190811790915581518181528083019092529091828101908036833701905050905033815f815181106112c8576112c8613a0d565b60200260200101906001600160a01b031690816001600160a01b0316815250507f3f446646c03e618be8238a586960d6d625f35c653cdca1ef59609993e8ed2c848160405161108a919061376d565b61131f612a4a565b611327612c8e565b565b6113316132d4565b60408051611fe08101918290529060a09060ff9082845b81546001600160a01b03168152600190910190602001808311611348575050505050905090565b6097545f906001600160a01b0316336001600160a01b0316146113d45760405162461bcd60e51b815260206004820152601460248201527f6f6e6c7920726f6c6c757020636f6e747261637400000000000000000000000060448201526064016109c3565b6113dc612f59565b5f6113e683611ddb565b90505f805b8251811015611598575f6101a55f85848151811061140b5761140b613a0d565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054111561148e576101a55f84838151811061144f5761144f613a0d565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f9055609854826114879190613a67565b9150611590565b6114c88382815181106114a3576114a3613a0d565b60200260200101516001600160a01b03165f9081526101a16020526040902054151590565b611590576098546114d99083613a67565b91506114f0838281518110610f1957610f19613a0d565b609e5f84838151811061150557611505613a0d565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81549060ff02191690556001609f5f85848151811061155257611552613a0d565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b6001016113eb565b505f6064609a54836115aa9190613a7a565b6115b49190613a91565b90506115c08183613ac9565b609d5f8282546115d09190613a67565b90915550506097546115eb906001600160a01b031682612fb2565b7f654f4a61849f1b3ad10abb283d27f02d5fece7b820acc5a3b874713b58748b5a8360405161161a919061376d565b60405180910390a17f3f446646c03e618be8238a586960d6d625f35c653cdca1ef59609993e8ed2c8483604051611651919061376d565b60405180910390a161166283612b96565b925050506116706001606555565b919050565b6001600160a01b0381165f90815261019f602052604081205460ff16810361169e57505f919050565b6001600160a01b0382165f81815261019f602052604090205460a0906116c99060019060ff16613adc565b60ff1660ff81106116dc576116dc613a0d565b01546001600160a01b031614801561170a57506001600160a01b0382165f9081526101a16020526040902054155b92915050565b6001600160a01b0381165f90815261019f602052604081205460ff16810361173957505f919050565b6001600160a01b0382165f81815261019f602052604090205460a0906117649060019060ff16613adc565b60ff1660ff811061177757611777613a0d565b01546001600160a01b03161492915050565b611791612a4a565b6113275f613062565b6101a081815481106117aa575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f54610100900460ff16158080156117e157505f54600160ff909116105b806117fa5750303b1580156117fa57505f5460ff166001145b61186c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016109c3565b5f805460ff1916600117905580156118aa575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b0388166119005760405162461bcd60e51b815260206004820152601760248201527f696e76616c696420726f6c6c757020636f6e747261637400000000000000000060448201526064016109c3565b5f871161194f5760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964207374616b696e672076616c7565000000000000000000000060448201526064016109c3565b5f861161199e5760405162461bcd60e51b815260206004820152601f60248201527f696e76616c6964206368616c6c656e6765206465706f7369742076616c75650060448201526064016109c3565b5f85116119ed5760405162461bcd60e51b815260206004820152601e60248201527f696e76616c6964207769746864726177616c206c6f636b20626c6f636b73000060448201526064016109c3565b5f8311611a3c5760405162461bcd60e51b815260206004820152601c60248201527f696e76616c696420676173206c696d697420616464207374616b65720000000060448201526064016109c3565b5f8211611a8b5760405162461bcd60e51b815260206004820181905260248201527f696e76616c696420676173206c696d69742072656d6f7665207374616b65727360448201526064016109c3565b5f84118015611a9b575060648411155b611b0c5760405162461bcd60e51b8152602060048201526024808201527f696e76616c6964206368616c6c656e676572207265776172642070657263656e60448201527f746167650000000000000000000000000000000000000000000000000000000060648201526084016109c3565b611b146130cb565b611b1c61314f565b609780547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038a16179055609a84905560988790556101a68690556099859055609b839055609c829055604080515f8152602081018590527f0ef80fb82bf5439b8591744c0fde771f5d93dce7a7970b1e9b7828cdc3970e9c910160405180910390a1604080515f8152602081018490527fdd4b37d1f14888147fe4be2cfaedcbf148fd07ececc856d0433241b8b6e4a7f7910160405180910390a1604080515f8152602081018690527fa46de936426e045703b2d34a292a19fde92b329018db8e0da750033876b655ba910160405180910390a18015611c7b575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b611c8d612a4a565b5f81118015611c9e5750609c548114155b611cea5760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964206e657720676173206c696d6974000000000000000000000060448201526064016109c3565b609c80549082905560408051828152602081018490527fdd4b37d1f14888147fe4be2cfaedcbf148fd07ececc856d0433241b8b6e4a7f7910161113f565b6101a26020525f90815260409020805460018201546002830180546001600160a01b03909316939192611d5a9061387a565b80601f0160208091040260200160405190810160405280929190818152602001828054611d869061387a565b8015611dd15780601f10611da857610100808354040283529160200191611dd1565b820191905f5260205f20905b815481529060010190602001808311611db457829003601f168201915b5050505050905083565b6060600182901c5f5b8115611e0b57611df5816001613a67565b9050611e02600183613ac9565b82169150611de4565b8067ffffffffffffffff811115611e2457611e2461333d565b604051908082528060200260200182016040528015611e4d578160200160208202803683370190505b5092505f60015b60ff8160ff1611611eef57600160ff82161b861615611edd5760a0611e7a600183613adc565b60ff1660ff8110611e8d57611e8d613a0d565b015485516001600160a01b0390911690869084908110611eaf57611eaf613a0d565b6001600160a01b0390921660209283029190910190910152611ed2826001613a67565b915082821015611eef575b80611ee781613af5565b915050611e54565b50505050919050565b6040805160ff80825261200082019092526060915f91829160208201611fe0803683370190505090505f5b60ff811015611fc7575f60a08260ff8110611f4057611f40613a0d565b01546001600160a01b031614801590611f8857506101a15f60a08360ff8110611f6b57611f6b613a0d565b01546001600160a01b0316815260208101919091526040015f2054155b15611fbf5782611f9781613b13565b9350506001828281518110611fae57611fae613a0d565b911515602092830291909101909101525b600101611f23565b505f8267ffffffffffffffff811115611fe257611fe261333d565b60405190808252806020026020018201604052801561200b578160200160208202803683370190505b5090505f805b60ff81101561209c5783818151811061202c5761202c613a0d565b6020026020010151156120945760a08160ff811061204c5761204c613a0d565b015483516001600160a01b039091169084908490811061206e5761206e613a0d565b6001600160a01b03909216602092830291909101909101528161209081613b13565b9250505b600101612011565b5090949350505050565b6120ae612f59565b335f9081526101a5602052604090205461210a5760405162461bcd60e51b815260206004820152601460248201527f7769746864726177616c206e6f7420657869737400000000000000000000000060448201526064016109c3565b335f9081526101a560205260409020544310156121695760405162461bcd60e51b815260206004820152601160248201527f7769746864726177616c206c6f636b656400000000000000000000000000000060448201526064016109c3565b335f9081526101a56020526040812055612181612c8e565b604080516001600160a01b0383168152905133917f89309c9b2aeaffbdce717113df9427298b20448c05919bf889e05f8c3094254b919081900360200190a26121cc81609854612fb2565b61109b6001606555565b6121de612a4a565b5f811180156121ee575060648111155b80156121fc5750609a548114155b6122485760405162461bcd60e51b815260206004820152601960248201527f696e76616c6964207265776172642070657263656e746167650000000000000060448201526064016109c3565b609a80549082905560408051828152602081018490527fa46de936426e045703b2d34a292a19fde92b329018db8e0da750033876b655ba910161113f565b61228e612a4a565b5f8111801561229f5750609b548114155b6122eb5760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964206e657720676173206c696d6974000000000000000000000060448201526064016109c3565b609b80549082905560408051828152602081018490527f0ef80fb82bf5439b8591744c0fde771f5d93dce7a7970b1e9b7828cdc3970e9c910161113f565b612331612a4a565b5f5b8381101561242957609f5f86868481811061235057612350613a0d565b90506020020160208101906123659190613461565b6001600160a01b0316815260208101919091526040015f205460ff16156123ce5760405162461bcd60e51b815260206004820152600f60248201527f696e2072656d6f766564206c697374000000000000000000000000000000000060448201526064016109c3565b6001609e5f8787858181106123e5576123e5613a0d565b90506020020160208101906123fa9190613461565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055600101612333565b505f5b8181101561248657609e5f84848481811061244957612449613a0d565b905060200201602081019061245e9190613461565b6001600160a01b0316815260208101919091526040015f20805460ff1916905560010161242c565b507fe375867e538b40218c1b3db2ccceaf875eb073e38b510449e6088c1539ac8622848484846040516124bc9493929190613b8f565b60405180910390a150505050565b6124d2612a4a565b6124da612f59565b609d546124e78282612fb2565b5f609d55604080516001600160a01b0384168152602081018390527fa1fefb6c5328a92a416e321ed50997303fe7135fd88c28b0592b21ce42b5cdd9910160405180910390a15061109b6001606555565b5f61254282611710565b61258e5760405162461bcd60e51b815260206004820152600e60248201527f696e76616c6964207374616b657200000000000000000000000000000000000060448201526064016109c3565b506001600160a01b03165f90815261019f6020526040902054600160ff9091161b90565b5f60ff8211156126045760405162461bcd60e51b815260206004820152601c60248201527f7374616b657273206c656e677468206f7574206f6620626f756e64730000000060448201526064016109c3565b5f5b828110156126dd5761263884848381811061262357612623613a0d565b905060200201602081019061056f9190613461565b6126845760405162461bcd60e51b815260206004820152600e60248201527f696e76616c6964207374616b657200000000000000000000000000000000000060448201526064016109c3565b61019f5f85858481811061269a5761269a613a0d565b90506020020160208101906126af9190613461565b6001600160a01b0316815260208101919091526040015f2054600160ff90911681901b929092179101612606565b5092915050565b6126ec612a4a565b6001600160a01b0381166127685760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109c3565b61109b81613062565b612779612a4a565b5f8111801561278a57506098548114155b6127d65760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964207374616b696e672076616c7565000000000000000000000060448201526064016109c3565b609880549082905560408051828152602081018490527f91e3ed304d49776a78bbe0df6bf7156f5433763621e5e728a3c2adfe7de74368910161113f565b5f5b60ff8160ff1610156128d9575f60a060ff80841690811061283957612839613a0d565b01546001600160a01b0316036128d1578160a08260ff1660ff811061286057612860613a0d565b0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790556128a2816001613bc0565b6001600160a01b03929092165f90815261019f60205260409020805460ff191660ff9093169290921790915550565b600101612816565b5060405162461bcd60e51b815260206004820152600960248201527f736c6f742066756c6c000000000000000000000000000000000000000000000060448201526064016109c3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b2267a7b7f00000000000000000000000000000000000000000000000000000000000000005f846040516024016129849190613bd9565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f6d454d5100000000000000000000000000000000000000000000000000000000179052609b5490517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b168152612a1a9493929190600401613c10565b5f604051808303815f87803b158015612a31575f80fd5b505af1158015612a43573d5f803e3d5ffd5b5050505050565b6033546001600160a01b031633146113275760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c3565b6001600160a01b0381165f9081526101a1602052604090205415612b0a5760405162461bcd60e51b815260206004820152601560248201527f616c726561647920696e2064656c6574654c697374000000000000000000000060448201526064016109c3565b6101a080546001810182555f919091527f7980fe0f714a613298681d64b7b8ffa7b148338dd52429f307d72798d5c317c40180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038316179055609954612b7a9043613a67565b6001600160a01b039091165f9081526101a16020526040902055565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b2267a7b7f00000000000000000000000000000000000000000000000000000000000000005f84604051602401612bf8919061376d565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0be67fcc00000000000000000000000000000000000000000000000000000000179052609c5490517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b168152612a1a9493929190600401613c10565b5f5b6101a05481101561109b57436101a15f6101a08481548110612cb457612cb4613a0d565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205411612f475760a0600161019f5f6101a08581548110612cf957612cf9613a0d565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054612d2a919060ff16613adc565b60ff1660ff8110612d3d57612d3d613a0d565b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556101a0805461019f915f9184908110612d7f57612d7f613a0d565b5f9182526020808320909101546001600160a01b031683528201929092526040018120805460ff191690556101a080546101a292919084908110612dc557612dc5613a0d565b5f9182526020808320909101546001600160a01b03168352820192909252604001812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001681556001810182905590612e2360028301826132f3565b50506101a15f6101a08381548110612e3d57612e3d613a0d565b5f9182526020808320909101546001600160a01b031683528201929092526040018120556101a08054612e7290600190613ac9565b81548110612e8257612e82613a0d565b5f918252602090912001546101a080546001600160a01b039092169183908110612eae57612eae613a0d565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506101a0805480612eeb57612eeb613c48565b5f8281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055612c90565b80612f5181613b13565b915050612c90565b600260655403612fab5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109c3565b6002606555565b8015613057575f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613001576040519150601f19603f3d011682016040523d82523d5f602084013e613006565b606091505b5050905080610d5f5760405162461bcd60e51b815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c6564000000000060448201526064016109c3565b5050565b6001606555565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff166131475760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109c3565b6113276131d3565b5f54610100900460ff166131cb5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109c3565b611327613258565b5f54610100900460ff1661324f5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109c3565b61132733613062565b5f54610100900460ff1661305b5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109c3565b60405180611fe0016040528060ff906020820280368337509192915050565b5080546132ff9061387a565b5f825580601f1061330e575050565b601f0160209004905f5260205f209081019061109b91905b80821115613339575f8155600101613326565b5090565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156133935761339361333d565b604052919050565b5f82601f8301126133aa575f80fd5b813567ffffffffffffffff8111156133c4576133c461333d565b6133d76020601f19601f8401160161336a565b8181528460208386010111156133eb575f80fd5b816020850160208301375f918101602001919091529392505050565b5f8060408385031215613418575f80fd5b82359150602083013567ffffffffffffffff811115613435575f80fd5b6134418582860161339b565b9150509250929050565b80356001600160a01b0381168114611670575f80fd5b5f60208284031215613471575f80fd5b61347a8261344b565b9392505050565b5f60208284031215613491575f80fd5b5035919050565b5f60208083850312156134a9575f80fd5b823567ffffffffffffffff808211156134c0575f80fd5b818501915085601f8301126134d3575f80fd5b8135818111156134e5576134e561333d565b8060051b91506134f684830161336a565b818152918301840191848101908884111561350f575f80fd5b938501935b83851015613534576135258561344b565b82529385019390850190613514565b98975050505050505050565b611fe0810181835f5b60ff8110156135715781516001600160a01b0316835260209283019290910190600101613549565b50505092915050565b5f8083601f84011261358a575f80fd5b50813567ffffffffffffffff8111156135a1575f80fd5b6020830191508360208260051b85010111156135bb575f80fd5b9250929050565b5f805f805f80608087890312156135d7575f80fd5b86359550602087013567ffffffffffffffff808211156135f5575f80fd5b6136018a838b0161357a565b9097509550604089013594506060890135915080821115613620575f80fd5b818901915089601f830112613633575f80fd5b813581811115613641575f80fd5b8a6020828501011115613652575f80fd5b6020830194508093505050509295509295509295565b5f60208284031215613678575f80fd5b813567ffffffffffffffff81111561368e575f80fd5b61369a8482850161339b565b949350505050565b5f805f805f805f60e0888a0312156136b8575f80fd5b6136c18861344b565b9960208901359950604089013598606081013598506080810135975060a0810135965060c00135945092505050565b5f5b8381101561370a5781810151838201526020016136f2565b50505f910152565b5f81518084526137298160208601602086016136f0565b601f01601f19169290920160200192915050565b6001600160a01b0384168152826020820152606060408201525f6137646060830184613712565b95945050505050565b602080825282518282018190525f9190848201906040850190845b818110156137ad5783516001600160a01b031683529284019291840191600101613788565b50909695505050505050565b5f805f80604085870312156137cc575f80fd5b843567ffffffffffffffff808211156137e3575f80fd5b6137ef8883890161357a565b90965094506020870135915080821115613807575f80fd5b506138148782880161357a565b95989497509550505050565b5f8060208385031215613831575f80fd5b823567ffffffffffffffff811115613847575f80fd5b6138538582860161357a565b90969095509350505050565b5f82516138708184602087016136f0565b9190910192915050565b600181811c9082168061388e57607f821691505b6020821081036138c5577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f821115610d5f57805f5260205f20601f840160051c810160208510156138f05750805b601f840160051c820191505b81811015612a43575f81556001016138fc565b815167ffffffffffffffff8111156139295761392961333d565b61393d81613937845461387a565b846138cb565b602080601f83116001811461398f575f84156139595750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613a05565b5f85815260208120601f198616915b828110156139bd5788860151825594840194600190910190840161399e565b50858210156139f957878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b505060018460011b0185555b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561170a5761170a613a3a565b808202811582820484141761170a5761170a613a3a565b5f82613ac4577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b8181038181111561170a5761170a613a3a565b60ff828116828216039081111561170a5761170a613a3a565b5f60ff821660ff8103613b0a57613b0a613a3a565b60010192915050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b4357613b43613a3a565b5060010190565b8183525f60208085019450825f5b85811015613b84576001600160a01b03613b718361344b565b1687529582019590820190600101613b58565b509495945050505050565b604081525f613ba2604083018688613b4a565b8281036020840152613bb5818587613b4a565b979650505050505050565b60ff818116838216019081111561170a5761170a613a3a565b602081526001600160a01b038251166020820152602082015160408201525f604083015160608084015261369a6080840182613712565b6001600160a01b0385168152836020820152608060408201525f613c376080830185613712565b905082606083015295945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"_messenger\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldChallengeDeposit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newChallengeDeposit\",\"type\":\"uint256\"}],\"name\":\"ChallengeDepositUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"Claimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldGasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newGasLimit\",\"type\":\"uint256\"}],\"name\":\"GasLimitAddStakerUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldGasLimit\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newGasLimit\",\"type\":\"uint256\"}],\"name\":\"GasLimitRemoveStakersUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"tmKey\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"blsKey\",\"type\":\"bytes\"}],\"name\":\"Registered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldPercentage\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPercentage\",\"type\":\"uint256\"}],\"name\":\"RewardPercentageUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"SlashRemainingClaimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"stakers\",\"type\":\"address[]\"}],\"name\":\"Slashed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"stakers\",\"type\":\"address[]\"}],\"name\":\"StakersRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldStakingValue\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newStakingValue\",\"type\":\"uint256\"}],\"name\":\"StakingValueUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"add\",\"type\":\"address[]\"},{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"remove\",\"type\":\"address[]\"}],\"name\":\"WhitelistUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unlockHeight\",\"type\":\"uint256\"}],\"name\":\"Withdrawn\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"MESSENGER\",\"outputs\":[{\"internalType\":\"contractICrossDomainMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"OTHER_STAKING\",\"outputs\":[{\"internalType\":\"contractStaking\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"blsPubkey\",\"type\":\"bytes\"}],\"name\":\"blsKeys\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"exist\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"challengeDeposit\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"claimSlashRemaining\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"claimWithdrawal\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"cleanStakerStore\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"deleteList\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"stakerAddr\",\"type\":\"address\"}],\"name\":\"deleteableHeight\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"height\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gasLimitAddStaker\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gasLimitRemoveStakers\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getActiveStakers\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_staker\",\"type\":\"address\"}],\"name\":\"getStakerBitmap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"bitmap\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStakers\",\"outputs\":[{\"internalType\":\"address[255]\",\"name\":\"\",\"type\":\"address[255]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_stakers\",\"type\":\"address[]\"}],\"name\":\"getStakersBitmap\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"bitmap\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"bitmap\",\"type\":\"uint256\"}],\"name\":\"getStakersFromBitmap\",\"outputs\":[{\"internalType\":\"address[]\",\"name\":\"stakerAddrs\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_rollupContract\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_stakingValue\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_challengeDeposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_lockBlocks\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_rewardPercentage\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimitAdd\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimitRemove\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"isActiveStaker\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"isStaker\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"}],\"name\":\"isStakerInDeleteList\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messenger\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"tmKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"blsKey\",\"type\":\"bytes\"}],\"name\":\"register\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_stakers\",\"type\":\"address[]\"}],\"name\":\"removeStaker\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"stakerAddr\",\"type\":\"address\"}],\"name\":\"removedList\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"removed\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardPercentage\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rollupContract\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"sequencersBitmap\",\"type\":\"uint256\"}],\"name\":\"slash\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"slashRemaining\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"stakerAddr\",\"type\":\"address\"}],\"name\":\"stakerIndexes\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"index\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"stakerSet\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"stakerAddr\",\"type\":\"address\"}],\"name\":\"stakers\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"tmKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"blsKey\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"stakingValue\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"tmPubkey\",\"type\":\"bytes32\"}],\"name\":\"tmKeys\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"exist\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_challengeDeposit\",\"type\":\"uint256\"}],\"name\":\"updateChallengeDeposit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasLimitAdd\",\"type\":\"uint256\"}],\"name\":\"updateGasLimitAddStaker\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_gasLimitRemove\",\"type\":\"uint256\"}],\"name\":\"updateGasLimitRemoveStakers\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_rewardPercentage\",\"type\":\"uint256\"}],\"name\":\"updateRewardPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_stakingValue\",\"type\":\"uint256\"}],\"name\":\"updateStakingValue\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"add\",\"type\":\"address[]\"},{\"internalType\":\"address[]\",\"name\":\"remove\",\"type\":\"address[]\"}],\"name\":\"updateWhitelist\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"\",\"type\":\"address[]\"},{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"\",\"type\":\"bytes\"}],\"name\":\"verifySignature\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"pure\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"stakerAddr\",\"type\":\"address\"}],\"name\":\"whitelist\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"inWhitelist\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawalLockBlocks\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"withdrawals\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"}]", + Bin: "0x60c060405234801562000010575f80fd5b5060405162003f0238038062003f02833981016040819052620000339162000127565b6001600160a01b03811660805273530000000000000000000000000000000000001560a0526200006262000069565b5062000156565b5f54610100900460ff1615620000d55760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161462000125575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f6020828403121562000138575f80fd5b81516001600160a01b03811681146200014f575f80fd5b9392505050565b60805160a051613d676200019b5f395f818161066f015281816129a70152612c3401525f81816104470152818161070c015281816129780152612c050152613d675ff3fe608060405260043610610303575f3560e01c80638142951a11610191578063ae81de53116100dc578063d51c90a911610087578063e2a6ad5f11610062578063e2a6ad5f1461092d578063f2fde38b1461094c578063f4fe7fef1461096b575f80fd5b8063d51c90a9146108a0578063dd4785f5146108b5578063df155033146108f6575f80fd5b8063c7cd469a116100b7578063c7cd469a14610843578063cde4cd1114610862578063d096c3c614610881575f80fd5b8063ae81de53146107ef578063affed0e01461080e578063bfa02ba914610824575f80fd5b80639b19251a1161013c578063a3066aab11610117578063a3066aab1461079c578063a4f209b0146107bb578063ab8c53dc146107da575f80fd5b80639b19251a1461072e5780639d48f4171461075c5780639fb82db914610788575f80fd5b80638da5cb5b1161016c5780638da5cb5b146106b05780639168ae72146106cd578063927ede2d146106fb575f80fd5b80638142951a1461063f578063831cfb581461065e5780638a565ac314610691575f80fd5b806343352d61116102515780636f1e8533116101fc578063797adbde116101d7578063797adbde146105b95780637a4e87c3146105d85780637a9262a214610613575f80fd5b80636f1e853314610560578063715018a61461057f57806374fe27b714610593575f80fd5b806352d472eb1161022c57806352d472eb146104fd5780636801579114610512578063692c565b14610531575f80fd5b806343352d61146104a857806345bc4d10146104c95780634d64903a146104e8575f80fd5b806335928991116102b15780633ccfd60b1161028c5780633ccfd60b1461046b5780633ee2a1f91461047f57806341de239b14610493575f80fd5b806335928991146103dc5780633a9bbede146103fb5780633cb747bf14610439575f80fd5b80632e407a6f116102e15780632e407a6f1461035a578063303afb9e14610386578063320ff860146103bd575f80fd5b80630d13fd7b146103075780632108db35146103305780632a28e5a314610345575b5f80fd5b348015610312575f80fd5b5061031d6101a65481565b6040519081526020015b60405180910390f35b34801561033b575f80fd5b5061031d609c5481565b6103586103533660046134c8565b61098a565b005b348015610365575f80fd5b5061031d610374366004613522565b6101a16020525f908152604090205481565b348015610391575f80fd5b506103a56103a0366004613542565b610d85565b6040516001600160a01b039091168152602001610327565b3480156103c8575f80fd5b506103586103d7366004613559565b610da4565b3480156103e7575f80fd5b506103586103f6366004613542565b6110bf565b348015610406575f80fd5b50610429610415366004613522565b609f6020525f908152604090205460ff1681565b6040519015158152602001610327565b348015610444575f80fd5b507f00000000000000000000000000000000000000000000000000000000000000006103a5565b348015610476575f80fd5b5061035861116c565b34801561048a575f80fd5b50610358611338565b34801561049e575f80fd5b5061031d60995481565b3480156104b3575f80fd5b506104bc61134a565b6040516103279190613601565b3480156104d4575f80fd5b5061031d6104e3366004613542565b611390565b3480156104f3575f80fd5b5061031d60985481565b348015610508575f80fd5b5061031d609a5481565b34801561051d575f80fd5b5061042961052c366004613522565b6116c9565b34801561053c575f80fd5b5061042961054b366004613542565b6101a46020525f908152604090205460ff1681565b34801561056b575f80fd5b5061042961057a366004613522565b611764565b34801561058a575f80fd5b506103586117dd565b34801561059e575f80fd5b506104296105ad366004613683565b60019695505050505050565b3480156105c4575f80fd5b506103a56105d3366004613542565b6117ee565b3480156105e3575f80fd5b506104296105f2366004613729565b80516020818301810180516101a38252928201919093012091525460ff1681565b34801561061e575f80fd5b5061031d61062d366004613522565b6101a56020525f908152604090205481565b34801561064a575f80fd5b50610358610659366004613763565b611817565b348015610669575f80fd5b506103a57f000000000000000000000000000000000000000000000000000000000000000081565b34801561069c575f80fd5b506103586106ab366004613542565b611cd9565b3480156106bb575f80fd5b506033546001600160a01b03166103a5565b3480156106d8575f80fd5b506106ec6106e7366004613522565b611d7c565b604051610327939291906137fe565b348015610706575f80fd5b506103a57f000000000000000000000000000000000000000000000000000000000000000081565b348015610739575f80fd5b50610429610748366004613522565b609e6020525f908152604090205460ff1681565b348015610767575f80fd5b5061077b610776366004613542565b611e2f565b6040516103279190613871565b348015610793575f80fd5b5061077b611f4c565b3480156107a7575f80fd5b506103586107b6366004613522565b6120fa565b3480156107c6575f80fd5b506103586107d5366004613542565b61222a565b3480156107e5575f80fd5b5061031d609d5481565b3480156107fa575f80fd5b50610358610809366004613542565b6122da565b348015610819575f80fd5b5061031d6101a75481565b34801561082f575f80fd5b506097546103a5906001600160a01b031681565b34801561084e575f80fd5b5061035861085d366004613883565b61237d565b34801561086d575f80fd5b5061035861087c366004613522565b61251e565b34801561088c575f80fd5b5061031d61089b366004613522565b61258c565b3480156108ab575f80fd5b5061031d609b5481565b3480156108c0575f80fd5b506108e46108cf366004613522565b61019f6020525f908152604090205460ff1681565b60405160ff9091168152602001610327565b348015610901575f80fd5b50610429610910366004613522565b6001600160a01b03165f9081526101a16020526040902054151590565b348015610938575f80fd5b5061031d6109473660046138ea565b612606565b348015610957575f80fd5b50610358610966366004613522565b612738565b348015610976575f80fd5b50610358610985366004613542565b6127c5565b335f818152609e602052604090205460ff166109ed5760405162461bcd60e51b815260206004820152601060248201527f6e6f7420696e2077686974656c6973740000000000000000000000000000000060448201526064015b60405180910390fd5b335f9081526101a260205260409020546001600160a01b031615610a535760405162461bcd60e51b815260206004820152601260248201527f616c72656164792072656769737465726564000000000000000000000000000060448201526064016109e4565b8215801590610a7157505f8381526101a4602052604090205460ff16155b610abd5760405162461bcd60e51b815260206004820152601960248201527f696e76616c69642074656e6465726d696e74207075626b65790000000000000060448201526064016109e4565b8151610100148015610af057506101a382604051610adb9190613929565b9081526040519081900360200190205460ff16155b610b3c5760405162461bcd60e51b815260206004820152601260248201527f696e76616c696420626c73207075626b6579000000000000000000000000000060448201526064016109e4565b6098543414610b8d5760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964207374616b696e672076616c7565000000000000000000000060448201526064016109e4565b6040518060600160405280610b9f3390565b6001600160a01b03908116825260208083018790526040928301869052335f9081526101a28252839020845181547fffffffffffffffffffffffff00000000000000000000000000000000000000001693169290921782558301516001820155908201516002820190610c1290826139e0565b50905050610c25610c203390565b612868565b60016101a383604051610c389190613929565b90815260408051918290036020908101909220805493151560ff199485161790555f8681526101a49092529020805490911660011790557fb9c7babb56df9f2da4a30811a6c778e4e68af88b72712d56cf62c5516e20e199610c973390565b8484604051610ca8939291906137fe565b60405180910390a1335f9081526101a26020908152604091829020825160608101845281546001600160a01b03168152600182015492810192909252600281018054610d809484019190610cfb90613944565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2790613944565b8015610d725780601f10610d4957610100808354040283529160200191610d72565b820191905f5260205f20905b815481529060010190602001808311610d5557829003601f168201915b505050505081525050612976565b505050565b60a08160ff8110610d94575f80fd5b01546001600160a01b0316905081565b610dac612ab7565b5f5b815181101561107b57610dd9828281518110610dcc57610dcc613ade565b60200260200101516116c9565b610e4b5760405162461bcd60e51b815260206004820152602160248201527f6f6e6c7920616374697665207374616b65722063616e2062652072656d6f766560448201527f640000000000000000000000000000000000000000000000000000000000000060648201526084016109e4565b6101a55f838381518110610e6157610e61613ade565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20545f14610ed75760405162461bcd60e51b815260206004820152600b60248201527f7769746864726177696e6700000000000000000000000000000000000000000060448201526064016109e4565b609954610ee49043613b38565b6101a55f848481518110610efa57610efa613ade565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2081905550610f47828281518110610f3a57610f3a613ade565b6020026020010151612b11565b818181518110610f5957610f59613ade565b60200260200101516001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d56101a55f858581518110610fa157610fa1613ade565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054604051610fd891815260200190565b60405180910390a2609e5f838381518110610ff557610ff5613ade565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81549060ff02191690556001609f5f84848151811061104257611042613ade565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101610dae565b507f3f446646c03e618be8238a586960d6d625f35c653cdca1ef59609993e8ed2c84816040516110ab9190613871565b60405180910390a16110bc81612c03565b50565b6110c7612ab7565b5f811180156110d957506101a6548114155b6111255760405162461bcd60e51b815260206004820152601f60248201527f696e76616c6964206368616c6c656e6765206465706f7369742076616c75650060448201526064016109e4565b6101a680549082905560408051828152602081018490527f36f971a40478225aeb80cfbf5e80306e8cb76d3bf7d56fdc5e490945cddb7d5591015b60405180910390a15050565b611175336116c9565b6111c15760405162461bcd60e51b815260206004820152601260248201527f6f6e6c7920616374697665207374616b6572000000000000000000000000000060448201526064016109e4565b335f9081526101a560205260409020541561121e5760405162461bcd60e51b815260206004820152600b60248201527f7769746864726177696e6700000000000000000000000000000000000000000060448201526064016109e4565b60995461122b9043613b38565b335f8181526101a5602052604090209190915561124790612b11565b335f8181526101a560209081526040918290205491519182527f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5910160405180910390a2335f908152609e60209081526040808320805460ff19908116909155609f83528184208054909116600190811790915581518181528083019092529091828101908036833701905050905033815f815181106112e9576112e9613ade565b60200260200101906001600160a01b031690816001600160a01b0316815250507f3f446646c03e618be8238a586960d6d625f35c653cdca1ef59609993e8ed2c84816040516110ab9190613871565b611340612ab7565b611348612d00565b565b611352613395565b60408051611fe08101918290529060a09060ff9082845b81546001600160a01b03168152600190910190602001808311611369575050505050905090565b6097545f906001600160a01b0316336001600160a01b0316146113f55760405162461bcd60e51b815260206004820152601460248201527f6f6e6c7920726f6c6c757020636f6e747261637400000000000000000000000060448201526064016109e4565b6113fd61301a565b5f61140783611e2f565b90505f805b82518110156115ec575f6001600160a01b031683828151811061143157611431613ade565b60200260200101516001600160a01b031603156115e4575f6101a55f85848151811061145f5761145f613ade565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205411156114e2576101a55f8483815181106114a3576114a3613ade565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f9055609854826114db9190613b38565b91506115e4565b61151c8382815181106114f7576114f7613ade565b60200260200101516001600160a01b03165f9081526101a16020526040902054151590565b6115e45760985461152d9083613b38565b9150611544838281518110610f3a57610f3a613ade565b609e5f84838151811061155957611559613ade565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81549060ff02191690556001609f5f8584815181106115a6576115a6613ade565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b60010161140c565b505f6064609a54836115fe9190613b4b565b6116089190613b62565b90506116148183613b9a565b609d5f8282546116249190613b38565b909155505060975461163f906001600160a01b031682613073565b7f654f4a61849f1b3ad10abb283d27f02d5fece7b820acc5a3b874713b58748b5a8360405161166e9190613871565b60405180910390a17f3f446646c03e618be8238a586960d6d625f35c653cdca1ef59609993e8ed2c84836040516116a59190613871565b60405180910390a16116b683612c03565b925050506116c46001606555565b919050565b6001600160a01b0381165f90815261019f602052604081205460ff1681036116f257505f919050565b6001600160a01b0382165f81815261019f602052604090205460a09061171d9060019060ff16613bad565b60ff1660ff811061173057611730613ade565b01546001600160a01b031614801561175e57506001600160a01b0382165f9081526101a16020526040902054155b92915050565b6001600160a01b0381165f90815261019f602052604081205460ff16810361178d57505f919050565b6001600160a01b0382165f81815261019f602052604090205460a0906117b89060019060ff16613bad565b60ff1660ff81106117cb576117cb613ade565b01546001600160a01b03161492915050565b6117e5612ab7565b6113485f613123565b6101a081815481106117fe575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f54610100900460ff161580801561183557505f54600160ff909116105b8061184e5750303b15801561184e57505f5460ff166001145b6118c05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016109e4565b5f805460ff1916600117905580156118fe575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b0388166119545760405162461bcd60e51b815260206004820152601760248201527f696e76616c696420726f6c6c757020636f6e747261637400000000000000000060448201526064016109e4565b5f87116119a35760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964207374616b696e672076616c7565000000000000000000000060448201526064016109e4565b5f86116119f25760405162461bcd60e51b815260206004820152601f60248201527f696e76616c6964206368616c6c656e6765206465706f7369742076616c75650060448201526064016109e4565b5f8511611a415760405162461bcd60e51b815260206004820152601e60248201527f696e76616c6964207769746864726177616c206c6f636b20626c6f636b73000060448201526064016109e4565b5f8311611a905760405162461bcd60e51b815260206004820152601c60248201527f696e76616c696420676173206c696d697420616464207374616b65720000000060448201526064016109e4565b5f8211611adf5760405162461bcd60e51b815260206004820181905260248201527f696e76616c696420676173206c696d69742072656d6f7665207374616b65727360448201526064016109e4565b5f84118015611aef575060648411155b611b605760405162461bcd60e51b8152602060048201526024808201527f696e76616c6964206368616c6c656e676572207265776172642070657263656e60448201527f746167650000000000000000000000000000000000000000000000000000000060648201526084016109e4565b611b6861318c565b611b70613210565b609780547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038a16179055609a84905560988790556101a68690556099859055609b839055609c829055604080515f8152602081018590527f0ef80fb82bf5439b8591744c0fde771f5d93dce7a7970b1e9b7828cdc3970e9c910160405180910390a1604080515f8152602081018490527fdd4b37d1f14888147fe4be2cfaedcbf148fd07ececc856d0433241b8b6e4a7f7910160405180910390a1604080515f8152602081018690527fa46de936426e045703b2d34a292a19fde92b329018db8e0da750033876b655ba910160405180910390a18015611ccf575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b611ce1612ab7565b5f81118015611cf25750609c548114155b611d3e5760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964206e657720676173206c696d6974000000000000000000000060448201526064016109e4565b609c80549082905560408051828152602081018490527fdd4b37d1f14888147fe4be2cfaedcbf148fd07ececc856d0433241b8b6e4a7f79101611160565b6101a26020525f90815260409020805460018201546002830180546001600160a01b03909316939192611dae90613944565b80601f0160208091040260200160405190810160405280929190818152602001828054611dda90613944565b8015611e255780601f10611dfc57610100808354040283529160200191611e25565b820191905f5260205f20905b815481529060010190602001808311611e0857829003601f168201915b5050505050905083565b6060600182901c5f5b8115611e5f57611e49816001613b38565b9050611e56600183613b9a565b82169150611e38565b8067ffffffffffffffff811115611e7857611e786133fe565b604051908082528060200260200182016040528015611ea1578160200160208202803683370190505b5092505f60015b60ff8160ff1611611f4357600160ff82161b861615611f315760a0611ece600183613bad565b60ff1660ff8110611ee157611ee1613ade565b015485516001600160a01b0390911690869084908110611f0357611f03613ade565b6001600160a01b0390921660209283029190910190910152611f26826001613b38565b915082821015611f43575b80611f3b81613bc6565b915050611ea8565b50505050919050565b6040805160ff80825261200082019092526060915f91829160208201611fe0803683370190505090505f5b60ff81101561201b575f60a08260ff8110611f9457611f94613ade565b01546001600160a01b031614801590611fdc57506101a15f60a08360ff8110611fbf57611fbf613ade565b01546001600160a01b0316815260208101919091526040015f2054155b156120135782611feb81613be4565b935050600182828151811061200257612002613ade565b911515602092830291909101909101525b600101611f77565b505f8267ffffffffffffffff811115612036576120366133fe565b60405190808252806020026020018201604052801561205f578160200160208202803683370190505b5090505f805b60ff8110156120f05783818151811061208057612080613ade565b6020026020010151156120e85760a08160ff81106120a0576120a0613ade565b015483516001600160a01b03909116908490849081106120c2576120c2613ade565b6001600160a01b0390921660209283029190910190910152816120e481613be4565b9250505b600101612065565b5090949350505050565b61210261301a565b335f9081526101a5602052604090205461215e5760405162461bcd60e51b815260206004820152601460248201527f7769746864726177616c206e6f7420657869737400000000000000000000000060448201526064016109e4565b335f9081526101a560205260409020544310156121bd5760405162461bcd60e51b815260206004820152601160248201527f7769746864726177616c206c6f636b656400000000000000000000000000000060448201526064016109e4565b335f9081526101a560205260408120556121d5612d00565b604080516001600160a01b0383168152905133917f89309c9b2aeaffbdce717113df9427298b20448c05919bf889e05f8c3094254b919081900360200190a261222081609854613073565b6110bc6001606555565b612232612ab7565b5f81118015612242575060648111155b80156122505750609a548114155b61229c5760405162461bcd60e51b815260206004820152601960248201527f696e76616c6964207265776172642070657263656e746167650000000000000060448201526064016109e4565b609a80549082905560408051828152602081018490527fa46de936426e045703b2d34a292a19fde92b329018db8e0da750033876b655ba9101611160565b6122e2612ab7565b5f811180156122f35750609b548114155b61233f5760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964206e657720676173206c696d6974000000000000000000000060448201526064016109e4565b609b80549082905560408051828152602081018490527f0ef80fb82bf5439b8591744c0fde771f5d93dce7a7970b1e9b7828cdc3970e9c9101611160565b612385612ab7565b5f5b8381101561247d57609f5f8686848181106123a4576123a4613ade565b90506020020160208101906123b99190613522565b6001600160a01b0316815260208101919091526040015f205460ff16156124225760405162461bcd60e51b815260206004820152600f60248201527f696e2072656d6f766564206c697374000000000000000000000000000000000060448201526064016109e4565b6001609e5f87878581811061243957612439613ade565b905060200201602081019061244e9190613522565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055600101612387565b505f5b818110156124da57609e5f84848481811061249d5761249d613ade565b90506020020160208101906124b29190613522565b6001600160a01b0316815260208101919091526040015f20805460ff19169055600101612480565b507fe375867e538b40218c1b3db2ccceaf875eb073e38b510449e6088c1539ac8622848484846040516125109493929190613c55565b60405180910390a150505050565b612526612ab7565b61252e61301a565b609d5461253b8282613073565b5f609d55604080516001600160a01b0384168152602081018390527fa1fefb6c5328a92a416e321ed50997303fe7135fd88c28b0592b21ce42b5cdd9910160405180910390a1506110bc6001606555565b5f61259682611764565b6125e25760405162461bcd60e51b815260206004820152600e60248201527f696e76616c6964207374616b657200000000000000000000000000000000000060448201526064016109e4565b506001600160a01b03165f90815261019f6020526040902054600160ff9091161b90565b5f60ff8211156126585760405162461bcd60e51b815260206004820152601c60248201527f7374616b657273206c656e677468206f7574206f6620626f756e64730000000060448201526064016109e4565b5f5b828110156127315761268c84848381811061267757612677613ade565b905060200201602081019061057a9190613522565b6126d85760405162461bcd60e51b815260206004820152600e60248201527f696e76616c6964207374616b657200000000000000000000000000000000000060448201526064016109e4565b61019f5f8585848181106126ee576126ee613ade565b90506020020160208101906127039190613522565b6001600160a01b0316815260208101919091526040015f2054600160ff90911681901b92909217910161265a565b5092915050565b612740612ab7565b6001600160a01b0381166127bc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109e4565b6110bc81613123565b6127cd612ab7565b5f811180156127de57506098548114155b61282a5760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964207374616b696e672076616c7565000000000000000000000060448201526064016109e4565b609880549082905560408051828152602081018490527f91e3ed304d49776a78bbe0df6bf7156f5433763621e5e728a3c2adfe7de743689101611160565b5f5b60ff8160ff16101561292d575f60a060ff80841690811061288d5761288d613ade565b01546001600160a01b031603612925578160a08260ff1660ff81106128b4576128b4613ade565b0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790556128f6816001613c86565b6001600160a01b03929092165f90815261019f60205260409020805460ff191660ff9093169290921790915550565b60010161286a565b5060405162461bcd60e51b815260206004820152600960248201527f736c6f742066756c6c000000000000000000000000000000000000000000000060448201526064016109e4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b2267a7b7f00000000000000000000000000000000000000000000000000000000000000005f6101a754856040516024016129dd929190613c9f565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f7046529b00000000000000000000000000000000000000000000000000000000179052609b5490517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b168152612a739493929190600401613cdd565b5f604051808303815f87803b158015612a8a575f80fd5b505af1158015612a9c573d5f803e3d5ffd5b505050506101a7546001612ab09190613b38565b6101a75550565b6033546001600160a01b031633146113485760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109e4565b6001600160a01b0381165f9081526101a1602052604090205415612b775760405162461bcd60e51b815260206004820152601560248201527f616c726561647920696e2064656c6574654c697374000000000000000000000060448201526064016109e4565b6101a080546001810182555f919091527f7980fe0f714a613298681d64b7b8ffa7b148338dd52429f307d72798d5c317c40180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038316179055609954612be79043613b38565b6001600160a01b039091165f9081526101a16020526040902055565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b2267a7b7f00000000000000000000000000000000000000000000000000000000000000005f6101a75485604051602401612c6a929190613d15565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcce6cf9f00000000000000000000000000000000000000000000000000000000179052609c5490517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b168152612a739493929190600401613cdd565b5f5b6101a0548110156110bc575f6001600160a01b03166101a08281548110612d2b57612d2b613ade565b5f918252602090912001546001600160a01b031603612e66576101a15f6101a08381548110612d5c57612d5c613ade565b5f9182526020808320909101546001600160a01b031683528201929092526040018120556101a08054612d9190600190613b9a565b81548110612da157612da1613ade565b5f918252602090912001546101a080546001600160a01b039092169183908110612dcd57612dcd613ade565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506101a0805480612e0a57612e0a613d2d565b5f8281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055612d02565b436101a15f6101a08481548110612e7f57612e7f613ade565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054116130085760a0600161019f5f6101a08581548110612ec457612ec4613ade565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054612ef5919060ff16613bad565b60ff1660ff8110612f0857612f08613ade565b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556101a0805461019f915f9184908110612f4a57612f4a613ade565b5f9182526020808320909101546001600160a01b031683528201929092526040018120805460ff191690556101a080546101a292919084908110612f9057612f90613ade565b5f9182526020808320909101546001600160a01b03168352820192909252604001812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001681556001810182905590612fee60028301826133b4565b50506101a15f6101a08381548110612d5c57612d5c613ade565b8061301281613be4565b915050612d02565b60026065540361306c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109e4565b6002606555565b8015613118575f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146130c2576040519150601f19603f3d011682016040523d82523d5f602084013e6130c7565b606091505b5050905080610d805760405162461bcd60e51b815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c6564000000000060448201526064016109e4565b5050565b6001606555565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff166132085760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109e4565b611348613294565b5f54610100900460ff1661328c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109e4565b611348613319565b5f54610100900460ff166133105760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109e4565b61134833613123565b5f54610100900460ff1661311c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109e4565b60405180611fe0016040528060ff906020820280368337509192915050565b5080546133c090613944565b5f825580601f106133cf575050565b601f0160209004905f5260205f20908101906110bc91905b808211156133fa575f81556001016133e7565b5090565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613454576134546133fe565b604052919050565b5f82601f83011261346b575f80fd5b813567ffffffffffffffff811115613485576134856133fe565b6134986020601f19601f8401160161342b565b8181528460208386010111156134ac575f80fd5b816020850160208301375f918101602001919091529392505050565b5f80604083850312156134d9575f80fd5b82359150602083013567ffffffffffffffff8111156134f6575f80fd5b6135028582860161345c565b9150509250929050565b80356001600160a01b03811681146116c4575f80fd5b5f60208284031215613532575f80fd5b61353b8261350c565b9392505050565b5f60208284031215613552575f80fd5b5035919050565b5f602080838503121561356a575f80fd5b823567ffffffffffffffff80821115613581575f80fd5b818501915085601f830112613594575f80fd5b8135818111156135a6576135a66133fe565b8060051b91506135b784830161342b565b81815291830184019184810190888411156135d0575f80fd5b938501935b838510156135f5576135e68561350c565b825293850193908501906135d5565b98975050505050505050565b611fe0810181835f5b60ff8110156136325781516001600160a01b031683526020928301929091019060010161360a565b50505092915050565b5f8083601f84011261364b575f80fd5b50813567ffffffffffffffff811115613662575f80fd5b6020830191508360208260051b850101111561367c575f80fd5b9250929050565b5f805f805f8060808789031215613698575f80fd5b86359550602087013567ffffffffffffffff808211156136b6575f80fd5b6136c28a838b0161363b565b90975095506040890135945060608901359150808211156136e1575f80fd5b818901915089601f8301126136f4575f80fd5b813581811115613702575f80fd5b8a6020828501011115613713575f80fd5b6020830194508093505050509295509295509295565b5f60208284031215613739575f80fd5b813567ffffffffffffffff81111561374f575f80fd5b61375b8482850161345c565b949350505050565b5f805f805f805f60e0888a031215613779575f80fd5b6137828861350c565b9960208901359950604089013598606081013598506080810135975060a0810135965060c00135945092505050565b5f5b838110156137cb5781810151838201526020016137b3565b50505f910152565b5f81518084526137ea8160208601602086016137b1565b601f01601f19169290920160200192915050565b6001600160a01b0384168152826020820152606060408201525f61382560608301846137d3565b95945050505050565b5f815180845260208085019450602084015f5b838110156138665781516001600160a01b031687529582019590820190600101613841565b509495945050505050565b602081525f61353b602083018461382e565b5f805f8060408587031215613896575f80fd5b843567ffffffffffffffff808211156138ad575f80fd5b6138b98883890161363b565b909650945060208701359150808211156138d1575f80fd5b506138de8782880161363b565b95989497509550505050565b5f80602083850312156138fb575f80fd5b823567ffffffffffffffff811115613911575f80fd5b61391d8582860161363b565b90969095509350505050565b5f825161393a8184602087016137b1565b9190910192915050565b600181811c9082168061395857607f821691505b60208210810361398f577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f821115610d8057805f5260205f20601f840160051c810160208510156139ba5750805b601f840160051c820191505b818110156139d9575f81556001016139c6565b5050505050565b815167ffffffffffffffff8111156139fa576139fa6133fe565b613a0e81613a088454613944565b84613995565b602080601f831160018114613a60575f8415613a2a5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613ad6565b5f85815260208120601f198616915b82811015613a8e57888601518255948401946001909101908401613a6f565b5085821015613aca57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b505060018460011b0185555b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561175e5761175e613b0b565b808202811582820484141761175e5761175e613b0b565b5f82613b95577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b8181038181111561175e5761175e613b0b565b60ff828116828216039081111561175e5761175e613b0b565b5f60ff821660ff8103613bdb57613bdb613b0b565b60010192915050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613c1457613c14613b0b565b5060010190565b8183525f60208085019450825f5b85811015613866576001600160a01b03613c428361350c565b1687529582019590820190600101613c29565b604081525f613c68604083018688613c1b565b8281036020840152613c7b818587613c1b565b979650505050505050565b60ff818116838216019081111561175e5761175e613b0b565b828152604060208201526001600160a01b038251166040820152602082015160608201525f60408301516060608084015261382560a08401826137d3565b6001600160a01b0385168152836020820152608060408201525f613d0460808301856137d3565b905082606083015295945050505050565b828152604060208201525f61375b604083018461382e565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea164736f6c6343000818000a", } // L1StakingABI is the input ABI used to generate the binding from. @@ -729,6 +729,37 @@ func (_L1Staking *L1StakingCallerSession) Messenger() (common.Address, error) { return _L1Staking.Contract.Messenger(&_L1Staking.CallOpts) } +// Nonce is a free data retrieval call binding the contract method 0xaffed0e0. +// +// Solidity: function nonce() view returns(uint256) +func (_L1Staking *L1StakingCaller) Nonce(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _L1Staking.contract.Call(opts, &out, "nonce") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// Nonce is a free data retrieval call binding the contract method 0xaffed0e0. +// +// Solidity: function nonce() view returns(uint256) +func (_L1Staking *L1StakingSession) Nonce() (*big.Int, error) { + return _L1Staking.Contract.Nonce(&_L1Staking.CallOpts) +} + +// Nonce is a free data retrieval call binding the contract method 0xaffed0e0. +// +// Solidity: function nonce() view returns(uint256) +func (_L1Staking *L1StakingCallerSession) Nonce() (*big.Int, error) { + return _L1Staking.Contract.Nonce(&_L1Staking.CallOpts) +} + // Owner is a free data retrieval call binding the contract method 0x8da5cb5b. // // Solidity: function owner() view returns(address) diff --git a/bindings/bindings/l1staking_more.go b/bindings/bindings/l1staking_more.go index c3a97338..a72d81cd 100644 --- a/bindings/bindings/l1staking_more.go +++ b/bindings/bindings/l1staking_more.go @@ -9,11 +9,11 @@ import ( "morph-l2/bindings/solc" ) -const L1StakingStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_array(t_uint256)1027_storage\"},{\"astId\":1003,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"_owner\",\"offset\":0,\"slot\":\"51\",\"type\":\"t_address\"},{\"astId\":1004,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"52\",\"type\":\"t_array(t_uint256)1026_storage\"},{\"astId\":1005,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"_status\",\"offset\":0,\"slot\":\"101\",\"type\":\"t_uint256\"},{\"astId\":1006,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"102\",\"type\":\"t_array(t_uint256)1026_storage\"},{\"astId\":1007,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"rollupContract\",\"offset\":0,\"slot\":\"151\",\"type\":\"t_address\"},{\"astId\":1008,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"stakingValue\",\"offset\":0,\"slot\":\"152\",\"type\":\"t_uint256\"},{\"astId\":1009,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"withdrawalLockBlocks\",\"offset\":0,\"slot\":\"153\",\"type\":\"t_uint256\"},{\"astId\":1010,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"rewardPercentage\",\"offset\":0,\"slot\":\"154\",\"type\":\"t_uint256\"},{\"astId\":1011,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"gasLimitAddStaker\",\"offset\":0,\"slot\":\"155\",\"type\":\"t_uint256\"},{\"astId\":1012,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"gasLimitRemoveStakers\",\"offset\":0,\"slot\":\"156\",\"type\":\"t_uint256\"},{\"astId\":1013,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"slashRemaining\",\"offset\":0,\"slot\":\"157\",\"type\":\"t_uint256\"},{\"astId\":1014,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"whitelist\",\"offset\":0,\"slot\":\"158\",\"type\":\"t_mapping(t_address,t_bool)\"},{\"astId\":1015,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"removedList\",\"offset\":0,\"slot\":\"159\",\"type\":\"t_mapping(t_address,t_bool)\"},{\"astId\":1016,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"stakerSet\",\"offset\":0,\"slot\":\"160\",\"type\":\"t_array(t_address)1025_storage\"},{\"astId\":1017,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"stakerIndexes\",\"offset\":0,\"slot\":\"415\",\"type\":\"t_mapping(t_address,t_uint8)\"},{\"astId\":1018,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"deleteList\",\"offset\":0,\"slot\":\"416\",\"type\":\"t_array(t_address)dyn_storage\"},{\"astId\":1019,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"deleteableHeight\",\"offset\":0,\"slot\":\"417\",\"type\":\"t_mapping(t_address,t_uint256)\"},{\"astId\":1020,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"stakers\",\"offset\":0,\"slot\":\"418\",\"type\":\"t_mapping(t_address,t_struct(StakerInfo)1028_storage)\"},{\"astId\":1021,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"blsKeys\",\"offset\":0,\"slot\":\"419\",\"type\":\"t_mapping(t_bytes_memory_ptr,t_bool)\"},{\"astId\":1022,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"tmKeys\",\"offset\":0,\"slot\":\"420\",\"type\":\"t_mapping(t_bytes32,t_bool)\"},{\"astId\":1023,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"withdrawals\",\"offset\":0,\"slot\":\"421\",\"type\":\"t_mapping(t_address,t_uint256)\"},{\"astId\":1024,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"challengeDeposit\",\"offset\":0,\"slot\":\"422\",\"type\":\"t_uint256\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_address)1025_storage\":{\"encoding\":\"inplace\",\"label\":\"address[255]\",\"numberOfBytes\":\"8160\"},\"t_array(t_address)dyn_storage\":{\"encoding\":\"dynamic_array\",\"label\":\"address[]\",\"numberOfBytes\":\"32\"},\"t_array(t_uint256)1026_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\"},\"t_array(t_uint256)1027_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[50]\",\"numberOfBytes\":\"1600\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_bytes_memory_ptr\":{\"encoding\":\"bytes\",\"label\":\"bytes\",\"numberOfBytes\":\"32\"},\"t_bytes_storage\":{\"encoding\":\"bytes\",\"label\":\"bytes\",\"numberOfBytes\":\"32\"},\"t_mapping(t_address,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_bool\"},\"t_mapping(t_address,t_struct(StakerInfo)1028_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e struct Types.StakerInfo)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_struct(StakerInfo)1028_storage\"},\"t_mapping(t_address,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_uint256\"},\"t_mapping(t_address,t_uint8)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e uint8)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_uint8\"},\"t_mapping(t_bytes32,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_bool\"},\"t_mapping(t_bytes_memory_ptr,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes_memory_ptr\",\"value\":\"t_bool\"},\"t_struct(StakerInfo)1028_storage\":{\"encoding\":\"inplace\",\"label\":\"struct Types.StakerInfo\",\"numberOfBytes\":\"96\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}" +const L1StakingStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_array(t_uint256)1028_storage\"},{\"astId\":1003,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"_owner\",\"offset\":0,\"slot\":\"51\",\"type\":\"t_address\"},{\"astId\":1004,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"52\",\"type\":\"t_array(t_uint256)1027_storage\"},{\"astId\":1005,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"_status\",\"offset\":0,\"slot\":\"101\",\"type\":\"t_uint256\"},{\"astId\":1006,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"102\",\"type\":\"t_array(t_uint256)1027_storage\"},{\"astId\":1007,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"rollupContract\",\"offset\":0,\"slot\":\"151\",\"type\":\"t_address\"},{\"astId\":1008,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"stakingValue\",\"offset\":0,\"slot\":\"152\",\"type\":\"t_uint256\"},{\"astId\":1009,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"withdrawalLockBlocks\",\"offset\":0,\"slot\":\"153\",\"type\":\"t_uint256\"},{\"astId\":1010,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"rewardPercentage\",\"offset\":0,\"slot\":\"154\",\"type\":\"t_uint256\"},{\"astId\":1011,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"gasLimitAddStaker\",\"offset\":0,\"slot\":\"155\",\"type\":\"t_uint256\"},{\"astId\":1012,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"gasLimitRemoveStakers\",\"offset\":0,\"slot\":\"156\",\"type\":\"t_uint256\"},{\"astId\":1013,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"slashRemaining\",\"offset\":0,\"slot\":\"157\",\"type\":\"t_uint256\"},{\"astId\":1014,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"whitelist\",\"offset\":0,\"slot\":\"158\",\"type\":\"t_mapping(t_address,t_bool)\"},{\"astId\":1015,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"removedList\",\"offset\":0,\"slot\":\"159\",\"type\":\"t_mapping(t_address,t_bool)\"},{\"astId\":1016,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"stakerSet\",\"offset\":0,\"slot\":\"160\",\"type\":\"t_array(t_address)1026_storage\"},{\"astId\":1017,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"stakerIndexes\",\"offset\":0,\"slot\":\"415\",\"type\":\"t_mapping(t_address,t_uint8)\"},{\"astId\":1018,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"deleteList\",\"offset\":0,\"slot\":\"416\",\"type\":\"t_array(t_address)dyn_storage\"},{\"astId\":1019,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"deleteableHeight\",\"offset\":0,\"slot\":\"417\",\"type\":\"t_mapping(t_address,t_uint256)\"},{\"astId\":1020,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"stakers\",\"offset\":0,\"slot\":\"418\",\"type\":\"t_mapping(t_address,t_struct(StakerInfo)1029_storage)\"},{\"astId\":1021,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"blsKeys\",\"offset\":0,\"slot\":\"419\",\"type\":\"t_mapping(t_bytes_memory_ptr,t_bool)\"},{\"astId\":1022,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"tmKeys\",\"offset\":0,\"slot\":\"420\",\"type\":\"t_mapping(t_bytes32,t_bool)\"},{\"astId\":1023,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"withdrawals\",\"offset\":0,\"slot\":\"421\",\"type\":\"t_mapping(t_address,t_uint256)\"},{\"astId\":1024,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"challengeDeposit\",\"offset\":0,\"slot\":\"422\",\"type\":\"t_uint256\"},{\"astId\":1025,\"contract\":\"contracts/l1/staking/L1Staking.sol:L1Staking\",\"label\":\"nonce\",\"offset\":0,\"slot\":\"423\",\"type\":\"t_uint256\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_address)1026_storage\":{\"encoding\":\"inplace\",\"label\":\"address[255]\",\"numberOfBytes\":\"8160\"},\"t_array(t_address)dyn_storage\":{\"encoding\":\"dynamic_array\",\"label\":\"address[]\",\"numberOfBytes\":\"32\"},\"t_array(t_uint256)1027_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\"},\"t_array(t_uint256)1028_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[50]\",\"numberOfBytes\":\"1600\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_bytes_memory_ptr\":{\"encoding\":\"bytes\",\"label\":\"bytes\",\"numberOfBytes\":\"32\"},\"t_bytes_storage\":{\"encoding\":\"bytes\",\"label\":\"bytes\",\"numberOfBytes\":\"32\"},\"t_mapping(t_address,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_bool\"},\"t_mapping(t_address,t_struct(StakerInfo)1029_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e struct Types.StakerInfo)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_struct(StakerInfo)1029_storage\"},\"t_mapping(t_address,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_uint256\"},\"t_mapping(t_address,t_uint8)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e uint8)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_uint8\"},\"t_mapping(t_bytes32,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_bool\"},\"t_mapping(t_bytes_memory_ptr,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes_memory_ptr\",\"value\":\"t_bool\"},\"t_struct(StakerInfo)1029_storage\":{\"encoding\":\"inplace\",\"label\":\"struct Types.StakerInfo\",\"numberOfBytes\":\"96\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}" var L1StakingStorageLayout = new(solc.StorageLayout) -var L1StakingDeployedBin = "0x6080604052600436106102f8575f3560e01c80637a9262a211610191578063ab8c53dc116100dc578063d51c90a911610087578063e2a6ad5f11610062578063e2a6ad5f14610940578063f2fde38b1461095f578063f4fe7fef1461097e575f80fd5b8063d51c90a9146108a6578063dd4785f5146108bb578063df155033146108fc575f80fd5b8063c7cd469a116100b7578063c7cd469a14610849578063cde4cd1114610868578063d096c3c614610887575f80fd5b8063ab8c53dc146107e9578063ae81de53146107fe578063bfa02ba91461081d575f80fd5b8063927ede2d1161013c5780639fb82db9116101175780639fb82db914610797578063a3066aab146107ab578063a4f209b0146107ca575f80fd5b8063927ede2d1461070a5780639b19251a1461073d5780639d48f4171461076b575f80fd5b80638a565ac31161016c5780638a565ac3146106935780638da5cb5b146106b25780639168ae72146106dc575f80fd5b80637a9262a2146106155780638142951a14610641578063831cfb5814610660575f80fd5b806341de239b11610251578063692c565b116101fc57806374fe27b7116101d757806374fe27b714610595578063797adbde146105bb5780637a4e87c3146105da575f80fd5b8063692c565b146105335780636f1e853314610562578063715018a614610581575f80fd5b80634d64903a1161022c5780634d64903a146104ea57806352d472eb146104ff5780636801579114610514575f80fd5b806341de239b1461049557806343352d61146104aa57806345bc4d10146104cb575f80fd5b8063320ff860116102b15780633cb747bf1161028c5780633cb747bf1461043b5780633ccfd60b1461046d5780633ee2a1f914610481575f80fd5b8063320ff860146103bf57806335928991146103de5780633a9bbede146103fd575f80fd5b80632a28e5a3116102e15780632a28e5a31461033a5780632e407a6f1461034f578063303afb9e1461037b575f80fd5b80630d13fd7b146102fc5780632108db3514610325575b5f80fd5b348015610307575f80fd5b506103126101a65481565b6040519081526020015b60405180910390f35b348015610330575f80fd5b50610312609c5481565b61034d610348366004613d4e565b61099d565b005b34801561035a575f80fd5b50610312610369366004613db5565b6101a16020525f908152604090205481565b348015610386575f80fd5b5061039a610395366004613dd5565b610e5f565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161031c565b3480156103ca575f80fd5b5061034d6103d9366004613dec565b610e8b565b3480156103e9575f80fd5b5061034d6103f8366004613dd5565b61127a565b348015610408575f80fd5b5061042b610417366004613db5565b609f6020525f908152604090205460ff1681565b604051901515815260200161031c565b348015610446575f80fd5b507f000000000000000000000000000000000000000000000000000000000000000061039a565b348015610478575f80fd5b5061034d611341565b34801561048c575f80fd5b5061034d611579565b3480156104a0575f80fd5b5061031260995481565b3480156104b5575f80fd5b506104be61158b565b60405161031c9190613e94565b3480156104d6575f80fd5b506103126104e5366004613dd5565b6115de565b3480156104f5575f80fd5b5061031260985481565b34801561050a575f80fd5b50610312609a5481565b34801561051f575f80fd5b5061042b61052e366004613db5565b61199a565b34801561053e575f80fd5b5061042b61054d366004613dd5565b6101a46020525f908152604090205460ff1681565b34801561056d575f80fd5b5061042b61057c366004613db5565b611a69565b34801561058c575f80fd5b5061034d611b09565b3480156105a0575f80fd5b5061042b6105af366004613f23565b60019695505050505050565b3480156105c6575f80fd5b5061039a6105d5366004613dd5565b611b1a565b3480156105e5575f80fd5b5061042b6105f4366004613fc9565b80516020818301810180516101a38252928201919093012091525460ff1681565b348015610620575f80fd5b5061031261062f366004613db5565b6101a56020525f908152604090205481565b34801561064c575f80fd5b5061034d61065b366004614003565b611b50565b34801561066b575f80fd5b5061039a7f000000000000000000000000000000000000000000000000000000000000000081565b34801561069e575f80fd5b5061034d6106ad366004613dd5565b61211a565b3480156106bd575f80fd5b5060335473ffffffffffffffffffffffffffffffffffffffff1661039a565b3480156106e7575f80fd5b506106fb6106f6366004613db5565b6121d7565b60405161031c939291906140bc565b348015610715575f80fd5b5061039a7f000000000000000000000000000000000000000000000000000000000000000081565b348015610748575f80fd5b5061042b610757366004613db5565b609e6020525f908152604090205460ff1681565b348015610776575f80fd5b5061078a610785366004613dd5565b612297565b60405161031c91906140f9565b3480156107a2575f80fd5b5061078a6123ce565b3480156107b6575f80fd5b5061034d6107c5366004613db5565b6125b0565b3480156107d5575f80fd5b5061034d6107e4366004613dd5565b612721565b3480156107f4575f80fd5b50610312609d5481565b348015610809575f80fd5b5061034d610818366004613dd5565b6127eb565b348015610828575f80fd5b5060975461039a9073ffffffffffffffffffffffffffffffffffffffff1681565b348015610854575f80fd5b5061034d610863366004614152565b6128a8565b348015610873575f80fd5b5061034d610882366004613db5565b612ac6565b348015610892575f80fd5b506103126108a1366004613db5565b612b41565b3480156108b1575f80fd5b50610312609b5481565b3480156108c6575f80fd5b506108ea6108d5366004613db5565b61019f6020525f908152604090205460ff1681565b60405160ff909116815260200161031c565b348015610907575f80fd5b5061042b610916366004613db5565b73ffffffffffffffffffffffffffffffffffffffff165f9081526101a16020526040902054151590565b34801561094b575f80fd5b5061031261095a3660046141b9565b612be2565b34801561096a575f80fd5b5061034d610979366004613db5565b612d55565b348015610989575f80fd5b5061034d610998366004613dd5565b612e09565b335f818152609e602052604090205460ff16610a1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6e6f7420696e2077686974656c6973740000000000000000000000000000000060448201526064015b60405180910390fd5b335f9081526101a2602052604090205473ffffffffffffffffffffffffffffffffffffffff1615610aa7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f616c7265616479207265676973746572656400000000000000000000000000006044820152606401610a11565b8215801590610ac557505f8381526101a4602052604090205460ff16155b610b2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f696e76616c69642074656e6465726d696e74207075626b6579000000000000006044820152606401610a11565b8151610100148015610b5e57506101a382604051610b4991906141f8565b9081526040519081900360200190205460ff16155b610bc4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e76616c696420626c73207075626b657900000000000000000000000000006044820152606401610a11565b6098543414610c2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c6964207374616b696e672076616c756500000000000000000000006044820152606401610a11565b6040518060600160405280610c413390565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083018790526040928301869052335f9081526101a28252839020845181547fffffffffffffffffffffffff00000000000000000000000000000000000000001693169290921782558301516001820155908201516002820190610cc190826142a8565b50905050610cd4610ccf3390565b612ec6565b60016101a383604051610ce791906141f8565b9081526040805191829003602090810190922080549315157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009485161790555f8681526101a49092529020805490911660011790557fb9c7babb56df9f2da4a30811a6c778e4e68af88b72712d56cf62c5516e20e199610d643390565b8484604051610d75939291906140bc565b60405180910390a1335f9081526101a260209081526040918290208251606081018452815473ffffffffffffffffffffffffffffffffffffffff168152600182015492810192909252600281018054610e5a9484019190610dd590614213565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0190614213565b8015610e4c5780601f10610e2357610100808354040283529160200191610e4c565b820191905f5260205f20905b815481529060010190602001808311610e2f57829003601f168201915b505050505081525050613033565b505050565b60a08160ff8110610e6e575f80fd5b015473ffffffffffffffffffffffffffffffffffffffff16905081565b610e93613186565b5f5b815181101561123657610ec0828281518110610eb357610eb36143c4565b602002602001015161199a565b610f4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f6f6e6c7920616374697665207374616b65722063616e2062652072656d6f766560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610a11565b6101a55f838381518110610f6257610f626143c4565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20545f1461100c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f7769746864726177696e670000000000000000000000000000000000000000006044820152606401610a11565b609954611019904361441e565b6101a55f84848151811061102f5761102f6143c4565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550611096828281518110611089576110896143c4565b6020026020010151613207565b8181815181106110a8576110a86143c4565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d56101a55f8585815181106110fd576110fd6143c4565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460405161114e91815260200190565b60405180910390a2609e5f83838151811061116b5761116b6143c4565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81549060ff02191690556001609f5f8484815181106111d2576111d26143c4565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff1682528101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055600101610e95565b507f3f446646c03e618be8238a586960d6d625f35c653cdca1ef59609993e8ed2c848160405161126691906140f9565b60405180910390a16112778161333a565b50565b611282613186565b5f8111801561129457506101a6548114155b6112fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f696e76616c6964206368616c6c656e6765206465706f7369742076616c7565006044820152606401610a11565b6101a680549082905560408051828152602081018490527f36f971a40478225aeb80cfbf5e80306e8cb76d3bf7d56fdc5e490945cddb7d5591015b60405180910390a15050565b61134a3361199a565b6113b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6f6e6c7920616374697665207374616b657200000000000000000000000000006044820152606401610a11565b335f9081526101a5602052604090205415611427576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f7769746864726177696e670000000000000000000000000000000000000000006044820152606401610a11565b609954611434904361441e565b335f8181526101a5602052604090209190915561145090613207565b335f8181526101a560209081526040918290205491519182527f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5910160405180910390a2335f908152609e6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00908116909155609f83528184208054909116600190811790915581518181528083019092529091828101908036833701905050905033815f81518110611510576115106143c4565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f3f446646c03e618be8238a586960d6d625f35c653cdca1ef59609993e8ed2c848160405161126691906140f9565b611581613186565b61158961345d565b565b611593613bdf565b60408051611fe08101918290529060a09060ff9082845b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116115aa575050505050905090565b6097545f9073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6f6e6c7920726f6c6c757020636f6e74726163740000000000000000000000006044820152606401610a11565b61167f6137ae565b5f61168983612297565b90505f805b82518110156118b0575f6101a55f8584815181106116ae576116ae6143c4565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541115611765576101a55f84838151811061170c5761170c6143c4565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f90556098548261175e919061441e565b91506118a8565b6117ac83828151811061177a5761177a6143c4565b602002602001015173ffffffffffffffffffffffffffffffffffffffff165f9081526101a16020526040902054151590565b6118a8576098546117bd908361441e565b91506117d4838281518110611089576110896143c4565b609e5f8483815181106117e9576117e96143c4565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81549060ff02191690556001609f5f858481518110611850576118506143c4565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b60010161168e565b505f6064609a54836118c29190614431565b6118cc9190614448565b90506118d88183614480565b609d5f8282546118e8919061441e565b90915550506097546119109073ffffffffffffffffffffffffffffffffffffffff1682613821565b7f654f4a61849f1b3ad10abb283d27f02d5fece7b820acc5a3b874713b58748b5a8360405161193f91906140f9565b60405180910390a17f3f446646c03e618be8238a586960d6d625f35c653cdca1ef59609993e8ed2c848360405161197691906140f9565b60405180910390a16119878361333a565b925050506119956001606555565b919050565b73ffffffffffffffffffffffffffffffffffffffff81165f90815261019f602052604081205460ff1681036119d057505f919050565b73ffffffffffffffffffffffffffffffffffffffff82165f81815261019f602052604090205460a090611a089060019060ff16614493565b60ff1660ff8110611a1b57611a1b6143c4565b015473ffffffffffffffffffffffffffffffffffffffff16148015611a63575073ffffffffffffffffffffffffffffffffffffffff82165f9081526101a16020526040902054155b92915050565b73ffffffffffffffffffffffffffffffffffffffff81165f90815261019f602052604081205460ff168103611a9f57505f919050565b73ffffffffffffffffffffffffffffffffffffffff82165f81815261019f602052604090205460a090611ad79060019060ff16614493565b60ff1660ff8110611aea57611aea6143c4565b015473ffffffffffffffffffffffffffffffffffffffff161492915050565b611b11613186565b6115895f6138f8565b6101a08181548110611b2a575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b5f54610100900460ff1615808015611b6e57505f54600160ff909116105b80611b875750303b158015611b8757505f5460ff166001145b611c13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a11565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611c6f575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff8816611cec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f696e76616c696420726f6c6c757020636f6e74726163740000000000000000006044820152606401610a11565b5f8711611d55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c6964207374616b696e672076616c756500000000000000000000006044820152606401610a11565b5f8611611dbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f696e76616c6964206368616c6c656e6765206465706f7369742076616c7565006044820152606401610a11565b5f8511611e27576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f696e76616c6964207769746864726177616c206c6f636b20626c6f636b7300006044820152606401610a11565b5f8311611e90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f696e76616c696420676173206c696d697420616464207374616b6572000000006044820152606401610a11565b5f8211611ef9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f696e76616c696420676173206c696d69742072656d6f7665207374616b6572736044820152606401610a11565b5f84118015611f09575060648411155b611f94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f696e76616c6964206368616c6c656e676572207265776172642070657263656e60448201527f74616765000000000000000000000000000000000000000000000000000000006064820152608401610a11565b611f9c61396e565b611fa4613a0c565b609780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a16179055609a84905560988790556101a68690556099859055609b839055609c829055604080515f8152602081018590527f0ef80fb82bf5439b8591744c0fde771f5d93dce7a7970b1e9b7828cdc3970e9c910160405180910390a1604080515f8152602081018490527fdd4b37d1f14888147fe4be2cfaedcbf148fd07ececc856d0433241b8b6e4a7f7910160405180910390a1604080515f8152602081018690527fa46de936426e045703b2d34a292a19fde92b329018db8e0da750033876b655ba910160405180910390a18015612110575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b612122613186565b5f811180156121335750609c548114155b612199576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c6964206e657720676173206c696d697400000000000000000000006044820152606401610a11565b609c80549082905560408051828152602081018490527fdd4b37d1f14888147fe4be2cfaedcbf148fd07ececc856d0433241b8b6e4a7f79101611335565b6101a26020525f908152604090208054600182015460028301805473ffffffffffffffffffffffffffffffffffffffff90931693919261221690614213565b80601f016020809104026020016040519081016040528092919081815260200182805461224290614213565b801561228d5780601f106122645761010080835404028352916020019161228d565b820191905f5260205f20905b81548152906001019060200180831161227057829003601f168201915b5050505050905083565b6060600182901c5f5b81156122c7576122b181600161441e565b90506122be600183614480565b821691506122a0565b8067ffffffffffffffff8111156122e0576122e0613c48565b604051908082528060200260200182016040528015612309578160200160208202803683370190505b5092505f60015b60ff8160ff16116123c557600160ff82161b8616156123b35760a0612336600183614493565b60ff1660ff8110612349576123496143c4565b0154855173ffffffffffffffffffffffffffffffffffffffff90911690869084908110612378576123786143c4565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526123a882600161441e565b9150828210156123c5575b806123bd816144ac565b915050612310565b50505050919050565b6040805160ff80825261200082019092526060915f91829160208201611fe0803683370190505090505f5b60ff8110156124b7575f60a08260ff8110612416576124166143c4565b015473ffffffffffffffffffffffffffffffffffffffff161480159061247857506101a15f60a08360ff811061244e5761244e6143c4565b015473ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f2054155b156124af5782612487816144ca565b935050600182828151811061249e5761249e6143c4565b911515602092830291909101909101525b6001016123f9565b505f8267ffffffffffffffff8111156124d2576124d2613c48565b6040519080825280602002602001820160405280156124fb578160200160208202803683370190505b5090505f805b60ff8110156125a65783818151811061251c5761251c6143c4565b60200260200101511561259e5760a08160ff811061253c5761253c6143c4565b0154835173ffffffffffffffffffffffffffffffffffffffff9091169084908490811061256b5761256b6143c4565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101528161259a816144ca565b9250505b600101612501565b5090949350505050565b6125b86137ae565b335f9081526101a5602052604090205461262e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f7769746864726177616c206e6f742065786973740000000000000000000000006044820152606401610a11565b335f9081526101a560205260409020544310156126a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f7769746864726177616c206c6f636b65640000000000000000000000000000006044820152606401610a11565b335f9081526101a560205260408120556126bf61345d565b6040805173ffffffffffffffffffffffffffffffffffffffff83168152905133917f89309c9b2aeaffbdce717113df9427298b20448c05919bf889e05f8c3094254b919081900360200190a261271781609854613821565b6112776001606555565b612729613186565b5f81118015612739575060648111155b80156127475750609a548114155b6127ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f696e76616c6964207265776172642070657263656e74616765000000000000006044820152606401610a11565b609a80549082905560408051828152602081018490527fa46de936426e045703b2d34a292a19fde92b329018db8e0da750033876b655ba9101611335565b6127f3613186565b5f811180156128045750609b548114155b61286a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c6964206e657720676173206c696d697400000000000000000000006044820152606401610a11565b609b80549082905560408051828152602081018490527f0ef80fb82bf5439b8591744c0fde771f5d93dce7a7970b1e9b7828cdc3970e9c9101611335565b6128b0613186565b5f5b838110156129fa57609f5f8686848181106128cf576128cf6143c4565b90506020020160208101906128e49190613db5565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f205460ff1615612974576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e2072656d6f766564206c69737400000000000000000000000000000000006044820152606401610a11565b6001609e5f87878581811061298b5761298b6143c4565b90506020020160208101906129a09190613db5565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790556001016128b2565b505f5b81811015612a8257609e5f848484818110612a1a57612a1a6143c4565b9050602002016020810190612a2f9190613db5565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556001016129fd565b507fe375867e538b40218c1b3db2ccceaf875eb073e38b510449e6088c1539ac862284848484604051612ab89493929190614553565b60405180910390a150505050565b612ace613186565b612ad66137ae565b609d54612ae38282613821565b5f609d556040805173ffffffffffffffffffffffffffffffffffffffff84168152602081018390527fa1fefb6c5328a92a416e321ed50997303fe7135fd88c28b0592b21ce42b5cdd9910160405180910390a1506112776001606555565b5f612b4b82611a69565b612bb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f696e76616c6964207374616b65720000000000000000000000000000000000006044820152606401610a11565b5073ffffffffffffffffffffffffffffffffffffffff165f90815261019f6020526040902054600160ff9091161b90565b5f60ff821115612c4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f7374616b657273206c656e677468206f7574206f6620626f756e6473000000006044820152606401610a11565b5f5b82811015612d4e57612c82848483818110612c6d57612c6d6143c4565b905060200201602081019061057c9190613db5565b612ce8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f696e76616c6964207374616b65720000000000000000000000000000000000006044820152606401610a11565b61019f5f858584818110612cfe57612cfe6143c4565b9050602002016020810190612d139190613db5565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f2054600160ff90911681901b929092179101612c50565b5092915050565b612d5d613186565b73ffffffffffffffffffffffffffffffffffffffff8116612e00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a11565b611277816138f8565b612e11613186565b5f81118015612e2257506098548114155b612e88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c6964207374616b696e672076616c756500000000000000000000006044820152606401610a11565b609880549082905560408051828152602081018490527f91e3ed304d49776a78bbe0df6bf7156f5433763621e5e728a3c2adfe7de743689101611335565b5f5b60ff8160ff161015612fd0575f60a060ff808416908110612eeb57612eeb6143c4565b015473ffffffffffffffffffffffffffffffffffffffff1603612fc8578160a08260ff1660ff8110612f1f57612f1f6143c4565b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055612f6e816001614584565b73ffffffffffffffffffffffffffffffffffffffff929092165f90815261019f6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff9093169290921790915550565b600101612ec8565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f736c6f742066756c6c00000000000000000000000000000000000000000000006044820152606401610a11565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b2267a7b7f00000000000000000000000000000000000000000000000000000000000000005f846040516024016130a2919061459d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f6d454d5100000000000000000000000000000000000000000000000000000000179052609b5490517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815261315694939291906004016145e1565b5f604051808303815f87803b15801561316d575f80fd5b505af115801561317f573d5f803e3d5ffd5b5050505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314611589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a11565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526101a1602052604090205415613294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f616c726561647920696e2064656c6574654c69737400000000000000000000006044820152606401610a11565b6101a080546001810182555f919091527f7980fe0f714a613298681d64b7b8ffa7b148338dd52429f307d72798d5c317c40180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316179055609954613311904361441e565b73ffffffffffffffffffffffffffffffffffffffff9091165f9081526101a16020526040902055565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b2267a7b7f00000000000000000000000000000000000000000000000000000000000000005f846040516024016133a991906140f9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0be67fcc00000000000000000000000000000000000000000000000000000000179052609c5490517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815261315694939291906004016145e1565b5f5b6101a05481101561127757436101a15f6101a08481548110613483576134836143c4565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040019020541161379c5760a0600161019f5f6101a085815481106134d5576134d56143c4565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054613513919060ff16614493565b60ff1660ff8110613526576135266143c4565b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556101a0805461019f915f9184908110613568576135686143c4565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556101a080546101a2929190849081106135d9576135d96143c4565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001812080547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560018101829055906136446002830182613bfe565b50506101a15f6101a0838154811061365e5761365e6143c4565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040018120556101a080546136a090600190614480565b815481106136b0576136b06143c4565b5f918252602090912001546101a0805473ffffffffffffffffffffffffffffffffffffffff90921691839081106136e9576136e96143c4565b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506101a080548061374057613740614626565b5f8281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905501905561345f565b806137a6816144ca565b91505061345f565b60026065540361381a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a11565b6002606555565b80156138ed575f8273ffffffffffffffffffffffffffffffffffffffff16826040515f6040518083038185875af1925050503d805f811461387d576040519150601f19603f3d011682016040523d82523d5f602084013e613882565b606091505b5050905080610e5a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c656400000000006044820152606401610a11565b5050565b6001606555565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff16613a04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a11565b611589613aaa565b5f54610100900460ff16613aa2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a11565b611589613b49565b5f54610100900460ff16613b40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a11565b611589336138f8565b5f54610100900460ff166138f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a11565b60405180611fe0016040528060ff906020820280368337509192915050565b508054613c0a90614213565b5f825580601f10613c19575050565b601f0160209004905f5260205f209081019061127791905b80821115613c44575f8155600101613c31565b5090565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613cbc57613cbc613c48565b604052919050565b5f82601f830112613cd3575f80fd5b813567ffffffffffffffff811115613ced57613ced613c48565b613d1e60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613c75565b818152846020838601011115613d32575f80fd5b816020850160208301375f918101602001919091529392505050565b5f8060408385031215613d5f575f80fd5b82359150602083013567ffffffffffffffff811115613d7c575f80fd5b613d8885828601613cc4565b9150509250929050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611995575f80fd5b5f60208284031215613dc5575f80fd5b613dce82613d92565b9392505050565b5f60208284031215613de5575f80fd5b5035919050565b5f6020808385031215613dfd575f80fd5b823567ffffffffffffffff80821115613e14575f80fd5b818501915085601f830112613e27575f80fd5b813581811115613e3957613e39613c48565b8060051b9150613e4a848301613c75565b8181529183018401918481019088841115613e63575f80fd5b938501935b83851015613e8857613e7985613d92565b82529385019390850190613e68565b98975050505050505050565b611fe0810181835f5b60ff811015613ed257815173ffffffffffffffffffffffffffffffffffffffff16835260209283019290910190600101613e9d565b50505092915050565b5f8083601f840112613eeb575f80fd5b50813567ffffffffffffffff811115613f02575f80fd5b6020830191508360208260051b8501011115613f1c575f80fd5b9250929050565b5f805f805f8060808789031215613f38575f80fd5b86359550602087013567ffffffffffffffff80821115613f56575f80fd5b613f628a838b01613edb565b9097509550604089013594506060890135915080821115613f81575f80fd5b818901915089601f830112613f94575f80fd5b813581811115613fa2575f80fd5b8a6020828501011115613fb3575f80fd5b6020830194508093505050509295509295509295565b5f60208284031215613fd9575f80fd5b813567ffffffffffffffff811115613fef575f80fd5b613ffb84828501613cc4565b949350505050565b5f805f805f805f60e0888a031215614019575f80fd5b61402288613d92565b9960208901359950604089013598606081013598506080810135975060a0810135965060c00135945092505050565b5f5b8381101561406b578181015183820152602001614053565b50505f910152565b5f815180845261408a816020860160208601614051565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f6140f06060830184614073565b95945050505050565b602080825282518282018190525f9190848201906040850190845b8181101561414657835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101614114565b50909695505050505050565b5f805f8060408587031215614165575f80fd5b843567ffffffffffffffff8082111561417c575f80fd5b61418888838901613edb565b909650945060208701359150808211156141a0575f80fd5b506141ad87828801613edb565b95989497509550505050565b5f80602083850312156141ca575f80fd5b823567ffffffffffffffff8111156141e0575f80fd5b6141ec85828601613edb565b90969095509350505050565b5f8251614209818460208701614051565b9190910192915050565b600181811c9082168061422757607f821691505b60208210810361425e577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f821115610e5a57805f5260205f20601f840160051c810160208510156142895750805b601f840160051c820191505b8181101561317f575f8155600101614295565b815167ffffffffffffffff8111156142c2576142c2613c48565b6142d6816142d08454614213565b84614264565b602080601f831160018114614328575f84156142f25750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556143bc565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561437457888601518255948401946001909101908401614355565b50858210156143b057878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b505060018460011b0185555b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115611a6357611a636143f1565b8082028115828204841417611a6357611a636143f1565b5f8261447b577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b81810381811115611a6357611a636143f1565b60ff8281168282160390811115611a6357611a636143f1565b5f60ff821660ff81036144c1576144c16143f1565b60010192915050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036144fa576144fa6143f1565b5060010190565b8183525f60208085019450825f5b858110156145485773ffffffffffffffffffffffffffffffffffffffff61453583613d92565b168752958201959082019060010161450f565b509495945050505050565b604081525f614566604083018688614501565b8281036020840152614579818587614501565b979650505050505050565b60ff8181168382160190811115611a6357611a636143f1565b6020815273ffffffffffffffffffffffffffffffffffffffff8251166020820152602082015160408201525f6040830151606080840152613ffb6080840182614073565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152608060408201525f6146156080830185614073565b905082606083015295945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea164736f6c6343000818000a" +var L1StakingDeployedBin = "0x608060405260043610610303575f3560e01c80638142951a11610191578063ae81de53116100dc578063d51c90a911610087578063e2a6ad5f11610062578063e2a6ad5f14610961578063f2fde38b14610980578063f4fe7fef1461099f575f80fd5b8063d51c90a9146108c7578063dd4785f5146108dc578063df1550331461091d575f80fd5b8063c7cd469a116100b7578063c7cd469a1461086a578063cde4cd1114610889578063d096c3c6146108a8575f80fd5b8063ae81de5314610809578063affed0e014610828578063bfa02ba91461083e575f80fd5b80639b19251a1161013c578063a3066aab11610117578063a3066aab146107b6578063a4f209b0146107d5578063ab8c53dc146107f4575f80fd5b80639b19251a146107485780639d48f417146107765780639fb82db9146107a2575f80fd5b80638da5cb5b1161016c5780638da5cb5b146106bd5780639168ae72146106e7578063927ede2d14610715575f80fd5b80638142951a1461064c578063831cfb581461066b5780638a565ac31461069e575f80fd5b806343352d61116102515780636f1e8533116101fc578063797adbde116101d7578063797adbde146105c65780637a4e87c3146105e55780637a9262a214610620575f80fd5b80636f1e85331461056d578063715018a61461058c57806374fe27b7146105a0575f80fd5b806352d472eb1161022c57806352d472eb1461050a578063680157911461051f578063692c565b1461053e575f80fd5b806343352d61146104b557806345bc4d10146104d65780634d64903a146104f5575f80fd5b806335928991116102b15780633ccfd60b1161028c5780633ccfd60b146104785780633ee2a1f91461048c57806341de239b146104a0575f80fd5b806335928991146103e95780633a9bbede146104085780633cb747bf14610446575f80fd5b80632e407a6f116102e15780632e407a6f1461035a578063303afb9e14610386578063320ff860146103ca575f80fd5b80630d13fd7b146103075780632108db35146103305780632a28e5a314610345575b5f80fd5b348015610312575f80fd5b5061031d6101a65481565b6040519081526020015b60405180910390f35b34801561033b575f80fd5b5061031d609c5481565b610358610353366004613e43565b6109be565b005b348015610365575f80fd5b5061031d610374366004613eaa565b6101a16020525f908152604090205481565b348015610391575f80fd5b506103a56103a0366004613eca565b610e80565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610327565b3480156103d5575f80fd5b506103586103e4366004613ee1565b610eac565b3480156103f4575f80fd5b50610358610403366004613eca565b61129b565b348015610413575f80fd5b50610436610422366004613eaa565b609f6020525f908152604090205460ff1681565b6040519015158152602001610327565b348015610451575f80fd5b507f00000000000000000000000000000000000000000000000000000000000000006103a5565b348015610483575f80fd5b50610358611362565b348015610497575f80fd5b5061035861159a565b3480156104ab575f80fd5b5061031d60995481565b3480156104c0575f80fd5b506104c96115ac565b6040516103279190613f89565b3480156104e1575f80fd5b5061031d6104f0366004613eca565b6115ff565b348015610500575f80fd5b5061031d60985481565b348015610515575f80fd5b5061031d609a5481565b34801561052a575f80fd5b50610436610539366004613eaa565b611a08565b348015610549575f80fd5b50610436610558366004613eca565b6101a46020525f908152604090205460ff1681565b348015610578575f80fd5b50610436610587366004613eaa565b611ad7565b348015610597575f80fd5b50610358611b77565b3480156105ab575f80fd5b506104366105ba366004614018565b60019695505050505050565b3480156105d1575f80fd5b506103a56105e0366004613eca565b611b88565b3480156105f0575f80fd5b506104366105ff3660046140be565b80516020818301810180516101a38252928201919093012091525460ff1681565b34801561062b575f80fd5b5061031d61063a366004613eaa565b6101a56020525f908152604090205481565b348015610657575f80fd5b506103586106663660046140f8565b611bbe565b348015610676575f80fd5b506103a57f000000000000000000000000000000000000000000000000000000000000000081565b3480156106a9575f80fd5b506103586106b8366004613eca565b612188565b3480156106c8575f80fd5b5060335473ffffffffffffffffffffffffffffffffffffffff166103a5565b3480156106f2575f80fd5b50610706610701366004613eaa565b612245565b604051610327939291906141b1565b348015610720575f80fd5b506103a57f000000000000000000000000000000000000000000000000000000000000000081565b348015610753575f80fd5b50610436610762366004613eaa565b609e6020525f908152604090205460ff1681565b348015610781575f80fd5b50610795610790366004613eca565b612305565b604051610327919061423e565b3480156107ad575f80fd5b5061079561243c565b3480156107c1575f80fd5b506103586107d0366004613eaa565b61261e565b3480156107e0575f80fd5b506103586107ef366004613eca565b61278f565b3480156107ff575f80fd5b5061031d609d5481565b348015610814575f80fd5b50610358610823366004613eca565b612859565b348015610833575f80fd5b5061031d6101a75481565b348015610849575f80fd5b506097546103a59073ffffffffffffffffffffffffffffffffffffffff1681565b348015610875575f80fd5b50610358610884366004614250565b612916565b348015610894575f80fd5b506103586108a3366004613eaa565b612b34565b3480156108b3575f80fd5b5061031d6108c2366004613eaa565b612baf565b3480156108d2575f80fd5b5061031d609b5481565b3480156108e7575f80fd5b5061090b6108f6366004613eaa565b61019f6020525f908152604090205460ff1681565b60405160ff9091168152602001610327565b348015610928575f80fd5b50610436610937366004613eaa565b73ffffffffffffffffffffffffffffffffffffffff165f9081526101a16020526040902054151590565b34801561096c575f80fd5b5061031d61097b3660046142b7565b612c50565b34801561098b575f80fd5b5061035861099a366004613eaa565b612dc3565b3480156109aa575f80fd5b506103586109b9366004613eca565b612e77565b335f818152609e602052604090205460ff16610a3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6e6f7420696e2077686974656c6973740000000000000000000000000000000060448201526064015b60405180910390fd5b335f9081526101a2602052604090205473ffffffffffffffffffffffffffffffffffffffff1615610ac8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f616c7265616479207265676973746572656400000000000000000000000000006044820152606401610a32565b8215801590610ae657505f8381526101a4602052604090205460ff16155b610b4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f696e76616c69642074656e6465726d696e74207075626b6579000000000000006044820152606401610a32565b8151610100148015610b7f57506101a382604051610b6a91906142f6565b9081526040519081900360200190205460ff16155b610be5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e76616c696420626c73207075626b657900000000000000000000000000006044820152606401610a32565b6098543414610c50576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c6964207374616b696e672076616c756500000000000000000000006044820152606401610a32565b6040518060600160405280610c623390565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083018790526040928301869052335f9081526101a28252839020845181547fffffffffffffffffffffffff00000000000000000000000000000000000000001693169290921782558301516001820155908201516002820190610ce290826143ad565b50905050610cf5610cf03390565b612f34565b60016101a383604051610d0891906142f6565b9081526040805191829003602090810190922080549315157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009485161790555f8681526101a49092529020805490911660011790557fb9c7babb56df9f2da4a30811a6c778e4e68af88b72712d56cf62c5516e20e199610d853390565b8484604051610d96939291906141b1565b60405180910390a1335f9081526101a260209081526040918290208251606081018452815473ffffffffffffffffffffffffffffffffffffffff168152600182015492810192909252600281018054610e7b9484019190610df690614311565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2290614311565b8015610e6d5780601f10610e4457610100808354040283529160200191610e6d565b820191905f5260205f20905b815481529060010190602001808311610e5057829003601f168201915b5050505050815250506130a1565b505050565b60a08160ff8110610e8f575f80fd5b015473ffffffffffffffffffffffffffffffffffffffff16905081565b610eb461320d565b5f5b815181101561125757610ee1828281518110610ed457610ed46144c9565b6020026020010151611a08565b610f6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f6f6e6c7920616374697665207374616b65722063616e2062652072656d6f766560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610a32565b6101a55f838381518110610f8357610f836144c9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20545f1461102d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f7769746864726177696e670000000000000000000000000000000000000000006044820152606401610a32565b60995461103a9043614523565b6101a55f848481518110611050576110506144c9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506110b78282815181106110aa576110aa6144c9565b602002602001015161328e565b8181815181106110c9576110c96144c9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d56101a55f85858151811061111e5761111e6144c9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460405161116f91815260200190565b60405180910390a2609e5f83838151811061118c5761118c6144c9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81549060ff02191690556001609f5f8484815181106111f3576111f36144c9565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff1682528101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055600101610eb6565b507f3f446646c03e618be8238a586960d6d625f35c653cdca1ef59609993e8ed2c8481604051611287919061423e565b60405180910390a1611298816133c1565b50565b6112a361320d565b5f811180156112b557506101a6548114155b61131b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f696e76616c6964206368616c6c656e6765206465706f7369742076616c7565006044820152606401610a32565b6101a680549082905560408051828152602081018490527f36f971a40478225aeb80cfbf5e80306e8cb76d3bf7d56fdc5e490945cddb7d5591015b60405180910390a15050565b61136b33611a08565b6113d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6f6e6c7920616374697665207374616b657200000000000000000000000000006044820152606401610a32565b335f9081526101a5602052604090205415611448576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f7769746864726177696e670000000000000000000000000000000000000000006044820152606401610a32565b6099546114559043614523565b335f8181526101a560205260409020919091556114719061328e565b335f8181526101a560209081526040918290205491519182527f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5910160405180910390a2335f908152609e6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00908116909155609f83528184208054909116600190811790915581518181528083019092529091828101908036833701905050905033815f81518110611531576115316144c9565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f3f446646c03e618be8238a586960d6d625f35c653cdca1ef59609993e8ed2c8481604051611287919061423e565b6115a261320d565b6115aa6134e9565b565b6115b4613cd4565b60408051611fe08101918290529060a09060ff9082845b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116115cb575050505050905090565b6097545f9073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6f6e6c7920726f6c6c757020636f6e74726163740000000000000000000000006044820152606401610a32565b6116a06138a3565b5f6116aa83612305565b90505f805b825181101561191e575f73ffffffffffffffffffffffffffffffffffffffff168382815181106116e1576116e16144c9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff160315611916575f6101a55f85848151811061171c5761171c6144c9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205411156117d3576101a55f84838151811061177a5761177a6144c9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9055609854826117cc9190614523565b9150611916565b61181a8382815181106117e8576117e86144c9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff165f9081526101a16020526040902054151590565b6119165760985461182b9083614523565b91506118428382815181106110aa576110aa6144c9565b609e5f848381518110611857576118576144c9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81549060ff02191690556001609f5f8584815181106118be576118be6144c9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b6001016116af565b505f6064609a54836119309190614536565b61193a919061454d565b90506119468183614585565b609d5f8282546119569190614523565b909155505060975461197e9073ffffffffffffffffffffffffffffffffffffffff1682613916565b7f654f4a61849f1b3ad10abb283d27f02d5fece7b820acc5a3b874713b58748b5a836040516119ad919061423e565b60405180910390a17f3f446646c03e618be8238a586960d6d625f35c653cdca1ef59609993e8ed2c84836040516119e4919061423e565b60405180910390a16119f5836133c1565b92505050611a036001606555565b919050565b73ffffffffffffffffffffffffffffffffffffffff81165f90815261019f602052604081205460ff168103611a3e57505f919050565b73ffffffffffffffffffffffffffffffffffffffff82165f81815261019f602052604090205460a090611a769060019060ff16614598565b60ff1660ff8110611a8957611a896144c9565b015473ffffffffffffffffffffffffffffffffffffffff16148015611ad1575073ffffffffffffffffffffffffffffffffffffffff82165f9081526101a16020526040902054155b92915050565b73ffffffffffffffffffffffffffffffffffffffff81165f90815261019f602052604081205460ff168103611b0d57505f919050565b73ffffffffffffffffffffffffffffffffffffffff82165f81815261019f602052604090205460a090611b459060019060ff16614598565b60ff1660ff8110611b5857611b586144c9565b015473ffffffffffffffffffffffffffffffffffffffff161492915050565b611b7f61320d565b6115aa5f6139ed565b6101a08181548110611b98575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b5f54610100900460ff1615808015611bdc57505f54600160ff909116105b80611bf55750303b158015611bf557505f5460ff166001145b611c81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a32565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611cdd575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff8816611d5a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f696e76616c696420726f6c6c757020636f6e74726163740000000000000000006044820152606401610a32565b5f8711611dc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c6964207374616b696e672076616c756500000000000000000000006044820152606401610a32565b5f8611611e2c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f696e76616c6964206368616c6c656e6765206465706f7369742076616c7565006044820152606401610a32565b5f8511611e95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f696e76616c6964207769746864726177616c206c6f636b20626c6f636b7300006044820152606401610a32565b5f8311611efe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f696e76616c696420676173206c696d697420616464207374616b6572000000006044820152606401610a32565b5f8211611f67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f696e76616c696420676173206c696d69742072656d6f7665207374616b6572736044820152606401610a32565b5f84118015611f77575060648411155b612002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f696e76616c6964206368616c6c656e676572207265776172642070657263656e60448201527f74616765000000000000000000000000000000000000000000000000000000006064820152608401610a32565b61200a613a63565b612012613b01565b609780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a16179055609a84905560988790556101a68690556099859055609b839055609c829055604080515f8152602081018590527f0ef80fb82bf5439b8591744c0fde771f5d93dce7a7970b1e9b7828cdc3970e9c910160405180910390a1604080515f8152602081018490527fdd4b37d1f14888147fe4be2cfaedcbf148fd07ececc856d0433241b8b6e4a7f7910160405180910390a1604080515f8152602081018690527fa46de936426e045703b2d34a292a19fde92b329018db8e0da750033876b655ba910160405180910390a1801561217e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b61219061320d565b5f811180156121a15750609c548114155b612207576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c6964206e657720676173206c696d697400000000000000000000006044820152606401610a32565b609c80549082905560408051828152602081018490527fdd4b37d1f14888147fe4be2cfaedcbf148fd07ececc856d0433241b8b6e4a7f79101611356565b6101a26020525f908152604090208054600182015460028301805473ffffffffffffffffffffffffffffffffffffffff90931693919261228490614311565b80601f01602080910402602001604051908101604052809291908181526020018280546122b090614311565b80156122fb5780601f106122d2576101008083540402835291602001916122fb565b820191905f5260205f20905b8154815290600101906020018083116122de57829003601f168201915b5050505050905083565b6060600182901c5f5b81156123355761231f816001614523565b905061232c600183614585565b8216915061230e565b8067ffffffffffffffff81111561234e5761234e613d3d565b604051908082528060200260200182016040528015612377578160200160208202803683370190505b5092505f60015b60ff8160ff161161243357600160ff82161b8616156124215760a06123a4600183614598565b60ff1660ff81106123b7576123b76144c9565b0154855173ffffffffffffffffffffffffffffffffffffffff909116908690849081106123e6576123e66144c9565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152612416826001614523565b915082821015612433575b8061242b816145b1565b91505061237e565b50505050919050565b6040805160ff80825261200082019092526060915f91829160208201611fe0803683370190505090505f5b60ff811015612525575f60a08260ff8110612484576124846144c9565b015473ffffffffffffffffffffffffffffffffffffffff16148015906124e657506101a15f60a08360ff81106124bc576124bc6144c9565b015473ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f2054155b1561251d57826124f5816145cf565b935050600182828151811061250c5761250c6144c9565b911515602092830291909101909101525b600101612467565b505f8267ffffffffffffffff81111561254057612540613d3d565b604051908082528060200260200182016040528015612569578160200160208202803683370190505b5090505f805b60ff8110156126145783818151811061258a5761258a6144c9565b60200260200101511561260c5760a08160ff81106125aa576125aa6144c9565b0154835173ffffffffffffffffffffffffffffffffffffffff909116908490849081106125d9576125d96144c9565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015281612608816145cf565b9250505b60010161256f565b5090949350505050565b6126266138a3565b335f9081526101a5602052604090205461269c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f7769746864726177616c206e6f742065786973740000000000000000000000006044820152606401610a32565b335f9081526101a56020526040902054431015612715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f7769746864726177616c206c6f636b65640000000000000000000000000000006044820152606401610a32565b335f9081526101a5602052604081205561272d6134e9565b6040805173ffffffffffffffffffffffffffffffffffffffff83168152905133917f89309c9b2aeaffbdce717113df9427298b20448c05919bf889e05f8c3094254b919081900360200190a261278581609854613916565b6112986001606555565b61279761320d565b5f811180156127a7575060648111155b80156127b55750609a548114155b61281b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f696e76616c6964207265776172642070657263656e74616765000000000000006044820152606401610a32565b609a80549082905560408051828152602081018490527fa46de936426e045703b2d34a292a19fde92b329018db8e0da750033876b655ba9101611356565b61286161320d565b5f811180156128725750609b548114155b6128d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c6964206e657720676173206c696d697400000000000000000000006044820152606401610a32565b609b80549082905560408051828152602081018490527f0ef80fb82bf5439b8591744c0fde771f5d93dce7a7970b1e9b7828cdc3970e9c9101611356565b61291e61320d565b5f5b83811015612a6857609f5f86868481811061293d5761293d6144c9565b90506020020160208101906129529190613eaa565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f205460ff16156129e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e2072656d6f766564206c69737400000000000000000000000000000000006044820152606401610a32565b6001609e5f8787858181106129f9576129f96144c9565b9050602002016020810190612a0e9190613eaa565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055600101612920565b505f5b81811015612af057609e5f848484818110612a8857612a886144c9565b9050602002016020810190612a9d9190613eaa565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101612a6b565b507fe375867e538b40218c1b3db2ccceaf875eb073e38b510449e6088c1539ac862284848484604051612b26949392919061464d565b60405180910390a150505050565b612b3c61320d565b612b446138a3565b609d54612b518282613916565b5f609d556040805173ffffffffffffffffffffffffffffffffffffffff84168152602081018390527fa1fefb6c5328a92a416e321ed50997303fe7135fd88c28b0592b21ce42b5cdd9910160405180910390a1506112986001606555565b5f612bb982611ad7565b612c1f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f696e76616c6964207374616b65720000000000000000000000000000000000006044820152606401610a32565b5073ffffffffffffffffffffffffffffffffffffffff165f90815261019f6020526040902054600160ff9091161b90565b5f60ff821115612cbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f7374616b657273206c656e677468206f7574206f6620626f756e6473000000006044820152606401610a32565b5f5b82811015612dbc57612cf0848483818110612cdb57612cdb6144c9565b90506020020160208101906105879190613eaa565b612d56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f696e76616c6964207374616b65720000000000000000000000000000000000006044820152606401610a32565b61019f5f858584818110612d6c57612d6c6144c9565b9050602002016020810190612d819190613eaa565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f2054600160ff90911681901b929092179101612cbe565b5092915050565b612dcb61320d565b73ffffffffffffffffffffffffffffffffffffffff8116612e6e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a32565b611298816139ed565b612e7f61320d565b5f81118015612e9057506098548114155b612ef6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c6964207374616b696e672076616c756500000000000000000000006044820152606401610a32565b609880549082905560408051828152602081018490527f91e3ed304d49776a78bbe0df6bf7156f5433763621e5e728a3c2adfe7de743689101611356565b5f5b60ff8160ff16101561303e575f60a060ff808416908110612f5957612f596144c9565b015473ffffffffffffffffffffffffffffffffffffffff1603613036578160a08260ff1660ff8110612f8d57612f8d6144c9565b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055612fdc81600161467e565b73ffffffffffffffffffffffffffffffffffffffff929092165f90815261019f6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff9093169290921790915550565b600101612f36565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f736c6f742066756c6c00000000000000000000000000000000000000000000006044820152606401610a32565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b2267a7b7f00000000000000000000000000000000000000000000000000000000000000005f6101a75485604051602401613115929190614697565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f7046529b00000000000000000000000000000000000000000000000000000000179052609b5490517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b1681526131c994939291906004016146e2565b5f604051808303815f87803b1580156131e0575f80fd5b505af11580156131f2573d5f803e3d5ffd5b505050506101a75460016132069190614523565b6101a75550565b60335473ffffffffffffffffffffffffffffffffffffffff1633146115aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a32565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526101a160205260409020541561331b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f616c726561647920696e2064656c6574654c69737400000000000000000000006044820152606401610a32565b6101a080546001810182555f919091527f7980fe0f714a613298681d64b7b8ffa7b148338dd52429f307d72798d5c317c40180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790556099546133989043614523565b73ffffffffffffffffffffffffffffffffffffffff9091165f9081526101a16020526040902055565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b2267a7b7f00000000000000000000000000000000000000000000000000000000000000005f6101a75485604051602401613435929190614727565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcce6cf9f00000000000000000000000000000000000000000000000000000000179052609c5490517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b1681526131c994939291906004016146e2565b5f5b6101a054811015611298575f73ffffffffffffffffffffffffffffffffffffffff166101a08281548110613521576135216144c9565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff160361369d576101a15f6101a0838154811061355f5761355f6144c9565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040018120556101a080546135a190600190614585565b815481106135b1576135b16144c9565b5f918252602090912001546101a0805473ffffffffffffffffffffffffffffffffffffffff90921691839081106135ea576135ea6144c9565b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506101a08054806136415761364161473f565b5f8281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690550190556134eb565b436101a15f6101a084815481106136b6576136b66144c9565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054116138915760a0600161019f5f6101a08581548110613708576137086144c9565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054613746919060ff16614598565b60ff1660ff8110613759576137596144c9565b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556101a0805461019f915f918490811061379b5761379b6144c9565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556101a080546101a29291908490811061380c5761380c6144c9565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001812080547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560018101829055906138776002830182613cf3565b50506101a15f6101a0838154811061355f5761355f6144c9565b8061389b816145cf565b9150506134eb565b60026065540361390f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a32565b6002606555565b80156139e2575f8273ffffffffffffffffffffffffffffffffffffffff16826040515f6040518083038185875af1925050503d805f8114613972576040519150601f19603f3d011682016040523d82523d5f602084013e613977565b606091505b5050905080610e7b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c656400000000006044820152606401610a32565b5050565b6001606555565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff16613af9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a32565b6115aa613b9f565b5f54610100900460ff16613b97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a32565b6115aa613c3e565b5f54610100900460ff16613c35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a32565b6115aa336139ed565b5f54610100900460ff166139e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a32565b60405180611fe0016040528060ff906020820280368337509192915050565b508054613cff90614311565b5f825580601f10613d0e575050565b601f0160209004905f5260205f209081019061129891905b80821115613d39575f8155600101613d26565b5090565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613db157613db1613d3d565b604052919050565b5f82601f830112613dc8575f80fd5b813567ffffffffffffffff811115613de257613de2613d3d565b613e1360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613d6a565b818152846020838601011115613e27575f80fd5b816020850160208301375f918101602001919091529392505050565b5f8060408385031215613e54575f80fd5b82359150602083013567ffffffffffffffff811115613e71575f80fd5b613e7d85828601613db9565b9150509250929050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611a03575f80fd5b5f60208284031215613eba575f80fd5b613ec382613e87565b9392505050565b5f60208284031215613eda575f80fd5b5035919050565b5f6020808385031215613ef2575f80fd5b823567ffffffffffffffff80821115613f09575f80fd5b818501915085601f830112613f1c575f80fd5b813581811115613f2e57613f2e613d3d565b8060051b9150613f3f848301613d6a565b8181529183018401918481019088841115613f58575f80fd5b938501935b83851015613f7d57613f6e85613e87565b82529385019390850190613f5d565b98975050505050505050565b611fe0810181835f5b60ff811015613fc757815173ffffffffffffffffffffffffffffffffffffffff16835260209283019290910190600101613f92565b50505092915050565b5f8083601f840112613fe0575f80fd5b50813567ffffffffffffffff811115613ff7575f80fd5b6020830191508360208260051b8501011115614011575f80fd5b9250929050565b5f805f805f806080878903121561402d575f80fd5b86359550602087013567ffffffffffffffff8082111561404b575f80fd5b6140578a838b01613fd0565b9097509550604089013594506060890135915080821115614076575f80fd5b818901915089601f830112614089575f80fd5b813581811115614097575f80fd5b8a60208285010111156140a8575f80fd5b6020830194508093505050509295509295509295565b5f602082840312156140ce575f80fd5b813567ffffffffffffffff8111156140e4575f80fd5b6140f084828501613db9565b949350505050565b5f805f805f805f60e0888a03121561410e575f80fd5b61411788613e87565b9960208901359950604089013598606081013598506080810135975060a0810135965060c00135945092505050565b5f5b83811015614160578181015183820152602001614148565b50505f910152565b5f815180845261417f816020860160208601614146565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f6141e56060830184614168565b95945050505050565b5f815180845260208085019450602084015f5b8381101561423357815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101614201565b509495945050505050565b602081525f613ec360208301846141ee565b5f805f8060408587031215614263575f80fd5b843567ffffffffffffffff8082111561427a575f80fd5b61428688838901613fd0565b9096509450602087013591508082111561429e575f80fd5b506142ab87828801613fd0565b95989497509550505050565b5f80602083850312156142c8575f80fd5b823567ffffffffffffffff8111156142de575f80fd5b6142ea85828601613fd0565b90969095509350505050565b5f8251614307818460208701614146565b9190910192915050565b600181811c9082168061432557607f821691505b60208210810361435c577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f821115610e7b57805f5260205f20601f840160051c810160208510156143875750805b601f840160051c820191505b818110156143a6575f8155600101614393565b5050505050565b815167ffffffffffffffff8111156143c7576143c7613d3d565b6143db816143d58454614311565b84614362565b602080601f83116001811461442d575f84156143f75750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556144c1565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156144795788860151825594840194600190910190840161445a565b50858210156144b557878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b505060018460011b0185555b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115611ad157611ad16144f6565b8082028115828204841417611ad157611ad16144f6565b5f82614580577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b81810381811115611ad157611ad16144f6565b60ff8281168282160390811115611ad157611ad16144f6565b5f60ff821660ff81036145c6576145c66144f6565b60010192915050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036145ff576145ff6144f6565b5060010190565b8183525f60208085019450825f5b858110156142335773ffffffffffffffffffffffffffffffffffffffff61463a83613e87565b1687529582019590820190600101614614565b604081525f614660604083018688614606565b8281036020840152614673818587614606565b979650505050505050565b60ff8181168382160190811115611ad157611ad16144f6565b8281526040602082015273ffffffffffffffffffffffffffffffffffffffff8251166040820152602082015160608201525f6040830151606060808401526141e560a0840182614168565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152608060408201525f6147166080830185614168565b905082606083015295945050505050565b828152604060208201525f6140f060408301846141ee565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea164736f6c6343000818000a" func init() { if err := json.Unmarshal([]byte(L1StakingStorageLayoutJSON), L1StakingStorageLayout); err != nil { diff --git a/bindings/bindings/l2lidogateway.go b/bindings/bindings/l2lidogateway.go index c89dfd68..9fe8b16d 100644 --- a/bindings/bindings/l2lidogateway.go +++ b/bindings/bindings/l2lidogateway.go @@ -31,8 +31,8 @@ var ( // L2LidoGatewayMetaData contains all meta data concerning the L2LidoGateway contract. var L2LidoGatewayMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1Token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_l2Token\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ErrorAccountIsZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorCallerIsNotDepositsDisabler\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorCallerIsNotDepositsEnabler\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorCallerIsNotWithdrawalsDisabler\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorCallerIsNotWithdrawalsEnabler\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorDepositsDisabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorDepositsEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorNonZeroMsgValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorUnsupportedL1Token\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorUnsupportedL2Token\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorWithdrawZeroAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorWithdrawalsDisabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorWithdrawalsEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WithdrawAndCallIsNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"disabler\",\"type\":\"address\"}],\"name\":\"DepositsDisabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"enabler\",\"type\":\"address\"}],\"name\":\"DepositsEnabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"l1Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"l2Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"FinalizeDepositERC20\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"l1Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"l2Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"name\":\"WithdrawERC20\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"disabler\",\"type\":\"address\"}],\"name\":\"WithdrawalsDisabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"enabler\",\"type\":\"address\"}],\"name\":\"WithdrawalsEnabled\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEPOSITS_DISABLER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEPOSITS_ENABLER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WITHDRAWALS_DISABLER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WITHDRAWALS_ENABLER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"counterpart\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"disableDeposits\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"disableWithdrawals\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enableDeposits\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enableWithdrawals\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1Token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_l2Token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"finalizeDepositERC20\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l2Token\",\"type\":\"address\"}],\"name\":\"getL1ERC20Address\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1Token\",\"type\":\"address\"}],\"name\":\"getL2ERC20Address\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_role\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getRoleMember\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_role\",\"type\":\"bytes32\"}],\"name\":\"getRoleMemberCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_counterpart\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_messenger\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_depositsEnabler\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_depositsDisabler\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_withdrawalsEnabler\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_withdrawalsDisabler\",\"type\":\"address\"}],\"name\":\"initializeV2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isDepositsEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isWithdrawalsEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1Token\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2Token\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messenger\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"router\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"}],\"name\":\"withdrawERC20\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"}],\"name\":\"withdrawERC20\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"}],\"name\":\"withdrawERC20AndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}]", - Bin: "0x60c060405234801562000010575f80fd5b50604051620029a6380380620029a68339810160408190526200003391620001dc565b6001600160a01b03808316608081905290821660a0526200009b5760405162461bcd60e51b815260206004820152601460248201527f7a65726f206c31746f6b656e206164647265737300000000000000000000000060448201526064015b60405180910390fd5b6001600160a01b038116620000f35760405162461bcd60e51b815260206004820152601460248201527f7a65726f206c32546f6b656e2061646472657373000000000000000000000000604482015260640162000092565b620000fd62000105565b505062000212565b5f54610100900460ff16156200016e5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840162000092565b5f5460ff90811614620001be575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b80516001600160a01b0381168114620001d7575f80fd5b919050565b5f8060408385031215620001ee575f80fd5b620001f983620001c0565b91506200020960208401620001c0565b90509250929050565b60805160a051612733620002735f395f81816102610152818161062a01528181610a1d01528181611077015261147e01525f818161049b01528181610696015281816109b10152818161100b015281816116a1015261187101526127335ff3fe6080604052600436106101d0575f3560e01c80639010d07c116100fd578063ca15c87311610092578063f27ebced11610062578063f27ebced14610580578063f2fde38b1461059f578063f887ea40146105be578063fadcc54a146105dd575f80fd5b8063ca15c873146104fb578063d547741f1461051a578063e3b523e314610539578063e8bac93b1461056c575f80fd5b8063ad960ce1116100cd578063ad960ce114610476578063c01e1bd61461048a578063c0c53b8b146104bd578063c676ad29146104dc575f80fd5b80639010d07c1461041157806391d1485414610430578063a93a4af91461044f578063ac67e1af14610462575f80fd5b80635ed2c22011610173578063797594b011610143578063797594b01461038f5780638431f5c1146103ae5780638d7601c0146103c15780638da5cb5b146103f4575f80fd5b80635ed2c220146102ec5780636c07ea43146103275780636f18bd221461033a578063715018a61461037b575f80fd5b806356eff267116101ae57806356eff26714610250578063575361b6146102835780635777bf50146102965780635e4c57a4146102d8575f80fd5b80632f2ff15d146101d45780633cb747bf146101f557806354bbd59c14610231575b5f80fd5b3480156101df575f80fd5b506101f36101ee36600461211c565b610610565b005b348015610200575f80fd5b50609954610214906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561023c575f80fd5b5061021461024b36600461214a565b610626565b34801561025b575f80fd5b506102147f000000000000000000000000000000000000000000000000000000000000000081565b6101f36102913660046121b1565b6106bb565b3480156102a1575f80fd5b507fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff165b6040519015158152602001610228565b3480156102e3575f80fd5b506101f3610706565b3480156102f7575f80fd5b507fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff166102c8565b6101f3610335366004612227565b610838565b348015610345575f80fd5b5061036d7f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d681565b604051908152602001610228565b348015610386575f80fd5b506101f3610876565b34801561039a575f80fd5b50609754610214906001600160a01b031681565b6101f36103bc366004612259565b610889565b3480156103cc575f80fd5b5061036d7f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c81565b3480156103ff575f80fd5b506065546001600160a01b0316610214565b34801561041c575f80fd5b5061021461042b3660046122eb565b610bff565b34801561043b575f80fd5b506102c861044a36600461211c565b610c3e565b6101f361045d36600461230b565b610c74565b34801561046d575f80fd5b506101f3610c86565b348015610481575f80fd5b506101f3610db4565b348015610495575f80fd5b506102147f000000000000000000000000000000000000000000000000000000000000000081565b3480156104c8575f80fd5b506101f36104d736600461234e565b610eca565b3480156104e7575f80fd5b506102146104f636600461214a565b611007565b348015610506575f80fd5b5061036d610515366004612396565b61109c565b348015610525575f80fd5b506101f361053436600461211c565b6110d1565b348015610544575f80fd5b5061036d7f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d81565b348015610577575f80fd5b506101f36110e3565b34801561058b575f80fd5b506101f361059a3660046123ad565b6111fe565b3480156105aa575f80fd5b506101f36105b936600461214a565b611313565b3480156105c9575f80fd5b50609854610214906001600160a01b031681565b3480156105e8575f80fd5b5061036d7f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a81565b6106186113a3565b61062282826113fd565b5050565b5f817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614610693576040517f6251ce6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b507f000000000000000000000000000000000000000000000000000000000000000092915050565b6106fe86868686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250889250611473915050565b505050505050565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff1615610762576040517f4f2c8be200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61078c7f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a33610c3e565b6107c2576040517f3d39c5f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560405133907fc36a428b063177e3f28b3b5d340c08f77827847b2ee30114ccf0c40e519c420a905f90a2565b6108718333845f5b6040519080825280601f01601f19166020018201604052801561086a576020820181803683370190505b5085611473565b505050565b61087e6113a3565b6108875f6118eb565b565b6099546001600160a01b03163381146108e95760405162461bcd60e51b815260206004820152601760248201527f6f6e6c79206d657373656e6765722063616e2063616c6c00000000000000000060448201526064015b60405180910390fd5b806001600160a01b0316636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015610925573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109499190612433565b6097546001600160a01b039081169116146109a65760405162461bcd60e51b815260206004820152601860248201527f6f6e6c792063616c6c20627920636f756e74657270617274000000000000000060448201526064016108e0565b6109ae611954565b877f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614610a1a576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b877f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614610a86576040517f6251ce6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff16610ae1576040517fa185a6b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3415610b19576040517f3ddcf11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038881166004830152602482018890528a16906340c10f19906044015f604051808303815f87803b158015610b79575f80fd5b505af1158015610b8b573d5f803e3d5ffd5b50505050876001600160a01b0316896001600160a01b03168b6001600160a01b03167f165ba69f6ab40c50cade6f65431801e5f9c7d7830b7545391920db039133ba348a8a8a8a604051610be2949392919061244e565b60405180910390a45050610bf560018055565b5050505050505050565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260408120610c3590836119b3565b90505b92915050565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260408120610c3590836119be565b610c808484845f610840565b50505050565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff16610ce1576040517fa185a6b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d0b7f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d633610c3e565b610d41576040517fadd9524c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560405133907f9ca4d309bbfd23c65db3dc38c1712862f5812c7139937e2655de86e803f73bb9905f90a2565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff16610e14576040517f77d195b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e3e7f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c33610c3e565b610e74576040517f9e60ca7e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec805461ff001916905560405133907f644eeba8ede48fefc32ada09fb240c5f6c0f06507ab1d296d5af41f1521d9fcb905f90a2565b5f54610100900460ff1615808015610ee857505f54600160ff909116105b80610f015750303b158015610f0157505f5460ff166001145b610f735760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016108e0565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610fb2575f805461ff0019166101001790555b610fbd8484846119df565b8015610c80575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b5f817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614611074576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b507f000000000000000000000000000000000000000000000000000000000000000092915050565b5f8181527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260408120610c3890611b22565b6110d96113a3565b6106228282611b2b565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff1615611144576040517ff74ad25400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61116e7f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d33610c3e565b6111a4576040517f5c16894300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec805461ff00191661010017905560405133907fb2ed3603bd9051f0182ebfb75f12a21059b4d31b578a2a05c8d0245e9e2d3204905f90a2565b5f54600290610100900460ff1615801561121e57505f5460ff8083169116105b6112905760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016108e0565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff8316176101001790556112cc85858585611ba1565b5f805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b61131b6113a3565b6001600160a01b0381166113975760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108e0565b6113a0816118eb565b50565b6065546001600160a01b031633146108875760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e0565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed602052604090206114339082611d82565b156106225760405133906001600160a01b0383169084907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d905f90a45050565b61147b611954565b847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316146114e7576040517f6251ce6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b846001600160a01b038116611528576040517fef6b416200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff16611588576040517f77d195b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845f036115c1576040517f6c18829600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60985433906001600160a01b03168190036115ef57848060200190518101906115ea91906124d3565b955090505b845115611628576040517f998bcee200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f9dc29fac0000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015260248201889052891690639dc29fac906044015f604051808303815f87803b158015611688575f80fd5b505af115801561169a573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000089838a8a8a6040516024016116da969594939291906125f8565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84bd13b00000000000000000000000000000000000000000000000000000000017905260995482517fecc7042800000000000000000000000000000000000000000000000000000000815292519394505f936001600160a01b039091169263ecc704289260048083019391928290030181865afa1580156117b1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117d59190612645565b6099546097546040517fb2267a7b0000000000000000000000000000000000000000000000000000000081529293506001600160a01b039182169263b2267a7b92349261182d929116905f9088908d9060040161265c565b5f604051808303818588803b158015611844575f80fd5b505af1158015611856573d5f803e3d5ffd5b5050505050826001600160a01b03168a6001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167fa9967b740f3fc69dfbf4744b4b1c7dfdb0b1b63f1fa4cf573bcdcb9f3ac687c48c8c8c876040516118ce949392919061265c565b60405180910390a450505050506118e460018055565b5050505050565b606580546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b6002600154036119a65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108e0565b6002600155565b60018055565b5f610c358383611d96565b6001600160a01b0381165f9081526001830160205260408120541515610c35565b6001600160a01b038316611a355760405162461bcd60e51b815260206004820152601860248201527f7a65726f20636f756e746572706172742061646472657373000000000000000060448201526064016108e0565b6001600160a01b038116611a8b5760405162461bcd60e51b815260206004820152601660248201527f7a65726f206d657373656e67657220616464726573730000000000000000000060448201526064016108e0565b611a93611dbc565b611a9b611e40565b609780546001600160a01b038086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560998054848416921691909117905582161561087157609880546001600160a01b0384167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179055505050565b5f610c38825490565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260409020611b619082611ec4565b156106225760405133906001600160a01b0383169084907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b905f90a45050565b5f54610100900460ff16611c1d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108e0565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117815560405133907fc36a428b063177e3f28b3b5d340c08f77827847b2ee30114ccf0c40e519c420a905f90a2805461ff001916610100178155611ca53390565b6001600160a01b03167fb2ed3603bd9051f0182ebfb75f12a21059b4d31b578a2a05c8d0245e9e2d320460405160405180910390a2611d047f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a866113fd565b611d2e7f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d6856113fd565b611d587f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d846113fd565b6118e47f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c836113fd565b5f610c35836001600160a01b038416611ed8565b5f825f018281548110611dab57611dab612694565b905f5260205f200154905092915050565b5f54610100900460ff16611e385760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108e0565b610887611f24565b5f54610100900460ff16611ebc5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108e0565b610887611fa0565b5f610c35836001600160a01b038416612025565b5f818152600183016020526040812054611f1d57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610c38565b505f610c38565b5f54610100900460ff166119ad5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108e0565b5f54610100900460ff1661201c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108e0565b610887336118eb565b5f81815260018301602052604081205480156120ff575f6120476001836126c1565b85549091505f9061205a906001906126c1565b90508181146120b9575f865f01828154811061207857612078612694565b905f5260205f200154905080875f01848154811061209857612098612694565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806120ca576120ca6126f9565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610c38565b5f915050610c38565b6001600160a01b03811681146113a0575f80fd5b5f806040838503121561212d575f80fd5b82359150602083013561213f81612108565b809150509250929050565b5f6020828403121561215a575f80fd5b813561216581612108565b9392505050565b5f8083601f84011261217c575f80fd5b50813567ffffffffffffffff811115612193575f80fd5b6020830191508360208285010111156121aa575f80fd5b9250929050565b5f805f805f8060a087890312156121c6575f80fd5b86356121d181612108565b955060208701356121e181612108565b945060408701359350606087013567ffffffffffffffff811115612203575f80fd5b61220f89828a0161216c565b979a9699509497949695608090950135949350505050565b5f805f60608486031215612239575f80fd5b833561224481612108565b95602085013595506040909401359392505050565b5f805f805f805f60c0888a03121561226f575f80fd5b873561227a81612108565b9650602088013561228a81612108565b9550604088013561229a81612108565b945060608801356122aa81612108565b93506080880135925060a088013567ffffffffffffffff8111156122cc575f80fd5b6122d88a828b0161216c565b989b979a50959850939692959293505050565b5f80604083850312156122fc575f80fd5b50508035926020909101359150565b5f805f806080858703121561231e575f80fd5b843561232981612108565b9350602085013561233981612108565b93969395505050506040820135916060013590565b5f805f60608486031215612360575f80fd5b833561236b81612108565b9250602084013561237b81612108565b9150604084013561238b81612108565b809150509250925092565b5f602082840312156123a6575f80fd5b5035919050565b5f805f80608085870312156123c0575f80fd5b84356123cb81612108565b935060208501356123db81612108565b925060408501356123eb81612108565b915060608501356123fb81612108565b939692955090935050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215612443575f80fd5b815161216581612108565b6001600160a01b038516815283602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f5b838110156124cb5781810151838201526020016124b3565b50505f910152565b5f80604083850312156124e4575f80fd5b82516124ef81612108565b602084015190925067ffffffffffffffff8082111561250c575f80fd5b818501915085601f83011261251f575f80fd5b81518181111561253157612531612406565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561257757612577612406565b8160405282815288602084870101111561258f575f80fd5b6125a08360208301602088016124b1565b80955050505050509250929050565b5f81518084526125c68160208601602086016124b1565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b5f6001600160a01b0380891683528088166020840152808716604084015280861660608401525083608083015260c060a083015261263960c08301846125af565b98975050505050505050565b5f60208284031215612655575f80fd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f61268360808301856125af565b905082606083015295945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b81810381811115610c38577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1Token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_l2Token\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ErrorAccountIsZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorCallerIsNotDepositsDisabler\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorCallerIsNotDepositsEnabler\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorCallerIsNotWithdrawalsDisabler\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorCallerIsNotWithdrawalsEnabler\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorDepositsDisabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorDepositsEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorNonZeroMsgValue\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorUnsupportedL1Token\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorUnsupportedL2Token\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorWithdrawZeroAmount\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorWithdrawalsDisabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorWithdrawalsEnabled\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"WithdrawAndCallIsNotAllowed\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"disabler\",\"type\":\"address\"}],\"name\":\"DepositsDisabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"enabler\",\"type\":\"address\"}],\"name\":\"DepositsEnabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"l1Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"l2Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"FinalizeDepositERC20\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"l1Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"l2Token\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"nonce\",\"type\":\"uint256\"}],\"name\":\"WithdrawERC20\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"disabler\",\"type\":\"address\"}],\"name\":\"WithdrawalsDisabled\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"enabler\",\"type\":\"address\"}],\"name\":\"WithdrawalsEnabled\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DEPOSITS_DISABLER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEPOSITS_ENABLER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WITHDRAWALS_DISABLER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"WITHDRAWALS_ENABLER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"counterpart\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"disableDeposits\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"disableWithdrawals\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enableDeposits\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"enableWithdrawals\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1Token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_l2Token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"finalizeDepositERC20\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l2Token\",\"type\":\"address\"}],\"name\":\"getL1ERC20Address\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1Token\",\"type\":\"address\"}],\"name\":\"getL2ERC20Address\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_role\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"_index\",\"type\":\"uint256\"}],\"name\":\"getRoleMember\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_role\",\"type\":\"bytes32\"}],\"name\":\"getRoleMemberCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"grantRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"hasRole\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_counterpart\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_router\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_messenger\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_depositsEnabler\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_depositsDisabler\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_withdrawalsEnabler\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_withdrawalsDisabler\",\"type\":\"address\"}],\"name\":\"initializeV2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isDepositsEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"isWithdrawalsEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1Token\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l2Token\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messenger\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"router\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"}],\"name\":\"withdrawERC20\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"}],\"name\":\"withdrawERC20\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_token\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_gasLimit\",\"type\":\"uint256\"}],\"name\":\"withdrawERC20AndCall\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"}]", + Bin: "0x60c060405234801562000010575f80fd5b506040516200290f3803806200290f833981016040819052620000339162000168565b6001600160a01b03808316608081905290821660a05215806200005d57506001600160a01b038116155b156200007c5760405163a7f9319d60e01b815260040160405180910390fd5b620000866200008e565b50506200019e565b5f54610100900460ff1615620000fa5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146200014a575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b80516001600160a01b038116811462000163575f80fd5b919050565b5f80604083850312156200017a575f80fd5b62000185836200014c565b915062000195602084016200014c565b90509250929050565b60805160a051612717620001f85f395f81816102610152818161062a01528181610a1d01528181611077015261147e01525f818161049b01528181610696015281816109b10152818161100b01526116a101526127175ff3fe6080604052600436106101d0575f3560e01c80639010d07c116100fd578063ca15c87311610092578063f27ebced11610062578063f27ebced14610580578063f2fde38b1461059f578063f887ea40146105be578063fadcc54a146105dd575f80fd5b8063ca15c873146104fb578063d547741f1461051a578063e3b523e314610539578063e8bac93b1461056c575f80fd5b8063ad960ce1116100cd578063ad960ce114610476578063c01e1bd61461048a578063c0c53b8b146104bd578063c676ad29146104dc575f80fd5b80639010d07c1461041157806391d1485414610430578063a93a4af91461044f578063ac67e1af14610462575f80fd5b80635ed2c22011610173578063797594b011610143578063797594b01461038f5780638431f5c1146103ae5780638d7601c0146103c15780638da5cb5b146103f4575f80fd5b80635ed2c220146102ec5780636c07ea43146103275780636f18bd221461033a578063715018a61461037b575f80fd5b806356eff267116101ae57806356eff26714610250578063575361b6146102835780635777bf50146102965780635e4c57a4146102d8575f80fd5b80632f2ff15d146101d45780633cb747bf146101f557806354bbd59c14610231575b5f80fd5b3480156101df575f80fd5b506101f36101ee366004612100565b610610565b005b348015610200575f80fd5b50609954610214906001600160a01b031681565b6040516001600160a01b0390911681526020015b60405180910390f35b34801561023c575f80fd5b5061021461024b36600461212e565b610626565b34801561025b575f80fd5b506102147f000000000000000000000000000000000000000000000000000000000000000081565b6101f3610291366004612195565b6106bb565b3480156102a1575f80fd5b507fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff165b6040519015158152602001610228565b3480156102e3575f80fd5b506101f3610706565b3480156102f7575f80fd5b507fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff166102c8565b6101f361033536600461220b565b610838565b348015610345575f80fd5b5061036d7f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d681565b604051908152602001610228565b348015610386575f80fd5b506101f3610876565b34801561039a575f80fd5b50609754610214906001600160a01b031681565b6101f36103bc36600461223d565b610889565b3480156103cc575f80fd5b5061036d7f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c81565b3480156103ff575f80fd5b506065546001600160a01b0316610214565b34801561041c575f80fd5b5061021461042b3660046122cf565b610bff565b34801561043b575f80fd5b506102c861044a366004612100565b610c3e565b6101f361045d3660046122ef565b610c74565b34801561046d575f80fd5b506101f3610c86565b348015610481575f80fd5b506101f3610db4565b348015610495575f80fd5b506102147f000000000000000000000000000000000000000000000000000000000000000081565b3480156104c8575f80fd5b506101f36104d7366004612332565b610eca565b3480156104e7575f80fd5b506102146104f636600461212e565b611007565b348015610506575f80fd5b5061036d61051536600461237a565b61109c565b348015610525575f80fd5b506101f3610534366004612100565b6110d1565b348015610544575f80fd5b5061036d7f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d81565b348015610577575f80fd5b506101f36110e3565b34801561058b575f80fd5b506101f361059a366004612391565b6111fe565b3480156105aa575f80fd5b506101f36105b936600461212e565b611313565b3480156105c9575f80fd5b50609854610214906001600160a01b031681565b3480156105e8575f80fd5b5061036d7f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a81565b6106186113a3565b61062282826113fd565b5050565b5f817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614610693576040517f6251ce6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b507f000000000000000000000000000000000000000000000000000000000000000092915050565b6106fe86868686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250889250611473915050565b505050505050565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff1615610762576040517f4f2c8be200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61078c7f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a33610c3e565b6107c2576040517f3d39c5f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560405133907fc36a428b063177e3f28b3b5d340c08f77827847b2ee30114ccf0c40e519c420a905f90a2565b6108718333845f5b6040519080825280601f01601f19166020018201604052801561086a576020820181803683370190505b5085611473565b505050565b61087e6113a3565b6108875f6118cf565b565b6099546001600160a01b03163381146108e95760405162461bcd60e51b815260206004820152601760248201527f6f6e6c79206d657373656e6765722063616e2063616c6c00000000000000000060448201526064015b60405180910390fd5b806001600160a01b0316636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015610925573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109499190612417565b6097546001600160a01b039081169116146109a65760405162461bcd60e51b815260206004820152601860248201527f6f6e6c792063616c6c20627920636f756e74657270617274000000000000000060448201526064016108e0565b6109ae611938565b877f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614610a1a576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b877f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614610a86576040517f6251ce6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff16610ae1576040517fa185a6b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3415610b19576040517f3ddcf11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f40c10f190000000000000000000000000000000000000000000000000000000081526001600160a01b038881166004830152602482018890528a16906340c10f19906044015f604051808303815f87803b158015610b79575f80fd5b505af1158015610b8b573d5f803e3d5ffd5b50505050876001600160a01b0316896001600160a01b03168b6001600160a01b03167f165ba69f6ab40c50cade6f65431801e5f9c7d7830b7545391920db039133ba348a8a8a8a604051610be29493929190612432565b60405180910390a45050610bf560018055565b5050505050505050565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260408120610c359083611997565b90505b92915050565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260408120610c3590836119a2565b610c808484845f610840565b50505050565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff16610ce1576040517fa185a6b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610d0b7f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d633610c3e565b610d41576040517fadd9524c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560405133907f9ca4d309bbfd23c65db3dc38c1712862f5812c7139937e2655de86e803f73bb9905f90a2565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff16610e14576040517f77d195b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e3e7f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c33610c3e565b610e74576040517f9e60ca7e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec805461ff001916905560405133907f644eeba8ede48fefc32ada09fb240c5f6c0f06507ab1d296d5af41f1521d9fcb905f90a2565b5f54610100900460ff1615808015610ee857505f54600160ff909116105b80610f015750303b158015610f0157505f5460ff166001145b610f735760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016108e0565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610fb2575f805461ff0019166101001790555b610fbd8484846119c3565b8015610c80575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b5f817f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b031614611074576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b507f000000000000000000000000000000000000000000000000000000000000000092915050565b5f8181527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260408120610c3890611b06565b6110d96113a3565b6106228282611b0f565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff1615611144576040517ff74ad25400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61116e7f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d33610c3e565b6111a4576040517f5c16894300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec805461ff00191661010017905560405133907fb2ed3603bd9051f0182ebfb75f12a21059b4d31b578a2a05c8d0245e9e2d3204905f90a2565b5f54600290610100900460ff1615801561121e57505f5460ff8083169116105b6112905760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016108e0565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff8316176101001790556112cc85858585611b85565b5f805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b61131b6113a3565b6001600160a01b0381166113975760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108e0565b6113a0816118cf565b50565b6065546001600160a01b031633146108875760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108e0565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed602052604090206114339082611d66565b156106225760405133906001600160a01b0383169084907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d905f90a45050565b61147b611938565b847f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316816001600160a01b0316146114e7576040517f6251ce6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b846001600160a01b038116611528576040517fef6b416200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff16611588576040517f77d195b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845f036115c1576040517f6c18829600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60985433906001600160a01b03168190036115ef57848060200190518101906115ea91906124b7565b955090505b845115611628576040517f998bcee200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f9dc29fac0000000000000000000000000000000000000000000000000000000081526001600160a01b03828116600483015260248201889052891690639dc29fac906044015f604051808303815f87803b158015611688575f80fd5b505af115801561169a573d5f803e3d5ffd5b50506040517f000000000000000000000000000000000000000000000000000000000000000092505f91506116dd9083908c9086908d908d908d906024016125dc565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84bd13b00000000000000000000000000000000000000000000000000000000017905260995482517fecc7042800000000000000000000000000000000000000000000000000000000815292519394505f936001600160a01b039091169263ecc704289260048083019391928290030181865afa1580156117b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906117d89190612629565b6099546097546040517fb2267a7b0000000000000000000000000000000000000000000000000000000081529293506001600160a01b039182169263b2267a7b923492611830929116905f9088908e90600401612640565b5f604051808303818588803b158015611847575f80fd5b505af1158015611859573d5f803e3d5ffd5b5050505050836001600160a01b03168b6001600160a01b0316846001600160a01b03167fa9967b740f3fc69dfbf4744b4b1c7dfdb0b1b63f1fa4cf573bcdcb9f3ac687c48d8d8d876040516118b19493929190612640565b60405180910390a45050505050506118c860018055565b5050505050565b606580546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b60026001540361198a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108e0565b6002600155565b60018055565b5f610c358383611d7a565b6001600160a01b0381165f9081526001830160205260408120541515610c35565b6001600160a01b038316611a195760405162461bcd60e51b815260206004820152601860248201527f7a65726f20636f756e746572706172742061646472657373000000000000000060448201526064016108e0565b6001600160a01b038116611a6f5760405162461bcd60e51b815260206004820152601660248201527f7a65726f206d657373656e67657220616464726573730000000000000000000060448201526064016108e0565b611a77611da0565b611a7f611e24565b609780546001600160a01b038086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925560998054848416921691909117905582161561087157609880546001600160a01b0384167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179055505050565b5f610c38825490565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260409020611b459082611ea8565b156106225760405133906001600160a01b0383169084907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b905f90a45050565b5f54610100900460ff16611c015760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108e0565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117815560405133907fc36a428b063177e3f28b3b5d340c08f77827847b2ee30114ccf0c40e519c420a905f90a2805461ff001916610100178155611c893390565b6001600160a01b03167fb2ed3603bd9051f0182ebfb75f12a21059b4d31b578a2a05c8d0245e9e2d320460405160405180910390a2611ce87f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a866113fd565b611d127f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d6856113fd565b611d3c7f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d846113fd565b6118c87f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c836113fd565b5f610c35836001600160a01b038416611ebc565b5f825f018281548110611d8f57611d8f612678565b905f5260205f200154905092915050565b5f54610100900460ff16611e1c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108e0565b610887611f08565b5f54610100900460ff16611ea05760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108e0565b610887611f84565b5f610c35836001600160a01b038416612009565b5f818152600183016020526040812054611f0157508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610c38565b505f610c38565b5f54610100900460ff166119915760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108e0565b5f54610100900460ff166120005760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108e0565b610887336118cf565b5f81815260018301602052604081205480156120e3575f61202b6001836126a5565b85549091505f9061203e906001906126a5565b905081811461209d575f865f01828154811061205c5761205c612678565b905f5260205f200154905080875f01848154811061207c5761207c612678565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806120ae576120ae6126dd565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610c38565b5f915050610c38565b6001600160a01b03811681146113a0575f80fd5b5f8060408385031215612111575f80fd5b823591506020830135612123816120ec565b809150509250929050565b5f6020828403121561213e575f80fd5b8135612149816120ec565b9392505050565b5f8083601f840112612160575f80fd5b50813567ffffffffffffffff811115612177575f80fd5b60208301915083602082850101111561218e575f80fd5b9250929050565b5f805f805f8060a087890312156121aa575f80fd5b86356121b5816120ec565b955060208701356121c5816120ec565b945060408701359350606087013567ffffffffffffffff8111156121e7575f80fd5b6121f389828a01612150565b979a9699509497949695608090950135949350505050565b5f805f6060848603121561221d575f80fd5b8335612228816120ec565b95602085013595506040909401359392505050565b5f805f805f805f60c0888a031215612253575f80fd5b873561225e816120ec565b9650602088013561226e816120ec565b9550604088013561227e816120ec565b9450606088013561228e816120ec565b93506080880135925060a088013567ffffffffffffffff8111156122b0575f80fd5b6122bc8a828b01612150565b989b979a50959850939692959293505050565b5f80604083850312156122e0575f80fd5b50508035926020909101359150565b5f805f8060808587031215612302575f80fd5b843561230d816120ec565b9350602085013561231d816120ec565b93969395505050506040820135916060013590565b5f805f60608486031215612344575f80fd5b833561234f816120ec565b9250602084013561235f816120ec565b9150604084013561236f816120ec565b809150509250925092565b5f6020828403121561238a575f80fd5b5035919050565b5f805f80608085870312156123a4575f80fd5b84356123af816120ec565b935060208501356123bf816120ec565b925060408501356123cf816120ec565b915060608501356123df816120ec565b939692955090935050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215612427575f80fd5b8151612149816120ec565b6001600160a01b038516815283602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f5b838110156124af578181015183820152602001612497565b50505f910152565b5f80604083850312156124c8575f80fd5b82516124d3816120ec565b602084015190925067ffffffffffffffff808211156124f0575f80fd5b818501915085601f830112612503575f80fd5b815181811115612515576125156123ea565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f0116810190838211818310171561255b5761255b6123ea565b81604052828152886020848701011115612573575f80fd5b612584836020830160208801612495565b80955050505050509250929050565b5f81518084526125aa816020860160208601612495565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b5f6001600160a01b0380891683528088166020840152808716604084015280861660608401525083608083015260c060a083015261261d60c0830184612593565b98975050505050505050565b5f60208284031215612639575f80fd5b5051919050565b6001600160a01b0385168152836020820152608060408201525f6126676080830185612593565b905082606083015295945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b81810381811115610c38577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea164736f6c6343000818000a", } // L2LidoGatewayABI is the input ABI used to generate the binding from. diff --git a/bindings/bindings/l2lidogateway_more.go b/bindings/bindings/l2lidogateway_more.go index c2ff786e..b3336bd0 100644 --- a/bindings/bindings/l2lidogateway_more.go +++ b/bindings/bindings/l2lidogateway_more.go @@ -13,7 +13,7 @@ const L2LidoGatewayStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract var L2LidoGatewayStorageLayout = new(solc.StorageLayout) -var L2LidoGatewayDeployedBin = "0x6080604052600436106101d0575f3560e01c80639010d07c116100fd578063ca15c87311610092578063f27ebced11610062578063f27ebced146105b4578063f2fde38b146105d3578063f887ea40146105f2578063fadcc54a1461061e575f80fd5b8063ca15c8731461052f578063d547741f1461054e578063e3b523e31461056d578063e8bac93b146105a0575f80fd5b8063ad960ce1116100cd578063ad960ce1146104aa578063c01e1bd6146104be578063c0c53b8b146104f1578063c676ad2914610510575f80fd5b80639010d07c1461044557806391d1485414610464578063a93a4af914610483578063ac67e1af14610496575f80fd5b80635ed2c22011610173578063797594b011610143578063797594b0146103a95780638431f5c1146103d55780638d7601c0146103e85780638da5cb5b1461041b575f80fd5b80635ed2c220146103065780636c07ea43146103415780636f18bd2214610354578063715018a614610395575f80fd5b806356eff267116101ae57806356eff2671461026a578063575361b61461029d5780635777bf50146102b05780635e4c57a4146102f2575f80fd5b80632f2ff15d146101d45780633cb747bf146101f557806354bbd59c1461024b575b5f80fd5b3480156101df575f80fd5b506101f36101ee366004612572565b610651565b005b348015610200575f80fd5b506099546102219073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610256575f80fd5b506102216102653660046125a0565b610667565b348015610275575f80fd5b506102217f000000000000000000000000000000000000000000000000000000000000000081565b6101f36102ab366004612607565b610716565b3480156102bb575f80fd5b507fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff165b6040519015158152602001610242565b3480156102fd575f80fd5b506101f3610761565b348015610311575f80fd5b507fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff166102e2565b6101f361034f36600461267d565b610893565b34801561035f575f80fd5b506103877f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d681565b604051908152602001610242565b3480156103a0575f80fd5b506101f36108d1565b3480156103b4575f80fd5b506097546102219073ffffffffffffffffffffffffffffffffffffffff1681565b6101f36103e33660046126af565b6108e4565b3480156103f3575f80fd5b506103877f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c81565b348015610426575f80fd5b5060655473ffffffffffffffffffffffffffffffffffffffff16610221565b348015610450575f80fd5b5061022161045f366004612741565b610d1d565b34801561046f575f80fd5b506102e261047e366004612572565b610d5c565b6101f3610491366004612761565b610d92565b3480156104a1575f80fd5b506101f3610da4565b3480156104b5575f80fd5b506101f3610ed2565b3480156104c9575f80fd5b506102217f000000000000000000000000000000000000000000000000000000000000000081565b3480156104fc575f80fd5b506101f361050b3660046127a4565b611005565b34801561051b575f80fd5b5061022161052a3660046125a0565b611196565b34801561053a575f80fd5b506103876105493660046127ec565b611245565b348015610559575f80fd5b506101f3610568366004612572565b61127a565b348015610578575f80fd5b506103877f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d81565b3480156105ab575f80fd5b506101f361128c565b3480156105bf575f80fd5b506101f36105ce366004612803565b6113c4565b3480156105de575f80fd5b506101f36105ed3660046125a0565b611510565b3480156105fd575f80fd5b506098546102219073ffffffffffffffffffffffffffffffffffffffff1681565b348015610629575f80fd5b506103877f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a81565b6106596115c7565b6106638282611648565b5050565b5f817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146106ee576040517f6251ce6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b507f000000000000000000000000000000000000000000000000000000000000000092915050565b61075986868686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508892506116cb915050565b505050505050565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff16156107bd576040517f4f2c8be200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107e77f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a33610d5c565b61081d576040517f3d39c5f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560405133907fc36a428b063177e3f28b3b5d340c08f77827847b2ee30114ccf0c40e519c420a905f90a2565b6108cc8333845f5b6040519080825280601f01601f1916602001820160405280156108c5576020820181803683370190505b50856116cb565b505050565b6108d96115c7565b6108e25f611bc5565b565b60995473ffffffffffffffffffffffffffffffffffffffff1633811461096b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f6f6e6c79206d657373656e6765722063616e2063616c6c00000000000000000060448201526064015b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109d89190612889565b60975473ffffffffffffffffffffffffffffffffffffffff908116911614610a5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6f6e6c792063616c6c20627920636f756e7465727061727400000000000000006044820152606401610962565b610a64611c3b565b877f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610aea576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b877f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b70576040517f6251ce6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff16610bcb576040517fa185a6b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3415610c03576040517f3ddcf11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152602482018890528a16906340c10f19906044015f604051808303815f87803b158015610c70575f80fd5b505af1158015610c82573d5f803e3d5ffd5b505050508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff167f165ba69f6ab40c50cade6f65431801e5f9c7d7830b7545391920db039133ba348a8a8a8a604051610d0094939291906128a4565b60405180910390a45050610d1360018055565b5050505050505050565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260408120610d539083611cb4565b90505b92915050565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260408120610d539083611cbf565b610d9e8484845f61089b565b50505050565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff16610dff576040517fa185a6b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e297f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d633610d5c565b610e5f576040517fadd9524c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560405133907f9ca4d309bbfd23c65db3dc38c1712862f5812c7139937e2655de86e803f73bb9905f90a2565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff16610f32576040517f77d195b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f5c7f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c33610d5c565b610f92576040517f9e60ca7e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405133907f644eeba8ede48fefc32ada09fb240c5f6c0f06507ab1d296d5af41f1521d9fcb905f90a2565b5f54610100900460ff161580801561102357505f54600160ff909116105b8061103c5750303b15801561103c57505f5460ff166001145b6110c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610962565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611124575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b61112f848484611ced565b8015610d9e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b5f817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461121d576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b507f000000000000000000000000000000000000000000000000000000000000000092915050565b5f8181527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260408120610d5690611e98565b6112826115c7565b6106638282611ea1565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff16156112ed576040517ff74ad25400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113177f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d33610d5c565b61134d576040517f5c16894300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560405133907fb2ed3603bd9051f0182ebfb75f12a21059b4d31b578a2a05c8d0245e9e2d3204905f90a2565b5f54600290610100900460ff161580156113e457505f5460ff8083169116105b611470576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610962565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff8316176101001790556114ac85858585611f24565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6115186115c7565b73ffffffffffffffffffffffffffffffffffffffff81166115bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610962565b6115c481611bc5565b50565b60655473ffffffffffffffffffffffffffffffffffffffff1633146108e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610962565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed6020526040902061167e9082612149565b1561066357604051339073ffffffffffffffffffffffffffffffffffffffff83169084907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d905f90a45050565b6116d3611c3b565b847f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611759576040517f6251ce6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff81166117a7576040517fef6b416200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff16611807576040517f77d195b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845f03611840576040517f6c18829600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609854339073ffffffffffffffffffffffffffffffffffffffff1681900361187b57848060200190518101906118769190612936565b955090505b8451156118b4576040517f998bcee200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff828116600483015260248201889052891690639dc29fac906044015f604051808303815f87803b158015611921575f80fd5b505af1158015611933573d5f803e3d5ffd5b505050505f7f000000000000000000000000000000000000000000000000000000000000000089838a8a8a60405160240161197396959493929190612a5b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84bd13b00000000000000000000000000000000000000000000000000000000017905260995482517fecc7042800000000000000000000000000000000000000000000000000000000815292519394505f9373ffffffffffffffffffffffffffffffffffffffff9091169263ecc704289260048083019391928290030181865afa158015611a57573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a7b9190612ab5565b6099546097546040517fb2267a7b00000000000000000000000000000000000000000000000000000000815292935073ffffffffffffffffffffffffffffffffffffffff9182169263b2267a7b923492611ae0929116905f9088908d90600401612acc565b5f604051808303818588803b158015611af7575f80fd5b505af1158015611b09573d5f803e3d5ffd5b50505050508273ffffffffffffffffffffffffffffffffffffffff168a73ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167fa9967b740f3fc69dfbf4744b4b1c7dfdb0b1b63f1fa4cf573bcdcb9f3ac687c48c8c8c87604051611ba89493929190612acc565b60405180910390a45050505050611bbe60018055565b5050505050565b6065805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b600260015403611ca7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610962565b6002600155565b60018055565b5f610d53838361216a565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526001830160205260408120541515610d53565b73ffffffffffffffffffffffffffffffffffffffff8316611d6a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f7a65726f20636f756e74657270617274206164647265737300000000000000006044820152606401610962565b73ffffffffffffffffffffffffffffffffffffffff8116611de7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f7a65726f206d657373656e6765722061646472657373000000000000000000006044820152606401610962565b611def612190565b611df761222e565b6097805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179092556099805484841692169190911790558216156108cc576098805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179055505050565b5f610d56825490565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260409020611ed790826122cc565b1561066357604051339073ffffffffffffffffffffffffffffffffffffffff83169084907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b905f90a45050565b5f54610100900460ff16611fba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610962565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117815560405133907fc36a428b063177e3f28b3b5d340c08f77827847b2ee30114ccf0c40e519c420a905f90a280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017815561205f3390565b73ffffffffffffffffffffffffffffffffffffffff167fb2ed3603bd9051f0182ebfb75f12a21059b4d31b578a2a05c8d0245e9e2d320460405160405180910390a26120cb7f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a86611648565b6120f57f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d685611648565b61211f7f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d84611648565b611bbe7f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c83611648565b5f610d538373ffffffffffffffffffffffffffffffffffffffff84166122ed565b5f825f01828154811061217f5761217f612b11565b905f5260205f200154905092915050565b5f54610100900460ff16612226576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610962565b6108e2612339565b5f54610100900460ff166122c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610962565b6108e26123cf565b5f610d538373ffffffffffffffffffffffffffffffffffffffff841661246e565b5f81815260018301602052604081205461233257508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610d56565b505f610d56565b5f54610100900460ff16611cae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610962565b5f54610100900460ff16612465576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610962565b6108e233611bc5565b5f8181526001830160205260408120548015612548575f612490600183612b3e565b85549091505f906124a390600190612b3e565b9050818114612502575f865f0182815481106124c1576124c1612b11565b905f5260205f200154905080875f0184815481106124e1576124e1612b11565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061251357612513612b76565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610d56565b5f915050610d56565b73ffffffffffffffffffffffffffffffffffffffff811681146115c4575f80fd5b5f8060408385031215612583575f80fd5b82359150602083013561259581612551565b809150509250929050565b5f602082840312156125b0575f80fd5b81356125bb81612551565b9392505050565b5f8083601f8401126125d2575f80fd5b50813567ffffffffffffffff8111156125e9575f80fd5b602083019150836020828501011115612600575f80fd5b9250929050565b5f805f805f8060a0878903121561261c575f80fd5b863561262781612551565b9550602087013561263781612551565b945060408701359350606087013567ffffffffffffffff811115612659575f80fd5b61266589828a016125c2565b979a9699509497949695608090950135949350505050565b5f805f6060848603121561268f575f80fd5b833561269a81612551565b95602085013595506040909401359392505050565b5f805f805f805f60c0888a0312156126c5575f80fd5b87356126d081612551565b965060208801356126e081612551565b955060408801356126f081612551565b9450606088013561270081612551565b93506080880135925060a088013567ffffffffffffffff811115612722575f80fd5b61272e8a828b016125c2565b989b979a50959850939692959293505050565b5f8060408385031215612752575f80fd5b50508035926020909101359150565b5f805f8060808587031215612774575f80fd5b843561277f81612551565b9350602085013561278f81612551565b93969395505050506040820135916060013590565b5f805f606084860312156127b6575f80fd5b83356127c181612551565b925060208401356127d181612551565b915060408401356127e181612551565b809150509250925092565b5f602082840312156127fc575f80fd5b5035919050565b5f805f8060808587031215612816575f80fd5b843561282181612551565b9350602085013561283181612551565b9250604085013561284181612551565b9150606085013561285181612551565b939692955090935050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f60208284031215612899575f80fd5b81516125bb81612551565b73ffffffffffffffffffffffffffffffffffffffff8516815283602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f5b8381101561292e578181015183820152602001612916565b50505f910152565b5f8060408385031215612947575f80fd5b825161295281612551565b602084015190925067ffffffffffffffff8082111561296f575f80fd5b818501915085601f830112612982575f80fd5b8151818111156129945761299461285c565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156129da576129da61285c565b816040528281528860208487010111156129f2575f80fd5b612a03836020830160208801612914565b80955050505050509250929050565b5f8151808452612a29816020860160208601612914565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b5f73ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a0830152612aa960c0830184612a12565b98975050505050505050565b5f60208284031215612ac5575f80fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152608060408201525f612b006080830185612a12565b905082606083015295945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b81810381811115610d56577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea164736f6c6343000818000a" +var L2LidoGatewayDeployedBin = "0x6080604052600436106101d0575f3560e01c80639010d07c116100fd578063ca15c87311610092578063f27ebced11610062578063f27ebced146105b4578063f2fde38b146105d3578063f887ea40146105f2578063fadcc54a1461061e575f80fd5b8063ca15c8731461052f578063d547741f1461054e578063e3b523e31461056d578063e8bac93b146105a0575f80fd5b8063ad960ce1116100cd578063ad960ce1146104aa578063c01e1bd6146104be578063c0c53b8b146104f1578063c676ad2914610510575f80fd5b80639010d07c1461044557806391d1485414610464578063a93a4af914610483578063ac67e1af14610496575f80fd5b80635ed2c22011610173578063797594b011610143578063797594b0146103a95780638431f5c1146103d55780638d7601c0146103e85780638da5cb5b1461041b575f80fd5b80635ed2c220146103065780636c07ea43146103415780636f18bd2214610354578063715018a614610395575f80fd5b806356eff267116101ae57806356eff2671461026a578063575361b61461029d5780635777bf50146102b05780635e4c57a4146102f2575f80fd5b80632f2ff15d146101d45780633cb747bf146101f557806354bbd59c1461024b575b5f80fd5b3480156101df575f80fd5b506101f36101ee366004612556565b610651565b005b348015610200575f80fd5b506099546102219073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b348015610256575f80fd5b50610221610265366004612584565b610667565b348015610275575f80fd5b506102217f000000000000000000000000000000000000000000000000000000000000000081565b6101f36102ab3660046125eb565b610716565b3480156102bb575f80fd5b507fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff165b6040519015158152602001610242565b3480156102fd575f80fd5b506101f3610761565b348015610311575f80fd5b507fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff166102e2565b6101f361034f366004612661565b610893565b34801561035f575f80fd5b506103877f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d681565b604051908152602001610242565b3480156103a0575f80fd5b506101f36108d1565b3480156103b4575f80fd5b506097546102219073ffffffffffffffffffffffffffffffffffffffff1681565b6101f36103e3366004612693565b6108e4565b3480156103f3575f80fd5b506103877f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c81565b348015610426575f80fd5b5060655473ffffffffffffffffffffffffffffffffffffffff16610221565b348015610450575f80fd5b5061022161045f366004612725565b610d1d565b34801561046f575f80fd5b506102e261047e366004612556565b610d5c565b6101f3610491366004612745565b610d92565b3480156104a1575f80fd5b506101f3610da4565b3480156104b5575f80fd5b506101f3610ed2565b3480156104c9575f80fd5b506102217f000000000000000000000000000000000000000000000000000000000000000081565b3480156104fc575f80fd5b506101f361050b366004612788565b611005565b34801561051b575f80fd5b5061022161052a366004612584565b611196565b34801561053a575f80fd5b506103876105493660046127d0565b611245565b348015610559575f80fd5b506101f3610568366004612556565b61127a565b348015610578575f80fd5b506103877f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d81565b3480156105ab575f80fd5b506101f361128c565b3480156105bf575f80fd5b506101f36105ce3660046127e7565b6113c4565b3480156105de575f80fd5b506101f36105ed366004612584565b611510565b3480156105fd575f80fd5b506098546102219073ffffffffffffffffffffffffffffffffffffffff1681565b348015610629575f80fd5b506103877f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a81565b6106596115c7565b6106638282611648565b5050565b5f817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146106ee576040517f6251ce6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b507f000000000000000000000000000000000000000000000000000000000000000092915050565b61075986868686868080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508892506116cb915050565b505050505050565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff16156107bd576040517f4f2c8be200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6107e77f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a33610d5c565b61081d576040517f3d39c5f500000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560405133907fc36a428b063177e3f28b3b5d340c08f77827847b2ee30114ccf0c40e519c420a905f90a2565b6108cc8333845f5b6040519080825280601f01601f1916602001820160405280156108c5576020820181803683370190505b50856116cb565b505050565b6108d96115c7565b6108e25f611ba9565b565b60995473ffffffffffffffffffffffffffffffffffffffff1633811461096b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f6f6e6c79206d657373656e6765722063616e2063616c6c00000000000000000060448201526064015b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa1580156109b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109d8919061286d565b60975473ffffffffffffffffffffffffffffffffffffffff908116911614610a5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f6f6e6c792063616c6c20627920636f756e7465727061727400000000000000006044820152606401610962565b610a64611c1f565b877f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610aea576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b877f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610b70576040517f6251ce6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff16610bcb576040517fa185a6b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b3415610c03576040517f3ddcf11400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f40c10f1900000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8881166004830152602482018890528a16906340c10f19906044015f604051808303815f87803b158015610c70575f80fd5b505af1158015610c82573d5f803e3d5ffd5b505050508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff167f165ba69f6ab40c50cade6f65431801e5f9c7d7830b7545391920db039133ba348a8a8a8a604051610d009493929190612888565b60405180910390a45050610d1360018055565b5050505050505050565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260408120610d539083611c98565b90505b92915050565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260408120610d539083611ca3565b610d9e8484845f61089b565b50505050565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec5460ff16610dff576040517fa185a6b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e297f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d633610d5c565b610e5f576040517fadd9524c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560405133907f9ca4d309bbfd23c65db3dc38c1712862f5812c7139937e2655de86e803f73bb9905f90a2565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff16610f32576040517f77d195b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610f5c7f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c33610d5c565b610f92576040517f9e60ca7e00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405133907f644eeba8ede48fefc32ada09fb240c5f6c0f06507ab1d296d5af41f1521d9fcb905f90a2565b5f54610100900460ff161580801561102357505f54600160ff909116105b8061103c5750303b15801561103c57505f5460ff166001145b6110c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610962565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611124575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b61112f848484611cd1565b8015610d9e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b5f817f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461121d576040517ffe15603f00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b507f000000000000000000000000000000000000000000000000000000000000000092915050565b5f8181527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260408120610d5690611e7c565b6112826115c7565b6106638282611e85565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff16156112ed576040517ff74ad25400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6113177f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d33610d5c565b61134d576040517f5c16894300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560405133907fb2ed3603bd9051f0182ebfb75f12a21059b4d31b578a2a05c8d0245e9e2d3204905f90a2565b5f54600290610100900460ff161580156113e457505f5460ff8083169116105b611470576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610962565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff8316176101001790556114ac85858585611f08565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15050505050565b6115186115c7565b73ffffffffffffffffffffffffffffffffffffffff81166115bb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610962565b6115c481611ba9565b50565b60655473ffffffffffffffffffffffffffffffffffffffff1633146108e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610962565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed6020526040902061167e908261212d565b1561066357604051339073ffffffffffffffffffffffffffffffffffffffff83169084907f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d905f90a45050565b6116d3611c1f565b847f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611759576040517f6251ce6800000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff81166117a7576040517fef6b416200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec54610100900460ff16611807576040517f77d195b200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b845f03611840576040517f6c18829600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b609854339073ffffffffffffffffffffffffffffffffffffffff1681900361187b5784806020019051810190611876919061291a565b955090505b8451156118b4576040517f998bcee200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6040517f9dc29fac00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff828116600483015260248201889052891690639dc29fac906044015f604051808303815f87803b158015611921575f80fd5b505af1158015611933573d5f803e3d5ffd5b50506040517f000000000000000000000000000000000000000000000000000000000000000092505f91506119769083908c9086908d908d908d90602401612a3f565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0818403018152918152602080830180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f84bd13b00000000000000000000000000000000000000000000000000000000017905260995482517fecc7042800000000000000000000000000000000000000000000000000000000815292519394505f9373ffffffffffffffffffffffffffffffffffffffff9091169263ecc704289260048083019391928290030181865afa158015611a5a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a7e9190612a99565b6099546097546040517fb2267a7b00000000000000000000000000000000000000000000000000000000815292935073ffffffffffffffffffffffffffffffffffffffff9182169263b2267a7b923492611ae3929116905f9088908e90600401612ab0565b5f604051808303818588803b158015611afa575f80fd5b505af1158015611b0c573d5f803e3d5ffd5b50505050508373ffffffffffffffffffffffffffffffffffffffff168b73ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fa9967b740f3fc69dfbf4744b4b1c7dfdb0b1b63f1fa4cf573bcdcb9f3ac687c48d8d8d87604051611b8b9493929190612ab0565b60405180910390a4505050505050611ba260018055565b5050505050565b6065805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b600260015403611c8b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610962565b6002600155565b60018055565b5f610d53838361214e565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526001830160205260408120541515610d53565b73ffffffffffffffffffffffffffffffffffffffff8316611d4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f7a65726f20636f756e74657270617274206164647265737300000000000000006044820152606401610962565b73ffffffffffffffffffffffffffffffffffffffff8116611dcb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f7a65726f206d657373656e6765722061646472657373000000000000000000006044820152606401610962565b611dd3612174565b611ddb612212565b6097805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff0000000000000000000000000000000000000000928316179092556099805484841692169190911790558216156108cc576098805473ffffffffffffffffffffffffffffffffffffffff84167fffffffffffffffffffffffff0000000000000000000000000000000000000000909116179055505050565b5f610d56825490565b5f8281527fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ed60205260409020611ebb90826122b0565b1561066357604051339073ffffffffffffffffffffffffffffffffffffffff83169084907ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b905f90a45050565b5f54610100900460ff16611f9e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610962565b7fe20dc80161c3a3e412098d054775959b6cab7cf9e3d46b04fee5a64d0898f0ec80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117815560405133907fc36a428b063177e3f28b3b5d340c08f77827847b2ee30114ccf0c40e519c420a905f90a280547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001781556120433390565b73ffffffffffffffffffffffffffffffffffffffff167fb2ed3603bd9051f0182ebfb75f12a21059b4d31b578a2a05c8d0245e9e2d320460405160405180910390a26120af7f4b43b36766bde12c5e9cbbc37d15f8d1f769f08f54720ab370faeb4ce893753a86611648565b6120d97f63f736f21cb2943826cd50b191eb054ebbea670e4e962d0527611f830cd399d685611648565b6121037f9ab8816a3dc0b3849ec1ac00483f6ec815b07eee2fd766a353311c823ad59d0d84611648565b611ba27f94a954c0bc99227eddbc0715a62a7e1056ed8784cd719c2303b685683908857c83611648565b5f610d538373ffffffffffffffffffffffffffffffffffffffff84166122d1565b5f825f01828154811061216357612163612af5565b905f5260205f200154905092915050565b5f54610100900460ff1661220a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610962565b6108e261231d565b5f54610100900460ff166122a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610962565b6108e26123b3565b5f610d538373ffffffffffffffffffffffffffffffffffffffff8416612452565b5f81815260018301602052604081205461231657508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610d56565b505f610d56565b5f54610100900460ff16611c92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610962565b5f54610100900460ff16612449576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610962565b6108e233611ba9565b5f818152600183016020526040812054801561252c575f612474600183612b22565b85549091505f9061248790600190612b22565b90508181146124e6575f865f0182815481106124a5576124a5612af5565b905f5260205f200154905080875f0184815481106124c5576124c5612af5565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806124f7576124f7612b5a565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610d56565b5f915050610d56565b73ffffffffffffffffffffffffffffffffffffffff811681146115c4575f80fd5b5f8060408385031215612567575f80fd5b82359150602083013561257981612535565b809150509250929050565b5f60208284031215612594575f80fd5b813561259f81612535565b9392505050565b5f8083601f8401126125b6575f80fd5b50813567ffffffffffffffff8111156125cd575f80fd5b6020830191508360208285010111156125e4575f80fd5b9250929050565b5f805f805f8060a08789031215612600575f80fd5b863561260b81612535565b9550602087013561261b81612535565b945060408701359350606087013567ffffffffffffffff81111561263d575f80fd5b61264989828a016125a6565b979a9699509497949695608090950135949350505050565b5f805f60608486031215612673575f80fd5b833561267e81612535565b95602085013595506040909401359392505050565b5f805f805f805f60c0888a0312156126a9575f80fd5b87356126b481612535565b965060208801356126c481612535565b955060408801356126d481612535565b945060608801356126e481612535565b93506080880135925060a088013567ffffffffffffffff811115612706575f80fd5b6127128a828b016125a6565b989b979a50959850939692959293505050565b5f8060408385031215612736575f80fd5b50508035926020909101359150565b5f805f8060808587031215612758575f80fd5b843561276381612535565b9350602085013561277381612535565b93969395505050506040820135916060013590565b5f805f6060848603121561279a575f80fd5b83356127a581612535565b925060208401356127b581612535565b915060408401356127c581612535565b809150509250925092565b5f602082840312156127e0575f80fd5b5035919050565b5f805f80608085870312156127fa575f80fd5b843561280581612535565b9350602085013561281581612535565b9250604085013561282581612535565b9150606085013561283581612535565b939692955090935050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f6020828403121561287d575f80fd5b815161259f81612535565b73ffffffffffffffffffffffffffffffffffffffff8516815283602082015260606040820152816060820152818360808301375f818301608090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01601019392505050565b5f5b838110156129125781810151838201526020016128fa565b50505f910152565b5f806040838503121561292b575f80fd5b825161293681612535565b602084015190925067ffffffffffffffff80821115612953575f80fd5b818501915085601f830112612966575f80fd5b81518181111561297857612978612840565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156129be576129be612840565b816040528281528860208487010111156129d6575f80fd5b6129e78360208301602088016128f8565b80955050505050509250929050565b5f8151808452612a0d8160208601602086016128f8565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b5f73ffffffffffffffffffffffffffffffffffffffff80891683528088166020840152808716604084015280861660608401525083608083015260c060a0830152612a8d60c08301846129f6565b98975050505050505050565b5f60208284031215612aa9575f80fd5b5051919050565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152608060408201525f612ae460808301856129f6565b905082606083015295945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b81810381811115610d56577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea164736f6c6343000818000a" func init() { if err := json.Unmarshal([]byte(L2LidoGatewayStorageLayoutJSON), L2LidoGatewayStorageLayout); err != nil { diff --git a/bindings/bindings/l2staking.go b/bindings/bindings/l2staking.go index 6889a94a..504c15bd 100644 --- a/bindings/bindings/l2staking.go +++ b/bindings/bindings/l2staking.go @@ -45,8 +45,8 @@ type TypesStakerInfo struct { // L2StakingMetaData contains all meta data concerning the L2Staking contract. var L2StakingMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"_otherStaking\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"epochEffective\",\"type\":\"uint256\"}],\"name\":\"CommissionUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"stakeAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"effectiveEpoch\",\"type\":\"uint256\"}],\"name\":\"Delegated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldTime\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newTime\",\"type\":\"uint256\"}],\"name\":\"RewardStartTimeUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newSize\",\"type\":\"uint256\"}],\"name\":\"SequencerSetMaxSizeUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"tmKey\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"blsKey\",\"type\":\"bytes\"}],\"name\":\"StakerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"stakerAddresses\",\"type\":\"address[]\"}],\"name\":\"StakerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"effectiveEpoch\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unlockEpoch\",\"type\":\"uint256\"}],\"name\":\"Undelegated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unlockEpoch\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"UndelegationClaimed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DISTRIBUTE_CONTRACT\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MESSENGER\",\"outputs\":[{\"internalType\":\"contractICrossDomainMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MORPH_TOKEN_CONTRACT\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"OTHER_STAKING\",\"outputs\":[{\"internalType\":\"contractStaking\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SEQUENCER_CONTRACT\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"tmKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"blsKey\",\"type\":\"bytes\"}],\"internalType\":\"structTypes.StakerInfo\",\"name\":\"add\",\"type\":\"tuple\"}],\"name\":\"addStaker\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"candidateNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claimCommission\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"targetEpochIndex\",\"type\":\"uint256\"}],\"name\":\"claimReward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claimUndelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"commissions\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentEpoch\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"delegateStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"}],\"name\":\"delegations\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"pageSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"pageIndex\",\"type\":\"uint256\"}],\"name\":\"getAllDelegatorsInPagination\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"delegatorsTotalNumber\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"delegatorsInPage\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"getDelegatorsLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStakerAddressesLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStakers\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"tmKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"blsKey\",\"type\":\"bytes\"}],\"internalType\":\"structTypes.StakerInfo[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_stakerAddresses\",\"type\":\"address[]\"}],\"name\":\"getStakesInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"tmKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"blsKey\",\"type\":\"bytes\"}],\"internalType\":\"structTypes.StakerInfo[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"}],\"name\":\"getUndelegations\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unlockEpoch\",\"type\":\"uint256\"}],\"internalType\":\"structIL2Staking.Undelegation[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_sequencersMaxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_undelegateLockEpochs\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_rewardStartTime\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"tmKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"blsKey\",\"type\":\"bytes\"}],\"internalType\":\"structTypes.StakerInfo[]\",\"name\":\"_stakers\",\"type\":\"tuple[]\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"isStakingTo\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestSequencerSetSize\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messenger\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"remove\",\"type\":\"address[]\"}],\"name\":\"removeStakers\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardStartTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardStarted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sequencerSetMaxSize\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"commission\",\"type\":\"uint256\"}],\"name\":\"setCommissionRate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"stakerAddresses\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"stakerDelegations\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"totalDelegationAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"stakerRankings\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"ranking\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"stakers\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"tmKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"blsKey\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startReward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"undelegateLockEpochs\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"}],\"name\":\"undelegateStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"undelegations\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unlockEpoch\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_rewardStartTime\",\"type\":\"uint256\"}],\"name\":\"updateRewardStartTime\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_sequencerSetMaxSize\",\"type\":\"uint256\"}],\"name\":\"updateSequencerSetMaxSize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x61012060405234801562000011575f80fd5b5060405162004bf338038062004bf38339810160408190526200003491620000a7565b7353000000000000000000000000000000000000076080526001600160a01b031660a05273530000000000000000000000000000000000001360c05273530000000000000000000000000000000000001760e05273530000000000000000000000000000000000001461010052620000d6565b5f60208284031215620000b8575f80fd5b81516001600160a01b0381168114620000cf575f80fd5b9392505050565b60805160a05160c05160e05161010051614a53620001a05f395f818161042501528181610d7401528181610e1c0152818161172801528181611e4d0152818161350a01526138cf01525f818161053a01526136c501525f81816106400152818161399001528181613a4501528181613aec01528181613cf501528181613da20152613e4901525f81816104df0152818161070901526127d201525f81816103e8015281816105a2015281816106df01528181610733015281816127a801526127fc0152614a535ff3fe608060405234801561000f575f80fd5b50600436106102cc575f3560e01c8063715018a61161017c578063927ede2d116100dd578063d557714111610093578063f0261bc21161006e578063f0261bc21461068a578063f2fde38b14610693578063fad99f98146106a6575f80fd5b8063d55771411461063b578063e10911b114610662578063ed70b3431461066a575f80fd5b8063b5d2e0dc116100c3578063b5d2e0dc146105d1578063c64814dd146105f0578063d31d83d91461061a575f80fd5b8063927ede2d1461059d57806396ab994d146105c4575f80fd5b806384d7d1d4116101325780638e21d5fb116101185780638e21d5fb146105355780639168ae721461055c57806391bd43a41461057e575f80fd5b806384d7d1d4146105015780638da5cb5b14610524575f80fd5b8063766718081161016257806376671808146104b35780637b05afb5146104bb578063831cfb58146104da575f80fd5b8063715018a6146104a3578063746c8ae1146104ab575f80fd5b80633385ccc21161023157806340b5c837116101e7578063459598a2116101c2578063459598a21461047557806346cdc18a146104885780636d454d5114610490575f80fd5b806340b5c8371461044757806343352d611461045a578063439162b514610462575f80fd5b80633c323a1b116102175780633c323a1b146103d35780633cb747bf146103e65780633d9353fe14610420575f80fd5b80633385ccc2146103b75780633b802421146103ca575f80fd5b8063174e31c4116102865780632cc138be1161026c5780632cc138be146103855780632e787be31461038e57806330158eea14610397575f80fd5b8063174e31c41461035f57806319fac8fd14610372575f80fd5b80630eb573af116102b65780630eb573af1461030b5780630f3b70591461031e57806312a3e94714610356575f80fd5b806243b758146102d05780630be67fcc146102f6575b5f80fd5b6102e36102de366004614148565b6106ae565b6040519081526020015b60405180910390f35b6103096103043660046141ab565b6106d4565b005b6103096103193660046141ea565b610bf9565b61033161032c366004614201565b610d0c565b604080516001600160a01b0390941684526020840192909252908201526060016102ed565b6102e3609a5481565b61030961036d366004614201565b610d54565b6103096103803660046141ea565b610ecc565b6102e360985481565b6102e360995481565b6103aa6103a53660046141ab565b610fee565b6040516102ed919061428c565b6103096103c5366004614148565b611215565b6102e3609c5481565b6103096103e1366004614201565b611870565b7f00000000000000000000000000000000000000000000000000000000000000005b6040516001600160a01b0390911681526020016102ed565b6104087f000000000000000000000000000000000000000000000000000000000000000081565b6103096104553660046141ea565b611f0a565b6103aa61201d565b610309610470366004614332565b612239565b6104086104833660046141ea565b612775565b609d546102e3565b61030961049e3660046143a0565b61279d565b610309612a6e565b610309612a81565b6102e3612d71565b6102e36104c9366004614148565b60a06020525f908152604090205481565b6104087f000000000000000000000000000000000000000000000000000000000000000081565b61051461050f366004614148565b612de5565b60405190151581526020016102ed565b6033546001600160a01b0316610408565b6104087f000000000000000000000000000000000000000000000000000000000000000081565b61056f61056a366004614148565b612e0f565b6040516102ed939291906143d7565b6102e361058c366004614148565b60a16020525f908152604090205481565b6104087f000000000000000000000000000000000000000000000000000000000000000081565b6097546105149060ff1681565b6102e36105df366004614148565b609e6020525f908152604090205481565b6102e36105fe366004614407565b60a360209081525f928352604080842090915290825290205481565b61062d61062836600461443e565b612ec1565b6040516102ed9291906144b3565b6104087f000000000000000000000000000000000000000000000000000000000000000081565b61030961303b565b61067d610678366004614148565b6133d5565b6040516102ed91906144d3565b6102e3609b5481565b6103096106a1366004614148565b61346b565b6103096134f8565b6001600160a01b0381165f90815260a2602052604081206106ce906135a6565b92915050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156107bc57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa15801561078d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b19190614534565b6001600160a01b0316145b6108335760405162461bcd60e51b815260206004820152602c60248201527f7374616b696e673a206f6e6c79206f74686572207374616b696e6720636f6e7460448201527f7261637420616c6c6f776564000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5f805b82811015610bac57609b54609e5f8686858181106108565761085661454f565b905060200201602081019061086b9190614148565b6001600160a01b03166001600160a01b031681526020019081526020015f20541161089557600191505b5f609e5f8686858181106108ab576108ab61454f565b90506020020160208101906108c09190614148565b6001600160a01b03166001600160a01b031681526020019081526020015f20541115610b23575f6001609e5f8787868181106108fe576108fe61454f565b90506020020160208101906109139190614148565b6001600160a01b03166001600160a01b031681526020019081526020015f205461093d91906145a9565b90505b609d5461094f906001906145a9565b811015610a2157609d6109638260016145bc565b815481106109735761097361454f565b5f91825260209091200154609d80546001600160a01b03909216918390811061099e5761099e61454f565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506001609e5f609d84815481106109e1576109e161454f565b5f9182526020808320909101546001600160a01b0316835282019290925260400181208054909190610a149084906145a9565b9091555050600101610940565b50609d805480610a3357610a336145cf565b5f8281526020812082015f1990810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055909101909155609e90858584818110610a8357610a8361454f565b9050602002016020810190610a989190614148565b6001600160a01b03166001600160a01b031681526020019081526020015f205f90555f60a15f868685818110610ad057610ad061454f565b9050602002016020810190610ae59190614148565b6001600160a01b03166001600160a01b031681526020019081526020015f20541115610b23576001609c5f828254610b1d91906145a9565b90915550505b609f5f858584818110610b3857610b3861454f565b9050602002016020810190610b4d9190614148565b6001600160a01b0316815260208101919091526040015f90812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001681556001810182905590610ba260028301826140ea565b5050600101610836565b507f3511bf213f9290ba907e91e12a43e8471251e1879580ae5509292a3514c23f618383604051610bde9291906145fc565b60405180910390a18015610bf457610bf46135af565b505050565b610c0161372f565b5f81118015610c1257506099548114155b610c845760405162461bcd60e51b815260206004820152602260248201527f696e76616c6964206e65772073657175656e63657220736574206d617820736960448201527f7a65000000000000000000000000000000000000000000000000000000000000606482015260840161082a565b609980549082905560408051828152602081018490527f98b982a120d9be7d9c68d85a1aed8158d1d52e517175bfb3eb4280692f19b1ed910160405180910390a16097545f9060ff16610cd957609d54610cdd565b609c545b90505f6099548210610cf157609954610cf3565b815b9050609b548114610d0657610d066135af565b50505050565b60a4602052815f5260405f208181548110610d25575f80fd5b5f9182526020909120600390910201805460018201546002909201546001600160a01b03909116935090915083565b610d5c613789565b6001600160a01b038216610e12576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016635cf20c7b336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602481018490526044015f604051808303815f87803b158015610df7575f80fd5b505af1158015610e09573d5f803e3d5ffd5b50505050610ebe565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663996cba6883336040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03928316600482015291166024820152604481018490526064015f604051808303815f87803b158015610ea7575f80fd5b505af1158015610eb9573d5f803e3d5ffd5b505050505b610ec86001606555565b5050565b335f908152609e6020526040902054610f275760405162461bcd60e51b815260206004820152601360248201527f6f6e6c79207374616b657220616c6c6f77656400000000000000000000000000604482015260640161082a565b6014811115610f785760405162461bcd60e51b815260206004820152601260248201527f696e76616c696420636f6d6d697373696f6e0000000000000000000000000000604482015260640161082a565b335f90815260a06020526040812082905560975460ff16610f99575f610fac565b610fa1612d71565b610fac9060016145bc565b604080518481526020810183905291925033917f6e500db30ce535d38852e318f333e9be41a3fec6c65d234ebb06203c896db9a5910160405180910390a25050565b60605f8267ffffffffffffffff81111561100a5761100a614649565b60405190808252806020026020018201604052801561105657816020015b60408051606080820183525f8083526020830152918101919091528152602001906001900390816110285790505b5090505f5b8381101561120d576040518060600160405280609f5f8888868181106110835761108361454f565b90506020020160208101906110989190614148565b6001600160a01b03908116825260208083019390935260409091015f908120549091168352910190609f908888868181106110d5576110d561454f565b90506020020160208101906110ea9190614148565b6001600160a01b03166001600160a01b031681526020019081526020015f20600101548152602001609f5f8888868181106111275761112761454f565b905060200201602081019061113c9190614148565b6001600160a01b03166001600160a01b031681526020019081526020015f20600201805461116990614676565b80601f016020809104026020016040519081016040528092919081815260200182805461119590614676565b80156111e05780601f106111b7576101008083540402835291602001916111e0565b820191905f5260205f20905b8154815290600101906020018083116111c357829003601f168201915b50505050508152508282815181106111fa576111fa61454f565b602090810291909101015260010161105b565b509392505050565b61121d613789565b6001600160a01b0381165f90815260a36020908152604080832033845290915290205461128c5760405162461bcd60e51b815260206004820152601660248201527f7374616b696e6720616d6f756e74206973207a65726f00000000000000000000604482015260640161082a565b6001600160a01b0381165f908152609e60205260408120546097549015919060ff166112b8575f6112cb565b6112c0612d71565b6112cb9060016145bc565b6097549091505f9060ff1680156112e0575082155b6112ea57816112f7565b609a546112f790836145bc565b604080516060810182526001600160a01b038781168083525f81815260a36020908152858220338084528183528784208054848901908152888a018b815283875260a486528a87208054600180820183559189528789208c5160039092020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001691909b16178a558251908a015551600290980197909755908452908252829055925191815260a1909252928120805494955091936113b99084906145a9565b90915550506001600160a01b0385165f90815260a2602052604090206113df90336137e9565b506001600160a01b0385165f908152609e602052604090205484158015611408575060975460ff165b80156114155750609c5481105b1561168c576001600160a01b0386165f908152609e602052604081205461143e906001906145a9565b90505b6001609c5461145091906145a9565b81101561168a5760a15f609d838154811061146d5761146d61454f565b5f9182526020808320909101546001600160a01b031683528201929092526040018120549060a190609d6114a28560016145bc565b815481106114b2576114b261454f565b5f9182526020808320909101546001600160a01b031683528201929092526040019020541115611682575f609d82815481106114f0576114f061454f565b5f918252602090912001546001600160a01b03169050609d6115138360016145bc565b815481106115235761152361454f565b5f91825260209091200154609d80546001600160a01b03909216918490811061154e5761154e61454f565b5f91825260209091200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905580609d61159c8460016145bc565b815481106115ac576115ac61454f565b5f91825260209091200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790556115f78260016145bc565b609e5f609d858154811061160d5761160d61454f565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205561163c8260026145bc565b609e5f609d61164c8660016145bc565b8154811061165c5761165c61454f565b5f9182526020808320909101546001600160a01b03168352820192909252604001902055505b600101611441565b505b841580156116af57506001600160a01b0386165f90815260a16020526040902054155b156116cc576001609c5f8282546116c691906145a9565b90915550505b6001600160a01b038681165f81815260a160205260408082205481517f7f683ee30000000000000000000000000000000000000000000000000000000081526004810194909452336024850152604484018990526064840152517f000000000000000000000000000000000000000000000000000000000000000090931692637f683ee392608480820193929182900301818387803b15801561176d575f80fd5b505af115801561177f573d5f803e3d5ffd5b5050505061178a3390565b6001600160a01b0316866001600160a01b03167f92039db29d8c0a1aa1433fe109c69488c8c5e51b23c9de7d303ad80c1fef778c846020015187876040516117e5939291909283526020830191909152604082015260600190565b60405180910390a3841580156117fd575060975460ff165b801561180b5750609b548111155b80156118515750609b546001600160a01b0387165f908152609e602052604090205411806118515750609c546001600160a01b0387165f908152609e6020526040902054115b1561185e5761185e6135af565b505050505061186d6001606555565b50565b6001600160a01b0382165f908152609e602052604090205482906118d65760405162461bcd60e51b815260206004820152600a60248201527f6e6f74207374616b657200000000000000000000000000000000000000000000604482015260640161082a565b6118de613789565b5f821161192d5760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964207374616b6520616d6f756e74000000000000000000000000604482015260640161082a565b6119373384613804565b156119845760405162461bcd60e51b815260206004820152601660248201527f756e64656c65676174696f6e20756e636c61696d656400000000000000000000604482015260640161082a565b6001600160a01b0383165f90815260a360209081526040808320338452909152902054611a02576119b5338461388d565b15611a025760405162461bcd60e51b815260206004820152601060248201527f72657761726420756e636c61696d656400000000000000000000000000000000604482015260640161082a565b6001600160a01b0383165f90815260a1602052604081208054849290611a299084906145bc565b90915550506001600160a01b0383165f90815260a36020908152604080832033845290915281208054849290611a609084906145bc565b90915550506001600160a01b0383165f90815260a260205260409020611a869033613942565b506001600160a01b0383165f90815260a16020526040902054829003611abe576001609c5f828254611ab891906145bc565b90915550505b6001600160a01b0383165f908152609e602052604090205460975460ff168015611ae85750600181115b15611d39575f611af96001836145a9565b90505b8015611d375760a15f609d611b126001856145a9565b81548110611b2257611b2261454f565b905f5260205f20015f9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020015f205460a15f609d8481548110611b7357611b7361454f565b5f9182526020808320909101546001600160a01b031683528201929092526040019020541115611d25575f609d611bab6001846145a9565b81548110611bbb57611bbb61454f565b5f91825260209091200154609d80546001600160a01b0390921692509083908110611be857611be861454f565b5f918252602090912001546001600160a01b0316609d611c096001856145a9565b81548110611c1957611c1961454f565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555080609d8381548110611c5857611c5861454f565b5f918252602082200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0393909316929092179091558290609e90609d611caa6001856145a9565b81548110611cba57611cba61454f565b5f9182526020808320909101546001600160a01b03168352820192909252604001902055611ce98260016145bc565b609e5f609d8581548110611cff57611cff61454f565b5f9182526020808320909101546001600160a01b03168352820192909252604001902055505b80611d2f816146c1565b915050611afc565b505b6097545f9060ff16611d4b575f611d5e565b611d53612d71565b611d5e9060016145bc565b6001600160a01b0386165f81815260a36020908152604080832033808552908352928190205481519081529182018990528181018590525193945090927fc4ad67bad2c1f682946a406d840f1b273f5cd5a53fcc1a03d078d92bfa2e07d09181900360600190a36001600160a01b038581165f81815260a360209081526040808320338085528184528285205486865260a18552838620548287529290945282517fb809af0f000000000000000000000000000000000000000000000000000000008152600481019690965260248601526044850187905260648501839052608485015290881460a4840152517f00000000000000000000000000000000000000000000000000000000000000009093169263b809af0f9260c480820193929182900301818387803b158015611e92575f80fd5b505af1158015611ea4573d5f803e3d5ffd5b50505050611eb9611eb23390565b3086613956565b60975460ff168015611ecc5750609b5482115b8015611ef157506099546001600160a01b0386165f908152609e602052604090205411155b15611efe57611efe6135af565b5050610bf46001606555565b611f1261372f565b60975460ff1615611f655760405162461bcd60e51b815260206004820152601660248201527f72657761726420616c7265616479207374617274656400000000000000000000604482015260640161082a565b4281118015611f7e5750611f7c6201518082614703565b155b8015611f8c57506098548114155b611fd85760405162461bcd60e51b815260206004820152601960248201527f696e76616c6964207265776172642073746172742074696d6500000000000000604482015260640161082a565b609880549082905560408051828152602081018490527f91c38708087fb4ba51bd0e6a106cc1fbaf340479a2e81d18f2341e8c78f97555910160405180910390a15050565b609d546060905f9067ffffffffffffffff81111561203d5761203d614649565b60405190808252806020026020018201604052801561208957816020015b60408051606080820183525f80835260208301529181019190915281526020019060019003908161205b5790505b5090505f5b609d54811015612233576040518060600160405280609f5f609d85815481106120b9576120b961454f565b5f9182526020808320909101546001600160a01b0390811684528382019490945260409092018120549092168352609d80549390910192609f929190869081106121055761210561454f565b905f5260205f20015f9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020015f20600101548152602001609f5f609d858154811061215e5761215e61454f565b5f9182526020808320909101546001600160a01b031683528201929092526040019020600201805461218f90614676565b80601f01602080910402602001604051908101604052809291908181526020018280546121bb90614676565b80156122065780601f106121dd57610100808354040283529160200191612206565b820191905f5260205f20905b8154815290600101906020018083116121e957829003601f168201915b50505050508152508282815181106122205761222061454f565b602090810291909101015260010161208e565b50919050565b5f54610100900460ff161580801561225757505f54600160ff909116105b806122705750303b15801561227057505f5460ff166001145b6122e25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161082a565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561233e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b0387166123945760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964206f776e657220616464726573730000000000000000000000604482015260640161082a565b5f86116124095760405162461bcd60e51b815260206004820152602260248201527f73657175656e6365727353697a65206d7573742067726561746572207468616e60448201527f2030000000000000000000000000000000000000000000000000000000000000606482015260840161082a565b5f85116124585760405162461bcd60e51b815260206004820152601c60248201527f696e76616c696420756e64656c65676174654c6f636b45706f63687300000000604482015260640161082a565b4284118015612471575061246f6201518085614703565b155b6124bd5760405162461bcd60e51b815260206004820152601960248201527f696e76616c6964207265776172642073746172742074696d6500000000000000604482015260640161082a565b8161250a5760405162461bcd60e51b815260206004820152601760248201527f696e76616c696420696e697469616c207374616b657273000000000000000000604482015260640161082a565b61251387613bc3565b61251b613c2c565b6099869055609a8590556098849055609b8290555f5b609b548110156126975783838281811061254d5761254d61454f565b905060200281019061255f9190614716565b609f5f8686858181106125745761257461454f565b90506020028101906125869190614716565b612594906020810190614148565b6001600160a01b0316815260208101919091526040015f206125b682826147f7565b905050609d8484838181106125cd576125cd61454f565b90506020028101906125df9190614716565b6125ed906020810190614148565b8154600180820184555f93845260209093200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790556126419082906145bc565b609e5f8686858181106126565761265661454f565b90506020028101906126689190614716565b612676906020810190614148565b6001600160a01b0316815260208101919091526040015f2055600101612531565b50604080515f8152602081018890527f98b982a120d9be7d9c68d85a1aed8158d1d52e517175bfb3eb4280692f19b1ed910160405180910390a1604080515f8152602081018690527f91c38708087fb4ba51bd0e6a106cc1fbaf340479a2e81d18f2341e8c78f97555910160405180910390a1801561276c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b609d8181548110612784575f80fd5b5f918252602090912001546001600160a01b0316905081565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561288557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015612856573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061287a9190614534565b6001600160a01b0316145b6128f75760405162461bcd60e51b815260206004820152602c60248201527f7374616b696e673a206f6e6c79206f74686572207374616b696e6720636f6e7460448201527f7261637420616c6c6f7765640000000000000000000000000000000000000000606482015260840161082a565b609e5f6129076020840184614148565b6001600160a01b03166001600160a01b031681526020019081526020015f20545f036129b457609d61293c6020830183614148565b81546001810183555f928352602080842090910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039390931692909217909155609d5491609e9161299a90850185614148565b6001600160a01b0316815260208101919091526040015f20555b80609f5f6129c56020840184614148565b6001600160a01b0316815260208101919091526040015f206129e782826147f7565b506129f790506020820182614148565b6001600160a01b03167f058ecb29c230cd5df283c89e996187ed521393fe4546cd1b097921c4b2de293d6020830135612a336040850185614752565b604051612a4293929190614969565b60405180910390a260975460ff16158015612a615750609954609d5411155b1561186d5761186d6135af565b612a7661372f565b612a7f5f613bc3565b565b612a8961372f565b609854421015612b005760405162461bcd60e51b8152602060048201526024808201527f63616e2774207374617274206265666f7265207265776172642073746172742060448201527f74696d6500000000000000000000000000000000000000000000000000000000606482015260840161082a565b5f609c5411612b515760405162461bcd60e51b815260206004820152600e60248201527f6e6f6e652063616e646964617465000000000000000000000000000000000000604482015260640161082a565b609780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091555b609d54811015612d0e575f5b81811015612d055760a15f609d8381548110612baa57612baa61454f565b905f5260205f20015f9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020015f205460a15f609d8581548110612bfb57612bfb61454f565b5f9182526020808320909101546001600160a01b031683528201929092526040019020541115612cfd575f609d8281548110612c3957612c3961454f565b5f91825260209091200154609d80546001600160a01b0390921692509084908110612c6657612c6661454f565b5f91825260209091200154609d80546001600160a01b039092169184908110612c9157612c9161454f565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555080609d8481548110612cd057612cd061454f565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550505b600101612b8c565b50600101612b80565b505f5b609d54811015612d6857612d268160016145bc565b609e5f609d8481548110612d3c57612d3c61454f565b5f9182526020808320909101546001600160a01b03168352820192909252604001902055600101612d11565b50612a7f6135af565b5f609854421015612dc45760405162461bcd60e51b815260206004820152601960248201527f726577617264206973206e6f7420737461727465642079657400000000000000604482015260640161082a565b6201518060985442612dd691906145a9565b612de091906149bc565b905090565b6001600160a01b0381165f90815260a36020908152604080832033845290915281205415156106ce565b609f6020525f90815260409020805460018201546002830180546001600160a01b03909316939192612e4090614676565b80601f0160208091040260200160405190810160405280929190818152602001828054612e6c90614676565b8015612eb75780601f10612e8e57610100808354040283529160200191612eb7565b820191905f5260205f20905b815481529060010190602001808311612e9a57829003601f168201915b5050505050905083565b5f60605f8411612f135760405162461bcd60e51b815260206004820152601160248201527f696e76616c696420706167652073697a65000000000000000000000000000000604482015260640161082a565b6001600160a01b0385165f90815260a260205260409020612f33906135a6565b91508367ffffffffffffffff811115612f4e57612f4e614649565b604051908082528060200260200182016040528015612f77578160200160208202803683370190505b5090505f612f8584866149cf565b90505f6001612f9486826145bc565b612f9e90886149cf565b612fa891906145a9565b9050612fb56001856145a9565b811115612fca57612fc76001856145a9565b90505b815b818111613030576001600160a01b0388165f90815260a260205260409020612ff49082613cb0565b8482815181106130065761300661454f565b6001600160a01b039092166020928302919091019091015280613028816149e6565b915050612fcc565b505050935093915050565b613043613789565b335f90815260a46020526040812054815b8181101561336f5760975460ff1615806130a45750613071612d71565b335f90815260a4602052604090208054839081106130915761309161454f565b905f5260205f2090600302016002015411155b1561335d57335f90815260a4602052604090208054829081106130c9576130c961454f565b905f5260205f20906003020160010154836130e491906145bc565b335f90815260a46020526040812080549295509091839081106131095761310961454f565b5f91825260208220600390910201546001600160a01b0316915060a48161312d3390565b6001600160a01b03166001600160a01b031681526020019081526020015f20838154811061315d5761315d61454f565b905f5260205f2090600302016002015490505f60a45f61317a3390565b6001600160a01b03166001600160a01b031681526020019081526020015f2084815481106131aa576131aa61454f565b905f5260205f2090600302016001015490506001856131c991906145a9565b84101561329957335f90815260a4602052604090206131e96001876145a9565b815481106131f9576131f961454f565b905f5260205f20906003020160a45f61320f3390565b6001600160a01b03166001600160a01b031681526020019081526020015f20858154811061323f5761323f61454f565b5f9182526020909120825460039092020180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909216919091178155600180830154908201556002918201549101555b335f90815260a4602052604090208054806132b6576132b66145cf565b5f8281526020812060035f199093019283020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001681556001818101839055600290910191909155915561330c90866145a9565b604080518481526020810184905291965033916001600160a01b038616917f921046659ea3b3b3f8e8fefd2bece3121b2d929ead94c696a75beedee477fdb6910160405180910390a3505050613054565b6133688160016145bc565b9050613054565b505f82116133bf5760405162461bcd60e51b815260206004820152601760248201527f6e6f204d6f72706820746f6b656e20746f20636c61696d000000000000000000604482015260640161082a565b6133c93383613cbb565b5050612a7f6001606555565b6001600160a01b0381165f90815260a460209081526040808320805482518185028101850190935280835260609492939192909184015b82821015613460575f848152602090819020604080516060810182526003860290920180546001600160a01b031683526001808201548486015260029091015491830191909152908352909201910161340c565b505050509050919050565b61347361372f565b6001600160a01b0381166134ef5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161082a565b61186d81613bc3565b613500613789565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663ac2ac640336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b0390911660048201526024015f604051808303815f87803b158015613586575f80fd5b505af1158015613598573d5f803e3d5ffd5b50505050612a7f6001606555565b5f6106ce825490565b60995460975460ff16156135d357609954609c5410156135ce5750609c545b6135e4565b609954609d5410156135e45750609d545b5f8167ffffffffffffffff8111156135fe576135fe614649565b604051908082528060200260200182016040528015613627578160200160208202803683370190505b5090505f5b8281101561369457609d81815481106136475761364761454f565b905f5260205f20015f9054906101000a90046001600160a01b03168282815181106136745761367461454f565b6001600160a01b039092166020928302919091019091015260010161362c565b506040517f9b8201a40000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639b8201a4906136fa9084906004016149fe565b5f604051808303815f87803b158015613711575f80fd5b505af1158015613723573d5f803e3d5ffd5b50509151609b55505050565b6033546001600160a01b03163314612a7f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161082a565b6002606554036137db5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161082a565b6002606555565b6001606555565b5f6137fd836001600160a01b038416613f19565b9392505050565b5f805b6001600160a01b0384165f90815260a46020526040902054811015613884576001600160a01b038481165f90815260a460205260409020805491851691839081106138545761385461454f565b5f9182526020909120600390910201546001600160a01b03160361387c5760019150506106ce565b600101613807565b505f9392505050565b6040517fde6ac9330000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015282811660248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063de6ac93390604401602060405180830381865afa158015613916573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061393a9190614a10565b159392505050565b5f6137fd836001600160a01b038416613ffc565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa1580156139d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139fb9190614a2f565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301528581166024830152604482018590529192507f0000000000000000000000000000000000000000000000000000000000000000909116906323b872dd906064016020604051808303815f875af1158015613a8d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ab19190614a10565b506040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015613b33573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b579190614a2f565b90505f83118015613b70575082613b6e83836145a9565b145b613bbc5760405162461bcd60e51b815260206004820152601b60248201527f6d6f72706820746f6b656e207472616e73666572206661696c65640000000000604482015260640161082a565b5050505050565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff16613ca85760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161082a565b612a7f614048565b5f6137fd83836140c4565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015613d3c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d609190614a2f565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152602482018590529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303815f875af1158015613dea573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e0e9190614a10565b506040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015613e90573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613eb49190614a2f565b90505f83118015613ecd575082613ecb83836145a9565b145b610d065760405162461bcd60e51b815260206004820152601b60248201527f6d6f72706820746f6b656e207472616e73666572206661696c65640000000000604482015260640161082a565b5f8181526001830160205260408120548015613ff3575f613f3b6001836145a9565b85549091505f90613f4e906001906145a9565b9050818114613fad575f865f018281548110613f6c57613f6c61454f565b905f5260205f200154905080875f018481548110613f8c57613f8c61454f565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080613fbe57613fbe6145cf565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506106ce565b5f9150506106ce565b5f81815260018301602052604081205461404157508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556106ce565b505f6106ce565b5f54610100900460ff166137e25760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161082a565b5f825f0182815481106140d9576140d961454f565b905f5260205f200154905092915050565b5080546140f690614676565b5f825580601f10614105575050565b601f0160209004905f5260205f209081019061186d91905b80821115614130575f815560010161411d565b5090565b6001600160a01b038116811461186d575f80fd5b5f60208284031215614158575f80fd5b81356137fd81614134565b5f8083601f840112614173575f80fd5b50813567ffffffffffffffff81111561418a575f80fd5b6020830191508360208260051b85010111156141a4575f80fd5b9250929050565b5f80602083850312156141bc575f80fd5b823567ffffffffffffffff8111156141d2575f80fd5b6141de85828601614163565b90969095509350505050565b5f602082840312156141fa575f80fd5b5035919050565b5f8060408385031215614212575f80fd5b823561421d81614134565b946020939093013593505050565b5f81518084525f5b8181101561424f57602081850181015186830182015201614233565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b83811015614324578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0018552815180516001600160a01b03168452878101518885015286015160608785018190526143108186018361422b565b9689019694505050908601906001016142b3565b509098975050505050505050565b5f805f805f8060a08789031215614347575f80fd5b863561435281614134565b9550602087013594506040870135935060608701359250608087013567ffffffffffffffff811115614382575f80fd5b61438e89828a01614163565b979a9699509497509295939492505050565b5f602082840312156143b0575f80fd5b813567ffffffffffffffff8111156143c6575f80fd5b8201606081850312156137fd575f80fd5b6001600160a01b0384168152826020820152606060408201525f6143fe606083018461422b565b95945050505050565b5f8060408385031215614418575f80fd5b823561442381614134565b9150602083013561443381614134565b809150509250929050565b5f805f60608486031215614450575f80fd5b833561445b81614134565b95602085013595506040909401359392505050565b5f815180845260208085019450602084015f5b838110156144a85781516001600160a01b031687529582019590820190600101614483565b509495945050505050565b828152604060208201525f6144cb6040830184614470565b949350505050565b602080825282518282018190525f919060409081850190868401855b8281101561452757815180516001600160a01b03168552868101518786015285015185850152606090930192908501906001016144ef565b5091979650505050505050565b5f60208284031215614544575f80fd5b81516137fd81614134565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b818103818111156106ce576106ce61457c565b808201808211156106ce576106ce61457c565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b60208082528181018390525f908460408401835b8681101561463e57823561462381614134565b6001600160a01b031682529183019190830190600101614610565b509695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b600181811c9082168061468a57607f821691505b602082108103612233577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f816146cf576146cf61457c565b505f190190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82614711576147116146d6565b500690565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112614748575f80fd5b9190910192915050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614785575f80fd5b83018035915067ffffffffffffffff82111561479f575f80fd5b6020019150368190038213156141a4575f80fd5b601f821115610bf457805f5260205f20601f840160051c810160208510156147d85750805b601f840160051c820191505b81811015613bbc575f81556001016147e4565b813561480281614134565b6001600160a01b0381167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550600160208084013560018401556002830160408501357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1863603018112614879575f80fd5b8501803567ffffffffffffffff811115614891575f80fd5b80360384830113156148a1575f80fd5b6148b5816148af8554614676565b856147b3565b5f601f8211600181146148e8575f83156148d157508382018601355b5f19600385901b1c1916600184901b17855561495e565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08516915b8281101561493457868501890135825593880193908901908801614915565b5084821015614952575f1960f88660031b161c198885880101351681555b505060018360011b0185555b505050505050505050565b83815260406020820152816040820152818360608301375f818301606090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010192915050565b5f826149ca576149ca6146d6565b500490565b80820281158282048414176106ce576106ce61457c565b5f5f1982036149f7576149f761457c565b5060010190565b602081525f6137fd6020830184614470565b5f60208284031215614a20575f80fd5b815180151581146137fd575f80fd5b5f60208284031215614a3f575f80fd5b505191905056fea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"addresspayable\",\"name\":\"_otherStaking\",\"type\":\"address\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"percentage\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"epochEffective\",\"type\":\"uint256\"}],\"name\":\"CommissionUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"stakeAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"effectiveEpoch\",\"type\":\"uint256\"}],\"name\":\"Delegated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldTime\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newTime\",\"type\":\"uint256\"}],\"name\":\"RewardStartTimeUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldSize\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newSize\",\"type\":\"uint256\"}],\"name\":\"SequencerSetMaxSizeUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"tmKey\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes\",\"name\":\"blsKey\",\"type\":\"bytes\"}],\"name\":\"StakerAdded\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address[]\",\"name\":\"stakerAddresses\",\"type\":\"address[]\"}],\"name\":\"StakerRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"effectiveEpoch\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unlockEpoch\",\"type\":\"uint256\"}],\"name\":\"Undelegated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"unlockEpoch\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"UndelegationClaimed\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DISTRIBUTE_CONTRACT\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MESSENGER\",\"outputs\":[{\"internalType\":\"contractICrossDomainMessenger\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MORPH_TOKEN_CONTRACT\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"OTHER_STAKING\",\"outputs\":[{\"internalType\":\"contractStaking\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"SEQUENCER_CONTRACT\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"tmKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"blsKey\",\"type\":\"bytes\"}],\"internalType\":\"structTypes.StakerInfo\",\"name\":\"add\",\"type\":\"tuple\"}],\"name\":\"addStaker\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"candidateNumber\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claimCommission\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"targetEpochIndex\",\"type\":\"uint256\"}],\"name\":\"claimReward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"claimUndelegation\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"commissions\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"currentEpoch\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"delegateStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"}],\"name\":\"delegations\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"tmKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"blsKey\",\"type\":\"bytes\"}],\"internalType\":\"structTypes.StakerInfo\",\"name\":\"add\",\"type\":\"tuple\"}],\"name\":\"emergencyAddStaker\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"remove\",\"type\":\"address[]\"}],\"name\":\"emergencyRemoveStakers\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"pageSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"pageIndex\",\"type\":\"uint256\"}],\"name\":\"getAllDelegatorsInPagination\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"delegatorsTotalNumber\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"delegatorsInPage\",\"type\":\"address[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"getDelegatorsLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStakerAddressesLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getStakers\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"tmKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"blsKey\",\"type\":\"bytes\"}],\"internalType\":\"structTypes.StakerInfo[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_stakerAddresses\",\"type\":\"address[]\"}],\"name\":\"getStakesInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"tmKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"blsKey\",\"type\":\"bytes\"}],\"internalType\":\"structTypes.StakerInfo[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"}],\"name\":\"getUndelegations\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unlockEpoch\",\"type\":\"uint256\"}],\"internalType\":\"structIL2Staking.Undelegation[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_sequencersMaxSize\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_undelegateLockEpochs\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_rewardStartTime\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"tmKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"blsKey\",\"type\":\"bytes\"}],\"internalType\":\"structTypes.StakerInfo[]\",\"name\":\"_stakers\",\"type\":\"tuple[]\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"isStakingTo\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"latestSequencerSetSize\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messenger\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"nonce\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_nonce\",\"type\":\"uint256\"},{\"internalType\":\"address[]\",\"name\":\"remove\",\"type\":\"address[]\"}],\"name\":\"removeStakers\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardStartTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rewardStarted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"sequencerSetMaxSize\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"commission\",\"type\":\"uint256\"}],\"name\":\"setCommissionRate\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"stakerAddresses\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"stakerDelegations\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"totalDelegationAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"stakerRankings\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"ranking\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"staker\",\"type\":\"address\"}],\"name\":\"stakers\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"addr\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"tmKey\",\"type\":\"bytes32\"},{\"internalType\":\"bytes\",\"name\":\"blsKey\",\"type\":\"bytes\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"startReward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"undelegateLockEpochs\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"}],\"name\":\"undelegateStake\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"delegator\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"undelegations\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"delegatee\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"unlockEpoch\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_rewardStartTime\",\"type\":\"uint256\"}],\"name\":\"updateRewardStartTime\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_sequencerSetMaxSize\",\"type\":\"uint256\"}],\"name\":\"updateSequencerSetMaxSize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x61012060405234801562000011575f80fd5b506040516200514b3803806200514b8339810160408190526200003491620000a7565b7353000000000000000000000000000000000000076080526001600160a01b031660a05273530000000000000000000000000000000000001360c05273530000000000000000000000000000000000001760e05273530000000000000000000000000000000000001461010052620000d6565b5f60208284031215620000b8575f80fd5b81516001600160a01b0381168114620000cf575f80fd5b9392505050565b60805160a05160c05160e05161010051614fab620001a05f395f818161044501528181610a7c01528181610b240152818161140f01528181611b29015281816135ce0152613d5e01525f818161055a0152613bae01525f818161067c01528181613e1f01528181613ed401528181613fc6015281816141bd0152818161426a015261435c01525f81816104ff015281816124a30152612a5001525f8181610408015281816105c201528181612479015281816124cd01528181612a260152612a7a0152614fab5ff3fe608060405234801561000f575f80fd5b50600436106102ec575f3560e01c8063746c8ae111610192578063affed0e0116100e8578063e10911b111610093578063f2fde38b1161006e578063f2fde38b146106cf578063fad99f98146106e2578063fc6facc6146106ea575f80fd5b8063e10911b11461069e578063ed70b343146106a6578063f0261bc2146106c6575f80fd5b8063cce6cf9f116100c3578063cce6cf9f14610643578063d31d83d914610656578063d557714114610677575f80fd5b8063affed0e0146105f1578063b5d2e0dc146105fa578063c64814dd14610619575f80fd5b80638da5cb5b1161014857806391bd43a41161012357806391bd43a41461059e578063927ede2d146105bd57806396ab994d146105e4575f80fd5b80638da5cb5b146105445780638e21d5fb146105555780639168ae721461057c575f80fd5b80637b05afb5116101785780637b05afb5146104db578063831cfb58146104fa57806384d7d1d414610521575f80fd5b8063746c8ae1146104cb57806376671808146104d3575f80fd5b80633b8024211161024757806343352d61116101fd57806346cdc18a116101d857806346cdc18a146104a85780637046529b146104b0578063715018a6146104c3575f80fd5b806343352d611461047a578063439162b514610482578063459598a214610495575f80fd5b80633cb747bf1161022d5780633cb747bf146104065780633d9353fe1461044057806340b5c83714610467575f80fd5b80633b802421146103ea5780633c323a1b146103f3575f80fd5b8063174e31c4116102a75780632e787be3116102825780632e787be3146103ae57806330158eea146103b75780633385ccc2146103d7575f80fd5b8063174e31c41461037f57806319fac8fd146103925780632cc138be146103a5575f80fd5b80630eb573af116102d75780630eb573af1461032b5780630f3b70591461033e57806312a3e94714610376575f80fd5b806243b758146102f05780629c6f0c14610316575b5f80fd5b6103036102fe36600461465b565b6106fd565b6040519081526020015b60405180910390f35b610329610324366004614676565b610723565b005b6103296103393660046146c0565b610901565b61035161034c3660046146d7565b610a14565b604080516001600160a01b03909416845260208401929092529082015260600161030d565b610303609a5481565b61032961038d3660046146d7565b610a5c565b6103296103a03660046146c0565b610bd4565b61030360985481565b61030360995481565b6103ca6103c5366004614749565b610cf6565b60405161030d91906147e9565b6103296103e536600461465b565b610f1d565b610303609c5481565b6103296104013660046146d7565b611557565b7f00000000000000000000000000000000000000000000000000000000000000005b6040516001600160a01b03909116815260200161030d565b6104287f000000000000000000000000000000000000000000000000000000000000000081565b6103296104753660046146c0565b611be6565b6103ca611cf9565b61032961049036600461488f565b611f15565b6104286104a33660046146c0565b612446565b609d54610303565b6103296104be366004614676565b61246e565b6103296125c8565b6103296125db565b6103036128cb565b6103036104e936600461465b565b60a06020525f908152604090205481565b6104287f000000000000000000000000000000000000000000000000000000000000000081565b61053461052f36600461465b565b61293f565b604051901515815260200161030d565b6033546001600160a01b0316610428565b6104287f000000000000000000000000000000000000000000000000000000000000000081565b61058f61058a36600461465b565b612969565b60405161030d939291906148fd565b6103036105ac36600461465b565b60a16020525f908152604090205481565b6104287f000000000000000000000000000000000000000000000000000000000000000081565b6097546105349060ff1681565b61030360a55481565b61030361060836600461465b565b609e6020525f908152604090205481565b61030361062736600461492d565b60a360209081525f928352604080842090915290825290205481565b610329610651366004614959565b612a1b565b6106696106643660046149a1565b612f87565b60405161030d929190614a16565b6104287f000000000000000000000000000000000000000000000000000000000000000081565b610329613115565b6106b96106b436600461465b565b613499565b60405161030d9190614a36565b610303609b5481565b6103296106dd36600461465b565b61352f565b6103296135bc565b6103296106f8366004614959565b61366a565b6001600160a01b0381165f90815260a26020526040812061071d90613a35565b92915050565b61072b613a3e565b8160a55481146107825760405162461bcd60e51b815260206004820152600d60248201527f696e76616c6964206e6f6e63650000000000000000000000000000000000000060448201526064015b60405180910390fd5b61078d836001614ac4565b60a555609e5f6107a0602085018561465b565b6001600160a01b03166001600160a01b031681526020019081526020015f20545f0361084257609d6107d5602084018461465b565b81546001810183555f9283526020808420909101805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039390931692909217909155609d5491609e916108289086018661465b565b6001600160a01b0316815260208101919091526040015f20555b81609f5f610853602084018461465b565b6001600160a01b0316815260208101919091526040015f206108758282614bf4565b506108859050602083018361465b565b6001600160a01b03167f058ecb29c230cd5df283c89e996187ed521393fe4546cd1b097921c4b2de293d60208401356108c16040860186614ad7565b6040516108d093929190614d5b565b60405180910390a260975460ff161580156108ef5750609954609d5411155b156108fc576108fc613a98565b505050565b610909613a3e565b5f8111801561091a57506099548114155b61098c5760405162461bcd60e51b815260206004820152602260248201527f696e76616c6964206e65772073657175656e63657220736574206d617820736960448201527f7a650000000000000000000000000000000000000000000000000000000000006064820152608401610779565b609980549082905560408051828152602081018490527f98b982a120d9be7d9c68d85a1aed8158d1d52e517175bfb3eb4280692f19b1ed910160405180910390a16097545f9060ff166109e157609d546109e5565b609c545b90505f60995482106109f9576099546109fb565b815b9050609b548114610a0e57610a0e613a98565b50505050565b60a4602052815f5260405f208181548110610a2d575f80fd5b5f9182526020909120600390910201805460018201546002909201546001600160a01b03909116935090915083565b610a64613c18565b6001600160a01b038216610b1a576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016635cf20c7b336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602481018490526044015f604051808303815f87803b158015610aff575f80fd5b505af1158015610b11573d5f803e3d5ffd5b50505050610bc6565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663996cba6883336040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03928316600482015291166024820152604481018490526064015f604051808303815f87803b158015610baf575f80fd5b505af1158015610bc1573d5f803e3d5ffd5b505050505b610bd06001606555565b5050565b335f908152609e6020526040902054610c2f5760405162461bcd60e51b815260206004820152601360248201527f6f6e6c79207374616b657220616c6c6f776564000000000000000000000000006044820152606401610779565b6014811115610c805760405162461bcd60e51b815260206004820152601260248201527f696e76616c696420636f6d6d697373696f6e00000000000000000000000000006044820152606401610779565b335f90815260a06020526040812082905560975460ff16610ca1575f610cb4565b610ca96128cb565b610cb4906001614ac4565b604080518481526020810183905291925033917f6e500db30ce535d38852e318f333e9be41a3fec6c65d234ebb06203c896db9a5910160405180910390a25050565b60605f8267ffffffffffffffff811115610d1257610d12614b38565b604051908082528060200260200182016040528015610d5e57816020015b60408051606080820183525f808352602083015291810191909152815260200190600190039081610d305790505b5090505f5b83811015610f15576040518060600160405280609f5f888886818110610d8b57610d8b614dae565b9050602002016020810190610da0919061465b565b6001600160a01b03908116825260208083019390935260409091015f908120549091168352910190609f90888886818110610ddd57610ddd614dae565b9050602002016020810190610df2919061465b565b6001600160a01b03166001600160a01b031681526020019081526020015f20600101548152602001609f5f888886818110610e2f57610e2f614dae565b9050602002016020810190610e44919061465b565b6001600160a01b03166001600160a01b031681526020019081526020015f206002018054610e7190614b65565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9d90614b65565b8015610ee85780601f10610ebf57610100808354040283529160200191610ee8565b820191905f5260205f20905b815481529060010190602001808311610ecb57829003601f168201915b5050505050815250828281518110610f0257610f02614dae565b6020908102919091010152600101610d63565b509392505050565b610f25613c18565b6001600160a01b0381165f90815260a360209081526040808320338452909152902054610f945760405162461bcd60e51b815260206004820152601660248201527f7374616b696e6720616d6f756e74206973207a65726f000000000000000000006044820152606401610779565b6001600160a01b0381165f908152609e60205260408120546097549015919060ff16610fc0575f610fd3565b610fc86128cb565b610fd3906001614ac4565b6097549091505f9060ff168015610fe8575082155b610ff25781610fff565b609a54610fff9083614ac4565b604080516060810182526001600160a01b038781168083525f81815260a36020908152858220338084528183528784208054848901908152888a018b815283875260a486528a87208054600180820183559189528789208c51600390920201805473ffffffffffffffffffffffffffffffffffffffff191691909b16178a558251908a015551600290980197909755908452908252829055925191815260a1909252928120805494955091936110b6908490614ddb565b90915550506001600160a01b0385165f90815260a2602052604090206110dc9033613c78565b506001600160a01b0385165f908152609e602052604090205484158015611105575060975460ff165b80156111125750609c5481105b15611373576001600160a01b0386165f908152609e602052604081205461113b90600190614ddb565b90505b6001609c5461114d9190614ddb565b8110156113715760a15f609d838154811061116a5761116a614dae565b5f9182526020808320909101546001600160a01b031683528201929092526040018120549060a190609d61119f856001614ac4565b815481106111af576111af614dae565b5f9182526020808320909101546001600160a01b031683528201929092526040019020541115611369575f609d82815481106111ed576111ed614dae565b5f918252602090912001546001600160a01b03169050609d611210836001614ac4565b8154811061122057611220614dae565b5f91825260209091200154609d80546001600160a01b03909216918490811061124b5761124b614dae565b5f918252602090912001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039290921691909117905580609d61128e846001614ac4565b8154811061129e5761129e614dae565b5f918252602090912001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790556112de826001614ac4565b609e5f609d85815481106112f4576112f4614dae565b5f9182526020808320909101546001600160a01b03168352820192909252604001902055611323826002614ac4565b609e5f609d611333866001614ac4565b8154811061134357611343614dae565b5f9182526020808320909101546001600160a01b03168352820192909252604001902055505b60010161113e565b505b8415801561139657506001600160a01b0386165f90815260a16020526040902054155b156113b3576001609c5f8282546113ad9190614ddb565b90915550505b6001600160a01b038681165f81815260a160205260408082205481517f7f683ee30000000000000000000000000000000000000000000000000000000081526004810194909452336024850152604484018990526064840152517f000000000000000000000000000000000000000000000000000000000000000090931692637f683ee392608480820193929182900301818387803b158015611454575f80fd5b505af1158015611466573d5f803e3d5ffd5b505050506114713390565b6001600160a01b0316866001600160a01b03167f92039db29d8c0a1aa1433fe109c69488c8c5e51b23c9de7d303ad80c1fef778c846020015187876040516114cc939291909283526020830191909152604082015260600190565b60405180910390a3841580156114e4575060975460ff165b80156114f25750609b548111155b80156115385750609b546001600160a01b0387165f908152609e602052604090205411806115385750609c546001600160a01b0387165f908152609e6020526040902054115b1561154557611545613a98565b50505050506115546001606555565b50565b6001600160a01b0382165f908152609e602052604090205482906115bd5760405162461bcd60e51b815260206004820152600a60248201527f6e6f74207374616b6572000000000000000000000000000000000000000000006044820152606401610779565b6115c5613c18565b5f82116116145760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964207374616b6520616d6f756e740000000000000000000000006044820152606401610779565b61161e3384613c93565b1561166b5760405162461bcd60e51b815260206004820152601660248201527f756e64656c65676174696f6e20756e636c61696d6564000000000000000000006044820152606401610779565b6001600160a01b0383165f90815260a3602090815260408083203384529091529020546116e95761169c3384613d1c565b156116e95760405162461bcd60e51b815260206004820152601060248201527f72657761726420756e636c61696d6564000000000000000000000000000000006044820152606401610779565b6001600160a01b0383165f90815260a1602052604081208054849290611710908490614ac4565b90915550506001600160a01b0383165f90815260a36020908152604080832033845290915281208054849290611747908490614ac4565b90915550506001600160a01b0383165f90815260a26020526040902061176d9033613dd1565b506001600160a01b0383165f90815260a160205260409020548290036117a5576001609c5f82825461179f9190614ac4565b90915550505b6001600160a01b0383165f908152609e602052604090205460975460ff1680156117cf5750600181115b15611a15575f6117e0600183614ddb565b90505b8015611a135760a15f609d6117f9600185614ddb565b8154811061180957611809614dae565b905f5260205f20015f9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020015f205460a15f609d848154811061185a5761185a614dae565b5f9182526020808320909101546001600160a01b031683528201929092526040019020541115611a01575f609d611892600184614ddb565b815481106118a2576118a2614dae565b5f91825260209091200154609d80546001600160a01b03909216925090839081106118cf576118cf614dae565b5f918252602090912001546001600160a01b0316609d6118f0600185614ddb565b8154811061190057611900614dae565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555080609d838154811061193f5761193f614dae565b5f9182526020822001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0393909316929092179091558290609e90609d611986600185614ddb565b8154811061199657611996614dae565b5f9182526020808320909101546001600160a01b031683528201929092526040019020556119c5826001614ac4565b609e5f609d85815481106119db576119db614dae565b5f9182526020808320909101546001600160a01b03168352820192909252604001902055505b80611a0b81614dee565b9150506117e3565b505b6097545f9060ff16611a27575f611a3a565b611a2f6128cb565b611a3a906001614ac4565b6001600160a01b0386165f81815260a36020908152604080832033808552908352928190205481519081529182018990528181018590525193945090927fc4ad67bad2c1f682946a406d840f1b273f5cd5a53fcc1a03d078d92bfa2e07d09181900360600190a36001600160a01b038581165f81815260a360209081526040808320338085528184528285205486865260a18552838620548287529290945282517fb809af0f000000000000000000000000000000000000000000000000000000008152600481019690965260248601526044850187905260648501839052608485015290881460a4840152517f00000000000000000000000000000000000000000000000000000000000000009093169263b809af0f9260c480820193929182900301818387803b158015611b6e575f80fd5b505af1158015611b80573d5f803e3d5ffd5b50505050611b95611b8e3390565b3086613de5565b60975460ff168015611ba85750609b5482115b8015611bcd57506099546001600160a01b0386165f908152609e602052604090205411155b15611bda57611bda613a98565b50506108fc6001606555565b611bee613a3e565b60975460ff1615611c415760405162461bcd60e51b815260206004820152601660248201527f72657761726420616c72656164792073746172746564000000000000000000006044820152606401610779565b4281118015611c5a5750611c586201518082614e30565b155b8015611c6857506098548114155b611cb45760405162461bcd60e51b815260206004820152601960248201527f696e76616c6964207265776172642073746172742074696d65000000000000006044820152606401610779565b609880549082905560408051828152602081018490527f91c38708087fb4ba51bd0e6a106cc1fbaf340479a2e81d18f2341e8c78f97555910160405180910390a15050565b609d546060905f9067ffffffffffffffff811115611d1957611d19614b38565b604051908082528060200260200182016040528015611d6557816020015b60408051606080820183525f808352602083015291810191909152815260200190600190039081611d375790505b5090505f5b609d54811015611f0f576040518060600160405280609f5f609d8581548110611d9557611d95614dae565b5f9182526020808320909101546001600160a01b0390811684528382019490945260409092018120549092168352609d80549390910192609f92919086908110611de157611de1614dae565b905f5260205f20015f9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020015f20600101548152602001609f5f609d8581548110611e3a57611e3a614dae565b5f9182526020808320909101546001600160a01b0316835282019290925260400190206002018054611e6b90614b65565b80601f0160208091040260200160405190810160405280929190818152602001828054611e9790614b65565b8015611ee25780601f10611eb957610100808354040283529160200191611ee2565b820191905f5260205f20905b815481529060010190602001808311611ec557829003601f168201915b5050505050815250828281518110611efc57611efc614dae565b6020908102919091010152600101611d6a565b50919050565b5f54610100900460ff1615808015611f3357505f54600160ff909116105b80611f4c5750303b158015611f4c57505f5460ff166001145b611fbe5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610779565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561201a575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b0387166120705760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964206f776e6572206164647265737300000000000000000000006044820152606401610779565b5f86116120e55760405162461bcd60e51b815260206004820152602260248201527f73657175656e6365727353697a65206d7573742067726561746572207468616e60448201527f20300000000000000000000000000000000000000000000000000000000000006064820152608401610779565b5f85116121345760405162461bcd60e51b815260206004820152601c60248201527f696e76616c696420756e64656c65676174654c6f636b45706f636873000000006044820152606401610779565b428411801561214d575061214b6201518085614e30565b155b6121995760405162461bcd60e51b815260206004820152601960248201527f696e76616c6964207265776172642073746172742074696d65000000000000006044820152606401610779565b816121e65760405162461bcd60e51b815260206004820152601760248201527f696e76616c696420696e697469616c207374616b6572730000000000000000006044820152606401610779565b6121ef87614096565b6121f76140f4565b6099869055609a8590556098849055609b8290555f5b609b548110156123685783838281811061222957612229614dae565b905060200281019061223b9190614e43565b609f5f86868581811061225057612250614dae565b90506020028101906122629190614e43565b61227090602081019061465b565b6001600160a01b0316815260208101919091526040015f206122928282614bf4565b905050609d8484838181106122a9576122a9614dae565b90506020028101906122bb9190614e43565b6122c990602081019061465b565b8154600180820184555f938452602090932001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055612312908290614ac4565b609e5f86868581811061232757612327614dae565b90506020028101906123399190614e43565b61234790602081019061465b565b6001600160a01b0316815260208101919091526040015f205560010161220d565b50604080515f8152602081018890527f98b982a120d9be7d9c68d85a1aed8158d1d52e517175bfb3eb4280692f19b1ed910160405180910390a1604080515f8152602081018690527f91c38708087fb4ba51bd0e6a106cc1fbaf340479a2e81d18f2341e8c78f97555910160405180910390a1801561243d575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b609d8181548110612455575f80fd5b5f918252602090912001546001600160a01b0316905081565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561255657507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015612527573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061254b9190614e7f565b6001600160a01b0316145b61072b5760405162461bcd60e51b815260206004820152602c60248201527f7374616b696e673a206f6e6c79206f74686572207374616b696e6720636f6e7460448201527f7261637420616c6c6f77656400000000000000000000000000000000000000006064820152608401610779565b6125d0613a3e565b6125d95f614096565b565b6125e3613a3e565b60985442101561265a5760405162461bcd60e51b8152602060048201526024808201527f63616e2774207374617274206265666f7265207265776172642073746172742060448201527f74696d65000000000000000000000000000000000000000000000000000000006064820152608401610779565b5f609c54116126ab5760405162461bcd60e51b815260206004820152600e60248201527f6e6f6e652063616e6469646174650000000000000000000000000000000000006044820152606401610779565b609780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091555b609d54811015612868575f5b8181101561285f5760a15f609d838154811061270457612704614dae565b905f5260205f20015f9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020015f205460a15f609d858154811061275557612755614dae565b5f9182526020808320909101546001600160a01b031683528201929092526040019020541115612857575f609d828154811061279357612793614dae565b5f91825260209091200154609d80546001600160a01b03909216925090849081106127c0576127c0614dae565b5f91825260209091200154609d80546001600160a01b0390921691849081106127eb576127eb614dae565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555080609d848154811061282a5761282a614dae565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550505b6001016126e6565b506001016126da565b505f5b609d548110156128c257612880816001614ac4565b609e5f609d848154811061289657612896614dae565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205560010161286b565b506125d9613a98565b5f60985442101561291e5760405162461bcd60e51b815260206004820152601960248201527f726577617264206973206e6f74207374617274656420796574000000000000006044820152606401610779565b62015180609854426129309190614ddb565b61293a9190614e9a565b905090565b6001600160a01b0381165f90815260a360209081526040808320338452909152812054151561071d565b609f6020525f90815260409020805460018201546002830180546001600160a01b0390931693919261299a90614b65565b80601f01602080910402602001604051908101604052809291908181526020018280546129c690614b65565b8015612a115780601f106129e857610100808354040283529160200191612a11565b820191905f5260205f20905b8154815290600101906020018083116129f457829003601f168201915b5050505050905083565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015612b0357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ad4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612af89190614e7f565b6001600160a01b0316145b612b755760405162461bcd60e51b815260206004820152602c60248201527f7374616b696e673a206f6e6c79206f74686572207374616b696e6720636f6e7460448201527f7261637420616c6c6f77656400000000000000000000000000000000000000006064820152608401610779565b8260a5548114612bc75760405162461bcd60e51b815260206004820152600d60248201527f696e76616c6964206e6f6e6365000000000000000000000000000000000000006044820152606401610779565b612bd2846001614ac4565b60a5555f805b83811015612f3857609b54609e5f878785818110612bf857612bf8614dae565b9050602002016020810190612c0d919061465b565b6001600160a01b03166001600160a01b031681526020019081526020015f205411612c3757600191505b5f609e5f878785818110612c4d57612c4d614dae565b9050602002016020810190612c62919061465b565b6001600160a01b03166001600160a01b031681526020019081526020015f20541115612eba575f6001609e5f888886818110612ca057612ca0614dae565b9050602002016020810190612cb5919061465b565b6001600160a01b03166001600160a01b031681526020019081526020015f2054612cdf9190614ddb565b90505b609d54612cf190600190614ddb565b811015612dc357609d612d05826001614ac4565b81548110612d1557612d15614dae565b5f91825260209091200154609d80546001600160a01b039092169183908110612d4057612d40614dae565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506001609e5f609d8481548110612d8357612d83614dae565b5f9182526020808320909101546001600160a01b0316835282019290925260400181208054909190612db6908490614ddb565b9091555050600101612ce2565b50609d805480612dd557612dd5614ead565b5f8281526020812082015f19908101805473ffffffffffffffffffffffffffffffffffffffff19169055909101909155609e90868684818110612e1a57612e1a614dae565b9050602002016020810190612e2f919061465b565b6001600160a01b03166001600160a01b031681526020019081526020015f205f90555f60a15f878785818110612e6757612e67614dae565b9050602002016020810190612e7c919061465b565b6001600160a01b03166001600160a01b031681526020019081526020015f20541115612eba576001609c5f828254612eb49190614ddb565b90915550505b609f5f868684818110612ecf57612ecf614dae565b9050602002016020810190612ee4919061465b565b6001600160a01b0316815260208101919091526040015f908120805473ffffffffffffffffffffffffffffffffffffffff191681556001810182905590612f2e60028301826145fd565b5050600101612bd8565b507f3511bf213f9290ba907e91e12a43e8471251e1879580ae5509292a3514c23f618484604051612f6a929190614eda565b60405180910390a18015612f8057612f80613a98565b5050505050565b5f60605f8411612fd95760405162461bcd60e51b815260206004820152601160248201527f696e76616c696420706167652073697a650000000000000000000000000000006044820152606401610779565b6001600160a01b0385165f90815260a260205260409020612ff990613a35565b91508367ffffffffffffffff81111561301457613014614b38565b60405190808252806020026020018201604052801561303d578160200160208202803683370190505b5090505f61304b8486614f27565b90505f600161305a8682614ac4565b6130649088614f27565b61306e9190614ddb565b905061307b600185614ddb565b8111156130905761308d600185614ddb565b90505b815f5b828211613109576130c7826130a781614f3e565b6001600160a01b038c165f90815260a26020526040902090945090614178565b85826130d281614f3e565b9350815181106130e4576130e4614dae565b60200260200101906001600160a01b031690816001600160a01b031681525050613093565b50505050935093915050565b61311d613c18565b335f90815260a46020526040812054815b818110156134335760975460ff16158061317e575061314b6128cb565b335f90815260a46020526040902080548390811061316b5761316b614dae565b905f5260205f2090600302016002015411155b1561342157335f90815260a4602052604090208054829081106131a3576131a3614dae565b905f5260205f20906003020160010154836131be9190614ac4565b335f90815260a46020526040812080549295509091839081106131e3576131e3614dae565b5f91825260208220600390910201546001600160a01b0316915060a4816132073390565b6001600160a01b03166001600160a01b031681526020019081526020015f20838154811061323757613237614dae565b905f5260205f2090600302016002015490505f60a45f6132543390565b6001600160a01b03166001600160a01b031681526020019081526020015f20848154811061328457613284614dae565b905f5260205f2090600302016001015490506001856132a39190614ddb565b84101561336857335f90815260a4602052604090206132c3600187614ddb565b815481106132d3576132d3614dae565b905f5260205f20906003020160a45f6132e93390565b6001600160a01b03166001600160a01b031681526020019081526020015f20858154811061331957613319614dae565b5f91825260209091208254600390920201805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03909216919091178155600180830154908201556002918201549101555b335f90815260a46020526040902080548061338557613385614ead565b5f8281526020812060035f1990930192830201805473ffffffffffffffffffffffffffffffffffffffff19168155600181810183905560029091019190915591556133d09086614ddb565b604080518481526020810184905291965033916001600160a01b038616917f921046659ea3b3b3f8e8fefd2bece3121b2d929ead94c696a75beedee477fdb6910160405180910390a350505061312e565b61342c816001614ac4565b905061312e565b505f82116134835760405162461bcd60e51b815260206004820152601760248201527f6e6f204d6f72706820746f6b656e20746f20636c61696d0000000000000000006044820152606401610779565b61348d3383614183565b50506125d96001606555565b6001600160a01b0381165f90815260a460209081526040808320805482518185028101850190935280835260609492939192909184015b82821015613524575f848152602090819020604080516060810182526003860290920180546001600160a01b03168352600180820154848601526002909101549183019190915290835290920191016134d0565b505050509050919050565b613537613a3e565b6001600160a01b0381166135b35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610779565b61155481614096565b6135c4613c18565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663ac2ac640336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b0390911660048201526024015f604051808303815f87803b15801561364a575f80fd5b505af115801561365c573d5f803e3d5ffd5b505050506125d96001606555565b613672613a3e565b8260a55481146136c45760405162461bcd60e51b815260206004820152600d60248201527f696e76616c6964206e6f6e6365000000000000000000000000000000000000006044820152606401610779565b6136cf846001614ac4565b60a5555f805b83811015612f3857609b54609e5f8787858181106136f5576136f5614dae565b905060200201602081019061370a919061465b565b6001600160a01b03166001600160a01b031681526020019081526020015f20541161373457600191505b5f609e5f87878581811061374a5761374a614dae565b905060200201602081019061375f919061465b565b6001600160a01b03166001600160a01b031681526020019081526020015f205411156139b7575f6001609e5f88888681811061379d5761379d614dae565b90506020020160208101906137b2919061465b565b6001600160a01b03166001600160a01b031681526020019081526020015f20546137dc9190614ddb565b90505b609d546137ee90600190614ddb565b8110156138c057609d613802826001614ac4565b8154811061381257613812614dae565b5f91825260209091200154609d80546001600160a01b03909216918390811061383d5761383d614dae565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506001609e5f609d848154811061388057613880614dae565b5f9182526020808320909101546001600160a01b03168352820192909252604001812080549091906138b3908490614ddb565b90915550506001016137df565b50609d8054806138d2576138d2614ead565b5f8281526020812082015f19908101805473ffffffffffffffffffffffffffffffffffffffff19169055909101909155609e9086868481811061391757613917614dae565b905060200201602081019061392c919061465b565b6001600160a01b03166001600160a01b031681526020019081526020015f205f90555f60a15f87878581811061396457613964614dae565b9050602002016020810190613979919061465b565b6001600160a01b03166001600160a01b031681526020019081526020015f205411156139b7576001609c5f8282546139b19190614ddb565b90915550505b609f5f8686848181106139cc576139cc614dae565b90506020020160208101906139e1919061465b565b6001600160a01b0316815260208101919091526040015f908120805473ffffffffffffffffffffffffffffffffffffffff191681556001810182905590613a2b60028301826145fd565b50506001016136d5565b5f61071d825490565b6033546001600160a01b031633146125d95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610779565b60995460975460ff1615613abc57609954609c541015613ab75750609c545b613acd565b609954609d541015613acd5750609d545b5f8167ffffffffffffffff811115613ae757613ae7614b38565b604051908082528060200260200182016040528015613b10578160200160208202803683370190505b5090505f5b82811015613b7d57609d8181548110613b3057613b30614dae565b905f5260205f20015f9054906101000a90046001600160a01b0316828281518110613b5d57613b5d614dae565b6001600160a01b0390921660209283029190910190910152600101613b15565b506040517f9b8201a40000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639b8201a490613be3908490600401614f56565b5f604051808303815f87803b158015613bfa575f80fd5b505af1158015613c0c573d5f803e3d5ffd5b50509151609b55505050565b600260655403613c6a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610779565b6002606555565b6001606555565b5f613c8c836001600160a01b03841661442c565b9392505050565b5f805b6001600160a01b0384165f90815260a46020526040902054811015613d13576001600160a01b038481165f90815260a46020526040902080549185169183908110613ce357613ce3614dae565b5f9182526020909120600390910201546001600160a01b031603613d0b57600191505061071d565b600101613c96565b505f9392505050565b6040517fde6ac9330000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015282811660248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063de6ac93390604401602060405180830381865afa158015613da5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613dc99190614f68565b159392505050565b5f613c8c836001600160a01b03841661450f565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015613e66573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e8a9190614f87565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301528581166024830152604482018590529192507f0000000000000000000000000000000000000000000000000000000000000000909116906323b872dd906064016020604051808303815f875af1158015613f1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f409190614f68565b613f8c5760405162461bcd60e51b815260206004820152601360248201527f7472616e7366657246726f6d206661696c6564000000000000000000000000006044820152606401610779565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa15801561400d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140319190614f87565b90505f8311801561404a5750826140488383614ddb565b145b612f805760405162461bcd60e51b815260206004820152601b60248201527f6d6f72706820746f6b656e207472616e73666572206661696c656400000000006044820152606401610779565b603380546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff166141705760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610779565b6125d961455b565b5f613c8c83836145d7565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015614204573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142289190614f87565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152602482018590529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303815f875af11580156142b2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142d69190614f68565b6143225760405162461bcd60e51b815260206004820152600f60248201527f7472616e73666572206661696c656400000000000000000000000000000000006044820152606401610779565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa1580156143a3573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143c79190614f87565b90505f831180156143e05750826143de8383614ddb565b145b610a0e5760405162461bcd60e51b815260206004820152601b60248201527f6d6f72706820746f6b656e207472616e73666572206661696c656400000000006044820152606401610779565b5f8181526001830160205260408120548015614506575f61444e600183614ddb565b85549091505f9061446190600190614ddb565b90508181146144c0575f865f01828154811061447f5761447f614dae565b905f5260205f200154905080875f01848154811061449f5761449f614dae565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806144d1576144d1614ead565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f90556001935050505061071d565b5f91505061071d565b5f81815260018301602052604081205461455457508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561071d565b505f61071d565b5f54610100900460ff16613c715760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610779565b5f825f0182815481106145ec576145ec614dae565b905f5260205f200154905092915050565b50805461460990614b65565b5f825580601f10614618575050565b601f0160209004905f5260205f209081019061155491905b80821115614643575f8155600101614630565b5090565b6001600160a01b0381168114611554575f80fd5b5f6020828403121561466b575f80fd5b8135613c8c81614647565b5f8060408385031215614687575f80fd5b82359150602083013567ffffffffffffffff8111156146a4575f80fd5b8301606081860312156146b5575f80fd5b809150509250929050565b5f602082840312156146d0575f80fd5b5035919050565b5f80604083850312156146e8575f80fd5b82356146f381614647565b946020939093013593505050565b5f8083601f840112614711575f80fd5b50813567ffffffffffffffff811115614728575f80fd5b6020830191508360208260051b8501011115614742575f80fd5b9250929050565b5f806020838503121561475a575f80fd5b823567ffffffffffffffff811115614770575f80fd5b61477c85828601614701565b90969095509350505050565b5f81518084525f5b818110156147ac57602081850181015186830182015201614790565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b83811015614881578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0018552815180516001600160a01b031684528781015188850152860151606087850181905261486d81860183614788565b968901969450505090860190600101614810565b509098975050505050505050565b5f805f805f8060a087890312156148a4575f80fd5b86356148af81614647565b9550602087013594506040870135935060608701359250608087013567ffffffffffffffff8111156148df575f80fd5b6148eb89828a01614701565b979a9699509497509295939492505050565b6001600160a01b0384168152826020820152606060408201525f6149246060830184614788565b95945050505050565b5f806040838503121561493e575f80fd5b823561494981614647565b915060208301356146b581614647565b5f805f6040848603121561496b575f80fd5b83359250602084013567ffffffffffffffff811115614988575f80fd5b61499486828701614701565b9497909650939450505050565b5f805f606084860312156149b3575f80fd5b83356149be81614647565b95602085013595506040909401359392505050565b5f815180845260208085019450602084015f5b83811015614a0b5781516001600160a01b0316875295820195908201906001016149e6565b509495945050505050565b828152604060208201525f614a2e60408301846149d3565b949350505050565b602080825282518282018190525f919060409081850190868401855b82811015614a8a57815180516001600160a01b0316855286810151878601528501518585015260609093019290850190600101614a52565b5091979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561071d5761071d614a97565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614b0a575f80fd5b83018035915067ffffffffffffffff821115614b24575f80fd5b602001915036819003821315614742575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b600181811c90821680614b7957607f821691505b602082108103611f0f577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b601f8211156108fc57805f5260205f20601f840160051c81016020851015614bd55750805b601f840160051c820191505b81811015612f80575f8155600101614be1565b8135614bff81614647565b6001600160a01b03811673ffffffffffffffffffffffffffffffffffffffff1983541617825550600160208084013560018401556002830160408501357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1863603018112614c6b575f80fd5b8501803567ffffffffffffffff811115614c83575f80fd5b8036038483011315614c93575f80fd5b614ca781614ca18554614b65565b85614bb0565b5f601f821160018114614cda575f8315614cc357508382018601355b5f19600385901b1c1916600184901b178555614d50565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08516915b82811015614d2657868501890135825593880193908901908801614d07565b5084821015614d44575f1960f88660031b161c198885880101351681555b505060018360011b0185555b505050505050505050565b83815260406020820152816040820152818360608301375f818301606090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010192915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8181038181111561071d5761071d614a97565b5f81614dfc57614dfc614a97565b505f190190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82614e3e57614e3e614e03565b500690565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112614e75575f80fd5b9190910192915050565b5f60208284031215614e8f575f80fd5b8151613c8c81614647565b5f82614ea857614ea8614e03565b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b60208082528181018390525f908460408401835b86811015614f1c578235614f0181614647565b6001600160a01b031682529183019190830190600101614eee565b509695505050505050565b808202811582820484141761071d5761071d614a97565b5f5f198203614f4f57614f4f614a97565b5060010190565b602081525f613c8c60208301846149d3565b5f60208284031215614f78575f80fd5b81518015158114613c8c575f80fd5b5f60208284031215614f97575f80fd5b505191905056fea164736f6c6343000818000a", } // L2StakingABI is the input ABI used to generate the binding from. @@ -788,6 +788,37 @@ func (_L2Staking *L2StakingCallerSession) Messenger() (common.Address, error) { return _L2Staking.Contract.Messenger(&_L2Staking.CallOpts) } +// Nonce is a free data retrieval call binding the contract method 0xaffed0e0. +// +// Solidity: function nonce() view returns(uint256) +func (_L2Staking *L2StakingCaller) Nonce(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _L2Staking.contract.Call(opts, &out, "nonce") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// Nonce is a free data retrieval call binding the contract method 0xaffed0e0. +// +// Solidity: function nonce() view returns(uint256) +func (_L2Staking *L2StakingSession) Nonce() (*big.Int, error) { + return _L2Staking.Contract.Nonce(&_L2Staking.CallOpts) +} + +// Nonce is a free data retrieval call binding the contract method 0xaffed0e0. +// +// Solidity: function nonce() view returns(uint256) +func (_L2Staking *L2StakingCallerSession) Nonce() (*big.Int, error) { + return _L2Staking.Contract.Nonce(&_L2Staking.CallOpts) +} + // Owner is a free data retrieval call binding the contract method 0x8da5cb5b. // // Solidity: function owner() view returns(address) @@ -1136,25 +1167,25 @@ func (_L2Staking *L2StakingCallerSession) Undelegations(delegator common.Address return _L2Staking.Contract.Undelegations(&_L2Staking.CallOpts, delegator, arg1) } -// AddStaker is a paid mutator transaction binding the contract method 0x6d454d51. +// AddStaker is a paid mutator transaction binding the contract method 0x7046529b. // -// Solidity: function addStaker((address,bytes32,bytes) add) returns() -func (_L2Staking *L2StakingTransactor) AddStaker(opts *bind.TransactOpts, add TypesStakerInfo) (*types.Transaction, error) { - return _L2Staking.contract.Transact(opts, "addStaker", add) +// Solidity: function addStaker(uint256 _nonce, (address,bytes32,bytes) add) returns() +func (_L2Staking *L2StakingTransactor) AddStaker(opts *bind.TransactOpts, _nonce *big.Int, add TypesStakerInfo) (*types.Transaction, error) { + return _L2Staking.contract.Transact(opts, "addStaker", _nonce, add) } -// AddStaker is a paid mutator transaction binding the contract method 0x6d454d51. +// AddStaker is a paid mutator transaction binding the contract method 0x7046529b. // -// Solidity: function addStaker((address,bytes32,bytes) add) returns() -func (_L2Staking *L2StakingSession) AddStaker(add TypesStakerInfo) (*types.Transaction, error) { - return _L2Staking.Contract.AddStaker(&_L2Staking.TransactOpts, add) +// Solidity: function addStaker(uint256 _nonce, (address,bytes32,bytes) add) returns() +func (_L2Staking *L2StakingSession) AddStaker(_nonce *big.Int, add TypesStakerInfo) (*types.Transaction, error) { + return _L2Staking.Contract.AddStaker(&_L2Staking.TransactOpts, _nonce, add) } -// AddStaker is a paid mutator transaction binding the contract method 0x6d454d51. +// AddStaker is a paid mutator transaction binding the contract method 0x7046529b. // -// Solidity: function addStaker((address,bytes32,bytes) add) returns() -func (_L2Staking *L2StakingTransactorSession) AddStaker(add TypesStakerInfo) (*types.Transaction, error) { - return _L2Staking.Contract.AddStaker(&_L2Staking.TransactOpts, add) +// Solidity: function addStaker(uint256 _nonce, (address,bytes32,bytes) add) returns() +func (_L2Staking *L2StakingTransactorSession) AddStaker(_nonce *big.Int, add TypesStakerInfo) (*types.Transaction, error) { + return _L2Staking.Contract.AddStaker(&_L2Staking.TransactOpts, _nonce, add) } // ClaimCommission is a paid mutator transaction binding the contract method 0xfad99f98. @@ -1241,6 +1272,48 @@ func (_L2Staking *L2StakingTransactorSession) DelegateStake(delegatee common.Add return _L2Staking.Contract.DelegateStake(&_L2Staking.TransactOpts, delegatee, amount) } +// EmergencyAddStaker is a paid mutator transaction binding the contract method 0x009c6f0c. +// +// Solidity: function emergencyAddStaker(uint256 _nonce, (address,bytes32,bytes) add) returns() +func (_L2Staking *L2StakingTransactor) EmergencyAddStaker(opts *bind.TransactOpts, _nonce *big.Int, add TypesStakerInfo) (*types.Transaction, error) { + return _L2Staking.contract.Transact(opts, "emergencyAddStaker", _nonce, add) +} + +// EmergencyAddStaker is a paid mutator transaction binding the contract method 0x009c6f0c. +// +// Solidity: function emergencyAddStaker(uint256 _nonce, (address,bytes32,bytes) add) returns() +func (_L2Staking *L2StakingSession) EmergencyAddStaker(_nonce *big.Int, add TypesStakerInfo) (*types.Transaction, error) { + return _L2Staking.Contract.EmergencyAddStaker(&_L2Staking.TransactOpts, _nonce, add) +} + +// EmergencyAddStaker is a paid mutator transaction binding the contract method 0x009c6f0c. +// +// Solidity: function emergencyAddStaker(uint256 _nonce, (address,bytes32,bytes) add) returns() +func (_L2Staking *L2StakingTransactorSession) EmergencyAddStaker(_nonce *big.Int, add TypesStakerInfo) (*types.Transaction, error) { + return _L2Staking.Contract.EmergencyAddStaker(&_L2Staking.TransactOpts, _nonce, add) +} + +// EmergencyRemoveStakers is a paid mutator transaction binding the contract method 0xfc6facc6. +// +// Solidity: function emergencyRemoveStakers(uint256 _nonce, address[] remove) returns() +func (_L2Staking *L2StakingTransactor) EmergencyRemoveStakers(opts *bind.TransactOpts, _nonce *big.Int, remove []common.Address) (*types.Transaction, error) { + return _L2Staking.contract.Transact(opts, "emergencyRemoveStakers", _nonce, remove) +} + +// EmergencyRemoveStakers is a paid mutator transaction binding the contract method 0xfc6facc6. +// +// Solidity: function emergencyRemoveStakers(uint256 _nonce, address[] remove) returns() +func (_L2Staking *L2StakingSession) EmergencyRemoveStakers(_nonce *big.Int, remove []common.Address) (*types.Transaction, error) { + return _L2Staking.Contract.EmergencyRemoveStakers(&_L2Staking.TransactOpts, _nonce, remove) +} + +// EmergencyRemoveStakers is a paid mutator transaction binding the contract method 0xfc6facc6. +// +// Solidity: function emergencyRemoveStakers(uint256 _nonce, address[] remove) returns() +func (_L2Staking *L2StakingTransactorSession) EmergencyRemoveStakers(_nonce *big.Int, remove []common.Address) (*types.Transaction, error) { + return _L2Staking.Contract.EmergencyRemoveStakers(&_L2Staking.TransactOpts, _nonce, remove) +} + // Initialize is a paid mutator transaction binding the contract method 0x439162b5. // // Solidity: function initialize(address _owner, uint256 _sequencersMaxSize, uint256 _undelegateLockEpochs, uint256 _rewardStartTime, (address,bytes32,bytes)[] _stakers) returns() @@ -1262,25 +1335,25 @@ func (_L2Staking *L2StakingTransactorSession) Initialize(_owner common.Address, return _L2Staking.Contract.Initialize(&_L2Staking.TransactOpts, _owner, _sequencersMaxSize, _undelegateLockEpochs, _rewardStartTime, _stakers) } -// RemoveStakers is a paid mutator transaction binding the contract method 0x0be67fcc. +// RemoveStakers is a paid mutator transaction binding the contract method 0xcce6cf9f. // -// Solidity: function removeStakers(address[] remove) returns() -func (_L2Staking *L2StakingTransactor) RemoveStakers(opts *bind.TransactOpts, remove []common.Address) (*types.Transaction, error) { - return _L2Staking.contract.Transact(opts, "removeStakers", remove) +// Solidity: function removeStakers(uint256 _nonce, address[] remove) returns() +func (_L2Staking *L2StakingTransactor) RemoveStakers(opts *bind.TransactOpts, _nonce *big.Int, remove []common.Address) (*types.Transaction, error) { + return _L2Staking.contract.Transact(opts, "removeStakers", _nonce, remove) } -// RemoveStakers is a paid mutator transaction binding the contract method 0x0be67fcc. +// RemoveStakers is a paid mutator transaction binding the contract method 0xcce6cf9f. // -// Solidity: function removeStakers(address[] remove) returns() -func (_L2Staking *L2StakingSession) RemoveStakers(remove []common.Address) (*types.Transaction, error) { - return _L2Staking.Contract.RemoveStakers(&_L2Staking.TransactOpts, remove) +// Solidity: function removeStakers(uint256 _nonce, address[] remove) returns() +func (_L2Staking *L2StakingSession) RemoveStakers(_nonce *big.Int, remove []common.Address) (*types.Transaction, error) { + return _L2Staking.Contract.RemoveStakers(&_L2Staking.TransactOpts, _nonce, remove) } -// RemoveStakers is a paid mutator transaction binding the contract method 0x0be67fcc. +// RemoveStakers is a paid mutator transaction binding the contract method 0xcce6cf9f. // -// Solidity: function removeStakers(address[] remove) returns() -func (_L2Staking *L2StakingTransactorSession) RemoveStakers(remove []common.Address) (*types.Transaction, error) { - return _L2Staking.Contract.RemoveStakers(&_L2Staking.TransactOpts, remove) +// Solidity: function removeStakers(uint256 _nonce, address[] remove) returns() +func (_L2Staking *L2StakingTransactorSession) RemoveStakers(_nonce *big.Int, remove []common.Address) (*types.Transaction, error) { + return _L2Staking.Contract.RemoveStakers(&_L2Staking.TransactOpts, _nonce, remove) } // RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. diff --git a/bindings/bindings/l2staking_more.go b/bindings/bindings/l2staking_more.go index 9488720a..1f7dc0a5 100644 --- a/bindings/bindings/l2staking_more.go +++ b/bindings/bindings/l2staking_more.go @@ -9,11 +9,11 @@ import ( "morph-l2/bindings/solc" ) -const L2StakingStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_array(t_uint256)1022_storage\"},{\"astId\":1003,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"_owner\",\"offset\":0,\"slot\":\"51\",\"type\":\"t_address\"},{\"astId\":1004,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"52\",\"type\":\"t_array(t_uint256)1021_storage\"},{\"astId\":1005,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"_status\",\"offset\":0,\"slot\":\"101\",\"type\":\"t_uint256\"},{\"astId\":1006,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"102\",\"type\":\"t_array(t_uint256)1021_storage\"},{\"astId\":1007,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"rewardStarted\",\"offset\":0,\"slot\":\"151\",\"type\":\"t_bool\"},{\"astId\":1008,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"rewardStartTime\",\"offset\":0,\"slot\":\"152\",\"type\":\"t_uint256\"},{\"astId\":1009,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"sequencerSetMaxSize\",\"offset\":0,\"slot\":\"153\",\"type\":\"t_uint256\"},{\"astId\":1010,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"undelegateLockEpochs\",\"offset\":0,\"slot\":\"154\",\"type\":\"t_uint256\"},{\"astId\":1011,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"latestSequencerSetSize\",\"offset\":0,\"slot\":\"155\",\"type\":\"t_uint256\"},{\"astId\":1012,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"candidateNumber\",\"offset\":0,\"slot\":\"156\",\"type\":\"t_uint256\"},{\"astId\":1013,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"stakerAddresses\",\"offset\":0,\"slot\":\"157\",\"type\":\"t_array(t_address)dyn_storage\"},{\"astId\":1014,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"stakerRankings\",\"offset\":0,\"slot\":\"158\",\"type\":\"t_mapping(t_address,t_uint256)\"},{\"astId\":1015,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"stakers\",\"offset\":0,\"slot\":\"159\",\"type\":\"t_mapping(t_address,t_struct(StakerInfo)1025_storage)\"},{\"astId\":1016,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"commissions\",\"offset\":0,\"slot\":\"160\",\"type\":\"t_mapping(t_address,t_uint256)\"},{\"astId\":1017,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"stakerDelegations\",\"offset\":0,\"slot\":\"161\",\"type\":\"t_mapping(t_address,t_uint256)\"},{\"astId\":1018,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"delegators\",\"offset\":0,\"slot\":\"162\",\"type\":\"t_mapping(t_address,t_struct(AddressSet)1023_storage)\"},{\"astId\":1019,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"delegations\",\"offset\":0,\"slot\":\"163\",\"type\":\"t_mapping(t_address,t_mapping(t_address,t_uint256))\"},{\"astId\":1020,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"undelegations\",\"offset\":0,\"slot\":\"164\",\"type\":\"t_mapping(t_address,t_array(t_struct(Undelegation)1026_storage)dyn_storage)\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_address)dyn_storage\":{\"encoding\":\"dynamic_array\",\"label\":\"address[]\",\"numberOfBytes\":\"32\"},\"t_array(t_bytes32)dyn_storage\":{\"encoding\":\"dynamic_array\",\"label\":\"bytes32[]\",\"numberOfBytes\":\"32\"},\"t_array(t_struct(Undelegation)1026_storage)dyn_storage\":{\"encoding\":\"dynamic_array\",\"label\":\"struct IL2Staking.Undelegation[]\",\"numberOfBytes\":\"32\"},\"t_array(t_uint256)1021_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\"},\"t_array(t_uint256)1022_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[50]\",\"numberOfBytes\":\"1600\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_bytes_storage\":{\"encoding\":\"bytes\",\"label\":\"bytes\",\"numberOfBytes\":\"32\"},\"t_mapping(t_address,t_array(t_struct(Undelegation)1026_storage)dyn_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e struct IL2Staking.Undelegation[])\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_array(t_struct(Undelegation)1026_storage)dyn_storage\"},\"t_mapping(t_address,t_mapping(t_address,t_uint256))\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e mapping(address =\u003e uint256))\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_mapping(t_address,t_uint256)\"},\"t_mapping(t_address,t_struct(AddressSet)1023_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e struct EnumerableSetUpgradeable.AddressSet)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_struct(AddressSet)1023_storage\"},\"t_mapping(t_address,t_struct(StakerInfo)1025_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e struct Types.StakerInfo)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_struct(StakerInfo)1025_storage\"},\"t_mapping(t_address,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_uint256\"},\"t_mapping(t_bytes32,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_uint256\"},\"t_struct(AddressSet)1023_storage\":{\"encoding\":\"inplace\",\"label\":\"struct EnumerableSetUpgradeable.AddressSet\",\"numberOfBytes\":\"64\"},\"t_struct(Set)1024_storage\":{\"encoding\":\"inplace\",\"label\":\"struct EnumerableSetUpgradeable.Set\",\"numberOfBytes\":\"64\"},\"t_struct(StakerInfo)1025_storage\":{\"encoding\":\"inplace\",\"label\":\"struct Types.StakerInfo\",\"numberOfBytes\":\"96\"},\"t_struct(Undelegation)1026_storage\":{\"encoding\":\"inplace\",\"label\":\"struct IL2Staking.Undelegation\",\"numberOfBytes\":\"96\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}" +const L2StakingStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_array(t_uint256)1023_storage\"},{\"astId\":1003,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"_owner\",\"offset\":0,\"slot\":\"51\",\"type\":\"t_address\"},{\"astId\":1004,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"52\",\"type\":\"t_array(t_uint256)1022_storage\"},{\"astId\":1005,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"_status\",\"offset\":0,\"slot\":\"101\",\"type\":\"t_uint256\"},{\"astId\":1006,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"102\",\"type\":\"t_array(t_uint256)1022_storage\"},{\"astId\":1007,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"rewardStarted\",\"offset\":0,\"slot\":\"151\",\"type\":\"t_bool\"},{\"astId\":1008,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"rewardStartTime\",\"offset\":0,\"slot\":\"152\",\"type\":\"t_uint256\"},{\"astId\":1009,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"sequencerSetMaxSize\",\"offset\":0,\"slot\":\"153\",\"type\":\"t_uint256\"},{\"astId\":1010,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"undelegateLockEpochs\",\"offset\":0,\"slot\":\"154\",\"type\":\"t_uint256\"},{\"astId\":1011,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"latestSequencerSetSize\",\"offset\":0,\"slot\":\"155\",\"type\":\"t_uint256\"},{\"astId\":1012,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"candidateNumber\",\"offset\":0,\"slot\":\"156\",\"type\":\"t_uint256\"},{\"astId\":1013,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"stakerAddresses\",\"offset\":0,\"slot\":\"157\",\"type\":\"t_array(t_address)dyn_storage\"},{\"astId\":1014,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"stakerRankings\",\"offset\":0,\"slot\":\"158\",\"type\":\"t_mapping(t_address,t_uint256)\"},{\"astId\":1015,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"stakers\",\"offset\":0,\"slot\":\"159\",\"type\":\"t_mapping(t_address,t_struct(StakerInfo)1026_storage)\"},{\"astId\":1016,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"commissions\",\"offset\":0,\"slot\":\"160\",\"type\":\"t_mapping(t_address,t_uint256)\"},{\"astId\":1017,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"stakerDelegations\",\"offset\":0,\"slot\":\"161\",\"type\":\"t_mapping(t_address,t_uint256)\"},{\"astId\":1018,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"delegators\",\"offset\":0,\"slot\":\"162\",\"type\":\"t_mapping(t_address,t_struct(AddressSet)1024_storage)\"},{\"astId\":1019,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"delegations\",\"offset\":0,\"slot\":\"163\",\"type\":\"t_mapping(t_address,t_mapping(t_address,t_uint256))\"},{\"astId\":1020,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"undelegations\",\"offset\":0,\"slot\":\"164\",\"type\":\"t_mapping(t_address,t_array(t_struct(Undelegation)1027_storage)dyn_storage)\"},{\"astId\":1021,\"contract\":\"contracts/l2/staking/L2Staking.sol:L2Staking\",\"label\":\"nonce\",\"offset\":0,\"slot\":\"165\",\"type\":\"t_uint256\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_address)dyn_storage\":{\"encoding\":\"dynamic_array\",\"label\":\"address[]\",\"numberOfBytes\":\"32\"},\"t_array(t_bytes32)dyn_storage\":{\"encoding\":\"dynamic_array\",\"label\":\"bytes32[]\",\"numberOfBytes\":\"32\"},\"t_array(t_struct(Undelegation)1027_storage)dyn_storage\":{\"encoding\":\"dynamic_array\",\"label\":\"struct IL2Staking.Undelegation[]\",\"numberOfBytes\":\"32\"},\"t_array(t_uint256)1022_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\"},\"t_array(t_uint256)1023_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[50]\",\"numberOfBytes\":\"1600\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_bytes_storage\":{\"encoding\":\"bytes\",\"label\":\"bytes\",\"numberOfBytes\":\"32\"},\"t_mapping(t_address,t_array(t_struct(Undelegation)1027_storage)dyn_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e struct IL2Staking.Undelegation[])\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_array(t_struct(Undelegation)1027_storage)dyn_storage\"},\"t_mapping(t_address,t_mapping(t_address,t_uint256))\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e mapping(address =\u003e uint256))\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_mapping(t_address,t_uint256)\"},\"t_mapping(t_address,t_struct(AddressSet)1024_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e struct EnumerableSetUpgradeable.AddressSet)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_struct(AddressSet)1024_storage\"},\"t_mapping(t_address,t_struct(StakerInfo)1026_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e struct Types.StakerInfo)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_struct(StakerInfo)1026_storage\"},\"t_mapping(t_address,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_uint256\"},\"t_mapping(t_bytes32,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_uint256\"},\"t_struct(AddressSet)1024_storage\":{\"encoding\":\"inplace\",\"label\":\"struct EnumerableSetUpgradeable.AddressSet\",\"numberOfBytes\":\"64\"},\"t_struct(Set)1025_storage\":{\"encoding\":\"inplace\",\"label\":\"struct EnumerableSetUpgradeable.Set\",\"numberOfBytes\":\"64\"},\"t_struct(StakerInfo)1026_storage\":{\"encoding\":\"inplace\",\"label\":\"struct Types.StakerInfo\",\"numberOfBytes\":\"96\"},\"t_struct(Undelegation)1027_storage\":{\"encoding\":\"inplace\",\"label\":\"struct IL2Staking.Undelegation\",\"numberOfBytes\":\"96\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}" var L2StakingStorageLayout = new(solc.StorageLayout) -var L2StakingDeployedBin = "0x608060405234801561000f575f80fd5b50600436106102cc575f3560e01c8063715018a61161017c578063927ede2d116100dd578063d557714111610093578063f0261bc21161006e578063f0261bc2146106b1578063f2fde38b146106ba578063fad99f98146106cd575f80fd5b8063d557714114610662578063e10911b114610689578063ed70b34314610691575f80fd5b8063b5d2e0dc116100c3578063b5d2e0dc146105f8578063c64814dd14610617578063d31d83d914610641575f80fd5b8063927ede2d146105c457806396ab994d146105eb575f80fd5b806384d7d1d4116101325780638e21d5fb116101185780638e21d5fb1461055c5780639168ae721461058357806391bd43a4146105a5575f80fd5b806384d7d1d41461051b5780638da5cb5b1461053e575f80fd5b8063766718081161016257806376671808146104cd5780637b05afb5146104d5578063831cfb58146104f4575f80fd5b8063715018a6146104bd578063746c8ae1146104c5575f80fd5b80633385ccc21161023157806340b5c837116101e7578063459598a2116101c2578063459598a21461048f57806346cdc18a146104a25780636d454d51146104aa575f80fd5b806340b5c8371461046157806343352d6114610474578063439162b51461047c575f80fd5b80633c323a1b116102175780633c323a1b146103e05780633cb747bf146103f35780633d9353fe1461043a575f80fd5b80633385ccc2146103c45780633b802421146103d7575f80fd5b8063174e31c4116102865780632cc138be1161026c5780632cc138be146103925780632e787be31461039b57806330158eea146103a4575f80fd5b8063174e31c41461036c57806319fac8fd1461037f575f80fd5b80630eb573af116102b65780630eb573af1461030b5780630f3b70591461031e57806312a3e94714610363575f80fd5b806243b758146102d05780630be67fcc146102f6575b5f80fd5b6102e36102de366004614bd5565b6106d5565b6040519081526020015b60405180910390f35b610309610304366004614c38565b610708565b005b610309610319366004614c77565b610d5d565b61033161032c366004614c8e565b610e8a565b6040805173ffffffffffffffffffffffffffffffffffffffff90941684526020840192909252908201526060016102ed565b6102e3609a5481565b61030961037a366004614c8e565b610edf565b61030961038d366004614c77565b611098565b6102e360985481565b6102e360995481565b6103b76103b2366004614c38565b6111ee565b6040516102ed9190614d19565b6103096103d2366004614bd5565b611456565b6102e3609c5481565b6103096103ee366004614c8e565b611bcf565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102ed565b6104157f000000000000000000000000000000000000000000000000000000000000000081565b61030961046f366004614c77565b6123e2565b6103b7612529565b61030961048a366004614dcc565b612786565b61041561049d366004614c77565b612d92565b609d546102e3565b6103096104b8366004614e3a565b612dc7565b610309613134565b610309613147565b6102e36134fa565b6102e36104e3366004614bd5565b60a06020525f908152604090205481565b6104157f000000000000000000000000000000000000000000000000000000000000000081565b61052e610529366004614bd5565b613588565b60405190151581526020016102ed565b60335473ffffffffffffffffffffffffffffffffffffffff16610415565b6104157f000000000000000000000000000000000000000000000000000000000000000081565b610596610591366004614bd5565b6135bf565b6040516102ed93929190614e71565b6102e36105b3366004614bd5565b60a16020525f908152604090205481565b6104157f000000000000000000000000000000000000000000000000000000000000000081565b60975461052e9060ff1681565b6102e3610606366004614bd5565b609e6020525f908152604090205481565b6102e3610625366004614eae565b60a360209081525f928352604080842090915290825290205481565b61065461064f366004614ee5565b61367e565b6040516102ed929190614f67565b6104157f000000000000000000000000000000000000000000000000000000000000000081565b610309613839565b6106a461069f366004614bd5565b613c81565b6040516102ed9190614f87565b6102e3609b5481565b6103096106c8366004614bd5565b613d31565b610309613de5565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260a26020526040812061070290613ead565b92915050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614801561082457507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107e8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061080c9190614ff5565b73ffffffffffffffffffffffffffffffffffffffff16145b6108b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f7374616b696e673a206f6e6c79206f74686572207374616b696e6720636f6e7460448201527f7261637420616c6c6f776564000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5f805b82811015610d1057609b54609e5f8686858181106108d8576108d8615010565b90506020020160208101906108ed9190614bd5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541161093157600191505b5f609e5f86868581811061094757610947615010565b905060200201602081019061095c9190614bd5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541115610c7a575f6001609e5f8787868181106109b4576109b4615010565b90506020020160208101906109c99190614bd5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610a0d919061506a565b90505b609d54610a1f9060019061506a565b811015610b2557609d610a3382600161507d565b81548110610a4357610a43615010565b5f91825260209091200154609d805473ffffffffffffffffffffffffffffffffffffffff9092169183908110610a7b57610a7b615010565b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001609e5f609d8481548110610ad857610ad8615010565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400181208054909190610b1890849061506a565b9091555050600101610a10565b50609d805480610b3757610b37615090565b5f8281526020812082017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055909101909155609e90858584818110610ba657610ba6615010565b9050602002016020810190610bbb9190614bd5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f90555f60a15f868685818110610c0d57610c0d615010565b9050602002016020810190610c229190614bd5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541115610c7a576001609c5f828254610c74919061506a565b90915550505b609f5f858584818110610c8f57610c8f615010565b9050602002016020810190610ca49190614bd5565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f90812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001681556001810182905590610d066002830182614b6a565b50506001016108b8565b507f3511bf213f9290ba907e91e12a43e8471251e1879580ae5509292a3514c23f618383604051610d429291906150bd565b60405180910390a18015610d5857610d58613eb6565b505050565b610d6561405d565b5f81118015610d7657506099548114155b610e02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f696e76616c6964206e65772073657175656e63657220736574206d617820736960448201527f7a6500000000000000000000000000000000000000000000000000000000000060648201526084016108ac565b609980549082905560408051828152602081018490527f98b982a120d9be7d9c68d85a1aed8158d1d52e517175bfb3eb4280692f19b1ed910160405180910390a16097545f9060ff16610e5757609d54610e5b565b609c545b90505f6099548210610e6f57609954610e71565b815b9050609b548114610e8457610e84613eb6565b50505050565b60a4602052815f5260405f208181548110610ea3575f80fd5b5f91825260209091206003909102018054600182015460029092015473ffffffffffffffffffffffffffffffffffffffff909116935090915083565b610ee76140de565b73ffffffffffffffffffffffffffffffffffffffff8216610fc45773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016635cf20c7b336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018490526044015f604051808303815f87803b158015610fa9575f80fd5b505af1158015610fbb573d5f803e3d5ffd5b5050505061108a565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663996cba6883336040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff928316600482015291166024820152604481018490526064015f604051808303815f87803b158015611073575f80fd5b505af1158015611085573d5f803e3d5ffd5b505050505b6110946001606555565b5050565b335f908152609e602052604090205461110d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f6f6e6c79207374616b657220616c6c6f7765640000000000000000000000000060448201526064016108ac565b6014811115611178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e76616c696420636f6d6d697373696f6e000000000000000000000000000060448201526064016108ac565b335f90815260a06020526040812082905560975460ff16611199575f6111ac565b6111a16134fa565b6111ac90600161507d565b604080518481526020810183905291925033917f6e500db30ce535d38852e318f333e9be41a3fec6c65d234ebb06203c896db9a5910160405180910390a25050565b60605f8267ffffffffffffffff81111561120a5761120a615117565b60405190808252806020026020018201604052801561125657816020015b60408051606080820183525f8083526020830152918101919091528152602001906001900390816112285790505b5090505f5b8381101561144e576040518060600160405280609f5f88888681811061128357611283615010565b90506020020160208101906112989190614bd5565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409091015f908120549091168352910190609f908888868181106112e2576112e2615010565b90506020020160208101906112f79190614bd5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101548152602001609f5f88888681811061134e5761134e615010565b90506020020160208101906113639190614bd5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060020180546113aa90615144565b80601f01602080910402602001604051908101604052809291908181526020018280546113d690615144565b80156114215780601f106113f857610100808354040283529160200191611421565b820191905f5260205f20905b81548152906001019060200180831161140457829003601f168201915b505050505081525082828151811061143b5761143b615010565b602090810291909101015260010161125b565b509392505050565b61145e6140de565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260a3602090815260408083203384529091529020546114f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f7374616b696e6720616d6f756e74206973207a65726f0000000000000000000060448201526064016108ac565b73ffffffffffffffffffffffffffffffffffffffff81165f908152609e60205260408120546097549015919060ff1661152d575f611540565b6115356134fa565b61154090600161507d565b6097549091505f9060ff168015611555575082155b61155f578161156c565b609a5461156c908361507d565b6040805160608101825273ffffffffffffffffffffffffffffffffffffffff8781168083525f81815260a36020908152858220338084528183528784208054848901908152888a018b815283875260a486528a87208054600180820183559189528789208c5160039092020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001691909b16178a558251908a015551600290980197909755908452908252829055925191815260a19092529281208054949550919361163b90849061506a565b909155505073ffffffffffffffffffffffffffffffffffffffff85165f90815260a26020526040902061166e9033614158565b5073ffffffffffffffffffffffffffffffffffffffff85165f908152609e6020526040902054841580156116a4575060975460ff165b80156116b15750609c5481105b1561199d5773ffffffffffffffffffffffffffffffffffffffff86165f908152609e60205260408120546116e79060019061506a565b90505b6001609c546116f9919061506a565b81101561199b5760a15f609d838154811061171657611716615010565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040018120549060a190609d61175885600161507d565b8154811061176857611768615010565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040019020541115611993575f609d82815481106117b3576117b3615010565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff169050609d6117e383600161507d565b815481106117f3576117f3615010565b5f91825260209091200154609d805473ffffffffffffffffffffffffffffffffffffffff909216918490811061182b5761182b615010565b5f91825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905580609d61188684600161507d565b8154811061189657611896615010565b5f91825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169190911790556118ee82600161507d565b609e5f609d858154811061190457611904615010565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205561194082600261507d565b609e5f609d61195086600161507d565b8154811061196057611960615010565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902055505b6001016116ea565b505b841580156119cd575073ffffffffffffffffffffffffffffffffffffffff86165f90815260a16020526040902054155b156119ea576001609c5f8282546119e4919061506a565b90915550505b73ffffffffffffffffffffffffffffffffffffffff8681165f81815260a160205260408082205481517f7f683ee30000000000000000000000000000000000000000000000000000000081526004810194909452336024850152604484018990526064840152517f000000000000000000000000000000000000000000000000000000000000000090931692637f683ee392608480820193929182900301818387803b158015611a98575f80fd5b505af1158015611aaa573d5f803e3d5ffd5b50505050611ab53390565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f92039db29d8c0a1aa1433fe109c69488c8c5e51b23c9de7d303ad80c1fef778c84602001518787604051611b2a939291909283526020830191909152604082015260600190565b60405180910390a384158015611b42575060975460ff165b8015611b505750609b548111155b8015611bb05750609b5473ffffffffffffffffffffffffffffffffffffffff87165f908152609e60205260409020541180611bb05750609c5473ffffffffffffffffffffffffffffffffffffffff87165f908152609e6020526040902054115b15611bbd57611bbd613eb6565b5050505050611bcc6001606555565b50565b73ffffffffffffffffffffffffffffffffffffffff82165f908152609e60205260409020548290611c5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b65720000000000000000000000000000000000000000000060448201526064016108ac565b611c646140de565b5f8211611ccd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e76616c6964207374616b6520616d6f756e7400000000000000000000000060448201526064016108ac565b611cd73384614180565b15611d3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f756e64656c65676174696f6e20756e636c61696d65640000000000000000000060448201526064016108ac565b73ffffffffffffffffffffffffffffffffffffffff83165f90815260a360209081526040808320338452909152902054611de357611d7c3384614230565b15611de3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f72657761726420756e636c61696d65640000000000000000000000000000000060448201526064016108ac565b73ffffffffffffffffffffffffffffffffffffffff83165f90815260a1602052604081208054849290611e1790849061507d565b909155505073ffffffffffffffffffffffffffffffffffffffff83165f90815260a36020908152604080832033845290915281208054849290611e5b90849061507d565b909155505073ffffffffffffffffffffffffffffffffffffffff83165f90815260a260205260409020611e8e90336142f2565b5073ffffffffffffffffffffffffffffffffffffffff83165f90815260a16020526040902054829003611ed3576001609c5f828254611ecd919061507d565b90915550505b73ffffffffffffffffffffffffffffffffffffffff83165f908152609e602052604090205460975460ff168015611f0a5750600181115b156121ea575f611f1b60018361506a565b90505b80156121e85760a15f609d611f3460018561506a565b81548110611f4457611f44615010565b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460a15f609d8481548110611fbc57611fbc615010565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205411156121d6575f609d61200160018461506a565b8154811061201157612011615010565b5f91825260209091200154609d805473ffffffffffffffffffffffffffffffffffffffff9092169250908390811061204b5761204b615010565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16609d61207960018561506a565b8154811061208957612089615010565b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080609d83815481106120e2576120e2615010565b5f918252602082200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff93909316929092179091558290609e90609d61214160018561506a565b8154811061215157612151615010565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205561218d82600161507d565b609e5f609d85815481106121a3576121a3615010565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902055505b806121e08161518f565b915050611f1e565b505b6097545f9060ff166121fc575f61220f565b6122046134fa565b61220f90600161507d565b73ffffffffffffffffffffffffffffffffffffffff86165f81815260a36020908152604080832033808552908352928190205481519081529182018990528181018590525193945090927fc4ad67bad2c1f682946a406d840f1b273f5cd5a53fcc1a03d078d92bfa2e07d09181900360600190a373ffffffffffffffffffffffffffffffffffffffff8581165f81815260a360209081526040808320338085528184528285205486865260a18552838620548287529290945282517fb809af0f000000000000000000000000000000000000000000000000000000008152600481019690965260248601526044850187905260648501839052608485015290881460a4840152517f00000000000000000000000000000000000000000000000000000000000000009093169263b809af0f9260c480820193929182900301818387803b15801561235d575f80fd5b505af115801561236f573d5f803e3d5ffd5b5050505061238461237d3390565b3086614313565b60975460ff1680156123975750609b5482115b80156123c9575060995473ffffffffffffffffffffffffffffffffffffffff86165f908152609e602052604090205411155b156123d6576123d6613eb6565b5050610d586001606555565b6123ea61405d565b60975460ff1615612457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f72657761726420616c726561647920737461727465640000000000000000000060448201526064016108ac565b4281118015612470575061246e62015180826151f0565b155b801561247e57506098548114155b6124e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f696e76616c6964207265776172642073746172742074696d650000000000000060448201526064016108ac565b609880549082905560408051828152602081018490527f91c38708087fb4ba51bd0e6a106cc1fbaf340479a2e81d18f2341e8c78f97555910160405180910390a15050565b609d546060905f9067ffffffffffffffff81111561254957612549615117565b60405190808252806020026020018201604052801561259557816020015b60408051606080820183525f8083526020830152918101919091528152602001906001900390816125675790505b5090505f5b609d54811015612780576040518060600160405280609f5f609d85815481106125c5576125c5615010565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff90811684528382019490945260409092018120549092168352609d80549390910192609f9291908690811061261e5761261e615010565b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101548152602001609f5f609d858154811061269e5761269e615010565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902060020180546126dc90615144565b80601f016020809104026020016040519081016040528092919081815260200182805461270890615144565b80156127535780601f1061272a57610100808354040283529160200191612753565b820191905f5260205f20905b81548152906001019060200180831161273657829003601f168201915b505050505081525082828151811061276d5761276d615010565b602090810291909101015260010161259a565b50919050565b5f54610100900460ff16158080156127a457505f54600160ff909116105b806127bd5750303b1580156127bd57505f5460ff166001145b612849576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016108ac565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156128a5575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff8716612922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c6964206f776e65722061646472657373000000000000000000000060448201526064016108ac565b5f86116129b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f73657175656e6365727353697a65206d7573742067726561746572207468616e60448201527f203000000000000000000000000000000000000000000000000000000000000060648201526084016108ac565b5f8511612a1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f696e76616c696420756e64656c65676174654c6f636b45706f6368730000000060448201526064016108ac565b4284118015612a335750612a3162015180856151f0565b155b612a99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f696e76616c6964207265776172642073746172742074696d650000000000000060448201526064016108ac565b81612b00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f696e76616c696420696e697469616c207374616b65727300000000000000000060448201526064016108ac565b612b09876145c1565b612b11614637565b6099869055609a8590556098849055609b8290555f5b609b54811015612cb457838382818110612b4357612b43615010565b9050602002810190612b559190615203565b609f5f868685818110612b6a57612b6a615010565b9050602002810190612b7c9190615203565b612b8a906020810190614bd5565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f20612bb982826152e4565b905050609d848483818110612bd057612bd0615010565b9050602002810190612be29190615203565b612bf0906020810190614bd5565b8154600180820184555f93845260209093200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055612c5190829061507d565b609e5f868685818110612c6657612c66615010565b9050602002810190612c789190615203565b612c86906020810190614bd5565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f2055600101612b27565b50604080515f8152602081018890527f98b982a120d9be7d9c68d85a1aed8158d1d52e517175bfb3eb4280692f19b1ed910160405180910390a1604080515f8152602081018690527f91c38708087fb4ba51bd0e6a106cc1fbaf340479a2e81d18f2341e8c78f97555910160405180910390a18015612d89575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b609d8181548110612da1575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016148015612ee357507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ea7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ecb9190614ff5565b73ffffffffffffffffffffffffffffffffffffffff16145b612f6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f7374616b696e673a206f6e6c79206f74686572207374616b696e6720636f6e7460448201527f7261637420616c6c6f776564000000000000000000000000000000000000000060648201526084016108ac565b609e5f612f7f6020840184614bd5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20545f0361306057609d612fce6020830183614bd5565b81546001810183555f928352602080842090910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9390931692909217909155609d5491609e9161303990850185614bd5565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f20555b80609f5f6130716020840184614bd5565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f206130a082826152e4565b506130b090506020820182614bd5565b73ffffffffffffffffffffffffffffffffffffffff167f058ecb29c230cd5df283c89e996187ed521393fe4546cd1b097921c4b2de293d60208301356130f9604085018561523f565b604051613108939291906154a1565b60405180910390a260975460ff161580156131275750609954609d5411155b15611bcc57611bcc613eb6565b61313c61405d565b6131455f6145c1565b565b61314f61405d565b6098544210156131e0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f63616e2774207374617274206265666f7265207265776172642073746172742060448201527f74696d650000000000000000000000000000000000000000000000000000000060648201526084016108ac565b5f609c541161324b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f6e6f6e652063616e64696461746500000000000000000000000000000000000060448201526064016108ac565b609780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091555b609d5481101561348a575f5b818110156134815760a15f609d83815481106132a4576132a4615010565b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460a15f609d858154811061331c5761331c615010565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040019020541115613479575f609d828154811061336757613367615010565b5f91825260209091200154609d805473ffffffffffffffffffffffffffffffffffffffff909216925090849081106133a1576133a1615010565b5f91825260209091200154609d805473ffffffffffffffffffffffffffffffffffffffff90921691849081106133d9576133d9615010565b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080609d848154811061343257613432615010565b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b600101613286565b5060010161327a565b505f5b609d548110156134f1576134a281600161507d565b609e5f609d84815481106134b8576134b8615010565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205560010161348d565b50613145613eb6565b5f609854421015613567576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f726577617264206973206e6f742073746172746564207965740000000000000060448201526064016108ac565b6201518060985442613579919061506a565b61358391906154f4565b905090565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260a3602090815260408083203384529091528120541515610702565b609f6020525f908152604090208054600182015460028301805473ffffffffffffffffffffffffffffffffffffffff9093169391926135fd90615144565b80601f016020809104026020016040519081016040528092919081815260200182805461362990615144565b80156136745780601f1061364b57610100808354040283529160200191613674565b820191905f5260205f20905b81548152906001019060200180831161365757829003601f168201915b5050505050905083565b5f60605f84116136ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f696e76616c696420706167652073697a6500000000000000000000000000000060448201526064016108ac565b73ffffffffffffffffffffffffffffffffffffffff85165f90815260a26020526040902061371790613ead565b91508367ffffffffffffffff81111561373257613732615117565b60405190808252806020026020018201604052801561375b578160200160208202803683370190505b5090505f6137698486615507565b90505f6001613778868261507d565b6137829088615507565b61378c919061506a565b905061379960018561506a565b8111156137ae576137ab60018561506a565b90505b815b81811161382e5773ffffffffffffffffffffffffffffffffffffffff88165f90815260a2602052604090206137e590826146d5565b8482815181106137f7576137f7615010565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152806138268161551e565b9150506137b0565b505050935093915050565b6138416140de565b335f90815260a46020526040812054815b81811015613c015760975460ff1615806138a2575061386f6134fa565b335f90815260a46020526040902080548390811061388f5761388f615010565b905f5260205f2090600302016002015411155b15613bef57335f90815260a4602052604090208054829081106138c7576138c7615010565b905f5260205f20906003020160010154836138e2919061507d565b335f90815260a460205260408120805492955090918390811061390757613907615010565b5f918252602082206003909102015473ffffffffffffffffffffffffffffffffffffffff16915060a4816139383390565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20838154811061398257613982615010565b905f5260205f2090600302016002015490505f60a45f61399f3390565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2084815481106139e9576139e9615010565b905f5260205f209060030201600101549050600185613a08919061506a565b841015613aff57335f90815260a460205260409020613a2860018761506a565b81548110613a3857613a38615010565b905f5260205f20906003020160a45f613a4e3390565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208581548110613a9857613a98615010565b5f9182526020909120825460039092020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091178155600180830154908201556002918201549101555b335f90815260a460205260409020805480613b1c57613b1c615090565b5f8281526020812060037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019283020180547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560018181018390556002909101919091559155613b91908661506a565b6040805184815260208101849052919650339173ffffffffffffffffffffffffffffffffffffffff8616917f921046659ea3b3b3f8e8fefd2bece3121b2d929ead94c696a75beedee477fdb6910160405180910390a3505050613852565b613bfa81600161507d565b9050613852565b505f8211613c6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f6e6f204d6f72706820746f6b656e20746f20636c61696d00000000000000000060448201526064016108ac565b613c7533836146e0565b50506131456001606555565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260a460209081526040808320805482518185028101850190935280835260609492939192909184015b82821015613d26575f8481526020908190206040805160608101825260038602909201805473ffffffffffffffffffffffffffffffffffffffff16835260018082015484860152600290910154918301919091529083529092019101613cc5565b505050509050919050565b613d3961405d565b73ffffffffffffffffffffffffffffffffffffffff8116613ddc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108ac565b611bcc816145c1565b613ded6140de565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663ac2ac640336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024015f604051808303815f87803b158015613e8d575f80fd5b505af1158015613e9f573d5f803e3d5ffd5b505050506131456001606555565b5f610702825490565b60995460975460ff1615613eda57609954609c541015613ed55750609c545b613eeb565b609954609d541015613eeb5750609d545b5f8167ffffffffffffffff811115613f0557613f05615117565b604051908082528060200260200182016040528015613f2e578160200160208202803683370190505b5090505f5b82811015613fb557609d8181548110613f4e57613f4e615010565b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828281518110613f8857613f88615010565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152600101613f33565b506040517f9b8201a400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639b8201a490614028908490600401615555565b5f604051808303815f87803b15801561403f575f80fd5b505af1158015614051573d5f803e3d5ffd5b50509151609b55505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314613145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ac565b60026065540361414a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108ac565b6002606555565b6001606555565b5f6141798373ffffffffffffffffffffffffffffffffffffffff841661497f565b9392505050565b5f805b73ffffffffffffffffffffffffffffffffffffffff84165f90815260a460205260409020548110156142275773ffffffffffffffffffffffffffffffffffffffff8481165f90815260a460205260409020805491851691839081106141ea576141ea615010565b5f91825260209091206003909102015473ffffffffffffffffffffffffffffffffffffffff160361421f576001915050610702565b600101614183565b505f9392505050565b6040517fde6ac93300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015282811660248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063de6ac93390604401602060405180830381865afa1580156142c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142ea9190615567565b159392505050565b5f6141798373ffffffffffffffffffffffffffffffffffffffff8416614a62565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa1580156143a1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143c59190615586565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528581166024830152604482018590529192507f0000000000000000000000000000000000000000000000000000000000000000909116906323b872dd906064016020604051808303815f875af1158015614464573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144889190615567565b506040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015614517573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061453b9190615586565b90505f83118015614554575082614552838361506a565b145b6145ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6d6f72706820746f6b656e207472616e73666572206661696c6564000000000060448201526064016108ac565b5050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff166146cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108ac565b613145614aae565b5f6141798383614b44565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa15801561476e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147929190615586565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303815f875af1158015614829573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061484d9190615567565b506040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa1580156148dc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906149009190615586565b90505f83118015614919575082614917838361506a565b145b610e84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6d6f72706820746f6b656e207472616e73666572206661696c6564000000000060448201526064016108ac565b5f8181526001830160205260408120548015614a59575f6149a160018361506a565b85549091505f906149b49060019061506a565b9050818114614a13575f865f0182815481106149d2576149d2615010565b905f5260205f200154905080875f0184815481106149f2576149f2615010565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080614a2457614a24615090565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610702565b5f915050610702565b5f818152600183016020526040812054614aa757508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610702565b505f610702565b5f54610100900460ff16614151576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108ac565b5f825f018281548110614b5957614b59615010565b905f5260205f200154905092915050565b508054614b7690615144565b5f825580601f10614b85575050565b601f0160209004905f5260205f2090810190611bcc91905b80821115614bb0575f8155600101614b9d565b5090565b73ffffffffffffffffffffffffffffffffffffffff81168114611bcc575f80fd5b5f60208284031215614be5575f80fd5b813561417981614bb4565b5f8083601f840112614c00575f80fd5b50813567ffffffffffffffff811115614c17575f80fd5b6020830191508360208260051b8501011115614c31575f80fd5b9250929050565b5f8060208385031215614c49575f80fd5b823567ffffffffffffffff811115614c5f575f80fd5b614c6b85828601614bf0565b90969095509350505050565b5f60208284031215614c87575f80fd5b5035919050565b5f8060408385031215614c9f575f80fd5b8235614caa81614bb4565b946020939093013593505050565b5f81518084525f5b81811015614cdc57602081850181015186830182015201614cc0565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b83811015614dbe578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00185528151805173ffffffffffffffffffffffffffffffffffffffff16845287810151888501528601516060878501819052614daa81860183614cb8565b968901969450505090860190600101614d40565b509098975050505050505050565b5f805f805f8060a08789031215614de1575f80fd5b8635614dec81614bb4565b9550602087013594506040870135935060608701359250608087013567ffffffffffffffff811115614e1c575f80fd5b614e2889828a01614bf0565b979a9699509497509295939492505050565b5f60208284031215614e4a575f80fd5b813567ffffffffffffffff811115614e60575f80fd5b820160608185031215614179575f80fd5b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f614ea56060830184614cb8565b95945050505050565b5f8060408385031215614ebf575f80fd5b8235614eca81614bb4565b91506020830135614eda81614bb4565b809150509250929050565b5f805f60608486031215614ef7575f80fd5b8335614f0281614bb4565b95602085013595506040909401359392505050565b5f815180845260208085019450602084015f5b83811015614f5c57815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101614f2a565b509495945050505050565b828152604060208201525f614f7f6040830184614f17565b949350505050565b602080825282518282018190525f919060409081850190868401855b82811015614fe8578151805173ffffffffffffffffffffffffffffffffffffffff16855286810151878601528501518585015260609093019290850190600101614fa3565b5091979650505050505050565b5f60208284031215615005575f80fd5b815161417981614bb4565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b818103818111156107025761070261503d565b808201808211156107025761070261503d565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b60208082528181018390525f908460408401835b8681101561510c5782356150e481614bb4565b73ffffffffffffffffffffffffffffffffffffffff16825291830191908301906001016150d1565b509695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b600181811c9082168061515857607f821691505b602082108103612780577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f8161519d5761519d61503d565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f826151fe576151fe6151c3565b500690565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112615235575f80fd5b9190910192915050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615272575f80fd5b83018035915067ffffffffffffffff82111561528c575f80fd5b602001915036819003821315614c31575f80fd5b601f821115610d5857805f5260205f20601f840160051c810160208510156152c55750805b601f840160051c820191505b818110156145ba575f81556001016152d1565b81356152ef81614bb4565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550600160208084013560018401556002830160408501357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1863603018112615373575f80fd5b8501803567ffffffffffffffff81111561538b575f80fd5b803603848301131561539b575f80fd5b6153af816153a98554615144565b856152a0565b5f601f821160018114615401575f83156153cb57508382018601355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600385901b1c1916600184901b178555615496565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08516915b8281101561544d5786850189013582559388019390890190880161542e565b508482101561548a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88660031b161c198885880101351681555b505060018360011b0185555b505050505050505050565b83815260406020820152816040820152818360608301375f818301606090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010192915050565b5f82615502576155026151c3565b500490565b80820281158282048414176107025761070261503d565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361554e5761554e61503d565b5060010190565b602081525f6141796020830184614f17565b5f60208284031215615577575f80fd5b81518015158114614179575f80fd5b5f60208284031215615596575f80fd5b505191905056fea164736f6c6343000818000a" +var L2StakingDeployedBin = "0x608060405234801561000f575f80fd5b50600436106102ec575f3560e01c8063746c8ae111610192578063affed0e0116100e8578063e10911b111610093578063f2fde38b1161006e578063f2fde38b146106f6578063fad99f9814610709578063fc6facc614610711575f80fd5b8063e10911b1146106c5578063ed70b343146106cd578063f0261bc2146106ed575f80fd5b8063cce6cf9f116100c3578063cce6cf9f1461066a578063d31d83d91461067d578063d55771411461069e575f80fd5b8063affed0e014610618578063b5d2e0dc14610621578063c64814dd14610640575f80fd5b80638da5cb5b1161014857806391bd43a41161012357806391bd43a4146105c5578063927ede2d146105e457806396ab994d1461060b575f80fd5b80638da5cb5b1461055e5780638e21d5fb1461057c5780639168ae72146105a3575f80fd5b80637b05afb5116101785780637b05afb5146104f5578063831cfb581461051457806384d7d1d41461053b575f80fd5b8063746c8ae1146104e557806376671808146104ed575f80fd5b80633b8024211161024757806343352d61116101fd57806346cdc18a116101d857806346cdc18a146104c25780637046529b146104ca578063715018a6146104dd575f80fd5b806343352d6114610494578063439162b51461049c578063459598a2146104af575f80fd5b80633cb747bf1161022d5780633cb747bf146104135780633d9353fe1461045a57806340b5c83714610481575f80fd5b80633b802421146103f75780633c323a1b14610400575f80fd5b8063174e31c4116102a75780632e787be3116102825780632e787be3146103bb57806330158eea146103c45780633385ccc2146103e4575f80fd5b8063174e31c41461038c57806319fac8fd1461039f5780632cc138be146103b2575f80fd5b80630eb573af116102d75780630eb573af1461032b5780630f3b70591461033e57806312a3e94714610383575f80fd5b806243b758146102f05780629c6f0c14610316575b5f80fd5b6103036102fe3660046152e8565b610724565b6040519081526020015b60405180910390f35b610329610324366004615303565b610757565b005b61032961033936600461534d565b6109a8565b61035161034c366004615364565b610ad5565b6040805173ffffffffffffffffffffffffffffffffffffffff909416845260208401929092529082015260600161030d565b610303609a5481565b61032961039a366004615364565b610b2a565b6103296103ad36600461534d565b610ce3565b61030360985481565b61030360995481565b6103d76103d23660046153d6565b610e39565b60405161030d9190615476565b6103296103f23660046152e8565b6110a1565b610303609c5481565b61032961040e366004615364565b61181a565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161030d565b6104357f000000000000000000000000000000000000000000000000000000000000000081565b61032961048f36600461534d565b61202d565b6103d7612174565b6103296104aa366004615529565b6123d1565b6104356104bd36600461534d565b6129dd565b609d54610303565b6103296104d8366004615303565b612a12565b610329612bba565b610329612bcd565b610303612f80565b6103036105033660046152e8565b60a06020525f908152604090205481565b6104357f000000000000000000000000000000000000000000000000000000000000000081565b61054e6105493660046152e8565b61300e565b604051901515815260200161030d565b60335473ffffffffffffffffffffffffffffffffffffffff16610435565b6104357f000000000000000000000000000000000000000000000000000000000000000081565b6105b66105b13660046152e8565b613045565b60405161030d93929190615597565b6103036105d33660046152e8565b60a16020525f908152604090205481565b6104357f000000000000000000000000000000000000000000000000000000000000000081565b60975461054e9060ff1681565b61030360a55481565b61030361062f3660046152e8565b609e6020525f908152604090205481565b61030361064e3660046155d4565b60a360209081525f928352604080842090915290825290205481565b610329610678366004615600565b613104565b61069061068b366004615648565b6137d0565b60405161030d9291906156ca565b6104357f000000000000000000000000000000000000000000000000000000000000000081565b6103296139ac565b6106e06106db3660046152e8565b613df4565b60405161030d91906156ea565b610303609b5481565b6103296107043660046152e8565b613ea4565b610329613f58565b61032961071f366004615600565b614020565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260a260205260408120610751906144fd565b92915050565b61075f614506565b8160a55481146107d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f696e76616c6964206e6f6e63650000000000000000000000000000000000000060448201526064015b60405180910390fd5b6107db836001615785565b60a555609e5f6107ee60208501856152e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20545f036108cf57609d61083d60208401846152e8565b81546001810183555f928352602080842090910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9390931692909217909155609d5491609e916108a8908601866152e8565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f20555b81609f5f6108e060208401846152e8565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f2061090f82826158b5565b5061091f905060208301836152e8565b73ffffffffffffffffffffffffffffffffffffffff167f058ecb29c230cd5df283c89e996187ed521393fe4546cd1b097921c4b2de293d60208401356109686040860186615798565b60405161097793929190615a72565b60405180910390a260975460ff161580156109965750609954609d5411155b156109a3576109a3614587565b505050565b6109b0614506565b5f811180156109c157506099548114155b610a4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f696e76616c6964206e65772073657175656e63657220736574206d617820736960448201527f7a6500000000000000000000000000000000000000000000000000000000000060648201526084016107c7565b609980549082905560408051828152602081018490527f98b982a120d9be7d9c68d85a1aed8158d1d52e517175bfb3eb4280692f19b1ed910160405180910390a16097545f9060ff16610aa257609d54610aa6565b609c545b90505f6099548210610aba57609954610abc565b815b9050609b548114610acf57610acf614587565b50505050565b60a4602052815f5260405f208181548110610aee575f80fd5b5f91825260209091206003909102018054600182015460029092015473ffffffffffffffffffffffffffffffffffffffff909116935090915083565b610b3261472e565b73ffffffffffffffffffffffffffffffffffffffff8216610c0f5773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016635cf20c7b336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018490526044015f604051808303815f87803b158015610bf4575f80fd5b505af1158015610c06573d5f803e3d5ffd5b50505050610cd5565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663996cba6883336040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff928316600482015291166024820152604481018490526064015f604051808303815f87803b158015610cbe575f80fd5b505af1158015610cd0573d5f803e3d5ffd5b505050505b610cdf6001606555565b5050565b335f908152609e6020526040902054610d58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f6f6e6c79207374616b657220616c6c6f7765640000000000000000000000000060448201526064016107c7565b6014811115610dc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e76616c696420636f6d6d697373696f6e000000000000000000000000000060448201526064016107c7565b335f90815260a06020526040812082905560975460ff16610de4575f610df7565b610dec612f80565b610df7906001615785565b604080518481526020810183905291925033917f6e500db30ce535d38852e318f333e9be41a3fec6c65d234ebb06203c896db9a5910160405180910390a25050565b60605f8267ffffffffffffffff811115610e5557610e556157f9565b604051908082528060200260200182016040528015610ea157816020015b60408051606080820183525f808352602083015291810191909152815260200190600190039081610e735790505b5090505f5b83811015611099576040518060600160405280609f5f888886818110610ece57610ece615ac5565b9050602002016020810190610ee391906152e8565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409091015f908120549091168352910190609f90888886818110610f2d57610f2d615ac5565b9050602002016020810190610f4291906152e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101548152602001609f5f888886818110610f9957610f99615ac5565b9050602002016020810190610fae91906152e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002018054610ff590615826565b80601f016020809104026020016040519081016040528092919081815260200182805461102190615826565b801561106c5780601f106110435761010080835404028352916020019161106c565b820191905f5260205f20905b81548152906001019060200180831161104f57829003601f168201915b505050505081525082828151811061108657611086615ac5565b6020908102919091010152600101610ea6565b509392505050565b6110a961472e565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260a36020908152604080832033845290915290205461113f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f7374616b696e6720616d6f756e74206973207a65726f0000000000000000000060448201526064016107c7565b73ffffffffffffffffffffffffffffffffffffffff81165f908152609e60205260408120546097549015919060ff16611178575f61118b565b611180612f80565b61118b906001615785565b6097549091505f9060ff1680156111a0575082155b6111aa57816111b7565b609a546111b79083615785565b6040805160608101825273ffffffffffffffffffffffffffffffffffffffff8781168083525f81815260a36020908152858220338084528183528784208054848901908152888a018b815283875260a486528a87208054600180820183559189528789208c5160039092020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001691909b16178a558251908a015551600290980197909755908452908252829055925191815260a190925292812080549495509193611286908490615af2565b909155505073ffffffffffffffffffffffffffffffffffffffff85165f90815260a2602052604090206112b990336147a8565b5073ffffffffffffffffffffffffffffffffffffffff85165f908152609e6020526040902054841580156112ef575060975460ff165b80156112fc5750609c5481105b156115e85773ffffffffffffffffffffffffffffffffffffffff86165f908152609e602052604081205461133290600190615af2565b90505b6001609c546113449190615af2565b8110156115e65760a15f609d838154811061136157611361615ac5565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040018120549060a190609d6113a3856001615785565b815481106113b3576113b3615ac5565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205411156115de575f609d82815481106113fe576113fe615ac5565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff169050609d61142e836001615785565b8154811061143e5761143e615ac5565b5f91825260209091200154609d805473ffffffffffffffffffffffffffffffffffffffff909216918490811061147657611476615ac5565b5f91825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905580609d6114d1846001615785565b815481106114e1576114e1615ac5565b5f91825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055611539826001615785565b609e5f609d858154811061154f5761154f615ac5565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205561158b826002615785565b609e5f609d61159b866001615785565b815481106115ab576115ab615ac5565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902055505b600101611335565b505b84158015611618575073ffffffffffffffffffffffffffffffffffffffff86165f90815260a16020526040902054155b15611635576001609c5f82825461162f9190615af2565b90915550505b73ffffffffffffffffffffffffffffffffffffffff8681165f81815260a160205260408082205481517f7f683ee30000000000000000000000000000000000000000000000000000000081526004810194909452336024850152604484018990526064840152517f000000000000000000000000000000000000000000000000000000000000000090931692637f683ee392608480820193929182900301818387803b1580156116e3575f80fd5b505af11580156116f5573d5f803e3d5ffd5b505050506117003390565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f92039db29d8c0a1aa1433fe109c69488c8c5e51b23c9de7d303ad80c1fef778c84602001518787604051611775939291909283526020830191909152604082015260600190565b60405180910390a38415801561178d575060975460ff165b801561179b5750609b548111155b80156117fb5750609b5473ffffffffffffffffffffffffffffffffffffffff87165f908152609e602052604090205411806117fb5750609c5473ffffffffffffffffffffffffffffffffffffffff87165f908152609e6020526040902054115b1561180857611808614587565b50505050506118176001606555565b50565b73ffffffffffffffffffffffffffffffffffffffff82165f908152609e602052604090205482906118a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b65720000000000000000000000000000000000000000000060448201526064016107c7565b6118af61472e565b5f8211611918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e76616c6964207374616b6520616d6f756e7400000000000000000000000060448201526064016107c7565b61192233846147d0565b15611989576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f756e64656c65676174696f6e20756e636c61696d65640000000000000000000060448201526064016107c7565b73ffffffffffffffffffffffffffffffffffffffff83165f90815260a360209081526040808320338452909152902054611a2e576119c73384614880565b15611a2e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f72657761726420756e636c61696d65640000000000000000000000000000000060448201526064016107c7565b73ffffffffffffffffffffffffffffffffffffffff83165f90815260a1602052604081208054849290611a62908490615785565b909155505073ffffffffffffffffffffffffffffffffffffffff83165f90815260a36020908152604080832033845290915281208054849290611aa6908490615785565b909155505073ffffffffffffffffffffffffffffffffffffffff83165f90815260a260205260409020611ad99033614942565b5073ffffffffffffffffffffffffffffffffffffffff83165f90815260a16020526040902054829003611b1e576001609c5f828254611b189190615785565b90915550505b73ffffffffffffffffffffffffffffffffffffffff83165f908152609e602052604090205460975460ff168015611b555750600181115b15611e35575f611b66600183615af2565b90505b8015611e335760a15f609d611b7f600185615af2565b81548110611b8f57611b8f615ac5565b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460a15f609d8481548110611c0757611c07615ac5565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040019020541115611e21575f609d611c4c600184615af2565b81548110611c5c57611c5c615ac5565b5f91825260209091200154609d805473ffffffffffffffffffffffffffffffffffffffff90921692509083908110611c9657611c96615ac5565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16609d611cc4600185615af2565b81548110611cd457611cd4615ac5565b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080609d8381548110611d2d57611d2d615ac5565b5f918252602082200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff93909316929092179091558290609e90609d611d8c600185615af2565b81548110611d9c57611d9c615ac5565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902055611dd8826001615785565b609e5f609d8581548110611dee57611dee615ac5565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902055505b80611e2b81615b05565b915050611b69565b505b6097545f9060ff16611e47575f611e5a565b611e4f612f80565b611e5a906001615785565b73ffffffffffffffffffffffffffffffffffffffff86165f81815260a36020908152604080832033808552908352928190205481519081529182018990528181018590525193945090927fc4ad67bad2c1f682946a406d840f1b273f5cd5a53fcc1a03d078d92bfa2e07d09181900360600190a373ffffffffffffffffffffffffffffffffffffffff8581165f81815260a360209081526040808320338085528184528285205486865260a18552838620548287529290945282517fb809af0f000000000000000000000000000000000000000000000000000000008152600481019690965260248601526044850187905260648501839052608485015290881460a4840152517f00000000000000000000000000000000000000000000000000000000000000009093169263b809af0f9260c480820193929182900301818387803b158015611fa8575f80fd5b505af1158015611fba573d5f803e3d5ffd5b50505050611fcf611fc83390565b3086614963565b60975460ff168015611fe25750609b5482115b8015612014575060995473ffffffffffffffffffffffffffffffffffffffff86165f908152609e602052604090205411155b1561202157612021614587565b50506109a36001606555565b612035614506565b60975460ff16156120a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f72657761726420616c726561647920737461727465640000000000000000000060448201526064016107c7565b42811180156120bb57506120b96201518082615b66565b155b80156120c957506098548114155b61212f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f696e76616c6964207265776172642073746172742074696d650000000000000060448201526064016107c7565b609880549082905560408051828152602081018490527f91c38708087fb4ba51bd0e6a106cc1fbaf340479a2e81d18f2341e8c78f97555910160405180910390a15050565b609d546060905f9067ffffffffffffffff811115612194576121946157f9565b6040519080825280602002602001820160405280156121e057816020015b60408051606080820183525f8083526020830152918101919091528152602001906001900390816121b25790505b5090505f5b609d548110156123cb576040518060600160405280609f5f609d858154811061221057612210615ac5565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff90811684528382019490945260409092018120549092168352609d80549390910192609f9291908690811061226957612269615ac5565b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101548152602001609f5f609d85815481106122e9576122e9615ac5565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040019020600201805461232790615826565b80601f016020809104026020016040519081016040528092919081815260200182805461235390615826565b801561239e5780601f106123755761010080835404028352916020019161239e565b820191905f5260205f20905b81548152906001019060200180831161238157829003601f168201915b50505050508152508282815181106123b8576123b8615ac5565b60209081029190910101526001016121e5565b50919050565b5f54610100900460ff16158080156123ef57505f54600160ff909116105b806124085750303b15801561240857505f5460ff166001145b612494576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016107c7565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156124f0575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff871661256d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c6964206f776e65722061646472657373000000000000000000000060448201526064016107c7565b5f86116125fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f73657175656e6365727353697a65206d7573742067726561746572207468616e60448201527f203000000000000000000000000000000000000000000000000000000000000060648201526084016107c7565b5f8511612665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f696e76616c696420756e64656c65676174654c6f636b45706f6368730000000060448201526064016107c7565b428411801561267e575061267c6201518085615b66565b155b6126e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f696e76616c6964207265776172642073746172742074696d650000000000000060448201526064016107c7565b8161274b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f696e76616c696420696e697469616c207374616b65727300000000000000000060448201526064016107c7565b61275487614c6f565b61275c614ce5565b6099869055609a8590556098849055609b8290555f5b609b548110156128ff5783838281811061278e5761278e615ac5565b90506020028101906127a09190615b79565b609f5f8686858181106127b5576127b5615ac5565b90506020028101906127c79190615b79565b6127d59060208101906152e8565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f2061280482826158b5565b905050609d84848381811061281b5761281b615ac5565b905060200281019061282d9190615b79565b61283b9060208101906152e8565b8154600180820184555f93845260209093200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905561289c908290615785565b609e5f8686858181106128b1576128b1615ac5565b90506020028101906128c39190615b79565b6128d19060208101906152e8565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f2055600101612772565b50604080515f8152602081018890527f98b982a120d9be7d9c68d85a1aed8158d1d52e517175bfb3eb4280692f19b1ed910160405180910390a1604080515f8152602081018690527f91c38708087fb4ba51bd0e6a106cc1fbaf340479a2e81d18f2341e8c78f97555910160405180910390a180156129d4575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b609d81815481106129ec575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016148015612b2e57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015612af2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b169190615bb5565b73ffffffffffffffffffffffffffffffffffffffff16145b61075f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f7374616b696e673a206f6e6c79206f74686572207374616b696e6720636f6e7460448201527f7261637420616c6c6f776564000000000000000000000000000000000000000060648201526084016107c7565b612bc2614506565b612bcb5f614c6f565b565b612bd5614506565b609854421015612c66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f63616e2774207374617274206265666f7265207265776172642073746172742060448201527f74696d650000000000000000000000000000000000000000000000000000000060648201526084016107c7565b5f609c5411612cd1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f6e6f6e652063616e64696461746500000000000000000000000000000000000060448201526064016107c7565b609780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091555b609d54811015612f10575f5b81811015612f075760a15f609d8381548110612d2a57612d2a615ac5565b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460a15f609d8581548110612da257612da2615ac5565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040019020541115612eff575f609d8281548110612ded57612ded615ac5565b5f91825260209091200154609d805473ffffffffffffffffffffffffffffffffffffffff90921692509084908110612e2757612e27615ac5565b5f91825260209091200154609d805473ffffffffffffffffffffffffffffffffffffffff9092169184908110612e5f57612e5f615ac5565b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080609d8481548110612eb857612eb8615ac5565b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b600101612d0c565b50600101612d00565b505f5b609d54811015612f7757612f28816001615785565b609e5f609d8481548110612f3e57612f3e615ac5565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902055600101612f13565b50612bcb614587565b5f609854421015612fed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f726577617264206973206e6f742073746172746564207965740000000000000060448201526064016107c7565b6201518060985442612fff9190615af2565b6130099190615bd0565b905090565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260a3602090815260408083203384529091528120541515610751565b609f6020525f908152604090208054600182015460028301805473ffffffffffffffffffffffffffffffffffffffff90931693919261308390615826565b80601f01602080910402602001604051908101604052809291908181526020018280546130af90615826565b80156130fa5780601f106130d1576101008083540402835291602001916130fa565b820191905f5260205f20905b8154815290600101906020018083116130dd57829003601f168201915b5050505050905083565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614801561322057507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131e4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132089190615bb5565b73ffffffffffffffffffffffffffffffffffffffff16145b6132ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f7374616b696e673a206f6e6c79206f74686572207374616b696e6720636f6e7460448201527f7261637420616c6c6f776564000000000000000000000000000000000000000060648201526084016107c7565b8260a5548114613318576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f696e76616c6964206e6f6e63650000000000000000000000000000000000000060448201526064016107c7565b613323846001615785565b60a5555f805b8381101561378157609b54609e5f87878581811061334957613349615ac5565b905060200201602081019061335e91906152e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054116133a257600191505b5f609e5f8787858181106133b8576133b8615ac5565b90506020020160208101906133cd91906152e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205411156136eb575f6001609e5f88888681811061342557613425615ac5565b905060200201602081019061343a91906152e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461347e9190615af2565b90505b609d5461349090600190615af2565b81101561359657609d6134a4826001615785565b815481106134b4576134b4615ac5565b5f91825260209091200154609d805473ffffffffffffffffffffffffffffffffffffffff90921691839081106134ec576134ec615ac5565b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001609e5f609d848154811061354957613549615ac5565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400181208054909190613589908490615af2565b9091555050600101613481565b50609d8054806135a8576135a8615be3565b5f8281526020812082017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055909101909155609e9086868481811061361757613617615ac5565b905060200201602081019061362c91906152e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f90555f60a15f87878581811061367e5761367e615ac5565b905060200201602081019061369391906152e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205411156136eb576001609c5f8282546136e59190615af2565b90915550505b609f5f86868481811061370057613700615ac5565b905060200201602081019061371591906152e8565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f90812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001681556001810182905590613777600283018261527d565b5050600101613329565b507f3511bf213f9290ba907e91e12a43e8471251e1879580ae5509292a3514c23f6184846040516137b3929190615c10565b60405180910390a180156137c9576137c9614587565b5050505050565b5f60605f841161383c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f696e76616c696420706167652073697a6500000000000000000000000000000060448201526064016107c7565b73ffffffffffffffffffffffffffffffffffffffff85165f90815260a260205260409020613869906144fd565b91508367ffffffffffffffff811115613884576138846157f9565b6040519080825280602002602001820160405280156138ad578160200160208202803683370190505b5090505f6138bb8486615c6a565b90505f60016138ca8682615785565b6138d49088615c6a565b6138de9190615af2565b90506138eb600185615af2565b811115613900576138fd600185615af2565b90505b815f5b8282116139a0576139448261391781615c81565b73ffffffffffffffffffffffffffffffffffffffff8c165f90815260a26020526040902090945090614d83565b858261394f81615c81565b93508151811061396157613961615ac5565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613903565b50505050935093915050565b6139b461472e565b335f90815260a46020526040812054815b81811015613d745760975460ff161580613a1557506139e2612f80565b335f90815260a460205260409020805483908110613a0257613a02615ac5565b905f5260205f2090600302016002015411155b15613d6257335f90815260a460205260409020805482908110613a3a57613a3a615ac5565b905f5260205f2090600302016001015483613a559190615785565b335f90815260a4602052604081208054929550909183908110613a7a57613a7a615ac5565b5f918252602082206003909102015473ffffffffffffffffffffffffffffffffffffffff16915060a481613aab3390565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208381548110613af557613af5615ac5565b905f5260205f2090600302016002015490505f60a45f613b123390565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208481548110613b5c57613b5c615ac5565b905f5260205f209060030201600101549050600185613b7b9190615af2565b841015613c7257335f90815260a460205260409020613b9b600187615af2565b81548110613bab57613bab615ac5565b905f5260205f20906003020160a45f613bc13390565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208581548110613c0b57613c0b615ac5565b5f9182526020909120825460039092020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091178155600180830154908201556002918201549101555b335f90815260a460205260409020805480613c8f57613c8f615be3565b5f8281526020812060037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019283020180547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560018181018390556002909101919091559155613d049086615af2565b6040805184815260208101849052919650339173ffffffffffffffffffffffffffffffffffffffff8616917f921046659ea3b3b3f8e8fefd2bece3121b2d929ead94c696a75beedee477fdb6910160405180910390a35050506139c5565b613d6d816001615785565b90506139c5565b505f8211613dde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f6e6f204d6f72706820746f6b656e20746f20636c61696d00000000000000000060448201526064016107c7565b613de83383614d8e565b5050612bcb6001606555565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260a460209081526040808320805482518185028101850190935280835260609492939192909184015b82821015613e99575f8481526020908190206040805160608101825260038602909201805473ffffffffffffffffffffffffffffffffffffffff16835260018082015484860152600290910154918301919091529083529092019101613e38565b505050509050919050565b613eac614506565b73ffffffffffffffffffffffffffffffffffffffff8116613f4f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107c7565b61181781614c6f565b613f6061472e565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663ac2ac640336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024015f604051808303815f87803b158015614000575f80fd5b505af1158015614012573d5f803e3d5ffd5b50505050612bcb6001606555565b614028614506565b8260a5548114614094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f696e76616c6964206e6f6e63650000000000000000000000000000000000000060448201526064016107c7565b61409f846001615785565b60a5555f805b8381101561378157609b54609e5f8787858181106140c5576140c5615ac5565b90506020020160208101906140da91906152e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541161411e57600191505b5f609e5f87878581811061413457614134615ac5565b905060200201602081019061414991906152e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541115614467575f6001609e5f8888868181106141a1576141a1615ac5565b90506020020160208101906141b691906152e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546141fa9190615af2565b90505b609d5461420c90600190615af2565b81101561431257609d614220826001615785565b8154811061423057614230615ac5565b5f91825260209091200154609d805473ffffffffffffffffffffffffffffffffffffffff909216918390811061426857614268615ac5565b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001609e5f609d84815481106142c5576142c5615ac5565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400181208054909190614305908490615af2565b90915550506001016141fd565b50609d80548061432457614324615be3565b5f8281526020812082017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055909101909155609e9086868481811061439357614393615ac5565b90506020020160208101906143a891906152e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f90555f60a15f8787858181106143fa576143fa615ac5565b905060200201602081019061440f91906152e8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541115614467576001609c5f8282546144619190615af2565b90915550505b609f5f86868481811061447c5761447c615ac5565b905060200201602081019061449191906152e8565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f90812080547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560018101829055906144f3600283018261527d565b50506001016140a5565b5f610751825490565b60335473ffffffffffffffffffffffffffffffffffffffff163314612bcb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c7565b60995460975460ff16156145ab57609954609c5410156145a65750609c545b6145bc565b609954609d5410156145bc5750609d545b5f8167ffffffffffffffff8111156145d6576145d66157f9565b6040519080825280602002602001820160405280156145ff578160200160208202803683370190505b5090505f5b8281101561468657609d818154811061461f5761461f615ac5565b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682828151811061465957614659615ac5565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152600101614604565b506040517f9b8201a400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639b8201a4906146f9908490600401615cb8565b5f604051808303815f87803b158015614710575f80fd5b505af1158015614722573d5f803e3d5ffd5b50509151609b55505050565b60026065540361479a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107c7565b6002606555565b6001606555565b5f6147c98373ffffffffffffffffffffffffffffffffffffffff8416615092565b9392505050565b5f805b73ffffffffffffffffffffffffffffffffffffffff84165f90815260a460205260409020548110156148775773ffffffffffffffffffffffffffffffffffffffff8481165f90815260a4602052604090208054918516918390811061483a5761483a615ac5565b5f91825260209091206003909102015473ffffffffffffffffffffffffffffffffffffffff160361486f576001915050610751565b6001016147d3565b505f9392505050565b6040517fde6ac93300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015282811660248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063de6ac93390604401602060405180830381865afa158015614916573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061493a9190615cca565b159392505050565b5f6147c98373ffffffffffffffffffffffffffffffffffffffff8416615175565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa1580156149f1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a159190615ce9565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528581166024830152604482018590529192507f0000000000000000000000000000000000000000000000000000000000000000909116906323b872dd906064016020604051808303815f875af1158015614ab4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ad89190615cca565b614b3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f7472616e7366657246726f6d206661696c65640000000000000000000000000060448201526064016107c7565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015614bcc573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614bf09190615ce9565b90505f83118015614c09575082614c078383615af2565b145b6137c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6d6f72706820746f6b656e207472616e73666572206661696c6564000000000060448201526064016107c7565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff16614d7b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107c7565b612bcb6151c1565b5f6147c98383615257565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015614e1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614e409190615ce9565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303815f875af1158015614ed7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614efb9190615cca565b614f61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f7472616e73666572206661696c6564000000000000000000000000000000000060448201526064016107c7565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015614fef573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906150139190615ce9565b90505f8311801561502c57508261502a8383615af2565b145b610acf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6d6f72706820746f6b656e207472616e73666572206661696c6564000000000060448201526064016107c7565b5f818152600183016020526040812054801561516c575f6150b4600183615af2565b85549091505f906150c790600190615af2565b9050818114615126575f865f0182815481106150e5576150e5615ac5565b905f5260205f200154905080875f01848154811061510557615105615ac5565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061513757615137615be3565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610751565b5f915050610751565b5f8181526001830160205260408120546151ba57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610751565b505f610751565b5f54610100900460ff166147a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107c7565b5f825f01828154811061526c5761526c615ac5565b905f5260205f200154905092915050565b50805461528990615826565b5f825580601f10615298575050565b601f0160209004905f5260205f209081019061181791905b808211156152c3575f81556001016152b0565b5090565b73ffffffffffffffffffffffffffffffffffffffff81168114611817575f80fd5b5f602082840312156152f8575f80fd5b81356147c9816152c7565b5f8060408385031215615314575f80fd5b82359150602083013567ffffffffffffffff811115615331575f80fd5b830160608186031215615342575f80fd5b809150509250929050565b5f6020828403121561535d575f80fd5b5035919050565b5f8060408385031215615375575f80fd5b8235615380816152c7565b946020939093013593505050565b5f8083601f84011261539e575f80fd5b50813567ffffffffffffffff8111156153b5575f80fd5b6020830191508360208260051b85010111156153cf575f80fd5b9250929050565b5f80602083850312156153e7575f80fd5b823567ffffffffffffffff8111156153fd575f80fd5b6154098582860161538e565b90969095509350505050565b5f81518084525f5b818110156154395760208185018101518683018201520161541d565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b8381101561551b578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00185528151805173ffffffffffffffffffffffffffffffffffffffff1684528781015188850152860151606087850181905261550781860183615415565b96890196945050509086019060010161549d565b509098975050505050505050565b5f805f805f8060a0878903121561553e575f80fd5b8635615549816152c7565b9550602087013594506040870135935060608701359250608087013567ffffffffffffffff811115615579575f80fd5b61558589828a0161538e565b979a9699509497509295939492505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f6155cb6060830184615415565b95945050505050565b5f80604083850312156155e5575f80fd5b82356155f0816152c7565b91506020830135615342816152c7565b5f805f60408486031215615612575f80fd5b83359250602084013567ffffffffffffffff81111561562f575f80fd5b61563b8682870161538e565b9497909650939450505050565b5f805f6060848603121561565a575f80fd5b8335615665816152c7565b95602085013595506040909401359392505050565b5f815180845260208085019450602084015f5b838110156156bf57815173ffffffffffffffffffffffffffffffffffffffff168752958201959082019060010161568d565b509495945050505050565b828152604060208201525f6156e2604083018461567a565b949350505050565b602080825282518282018190525f919060409081850190868401855b8281101561574b578151805173ffffffffffffffffffffffffffffffffffffffff16855286810151878601528501518585015260609093019290850190600101615706565b5091979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561075157610751615758565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe18436030181126157cb575f80fd5b83018035915067ffffffffffffffff8211156157e5575f80fd5b6020019150368190038213156153cf575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b600181811c9082168061583a57607f821691505b6020821081036123cb577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b601f8211156109a357805f5260205f20601f840160051c810160208510156158965750805b601f840160051c820191505b818110156137c9575f81556001016158a2565b81356158c0816152c7565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550600160208084013560018401556002830160408501357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1863603018112615944575f80fd5b8501803567ffffffffffffffff81111561595c575f80fd5b803603848301131561596c575f80fd5b6159808161597a8554615826565b85615871565b5f601f8211600181146159d2575f831561599c57508382018601355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600385901b1c1916600184901b178555615a67565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08516915b82811015615a1e578685018901358255938801939089019088016159ff565b5084821015615a5b577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88660031b161c198885880101351681555b505060018360011b0185555b505050505050505050565b83815260406020820152816040820152818360608301375f818301606090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010192915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8181038181111561075157610751615758565b5f81615b1357615b13615758565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82615b7457615b74615b39565b500690565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112615bab575f80fd5b9190910192915050565b5f60208284031215615bc5575f80fd5b81516147c9816152c7565b5f82615bde57615bde615b39565b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b60208082528181018390525f908460408401835b86811015615c5f578235615c37816152c7565b73ffffffffffffffffffffffffffffffffffffffff1682529183019190830190600101615c24565b509695505050505050565b808202811582820484141761075157610751615758565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615cb157615cb1615758565b5060010190565b602081525f6147c9602083018461567a565b5f60208284031215615cda575f80fd5b815180151581146147c9575f80fd5b5f60208284031215615cf9575f80fd5b505191905056fea164736f6c6343000818000a" func init() { if err := json.Unmarshal([]byte(L2StakingStorageLayoutJSON), L2StakingStorageLayout); err != nil { diff --git a/bindings/bindings/l2txfeevault.go b/bindings/bindings/l2txfeevault.go index 382e7ead..91258acb 100644 --- a/bindings/bindings/l2txfeevault.go +++ b/bindings/bindings/l2txfeevault.go @@ -32,7 +32,7 @@ var ( // L2TxFeeVaultMetaData contains all meta data concerning the L2TxFeeVault contract. var L2TxFeeVaultMetaData = &bind.MetaData{ ABI: "[{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_recipient\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_minWithdrawalAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_oldOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"_newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldMessenger\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newMessenger\",\"type\":\"address\"}],\"name\":\"UpdateMessenger\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldMinWithdrawAmount\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newMinWithdrawAmount\",\"type\":\"uint256\"}],\"name\":\"UpdateMinWithdrawAmount\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"}],\"name\":\"UpdateReceiveAllowed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldRecipient\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newRecipient\",\"type\":\"address\"}],\"name\":\"UpdateRecipient\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"}],\"name\":\"UpdateTransferAllowed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"}],\"name\":\"Withdrawal\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"}],\"name\":\"isReceiveAllowed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messenger\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"minWithdrawAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiveAddr\",\"type\":\"address\"}],\"name\":\"receiveAllowed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"recipient\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalProcessed\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"transferAddr\",\"type\":\"address\"}],\"name\":\"transferAllowed\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"transferTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"}],\"name\":\"transferTo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newMessenger\",\"type\":\"address\"}],\"name\":\"updateMessenger\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newMinWithdrawAmount\",\"type\":\"uint256\"}],\"name\":\"updateMinWithdrawAmount\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_accounts\",\"type\":\"address[]\"},{\"internalType\":\"bool\",\"name\":\"_status\",\"type\":\"bool\"}],\"name\":\"updateReceiveAllowed\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newRecipient\",\"type\":\"address\"}],\"name\":\"updateRecipient\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"_accounts\",\"type\":\"address[]\"},{\"internalType\":\"bool\",\"name\":\"_status\",\"type\":\"bool\"}],\"name\":\"updateTransferAllowedStatus\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_value\",\"type\":\"uint256\"}],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdraw\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x608060405234801562000010575f80fd5b5060405162001687380380620016878339810160408190526200003391620000d3565b6200003e8362000068565b600155600380546001600160a01b0319166001600160a01b03929092169190911790555062000111565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b0381168114620000ce575f80fd5b919050565b5f805f60608486031215620000e6575f80fd5b620000f184620000b7565b92506200010160208501620000b7565b9150604084015190509250925092565b611568806200011f5f395ff3fe608060405260043610610140575f3560e01c806384411d65116100bb578063da13f9a211610071578063f2fde38b11610057578063f2fde38b146103c4578063feec756c146103e3578063ff4f354614610402575f80fd5b8063da13f9a214610377578063eff1337c14610396575f80fd5b80639e7adc79116100a15780639e7adc79146102f5578063a03fa7e314610314578063cc198d7414610333575f80fd5b806384411d65146102b55780638da5cb5b146102ca575f80fd5b80633ccfd60b1161011057806366d003ac116100f657806366d003ac14610256578063708125ad14610282578063715018a6146102a1575f80fd5b80633ccfd60b1461021f578063457e1a4914610233575f80fd5b8063151eeb551461014b5780632ccb1b301461018e5780632e1a7d4d146101af5780633cb747bf146101ce575f80fd5b3661014757005b5f80fd5b348015610156575f80fd5b5061017961016536600461130d565b60056020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b348015610199575f80fd5b506101ad6101a836600461132d565b610421565b005b3480156101ba575f80fd5b506101ad6101c9366004611355565b610750565b3480156101d9575f80fd5b506002546101fa9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610185565b34801561022a575f80fd5b506101ad610a55565b34801561023e575f80fd5b5061024860015481565b604051908152602001610185565b348015610261575f80fd5b506003546101fa9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561028d575f80fd5b506101ad61029c3660046113a8565b610ac8565b3480156102ac575f80fd5b506101ad610ce2565b3480156102c0575f80fd5b5061024860045481565b3480156102d5575f80fd5b505f546101fa9073ffffffffffffffffffffffffffffffffffffffff1681565b348015610300575f80fd5b506101ad61030f36600461130d565b610d53565b34801561031f575f80fd5b506101ad61032e36600461130d565b610e2f565b34801561033e575f80fd5b5061017961034d36600461130d565b73ffffffffffffffffffffffffffffffffffffffff165f9081526006602052604090205460ff1690565b348015610382575f80fd5b506101ad6103913660046113a8565b610ebd565b3480156103a1575f80fd5b506101796103b036600461130d565b60066020525f908152604090205460ff1681565b3480156103cf575f80fd5b506101ad6103de36600461130d565b611018565b3480156103ee575f80fd5b506101ad6103fd36600461130d565b6110ea565b34801561040d575f80fd5b506101ad61041c366004611355565b6111c6565b335f9081526005602052604090205460ff168061045457505f5473ffffffffffffffffffffffffffffffffffffffff1633145b6104a55760405162461bcd60e51b815260206004820152601f60248201527f4665655661756c743a2063616c6c6572206973206e6f7420616c6c6f7765640060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821661052e5760405162461bcd60e51b815260206004820152603060248201527f4665655661756c743a20726563697069656e7420616464726573732063616e6e60448201527f6f74206265206164647265737328302900000000000000000000000000000000606482015260840161049c565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526006602052604090205460ff166105c85760405162461bcd60e51b815260206004820152602760248201527f4665655661756c743a20726563697069656e742061646472657373206e6f742060448201527f616c6c6f77656400000000000000000000000000000000000000000000000000606482015260840161049c565b478082111561063f5760405162461bcd60e51b815260206004820152602a60248201527f4665655661756c743a20696e73756666696369656e742062616c616e6365207460448201527f6f207472616e7366657200000000000000000000000000000000000000000000606482015260840161049c565b60048054830190556003546040805184815273ffffffffffffffffffffffffffffffffffffffff90921660208301523382820152517f0a429aba3d89849a2db0153e4534d95c46a1d83c8109d73893f55ebc44010ff49181900360600190a15f8373ffffffffffffffffffffffffffffffffffffffff16836040515f6040518083038185875af1925050503d805f81146106f4576040519150601f19603f3d011682016040523d82523d5f602084013e6106f9565b606091505b505090508061074a5760405162461bcd60e51b815260206004820152601d60248201527f4665655661756c743a20455448207472616e73666572206661696c6564000000604482015260640161049c565b50505050565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146107b65760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161049c565b60035473ffffffffffffffffffffffffffffffffffffffff166108415760405162461bcd60e51b815260206004820152603060248201527f4665655661756c743a20726563697069656e7420616464726573732063616e6e60448201527f6f74206265206164647265737328302900000000000000000000000000000000606482015260840161049c565b6001548110156108df5760405162461bcd60e51b815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a40161049c565b47808211156109565760405162461bcd60e51b815260206004820152602a60248201527f4665655661756c743a20696e73756666696369656e742062616c616e6365207460448201527f6f20776974686472617700000000000000000000000000000000000000000000606482015260840161049c565b60048054830190556003546040805184815273ffffffffffffffffffffffffffffffffffffffff90921660208301523382820152517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a1600254600354604080516020810182525f80825291517fb2267a7b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9485169463b2267a7b948894610a23949190921692859290600401611498565b5f604051808303818588803b158015610a3a575f80fd5b505af1158015610a4c573d5f803e3d5ffd5b50505050505050565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610abb5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161049c565b47610ac581610750565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610b2e5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161049c565b5f5b8251811015610cdd575f73ffffffffffffffffffffffffffffffffffffffff16838281518110610b6257610b6261152e565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603610bf35760405162461bcd60e51b815260206004820152602660248201527f4665655661756c743a20616464726573732063616e6e6f74206265206164647260448201527f6573732830290000000000000000000000000000000000000000000000000000606482015260840161049c565b8160065f858481518110610c0957610c0961152e565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507fbd84b6b3e1d029fd61a717f6020a8f35b358486e0971c00d4e64b516503f85e7838281518110610c9357610c9361152e565b602002602001015183604051610ccd92919073ffffffffffffffffffffffffffffffffffffffff9290921682521515602082015260400190565b60405180910390a1600101610b30565b505050565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610d485760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161049c565b610d515f611271565b565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610db95760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161049c565b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f1c928c417a10a21c3cddad148c5dba5d710e4b1442d6d8a36de345935ad84612905f90a35050565b335f9081526005602052604090205460ff1680610e6257505f5473ffffffffffffffffffffffffffffffffffffffff1633145b610eae5760405162461bcd60e51b815260206004820152601f60248201527f4665655661756c743a2063616c6c6572206973206e6f7420616c6c6f77656400604482015260640161049c565b47610eb98282610421565b5050565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610f235760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161049c565b5f5b8251811015610cdd578160055f858481518110610f4457610f4461152e565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507fbb5d3e442e800faa1089a4f57bae4f36808d3cf15d051033d78a72147782f24c838281518110610fce57610fce61152e565b60200260200101518360405161100892919073ffffffffffffffffffffffffffffffffffffffff9290921682521515602082015260400190565b60405180910390a1600101610f25565b5f5473ffffffffffffffffffffffffffffffffffffffff16331461107e5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161049c565b73ffffffffffffffffffffffffffffffffffffffff81166110e15760405162461bcd60e51b815260206004820152601d60248201527f6e6577206f776e657220697320746865207a65726f2061646472657373000000604482015260640161049c565b610ac581611271565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146111505760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161049c565b6003805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f7e1e96961a397c8aa26162fe259cc837afc95e33aad4945ddc61c18dabb7a6ad905f90a35050565b5f5473ffffffffffffffffffffffffffffffffffffffff16331461122c5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161049c565b600180549082905560408051828152602081018490527f0d3c80219fe57713b9f9c83d1e51426792d0c14d8e330e65b102571816140965910160405180910390a15050565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611308575f80fd5b919050565b5f6020828403121561131d575f80fd5b611326826112e5565b9392505050565b5f806040838503121561133e575f80fd5b611347836112e5565b946020939093013593505050565b5f60208284031215611365575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b80358015158114611308575f80fd5b5f80604083850312156113b9575f80fd5b823567ffffffffffffffff808211156113d0575f80fd5b818501915085601f8301126113e3575f80fd5b81356020828211156113f7576113f761136c565b8160051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f8301168101818110868211171561143a5761143a61136c565b604052928352818301935084810182019289841115611457575f80fd5b948201945b8386101561147c5761146d866112e5565b8552948201949382019361145c565b965061148b9050878201611399565b9450505050509250929050565b73ffffffffffffffffffffffffffffffffffffffff851681525f60208560208401526080604084015284518060808501525f5b818110156114e75786810183015185820160a0015282016114cb565b505f60a0828601015260a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505082606083015295945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffdfea164736f6c6343000818000a", + Bin: "0x608060405234801562000010575f80fd5b5060405162001950380380620019508339810160408190526200003391620000d3565b6200003e8362000068565b600155600380546001600160a01b0319166001600160a01b03929092169190911790555062000111565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b80516001600160a01b0381168114620000ce575f80fd5b919050565b5f805f60608486031215620000e6575f80fd5b620000f184620000b7565b92506200010160208501620000b7565b9150604084015190509250925092565b611831806200011f5f395ff3fe608060405260043610610140575f3560e01c806384411d65116100bb578063da13f9a211610071578063f2fde38b11610057578063f2fde38b146103c4578063feec756c146103e3578063ff4f354614610402575f80fd5b8063da13f9a214610377578063eff1337c14610396575f80fd5b80639e7adc79116100a15780639e7adc79146102f5578063a03fa7e314610314578063cc198d7414610333575f80fd5b806384411d65146102b55780638da5cb5b146102ca575f80fd5b80633ccfd60b1161011057806366d003ac116100f657806366d003ac14610256578063708125ad14610282578063715018a6146102a1575f80fd5b80633ccfd60b1461021f578063457e1a4914610233575f80fd5b8063151eeb551461014b5780632ccb1b301461018e5780632e1a7d4d146101af5780633cb747bf146101ce575f80fd5b3661014757005b5f80fd5b348015610156575f80fd5b506101796101653660046115d6565b60056020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b348015610199575f80fd5b506101ad6101a83660046115f6565b610421565b005b3480156101ba575f80fd5b506101ad6101c936600461161e565b61074d565b3480156101d9575f80fd5b506002546101fa9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610185565b34801561022a575f80fd5b506101ad610add565b34801561023e575f80fd5b5061024860015481565b604051908152602001610185565b348015610261575f80fd5b506003546101fa9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561028d575f80fd5b506101ad61029c366004611671565b610b50565b3480156102ac575f80fd5b506101ad610d6a565b3480156102c0575f80fd5b5061024860045481565b3480156102d5575f80fd5b505f546101fa9073ffffffffffffffffffffffffffffffffffffffff1681565b348015610300575f80fd5b506101ad61030f3660046115d6565b610ddb565b34801561031f575f80fd5b506101ad61032e3660046115d6565b610f40565b34801561033e575f80fd5b5061017961034d3660046115d6565b73ffffffffffffffffffffffffffffffffffffffff165f9081526006602052604090205460ff1690565b348015610382575f80fd5b506101ad610391366004611671565b610fce565b3480156103a1575f80fd5b506101796103b03660046115d6565b60066020525f908152604090205460ff1681565b3480156103cf575f80fd5b506101ad6103de3660046115d6565b6111e3565b3480156103ee575f80fd5b506101ad6103fd3660046115d6565b6112b5565b34801561040d575f80fd5b506101ad61041c36600461161e565b61141a565b335f9081526005602052604090205460ff168061045457505f5473ffffffffffffffffffffffffffffffffffffffff1633145b6104a55760405162461bcd60e51b815260206004820152601f60248201527f4665655661756c743a2063616c6c6572206973206e6f7420616c6c6f7765640060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff821661052e5760405162461bcd60e51b815260206004820152603060248201527f4665655661756c743a20726563697069656e7420616464726573732063616e6e60448201527f6f74206265206164647265737328302900000000000000000000000000000000606482015260840161049c565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526006602052604090205460ff166105c85760405162461bcd60e51b815260206004820152602760248201527f4665655661756c743a20726563697069656e742061646472657373206e6f742060448201527f616c6c6f77656400000000000000000000000000000000000000000000000000606482015260840161049c565b478082111561063f5760405162461bcd60e51b815260206004820152602a60248201527f4665655661756c743a20696e73756666696369656e742062616c616e6365207460448201527f6f207472616e7366657200000000000000000000000000000000000000000000606482015260840161049c565b60048054830190556040805183815273ffffffffffffffffffffffffffffffffffffffff85166020820152338183015290517f0a429aba3d89849a2db0153e4534d95c46a1d83c8109d73893f55ebc44010ff49181900360600190a15f8373ffffffffffffffffffffffffffffffffffffffff16836040515f6040518083038185875af1925050503d805f81146106f1576040519150601f19603f3d011682016040523d82523d5f602084013e6106f6565b606091505b50509050806107475760405162461bcd60e51b815260206004820152601d60248201527f4665655661756c743a20455448207472616e73666572206661696c6564000000604482015260640161049c565b50505050565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146107b35760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161049c565b60025473ffffffffffffffffffffffffffffffffffffffff1661083e5760405162461bcd60e51b815260206004820152603060248201527f4665655661756c743a206d657373656e67657220616464726573732063616e6e60448201527f6f74206265206164647265737328302900000000000000000000000000000000606482015260840161049c565b60035473ffffffffffffffffffffffffffffffffffffffff166108c95760405162461bcd60e51b815260206004820152603060248201527f4665655661756c743a20726563697069656e7420616464726573732063616e6e60448201527f6f74206265206164647265737328302900000000000000000000000000000000606482015260840161049c565b6001548110156109675760405162461bcd60e51b815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a40161049c565b47808211156109de5760405162461bcd60e51b815260206004820152602a60248201527f4665655661756c743a20696e73756666696369656e742062616c616e6365207460448201527f6f20776974686472617700000000000000000000000000000000000000000000606482015260840161049c565b60048054830190556003546040805184815273ffffffffffffffffffffffffffffffffffffffff90921660208301523382820152517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a1600254600354604080516020810182525f80825291517fb2267a7b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9485169463b2267a7b948894610aab949190921692859290600401611761565b5f604051808303818588803b158015610ac2575f80fd5b505af1158015610ad4573d5f803e3d5ffd5b50505050505050565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610b435760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161049c565b47610b4d8161074d565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610bb65760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161049c565b5f5b8251811015610d65575f73ffffffffffffffffffffffffffffffffffffffff16838281518110610bea57610bea6117f7565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603610c7b5760405162461bcd60e51b815260206004820152602e60248201527f4665655661756c743a207265636569766520616464726573732063616e6e6f7460448201527f2062652061646472657373283029000000000000000000000000000000000000606482015260840161049c565b8160065f858481518110610c9157610c916117f7565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507fbd84b6b3e1d029fd61a717f6020a8f35b358486e0971c00d4e64b516503f85e7838281518110610d1b57610d1b6117f7565b602002602001015183604051610d5592919073ffffffffffffffffffffffffffffffffffffffff9290921682521515602082015260400190565b60405180910390a1600101610bb8565b505050565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610dd05760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161049c565b610dd95f61153a565b565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610e415760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161049c565b73ffffffffffffffffffffffffffffffffffffffff8116610eca5760405162461bcd60e51b815260206004820152603460248201527f4665655661756c743a206e6577206d657373656e67657220616464726573732060448201527f63616e6e6f742062652061646472657373283029000000000000000000000000606482015260840161049c565b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f1c928c417a10a21c3cddad148c5dba5d710e4b1442d6d8a36de345935ad84612905f90a35050565b335f9081526005602052604090205460ff1680610f7357505f5473ffffffffffffffffffffffffffffffffffffffff1633145b610fbf5760405162461bcd60e51b815260206004820152601f60248201527f4665655661756c743a2063616c6c6572206973206e6f7420616c6c6f77656400604482015260640161049c565b47610fca8282610421565b5050565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146110345760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161049c565b5f5b8251811015610d65575f73ffffffffffffffffffffffffffffffffffffffff16838281518110611068576110686117f7565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16036110f95760405162461bcd60e51b815260206004820152603760248201527f4665655661756c743a207472616e7366657220616c6c6f77656420616464726560448201527f73732063616e6e6f742062652061646472657373283029000000000000000000606482015260840161049c565b8160055f85848151811061110f5761110f6117f7565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507fbb5d3e442e800faa1089a4f57bae4f36808d3cf15d051033d78a72147782f24c838281518110611199576111996117f7565b6020026020010151836040516111d392919073ffffffffffffffffffffffffffffffffffffffff9290921682521515602082015260400190565b60405180910390a1600101611036565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146112495760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161049c565b73ffffffffffffffffffffffffffffffffffffffff81166112ac5760405162461bcd60e51b815260206004820152601d60248201527f6e6577206f776e657220697320746865207a65726f2061646472657373000000604482015260640161049c565b610b4d8161153a565b5f5473ffffffffffffffffffffffffffffffffffffffff16331461131b5760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161049c565b73ffffffffffffffffffffffffffffffffffffffff81166113a45760405162461bcd60e51b815260206004820152603460248201527f4665655661756c743a206e657720726563697069656e7420616464726573732060448201527f63616e6e6f742062652061646472657373283029000000000000000000000000606482015260840161049c565b6003805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f7e1e96961a397c8aa26162fe259cc837afc95e33aad4945ddc61c18dabb7a6ad905f90a35050565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146114805760405162461bcd60e51b815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e6572000000000000000000604482015260640161049c565b5f81116114f55760405162461bcd60e51b815260206004820152603160248201527f4665655661756c743a206e6577206d696e696d756d207769746864726177206160448201527f6d6f756e742063616e6e6f742062652030000000000000000000000000000000606482015260840161049c565b600180549082905560408051828152602081018490527f0d3c80219fe57713b9f9c83d1e51426792d0c14d8e330e65b102571816140965910160405180910390a15050565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b803573ffffffffffffffffffffffffffffffffffffffff811681146115d1575f80fd5b919050565b5f602082840312156115e6575f80fd5b6115ef826115ae565b9392505050565b5f8060408385031215611607575f80fd5b611610836115ae565b946020939093013593505050565b5f6020828403121561162e575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b803580151581146115d1575f80fd5b5f8060408385031215611682575f80fd5b823567ffffffffffffffff80821115611699575f80fd5b818501915085601f8301126116ac575f80fd5b81356020828211156116c0576116c0611635565b8160051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f8301168101818110868211171561170357611703611635565b604052928352818301935084810182019289841115611720575f80fd5b948201945b8386101561174557611736866115ae565b85529482019493820193611725565b96506117549050878201611662565b9450505050509250929050565b73ffffffffffffffffffffffffffffffffffffffff851681525f60208560208401526080604084015284518060808501525f5b818110156117b05786810183015185820160a001528201611794565b505f60a0828601015260a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505082606083015295945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffdfea164736f6c6343000818000a", } // L2TxFeeVaultABI is the input ABI used to generate the binding from. diff --git a/bindings/bindings/l2txfeevault_more.go b/bindings/bindings/l2txfeevault_more.go index 5e8c0bfc..fe5c98bd 100644 --- a/bindings/bindings/l2txfeevault_more.go +++ b/bindings/bindings/l2txfeevault_more.go @@ -13,7 +13,7 @@ const L2TxFeeVaultStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\ var L2TxFeeVaultStorageLayout = new(solc.StorageLayout) -var L2TxFeeVaultDeployedBin = "0x608060405260043610610140575f3560e01c806384411d65116100bb578063da13f9a211610071578063f2fde38b11610057578063f2fde38b146103c4578063feec756c146103e3578063ff4f354614610402575f80fd5b8063da13f9a214610377578063eff1337c14610396575f80fd5b80639e7adc79116100a15780639e7adc79146102f5578063a03fa7e314610314578063cc198d7414610333575f80fd5b806384411d65146102b55780638da5cb5b146102ca575f80fd5b80633ccfd60b1161011057806366d003ac116100f657806366d003ac14610256578063708125ad14610282578063715018a6146102a1575f80fd5b80633ccfd60b1461021f578063457e1a4914610233575f80fd5b8063151eeb551461014b5780632ccb1b301461018e5780632e1a7d4d146101af5780633cb747bf146101ce575f80fd5b3661014757005b5f80fd5b348015610156575f80fd5b50610179610165366004611515565b60056020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b348015610199575f80fd5b506101ad6101a8366004611535565b610421565b005b3480156101ba575f80fd5b506101ad6101c936600461155d565b6107d2565b3480156101d9575f80fd5b506002546101fa9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610185565b34801561022a575f80fd5b506101ad610b3f565b34801561023e575f80fd5b5061024860015481565b604051908152602001610185565b348015610261575f80fd5b506003546101fa9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561028d575f80fd5b506101ad61029c3660046115b0565b610bcc565b3480156102ac575f80fd5b506101ad610e1a565b3480156102c0575f80fd5b5061024860045481565b3480156102d5575f80fd5b505f546101fa9073ffffffffffffffffffffffffffffffffffffffff1681565b348015610300575f80fd5b506101ad61030f366004611515565b610ea5565b34801561031f575f80fd5b506101ad61032e366004611515565b610f9b565b34801561033e575f80fd5b5061017961034d366004611515565b73ffffffffffffffffffffffffffffffffffffffff165f9081526006602052604090205460ff1690565b348015610382575f80fd5b506101ad6103913660046115b0565b611043565b3480156103a1575f80fd5b506101796103b0366004611515565b60066020525f908152604090205460ff1681565b3480156103cf575f80fd5b506101ad6103de366004611515565b6111b8565b3480156103ee575f80fd5b506101ad6103fd366004611515565b6112be565b34801561040d575f80fd5b506101ad61041c36600461155d565b6113b4565b335f9081526005602052604090205460ff168061045457505f5473ffffffffffffffffffffffffffffffffffffffff1633145b6104bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4665655661756c743a2063616c6c6572206973206e6f7420616c6c6f7765640060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216610562576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a20726563697069656e7420616464726573732063616e6e60448201527f6f7420626520616464726573732830290000000000000000000000000000000060648201526084016104b6565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526006602052604090205460ff16610616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4665655661756c743a20726563697069656e742061646472657373206e6f742060448201527f616c6c6f7765640000000000000000000000000000000000000000000000000060648201526084016104b6565b47808211156106a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4665655661756c743a20696e73756666696369656e742062616c616e6365207460448201527f6f207472616e736665720000000000000000000000000000000000000000000060648201526084016104b6565b60048054830190556003546040805184815273ffffffffffffffffffffffffffffffffffffffff90921660208301523382820152517f0a429aba3d89849a2db0153e4534d95c46a1d83c8109d73893f55ebc44010ff49181900360600190a15f8373ffffffffffffffffffffffffffffffffffffffff16836040515f6040518083038185875af1925050503d805f811461075c576040519150601f19603f3d011682016040523d82523d5f602084013e610761565b606091505b50509050806107cc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4665655661756c743a20455448207472616e73666572206661696c656400000060448201526064016104b6565b50505050565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610852576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016104b6565b60035473ffffffffffffffffffffffffffffffffffffffff166108f7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a20726563697069656e7420616464726573732063616e6e60448201527f6f7420626520616464726573732830290000000000000000000000000000000060648201526084016104b6565b6001548110156109af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4016104b6565b4780821115610a40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4665655661756c743a20696e73756666696369656e742062616c616e6365207460448201527f6f2077697468647261770000000000000000000000000000000000000000000060648201526084016104b6565b60048054830190556003546040805184815273ffffffffffffffffffffffffffffffffffffffff90921660208301523382820152517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a1600254600354604080516020810182525f80825291517fb2267a7b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9485169463b2267a7b948894610b0d9491909216928592906004016116a0565b5f604051808303818588803b158015610b24575f80fd5b505af1158015610b36573d5f803e3d5ffd5b50505050505050565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610bbf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016104b6565b47610bc9816107d2565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610c4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016104b6565b5f5b8251811015610e15575f73ffffffffffffffffffffffffffffffffffffffff16838281518110610c8057610c80611736565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603610d2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4665655661756c743a20616464726573732063616e6e6f74206265206164647260448201527f657373283029000000000000000000000000000000000000000000000000000060648201526084016104b6565b8160065f858481518110610d4157610d41611736565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507fbd84b6b3e1d029fd61a717f6020a8f35b358486e0971c00d4e64b516503f85e7838281518110610dcb57610dcb611736565b602002602001015183604051610e0592919073ffffffffffffffffffffffffffffffffffffffff9290921682521515602082015260400190565b60405180910390a1600101610c4e565b505050565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610e9a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016104b6565b610ea35f611479565b565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610f25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016104b6565b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f1c928c417a10a21c3cddad148c5dba5d710e4b1442d6d8a36de345935ad84612905f90a35050565b335f9081526005602052604090205460ff1680610fce57505f5473ffffffffffffffffffffffffffffffffffffffff1633145b611034576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4665655661756c743a2063616c6c6572206973206e6f7420616c6c6f7765640060448201526064016104b6565b4761103f8282610421565b5050565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146110c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016104b6565b5f5b8251811015610e15578160055f8584815181106110e4576110e4611736565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507fbb5d3e442e800faa1089a4f57bae4f36808d3cf15d051033d78a72147782f24c83828151811061116e5761116e611736565b6020026020010151836040516111a892919073ffffffffffffffffffffffffffffffffffffffff9290921682521515602082015260400190565b60405180910390a16001016110c5565b5f5473ffffffffffffffffffffffffffffffffffffffff163314611238576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016104b6565b73ffffffffffffffffffffffffffffffffffffffff81166112b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6e6577206f776e657220697320746865207a65726f206164647265737300000060448201526064016104b6565b610bc981611479565b5f5473ffffffffffffffffffffffffffffffffffffffff16331461133e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016104b6565b6003805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f7e1e96961a397c8aa26162fe259cc837afc95e33aad4945ddc61c18dabb7a6ad905f90a35050565b5f5473ffffffffffffffffffffffffffffffffffffffff163314611434576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016104b6565b600180549082905560408051828152602081018490527f0d3c80219fe57713b9f9c83d1e51426792d0c14d8e330e65b102571816140965910160405180910390a15050565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611510575f80fd5b919050565b5f60208284031215611525575f80fd5b61152e826114ed565b9392505050565b5f8060408385031215611546575f80fd5b61154f836114ed565b946020939093013593505050565b5f6020828403121561156d575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b80358015158114611510575f80fd5b5f80604083850312156115c1575f80fd5b823567ffffffffffffffff808211156115d8575f80fd5b818501915085601f8301126115eb575f80fd5b81356020828211156115ff576115ff611574565b8160051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f8301168101818110868211171561164257611642611574565b60405292835281830193508481018201928984111561165f575f80fd5b948201945b8386101561168457611675866114ed565b85529482019493820193611664565b965061169390508782016115a1565b9450505050509250929050565b73ffffffffffffffffffffffffffffffffffffffff851681525f60208560208401526080604084015284518060808501525f5b818110156116ef5786810183015185820160a0015282016116d3565b505f60a0828601015260a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505082606083015295945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffdfea164736f6c6343000818000a" +var L2TxFeeVaultDeployedBin = "0x608060405260043610610140575f3560e01c806384411d65116100bb578063da13f9a211610071578063f2fde38b11610057578063f2fde38b146103c4578063feec756c146103e3578063ff4f354614610402575f80fd5b8063da13f9a214610377578063eff1337c14610396575f80fd5b80639e7adc79116100a15780639e7adc79146102f5578063a03fa7e314610314578063cc198d7414610333575f80fd5b806384411d65146102b55780638da5cb5b146102ca575f80fd5b80633ccfd60b1161011057806366d003ac116100f657806366d003ac14610256578063708125ad14610282578063715018a6146102a1575f80fd5b80633ccfd60b1461021f578063457e1a4914610233575f80fd5b8063151eeb551461014b5780632ccb1b301461018e5780632e1a7d4d146101af5780633cb747bf146101ce575f80fd5b3661014757005b5f80fd5b348015610156575f80fd5b50610179610165366004611860565b60056020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b348015610199575f80fd5b506101ad6101a8366004611880565b610421565b005b3480156101ba575f80fd5b506101ad6101c93660046118a8565b6107cf565b3480156101d9575f80fd5b506002546101fa9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610185565b34801561022a575f80fd5b506101ad610be1565b34801561023e575f80fd5b5061024860015481565b604051908152602001610185565b348015610261575f80fd5b506003546101fa9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561028d575f80fd5b506101ad61029c3660046118fb565b610c6e565b3480156102ac575f80fd5b506101ad610ebc565b3480156102c0575f80fd5b5061024860045481565b3480156102d5575f80fd5b505f546101fa9073ffffffffffffffffffffffffffffffffffffffff1681565b348015610300575f80fd5b506101ad61030f366004611860565b610f47565b34801561031f575f80fd5b506101ad61032e366004611860565b6110e0565b34801561033e575f80fd5b5061017961034d366004611860565b73ffffffffffffffffffffffffffffffffffffffff165f9081526006602052604090205460ff1690565b348015610382575f80fd5b506101ad6103913660046118fb565b611188565b3480156103a1575f80fd5b506101796103b0366004611860565b60066020525f908152604090205460ff1681565b3480156103cf575f80fd5b506101ad6103de366004611860565b6113d1565b3480156103ee575f80fd5b506101ad6103fd366004611860565b6114d7565b34801561040d575f80fd5b506101ad61041c3660046118a8565b611670565b335f9081526005602052604090205460ff168061045457505f5473ffffffffffffffffffffffffffffffffffffffff1633145b6104bf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4665655661756c743a2063616c6c6572206973206e6f7420616c6c6f7765640060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216610562576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a20726563697069656e7420616464726573732063616e6e60448201527f6f7420626520616464726573732830290000000000000000000000000000000060648201526084016104b6565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526006602052604090205460ff16610616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f4665655661756c743a20726563697069656e742061646472657373206e6f742060448201527f616c6c6f7765640000000000000000000000000000000000000000000000000060648201526084016104b6565b47808211156106a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4665655661756c743a20696e73756666696369656e742062616c616e6365207460448201527f6f207472616e736665720000000000000000000000000000000000000000000060648201526084016104b6565b60048054830190556040805183815273ffffffffffffffffffffffffffffffffffffffff85166020820152338183015290517f0a429aba3d89849a2db0153e4534d95c46a1d83c8109d73893f55ebc44010ff49181900360600190a15f8373ffffffffffffffffffffffffffffffffffffffff16836040515f6040518083038185875af1925050503d805f8114610759576040519150601f19603f3d011682016040523d82523d5f602084013e61075e565b606091505b50509050806107c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f4665655661756c743a20455448207472616e73666572206661696c656400000060448201526064016104b6565b50505050565b5f5473ffffffffffffffffffffffffffffffffffffffff16331461084f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016104b6565b60025473ffffffffffffffffffffffffffffffffffffffff166108f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a206d657373656e67657220616464726573732063616e6e60448201527f6f7420626520616464726573732830290000000000000000000000000000000060648201526084016104b6565b60035473ffffffffffffffffffffffffffffffffffffffff16610999576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603060248201527f4665655661756c743a20726563697069656e7420616464726573732063616e6e60448201527f6f7420626520616464726573732830290000000000000000000000000000000060648201526084016104b6565b600154811015610a51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604a60248201527f4665655661756c743a207769746864726177616c20616d6f756e74206d75737460448201527f2062652067726561746572207468616e206d696e696d756d207769746864726160648201527f77616c20616d6f756e7400000000000000000000000000000000000000000000608482015260a4016104b6565b4780821115610ae2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602a60248201527f4665655661756c743a20696e73756666696369656e742062616c616e6365207460448201527f6f2077697468647261770000000000000000000000000000000000000000000060648201526084016104b6565b60048054830190556003546040805184815273ffffffffffffffffffffffffffffffffffffffff90921660208301523382820152517fc8a211cc64b6ed1b50595a9fcb1932b6d1e5a6e8ef15b60e5b1f988ea9086bba9181900360600190a1600254600354604080516020810182525f80825291517fb2267a7b00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff9485169463b2267a7b948894610baf9491909216928592906004016119eb565b5f604051808303818588803b158015610bc6575f80fd5b505af1158015610bd8573d5f803e3d5ffd5b50505050505050565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610c61576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016104b6565b47610c6b816107cf565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610cee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016104b6565b5f5b8251811015610eb7575f73ffffffffffffffffffffffffffffffffffffffff16838281518110610d2257610d22611a81565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1603610dcd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f4665655661756c743a207265636569766520616464726573732063616e6e6f7460448201527f206265206164647265737328302900000000000000000000000000000000000060648201526084016104b6565b8160065f858481518110610de357610de3611a81565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507fbd84b6b3e1d029fd61a717f6020a8f35b358486e0971c00d4e64b516503f85e7838281518110610e6d57610e6d611a81565b602002602001015183604051610ea792919073ffffffffffffffffffffffffffffffffffffffff9290921682521515602082015260400190565b60405180910390a1600101610cf0565b505050565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610f3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016104b6565b610f455f6117c4565b565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610fc7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016104b6565b73ffffffffffffffffffffffffffffffffffffffff811661106a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4665655661756c743a206e6577206d657373656e67657220616464726573732060448201527f63616e6e6f74206265206164647265737328302900000000000000000000000060648201526084016104b6565b6002805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f1c928c417a10a21c3cddad148c5dba5d710e4b1442d6d8a36de345935ad84612905f90a35050565b335f9081526005602052604090205460ff168061111357505f5473ffffffffffffffffffffffffffffffffffffffff1633145b611179576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f4665655661756c743a2063616c6c6572206973206e6f7420616c6c6f7765640060448201526064016104b6565b476111848282610421565b5050565b5f5473ffffffffffffffffffffffffffffffffffffffff163314611208576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016104b6565b5f5b8251811015610eb7575f73ffffffffffffffffffffffffffffffffffffffff1683828151811061123c5761123c611a81565b602002602001015173ffffffffffffffffffffffffffffffffffffffff16036112e7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603760248201527f4665655661756c743a207472616e7366657220616c6c6f77656420616464726560448201527f73732063616e6e6f74206265206164647265737328302900000000000000000060648201526084016104b6565b8160055f8584815181106112fd576112fd611a81565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055507fbb5d3e442e800faa1089a4f57bae4f36808d3cf15d051033d78a72147782f24c83828151811061138757611387611a81565b6020026020010151836040516113c192919073ffffffffffffffffffffffffffffffffffffffff9290921682521515602082015260400190565b60405180910390a160010161120a565b5f5473ffffffffffffffffffffffffffffffffffffffff163314611451576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016104b6565b73ffffffffffffffffffffffffffffffffffffffff81166114ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6e6577206f776e657220697320746865207a65726f206164647265737300000060448201526064016104b6565b610c6b816117c4565b5f5473ffffffffffffffffffffffffffffffffffffffff163314611557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016104b6565b73ffffffffffffffffffffffffffffffffffffffff81166115fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603460248201527f4665655661756c743a206e657720726563697069656e7420616464726573732060448201527f63616e6e6f74206265206164647265737328302900000000000000000000000060648201526084016104b6565b6003805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f7e1e96961a397c8aa26162fe259cc837afc95e33aad4945ddc61c18dabb7a6ad905f90a35050565b5f5473ffffffffffffffffffffffffffffffffffffffff1633146116f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f63616c6c6572206973206e6f7420746865206f776e657200000000000000000060448201526064016104b6565b5f811161177f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603160248201527f4665655661756c743a206e6577206d696e696d756d207769746864726177206160448201527f6d6f756e742063616e6e6f74206265203000000000000000000000000000000060648201526084016104b6565b600180549082905560408051828152602081018490527f0d3c80219fe57713b9f9c83d1e51426792d0c14d8e330e65b102571816140965910160405180910390a15050565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b803573ffffffffffffffffffffffffffffffffffffffff8116811461185b575f80fd5b919050565b5f60208284031215611870575f80fd5b61187982611838565b9392505050565b5f8060408385031215611891575f80fd5b61189a83611838565b946020939093013593505050565b5f602082840312156118b8575f80fd5b5035919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b8035801515811461185b575f80fd5b5f806040838503121561190c575f80fd5b823567ffffffffffffffff80821115611923575f80fd5b818501915085601f830112611936575f80fd5b813560208282111561194a5761194a6118bf565b8160051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f8301168101818110868211171561198d5761198d6118bf565b6040529283528183019350848101820192898411156119aa575f80fd5b948201945b838610156119cf576119c086611838565b855294820194938201936119af565b96506119de90508782016118ec565b9450505050509250929050565b73ffffffffffffffffffffffffffffffffffffffff851681525f60208560208401526080604084015284518060808501525f5b81811015611a3a5786810183015185820160a001528201611a1e565b505f60a0828601015260a07fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505082606083015295945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffdfea164736f6c6343000818000a" func init() { if err := json.Unmarshal([]byte(L2TxFeeVaultStorageLayoutJSON), L2TxFeeVaultStorageLayout); err != nil { diff --git a/bindings/bindings/l2wstethtoken.go b/bindings/bindings/l2wstethtoken.go index 2e7fbebc..218d2abf 100644 --- a/bindings/bindings/l2wstethtoken.go +++ b/bindings/bindings/l2wstethtoken.go @@ -31,8 +31,8 @@ var ( // L2WstETHTokenMetaData contains all meta data concerning the L2WstETHToken contract. var L2WstETHTokenMetaData = &bind.MetaData{ - ABI: "[{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EIP712DomainChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"counterpart\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"eip712Domain\",\"outputs\":[{\"internalType\":\"bytes1\",\"name\":\"fields\",\"type\":\"bytes1\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"verifyingContract\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[]\",\"name\":\"extensions\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gateway\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"_decimals\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"_gateway\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_counterpart\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"transferAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", - Bin: "0x608060405234801561000f575f80fd5b5061001861001d565b6100d9565b5f54610100900460ff16156100885760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146100d7575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b61213280620000e75f395ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d25780639dc29fac11610088578063c820f14611610063578063c820f14614610354578063d505accf14610367578063dd62ed3e1461037a575f80fd5b80639dc29fac1461031b578063a457c2d71461032e578063a9059cbb14610341575f80fd5b80637ecebe00116100b85780637ecebe00146102e557806384b0196e146102f857806395d89b4114610313575f80fd5b806370a0823114610290578063797594b0146102c5575f80fd5b8063313ce56711610127578063395093511161010d57806339509351146102555780634000aea01461026857806340c10f191461027b575f80fd5b8063313ce5671461021d5780633644e5151461024d575f80fd5b8063116191b611610157578063116191b6146101b357806318160ddd146101f857806323b872dd1461020a575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a6103bf565b6040516101879190611a7e565b60405180910390f35b6101a361019e366004611abf565b61044f565b6040519015158152602001610187565b60cc546101d39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6035545b604051908152602001610187565b6101a3610218366004611ae7565b610468565b60cd5474010000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610187565b6101fc61048b565b6101a3610263366004611abf565b610499565b6101a3610276366004611b20565b6104e4565b61028e610289366004611abf565b61054d565b005b6101fc61029e366004611ba0565b73ffffffffffffffffffffffffffffffffffffffff165f9081526033602052604090205490565b60cd546101d39073ffffffffffffffffffffffffffffffffffffffff1681565b6101fc6102f3366004611ba0565b6105c7565b6103006105f1565b6040516101879796959493929190611bb9565b61017a6106ae565b61028e610329366004611abf565b6106bd565b6101a361033c366004611abf565b61072e565b6101a361034f366004611abf565b6107e4565b61028e610362366004611d5d565b6107f1565b61028e610375366004611ded565b610a08565b6101fc610388366004611e52565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260346020908152604080832093909416825291909152205490565b6060603680546103ce90611e83565b80601f01602080910402602001604051908101604052809291908181526020018280546103fa90611e83565b80156104455780601f1061041c57610100808354040283529160200191610445565b820191905f5260205f20905b81548152906001019060200180831161042857829003601f168201915b5050505050905090565b5f3361045c818585610bae565b60019150505b92915050565b5f33610475858285610d2d565b610480858585610de9565b506001949350505050565b5f61049461100f565b905090565b335f81815260346020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919061045c90829086906104df908790611ece565b610bae565b5f6104ef85856107e4565b5073ffffffffffffffffffffffffffffffffffffffff85163b1561048057610480858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061101892505050565b60cc5473ffffffffffffffffffffffffffffffffffffffff1633146105b95760405162461bcd60e51b815260206004820152600c60248201527f4f6e6c792047617465776179000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6105c382826110a3565b5050565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260996020526040812054610462565b5f6060805f805f60606065545f801b14801561060d5750606654155b6106595760405162461bcd60e51b815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064016105b0565b61066161117c565b61066961118b565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6060603780546103ce90611e83565b60cc5473ffffffffffffffffffffffffffffffffffffffff1633146107245760405162461bcd60e51b815260206004820152600c60248201527f4f6e6c792047617465776179000000000000000000000000000000000000000060448201526064016105b0565b6105c3828261119a565b335f81815260346020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156107d75760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016105b0565b6104808286868403610bae565b5f3361045c818585610de9565b5f54610100900460ff161580801561080f57505f54600160ff909116105b806108285750303b15801561082857505f5460ff166001145b61089a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105b0565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156108f6575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6108ff86611327565b61090986866113e5565b60cd805460cc805473ffffffffffffffffffffffffffffffffffffffff8088167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925590851660ff88167401000000000000000000000000000000000000000002919091167fffffffffffffffffffffff000000000000000000000000000000000000000000909216919091171790558015610a00575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b83421115610a585760405162461bcd60e51b815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e6500000060448201526064016105b0565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610a868c61146b565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f610aed8261149f565b60408051602081018790529081018590527fff0000000000000000000000000000000000000000000000000000000000000060f888901b166060820152909150610b4c908a9083906061016040516020818303038152906040526114e6565b610b985760405162461bcd60e51b815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e6174757265000060448201526064016105b0565b610ba3898989610bae565b505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c365760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016105b0565b73ffffffffffffffffffffffffffffffffffffffff8216610cbf5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016105b0565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526034602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152603460209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610de35781811015610dd65760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016105b0565b610de38484848403610bae565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e725760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016105b0565b73ffffffffffffffffffffffffffffffffffffffff8216610efb5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016105b0565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526033602052604090205481811015610f965760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016105b0565b73ffffffffffffffffffffffffffffffffffffffff8085165f8181526033602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906110029086815260200190565b60405180910390a3610de3565b5f61049461155e565b6040517fa4c0ed36000000000000000000000000000000000000000000000000000000008152839073ffffffffffffffffffffffffffffffffffffffff82169063a4c0ed369061107090339087908790600401611f06565b5f604051808303815f87803b158015611087575f80fd5b505af1158015611099573d5f803e3d5ffd5b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff82166111065760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016105b0565b8060355f8282546111179190611ece565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f818152603360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6060606780546103ce90611e83565b6060606880546103ce90611e83565b73ffffffffffffffffffffffffffffffffffffffff82166112235760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016105b0565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260336020526040902054818110156112be5760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016105b0565b73ffffffffffffffffffffffffffffffffffffffff83165f8181526033602090815260408083208686039055603580548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610d20565b505050565b5f54610100900460ff166113a35760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105b0565b6113e2816040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506115d1565b50565b5f54610100900460ff166114615760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105b0565b6105c38282611674565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526099602052604090208054600181018255905b50919050565b5f6104626114ab61100f565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f805f6114f38585611709565b90925090505f81600481111561150b5761150b611f43565b14801561154357508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b80611554575061155486868661174b565b9695505050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6115886118a3565b6115906118fb565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f54610100900460ff1661164d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105b0565b60676116598382611fbb565b5060686116668282611fbb565b50505f606581905560665550565b5f54610100900460ff166116f05760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105b0565b60366116fc8382611fbb565b5060376113228282611fbb565b5f80825160410361173d576020830151604084015160608501515f1a6117318782858561192b565b94509450505050611744565b505f905060025b9250929050565b5f805f8573ffffffffffffffffffffffffffffffffffffffff16631626ba7e60e01b86866040516024016117809291906120d3565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090941693909317909252905161180991906120f3565b5f60405180830381855afa9150503d805f8114611841576040519150601f19603f3d011682016040523d82523d5f602084013e611846565b606091505b509150915081801561185a57506020815110155b8015611554575080517f1626ba7e0000000000000000000000000000000000000000000000000000000090611898908301602090810190840161210e565b149695505050505050565b5f806118ad61117c565b8051909150156118c4578051602090910120919050565b60655480156118d35792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b5f8061190561118b565b80519091501561191c578051602090910120919050565b60665480156118d35792915050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561196057505f90506003611a0a565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa1580156119b1573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611a04575f60019250925050611a0a565b91505f90505b94509492505050565b5f5b83811015611a2d578181015183820152602001611a15565b50505f910152565b5f8151808452611a4c816020860160208601611a13565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f611a906020830184611a35565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611aba575f80fd5b919050565b5f8060408385031215611ad0575f80fd5b611ad983611a97565b946020939093013593505050565b5f805f60608486031215611af9575f80fd5b611b0284611a97565b9250611b1060208501611a97565b9150604084013590509250925092565b5f805f8060608587031215611b33575f80fd5b611b3c85611a97565b935060208501359250604085013567ffffffffffffffff80821115611b5f575f80fd5b818701915087601f830112611b72575f80fd5b813581811115611b80575f80fd5b886020828501011115611b91575f80fd5b95989497505060200194505050565b5f60208284031215611bb0575f80fd5b611a9082611a97565b7fff00000000000000000000000000000000000000000000000000000000000000881681525f602060e06020840152611bf560e084018a611a35565b8381036040850152611c07818a611a35565b6060850189905273ffffffffffffffffffffffffffffffffffffffff8816608086015260a0850187905284810360c0860152855180825260208088019350909101905f5b81811015611c6757835183529284019291840191600101611c4b565b50909c9b505050505050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112611cb5575f80fd5b813567ffffffffffffffff80821115611cd057611cd0611c79565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611d1657611d16611c79565b81604052838152866020858801011115611d2e575f80fd5b836020870160208301375f602085830101528094505050505092915050565b803560ff81168114611aba575f80fd5b5f805f805f60a08688031215611d71575f80fd5b853567ffffffffffffffff80821115611d88575f80fd5b611d9489838a01611ca6565b96506020880135915080821115611da9575f80fd5b50611db688828901611ca6565b945050611dc560408701611d4d565b9250611dd360608701611a97565b9150611de160808701611a97565b90509295509295909350565b5f805f805f805f60e0888a031215611e03575f80fd5b611e0c88611a97565b9650611e1a60208901611a97565b95506040880135945060608801359350611e3660808901611d4d565b925060a0880135915060c0880135905092959891949750929550565b5f8060408385031215611e63575f80fd5b611e6c83611a97565b9150611e7a60208401611a97565b90509250929050565b600181811c90821680611e9757607f821691505b602082108103611499577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b80820180821115610462577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f611f3a6060830184611a35565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b601f82111561132257805f5260205f20601f840160051c81016020851015611f955750805b601f840160051c820191505b81811015611fb4575f8155600101611fa1565b5050505050565b815167ffffffffffffffff811115611fd557611fd5611c79565b611fe981611fe38454611e83565b84611f70565b602080601f83116001811461203b575f84156120055750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610a00565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561208757888601518255948401946001909101908401612068565b50858210156120c357878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b828152604060208201525f6120eb6040830184611a35565b949350505050565b5f8251612104818460208701611a13565b9190910192915050565b5f6020828403121561211e575f80fd5b505191905056fea164736f6c6343000818000a", + ABI: "[{\"inputs\":[],\"name\":\"ErrorExpiredDeadline\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorInvalidSignature\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"EIP712DomainChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"DOMAIN_SEPARATOR\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"}],\"name\":\"allowance\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_from\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"counterpart\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"decimals\",\"outputs\":[{\"internalType\":\"uint8\",\"name\":\"\",\"type\":\"uint8\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"subtractedValue\",\"type\":\"uint256\"}],\"name\":\"decreaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"eip712Domain\",\"outputs\":[{\"internalType\":\"bytes1\",\"name\":\"fields\",\"type\":\"bytes1\"},{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"version\",\"type\":\"string\"},{\"internalType\":\"uint256\",\"name\":\"chainId\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"verifyingContract\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"salt\",\"type\":\"bytes32\"},{\"internalType\":\"uint256[]\",\"name\":\"extensions\",\"type\":\"uint256[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"gateway\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"addedValue\",\"type\":\"uint256\"}],\"name\":\"increaseAllowance\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"string\",\"name\":\"_name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"_symbol\",\"type\":\"string\"},{\"internalType\":\"uint8\",\"name\":\"_decimals\",\"type\":\"uint8\"},{\"internalType\":\"address\",\"name\":\"_gateway\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_counterpart\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"nonces\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"spender\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"deadline\",\"type\":\"uint256\"},{\"internalType\":\"uint8\",\"name\":\"v\",\"type\":\"uint8\"},{\"internalType\":\"bytes32\",\"name\":\"r\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"s\",\"type\":\"bytes32\"}],\"name\":\"permit\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transfer\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"transferAndCall\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"success\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x608060405234801561000f575f80fd5b5061001861001d565b6100d9565b5f54610100900460ff16156100885760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146100d7575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b61210680620000e75f395ff3fe608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d25780639dc29fac11610088578063c820f14611610063578063c820f14614610354578063d505accf14610367578063dd62ed3e1461037a575f80fd5b80639dc29fac1461031b578063a457c2d71461032e578063a9059cbb14610341575f80fd5b80637ecebe00116100b85780637ecebe00146102e557806384b0196e146102f857806395d89b4114610313575f80fd5b806370a0823114610290578063797594b0146102c5575f80fd5b8063313ce56711610127578063395093511161010d57806339509351146102555780634000aea01461026857806340c10f191461027b575f80fd5b8063313ce5671461021d5780633644e5151461024d575f80fd5b8063116191b611610157578063116191b6146101b357806318160ddd146101f857806323b872dd1461020a575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a6103bf565b6040516101879190611a52565b60405180910390f35b6101a361019e366004611a93565b61044f565b6040519015158152602001610187565b60cc546101d39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6035545b604051908152602001610187565b6101a3610218366004611abb565b610468565b60cd5474010000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610187565b6101fc61048b565b6101a3610263366004611a93565b610499565b6101a3610276366004611af4565b6104e4565b61028e610289366004611a93565b61054d565b005b6101fc61029e366004611b74565b73ffffffffffffffffffffffffffffffffffffffff165f9081526033602052604090205490565b60cd546101d39073ffffffffffffffffffffffffffffffffffffffff1681565b6101fc6102f3366004611b74565b6105c7565b6103006105f1565b6040516101879796959493929190611b8d565b61017a6106ae565b61028e610329366004611a93565b6106bd565b6101a361033c366004611a93565b61072e565b6101a361034f366004611a93565b6107e4565b61028e610362366004611d31565b6107f1565b61028e610375366004611dc1565b610a08565b6101fc610388366004611e26565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260346020908152604080832093909416825291909152205490565b6060603680546103ce90611e57565b80601f01602080910402602001604051908101604052809291908181526020018280546103fa90611e57565b80156104455780601f1061041c57610100808354040283529160200191610445565b820191905f5260205f20905b81548152906001019060200180831161042857829003601f168201915b5050505050905090565b5f3361045c818585610b82565b60019150505b92915050565b5f33610475858285610d01565b610480858585610dbd565b506001949350505050565b5f610494610fe3565b905090565b335f81815260346020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919061045c90829086906104df908790611ea2565b610b82565b5f6104ef85856107e4565b5073ffffffffffffffffffffffffffffffffffffffff85163b1561048057610480858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610fec92505050565b60cc5473ffffffffffffffffffffffffffffffffffffffff1633146105b95760405162461bcd60e51b815260206004820152600c60248201527f4f6e6c792047617465776179000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6105c38282611077565b5050565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260996020526040812054610462565b5f6060805f805f60606065545f801b14801561060d5750606654155b6106595760405162461bcd60e51b815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064016105b0565b610661611150565b61066961115f565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6060603780546103ce90611e57565b60cc5473ffffffffffffffffffffffffffffffffffffffff1633146107245760405162461bcd60e51b815260206004820152600c60248201527f4f6e6c792047617465776179000000000000000000000000000000000000000060448201526064016105b0565b6105c3828261116e565b335f81815260346020908152604080832073ffffffffffffffffffffffffffffffffffffffff87168452909152812054909190838110156107d75760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016105b0565b6104808286868403610b82565b5f3361045c818585610dbd565b5f54610100900460ff161580801561080f57505f54600160ff909116105b806108285750303b15801561082857505f5460ff166001145b61089a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105b0565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156108f6575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6108ff866112fb565b61090986866113b9565b60cd805460cc805473ffffffffffffffffffffffffffffffffffffffff8088167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925590851660ff88167401000000000000000000000000000000000000000002919091167fffffffffffffffffffffff000000000000000000000000000000000000000000909216919091171790558015610a00575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b83421115610a42576040517fa5faea8300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610a708c61143f565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f610ad782611473565b60408051602081018790529081018590527fff0000000000000000000000000000000000000000000000000000000000000060f888901b166060820152909150610b36908a9083906061016040516020818303038152906040526114ba565b610b6c576040517f3f88fec700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610b77898989610b82565b505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610c0a5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016105b0565b73ffffffffffffffffffffffffffffffffffffffff8216610c935760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016105b0565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526034602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152603460209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610db75781811015610daa5760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016105b0565b610db78484848403610b82565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610e465760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016105b0565b73ffffffffffffffffffffffffffffffffffffffff8216610ecf5760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016105b0565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526033602052604090205481811015610f6a5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016105b0565b73ffffffffffffffffffffffffffffffffffffffff8085165f8181526033602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90610fd69086815260200190565b60405180910390a3610db7565b5f610494611532565b6040517fa4c0ed36000000000000000000000000000000000000000000000000000000008152839073ffffffffffffffffffffffffffffffffffffffff82169063a4c0ed369061104490339087908790600401611eda565b5f604051808303815f87803b15801561105b575f80fd5b505af115801561106d573d5f803e3d5ffd5b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff82166110da5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016105b0565b8060355f8282546110eb9190611ea2565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f818152603360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6060606780546103ce90611e57565b6060606880546103ce90611e57565b73ffffffffffffffffffffffffffffffffffffffff82166111f75760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016105b0565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260336020526040902054818110156112925760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016105b0565b73ffffffffffffffffffffffffffffffffffffffff83165f8181526033602090815260408083208686039055603580548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610cf4565b505050565b5f54610100900460ff166113775760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105b0565b6113b6816040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506115a5565b50565b5f54610100900460ff166114355760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105b0565b6105c38282611648565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526099602052604090208054600181018255905b50919050565b5f61046261147f610fe3565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f805f6114c785856116dd565b90925090505f8160048111156114df576114df611f17565b14801561151757508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b80611528575061152886868661171f565b9695505050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61155c611877565b6115646118cf565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f54610100900460ff166116215760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105b0565b606761162d8382611f8f565b50606861163a8282611f8f565b50505f606581905560665550565b5f54610100900460ff166116c45760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105b0565b60366116d08382611f8f565b5060376112f68282611f8f565b5f808251604103611711576020830151604084015160608501515f1a611705878285856118ff565b94509450505050611718565b505f905060025b9250929050565b5f805f8573ffffffffffffffffffffffffffffffffffffffff16631626ba7e60e01b86866040516024016117549291906120a7565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516117dd91906120c7565b5f60405180830381855afa9150503d805f8114611815576040519150601f19603f3d011682016040523d82523d5f602084013e61181a565b606091505b509150915081801561182e57506020815110155b8015611528575080517f1626ba7e000000000000000000000000000000000000000000000000000000009061186c90830160209081019084016120e2565b149695505050505050565b5f80611881611150565b805190915015611898578051602090910120919050565b60655480156118a75792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b5f806118d961115f565b8051909150156118f0578051602090910120919050565b60665480156118a75792915050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561193457505f905060036119de565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611985573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff81166119d8575f600192509250506119de565b91505f90505b94509492505050565b5f5b83811015611a015781810151838201526020016119e9565b50505f910152565b5f8151808452611a208160208601602086016119e7565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f611a646020830184611a09565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611a8e575f80fd5b919050565b5f8060408385031215611aa4575f80fd5b611aad83611a6b565b946020939093013593505050565b5f805f60608486031215611acd575f80fd5b611ad684611a6b565b9250611ae460208501611a6b565b9150604084013590509250925092565b5f805f8060608587031215611b07575f80fd5b611b1085611a6b565b935060208501359250604085013567ffffffffffffffff80821115611b33575f80fd5b818701915087601f830112611b46575f80fd5b813581811115611b54575f80fd5b886020828501011115611b65575f80fd5b95989497505060200194505050565b5f60208284031215611b84575f80fd5b611a6482611a6b565b7fff00000000000000000000000000000000000000000000000000000000000000881681525f602060e06020840152611bc960e084018a611a09565b8381036040850152611bdb818a611a09565b6060850189905273ffffffffffffffffffffffffffffffffffffffff8816608086015260a0850187905284810360c0860152855180825260208088019350909101905f5b81811015611c3b57835183529284019291840191600101611c1f565b50909c9b505050505050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112611c89575f80fd5b813567ffffffffffffffff80821115611ca457611ca4611c4d565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611cea57611cea611c4d565b81604052838152866020858801011115611d02575f80fd5b836020870160208301375f602085830101528094505050505092915050565b803560ff81168114611a8e575f80fd5b5f805f805f60a08688031215611d45575f80fd5b853567ffffffffffffffff80821115611d5c575f80fd5b611d6889838a01611c7a565b96506020880135915080821115611d7d575f80fd5b50611d8a88828901611c7a565b945050611d9960408701611d21565b9250611da760608701611a6b565b9150611db560808701611a6b565b90509295509295909350565b5f805f805f805f60e0888a031215611dd7575f80fd5b611de088611a6b565b9650611dee60208901611a6b565b95506040880135945060608801359350611e0a60808901611d21565b925060a0880135915060c0880135905092959891949750929550565b5f8060408385031215611e37575f80fd5b611e4083611a6b565b9150611e4e60208401611a6b565b90509250929050565b600181811c90821680611e6b57607f821691505b60208210810361146d577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b80820180821115610462577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f611f0e6060830184611a09565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b601f8211156112f657805f5260205f20601f840160051c81016020851015611f695750805b601f840160051c820191505b81811015611f88575f8155600101611f75565b5050505050565b815167ffffffffffffffff811115611fa957611fa9611c4d565b611fbd81611fb78454611e57565b84611f44565b602080601f83116001811461200f575f8415611fd95750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610a00565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561205b5788860151825594840194600190910190840161203c565b508582101561209757878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b828152604060208201525f6120bf6040830184611a09565b949350505050565b5f82516120d88184602087016119e7565b9190910192915050565b5f602082840312156120f2575f80fd5b505191905056fea164736f6c6343000818000a", } // L2WstETHTokenABI is the input ABI used to generate the binding from. diff --git a/bindings/bindings/l2wstethtoken_more.go b/bindings/bindings/l2wstethtoken_more.go index 3183343a..6c7143c1 100644 --- a/bindings/bindings/l2wstethtoken_more.go +++ b/bindings/bindings/l2wstethtoken_more.go @@ -13,7 +13,7 @@ const L2WstETHTokenStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract var L2WstETHTokenStorageLayout = new(solc.StorageLayout) -var L2WstETHTokenDeployedBin = "0x608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d25780639dc29fac11610088578063c820f14611610063578063c820f14614610354578063d505accf14610367578063dd62ed3e1461037a575f80fd5b80639dc29fac1461031b578063a457c2d71461032e578063a9059cbb14610341575f80fd5b80637ecebe00116100b85780637ecebe00146102e557806384b0196e146102f857806395d89b4114610313575f80fd5b806370a0823114610290578063797594b0146102c5575f80fd5b8063313ce56711610127578063395093511161010d57806339509351146102555780634000aea01461026857806340c10f191461027b575f80fd5b8063313ce5671461021d5780633644e5151461024d575f80fd5b8063116191b611610157578063116191b6146101b357806318160ddd146101f857806323b872dd1461020a575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a6103bf565b6040516101879190611c86565b60405180910390f35b6101a361019e366004611cc7565b61044f565b6040519015158152602001610187565b60cc546101d39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6035545b604051908152602001610187565b6101a3610218366004611cef565b610468565b60cd5474010000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610187565b6101fc61048b565b6101a3610263366004611cc7565b610499565b6101a3610276366004611d28565b6104e4565b61028e610289366004611cc7565b61054d565b005b6101fc61029e366004611da8565b73ffffffffffffffffffffffffffffffffffffffff165f9081526033602052604090205490565b60cd546101d39073ffffffffffffffffffffffffffffffffffffffff1681565b6101fc6102f3366004611da8565b6105e1565b61030061060b565b6040516101879796959493929190611dc1565b61017a6106e2565b61028e610329366004611cc7565b6106f1565b6101a361033c366004611cc7565b61077c565b6101a361034f366004611cc7565b61084c565b61028e610362366004611f65565b610859565b61028e610375366004611ff5565b610a8a565b6101fc61038836600461205a565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260346020908152604080832093909416825291909152205490565b6060603680546103ce9061208b565b80601f01602080910402602001604051908101604052809291908181526020018280546103fa9061208b565b80156104455780601f1061041c57610100808354040283529160200191610445565b820191905f5260205f20905b81548152906001019060200180831161042857829003601f168201915b5050505050905090565b5f3361045c818585610c64565b60019150505b92915050565b5f33610475858285610e17565b610480858585610eed565b506001949350505050565b5f610494611161565b905090565b335f81815260346020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919061045c90829086906104df9087906120d6565b610c64565b5f6104ef858561084c565b5073ffffffffffffffffffffffffffffffffffffffff85163b1561048057610480858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061116a92505050565b60cc5473ffffffffffffffffffffffffffffffffffffffff1633146105d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4f6e6c792047617465776179000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6105dd82826111f5565b5050565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260996020526040812054610462565b5f6060805f805f60606065545f801b1480156106275750606654155b61068d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064016105ca565b6106956112e8565b61069d6112f7565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6060603780546103ce9061208b565b60cc5473ffffffffffffffffffffffffffffffffffffffff163314610772576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4f6e6c792047617465776179000000000000000000000000000000000000000060448201526064016105ca565b6105dd8282611306565b335f81815260346020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561083f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016105ca565b6104808286868403610c64565b5f3361045c818585610eed565b5f54610100900460ff161580801561087757505f54600160ff909116105b806108905750303b15801561089057505f5460ff166001145b61091c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105ca565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610978575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610981866114c7565b61098b868661159f565b60cd805460cc805473ffffffffffffffffffffffffffffffffffffffff8088167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925590851660ff88167401000000000000000000000000000000000000000002919091167fffffffffffffffffffffff000000000000000000000000000000000000000000909216919091171790558015610a82575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b83421115610af4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332305065726d69743a206578706972656420646561646c696e6500000060448201526064016105ca565b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610b228c61163f565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f610b8982611673565b60408051602081018790529081018590527fff0000000000000000000000000000000000000000000000000000000000000060f888901b166060820152909150610be8908a9083906061016040516020818303038152906040526116ba565b610c4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f45524332305065726d69743a20696e76616c6964207369676e6174757265000060448201526064016105ca565b610c59898989610c64565b505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610d06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016105ca565b73ffffffffffffffffffffffffffffffffffffffff8216610da9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016105ca565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526034602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152603460209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610ee75781811015610eda576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016105ca565b610ee78484848403610c64565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610f90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016105ca565b73ffffffffffffffffffffffffffffffffffffffff8216611033576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016105ca565b73ffffffffffffffffffffffffffffffffffffffff83165f90815260336020526040902054818110156110e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016105ca565b73ffffffffffffffffffffffffffffffffffffffff8085165f8181526033602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906111549086815260200190565b60405180910390a3610ee7565b5f610494611732565b6040517fa4c0ed36000000000000000000000000000000000000000000000000000000008152839073ffffffffffffffffffffffffffffffffffffffff82169063a4c0ed36906111c29033908790879060040161210e565b5f604051808303815f87803b1580156111d9575f80fd5b505af11580156111eb573d5f803e3d5ffd5b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8216611272576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016105ca565b8060355f82825461128391906120d6565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f818152603360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6060606780546103ce9061208b565b6060606880546103ce9061208b565b73ffffffffffffffffffffffffffffffffffffffff82166113a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016105ca565b73ffffffffffffffffffffffffffffffffffffffff82165f908152603360205260409020548181101561145e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016105ca565b73ffffffffffffffffffffffffffffffffffffffff83165f8181526033602090815260408083208686039055603580548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610e0a565b505050565b5f54610100900460ff1661155d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105ca565b61159c816040518060400160405280600181526020017f31000000000000000000000000000000000000000000000000000000000000008152506117a5565b50565b5f54610100900460ff16611635576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105ca565b6105dd8282611862565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526099602052604090208054600181018255905b50919050565b5f61046261167f611161565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f805f6116c78585611911565b90925090505f8160048111156116df576116df61214b565b14801561171757508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b806117285750611728868686611953565b9695505050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f61175c611aab565b611764611b03565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f54610100900460ff1661183b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105ca565b606761184783826121c3565b50606861185482826121c3565b50505f606581905560665550565b5f54610100900460ff166118f8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105ca565b603661190483826121c3565b5060376114c282826121c3565b5f808251604103611945576020830151604084015160608501515f1a61193987828585611b33565b9450945050505061194c565b505f905060025b9250929050565b5f805f8573ffffffffffffffffffffffffffffffffffffffff16631626ba7e60e01b86866040516024016119889291906122db565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff00000000000000000000000000000000000000000000000000000000909416939093179092529051611a1191906122fb565b5f60405180830381855afa9150503d805f8114611a49576040519150601f19603f3d011682016040523d82523d5f602084013e611a4e565b606091505b5091509150818015611a6257506020815110155b8015611728575080517f1626ba7e0000000000000000000000000000000000000000000000000000000090611aa09083016020908101908401612316565b149695505050505050565b5f80611ab56112e8565b805190915015611acc578051602090910120919050565b6065548015611adb5792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b5f80611b0d6112f7565b805190915015611b24578051602090910120919050565b6066548015611adb5792915050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611b6857505f90506003611c12565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611bb9573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611c0c575f60019250925050611c12565b91505f90505b94509492505050565b5f5b83811015611c35578181015183820152602001611c1d565b50505f910152565b5f8151808452611c54816020860160208601611c1b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f611c986020830184611c3d565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611cc2575f80fd5b919050565b5f8060408385031215611cd8575f80fd5b611ce183611c9f565b946020939093013593505050565b5f805f60608486031215611d01575f80fd5b611d0a84611c9f565b9250611d1860208501611c9f565b9150604084013590509250925092565b5f805f8060608587031215611d3b575f80fd5b611d4485611c9f565b935060208501359250604085013567ffffffffffffffff80821115611d67575f80fd5b818701915087601f830112611d7a575f80fd5b813581811115611d88575f80fd5b886020828501011115611d99575f80fd5b95989497505060200194505050565b5f60208284031215611db8575f80fd5b611c9882611c9f565b7fff00000000000000000000000000000000000000000000000000000000000000881681525f602060e06020840152611dfd60e084018a611c3d565b8381036040850152611e0f818a611c3d565b6060850189905273ffffffffffffffffffffffffffffffffffffffff8816608086015260a0850187905284810360c0860152855180825260208088019350909101905f5b81811015611e6f57835183529284019291840191600101611e53565b50909c9b505050505050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112611ebd575f80fd5b813567ffffffffffffffff80821115611ed857611ed8611e81565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611f1e57611f1e611e81565b81604052838152866020858801011115611f36575f80fd5b836020870160208301375f602085830101528094505050505092915050565b803560ff81168114611cc2575f80fd5b5f805f805f60a08688031215611f79575f80fd5b853567ffffffffffffffff80821115611f90575f80fd5b611f9c89838a01611eae565b96506020880135915080821115611fb1575f80fd5b50611fbe88828901611eae565b945050611fcd60408701611f55565b9250611fdb60608701611c9f565b9150611fe960808701611c9f565b90509295509295909350565b5f805f805f805f60e0888a03121561200b575f80fd5b61201488611c9f565b965061202260208901611c9f565b9550604088013594506060880135935061203e60808901611f55565b925060a0880135915060c0880135905092959891949750929550565b5f806040838503121561206b575f80fd5b61207483611c9f565b915061208260208401611c9f565b90509250929050565b600181811c9082168061209f57607f821691505b60208210810361166d577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b80820180821115610462577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f6121426060830184611c3d565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b601f8211156114c257805f5260205f20601f840160051c8101602085101561219d5750805b601f840160051c820191505b818110156121bc575f81556001016121a9565b5050505050565b815167ffffffffffffffff8111156121dd576121dd611e81565b6121f1816121eb845461208b565b84612178565b602080601f831160018114612243575f841561220d5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610a82565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561228f57888601518255948401946001909101908401612270565b50858210156122cb57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b828152604060208201525f6122f36040830184611c3d565b949350505050565b5f825161230c818460208701611c1b565b9190910192915050565b5f60208284031215612326575f80fd5b505191905056fea164736f6c6343000818000a" +var L2WstETHTokenDeployedBin = "0x608060405234801561000f575f80fd5b506004361061016e575f3560e01c806370a08231116100d25780639dc29fac11610088578063c820f14611610063578063c820f14614610354578063d505accf14610367578063dd62ed3e1461037a575f80fd5b80639dc29fac1461031b578063a457c2d71461032e578063a9059cbb14610341575f80fd5b80637ecebe00116100b85780637ecebe00146102e557806384b0196e146102f857806395d89b4114610313575f80fd5b806370a0823114610290578063797594b0146102c5575f80fd5b8063313ce56711610127578063395093511161010d57806339509351146102555780634000aea01461026857806340c10f191461027b575f80fd5b8063313ce5671461021d5780633644e5151461024d575f80fd5b8063116191b611610157578063116191b6146101b357806318160ddd146101f857806323b872dd1461020a575f80fd5b806306fdde0314610172578063095ea7b314610190575b5f80fd5b61017a6103bf565b6040516101879190611c26565b60405180910390f35b6101a361019e366004611c67565b61044f565b6040519015158152602001610187565b60cc546101d39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610187565b6035545b604051908152602001610187565b6101a3610218366004611c8f565b610468565b60cd5474010000000000000000000000000000000000000000900460ff1660405160ff9091168152602001610187565b6101fc61048b565b6101a3610263366004611c67565b610499565b6101a3610276366004611cc8565b6104e4565b61028e610289366004611c67565b61054d565b005b6101fc61029e366004611d48565b73ffffffffffffffffffffffffffffffffffffffff165f9081526033602052604090205490565b60cd546101d39073ffffffffffffffffffffffffffffffffffffffff1681565b6101fc6102f3366004611d48565b6105e1565b61030061060b565b6040516101879796959493929190611d61565b61017a6106e2565b61028e610329366004611c67565b6106f1565b6101a361033c366004611c67565b61077c565b6101a361034f366004611c67565b61084c565b61028e610362366004611f05565b610859565b61028e610375366004611f95565b610a8a565b6101fc610388366004611ffa565b73ffffffffffffffffffffffffffffffffffffffff9182165f90815260346020908152604080832093909416825291909152205490565b6060603680546103ce9061202b565b80601f01602080910402602001604051908101604052809291908181526020018280546103fa9061202b565b80156104455780601f1061041c57610100808354040283529160200191610445565b820191905f5260205f20905b81548152906001019060200180831161042857829003601f168201915b5050505050905090565b5f3361045c818585610c04565b60019150505b92915050565b5f33610475858285610db7565b610480858585610e8d565b506001949350505050565b5f610494611101565b905090565b335f81815260346020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716845290915281205490919061045c90829086906104df908790612076565b610c04565b5f6104ef858561084c565b5073ffffffffffffffffffffffffffffffffffffffff85163b1561048057610480858585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061110a92505050565b60cc5473ffffffffffffffffffffffffffffffffffffffff1633146105d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4f6e6c792047617465776179000000000000000000000000000000000000000060448201526064015b60405180910390fd5b6105dd8282611195565b5050565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260996020526040812054610462565b5f6060805f805f60606065545f801b1480156106275750606654155b61068d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f4549503731323a20556e696e697469616c697a6564000000000000000000000060448201526064016105ca565b610695611288565b61069d611297565b604080515f808252602082019092527f0f000000000000000000000000000000000000000000000000000000000000009b939a50919850469750309650945092509050565b6060603780546103ce9061202b565b60cc5473ffffffffffffffffffffffffffffffffffffffff163314610772576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600c60248201527f4f6e6c792047617465776179000000000000000000000000000000000000000060448201526064016105ca565b6105dd82826112a6565b335f81815260346020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091908381101561083f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760448201527f207a65726f00000000000000000000000000000000000000000000000000000060648201526084016105ca565b6104808286868403610c04565b5f3361045c818585610e8d565b5f54610100900460ff161580801561087757505f54600160ff909116105b806108905750303b15801561089057505f5460ff166001145b61091c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016105ca565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610978575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b61098186611467565b61098b868661153f565b60cd805460cc805473ffffffffffffffffffffffffffffffffffffffff8088167fffffffffffffffffffffffff00000000000000000000000000000000000000009283161790925590851660ff88167401000000000000000000000000000000000000000002919091167fffffffffffffffffffffff000000000000000000000000000000000000000000909216919091171790558015610a82575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b83421115610ac4576040517fa5faea8300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9888888610af28c6115df565b60408051602081019690965273ffffffffffffffffffffffffffffffffffffffff94851690860152929091166060840152608083015260a082015260c0810186905260e0016040516020818303038152906040528051906020012090505f610b5982611613565b60408051602081018790529081018590527fff0000000000000000000000000000000000000000000000000000000000000060f888901b166060820152909150610bb8908a90839060610160405160208183030381529060405261165a565b610bee576040517f3f88fec700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bf9898989610c04565b505050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8316610ca6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460448201527f726573730000000000000000000000000000000000000000000000000000000060648201526084016105ca565b73ffffffffffffffffffffffffffffffffffffffff8216610d49576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f20616464726560448201527f737300000000000000000000000000000000000000000000000000000000000060648201526084016105ca565b73ffffffffffffffffffffffffffffffffffffffff8381165f8181526034602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b73ffffffffffffffffffffffffffffffffffffffff8381165f908152603460209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8114610e875781811015610e7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016105ca565b610e878484848403610c04565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316610f30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f20616460448201527f647265737300000000000000000000000000000000000000000000000000000060648201526084016105ca565b73ffffffffffffffffffffffffffffffffffffffff8216610fd3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201527f657373000000000000000000000000000000000000000000000000000000000060648201526084016105ca565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526033602052604090205481811015611088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e742065786365656473206260448201527f616c616e6365000000000000000000000000000000000000000000000000000060648201526084016105ca565b73ffffffffffffffffffffffffffffffffffffffff8085165f8181526033602052604080822086860390559286168082529083902080548601905591517fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906110f49086815260200190565b60405180910390a3610e87565b5f6104946116d2565b6040517fa4c0ed36000000000000000000000000000000000000000000000000000000008152839073ffffffffffffffffffffffffffffffffffffffff82169063a4c0ed3690611162903390879087906004016120ae565b5f604051808303815f87803b158015611179575f80fd5b505af115801561118b573d5f803e3d5ffd5b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff8216611212576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016105ca565b8060355f8282546112239190612076565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f818152603360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef910160405180910390a35050565b6060606780546103ce9061202b565b6060606880546103ce9061202b565b73ffffffffffffffffffffffffffffffffffffffff8216611349576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f2061646472657360448201527f730000000000000000000000000000000000000000000000000000000000000060648201526084016105ca565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260336020526040902054818110156113fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e60448201527f636500000000000000000000000000000000000000000000000000000000000060648201526084016105ca565b73ffffffffffffffffffffffffffffffffffffffff83165f8181526033602090815260408083208686039055603580548790039055518581529192917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9101610daa565b505050565b5f54610100900460ff166114fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105ca565b61153c816040518060400160405280600181526020017f3100000000000000000000000000000000000000000000000000000000000000815250611745565b50565b5f54610100900460ff166115d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105ca565b6105dd8282611802565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526099602052604090208054600181018255905b50919050565b5f61046261161f611101565b836040517f19010000000000000000000000000000000000000000000000000000000000008152600281019290925260228201526042902090565b5f805f61166785856118b1565b90925090505f81600481111561167f5761167f6120eb565b1480156116b757508573ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b806116c857506116c88686866118f3565b9695505050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6116fc611a4b565b611704611aa3565b60408051602081019490945283019190915260608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b5f54610100900460ff166117db576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105ca565b60676117e78382612163565b5060686117f48282612163565b50505f606581905560665550565b5f54610100900460ff16611898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016105ca565b60366118a48382612163565b5060376114628282612163565b5f8082516041036118e5576020830151604084015160608501515f1a6118d987828585611ad3565b945094505050506118ec565b505f905060025b9250929050565b5f805f8573ffffffffffffffffffffffffffffffffffffffff16631626ba7e60e01b868660405160240161192892919061227b565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff000000000000000000000000000000000000000000000000000000009094169390931790925290516119b1919061229b565b5f60405180830381855afa9150503d805f81146119e9576040519150601f19603f3d011682016040523d82523d5f602084013e6119ee565b606091505b5091509150818015611a0257506020815110155b80156116c8575080517f1626ba7e0000000000000000000000000000000000000000000000000000000090611a4090830160209081019084016122b6565b149695505050505050565b5f80611a55611288565b805190915015611a6c578051602090910120919050565b6065548015611a7b5792915050565b7fc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4709250505090565b5f80611aad611297565b805190915015611ac4578051602090910120919050565b6066548015611a7b5792915050565b5f807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0831115611b0857505f90506003611bb2565b604080515f8082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015611b59573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116611bac575f60019250925050611bb2565b91505f90505b94509492505050565b5f5b83811015611bd5578181015183820152602001611bbd565b50505f910152565b5f8151808452611bf4816020860160208601611bbb565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b602081525f611c386020830184611bdd565b9392505050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611c62575f80fd5b919050565b5f8060408385031215611c78575f80fd5b611c8183611c3f565b946020939093013593505050565b5f805f60608486031215611ca1575f80fd5b611caa84611c3f565b9250611cb860208501611c3f565b9150604084013590509250925092565b5f805f8060608587031215611cdb575f80fd5b611ce485611c3f565b935060208501359250604085013567ffffffffffffffff80821115611d07575f80fd5b818701915087601f830112611d1a575f80fd5b813581811115611d28575f80fd5b886020828501011115611d39575f80fd5b95989497505060200194505050565b5f60208284031215611d58575f80fd5b611c3882611c3f565b7fff00000000000000000000000000000000000000000000000000000000000000881681525f602060e06020840152611d9d60e084018a611bdd565b8381036040850152611daf818a611bdd565b6060850189905273ffffffffffffffffffffffffffffffffffffffff8816608086015260a0850187905284810360c0860152855180825260208088019350909101905f5b81811015611e0f57835183529284019291840191600101611df3565b50909c9b505050505050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112611e5d575f80fd5b813567ffffffffffffffff80821115611e7857611e78611e21565b604051601f83017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f01168101908282118183101715611ebe57611ebe611e21565b81604052838152866020858801011115611ed6575f80fd5b836020870160208301375f602085830101528094505050505092915050565b803560ff81168114611c62575f80fd5b5f805f805f60a08688031215611f19575f80fd5b853567ffffffffffffffff80821115611f30575f80fd5b611f3c89838a01611e4e565b96506020880135915080821115611f51575f80fd5b50611f5e88828901611e4e565b945050611f6d60408701611ef5565b9250611f7b60608701611c3f565b9150611f8960808701611c3f565b90509295509295909350565b5f805f805f805f60e0888a031215611fab575f80fd5b611fb488611c3f565b9650611fc260208901611c3f565b95506040880135945060608801359350611fde60808901611ef5565b925060a0880135915060c0880135905092959891949750929550565b5f806040838503121561200b575f80fd5b61201483611c3f565b915061202260208401611c3f565b90509250929050565b600181811c9082168061203f57607f821691505b60208210810361160d577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b80820180821115610462577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f6120e26060830184611bdd565b95945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b601f82111561146257805f5260205f20601f840160051c8101602085101561213d5750805b601f840160051c820191505b8181101561215c575f8155600101612149565b5050505050565b815167ffffffffffffffff81111561217d5761217d611e21565b6121918161218b845461202b565b84612118565b602080601f8311600181146121e3575f84156121ad5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555610a82565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561222f57888601518255948401946001909101908401612210565b508582101561226b57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b5050505050600190811b01905550565b828152604060208201525f6122936040830184611bdd565b949350505050565b5f82516122ac818460208701611bbb565b9190910192915050565b5f602082840312156122c6575f80fd5b505191905056fea164736f6c6343000818000a" func init() { if err := json.Unmarshal([]byte(L2WstETHTokenStorageLayoutJSON), L2WstETHTokenStorageLayout); err != nil { diff --git a/bindings/bindings/multipleversionrollupverifier.go b/bindings/bindings/multipleversionrollupverifier.go index a5b6aa07..c86abd18 100644 --- a/bindings/bindings/multipleversionrollupverifier.go +++ b/bindings/bindings/multipleversionrollupverifier.go @@ -31,8 +31,8 @@ var ( // MultipleVersionRollupVerifierMetaData contains all meta data concerning the MultipleVersionRollupVerifier contract. var MultipleVersionRollupVerifierMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"_versions\",\"type\":\"uint256[]\"},{\"internalType\":\"address[]\",\"name\":\"_verifiers\",\"type\":\"address[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ErrorStartBatchIndexFinalized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorStartBatchIndexTooSmall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startBatchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"UpdateVerifier\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_version\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"}],\"name\":\"getVerifier\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_rollup\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"}],\"name\":\"latestVerifier\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"startBatchIndex\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"legacyVerifiers\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"startBatchIndex\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_version\",\"type\":\"uint256\"}],\"name\":\"legacyVerifiersLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rollup\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_version\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"_startBatchIndex\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"_verifier\",\"type\":\"address\"}],\"name\":\"updateVerifier\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_version\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_aggrProof\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"_publicInputHash\",\"type\":\"bytes32\"}],\"name\":\"verifyAggregateProof\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"}]", - Bin: "0x608060405234801562000010575f80fd5b506040516200100c3803806200100c8339810160408190526200003391620002ed565b6200003e33620001a9565b5f5b8251811015620001a0575f6001600160a01b0316828281518110620000695762000069620003ae565b60200260200101516001600160a01b031603620000995760405163a7f9319d60e01b815260040160405180910390fd5b818181518110620000ae57620000ae620003ae565b602002602001015160035f858481518110620000ce57620000ce620003ae565b602002602001015181526020019081526020015f205f0160086101000a8154816001600160a01b0302191690836001600160a01b031602179055507f7a98750a395b9ee50a2644ffda039e31f1d5d06de45510275f972bb20b229b308382815181106200013f576200013f620003ae565b60200260200101515f8484815181106200015d576200015d620003ae565b60200260200101516040516200018f9392919092835260208301919091526001600160a01b0316604082015260600190565b60405180910390a160010162000040565b505050620003c2565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715620002375762000237620001f8565b604052919050565b5f6001600160401b038211156200025a576200025a620001f8565b5060051b60200190565b5f82601f83011262000274575f80fd5b815160206200028d62000287836200023f565b6200020c565b8083825260208201915060208460051b870101935086841115620002af575f80fd5b602086015b84811015620002e25780516001600160a01b0381168114620002d4575f80fd5b8352918301918301620002b4565b509695505050505050565b5f8060408385031215620002ff575f80fd5b82516001600160401b038082111562000316575f80fd5b818501915085601f8301126200032a575f80fd5b815160206200033d62000287836200023f565b82815260059290921b840181019181810190898411156200035c575f80fd5b948201945b838610156200037c5785518252948201949082019062000361565b9188015191965090935050508082111562000395575f80fd5b50620003a48582860162000264565b9150509250929050565b634e487b7160e01b5f52603260045260245ffd5b610c3c80620003d05f395ff3fe608060405234801561000f575f80fd5b50600436106100c4575f3560e01c8063955123061161007d578063c7065b6a11610058578063c7065b6a146101da578063cb23bcb514610227578063f2fde38b14610247575f80fd5b8063955123061461016c578063bd98b2b01461017f578063c4d66de8146101c7575f80fd5b80635027ad2e116100ad5780635027ad2e1461011a578063715018a6146101475780638da5cb5b1461014f575f80fd5b806328aee03f146100c85780632c09a84814610105575b5f80fd5b6100db6100d6366004610a50565b61025a565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b610118610113366004610a70565b610397565b005b610139610128366004610af0565b5f9081526002602052604090205490565b6040519081526020016100fc565b61011861042f565b5f5473ffffffffffffffffffffffffffffffffffffffff166100db565b61011861017a366004610b2f565b610442565b61019261018d366004610a50565b610779565b6040805167ffffffffffffffff909316835273ffffffffffffffffffffffffffffffffffffffff9091166020830152016100fc565b6101186101d5366004610b76565b6107d1565b6101926101e8366004610af0565b60036020525f908152604090205467ffffffffffffffff81169068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6001546100db9073ffffffffffffffffffffffffffffffffffffffff1681565b610118610255366004610b76565b6108a5565b5f82815260036020908152604080832081518083019092525467ffffffffffffffff81168083526801000000000000000090910473ffffffffffffffffffffffffffffffffffffffff16928201929092529083101561038c575f84815260026020526040902054805b8015610389575f86815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff830190811061030a5761030a610b96565b5f9182526020918290206040805180820190915291015467ffffffffffffffff81168083526801000000000000000090910473ffffffffffffffffffffffffffffffffffffffff16928201929092529350851015610389577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016102c3565b50505b602001519392505050565b5f6103a2868661025a565b6040517fc8bd017600000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063c8bd0176906103fb90879087908790600401610bc3565b5f6040518083038186803b158015610411575f80fd5b505afa158015610423573d5f803e3d5ffd5b50505050505050505050565b61043761095c565b6104405f6109dc565b565b61044a61095c565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663059def616040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d89190610c18565b8267ffffffffffffffff161161051a576040517f9a4ff10400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8381526003602090815260409182902082518084019093525467ffffffffffffffff8082168085526801000000000000000090920473ffffffffffffffffffffffffffffffffffffffff169284019290925290841610156105a8576040517fb0d8c70400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166105f5576040517fa7f9319d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805167ffffffffffffffff808516911610156106ba57602081015173ffffffffffffffffffffffffffffffffffffffff16156106ac575f84815260026020908152604082208054600181018255908352918190208351920180549184015173ffffffffffffffffffffffffffffffffffffffff1668010000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090921667ffffffffffffffff909316929092171790555b67ffffffffffffffff831681525b73ffffffffffffffffffffffffffffffffffffffff82811660208381018281525f8881526003835260409081902086518154935190961668010000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090931667ffffffffffffffff96871617929092179091558051888152938716918401919091528201527f7a98750a395b9ee50a2644ffda039e31f1d5d06de45510275f972bb20b229b309060600160405180910390a150505050565b6002602052815f5260405f208181548110610792575f80fd5b5f9182526020909120015467ffffffffffffffff8116925068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16905082565b6107d961095c565b60015473ffffffffffffffffffffffffffffffffffffffff161561085e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f696e697469616c697a656400000000000000000000000000000000000000000060448201526064015b60405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6108ad61095c565b73ffffffffffffffffffffffffffffffffffffffff8116610950576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610855565b610959816109dc565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610440576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610855565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f8060408385031215610a61575f80fd5b50508035926020909101359150565b5f805f805f60808688031215610a84575f80fd5b8535945060208601359350604086013567ffffffffffffffff80821115610aa9575f80fd5b818801915088601f830112610abc575f80fd5b813581811115610aca575f80fd5b896020828501011115610adb575f80fd5b96999598505060200195606001359392505050565b5f60208284031215610b00575f80fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610b2a575f80fd5b919050565b5f805f60608486031215610b41575f80fd5b83359250602084013567ffffffffffffffff81168114610b5f575f80fd5b9150610b6d60408501610b07565b90509250925092565b5f60208284031215610b86575f80fd5b610b8f82610b07565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b60408152826040820152828460608301375f606084830101525f60607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8601168301019050826020830152949350505050565b5f60208284031215610c28575f80fd5b505191905056fea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"_versions\",\"type\":\"uint256[]\"},{\"internalType\":\"address[]\",\"name\":\"_verifiers\",\"type\":\"address[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ErrorStartBatchIndexFinalized\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorStartBatchIndexTooSmall\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorVerifierNotFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"startBatchIndex\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"name\":\"UpdateVerifier\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_version\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"}],\"name\":\"getVerifier\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_rollup\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"}],\"name\":\"latestVerifier\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"startBatchIndex\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"legacyVerifiers\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"startBatchIndex\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"verifier\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_version\",\"type\":\"uint256\"}],\"name\":\"legacyVerifiersLength\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"rollup\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_version\",\"type\":\"uint256\"},{\"internalType\":\"uint64\",\"name\":\"_startBatchIndex\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"_verifier\",\"type\":\"address\"}],\"name\":\"updateVerifier\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_version\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_aggrProof\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"_publicInputHash\",\"type\":\"bytes32\"}],\"name\":\"verifyAggregateProof\",\"outputs\":[],\"stateMutability\":\"view\",\"type\":\"function\"}]", + Bin: "0x608060405234801562000010575f80fd5b506040516200104c3803806200104c8339810160408190526200003391620002ed565b6200003e33620001a9565b5f5b8251811015620001a0575f6001600160a01b0316828281518110620000695762000069620003ae565b60200260200101516001600160a01b031603620000995760405163a7f9319d60e01b815260040160405180910390fd5b818181518110620000ae57620000ae620003ae565b602002602001015160035f858481518110620000ce57620000ce620003ae565b602002602001015181526020019081526020015f205f0160086101000a8154816001600160a01b0302191690836001600160a01b031602179055507f7a98750a395b9ee50a2644ffda039e31f1d5d06de45510275f972bb20b229b308382815181106200013f576200013f620003ae565b60200260200101515f8484815181106200015d576200015d620003ae565b60200260200101516040516200018f9392919092835260208301919091526001600160a01b0316604082015260600190565b60405180910390a160010162000040565b505050620003c2565b5f80546001600160a01b038381166001600160a01b0319831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b0381118282101715620002375762000237620001f8565b604052919050565b5f6001600160401b038211156200025a576200025a620001f8565b5060051b60200190565b5f82601f83011262000274575f80fd5b815160206200028d62000287836200023f565b6200020c565b8083825260208201915060208460051b870101935086841115620002af575f80fd5b602086015b84811015620002e25780516001600160a01b0381168114620002d4575f80fd5b8352918301918301620002b4565b509695505050505050565b5f8060408385031215620002ff575f80fd5b82516001600160401b038082111562000316575f80fd5b818501915085601f8301126200032a575f80fd5b815160206200033d62000287836200023f565b82815260059290921b840181019181810190898411156200035c575f80fd5b948201945b838610156200037c5785518252948201949082019062000361565b9188015191965090935050508082111562000395575f80fd5b50620003a48582860162000264565b9150509250929050565b634e487b7160e01b5f52603260045260245ffd5b610c7c80620003d05f395ff3fe608060405234801561000f575f80fd5b50600436106100c4575f3560e01c8063955123061161007d578063c7065b6a11610058578063c7065b6a146101da578063cb23bcb514610227578063f2fde38b14610247575f80fd5b8063955123061461016c578063bd98b2b01461017f578063c4d66de8146101c7575f80fd5b80635027ad2e116100ad5780635027ad2e1461011a578063715018a6146101475780638da5cb5b1461014f575f80fd5b806328aee03f146100c85780632c09a84814610105575b5f80fd5b6100db6100d6366004610a90565b61025a565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b610118610113366004610ab0565b6103d7565b005b610139610128366004610b30565b5f9081526002602052604090205490565b6040519081526020016100fc565b61011861046f565b5f5473ffffffffffffffffffffffffffffffffffffffff166100db565b61011861017a366004610b6f565b610482565b61019261018d366004610a90565b6107b9565b6040805167ffffffffffffffff909316835273ffffffffffffffffffffffffffffffffffffffff9091166020830152016100fc565b6101186101d5366004610bb6565b610811565b6101926101e8366004610b30565b60036020525f908152604090205467ffffffffffffffff81169068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6001546100db9073ffffffffffffffffffffffffffffffffffffffff1681565b610118610255366004610bb6565b6108e5565b5f82815260036020908152604080832081518083019092525467ffffffffffffffff81168083526801000000000000000090910473ffffffffffffffffffffffffffffffffffffffff1692820192909252908310156103cc575f84815260026020526040812054805b8015610391575f87815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff830190811061030a5761030a610bd6565b5f9182526020918290206040805180820190915291015467ffffffffffffffff81168083526801000000000000000090910473ffffffffffffffffffffffffffffffffffffffff16928201929092529450861061036a5760019250610391565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016102c3565b50816103c9576040517f70f6c8ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505b602001519392505050565b5f6103e2868661025a565b6040517fc8bd017600000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063c8bd01769061043b90879087908790600401610c03565b5f6040518083038186803b158015610451575f80fd5b505afa158015610463573d5f803e3d5ffd5b50505050505050505050565b61047761099c565b6104805f610a1c565b565b61048a61099c565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663059def616040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105189190610c58565b8267ffffffffffffffff161161055a576040517f9a4ff10400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8381526003602090815260409182902082518084019093525467ffffffffffffffff8082168085526801000000000000000090920473ffffffffffffffffffffffffffffffffffffffff169284019290925290841610156105e8576040517fb0d8c70400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216610635576040517fa7f9319d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805167ffffffffffffffff808516911610156106fa57602081015173ffffffffffffffffffffffffffffffffffffffff16156106ec575f84815260026020908152604082208054600181018255908352918190208351920180549184015173ffffffffffffffffffffffffffffffffffffffff1668010000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090921667ffffffffffffffff909316929092171790555b67ffffffffffffffff831681525b73ffffffffffffffffffffffffffffffffffffffff82811660208381018281525f8881526003835260409081902086518154935190961668010000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090931667ffffffffffffffff96871617929092179091558051888152938716918401919091528201527f7a98750a395b9ee50a2644ffda039e31f1d5d06de45510275f972bb20b229b309060600160405180910390a150505050565b6002602052815f5260405f2081815481106107d2575f80fd5b5f9182526020909120015467ffffffffffffffff8116925068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16905082565b61081961099c565b60015473ffffffffffffffffffffffffffffffffffffffff161561089e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f696e697469616c697a656400000000000000000000000000000000000000000060448201526064015b60405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6108ed61099c565b73ffffffffffffffffffffffffffffffffffffffff8116610990576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610895565b61099981610a1c565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610480576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610895565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f8060408385031215610aa1575f80fd5b50508035926020909101359150565b5f805f805f60808688031215610ac4575f80fd5b8535945060208601359350604086013567ffffffffffffffff80821115610ae9575f80fd5b818801915088601f830112610afc575f80fd5b813581811115610b0a575f80fd5b896020828501011115610b1b575f80fd5b96999598505060200195606001359392505050565b5f60208284031215610b40575f80fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610b6a575f80fd5b919050565b5f805f60608486031215610b81575f80fd5b83359250602084013567ffffffffffffffff81168114610b9f575f80fd5b9150610bad60408501610b47565b90509250925092565b5f60208284031215610bc6575f80fd5b610bcf82610b47565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b60408152826040820152828460608301375f606084830101525f60607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8601168301019050826020830152949350505050565b5f60208284031215610c68575f80fd5b505191905056fea164736f6c6343000818000a", } // MultipleVersionRollupVerifierABI is the input ABI used to generate the binding from. diff --git a/bindings/bindings/multipleversionrollupverifier_more.go b/bindings/bindings/multipleversionrollupverifier_more.go index ce643114..cb057b11 100644 --- a/bindings/bindings/multipleversionrollupverifier_more.go +++ b/bindings/bindings/multipleversionrollupverifier_more.go @@ -13,7 +13,7 @@ const MultipleVersionRollupVerifierStorageLayoutJSON = "{\"storage\":[{\"astId\" var MultipleVersionRollupVerifierStorageLayout = new(solc.StorageLayout) -var MultipleVersionRollupVerifierDeployedBin = "0x608060405234801561000f575f80fd5b50600436106100c4575f3560e01c8063955123061161007d578063c7065b6a11610058578063c7065b6a146101da578063cb23bcb514610227578063f2fde38b14610247575f80fd5b8063955123061461016c578063bd98b2b01461017f578063c4d66de8146101c7575f80fd5b80635027ad2e116100ad5780635027ad2e1461011a578063715018a6146101475780638da5cb5b1461014f575f80fd5b806328aee03f146100c85780632c09a84814610105575b5f80fd5b6100db6100d6366004610a50565b61025a565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b610118610113366004610a70565b610397565b005b610139610128366004610af0565b5f9081526002602052604090205490565b6040519081526020016100fc565b61011861042f565b5f5473ffffffffffffffffffffffffffffffffffffffff166100db565b61011861017a366004610b2f565b610442565b61019261018d366004610a50565b610779565b6040805167ffffffffffffffff909316835273ffffffffffffffffffffffffffffffffffffffff9091166020830152016100fc565b6101186101d5366004610b76565b6107d1565b6101926101e8366004610af0565b60036020525f908152604090205467ffffffffffffffff81169068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6001546100db9073ffffffffffffffffffffffffffffffffffffffff1681565b610118610255366004610b76565b6108a5565b5f82815260036020908152604080832081518083019092525467ffffffffffffffff81168083526801000000000000000090910473ffffffffffffffffffffffffffffffffffffffff16928201929092529083101561038c575f84815260026020526040902054805b8015610389575f86815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff830190811061030a5761030a610b96565b5f9182526020918290206040805180820190915291015467ffffffffffffffff81168083526801000000000000000090910473ffffffffffffffffffffffffffffffffffffffff16928201929092529350851015610389577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016102c3565b50505b602001519392505050565b5f6103a2868661025a565b6040517fc8bd017600000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063c8bd0176906103fb90879087908790600401610bc3565b5f6040518083038186803b158015610411575f80fd5b505afa158015610423573d5f803e3d5ffd5b50505050505050505050565b61043761095c565b6104405f6109dc565b565b61044a61095c565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663059def616040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104b4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104d89190610c18565b8267ffffffffffffffff161161051a576040517f9a4ff10400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8381526003602090815260409182902082518084019093525467ffffffffffffffff8082168085526801000000000000000090920473ffffffffffffffffffffffffffffffffffffffff169284019290925290841610156105a8576040517fb0d8c70400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff82166105f5576040517fa7f9319d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805167ffffffffffffffff808516911610156106ba57602081015173ffffffffffffffffffffffffffffffffffffffff16156106ac575f84815260026020908152604082208054600181018255908352918190208351920180549184015173ffffffffffffffffffffffffffffffffffffffff1668010000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090921667ffffffffffffffff909316929092171790555b67ffffffffffffffff831681525b73ffffffffffffffffffffffffffffffffffffffff82811660208381018281525f8881526003835260409081902086518154935190961668010000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090931667ffffffffffffffff96871617929092179091558051888152938716918401919091528201527f7a98750a395b9ee50a2644ffda039e31f1d5d06de45510275f972bb20b229b309060600160405180910390a150505050565b6002602052815f5260405f208181548110610792575f80fd5b5f9182526020909120015467ffffffffffffffff8116925068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16905082565b6107d961095c565b60015473ffffffffffffffffffffffffffffffffffffffff161561085e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f696e697469616c697a656400000000000000000000000000000000000000000060448201526064015b60405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6108ad61095c565b73ffffffffffffffffffffffffffffffffffffffff8116610950576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610855565b610959816109dc565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610440576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610855565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f8060408385031215610a61575f80fd5b50508035926020909101359150565b5f805f805f60808688031215610a84575f80fd5b8535945060208601359350604086013567ffffffffffffffff80821115610aa9575f80fd5b818801915088601f830112610abc575f80fd5b813581811115610aca575f80fd5b896020828501011115610adb575f80fd5b96999598505060200195606001359392505050565b5f60208284031215610b00575f80fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610b2a575f80fd5b919050565b5f805f60608486031215610b41575f80fd5b83359250602084013567ffffffffffffffff81168114610b5f575f80fd5b9150610b6d60408501610b07565b90509250925092565b5f60208284031215610b86575f80fd5b610b8f82610b07565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b60408152826040820152828460608301375f606084830101525f60607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8601168301019050826020830152949350505050565b5f60208284031215610c28575f80fd5b505191905056fea164736f6c6343000818000a" +var MultipleVersionRollupVerifierDeployedBin = "0x608060405234801561000f575f80fd5b50600436106100c4575f3560e01c8063955123061161007d578063c7065b6a11610058578063c7065b6a146101da578063cb23bcb514610227578063f2fde38b14610247575f80fd5b8063955123061461016c578063bd98b2b01461017f578063c4d66de8146101c7575f80fd5b80635027ad2e116100ad5780635027ad2e1461011a578063715018a6146101475780638da5cb5b1461014f575f80fd5b806328aee03f146100c85780632c09a84814610105575b5f80fd5b6100db6100d6366004610a90565b61025a565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020015b60405180910390f35b610118610113366004610ab0565b6103d7565b005b610139610128366004610b30565b5f9081526002602052604090205490565b6040519081526020016100fc565b61011861046f565b5f5473ffffffffffffffffffffffffffffffffffffffff166100db565b61011861017a366004610b6f565b610482565b61019261018d366004610a90565b6107b9565b6040805167ffffffffffffffff909316835273ffffffffffffffffffffffffffffffffffffffff9091166020830152016100fc565b6101186101d5366004610bb6565b610811565b6101926101e8366004610b30565b60036020525f908152604090205467ffffffffffffffff81169068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1682565b6001546100db9073ffffffffffffffffffffffffffffffffffffffff1681565b610118610255366004610bb6565b6108e5565b5f82815260036020908152604080832081518083019092525467ffffffffffffffff81168083526801000000000000000090910473ffffffffffffffffffffffffffffffffffffffff1692820192909252908310156103cc575f84815260026020526040812054805b8015610391575f87815260026020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff830190811061030a5761030a610bd6565b5f9182526020918290206040805180820190915291015467ffffffffffffffff81168083526801000000000000000090910473ffffffffffffffffffffffffffffffffffffffff16928201929092529450861061036a5760019250610391565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016102c3565b50816103c9576040517f70f6c8ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505b602001519392505050565b5f6103e2868661025a565b6040517fc8bd017600000000000000000000000000000000000000000000000000000000815290915073ffffffffffffffffffffffffffffffffffffffff82169063c8bd01769061043b90879087908790600401610c03565b5f6040518083038186803b158015610451575f80fd5b505afa158015610463573d5f803e3d5ffd5b50505050505050505050565b61047761099c565b6104805f610a1c565b565b61048a61099c565b60015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663059def616040518163ffffffff1660e01b8152600401602060405180830381865afa1580156104f4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105189190610c58565b8267ffffffffffffffff161161055a576040517f9a4ff10400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8381526003602090815260409182902082518084019093525467ffffffffffffffff8082168085526801000000000000000090920473ffffffffffffffffffffffffffffffffffffffff169284019290925290841610156105e8576040517fb0d8c70400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff8216610635576040517fa7f9319d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805167ffffffffffffffff808516911610156106fa57602081015173ffffffffffffffffffffffffffffffffffffffff16156106ec575f84815260026020908152604082208054600181018255908352918190208351920180549184015173ffffffffffffffffffffffffffffffffffffffff1668010000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090921667ffffffffffffffff909316929092171790555b67ffffffffffffffff831681525b73ffffffffffffffffffffffffffffffffffffffff82811660208381018281525f8881526003835260409081902086518154935190961668010000000000000000027fffffffff0000000000000000000000000000000000000000000000000000000090931667ffffffffffffffff96871617929092179091558051888152938716918401919091528201527f7a98750a395b9ee50a2644ffda039e31f1d5d06de45510275f972bb20b229b309060600160405180910390a150505050565b6002602052815f5260405f2081815481106107d2575f80fd5b5f9182526020909120015467ffffffffffffffff8116925068010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16905082565b61081961099c565b60015473ffffffffffffffffffffffffffffffffffffffff161561089e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f696e697469616c697a656400000000000000000000000000000000000000000060448201526064015b60405180910390fd5b600180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6108ed61099c565b73ffffffffffffffffffffffffffffffffffffffff8116610990576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610895565b61099981610a1c565b50565b5f5473ffffffffffffffffffffffffffffffffffffffff163314610480576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610895565b5f805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681178455604051919092169283917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a35050565b5f8060408385031215610aa1575f80fd5b50508035926020909101359150565b5f805f805f60808688031215610ac4575f80fd5b8535945060208601359350604086013567ffffffffffffffff80821115610ae9575f80fd5b818801915088601f830112610afc575f80fd5b813581811115610b0a575f80fd5b896020828501011115610b1b575f80fd5b96999598505060200195606001359392505050565b5f60208284031215610b40575f80fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610b6a575f80fd5b919050565b5f805f60608486031215610b81575f80fd5b83359250602084013567ffffffffffffffff81168114610b9f575f80fd5b9150610bad60408501610b47565b90509250925092565b5f60208284031215610bc6575f80fd5b610bcf82610b47565b9392505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b60408152826040820152828460608301375f606084830101525f60607fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8601168301019050826020830152949350505050565b5f60208284031215610c68575f80fd5b505191905056fea164736f6c6343000818000a" func init() { if err := json.Unmarshal([]byte(MultipleVersionRollupVerifierStorageLayoutJSON), MultipleVersionRollupVerifierStorageLayout); err != nil { diff --git a/bindings/bindings/rollup.go b/bindings/bindings/rollup.go index 081c905d..75ab0ee2 100644 --- a/bindings/bindings/rollup.go +++ b/bindings/bindings/rollup.go @@ -31,13 +31,13 @@ var ( // IRollupBatchDataInput is an auto generated low-level Go binding around an user-defined struct. type IRollupBatchDataInput struct { - Version uint8 - ParentBatchHeader []byte - BlockContexts []byte - SkippedL1MessageBitmap []byte - PrevStateRoot [32]byte - PostStateRoot [32]byte - WithdrawalRoot [32]byte + Version uint8 + ParentBatchHeader []byte + LastBlockNumber uint64 + NumL1Messages uint16 + PrevStateRoot [32]byte + PostStateRoot [32]byte + WithdrawalRoot [32]byte } // IRollupBatchSignatureInput is an auto generated low-level Go binding around an user-defined struct. @@ -49,8 +49,8 @@ type IRollupBatchSignatureInput struct { // RollupMetaData contains all meta data concerning the Rollup contract. var RollupMetaData = &bind.MetaData{ - ABI: "[{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_chainID\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ErrZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorIncorrectBatchLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorNoBlockInBatch\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"string\",\"name\":\"res\",\"type\":\"string\"}],\"name\":\"ChallengeRes\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ChallengeRewardClaim\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"batchIndex\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"challengeDeposit\",\"type\":\"uint256\"}],\"name\":\"ChallengeState\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"name\":\"CommitBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"withdrawRoot\",\"type\":\"bytes32\"}],\"name\":\"FinalizeBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ProveRemainingClaimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"name\":\"RevertBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"}],\"name\":\"UpdateChallenger\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldPeriod\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPeriod\",\"type\":\"uint256\"}],\"name\":\"UpdateFinalizationPeriodSeconds\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldPercent\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPercent\",\"type\":\"uint256\"}],\"name\":\"UpdateProofRewardPercent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldWindow\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newWindow\",\"type\":\"uint256\"}],\"name\":\"UpdateProofWindow\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldVerifier\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newVerifier\",\"type\":\"address\"}],\"name\":\"UpdateVerifier\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"LAYER_2_CHAIN_ID\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__maxNumTxInChunk\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"addChallenger\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"batchChallengeReward\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batchChallenged\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchChallengedSuccess\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchDataStore\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"originTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"finalizeTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"signedSequencersBitmap\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchExist\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchInChallenge\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchInsideChallengeWindow\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"batchIndex\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"_batchHash\",\"type\":\"bytes32\"}],\"name\":\"challengeState\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"challenges\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"batchIndex\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"challengeDeposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"challengeSuccess\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"finished\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"claimProveRemaining\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"claimReward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"parentBatchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blockContexts\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"skippedL1MessageBitmap\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"prevStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"postStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"withdrawalRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structIRollup.BatchDataInput\",\"name\":\"batchDataInput\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"signedSequencersBitmap\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"sequencerSets\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"structIRollup.BatchSignatureInput\",\"name\":\"batchSignatureInput\",\"type\":\"tuple\"}],\"name\":\"commitBatch\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"committedBatches\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"finalizationPeriodSeconds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"}],\"name\":\"finalizeBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"finalizedStateRoots\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"}],\"name\":\"importGenesisBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"inChallenge\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1StakingContract\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_messageQueue\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_verifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_finalizationPeriodSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_proofWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_proofRewardPercent\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"}],\"name\":\"isBatchFinalized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"challengerAddress\",\"type\":\"address\"}],\"name\":\"isChallenger\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isChallenger\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1StakingContract\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastCommittedBatchIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastFinalizedBatchIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageQueue\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proofRewardPercent\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proofWindow\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proveRemaining\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_batchProof\",\"type\":\"bytes\"}],\"name\":\"proveState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"removeChallenger\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_count\",\"type\":\"uint256\"}],\"name\":\"revertBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"revertReqIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_status\",\"type\":\"bool\"}],\"name\":\"setPause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newPeriod\",\"type\":\"uint256\"}],\"name\":\"updateFinalizePeriodSeconds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newWindow\",\"type\":\"uint256\"}],\"name\":\"updateProofWindow\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newProofRewardPercent\",\"type\":\"uint256\"}],\"name\":\"updateRewardPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newVerifier\",\"type\":\"address\"}],\"name\":\"updateVerifier\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"verifier\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"withdrawalRoot\",\"type\":\"bytes32\"}],\"name\":\"withdrawalRoots\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"exist\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", - Bin: "0x60a060405234801562000010575f80fd5b50604051620047c1380380620047c183398101604081905262000033916200010f565b6001600160401b0381166080526200004a62000051565b506200013e565b5f54610100900460ff1615620000bd5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146200010d575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f6020828403121562000120575f80fd5b81516001600160401b038116811462000137575f80fd5b9392505050565b6080516146636200015e5f395f81816105c301526135a001526146635ff3fe6080604052600436106102f0575f3560e01c80638da5cb5b11610186578063b3e0a509116100dc578063ddd8a3dc11610087578063e3fff1dd11610062578063e3fff1dd14610951578063f2fde38b14610970578063fb1e8b041461098f575f80fd5b8063ddd8a3dc146108fe578063de8b30351461091d578063dff7827e1461093c575f80fd5b8063ce5db8d6116100b7578063ce5db8d6146108b7578063d279c191146108cc578063d63b3549146108eb575f80fd5b8063b3e0a50914610866578063bedb86fb14610885578063cd4edc69146108a4575f80fd5b8063a479265d1161013c578063b31a77d311610117578063b31a77d314610813578063b348442514610828578063b35dac4e14610847575f80fd5b8063a479265d146107b4578063a4f209b0146107c9578063abc8d68d146107e8575f80fd5b8063910129d41161016c578063910129d41461073657806397fc007c14610767578063a415d8dc14610786575f80fd5b80638da5cb5b146106695780638f1d377614610686575f80fd5b80632571098d116102465780635ef7a94a116101f1578063715018a6116101cc578063715018a61461061d578063728cdbca1461063157806388b1ea0914610650575f80fd5b80635ef7a94a146105525780635f77cf1d146105b25780636c578c1d146105fe575f80fd5b80633e001b66116102215780633e001b661461050757806357e0af6c1461051c5780635c975abb1461053b575f80fd5b80632571098d146104865780632b7ac3f3146104b15780633b70c18a146104e8575f80fd5b8063121dcd50116102a657806318af3b2b1161028157806318af3b2b1461040c57806321e2f9e01461043c5780632362f03e1461045b575f80fd5b8063121dcd50146103c357806313361101146103d857806318463fb0146103f7575f80fd5b80630ceb6780116102d65780630ceb67801461036157806310d4458314610382578063116a1f42146103a1575f80fd5b806304d77215146102fb578063059def611461033e575f80fd5b366102f757005b5f80fd5b348015610306575f80fd5b50610329610315366004613f76565b60a36020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b348015610349575f80fd5b50610353609d5481565b604051908152602001610335565b34801561036c575f80fd5b5061038061037b366004613fa8565b6109a4565b005b34801561038d575f80fd5b5061038061039c366004614006565b610a76565b3480156103ac575f80fd5b506103296103bb366004613f76565b609d54101590565b3480156103ce575f80fd5b50610353609e5481565b3480156103e3575f80fd5b506103806103f236600461404e565b610dcf565b348015610402575f80fd5b5061035360a75481565b348015610417575f80fd5b50610329610426366004613f76565b5f90815260a26020526040902060010154421090565b348015610447575f80fd5b50610329610456366004613f76565b6112a4565b348015610466575f80fd5b50610353610475366004613f76565b60a16020525f908152604090205481565b348015610491575f80fd5b506103536104a0366004613f76565b60a06020525f908152604090205481565b3480156104bc575f80fd5b50609c546104d0906001600160a01b031681565b6040516001600160a01b039091168152602001610335565b3480156104f3575f80fd5b50609b546104d0906001600160a01b031681565b348015610512575f80fd5b5061035360aa5481565b348015610527575f80fd5b50610380610536366004613f76565b6112d2565b348015610546575f80fd5b5060655460ff16610329565b34801561055d575f80fd5b5061059261056c366004613f76565b60a26020525f908152604090208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001610335565b3480156105bd575f80fd5b506105e57f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610335565b348015610609575f80fd5b50610380610618366004613fa8565b61137d565b348015610628575f80fd5b5061038061143a565b34801561063c575f80fd5b5061038061064b36600461408d565b61144d565b34801561065b575f80fd5b5060a6546103299060ff1681565b348015610674575f80fd5b506033546001600160a01b03166104d0565b348015610691575f80fd5b506106f26106a0366004613f76565b60a46020525f9081526040902080546001820154600283015460039093015467ffffffffffffffff831693680100000000000000009093046001600160a01b0316929060ff8082169161010090041686565b6040805167ffffffffffffffff90971687526001600160a01b03909516602087015293850192909252606084015215156080830152151560a082015260c001610335565b348015610741575f80fd5b50610329610750366004613f76565b5f90815260a4602052604090206003015460ff1690565b348015610772575f80fd5b50610380610781366004613fa8565b611790565b348015610791575f80fd5b506103296107a0366004613fa8565b609f6020525f908152604090205460ff1681565b3480156107bf575f80fd5b5061035360995481565b3480156107d4575f80fd5b506103806107e3366004613f76565b611873565b3480156107f3575f80fd5b50610353610802366004613fa8565b60a56020525f908152604090205481565b34801561081e575f80fd5b5061035360a85481565b348015610833575f80fd5b506103806108423660046140e8565b611923565b348015610852575f80fd5b50610380610861366004613fa8565b611b68565b348015610871575f80fd5b5061038061088036600461404e565b611bc1565b348015610890575f80fd5b5061038061089f36600461415c565b611eb9565b6103806108b2366004614177565b612014565b3480156108c2575f80fd5b5061035360985481565b3480156108d7575f80fd5b506103806108e6366004613fa8565b6125e0565b6103806108f93660046141ad565b61269f565b348015610909575f80fd5b506097546104d0906001600160a01b031681565b348015610928575f80fd5b50610329610937366004613f76565b612f59565b348015610947575f80fd5b50610353609a5481565b34801561095c575f80fd5b5061038061096b366004613f76565b612fa3565b34801561097b575f80fd5b5061038061098a366004613fa8565b613046565b34801561099a575f80fd5b5061035360a95481565b6109ac6130d3565b6001600160a01b0381165f908152609f602052604090205460ff1615610a195760405162461bcd60e51b815260206004820152601f60248201527f6163636f756e7420697320616c72656164792061206368616c6c656e6765720060448201526064015b60405180910390fd5b6001600160a01b0381165f818152609f6020908152604091829020805460ff1916600190811790915591519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc00991015b60405180910390a250565b610a7e6130d3565b5f8111610acd5760405162461bcd60e51b815260206004820152601560248201527f636f756e74206d757374206265206e6f6e7a65726f00000000000000000000006044820152606401610a10565b5f80610ad9858561312d565b915091505f610aec836001015160c01c90565b5f81815260a160205260409020549091508214610b4b5760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a10565b5f60a181610b598785614247565b81526020019081526020015f205414610bd95760405162461bcd60e51b8152602060048201526024808201527f726576657274696e67206d7573742073746172742066726f6d2074686520656e60448201527f64696e67000000000000000000000000000000000000000000000000000000006064820152608401610a10565b609d548111610c505760405162461bcd60e51b815260206004820152602160248201527f63616e206f6e6c792072657665727420756e46696e616c697a6564206261746360448201527f68000000000000000000000000000000000000000000000000000000000000006064820152608401610a10565b610c5b60018261425a565b609e555b8315610dc757604051829082907ecae2739091badfd91c373f0a16cede691e0cd25bb80cff77dd5caeb4710146905f90a35f81815260a16020526040812055610ca781612f59565b15610d02575f81815260a460209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a59092528220805491929091610cf2908490614247565b909155505060a6805460ff191690555b5f81815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a85415801590610d7f575060a85481145b15610d89575f60a8555b6001015f81815260a160205260409020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90940193915081610c5f575b505050505050565b60a85415610e1f5760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a10565b610e27613148565b5f80610e33848461312d565b915091505f610e46836001015160c01c90565b5f81815260a160205260409020549091508214610ea55760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a10565b610eae816112a4565b610efa5760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610a10565b610f0381612f59565b15610f505760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610a10565b5f81815260a4602052604090206003015460ff1615610fb15760405162461bcd60e51b815260206004820152601660248201527f62617463682073686f756c6420626520726576657274000000000000000000006044820152606401610a10565b5f81815260a260205260409020600101544210156110115760405162461bcd60e51b815260206004820152601960248201527f626174636820696e206368616c6c656e67652077696e646f77000000000000006044820152606401610a10565b605983015160a05f61102460018561425a565b81526020019081526020015f20541461107f5760405162461bcd60e51b815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610a10565b5f81815260a06020526040902054156110da5760405162461bcd60e51b815260206004820152601660248201527f626174636820616c7265616479207665726966696564000000000000000000006044820152606401610a10565b80609d546001011461112e5760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610a10565b609d819055600160a35f611143866099015190565b815260208101919091526040015f20805460ff191691151591909117905560798301515f82815260a0602052604090205561119060f98401601185015160c01c600986015160c01c61319b565b60a25f61119e60018461425a565b815260208101919091526040015f908120818155600180820183905560028201839055600390910182905560a491906111d7908461425a565b815260208082019290925260409081015f90812080547fffffffff00000000000000000000000000000000000000000000000000000000168155600181018290556002810182905560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905583815260a1909252902054817f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d611280866079015190565b60998701516040805192835260208301919091520160405180910390a35050505050565b5f81815260a26020526040812054158015906112cc57505f82815260a1602052604090205415155b92915050565b6112da6130d3565b5f811180156112eb57506099548114155b6113375760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964206e65772070726f6f662077696e646f7700000000000000006044820152606401610a10565b609980549082905560408051828152602081018490527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a6191015b60405180910390a15050565b6113856130d3565b6001600160a01b0381165f908152609f602052604090205460ff166113ec5760405162461bcd60e51b815260206004820152601b60248201527f6163636f756e74206973206e6f742061206368616c6c656e67657200000000006044820152606401610a10565b6001600160a01b0381165f818152609f60209081526040808320805460ff19169055519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc0099101610a6b565b6114426130d3565b61144b5f613264565b565b5f54610100900460ff161580801561146b57505f54600160ff909116105b806114845750303b15801561148457505f5460ff166001145b6114f65760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a10565b5f805460ff191660011790558015611534575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b038616158061155157506001600160a01b038516155b15611588576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0387166115de5760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206c31207374616b696e6720636f6e747261637400000000006044820152606401610a10565b6115e66132cd565b6115ee613351565b609780546001600160a01b03808a167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255609b8054898416908316179055609c805492881692909116821790556098859055609984905560a98390556040515f907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96908290a3604080515f8152602081018690527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a437910160405180910390a1604080515f8152602081018590527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a61910160405180910390a1604080515f8152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b0223910160405180910390a18015611787575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b6117986130d3565b6001600160a01b038116158015906117be5750609c546001600160a01b03828116911614155b61180a5760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964206e65772076657269666965720000000000000000000000006044820152606401610a10565b609c80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96905f90a35050565b61187b6130d3565b5f8111801561188b575060648111155b8015611899575060a9548114155b6118e55760405162461bcd60e51b815260206004820152601f60248201527f696e76616c69642070726f6f66207265776172642070657263656e74616765006044820152606401610a10565b60a980549082905560408051828152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b02239101611371565b60a854156119735760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a10565b61197b613148565b5f80611987868661312d565b915091505f61199a836001015160c01c90565b5f81815260a1602052604090205490915082146119f95760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a10565b611a0281612f59565b611a4e5760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610a10565b5f81815260a4602052604090206003810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560a6805460ff191690556099546002909101544291611aa791614247565b11611b1d575f81815260a4602090815260408083206003908101805460ff1916600117905560a2835292819020909201548251808401909352600783527f54696d656f75740000000000000000000000000000000000000000000000000091830191909152611b18918391906133d5565b611787565b611b28838686613531565b61178781336040518060400160405280600d81526020017f50726f6f662073756363657373000000000000000000000000000000000000008152506136e4565b611b706130d3565b60aa80545f909155611b8282826137b0565b604080516001600160a01b0384168152602081018390527fb1b2058a6969e2d25e47bcaebe8ae21c29a23b2752429315b75e2f4f285f3d879101611371565b611bc96130d3565b5f805260a06020527fb84a74ec6ef4d0e83b6006dfaa014ab4026f9f3b97d186e604d29998a4e808ea5415611c405760405162461bcd60e51b815260206004820152601660248201527f67656e6573697320626174636820696d706f72746564000000000000000000006044820152606401610a10565b5f80611c4c848461312d565b915091505f611c5f836001015160c01c90565b90505f611c6d846079015190565b905080611cbc5760405162461bcd60e51b815260206004820152600f60248201527f7a65726f20737461746520726f6f7400000000000000000000000000000000006044820152606401610a10565b600984015160c01c15611d115760405162461bcd60e51b815260206004820152601d60248201527f6c31206d65737361676520706f707065642073686f756c6420626520300000006044820152606401610a10565b5f611d1d856019015190565b03611d6a5760405162461bcd60e51b815260206004820152600e60248201527f7a65726f206461746120686173680000000000000000000000000000000000006044820152606401610a10565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014611d96856039015190565b14611de35760405162461bcd60e51b815260206004820152601660248201527f696e76616c69642076657273696f6e65642068617368000000000000000000006044820152606401610a10565b5f82815260a1602090815260408083208690558051608081018252428082528184019081528183018581526060830186815288875260a2865284872093518455915160018401555160028301555160039091015560a0909152808220839055609e849055609d84905551849184917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a3604080518281525f6020820152849184917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d910160405180910390a3505050505050565b611ec16130d3565b8015611fe257611ecf61385b565b60a65460ff1615611fa15760a7545f90815260a460209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a59092528220805491929091611f23908490614247565b909155505060a7545f90815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a6805460ff191690555b7f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b6040516001600160a01b03909116815260200160405180910390a150565b611fea6138b5565b7f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33611fc4565b50565b335f908152609f602052604090205460ff166120725760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206368616c6c656e67657220616c6c6f776564000000000000006044820152606401610a10565b60a854156120c25760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a10565b6120ca613148565b60a65460ff161561211d5760405162461bcd60e51b815260206004820152601460248201527f616c726561647920696e206368616c6c656e67650000000000000000000000006044820152606401610a10565b8167ffffffffffffffff16609d54106121785760405162461bcd60e51b815260206004820152601760248201527f626174636820616c72656164792066696e616c697a65640000000000000000006044820152606401610a10565b67ffffffffffffffff82165f90815260a1602052604090205481146121df5760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a10565b6121f28267ffffffffffffffff166112a4565b61223e5760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610a10565b67ffffffffffffffff82165f90815260a460205260409020546801000000000000000090046001600160a01b0316156122b95760405162461bcd60e51b815260206004820152601860248201527f626174636820616c7265616479206368616c6c656e67656400000000000000006044820152606401610a10565b67ffffffffffffffff82165f90815260a2602052604090206001015442106123495760405162461bcd60e51b815260206004820152603360248201527f63616e6e6f74206368616c6c656e6765206261746368206f757473696465207460448201527f6865206368616c6c656e67652077696e646f77000000000000000000000000006064820152608401610a10565b60975f9054906101000a90046001600160a01b03166001600160a01b0316630d13fd7b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612399573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906123bd919061426d565b34101561240c5760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742076616c756500000000000000000000000000006044820152606401610a10565b67ffffffffffffffff82811660a78190556040805160c0810182528281523360208083018281523484860190815242606086019081525f6080870181815260a0880182815299825260a4909552969096209451855492516001600160a01b031668010000000000000000027fffffffff00000000000000000000000000000000000000000000000000000000909316981697909717178355945160018301559151600282015592516003909301805492511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff941515949094167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909316929092179290921790556001600160a01b03168267ffffffffffffffff167f3a6ea19df25b49e7624e313ce7c1ab23984238e93727260db56a81735b1b99763460405161255e91815260200190565b60405180910390a35f609d5460016125769190614247565b90505b609e5481116125ce578267ffffffffffffffff1681146125bc576099545f82815260a26020526040812060010180549091906125b6908490614247565b90915550505b806125c681614284565b915050612579565b505060a6805460ff1916600117905550565b335f90815260a560205260408120549081900361263f5760405162461bcd60e51b815260206004820152601c60248201527f696e76616c69642062617463684368616c6c656e6765526577617264000000006044820152606401610a10565b335f90815260a5602052604081205561265882826137b0565b816001600160a01b03167f9c25fa83f414ed363c8d39c98fb3e17567b3431cede71eb062c49d2a63ce247a8260405161269391815260200190565b60405180910390a25050565b6097546001600160a01b03166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa15801561270b573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061272f91906142bb565b61277b5760405162461bcd60e51b815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f7765640000000000006044820152606401610a10565b60a854156127cb5760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a10565b6127d3613148565b6127e060208301836142d6565b60ff16156128305760405162461bcd60e51b815260206004820152600f60248201527f696e76616c69642076657273696f6e00000000000000000000000000000000006044820152606401610a10565b5f61283e60408401846142f6565b9150508061288e5760405162461bcd60e51b815260206004820152600e60248201527f626174636820697320656d7074790000000000000000000000000000000000006044820152606401610a10565b60808301356128df5760405162461bcd60e51b815260206004820152601b60248201527f70726576696f757320737461746520726f6f74206973207a65726f00000000006044820152606401610a10565b60a08301356129305760405162461bcd60e51b815260206004820152601660248201527f6e657720737461746520726f6f74206973207a65726f000000000000000000006044820152606401610a10565b5f8061294761294260208701876142f6565b61312d565b915091505f61295a836001015160c01c90565b5f81815260a1602052604090205490915082146129b95760405162461bcd60e51b815260206004820152601b60248201527f696e636f727265637420706172656e74206261746368206861736800000000006044820152606401610a10565b5f60a1816129c8846001614247565b81526020019081526020015f205414612a235760405162461bcd60e51b815260206004820152601760248201527f626174636820616c726561647920636f6d6d69747465640000000000000000006044820152606401610a10565b609e548114612a745760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610a10565b5f612a83846011015160c01c90565b90505f8080612ae2612a9860408c018c6142f6565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250879250889150612add905060608f018f6142f6565b6138ee565b948501949384019392509050612afb60608b018b6142f6565b905061010060ff85010460200214612b555760405162461bcd60e51b815260206004820152601360248201527f77726f6e67206269746d6170206c656e677468000000000000000000000000006044820152606401610a10565b600194909401935f804915612b6b575f49612b8d565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440145b90505f612b9d60608d018d6142f6565b612ba9915060f9614247565b90506040519850602081028901604052612bd7898d5f016020810190612bcf91906142d6565b60ff16613a6f565b60c087811b60018b015285811b60098b015286811b60118b015260198a0184905260808d013560598b015260a08d013560798b01528c013560998a0152612c4489612c2560208e018e6142f6565b604051612c33929190614357565b604051809103902060b99190910152565b60d98901889052612c6189612c5c60608f018f6142f6565b613a76565b603989018290528089205f88815260a1602052604081209190915560a65460ff1615612cb65760a7545f90815260a460205260409020600201546099544291612ca991614247565b612cb3919061425a565b90505b60405180608001604052804281526020018260985442612cd69190614247565b612ce09190614247565b8152602001612d318f8060400190612cf891906142f6565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250613a8292505050565b81526097546020909101906001600160a01b031663d096c3c6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015612da5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612dc9919061426d565b90525f89815260a2602090815260409182902083518155838201516001820155918301516002830155606090920151600390910155609e8990556097546001600160a01b031692506374fe27b791508c3590612e3190612e2b908f018f6142f6565b5f613ad9565b5f8e8060400190612e4291906142f6565b6040518663ffffffff1660e01b8152600401612e629594939291906143ad565b602060405180830381865afa158015612e7d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ea191906142bb565b612f135760405162461bcd60e51b815260206004820152602160248201527f746865207369676e617475726520766572696669636174696f6e206661696c6560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610a10565b5f86815260a16020526040808220549051909188917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a35050505050505050505050565b5f81815260a460205260408120546801000000000000000090046001600160a01b0316158015906112cc5750505f90815260a46020526040902060030154610100900460ff161590565b612fab6130d3565b5f81118015612fbc57506098548114155b6130085760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206e65772066696e616c697a6520706572696f6400000000006044820152606401610a10565b609880549082905560408051828152602081018490527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a4379101611371565b61304e6130d3565b6001600160a01b0381166130ca5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a10565b61201181613264565b6033546001600160a01b0316331461144b5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a10565b5f805f61313a8585613b2d565b812090969095509350505050565b60655460ff161561144b5760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a10565b805f036131a757505050565b8082035f805b83811015610dc7576101008185038111156131c757508084035b8651609b546040517f55f613ce0000000000000000000000000000000000000000000000000000000081526004810187905260248101849052604481018390526020909901989194506001600160a01b0316906355f613ce906064015f604051808303815f87803b15801561323a575f80fd5b505af115801561324c573d5f803e3d5ffd5b505050506101008401935050610100810190506131ad565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff166133495760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a10565b61144b613c04565b5f54610100900460ff166133cd5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a10565b61144b613c8c565b60a88390555f83815260a460205260408082205460975491517f45bc4d1000000000000000000000000000000000000000000000000000000000815260048101869052680100000000000000009091046001600160a01b03908116939216906345bc4d10906024016020604051808303815f875af1158015613459573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061347d919061426d565b5f86815260a4602052604090206001015490915061349c908290614247565b5f86815260a460209081526040808320546801000000000000000090046001600160a01b0316835260a5909152812080549091906134db908490614247565b90915550506040516134ee908490614420565b604051908190038120906001600160a01b0384169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b8061357e5760405162461bcd60e51b815260206004820152601360248201527f496e76616c69642062617463682070726f6f66000000000000000000000000006044820152606401610a10565b5f61358d846001015160c01c90565b90505f61359b856039015190565b90505f7f00000000000000000000000000000000000000000000000000000000000000006135ca876059015190565b6079880151609989015160b98a015160198b015160405160c09690961b7fffffffffffffffff000000000000000000000000000000000000000000000000166020870152602886019490945260488501929092526068840152608883015260a882015260c8810183905260e801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120609c549091506001600160a01b0316632c09a84861368c885160f81c90565b858888866040518663ffffffff1660e01b81526004016136b095949392919061444c565b5f6040518083038186803b1580156136c6575f80fd5b505afa1580156136d8573d5f803e3d5ffd5b50505050505050505050565b5f83815260a4602052604081206001015460a954909190606490613708908461447d565b6137129190614494565b905061371e818361425a565b60aa5f82825461372e9190614247565b90915550506001600160a01b0384165f90815260a560205260408120805483929061375a908490614247565b909155505060405161376d908490614420565b604051908190038120906001600160a01b0386169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b8015613857575f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146137ff576040519150601f19603f3d011682016040523d82523d5f602084013e613804565b606091505b50509050806138555760405162461bcd60e51b815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c656400000000006044820152606401610a10565b505b5050565b613863613148565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586138983390565b6040516001600160a01b03909116815260200160405180910390a1565b6138bd613d11565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33613898565b60405185515f9182916020890191908190849061390c908590613d63565b90506002840193505f5b8181101561399057603c81028501805184526020908101517fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000001690840152603a830192505f613966603c8361447d565b6139709087614247565b90505f61398182603a015160f01c90565b97909701965050600101613916565b506020850282016040525b8015613a5b575f6139b085603a015160f01c90565b90506139c083828d8d8d8d613df8565b92505f6139d1866038015160f01c90565b905081811015613a235760405162461bcd60e51b815260206004820152601d60248201527f6e756d20747873206c657373207468616e206e756d204c31206d7367730000006044820152606401610a10565b50998a01999890980197603c93909301927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0161399b565b508190039020989197509095505050505050565b8082535050565b808260f9850137505050565b5f805f6020840190506002810191505f613a9d828651613d63565b90505f5b613aac60018361425a565b811015613ac257603c9390930192600101613aa1565b505f613acf845160c01c90565b9695505050505050565b60605f80808080613aec888a018a6145b9565b9550955095509550955050818710613b0a579450613b269350505050565b838710613b1e578295505050505050613b26565b509293505050505b9392505050565b5f8160f9811015613b805760405162461bcd60e51b815260206004820152601d60248201527f626174636820686561646572206c656e67746820746f6f20736d616c6c0000006044820152606401610a10565b6040519150808483378082016040525f613b9e836009015160c01c90565b905061010060ff82010460200260f9018214613bfc5760405162461bcd60e51b815260206004820152601360248201527f77726f6e67206269746d6170206c656e677468000000000000000000000000006044820152606401610a10565b509250929050565b5f54610100900460ff16613c805760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a10565b6065805460ff19169055565b5f54610100900460ff16613d085760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a10565b61144b33613264565b60655460ff1661144b5760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610a10565b5f613d6f835160f01c90565b9050805f03613daa576040517f5168407700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613db5603c8261447d565b613dc0906002614247565b82146112cc576040517f4a969e2d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f855f03613e07575085613acf565b609b546001600160a01b03165f80805b89811015613eed5760ff89169150600889901c811580613e35575082155b15613e44578060200288013593505b600184841c165f03613edc576040517fae453cd5000000000000000000000000000000000000000000000000000000008152600481018a90525f906001600160a01b0387169063ae453cd590602401602060405180830381865afa158015613eae573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ed2919061426d565b8d52506020909b019a5b506001988901989788019701613e17565b505060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff88011681811c60011615613f685760405162461bcd60e51b815260206004820152601b60248201527f63616e6e6f7420736b6970206c617374204c31206d65737361676500000000006044820152606401610a10565b509798975050505050505050565b5f60208284031215613f86575f80fd5b5035919050565b80356001600160a01b0381168114613fa3575f80fd5b919050565b5f60208284031215613fb8575f80fd5b613b2682613f8d565b5f8083601f840112613fd1575f80fd5b50813567ffffffffffffffff811115613fe8575f80fd5b602083019150836020828501011115613fff575f80fd5b9250929050565b5f805f60408486031215614018575f80fd5b833567ffffffffffffffff81111561402e575f80fd5b61403a86828701613fc1565b909790965060209590950135949350505050565b5f806020838503121561405f575f80fd5b823567ffffffffffffffff811115614075575f80fd5b61408185828601613fc1565b90969095509350505050565b5f805f805f8060c087890312156140a2575f80fd5b6140ab87613f8d565b95506140b960208801613f8d565b94506140c760408801613f8d565b9350606087013592506080870135915060a087013590509295509295509295565b5f805f80604085870312156140fb575f80fd5b843567ffffffffffffffff80821115614112575f80fd5b61411e88838901613fc1565b90965094506020870135915080821115614136575f80fd5b5061414387828801613fc1565b95989497509550505050565b8015158114612011575f80fd5b5f6020828403121561416c575f80fd5b8135613b268161414f565b5f8060408385031215614188575f80fd5b823567ffffffffffffffff8116811461419f575f80fd5b946020939093013593505050565b5f80604083850312156141be575f80fd5b823567ffffffffffffffff808211156141d5575f80fd5b9084019060e082870312156141e8575f80fd5b909250602084013590808211156141fd575f80fd5b5083016060818603121561420f575f80fd5b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156112cc576112cc61421a565b818103818111156112cc576112cc61421a565b5f6020828403121561427d575f80fd5b5051919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036142b4576142b461421a565b5060010190565b5f602082840312156142cb575f80fd5b8151613b268161414f565b5f602082840312156142e6575f80fd5b813560ff81168114613b26575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614329575f80fd5b83018035915067ffffffffffffffff821115614343575f80fd5b602001915036819003821315613fff575f80fd5b818382375f9101908152919050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f6080820187835260206080602085015281885180845260a08601915060208a0193505f5b818110156143f75784516001600160a01b0316835293830193918301916001016143d2565b50508760408601528481036060860152614412818789614366565b9a9950505050505050505050565b5f82515f5b8181101561443f5760208186018101518583015201614425565b505f920191825250919050565b858152846020820152608060408201525f61446b608083018587614366565b90508260608301529695505050505050565b80820281158282048414176112cc576112cc61421a565b5f826144c7577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112614508575f80fd5b8135602067ffffffffffffffff80831115614525576145256144cc565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108482111715614568576145686144cc565b6040529384526020818701810194908101925087851115614587575f80fd5b6020870191505b848210156145ae5761459f82613f8d565b8352918301919083019061458e565b979650505050505050565b5f805f805f8060c087890312156145ce575f80fd5b86359550602087013567ffffffffffffffff808211156145ec575f80fd5b6145f88a838b016144f9565b9650604089013595506060890135915080821115614614575f80fd5b6146208a838b016144f9565b94506080890135935060a089013591508082111561463c575f80fd5b5061464989828a016144f9565b915050929550929550929556fea164736f6c6343000818000a", + ABI: "[{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_chainID\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ErrZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"string\",\"name\":\"res\",\"type\":\"string\"}],\"name\":\"ChallengeRes\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ChallengeRewardClaim\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"batchIndex\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"challengeDeposit\",\"type\":\"uint256\"}],\"name\":\"ChallengeState\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"name\":\"CommitBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"withdrawRoot\",\"type\":\"bytes32\"}],\"name\":\"FinalizeBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ProveRemainingClaimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"name\":\"RevertBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"}],\"name\":\"UpdateChallenger\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldPeriod\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPeriod\",\"type\":\"uint256\"}],\"name\":\"UpdateFinalizationPeriodSeconds\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldPercent\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPercent\",\"type\":\"uint256\"}],\"name\":\"UpdateProofRewardPercent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldWindow\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newWindow\",\"type\":\"uint256\"}],\"name\":\"UpdateProofWindow\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldVerifier\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newVerifier\",\"type\":\"address\"}],\"name\":\"UpdateVerifier\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"LAYER_2_CHAIN_ID\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__maxNumTxInChunk\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"addChallenger\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"batchChallengeReward\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batchChallenged\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchChallengedSuccess\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchDataStore\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"originTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"finalizeTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"signedSequencersBitmap\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchExist\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchInChallenge\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchInsideChallengeWindow\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"batchIndex\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"_batchHash\",\"type\":\"bytes32\"}],\"name\":\"challengeState\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"challenges\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"batchIndex\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"challengeDeposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"challengeSuccess\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"finished\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"claimProveRemaining\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"claimReward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"parentBatchHeader\",\"type\":\"bytes\"},{\"internalType\":\"uint64\",\"name\":\"lastBlockNumber\",\"type\":\"uint64\"},{\"internalType\":\"uint16\",\"name\":\"numL1Messages\",\"type\":\"uint16\"},{\"internalType\":\"bytes32\",\"name\":\"prevStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"postStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"withdrawalRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structIRollup.BatchDataInput\",\"name\":\"batchDataInput\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"signedSequencersBitmap\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"sequencerSets\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"structIRollup.BatchSignatureInput\",\"name\":\"batchSignatureInput\",\"type\":\"tuple\"}],\"name\":\"commitBatch\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"committedBatches\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"committedStateRoots\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"finalizationPeriodSeconds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"}],\"name\":\"finalizeBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"finalizedStateRoots\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"}],\"name\":\"importGenesisBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"inChallenge\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1StakingContract\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_messageQueue\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_verifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_finalizationPeriodSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_proofWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_proofRewardPercent\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_prevStateRoot\",\"type\":\"bytes32\"}],\"name\":\"initialize2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"}],\"name\":\"isBatchFinalized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"challengerAddress\",\"type\":\"address\"}],\"name\":\"isChallenger\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isChallenger\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1StakingContract\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastCommittedBatchIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastFinalizedBatchIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageQueue\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proofRewardPercent\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proofWindow\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proveRemaining\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_batchProof\",\"type\":\"bytes\"}],\"name\":\"proveState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"removeChallenger\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_count\",\"type\":\"uint256\"}],\"name\":\"revertBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"revertReqIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_status\",\"type\":\"bool\"}],\"name\":\"setPause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newPeriod\",\"type\":\"uint256\"}],\"name\":\"updateFinalizePeriodSeconds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newWindow\",\"type\":\"uint256\"}],\"name\":\"updateProofWindow\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newProofRewardPercent\",\"type\":\"uint256\"}],\"name\":\"updateRewardPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newVerifier\",\"type\":\"address\"}],\"name\":\"updateVerifier\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"verifier\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"withdrawalRoot\",\"type\":\"bytes32\"}],\"name\":\"withdrawalRoots\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"exist\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", + Bin: "0x60a060405234801562000010575f80fd5b50604051620049833803806200498383398101604081905262000033916200010f565b6001600160401b0381166080526200004a62000051565b506200013e565b5f54610100900460ff1615620000bd5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146200010d575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f6020828403121562000120575f80fd5b81516001600160401b038116811462000137575f80fd5b9392505050565b6080516148256200015e5f395f81816105ec0152613a2901526148255ff3fe608060405260043610610306575f3560e01c8063728cdbca11610191578063b35dac4e116100dc578063ddd8a3dc11610087578063e3fff1dd11610062578063e3fff1dd146109b1578063f2fde38b146109d0578063fb1e8b04146109ef575f80fd5b8063ddd8a3dc1461095e578063de8b30351461097d578063dff7827e1461099c575f80fd5b8063cd4edc69116100b7578063cd4edc6914610917578063ce5db8d61461092a578063d279c1911461093f575f80fd5b8063b35dac4e146108ba578063b3e0a509146108d9578063bedb86fb146108f8575f80fd5b8063a415d8dc1161013c578063abc8d68d11610117578063abc8d68d1461085b578063b31a77d314610886578063b34844251461089b575f80fd5b8063a415d8dc146107f9578063a479265d14610827578063a4f209b01461083c575f80fd5b80638f1d37761161016c5780638f1d3776146106f9578063910129d4146107a957806397fc007c146107da575f80fd5b8063728cdbca146106a457806388b1ea09146106c35780638da5cb5b146106dc575f80fd5b80632b7ac3f3116102515780635ef7a94a116101fc57806368589dfa116101d757806368589dfa146106465780636c578c1d14610671578063715018a614610690575f80fd5b80635ef7a94a1461057b5780635f77cf1d146105db5780636126729014610627575f80fd5b8063428868b51161022c578063428868b51461053257806357e0af6c146105455780635c975abb14610564575f80fd5b80632b7ac3f3146104c75780633b70c18a146104fe5780633e001b661461051d575f80fd5b806313361101116102b157806321e2f9e01161028c57806321e2f9e0146104525780632362f03e146104715780632571098d1461049c575f80fd5b806313361101146103ee57806318463fb01461040d57806318af3b2b14610422575f80fd5b806310d44583116102e157806310d4458314610398578063116a1f42146103b7578063121dcd50146103d9575f80fd5b806304d7721514610311578063059def61146103545780630ceb678014610377575f80fd5b3661030d57005b5f80fd5b34801561031c575f80fd5b5061033f61032b3660046140c8565b60a36020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561035f575f80fd5b50610369609d5481565b60405190815260200161034b565b348015610382575f80fd5b506103966103913660046140fa565b610a04565b005b3480156103a3575f80fd5b506103966103b2366004614158565b610ad6565b3480156103c2575f80fd5b5061033f6103d13660046140c8565b609d54101590565b3480156103e4575f80fd5b50610369609e5481565b3480156103f9575f80fd5b506103966104083660046141a0565b610e2f565b348015610418575f80fd5b5061036960a75481565b34801561042d575f80fd5b5061033f61043c3660046140c8565b5f90815260a26020526040902060010154421090565b34801561045d575f80fd5b5061033f61046c3660046140c8565b611326565b34801561047c575f80fd5b5061036961048b3660046140c8565b60a16020525f908152604090205481565b3480156104a7575f80fd5b506103696104b63660046140c8565b60a06020525f908152604090205481565b3480156104d2575f80fd5b50609c546104e6906001600160a01b031681565b6040516001600160a01b03909116815260200161034b565b348015610509575f80fd5b50609b546104e6906001600160a01b031681565b348015610528575f80fd5b5061036960aa5481565b6103966105403660046141df565b611354565b348015610550575f80fd5b5061039661055f3660046140c8565b611bbb565b34801561056f575f80fd5b5060655460ff1661033f565b348015610586575f80fd5b506105bb6105953660046140c8565b60a26020525f908152604090208054600182015460028301546003909301549192909184565b60408051948552602085019390935291830152606082015260800161034b565b3480156105e6575f80fd5b5061060e7f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff909116815260200161034b565b348015610632575f80fd5b506103966106413660046140c8565b611c66565b348015610651575f80fd5b506103696106603660046140c8565b60ab6020525f908152604090205481565b34801561067c575f80fd5b5061039661068b3660046140fa565b611e7b565b34801561069b575f80fd5b50610396611f38565b3480156106af575f80fd5b506103966106be36600461424c565b611f4b565b3480156106ce575f80fd5b5060a65461033f9060ff1681565b3480156106e7575f80fd5b506033546001600160a01b03166104e6565b348015610704575f80fd5b506107656107133660046140c8565b60a46020525f9081526040902080546001820154600283015460039093015467ffffffffffffffff831693680100000000000000009093046001600160a01b0316929060ff8082169161010090041686565b6040805167ffffffffffffffff90971687526001600160a01b03909516602087015293850192909252606084015215156080830152151560a082015260c00161034b565b3480156107b4575f80fd5b5061033f6107c33660046140c8565b5f90815260a4602052604090206003015460ff1690565b3480156107e5575f80fd5b506103966107f43660046140fa565b61228e565b348015610804575f80fd5b5061033f6108133660046140fa565b609f6020525f908152604090205460ff1681565b348015610832575f80fd5b5061036960995481565b348015610847575f80fd5b506103966108563660046140c8565b612371565b348015610866575f80fd5b506103696108753660046140fa565b60a56020525f908152604090205481565b348015610891575f80fd5b5061036960a85481565b3480156108a6575f80fd5b506103966108b53660046142a7565b612421565b3480156108c5575f80fd5b506103966108d43660046140fa565b612742565b3480156108e4575f80fd5b506103966108f33660046141a0565b61279b565b348015610903575f80fd5b5061039661091236600461431b565b612aeb565b61039661092536600461434d565b612c46565b348015610935575f80fd5b5061036960985481565b34801561094a575f80fd5b506103966109593660046140fa565b613212565b348015610969575f80fd5b506097546104e6906001600160a01b031681565b348015610988575f80fd5b5061033f6109973660046140c8565b6132d1565b3480156109a7575f80fd5b50610369609a5481565b3480156109bc575f80fd5b506103966109cb3660046140c8565b61331b565b3480156109db575f80fd5b506103966109ea3660046140fa565b6133be565b3480156109fa575f80fd5b5061036960a95481565b610a0c61344b565b6001600160a01b0381165f908152609f602052604090205460ff1615610a795760405162461bcd60e51b815260206004820152601f60248201527f6163636f756e7420697320616c72656164792061206368616c6c656e6765720060448201526064015b60405180910390fd5b6001600160a01b0381165f818152609f6020908152604091829020805460ff1916600190811790915591519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc00991015b60405180910390a250565b610ade61344b565b5f8111610b2d5760405162461bcd60e51b815260206004820152601560248201527f636f756e74206d757374206265206e6f6e7a65726f00000000000000000000006044820152606401610a70565b5f80610b3985856134a5565b915091505f610b4c836001015160c01c90565b5f81815260a160205260409020549091508214610bab5760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b5f60a181610bb987856143a2565b81526020019081526020015f205414610c395760405162461bcd60e51b8152602060048201526024808201527f726576657274696e67206d7573742073746172742066726f6d2074686520656e60448201527f64696e67000000000000000000000000000000000000000000000000000000006064820152608401610a70565b609d548111610cb05760405162461bcd60e51b815260206004820152602160248201527f63616e206f6e6c792072657665727420756e46696e616c697a6564206261746360448201527f68000000000000000000000000000000000000000000000000000000000000006064820152608401610a70565b610cbb6001826143b5565b609e555b8315610e2757604051829082907ecae2739091badfd91c373f0a16cede691e0cd25bb80cff77dd5caeb4710146905f90a35f81815260a16020526040812055610d07816132d1565b15610d62575f81815260a460209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a59092528220805491929091610d529084906143a2565b909155505060a6805460ff191690555b5f81815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a85415801590610ddf575060a85481145b15610de9575f60a8555b6001015f81815260a160205260409020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90940193915081610cbf575b505050505050565b60a85415610e7f5760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b610e8761353e565b5f80610e9384846134a5565b915091505f610ea6836001015160c01c90565b5f81815260a160205260409020549091508214610f055760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b610f0e81611326565b610f5a5760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610a70565b610f63816132d1565b15610fb05760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610a70565b5f81815260a4602052604090206003015460ff16156110115760405162461bcd60e51b815260206004820152601660248201527f62617463682073686f756c6420626520726576657274000000000000000000006044820152606401610a70565b5f81815260a260205260409020600101544210156110715760405162461bcd60e51b815260206004820152601960248201527f626174636820696e206368616c6c656e67652077696e646f77000000000000006044820152606401610a70565b605983015160a05f6110846001856143b5565b81526020019081526020015f2054146110df5760405162461bcd60e51b815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610a70565b5f81815260a060205260409020541561113a5760405162461bcd60e51b815260206004820152601660248201527f626174636820616c7265616479207665726966696564000000000000000000006044820152606401610a70565b80609d546001011461118e5760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610a70565b609d819055600160a35f6111a3866099015190565b815260208101919091526040015f20805460ff191691151591909117905560798301515f82815260a060205260409020556111f26111e5846011015160c01c90565b600985015160c01c613591565b60a25f6112006001846143b5565b815260208101919091526040015f908120818155600180820183905560028201839055600390910182905560ab919061123990846143b5565b81526020019081526020015f205f905560a45f60018361125991906143b5565b815260208082019290925260409081015f90812080547fffffffff00000000000000000000000000000000000000000000000000000000168155600181018290556002810182905560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905583815260a1909252902054817f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d611302866079015190565b60998701516040805192835260208301919091520160405180910390a35050505050565b5f81815260a260205260408120541580159061134e57505f82815260a1602052604090205415155b92915050565b6097546001600160a01b03166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156113c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e491906143c8565b6114305760405162461bcd60e51b815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f7765640000000000006044820152606401610a70565b60a854156114805760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b61148861353e565b61149560208301836143e3565b60ff1615806114b357506114ac60208301836143e3565b60ff166001145b6114ff5760405162461bcd60e51b815260206004820152600f60248201527f696e76616c69642076657273696f6e00000000000000000000000000000000006044820152606401610a70565b60808201356115505760405162461bcd60e51b815260206004820152601b60248201527f70726576696f757320737461746520726f6f74206973207a65726f00000000006044820152606401610a70565b60a08201356115a15760405162461bcd60e51b815260206004820152601660248201527f6e657720737461746520726f6f74206973207a65726f000000000000000000006044820152606401610a70565b5f806115b86115b36020860186614403565b6134a5565b915091505f6115cb836001015160c01c90565b90505f60a1816115dc8460016143a2565b81526020019081526020015f2054146116375760405162461bcd60e51b815260206004820152601760248201527f626174636820616c726561647920636f6d6d69747465640000000000000000006044820152606401610a70565b609e5481146116885760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610a70565b5f81815260a1602052604090205482146116e45760405162461bcd60e51b815260206004820152601b60248201527f696e636f727265637420706172656e74206261746368206861736800000000006044820152606401610a70565b5f81815260ab60205260409020546080860135146117445760405162461bcd60e51b815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610a70565b5f611753846011015160c01c90565b90505f61177f6117696060890160408a01614464565b61177960808a0160608b0161447d565b8461364e565b9050611791608088016060890161447d565b6001939093019261ffff1691909101905f8049156117b0575f496117d2565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440145b905060f96117e360208a018a6143e3565b60ff166001036117f257506101015b6040805182810190915296506118178761180f60208c018c6143e3565b60ff16613692565b60c085901b60018801526118458761183560808c0160608d0161447d565b61ffff1660c01b60099190910152565b60c084811b6011890152601988018490526039880183905260808a0135605989015260a08a0135607989015289013560998801526118a98761188a60208b018b614403565b60405161189892919061449e565b604051809103902060b99190910152565b60d9870186905260016118bf60208b018b6143e3565b60ff16106118f1576118f1876118db60608c0160408d01614464565b67ffffffffffffffff1660c01b60f99190910152565b8087205f86815260a1602090815260408083209390935560ab905290812060a08b0135905560a65460ff16156119505760a7545f90815260a460205260409020600201546099544291611943916143a2565b61194d91906143b5565b90505b6040518060800160405280428152602001826098544261197091906143a2565b61197a91906143a2565b815260200161198f60608d0160408e01614464565b67ffffffffffffffff1681526097546020909101906001600160a01b031663d096c3c6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611a0d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a3191906144ad565b90525f87815260a2602090815260409182902083518155838201516001820155918301516002830155606090920151600390910155609e8790556097546001600160a01b031692506374fe27b79150893590611a9990611a93908c018c614403565b5f613699565b5f611aa760408d018d614403565b6040518663ffffffff1660e01b8152600401611ac795949392919061450b565b602060405180830381865afa158015611ae2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b0691906143c8565b611b785760405162461bcd60e51b815260206004820152602160248201527f746865207369676e617475726520766572696669636174696f6e206661696c6560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610a70565b5f84815260a16020526040808220549051909186917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a35050505050505050565b611bc361344b565b5f81118015611bd457506099548114155b611c205760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964206e65772070726f6f662077696e646f7700000000000000006044820152606401610a70565b609980549082905560408051828152602081018490527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a6191015b60405180910390a15050565b5f54600290610100900460ff16158015611c8657505f5460ff8083169116105b611cf85760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a70565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055611d335f5460ff1690565b60ff16600214611d855760405162461bcd60e51b815260206004820152601660248201527f6d757374206861766520696e697469616c697a656421000000000000000000006044820152606401610a70565b81611df85760405162461bcd60e51b815260206004820152602760248201527f63616e206e6f742073657420737461746520726f6f742077697468206279746560448201527f73333228302921000000000000000000000000000000000000000000000000006064820152608401610a70565b609e545f90815260ab6020526040902054611e2157609e545f90815260ab602052604090208290555b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611c5a565b611e8361344b565b6001600160a01b0381165f908152609f602052604090205460ff16611eea5760405162461bcd60e51b815260206004820152601b60248201527f6163636f756e74206973206e6f742061206368616c6c656e67657200000000006044820152606401610a70565b6001600160a01b0381165f818152609f60209081526040808320805460ff19169055519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc0099101610acb565b611f4061344b565b611f495f6136ed565b565b5f54610100900460ff1615808015611f6957505f54600160ff909116105b80611f825750303b158015611f8257505f5460ff166001145b611ff45760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a70565b5f805460ff191660011790558015612032575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b038616158061204f57506001600160a01b038516155b15612086576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0387166120dc5760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206c31207374616b696e6720636f6e747261637400000000006044820152606401610a70565b6120e4613756565b6120ec6137da565b609780546001600160a01b03808a167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255609b8054898416908316179055609c805492881692909116821790556098859055609984905560a98390556040515f907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96908290a3604080515f8152602081018690527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a437910160405180910390a1604080515f8152602081018590527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a61910160405180910390a1604080515f8152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b0223910160405180910390a18015612285575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b61229661344b565b6001600160a01b038116158015906122bc5750609c546001600160a01b03828116911614155b6123085760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964206e65772076657269666965720000000000000000000000006044820152606401610a70565b609c80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96905f90a35050565b61237961344b565b5f81118015612389575060648111155b8015612397575060a9548114155b6123e35760405162461bcd60e51b815260206004820152601f60248201527f696e76616c69642070726f6f66207265776172642070657263656e74616765006044820152606401610a70565b60a980549082905560408051828152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b02239101611c5a565b60a854156124715760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b61247961353e565b6097546001600160a01b03166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156124e5573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061250991906143c8565b6125555760405162461bcd60e51b815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f7765640000000000006044820152606401610a70565b5f8061256186866134a5565b915091505f612574836001015160c01c90565b5f81815260a1602052604090205490915082146125d35760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b6125dc816132d1565b6126285760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610a70565b5f81815260a4602052604090206003810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560a6805460ff191690556099546002909101544291612681916143a2565b116126f7575f81815260a4602090815260408083206003908101805460ff1916600117905560a2835292819020909201548251808401909352600783527f54696d656f757400000000000000000000000000000000000000000000000000918301919091526126f29183919061385e565b612285565b6127028386866139ba565b61228581336040518060400160405280600d81526020017f50726f6f66207375636365737300000000000000000000000000000000000000815250613b6d565b61274a61344b565b60aa80545f90915561275c8282613c39565b604080516001600160a01b0384168152602081018390527fb1b2058a6969e2d25e47bcaebe8ae21c29a23b2752429315b75e2f4f285f3d879101611c5a565b6127a361344b565b5f805260a06020527fb84a74ec6ef4d0e83b6006dfaa014ab4026f9f3b97d186e604d29998a4e808ea541561281a5760405162461bcd60e51b815260206004820152601660248201527f67656e6573697320626174636820696d706f72746564000000000000000000006044820152606401610a70565b5f8061282684846134a5565b915091505f612839836001015160c01c90565b905080156128895760405162461bcd60e51b815260206004820152601360248201527f696e76616c696420626174636820696e646578000000000000000000000000006044820152606401610a70565b5f612895846079015190565b9050806128e45760405162461bcd60e51b815260206004820152600f60248201527f7a65726f20737461746520726f6f7400000000000000000000000000000000006044820152606401610a70565b600984015160c01c156129395760405162461bcd60e51b815260206004820152601d60248201527f6c31206d65737361676520706f707065642073686f756c6420626520300000006044820152606401610a70565b5f612945856019015190565b036129925760405162461bcd60e51b815260206004820152600e60248201527f7a65726f206461746120686173680000000000000000000000000000000000006044820152606401610a70565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440146129be856039015190565b14612a0b5760405162461bcd60e51b815260206004820152601660248201527f696e76616c69642076657273696f6e65642068617368000000000000000000006044820152606401610a70565b5f82815260a1602090815260408083208690558051608081018252428082528184019081528183018581526060830186815288875260a2865284872093518455915160018401555160028301555160039091015560ab825280832084905560a0909152808220839055609e849055609d84905551849184917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a3604080518281525f6020820152849184917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d910160405180910390a3505050505050565b612af361344b565b8015612c1457612b01613ce4565b60a65460ff1615612bd35760a7545f90815260a460209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a59092528220805491929091612b559084906143a2565b909155505060a7545f90815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a6805460ff191690555b7f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b6040516001600160a01b03909116815260200160405180910390a150565b612c1c613d3e565b7f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33612bf6565b50565b335f908152609f602052604090205460ff16612ca45760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206368616c6c656e67657220616c6c6f776564000000000000006044820152606401610a70565b60a85415612cf45760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b612cfc61353e565b60a65460ff1615612d4f5760405162461bcd60e51b815260206004820152601460248201527f616c726561647920696e206368616c6c656e67650000000000000000000000006044820152606401610a70565b8167ffffffffffffffff16609d5410612daa5760405162461bcd60e51b815260206004820152601760248201527f626174636820616c72656164792066696e616c697a65640000000000000000006044820152606401610a70565b67ffffffffffffffff82165f90815260a160205260409020548114612e115760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b612e248267ffffffffffffffff16611326565b612e705760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610a70565b67ffffffffffffffff82165f90815260a460205260409020546801000000000000000090046001600160a01b031615612eeb5760405162461bcd60e51b815260206004820152601860248201527f626174636820616c7265616479206368616c6c656e67656400000000000000006044820152606401610a70565b67ffffffffffffffff82165f90815260a260205260409020600101544210612f7b5760405162461bcd60e51b815260206004820152603360248201527f63616e6e6f74206368616c6c656e6765206261746368206f757473696465207460448201527f6865206368616c6c656e67652077696e646f77000000000000000000000000006064820152608401610a70565b60975f9054906101000a90046001600160a01b03166001600160a01b0316630d13fd7b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612fcb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612fef91906144ad565b34101561303e5760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742076616c756500000000000000000000000000006044820152606401610a70565b67ffffffffffffffff82811660a78190556040805160c0810182528281523360208083018281523484860190815242606086019081525f6080870181815260a0880182815299825260a4909552969096209451855492516001600160a01b031668010000000000000000027fffffffff00000000000000000000000000000000000000000000000000000000909316981697909717178355945160018301559151600282015592516003909301805492511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff941515949094167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909316929092179290921790556001600160a01b03168267ffffffffffffffff167f3a6ea19df25b49e7624e313ce7c1ab23984238e93727260db56a81735b1b99763460405161319091815260200190565b60405180910390a35f609d5460016131a891906143a2565b90505b609e548111613200578267ffffffffffffffff1681146131ee576099545f82815260a26020526040812060010180549091906131e89084906143a2565b90915550505b806131f88161457e565b9150506131ab565b505060a6805460ff1916600117905550565b335f90815260a56020526040812054908190036132715760405162461bcd60e51b815260206004820152601c60248201527f696e76616c69642062617463684368616c6c656e6765526577617264000000006044820152606401610a70565b335f90815260a5602052604081205561328a8282613c39565b816001600160a01b03167f9c25fa83f414ed363c8d39c98fb3e17567b3431cede71eb062c49d2a63ce247a826040516132c591815260200190565b60405180910390a25050565b5f81815260a460205260408120546801000000000000000090046001600160a01b03161580159061134e5750505f90815260a46020526040902060030154610100900460ff161590565b61332361344b565b5f8111801561333457506098548114155b6133805760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206e65772066696e616c697a6520706572696f6400000000006044820152606401610a70565b609880549082905560408051828152602081018490527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a4379101611c5a565b6133c661344b565b6001600160a01b0381166134425760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a70565b612c43816136ed565b6033546001600160a01b03163314611f495760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a70565b5f805f6134b28585613d77565b90505f8160ff165f036134d3576134c98686613de7565b9094509050613530565b8160ff166001036134e8576134c98686613e50565b60405162461bcd60e51b815260206004820152601960248201527f556e737570706f727465642062617463682076657273696f6e000000000000006044820152606401610a70565b808420925050509250929050565b60655460ff1615611f495760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a70565b805f0361359c575050565b8082035f5b82811015613648576101008184038111156135bb57508083035b609b546040517f3c7f528300000000000000000000000000000000000000000000000000000000815260048101859052602481018390526001600160a01b0390911690633c7f5283906044015f604051808303815f87803b15801561361e575f80fd5b505af1158015613630573d5f803e3d5ffd5b505050506101008301925050610100810190506135a1565b50505050565b6040805160c085901b815260f084901b6008820152600a60208502820181019092525f9181016136838161ffff871686613ea3565b82900390912095945050505050565b8082535050565b60605f808080806136ac888a018a6146a2565b95509550955095509550508187106136ca5794506136e69350505050565b8387106136de5782955050505050506136e6565b509293505050505b9392505050565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff166137d25760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b611f49613f69565b5f54610100900460ff166138565760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b611f49613ff1565b60a88390555f83815260a460205260408082205460975491517f45bc4d1000000000000000000000000000000000000000000000000000000000815260048101869052680100000000000000009091046001600160a01b03908116939216906345bc4d10906024016020604051808303815f875af11580156138e2573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061390691906144ad565b5f86815260a460205260409020600101549091506139259082906143a2565b5f86815260a460209081526040808320546801000000000000000090046001600160a01b0316835260a5909152812080549091906139649084906143a2565b909155505060405161397790849061473f565b604051908190038120906001600160a01b0384169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b80613a075760405162461bcd60e51b815260206004820152601360248201527f496e76616c69642062617463682070726f6f66000000000000000000000000006044820152606401610a70565b5f613a16846001015160c01c90565b90505f613a24856039015190565b90505f7f0000000000000000000000000000000000000000000000000000000000000000613a53876059015190565b6079880151609989015160b98a015160198b015160405160c09690961b7fffffffffffffffff000000000000000000000000000000000000000000000000166020870152602886019490945260488501929092526068840152608883015260a882015260c8810183905260e801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120609c549091506001600160a01b0316632c09a848613b15885160f81c90565b858888866040518663ffffffff1660e01b8152600401613b3995949392919061476b565b5f6040518083038186803b158015613b4f575f80fd5b505afa158015613b61573d5f803e3d5ffd5b50505050505050505050565b5f83815260a4602052604081206001015460a954909190606490613b91908461479c565b613b9b91906147b3565b9050613ba781836143b5565b60aa5f828254613bb791906143a2565b90915550506001600160a01b0384165f90815260a5602052604081208054839290613be39084906143a2565b9091555050604051613bf690849061473f565b604051908190038120906001600160a01b0386169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b8015613ce0575f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613c88576040519150601f19603f3d011682016040523d82523d5f602084013e613c8d565b606091505b5050905080613cde5760405162461bcd60e51b815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c656400000000006044820152606401610a70565b505b5050565b613cec61353e565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613d213390565b6040516001600160a01b03909116815260200160405180910390a1565b613d46614076565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33613d21565b5f81613dc55760405162461bcd60e51b815260206004820152601260248201527f456d7074792062617463682068656164657200000000000000000000000000006044820152606401610a70565b82825f818110613dd757613dd76147eb565b919091013560f81c949350505050565b5f8160f9811015613e3a5760405162461bcd60e51b815260206004820152601d60248201527f626174636820686561646572206c656e67746820746f6f20736d616c6c0000006044820152606401610a70565b6040519150808483378082016040529250929050565b5f816101018114613e3a5760405162461bcd60e51b815260206004820181905260248201527f626174636820686561646572206c656e67746820697320696e636f72726563746044820152606401610a70565b5f825f03613eb25750826136e6565b609b546001600160a01b03165f5b84811015613f5f576040517fae453cd5000000000000000000000000000000000000000000000000000000008152600481018590525f906001600160a01b0384169063ae453cd590602401602060405180830381865afa158015613f26573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f4a91906144ad565b87525060209095019460019384019301613ec0565b5093949350505050565b5f54610100900460ff16613fe55760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b6065805460ff19169055565b5f54610100900460ff1661406d5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b611f49336136ed565b60655460ff16611f495760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610a70565b5f602082840312156140d8575f80fd5b5035919050565b80356001600160a01b03811681146140f5575f80fd5b919050565b5f6020828403121561410a575f80fd5b6136e6826140df565b5f8083601f840112614123575f80fd5b50813567ffffffffffffffff81111561413a575f80fd5b602083019150836020828501011115614151575f80fd5b9250929050565b5f805f6040848603121561416a575f80fd5b833567ffffffffffffffff811115614180575f80fd5b61418c86828701614113565b909790965060209590950135949350505050565b5f80602083850312156141b1575f80fd5b823567ffffffffffffffff8111156141c7575f80fd5b6141d385828601614113565b90969095509350505050565b5f80604083850312156141f0575f80fd5b823567ffffffffffffffff80821115614207575f80fd5b9084019060e0828703121561421a575f80fd5b9092506020840135908082111561422f575f80fd5b50830160608186031215614241575f80fd5b809150509250929050565b5f805f805f8060c08789031215614261575f80fd5b61426a876140df565b9550614278602088016140df565b9450614286604088016140df565b9350606087013592506080870135915060a087013590509295509295509295565b5f805f80604085870312156142ba575f80fd5b843567ffffffffffffffff808211156142d1575f80fd5b6142dd88838901614113565b909650945060208701359150808211156142f5575f80fd5b5061430287828801614113565b95989497509550505050565b8015158114612c43575f80fd5b5f6020828403121561432b575f80fd5b81356136e68161430e565b803567ffffffffffffffff811681146140f5575f80fd5b5f806040838503121561435e575f80fd5b61436783614336565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561134e5761134e614375565b8181038181111561134e5761134e614375565b5f602082840312156143d8575f80fd5b81516136e68161430e565b5f602082840312156143f3575f80fd5b813560ff811681146136e6575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614436575f80fd5b83018035915067ffffffffffffffff821115614450575f80fd5b602001915036819003821315614151575f80fd5b5f60208284031215614474575f80fd5b6136e682614336565b5f6020828403121561448d575f80fd5b813561ffff811681146136e6575f80fd5b818382375f9101908152919050565b5f602082840312156144bd575f80fd5b5051919050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f6080820187835260206080602085015281885180845260a08601915060208a0193505f5b818110156145555784516001600160a01b031683529383019391830191600101614530565b505087604086015284810360608601526145708187896144c4565b9a9950505050505050505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036145ae576145ae614375565b5060010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126145f1575f80fd5b8135602067ffffffffffffffff8083111561460e5761460e6145b5565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108482111715614651576146516145b5565b6040529384526020818701810194908101925087851115614670575f80fd5b6020870191505b8482101561469757614688826140df565b83529183019190830190614677565b979650505050505050565b5f805f805f8060c087890312156146b7575f80fd5b86359550602087013567ffffffffffffffff808211156146d5575f80fd5b6146e18a838b016145e2565b96506040890135955060608901359150808211156146fd575f80fd5b6147098a838b016145e2565b94506080890135935060a0890135915080821115614725575f80fd5b5061473289828a016145e2565b9150509295509295509295565b5f82515f5b8181101561475e5760208186018101518583015201614744565b505f920191825250919050565b858152846020820152608060408201525f61478a6080830185876144c4565b90508260608301529695505050505050565b808202811582820484141761134e5761134e614375565b5f826147e6577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffdfea164736f6c6343000818000a", } // RollupABI is the input ABI used to generate the binding from. @@ -619,6 +619,37 @@ func (_Rollup *RollupCallerSession) CommittedBatches(batchIndex *big.Int) ([32]b return _Rollup.Contract.CommittedBatches(&_Rollup.CallOpts, batchIndex) } +// CommittedStateRoots is a free data retrieval call binding the contract method 0x68589dfa. +// +// Solidity: function committedStateRoots(uint256 batchIndex) view returns(bytes32 stateRoot) +func (_Rollup *RollupCaller) CommittedStateRoots(opts *bind.CallOpts, batchIndex *big.Int) ([32]byte, error) { + var out []interface{} + err := _Rollup.contract.Call(opts, &out, "committedStateRoots", batchIndex) + + if err != nil { + return *new([32]byte), err + } + + out0 := *abi.ConvertType(out[0], new([32]byte)).(*[32]byte) + + return out0, err + +} + +// CommittedStateRoots is a free data retrieval call binding the contract method 0x68589dfa. +// +// Solidity: function committedStateRoots(uint256 batchIndex) view returns(bytes32 stateRoot) +func (_Rollup *RollupSession) CommittedStateRoots(batchIndex *big.Int) ([32]byte, error) { + return _Rollup.Contract.CommittedStateRoots(&_Rollup.CallOpts, batchIndex) +} + +// CommittedStateRoots is a free data retrieval call binding the contract method 0x68589dfa. +// +// Solidity: function committedStateRoots(uint256 batchIndex) view returns(bytes32 stateRoot) +func (_Rollup *RollupCallerSession) CommittedStateRoots(batchIndex *big.Int) ([32]byte, error) { + return _Rollup.Contract.CommittedStateRoots(&_Rollup.CallOpts, batchIndex) +} + // FinalizationPeriodSeconds is a free data retrieval call binding the contract method 0xce5db8d6. // // Solidity: function finalizationPeriodSeconds() view returns(uint256) @@ -1230,23 +1261,23 @@ func (_Rollup *RollupTransactorSession) ClaimReward(receiver common.Address) (*t return _Rollup.Contract.ClaimReward(&_Rollup.TransactOpts, receiver) } -// CommitBatch is a paid mutator transaction binding the contract method 0xd63b3549. +// CommitBatch is a paid mutator transaction binding the contract method 0x428868b5. // -// Solidity: function commitBatch((uint8,bytes,bytes,bytes,bytes32,bytes32,bytes32) batchDataInput, (uint256,bytes,bytes) batchSignatureInput) payable returns() +// Solidity: function commitBatch((uint8,bytes,uint64,uint16,bytes32,bytes32,bytes32) batchDataInput, (uint256,bytes,bytes) batchSignatureInput) payable returns() func (_Rollup *RollupTransactor) CommitBatch(opts *bind.TransactOpts, batchDataInput IRollupBatchDataInput, batchSignatureInput IRollupBatchSignatureInput) (*types.Transaction, error) { return _Rollup.contract.Transact(opts, "commitBatch", batchDataInput, batchSignatureInput) } -// CommitBatch is a paid mutator transaction binding the contract method 0xd63b3549. +// CommitBatch is a paid mutator transaction binding the contract method 0x428868b5. // -// Solidity: function commitBatch((uint8,bytes,bytes,bytes,bytes32,bytes32,bytes32) batchDataInput, (uint256,bytes,bytes) batchSignatureInput) payable returns() +// Solidity: function commitBatch((uint8,bytes,uint64,uint16,bytes32,bytes32,bytes32) batchDataInput, (uint256,bytes,bytes) batchSignatureInput) payable returns() func (_Rollup *RollupSession) CommitBatch(batchDataInput IRollupBatchDataInput, batchSignatureInput IRollupBatchSignatureInput) (*types.Transaction, error) { return _Rollup.Contract.CommitBatch(&_Rollup.TransactOpts, batchDataInput, batchSignatureInput) } -// CommitBatch is a paid mutator transaction binding the contract method 0xd63b3549. +// CommitBatch is a paid mutator transaction binding the contract method 0x428868b5. // -// Solidity: function commitBatch((uint8,bytes,bytes,bytes,bytes32,bytes32,bytes32) batchDataInput, (uint256,bytes,bytes) batchSignatureInput) payable returns() +// Solidity: function commitBatch((uint8,bytes,uint64,uint16,bytes32,bytes32,bytes32) batchDataInput, (uint256,bytes,bytes) batchSignatureInput) payable returns() func (_Rollup *RollupTransactorSession) CommitBatch(batchDataInput IRollupBatchDataInput, batchSignatureInput IRollupBatchSignatureInput) (*types.Transaction, error) { return _Rollup.Contract.CommitBatch(&_Rollup.TransactOpts, batchDataInput, batchSignatureInput) } @@ -1314,6 +1345,27 @@ func (_Rollup *RollupTransactorSession) Initialize(_l1StakingContract common.Add return _Rollup.Contract.Initialize(&_Rollup.TransactOpts, _l1StakingContract, _messageQueue, _verifier, _finalizationPeriodSeconds, _proofWindow, _proofRewardPercent) } +// Initialize2 is a paid mutator transaction binding the contract method 0x61267290. +// +// Solidity: function initialize2(bytes32 _prevStateRoot) returns() +func (_Rollup *RollupTransactor) Initialize2(opts *bind.TransactOpts, _prevStateRoot [32]byte) (*types.Transaction, error) { + return _Rollup.contract.Transact(opts, "initialize2", _prevStateRoot) +} + +// Initialize2 is a paid mutator transaction binding the contract method 0x61267290. +// +// Solidity: function initialize2(bytes32 _prevStateRoot) returns() +func (_Rollup *RollupSession) Initialize2(_prevStateRoot [32]byte) (*types.Transaction, error) { + return _Rollup.Contract.Initialize2(&_Rollup.TransactOpts, _prevStateRoot) +} + +// Initialize2 is a paid mutator transaction binding the contract method 0x61267290. +// +// Solidity: function initialize2(bytes32 _prevStateRoot) returns() +func (_Rollup *RollupTransactorSession) Initialize2(_prevStateRoot [32]byte) (*types.Transaction, error) { + return _Rollup.Contract.Initialize2(&_Rollup.TransactOpts, _prevStateRoot) +} + // ProveState is a paid mutator transaction binding the contract method 0xb3484425. // // Solidity: function proveState(bytes _batchHeader, bytes _batchProof) returns() diff --git a/bindings/bindings/rollup_more.go b/bindings/bindings/rollup_more.go index bcab9c67..126e8acc 100644 --- a/bindings/bindings/rollup_more.go +++ b/bindings/bindings/rollup_more.go @@ -9,11 +9,11 @@ import ( "morph-l2/bindings/solc" ) -const RollupStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_array(t_uint256)1028_storage\"},{\"astId\":1003,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"_owner\",\"offset\":0,\"slot\":\"51\",\"type\":\"t_address\"},{\"astId\":1004,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"52\",\"type\":\"t_array(t_uint256)1027_storage\"},{\"astId\":1005,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"_paused\",\"offset\":0,\"slot\":\"101\",\"type\":\"t_bool\"},{\"astId\":1006,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"102\",\"type\":\"t_array(t_uint256)1027_storage\"},{\"astId\":1007,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"l1StakingContract\",\"offset\":0,\"slot\":\"151\",\"type\":\"t_address\"},{\"astId\":1008,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"finalizationPeriodSeconds\",\"offset\":0,\"slot\":\"152\",\"type\":\"t_uint256\"},{\"astId\":1009,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"proofWindow\",\"offset\":0,\"slot\":\"153\",\"type\":\"t_uint256\"},{\"astId\":1010,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"__maxNumTxInChunk\",\"offset\":0,\"slot\":\"154\",\"type\":\"t_uint256\"},{\"astId\":1011,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"messageQueue\",\"offset\":0,\"slot\":\"155\",\"type\":\"t_address\"},{\"astId\":1012,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"verifier\",\"offset\":0,\"slot\":\"156\",\"type\":\"t_address\"},{\"astId\":1013,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"lastFinalizedBatchIndex\",\"offset\":0,\"slot\":\"157\",\"type\":\"t_uint256\"},{\"astId\":1014,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"lastCommittedBatchIndex\",\"offset\":0,\"slot\":\"158\",\"type\":\"t_uint256\"},{\"astId\":1015,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"isChallenger\",\"offset\":0,\"slot\":\"159\",\"type\":\"t_mapping(t_address,t_bool)\"},{\"astId\":1016,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"finalizedStateRoots\",\"offset\":0,\"slot\":\"160\",\"type\":\"t_mapping(t_uint256,t_bytes32)\"},{\"astId\":1017,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"committedBatches\",\"offset\":0,\"slot\":\"161\",\"type\":\"t_mapping(t_uint256,t_bytes32)\"},{\"astId\":1018,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"batchDataStore\",\"offset\":0,\"slot\":\"162\",\"type\":\"t_mapping(t_uint256,t_struct(BatchData)1030_storage)\"},{\"astId\":1019,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"withdrawalRoots\",\"offset\":0,\"slot\":\"163\",\"type\":\"t_mapping(t_bytes32,t_bool)\"},{\"astId\":1020,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"challenges\",\"offset\":0,\"slot\":\"164\",\"type\":\"t_mapping(t_uint256,t_struct(BatchChallenge)1029_storage)\"},{\"astId\":1021,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"batchChallengeReward\",\"offset\":0,\"slot\":\"165\",\"type\":\"t_mapping(t_address,t_uint256)\"},{\"astId\":1022,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"inChallenge\",\"offset\":0,\"slot\":\"166\",\"type\":\"t_bool\"},{\"astId\":1023,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"batchChallenged\",\"offset\":0,\"slot\":\"167\",\"type\":\"t_uint256\"},{\"astId\":1024,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"revertReqIndex\",\"offset\":0,\"slot\":\"168\",\"type\":\"t_uint256\"},{\"astId\":1025,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"proofRewardPercent\",\"offset\":0,\"slot\":\"169\",\"type\":\"t_uint256\"},{\"astId\":1026,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"proveRemaining\",\"offset\":0,\"slot\":\"170\",\"type\":\"t_uint256\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_uint256)1027_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\"},\"t_array(t_uint256)1028_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[50]\",\"numberOfBytes\":\"1600\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_mapping(t_address,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_bool\"},\"t_mapping(t_address,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_uint256\"},\"t_mapping(t_bytes32,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_bool\"},\"t_mapping(t_uint256,t_bytes32)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e bytes32)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_bytes32\"},\"t_mapping(t_uint256,t_struct(BatchChallenge)1029_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e struct IRollup.BatchChallenge)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_struct(BatchChallenge)1029_storage\"},\"t_mapping(t_uint256,t_struct(BatchData)1030_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e struct IRollup.BatchData)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_struct(BatchData)1030_storage\"},\"t_struct(BatchChallenge)1029_storage\":{\"encoding\":\"inplace\",\"label\":\"struct IRollup.BatchChallenge\",\"numberOfBytes\":\"128\"},\"t_struct(BatchData)1030_storage\":{\"encoding\":\"inplace\",\"label\":\"struct IRollup.BatchData\",\"numberOfBytes\":\"128\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint64\":{\"encoding\":\"inplace\",\"label\":\"uint64\",\"numberOfBytes\":\"8\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}" +const RollupStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_array(t_uint256)1029_storage\"},{\"astId\":1003,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"_owner\",\"offset\":0,\"slot\":\"51\",\"type\":\"t_address\"},{\"astId\":1004,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"52\",\"type\":\"t_array(t_uint256)1028_storage\"},{\"astId\":1005,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"_paused\",\"offset\":0,\"slot\":\"101\",\"type\":\"t_bool\"},{\"astId\":1006,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"102\",\"type\":\"t_array(t_uint256)1028_storage\"},{\"astId\":1007,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"l1StakingContract\",\"offset\":0,\"slot\":\"151\",\"type\":\"t_address\"},{\"astId\":1008,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"finalizationPeriodSeconds\",\"offset\":0,\"slot\":\"152\",\"type\":\"t_uint256\"},{\"astId\":1009,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"proofWindow\",\"offset\":0,\"slot\":\"153\",\"type\":\"t_uint256\"},{\"astId\":1010,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"__maxNumTxInChunk\",\"offset\":0,\"slot\":\"154\",\"type\":\"t_uint256\"},{\"astId\":1011,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"messageQueue\",\"offset\":0,\"slot\":\"155\",\"type\":\"t_address\"},{\"astId\":1012,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"verifier\",\"offset\":0,\"slot\":\"156\",\"type\":\"t_address\"},{\"astId\":1013,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"lastFinalizedBatchIndex\",\"offset\":0,\"slot\":\"157\",\"type\":\"t_uint256\"},{\"astId\":1014,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"lastCommittedBatchIndex\",\"offset\":0,\"slot\":\"158\",\"type\":\"t_uint256\"},{\"astId\":1015,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"isChallenger\",\"offset\":0,\"slot\":\"159\",\"type\":\"t_mapping(t_address,t_bool)\"},{\"astId\":1016,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"finalizedStateRoots\",\"offset\":0,\"slot\":\"160\",\"type\":\"t_mapping(t_uint256,t_bytes32)\"},{\"astId\":1017,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"committedBatches\",\"offset\":0,\"slot\":\"161\",\"type\":\"t_mapping(t_uint256,t_bytes32)\"},{\"astId\":1018,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"batchDataStore\",\"offset\":0,\"slot\":\"162\",\"type\":\"t_mapping(t_uint256,t_struct(BatchData)1031_storage)\"},{\"astId\":1019,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"withdrawalRoots\",\"offset\":0,\"slot\":\"163\",\"type\":\"t_mapping(t_bytes32,t_bool)\"},{\"astId\":1020,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"challenges\",\"offset\":0,\"slot\":\"164\",\"type\":\"t_mapping(t_uint256,t_struct(BatchChallenge)1030_storage)\"},{\"astId\":1021,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"batchChallengeReward\",\"offset\":0,\"slot\":\"165\",\"type\":\"t_mapping(t_address,t_uint256)\"},{\"astId\":1022,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"inChallenge\",\"offset\":0,\"slot\":\"166\",\"type\":\"t_bool\"},{\"astId\":1023,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"batchChallenged\",\"offset\":0,\"slot\":\"167\",\"type\":\"t_uint256\"},{\"astId\":1024,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"revertReqIndex\",\"offset\":0,\"slot\":\"168\",\"type\":\"t_uint256\"},{\"astId\":1025,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"proofRewardPercent\",\"offset\":0,\"slot\":\"169\",\"type\":\"t_uint256\"},{\"astId\":1026,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"proveRemaining\",\"offset\":0,\"slot\":\"170\",\"type\":\"t_uint256\"},{\"astId\":1027,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"committedStateRoots\",\"offset\":0,\"slot\":\"171\",\"type\":\"t_mapping(t_uint256,t_bytes32)\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_uint256)1028_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\"},\"t_array(t_uint256)1029_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[50]\",\"numberOfBytes\":\"1600\"},\"t_bool\":{\"encoding\":\"inplace\",\"label\":\"bool\",\"numberOfBytes\":\"1\"},\"t_bytes32\":{\"encoding\":\"inplace\",\"label\":\"bytes32\",\"numberOfBytes\":\"32\"},\"t_mapping(t_address,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_bool\"},\"t_mapping(t_address,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_uint256\"},\"t_mapping(t_bytes32,t_bool)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e bool)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_bool\"},\"t_mapping(t_uint256,t_bytes32)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e bytes32)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_bytes32\"},\"t_mapping(t_uint256,t_struct(BatchChallenge)1030_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e struct IRollup.BatchChallenge)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_struct(BatchChallenge)1030_storage\"},\"t_mapping(t_uint256,t_struct(BatchData)1031_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e struct IRollup.BatchData)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_struct(BatchData)1031_storage\"},\"t_struct(BatchChallenge)1030_storage\":{\"encoding\":\"inplace\",\"label\":\"struct IRollup.BatchChallenge\",\"numberOfBytes\":\"128\"},\"t_struct(BatchData)1031_storage\":{\"encoding\":\"inplace\",\"label\":\"struct IRollup.BatchData\",\"numberOfBytes\":\"128\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint64\":{\"encoding\":\"inplace\",\"label\":\"uint64\",\"numberOfBytes\":\"8\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}" var RollupStorageLayout = new(solc.StorageLayout) -var RollupDeployedBin = "0x6080604052600436106102f0575f3560e01c80638da5cb5b11610186578063b3e0a509116100dc578063ddd8a3dc11610087578063e3fff1dd11610062578063e3fff1dd146109ac578063f2fde38b146109cb578063fb1e8b04146109ea575f80fd5b8063ddd8a3dc1461094c578063de8b303514610978578063dff7827e14610997575f80fd5b8063ce5db8d6116100b7578063ce5db8d614610905578063d279c1911461091a578063d63b354914610939575f80fd5b8063b3e0a509146108b4578063bedb86fb146108d3578063cd4edc69146108f2575f80fd5b8063a479265d1161013c578063b31a77d311610117578063b31a77d314610861578063b348442514610876578063b35dac4e14610895575f80fd5b8063a479265d14610802578063a4f209b014610817578063abc8d68d14610836575f80fd5b8063910129d41161016c578063910129d41461078457806397fc007c146107b5578063a415d8dc146107d4575f80fd5b80638da5cb5b146106905780638f1d3776146106ba575f80fd5b80632571098d116102465780635ef7a94a116101f1578063715018a6116101cc578063715018a614610644578063728cdbca1461065857806388b1ea0914610677575f80fd5b80635ef7a94a146105795780635f77cf1d146105d95780636c578c1d14610625575f80fd5b80633e001b66116102215780633e001b661461052e57806357e0af6c146105435780635c975abb14610562575f80fd5b80632571098d146104865780632b7ac3f3146104b15780633b70c18a14610502575f80fd5b8063121dcd50116102a657806318af3b2b1161028157806318af3b2b1461040c57806321e2f9e01461043c5780632362f03e1461045b575f80fd5b8063121dcd50146103c357806313361101146103d857806318463fb0146103f7575f80fd5b80630ceb6780116102d65780630ceb67801461036157806310d4458314610382578063116a1f42146103a1575f80fd5b806304d77215146102fb578063059def611461033e575f80fd5b366102f757005b5f80fd5b348015610306575f80fd5b506103296103153660046149ce565b60a36020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b348015610349575f80fd5b50610353609d5481565b604051908152602001610335565b34801561036c575f80fd5b5061038061037b366004614a0d565b6109ff565b005b34801561038d575f80fd5b5061038061039c366004614a6b565b610b23565b3480156103ac575f80fd5b506103296103bb3660046149ce565b609d54101590565b3480156103ce575f80fd5b50610353609e5481565b3480156103e3575f80fd5b506103806103f2366004614ab3565b610f0f565b348015610402575f80fd5b5061035360a75481565b348015610417575f80fd5b506103296104263660046149ce565b5f90815260a26020526040902060010154421090565b348015610447575f80fd5b506103296104563660046149ce565b6114ec565b348015610466575f80fd5b506103536104753660046149ce565b60a16020525f908152604090205481565b348015610491575f80fd5b506103536104a03660046149ce565b60a06020525f908152604090205481565b3480156104bc575f80fd5b50609c546104dd9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610335565b34801561050d575f80fd5b50609b546104dd9073ffffffffffffffffffffffffffffffffffffffff1681565b348015610539575f80fd5b5061035360aa5481565b34801561054e575f80fd5b5061038061055d3660046149ce565b61151a565b34801561056d575f80fd5b5060655460ff16610329565b348015610584575f80fd5b506105b96105933660046149ce565b60a26020525f908152604090208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001610335565b3480156105e4575f80fd5b5061060c7f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610335565b348015610630575f80fd5b5061038061063f366004614a0d565b6115df565b34801561064f575f80fd5b506103806116ee565b348015610663575f80fd5b50610380610672366004614af2565b611701565b348015610682575f80fd5b5060a6546103299060ff1681565b34801561069b575f80fd5b5060335473ffffffffffffffffffffffffffffffffffffffff166104dd565b3480156106c5575f80fd5b506107336106d43660046149ce565b60a46020525f9081526040902080546001820154600283015460039093015467ffffffffffffffff8316936801000000000000000090930473ffffffffffffffffffffffffffffffffffffffff16929060ff8082169161010090041686565b6040805167ffffffffffffffff909716875273ffffffffffffffffffffffffffffffffffffffff909516602087015293850192909252606084015215156080830152151560a082015260c001610335565b34801561078f575f80fd5b5061032961079e3660046149ce565b5f90815260a4602052604090206003015460ff1690565b3480156107c0575f80fd5b506103806107cf366004614a0d565b611aca565b3480156107df575f80fd5b506103296107ee366004614a0d565b609f6020525f908152604090205460ff1681565b34801561080d575f80fd5b5061035360995481565b348015610822575f80fd5b506103806108313660046149ce565b611bee565b348015610841575f80fd5b50610353610850366004614a0d565b60a56020525f908152604090205481565b34801561086c575f80fd5b5061035360a85481565b348015610881575f80fd5b50610380610890366004614b4d565b611cb8565b3480156108a0575f80fd5b506103806108af366004614a0d565b611f87565b3480156108bf575f80fd5b506103806108ce366004614ab3565b611fed565b3480156108de575f80fd5b506103806108ed366004614bc1565b612367565b610380610900366004614bdc565b6124fa565b348015610910575f80fd5b5061035360985481565b348015610925575f80fd5b50610380610934366004614a0d565b612c0f565b610380610947366004614c12565b612cf5565b348015610957575f80fd5b506097546104dd9073ffffffffffffffffffffffffffffffffffffffff1681565b348015610983575f80fd5b506103296109923660046149ce565b61370e565b3480156109a2575f80fd5b50610353609a5481565b3480156109b7575f80fd5b506103806109c63660046149ce565b613765565b3480156109d6575f80fd5b506103806109e5366004614a0d565b613822565b3480156109f5575f80fd5b5061035360a95481565b610a076138d6565b73ffffffffffffffffffffffffffffffffffffffff81165f908152609f602052604090205460ff1615610a9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f6163636f756e7420697320616c72656164792061206368616c6c656e6765720060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f818152609f602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915591519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc00991015b60405180910390a250565b610b2b6138d6565b5f8111610b94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f636f756e74206d757374206265206e6f6e7a65726f00000000000000000000006044820152606401610a92565b5f80610ba08585613957565b915091505f610bb3836001015160c01c90565b5f81815260a160205260409020549091508214610c2c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a92565b5f60a181610c3a8785614cac565b81526020019081526020015f205414610cd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f726576657274696e67206d7573742073746172742066726f6d2074686520656e60448201527f64696e67000000000000000000000000000000000000000000000000000000006064820152608401610a92565b609d548111610d65576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f63616e206f6e6c792072657665727420756e46696e616c697a6564206261746360448201527f68000000000000000000000000000000000000000000000000000000000000006064820152608401610a92565b610d70600182614cbf565b609e555b8315610f0757604051829082907ecae2739091badfd91c373f0a16cede691e0cd25bb80cff77dd5caeb4710146905f90a35f81815260a16020526040812055610dbc8161370e565b15610e42575f81815260a4602090815260408083206001810154905468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16845260a59092528220805491929091610e14908490614cac565b909155505060a680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b5f81815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a85415801590610ebf575060a85481145b15610ec9575f60a8555b6001015f81815260a160205260409020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90940193915081610d74575b505050505050565b60a85415610f79576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a92565b610f81613972565b5f80610f8d8484613957565b915091505f610fa0836001015160c01c90565b5f81815260a160205260409020549091508214611019576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a92565b611022816114ec565b611088576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610a92565b6110918161370e565b156110f8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610a92565b5f81815260a4602052604090206003015460ff1615611173576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f62617463682073686f756c6420626520726576657274000000000000000000006044820152606401610a92565b5f81815260a260205260409020600101544210156111ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f626174636820696e206368616c6c656e67652077696e646f77000000000000006044820152606401610a92565b605983015160a05f611200600185614cbf565b81526020019081526020015f205414611275576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610a92565b5f81815260a06020526040902054156112ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f626174636820616c7265616479207665726966696564000000000000000000006044820152606401610a92565b80609d5460010114611358576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610a92565b609d819055600160a35f61136d866099015190565b815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905560798301515f82815260a060205260409020556113d860f98401601185015160c01c600986015160c01c6139df565b60a25f6113e6600184614cbf565b815260208101919091526040015f908120818155600180820183905560028201839055600390910182905560a4919061141f9084614cbf565b815260208082019290925260409081015f90812080547fffffffff00000000000000000000000000000000000000000000000000000000168155600181018290556002810182905560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905583815260a1909252902054817f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d6114c8866079015190565b60998701516040805192835260208301919091520160405180910390a35050505050565b5f81815260a260205260408120541580159061151457505f82815260a1602052604090205415155b92915050565b6115226138d6565b5f8111801561153357506099548114155b611599576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f696e76616c6964206e65772070726f6f662077696e646f7700000000000000006044820152606401610a92565b609980549082905560408051828152602081018490527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a6191015b60405180910390a15050565b6115e76138d6565b73ffffffffffffffffffffffffffffffffffffffff81165f908152609f602052604090205460ff16611675576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6163636f756e74206973206e6f742061206368616c6c656e67657200000000006044820152606401610a92565b73ffffffffffffffffffffffffffffffffffffffff81165f818152609f6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc0099101610b18565b6116f66138d6565b6116ff5f613ab5565b565b5f54610100900460ff161580801561171f57505f54600160ff909116105b806117385750303b15801561173857505f5460ff166001145b6117c4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a92565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611820575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff86161580611857575073ffffffffffffffffffffffffffffffffffffffff8516155b1561188e576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff871661190b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e76616c6964206c31207374616b696e6720636f6e747261637400000000006044820152606401610a92565b611913613b2b565b61191b613bc9565b6097805473ffffffffffffffffffffffffffffffffffffffff808a167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255609b8054898416908316179055609c805492881692909116821790556098859055609984905560a98390556040515f907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96908290a3604080515f8152602081018690527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a437910160405180910390a1604080515f8152602081018590527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a61910160405180910390a1604080515f8152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b0223910160405180910390a18015611ac1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b611ad26138d6565b73ffffffffffffffffffffffffffffffffffffffff811615801590611b125750609c5473ffffffffffffffffffffffffffffffffffffffff828116911614155b611b78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e76616c6964206e65772076657269666965720000000000000000000000006044820152606401610a92565b609c805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96905f90a35050565b611bf66138d6565b5f81118015611c06575060648111155b8015611c14575060a9548114155b611c7a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f696e76616c69642070726f6f66207265776172642070657263656e74616765006044820152606401610a92565b60a980549082905560408051828152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b022391016115d3565b60a85415611d22576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a92565b611d2a613972565b5f80611d368686613957565b915091505f611d49836001015160c01c90565b5f81815260a160205260409020549091508214611dc2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a92565b611dcb8161370e565b611e31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610a92565b5f81815260a4602052604090206003810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560a680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556099546002909101544291611ea891614cac565b11611f3c575f81815260a460209081526040808320600390810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560a2835292819020909201548251808401909352600783527f54696d656f75740000000000000000000000000000000000000000000000000091830191909152611f3791839190613c67565b611ac1565b611f47838686613dea565b611ac181336040518060400160405280600d81526020017f50726f6f66207375636365737300000000000000000000000000000000000000815250613fc4565b611f8f6138d6565b60aa80545f909155611fa182826140aa565b6040805173ffffffffffffffffffffffffffffffffffffffff84168152602081018390527fb1b2058a6969e2d25e47bcaebe8ae21c29a23b2752429315b75e2f4f285f3d8791016115d3565b611ff56138d6565b5f805260a06020527fb84a74ec6ef4d0e83b6006dfaa014ab4026f9f3b97d186e604d29998a4e808ea5415612086576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f67656e6573697320626174636820696d706f72746564000000000000000000006044820152606401610a92565b5f806120928484613957565b915091505f6120a5836001015160c01c90565b90505f6120b3846079015190565b90508061211c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f7a65726f20737461746520726f6f7400000000000000000000000000000000006044820152606401610a92565b600984015160c01c1561218b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6c31206d65737361676520706f707065642073686f756c6420626520300000006044820152606401610a92565b5f612197856019015190565b036121fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7a65726f206461746120686173680000000000000000000000000000000000006044820152606401610a92565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c44401461222a856039015190565b14612291576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f696e76616c69642076657273696f6e65642068617368000000000000000000006044820152606401610a92565b5f82815260a1602090815260408083208690558051608081018252428082528184019081528183018581526060830186815288875260a2865284872093518455915160018401555160028301555160039091015560a0909152808220839055609e849055609d84905551849184917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a3604080518281525f6020820152849184917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d910160405180910390a3505050505050565b61236f6138d6565b80156124c85761237d61417c565b60a65460ff161561247a5760a7545f90815260a4602090815260408083206001810154905468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16845260a590925282208054919290916123de908490614cac565b909155505060a7545f90815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b7f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a150565b6124d0614201565b7f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa3361249d565b50565b335f908152609f602052604090205460ff16612572576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f63616c6c6572206368616c6c656e67657220616c6c6f776564000000000000006044820152606401610a92565b60a854156125dc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a92565b6125e4613972565b60a65460ff1615612651576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f616c726561647920696e206368616c6c656e67650000000000000000000000006044820152606401610a92565b8167ffffffffffffffff16609d54106126c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f626174636820616c72656164792066696e616c697a65640000000000000000006044820152606401610a92565b67ffffffffffffffff82165f90815260a160205260409020548114612747576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a92565b61275a8267ffffffffffffffff166114ec565b6127c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610a92565b67ffffffffffffffff82165f90815260a4602052604090205468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1615612862576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f626174636820616c7265616479206368616c6c656e67656400000000000000006044820152606401610a92565b67ffffffffffffffff82165f90815260a26020526040902060010154421061290c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f63616e6e6f74206368616c6c656e6765206261746368206f757473696465207460448201527f6865206368616c6c656e67652077696e646f77000000000000000000000000006064820152608401610a92565b60975f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d13fd7b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612976573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061299a9190614cd2565b341015612a03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e73756666696369656e742076616c756500000000000000000000000000006044820152606401610a92565b67ffffffffffffffff82811660a78190556040805160c0810182528281523360208083018281523484860190815242606086019081525f6080870181815260a0880182815299825260a49095529690962094518554925173ffffffffffffffffffffffffffffffffffffffff1668010000000000000000027fffffffff00000000000000000000000000000000000000000000000000000000909316981697909717178355945160018301559151600282015592516003909301805492511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff941515949094167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009093169290921792909217905573ffffffffffffffffffffffffffffffffffffffff168267ffffffffffffffff167f3a6ea19df25b49e7624e313ce7c1ab23984238e93727260db56a81735b1b997634604051612b6f91815260200190565b60405180910390a35f609d546001612b879190614cac565b90505b609e548111612bdf578267ffffffffffffffff168114612bcd576099545f82815260a2602052604081206001018054909190612bc7908490614cac565b90915550505b80612bd781614ce9565b915050612b8a565b505060a680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905550565b335f90815260a5602052604081205490819003612c88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f696e76616c69642062617463684368616c6c656e6765526577617264000000006044820152606401610a92565b335f90815260a56020526040812055612ca182826140aa565b8173ffffffffffffffffffffffffffffffffffffffff167f9c25fa83f414ed363c8d39c98fb3e17567b3431cede71eb062c49d2a63ce247a82604051612ce991815260200190565b60405180910390a25050565b60975473ffffffffffffffffffffffffffffffffffffffff166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015612d7b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612d9f9190614d20565b612e05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f7765640000000000006044820152606401610a92565b60a85415612e6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a92565b612e77613972565b612e846020830183614d3b565b60ff1615612eee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e76616c69642076657273696f6e00000000000000000000000000000000006044820152606401610a92565b5f612efc6040840184614d5b565b91505080612f66576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f626174636820697320656d7074790000000000000000000000000000000000006044820152606401610a92565b6080830135612fd1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f70726576696f757320737461746520726f6f74206973207a65726f00000000006044820152606401610a92565b60a083013561303c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6e657720737461746520726f6f74206973207a65726f000000000000000000006044820152606401610a92565b5f8061305361304e6020870187614d5b565b613957565b915091505f613066836001015160c01c90565b5f81815260a1602052604090205490915082146130df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e636f727265637420706172656e74206261746368206861736800000000006044820152606401610a92565b5f60a1816130ee846001614cac565b81526020019081526020015f205414613163576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f626174636820616c726561647920636f6d6d69747465640000000000000000006044820152606401610a92565b609e5481146131ce576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610a92565b5f6131dd846011015160c01c90565b90505f808061323c6131f260408c018c614d5b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250879250889150613237905060608f018f614d5b565b614258565b94850194938401939250905061325560608b018b614d5b565b905061010060ff850104602002146132c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f77726f6e67206269746d6170206c656e677468000000000000000000000000006044820152606401610a92565b600194909401935f8049156132df575f49613301565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440145b90505f61331160608d018d614d5b565b61331d915060f9614cac565b9050604051985060208102890160405261334b898d5f0160208101906133439190614d3b565b60ff166143f3565b60c087811b60018b015285811b60098b015286811b60118b015260198a0184905260808d013560598b015260a08d013560798b01528c013560998a01526133b88961339960208e018e614d5b565b6040516133a7929190614dbc565b604051809103902060b99190910152565b60d989018890526133d5896133d060608f018f614d5b565b6143fa565b603989018290528089205f88815260a1602052604081209190915560a65460ff161561342a5760a7545f90815260a46020526040902060020154609954429161341d91614cac565b6134279190614cbf565b90505b6040518060800160405280428152602001826098544261344a9190614cac565b6134549190614cac565b81526020016134a58f806040019061346c9190614d5b565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061440692505050565b815260975460209091019073ffffffffffffffffffffffffffffffffffffffff1663d096c3c6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015613533573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135579190614cd2565b90525f89815260a2602090815260409182902083518155838201516001820155918301516002830155606090920151600390910155609e89905560975473ffffffffffffffffffffffffffffffffffffffff1692506374fe27b791508c35906135cc906135c6908f018f614d5b565b5f61445d565b5f8e80604001906135dd9190614d5b565b6040518663ffffffff1660e01b81526004016135fd959493929190614e12565b602060405180830381865afa158015613618573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061363c9190614d20565b6136c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f746865207369676e617475726520766572696669636174696f6e206661696c6560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610a92565b5f86815260a16020526040808220549051909188917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a35050505050505050505050565b5f81815260a4602052604081205468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16158015906115145750505f90815260a46020526040902060030154610100900460ff161590565b61376d6138d6565b5f8111801561377e57506098548114155b6137e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e76616c6964206e65772066696e616c697a6520706572696f6400000000006044820152606401610a92565b609880549082905560408051828152602081018490527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a43791016115d3565b61382a6138d6565b73ffffffffffffffffffffffffffffffffffffffff81166138cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a92565b6124f781613ab5565b60335473ffffffffffffffffffffffffffffffffffffffff1633146116ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a92565b5f805f61396485856144b1565b812090969095509350505050565b60655460ff16156116ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a92565b805f036139eb57505050565b8082035f805b83811015610f0757610100818503811115613a0b57508084035b8651609b546040517f55f613ce00000000000000000000000000000000000000000000000000000000815260048101879052602481018490526044810183905260209099019891945073ffffffffffffffffffffffffffffffffffffffff16906355f613ce906064015f604051808303815f87803b158015613a8b575f80fd5b505af1158015613a9d573d5f803e3d5ffd5b505050506101008401935050610100810190506139f1565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff16613bc1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a92565b6116ff6145bc565b5f54610100900460ff16613c5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a92565b6116ff61467c565b60a88390555f83815260a460205260408082205460975491517f45bc4d10000000000000000000000000000000000000000000000000000000008152600481018690526801000000000000000090910473ffffffffffffffffffffffffffffffffffffffff908116939216906345bc4d10906024016020604051808303815f875af1158015613cf8573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d1c9190614cd2565b5f86815260a46020526040902060010154909150613d3b908290614cac565b5f86815260a4602090815260408083205468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16835260a590915281208054909190613d87908490614cac565b9091555050604051613d9a908490614e92565b6040519081900381209073ffffffffffffffffffffffffffffffffffffffff84169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b80613e51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496e76616c69642062617463682070726f6f66000000000000000000000000006044820152606401610a92565b5f613e60846001015160c01c90565b90505f613e6e856039015190565b90505f7f0000000000000000000000000000000000000000000000000000000000000000613e9d876059015190565b6079880151609989015160b98a015160198b015160405160c09690961b7fffffffffffffffff000000000000000000000000000000000000000000000000166020870152602886019490945260488501929092526068840152608883015260a882015260c8810183905260e801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120609c5490915073ffffffffffffffffffffffffffffffffffffffff16632c09a848613f6c885160f81c90565b858888866040518663ffffffff1660e01b8152600401613f90959493929190614ebe565b5f6040518083038186803b158015613fa6575f80fd5b505afa158015613fb8573d5f803e3d5ffd5b50505050505050505050565b5f83815260a4602052604081206001015460a954909190606490613fe89084614eef565b613ff29190614f06565b9050613ffe8183614cbf565b60aa5f82825461400e9190614cac565b909155505073ffffffffffffffffffffffffffffffffffffffff84165f90815260a5602052604081208054839290614047908490614cac565b909155505060405161405a908490614e92565b6040519081900381209073ffffffffffffffffffffffffffffffffffffffff86169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b8015614178575f8273ffffffffffffffffffffffffffffffffffffffff16826040515f6040518083038185875af1925050503d805f8114614106576040519150601f19603f3d011682016040523d82523d5f602084013e61410b565b606091505b5050905080614176576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c656400000000006044820152606401610a92565b505b5050565b614184613972565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586141d73390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b61420961471b565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336141d7565b60405185515f91829160208901919081908490614276908590614787565b90506002840193505f5b818110156142fa57603c81028501805184526020908101517fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000001690840152603a830192505f6142d0603c83614eef565b6142da9087614cac565b90505f6142eb82603a015160f01c90565b97909701965050600101614280565b506020850282016040525b80156143df575f61431a85603a015160f01c90565b905061432a83828d8d8d8d61481c565b92505f61433b866038015160f01c90565b9050818110156143a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6e756d20747873206c657373207468616e206e756d204c31206d7367730000006044820152606401610a92565b50998a01999890980197603c93909301927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01614305565b508190039020989197509095505050505050565b8082535050565b808260f9850137505050565b5f805f6020840190506002810191505f614421828651614787565b90505f5b614430600183614cbf565b81101561444657603c9390930192600101614425565b505f614453845160c01c90565b9695505050505050565b60605f80808080614470888a018a61502b565b955095509550955095505081871061448e5794506144aa9350505050565b8387106144a25782955050505050506144aa565b509293505050505b9392505050565b5f8160f981101561451e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f626174636820686561646572206c656e67746820746f6f20736d616c6c0000006044820152606401610a92565b6040519150808483378082016040525f61453c836009015160c01c90565b905061010060ff82010460200260f90182146145b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f77726f6e67206269746d6170206c656e677468000000000000000000000000006044820152606401610a92565b509250929050565b5f54610100900460ff16614652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a92565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b5f54610100900460ff16614712576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a92565b6116ff33613ab5565b60655460ff166116ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610a92565b5f614793835160f01c90565b9050805f036147ce576040517f5168407700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6147d9603c82614eef565b6147e4906002614cac565b8214611514576040517f4a969e2d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f855f0361482b575085614453565b609b5473ffffffffffffffffffffffffffffffffffffffff165f80805b8981101561492b5760ff89169150600889901c811580614866575082155b15614875578060200288013593505b600184841c165f0361491a576040517fae453cd5000000000000000000000000000000000000000000000000000000008152600481018a90525f9073ffffffffffffffffffffffffffffffffffffffff87169063ae453cd590602401602060405180830381865afa1580156148ec573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906149109190614cd2565b8d52506020909b019a5b506001988901989788019701614848565b505060ff7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff88011681811c600116156149c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f63616e6e6f7420736b6970206c617374204c31206d65737361676500000000006044820152606401610a92565b509798975050505050505050565b5f602082840312156149de575f80fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114614a08575f80fd5b919050565b5f60208284031215614a1d575f80fd5b6144aa826149e5565b5f8083601f840112614a36575f80fd5b50813567ffffffffffffffff811115614a4d575f80fd5b602083019150836020828501011115614a64575f80fd5b9250929050565b5f805f60408486031215614a7d575f80fd5b833567ffffffffffffffff811115614a93575f80fd5b614a9f86828701614a26565b909790965060209590950135949350505050565b5f8060208385031215614ac4575f80fd5b823567ffffffffffffffff811115614ada575f80fd5b614ae685828601614a26565b90969095509350505050565b5f805f805f8060c08789031215614b07575f80fd5b614b10876149e5565b9550614b1e602088016149e5565b9450614b2c604088016149e5565b9350606087013592506080870135915060a087013590509295509295509295565b5f805f8060408587031215614b60575f80fd5b843567ffffffffffffffff80821115614b77575f80fd5b614b8388838901614a26565b90965094506020870135915080821115614b9b575f80fd5b50614ba887828801614a26565b95989497509550505050565b80151581146124f7575f80fd5b5f60208284031215614bd1575f80fd5b81356144aa81614bb4565b5f8060408385031215614bed575f80fd5b823567ffffffffffffffff81168114614c04575f80fd5b946020939093013593505050565b5f8060408385031215614c23575f80fd5b823567ffffffffffffffff80821115614c3a575f80fd5b9084019060e08287031215614c4d575f80fd5b90925060208401359080821115614c62575f80fd5b50830160608186031215614c74575f80fd5b809150509250929050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561151457611514614c7f565b8181038181111561151457611514614c7f565b5f60208284031215614ce2575f80fd5b5051919050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614d1957614d19614c7f565b5060010190565b5f60208284031215614d30575f80fd5b81516144aa81614bb4565b5f60208284031215614d4b575f80fd5b813560ff811681146144aa575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614d8e575f80fd5b83018035915067ffffffffffffffff821115614da8575f80fd5b602001915036819003821315614a64575f80fd5b818382375f9101908152919050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f6080820187835260206080602085015281885180845260a08601915060208a0193505f5b81811015614e6957845173ffffffffffffffffffffffffffffffffffffffff1683529383019391830191600101614e37565b50508760408601528481036060860152614e84818789614dcb565b9a9950505050505050505050565b5f82515f5b81811015614eb15760208186018101518583015201614e97565b505f920191825250919050565b858152846020820152608060408201525f614edd608083018587614dcb565b90508260608301529695505050505050565b808202811582820484141761151457611514614c7f565b5f82614f39577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112614f7a575f80fd5b8135602067ffffffffffffffff80831115614f9757614f97614f3e565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108482111715614fda57614fda614f3e565b6040529384526020818701810194908101925087851115614ff9575f80fd5b6020870191505b8482101561502057615011826149e5565b83529183019190830190615000565b979650505050505050565b5f805f805f8060c08789031215615040575f80fd5b86359550602087013567ffffffffffffffff8082111561505e575f80fd5b61506a8a838b01614f6b565b9650604089013595506060890135915080821115615086575f80fd5b6150928a838b01614f6b565b94506080890135935060a08901359150808211156150ae575f80fd5b506150bb89828a01614f6b565b915050929550929550929556fea164736f6c6343000818000a" +var RollupDeployedBin = "0x608060405260043610610306575f3560e01c8063728cdbca11610191578063b35dac4e116100dc578063ddd8a3dc11610087578063e3fff1dd11610062578063e3fff1dd14610a0c578063f2fde38b14610a2b578063fb1e8b0414610a4a575f80fd5b8063ddd8a3dc146109ac578063de8b3035146109d8578063dff7827e146109f7575f80fd5b8063cd4edc69116100b7578063cd4edc6914610965578063ce5db8d614610978578063d279c1911461098d575f80fd5b8063b35dac4e14610908578063b3e0a50914610927578063bedb86fb14610946575f80fd5b8063a415d8dc1161013c578063abc8d68d11610117578063abc8d68d146108a9578063b31a77d3146108d4578063b3484425146108e9575f80fd5b8063a415d8dc14610847578063a479265d14610875578063a4f209b01461088a575f80fd5b80638f1d37761161016c5780638f1d37761461072d578063910129d4146107f757806397fc007c14610828575f80fd5b8063728cdbca146106cb57806388b1ea09146106ea5780638da5cb5b14610703575f80fd5b80632b7ac3f3116102515780635ef7a94a116101fc57806368589dfa116101d757806368589dfa1461066d5780636c578c1d14610698578063715018a6146106b7575f80fd5b80635ef7a94a146105a25780635f77cf1d14610602578063612672901461064e575f80fd5b8063428868b51161022c578063428868b51461055957806357e0af6c1461056c5780635c975abb1461058b575f80fd5b80632b7ac3f3146104c75780633b70c18a146105185780633e001b6614610544575f80fd5b806313361101116102b157806321e2f9e01161028c57806321e2f9e0146104525780632362f03e146104715780632571098d1461049c575f80fd5b806313361101146103ee57806318463fb01461040d57806318af3b2b14610422575f80fd5b806310d44583116102e157806310d4458314610398578063116a1f42146103b7578063121dcd50146103d9575f80fd5b806304d7721514610311578063059def61146103545780630ceb678014610377575f80fd5b3661030d57005b5f80fd5b34801561031c575f80fd5b5061033f61032b366004614ba2565b60a36020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561035f575f80fd5b50610369609d5481565b60405190815260200161034b565b348015610382575f80fd5b50610396610391366004614be1565b610a5f565b005b3480156103a3575f80fd5b506103966103b2366004614c3f565b610b83565b3480156103c2575f80fd5b5061033f6103d1366004614ba2565b609d54101590565b3480156103e4575f80fd5b50610369609e5481565b3480156103f9575f80fd5b50610396610408366004614c87565b610f6f565b348015610418575f80fd5b5061036960a75481565b34801561042d575f80fd5b5061033f61043c366004614ba2565b5f90815260a26020526040902060010154421090565b34801561045d575f80fd5b5061033f61046c366004614ba2565b61156e565b34801561047c575f80fd5b5061036961048b366004614ba2565b60a16020525f908152604090205481565b3480156104a7575f80fd5b506103696104b6366004614ba2565b60a06020525f908152604090205481565b3480156104d2575f80fd5b50609c546104f39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161034b565b348015610523575f80fd5b50609b546104f39073ffffffffffffffffffffffffffffffffffffffff1681565b34801561054f575f80fd5b5061036960aa5481565b610396610567366004614cc6565b61159c565b348015610577575f80fd5b50610396610586366004614ba2565b611f48565b348015610596575f80fd5b5060655460ff1661033f565b3480156105ad575f80fd5b506105e26105bc366004614ba2565b60a26020525f908152604090208054600182015460028301546003909301549192909184565b60408051948552602085019390935291830152606082015260800161034b565b34801561060d575f80fd5b506106357f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff909116815260200161034b565b348015610659575f80fd5b50610396610668366004614ba2565b61200d565b348015610678575f80fd5b50610369610687366004614ba2565b60ab6020525f908152604090205481565b3480156106a3575f80fd5b506103966106b2366004614be1565b612270565b3480156106c2575f80fd5b5061039661237f565b3480156106d6575f80fd5b506103966106e5366004614d33565b612392565b3480156106f5575f80fd5b5060a65461033f9060ff1681565b34801561070e575f80fd5b5060335473ffffffffffffffffffffffffffffffffffffffff166104f3565b348015610738575f80fd5b506107a6610747366004614ba2565b60a46020525f9081526040902080546001820154600283015460039093015467ffffffffffffffff8316936801000000000000000090930473ffffffffffffffffffffffffffffffffffffffff16929060ff8082169161010090041686565b6040805167ffffffffffffffff909716875273ffffffffffffffffffffffffffffffffffffffff909516602087015293850192909252606084015215156080830152151560a082015260c00161034b565b348015610802575f80fd5b5061033f610811366004614ba2565b5f90815260a4602052604090206003015460ff1690565b348015610833575f80fd5b50610396610842366004614be1565b61275b565b348015610852575f80fd5b5061033f610861366004614be1565b609f6020525f908152604090205460ff1681565b348015610880575f80fd5b5061036960995481565b348015610895575f80fd5b506103966108a4366004614ba2565b61287f565b3480156108b4575f80fd5b506103696108c3366004614be1565b60a56020525f908152604090205481565b3480156108df575f80fd5b5061036960a85481565b3480156108f4575f80fd5b50610396610903366004614d8e565b612949565b348015610913575f80fd5b50610396610922366004614be1565b612d28565b348015610932575f80fd5b50610396610941366004614c87565b612d8e565b348015610951575f80fd5b50610396610960366004614e02565b61317a565b610396610973366004614e34565b61330d565b348015610983575f80fd5b5061036960985481565b348015610998575f80fd5b506103966109a7366004614be1565b613a22565b3480156109b7575f80fd5b506097546104f39073ffffffffffffffffffffffffffffffffffffffff1681565b3480156109e3575f80fd5b5061033f6109f2366004614ba2565b613b08565b348015610a02575f80fd5b50610369609a5481565b348015610a17575f80fd5b50610396610a26366004614ba2565b613b5f565b348015610a36575f80fd5b50610396610a45366004614be1565b613c1c565b348015610a55575f80fd5b5061036960a95481565b610a67613cd0565b73ffffffffffffffffffffffffffffffffffffffff81165f908152609f602052604090205460ff1615610afb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f6163636f756e7420697320616c72656164792061206368616c6c656e6765720060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f818152609f602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915591519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc00991015b60405180910390a250565b610b8b613cd0565b5f8111610bf4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f636f756e74206d757374206265206e6f6e7a65726f00000000000000000000006044820152606401610af2565b5f80610c008585613d51565b915091505f610c13836001015160c01c90565b5f81815260a160205260409020549091508214610c8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610af2565b5f60a181610c9a8785614e89565b81526020019081526020015f205414610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f726576657274696e67206d7573742073746172742066726f6d2074686520656e60448201527f64696e67000000000000000000000000000000000000000000000000000000006064820152608401610af2565b609d548111610dc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f63616e206f6e6c792072657665727420756e46696e616c697a6564206261746360448201527f68000000000000000000000000000000000000000000000000000000000000006064820152608401610af2565b610dd0600182614e9c565b609e555b8315610f6757604051829082907ecae2739091badfd91c373f0a16cede691e0cd25bb80cff77dd5caeb4710146905f90a35f81815260a16020526040812055610e1c81613b08565b15610ea2575f81815260a4602090815260408083206001810154905468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16845260a59092528220805491929091610e74908490614e89565b909155505060a680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b5f81815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a85415801590610f1f575060a85481145b15610f29575f60a8555b6001015f81815260a160205260409020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90940193915081610dd4575b505050505050565b60a85415610fd9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610af2565b610fe1613e04565b5f80610fed8484613d51565b915091505f611000836001015160c01c90565b5f81815260a160205260409020549091508214611079576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610af2565b6110828161156e565b6110e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610af2565b6110f181613b08565b15611158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610af2565b5f81815260a4602052604090206003015460ff16156111d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f62617463682073686f756c6420626520726576657274000000000000000000006044820152606401610af2565b5f81815260a2602052604090206001015442101561124d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f626174636820696e206368616c6c656e67652077696e646f77000000000000006044820152606401610af2565b605983015160a05f611260600185614e9c565b81526020019081526020015f2054146112d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610af2565b5f81815260a060205260409020541561134a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f626174636820616c7265616479207665726966696564000000000000000000006044820152606401610af2565b80609d54600101146113b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610af2565b609d819055600160a35f6113cd866099015190565b815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905560798301515f82815260a0602052604090205561143a61142d846011015160c01c90565b600985015160c01c613e71565b60a25f611448600184614e9c565b815260208101919091526040015f908120818155600180820183905560028201839055600390910182905560ab91906114819084614e9c565b81526020019081526020015f205f905560a45f6001836114a19190614e9c565b815260208082019290925260409081015f90812080547fffffffff00000000000000000000000000000000000000000000000000000000168155600181018290556002810182905560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905583815260a1909252902054817f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d61154a866079015190565b60998701516040805192835260208301919091520160405180910390a35050505050565b5f81815260a260205260408120541580159061159657505f82815260a1602052604090205415155b92915050565b60975473ffffffffffffffffffffffffffffffffffffffff166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015611622573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116469190614eaf565b6116ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f7765640000000000006044820152606401610af2565b60a85415611716576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610af2565b61171e613e04565b61172b6020830183614eca565b60ff16158061174957506117426020830183614eca565b60ff166001145b6117af576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e76616c69642076657273696f6e00000000000000000000000000000000006044820152606401610af2565b608082013561181a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f70726576696f757320737461746520726f6f74206973207a65726f00000000006044820152606401610af2565b60a0820135611885576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6e657720737461746520726f6f74206973207a65726f000000000000000000006044820152606401610af2565b5f8061189c6118976020860186614eea565b613d51565b915091505f6118af836001015160c01c90565b90505f60a1816118c0846001614e89565b81526020019081526020015f205414611935576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f626174636820616c726561647920636f6d6d69747465640000000000000000006044820152606401610af2565b609e5481146119a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610af2565b5f81815260a160205260409020548214611a16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e636f727265637420706172656e74206261746368206861736800000000006044820152606401610af2565b5f81815260ab6020526040902054608086013514611a90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610af2565b5f611a9f846011015160c01c90565b90505f611acb611ab56060890160408a01614f4b565b611ac560808a0160608b01614f64565b84613f3b565b9050611add6080880160608901614f64565b6001939093019261ffff1691909101905f804915611afc575f49611b1e565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440145b905060f9611b2f60208a018a614eca565b60ff16600103611b3e57506101015b604080518281019091529650611b6387611b5b60208c018c614eca565b60ff16613f7f565b60c085901b6001880152611b9187611b8160808c0160608d01614f64565b61ffff1660c01b60099190910152565b60c084811b6011890152601988018490526039880183905260808a0135605989015260a08a013560798901528901356099880152611bf587611bd660208b018b614eea565b604051611be4929190614f85565b604051809103902060b99190910152565b60d987018690526001611c0b60208b018b614eca565b60ff1610611c3d57611c3d87611c2760608c0160408d01614f4b565b67ffffffffffffffff1660c01b60f99190910152565b8087205f86815260a1602090815260408083209390935560ab905290812060a08b0135905560a65460ff1615611c9c5760a7545f90815260a460205260409020600201546099544291611c8f91614e89565b611c999190614e9c565b90505b60405180608001604052804281526020018260985442611cbc9190614e89565b611cc69190614e89565b8152602001611cdb60608d0160408e01614f4b565b67ffffffffffffffff16815260975460209091019073ffffffffffffffffffffffffffffffffffffffff1663d096c3c6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015611d73573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611d979190614f94565b90525f87815260a2602090815260409182902083518155838201516001820155918301516002830155606090920151600390910155609e87905560975473ffffffffffffffffffffffffffffffffffffffff1692506374fe27b79150893590611e0c90611e06908c018c614eea565b5f613f86565b5f611e1a60408d018d614eea565b6040518663ffffffff1660e01b8152600401611e3a959493929190614ff2565b602060405180830381865afa158015611e55573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611e799190614eaf565b611f05576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f746865207369676e617475726520766572696669636174696f6e206661696c6560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610af2565b5f84815260a16020526040808220549051909186917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a35050505050505050565b611f50613cd0565b5f81118015611f6157506099548114155b611fc7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f696e76616c6964206e65772070726f6f662077696e646f7700000000000000006044820152606401610af2565b609980549082905560408051828152602081018490527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a6191015b60405180910390a15050565b5f54600290610100900460ff1615801561202d57505f5460ff8083169116105b6120b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610af2565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff8316176101001790556120f45f5460ff1690565b60ff16600214612160576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6d757374206861766520696e697469616c697a656421000000000000000000006044820152606401610af2565b816121ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f63616e206e6f742073657420737461746520726f6f742077697468206279746560448201527f73333228302921000000000000000000000000000000000000000000000000006064820152608401610af2565b609e545f90815260ab602052604090205461221657609e545f90815260ab602052604090208290555b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001612001565b612278613cd0565b73ffffffffffffffffffffffffffffffffffffffff81165f908152609f602052604090205460ff16612306576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6163636f756e74206973206e6f742061206368616c6c656e67657200000000006044820152606401610af2565b73ffffffffffffffffffffffffffffffffffffffff81165f818152609f6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc0099101610b78565b612387613cd0565b6123905f613fda565b565b5f54610100900460ff16158080156123b057505f54600160ff909116105b806123c95750303b1580156123c957505f5460ff166001145b612455576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610af2565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156124b1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff861615806124e8575073ffffffffffffffffffffffffffffffffffffffff8516155b1561251f576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff871661259c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e76616c6964206c31207374616b696e6720636f6e747261637400000000006044820152606401610af2565b6125a4614050565b6125ac6140ee565b6097805473ffffffffffffffffffffffffffffffffffffffff808a167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255609b8054898416908316179055609c805492881692909116821790556098859055609984905560a98390556040515f907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96908290a3604080515f8152602081018690527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a437910160405180910390a1604080515f8152602081018590527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a61910160405180910390a1604080515f8152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b0223910160405180910390a18015612752575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b612763613cd0565b73ffffffffffffffffffffffffffffffffffffffff8116158015906127a35750609c5473ffffffffffffffffffffffffffffffffffffffff828116911614155b612809576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e76616c6964206e65772076657269666965720000000000000000000000006044820152606401610af2565b609c805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96905f90a35050565b612887613cd0565b5f81118015612897575060648111155b80156128a5575060a9548114155b61290b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f696e76616c69642070726f6f66207265776172642070657263656e74616765006044820152606401610af2565b60a980549082905560408051828152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b02239101612001565b60a854156129b3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610af2565b6129bb613e04565b60975473ffffffffffffffffffffffffffffffffffffffff166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015612a41573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612a659190614eaf565b612acb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f7765640000000000006044820152606401610af2565b5f80612ad78686613d51565b915091505f612aea836001015160c01c90565b5f81815260a160205260409020549091508214612b63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610af2565b612b6c81613b08565b612bd2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610af2565b5f81815260a4602052604090206003810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560a680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556099546002909101544291612c4991614e89565b11612cdd575f81815260a460209081526040808320600390810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560a2835292819020909201548251808401909352600783527f54696d656f75740000000000000000000000000000000000000000000000000091830191909152612cd89183919061418c565b612752565b612ce883868661430f565b61275281336040518060400160405280600d81526020017f50726f6f662073756363657373000000000000000000000000000000000000008152506144e9565b612d30613cd0565b60aa80545f909155612d4282826145cf565b6040805173ffffffffffffffffffffffffffffffffffffffff84168152602081018390527fb1b2058a6969e2d25e47bcaebe8ae21c29a23b2752429315b75e2f4f285f3d879101612001565b612d96613cd0565b5f805260a06020527fb84a74ec6ef4d0e83b6006dfaa014ab4026f9f3b97d186e604d29998a4e808ea5415612e27576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f67656e6573697320626174636820696d706f72746564000000000000000000006044820152606401610af2565b5f80612e338484613d51565b915091505f612e46836001015160c01c90565b90508015612eb0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c696420626174636820696e646578000000000000000000000000006044820152606401610af2565b5f612ebc846079015190565b905080612f25576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f7a65726f20737461746520726f6f7400000000000000000000000000000000006044820152606401610af2565b600984015160c01c15612f94576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6c31206d65737361676520706f707065642073686f756c6420626520300000006044820152606401610af2565b5f612fa0856019015190565b03613007576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7a65726f206461746120686173680000000000000000000000000000000000006044820152606401610af2565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014613033856039015190565b1461309a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f696e76616c69642076657273696f6e65642068617368000000000000000000006044820152606401610af2565b5f82815260a1602090815260408083208690558051608081018252428082528184019081528183018581526060830186815288875260a2865284872093518455915160018401555160028301555160039091015560ab825280832084905560a0909152808220839055609e849055609d84905551849184917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a3604080518281525f6020820152849184917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d910160405180910390a3505050505050565b613182613cd0565b80156132db576131906146a1565b60a65460ff161561328d5760a7545f90815260a4602090815260408083206001810154905468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16845260a590925282208054919290916131f1908490614e89565b909155505060a7545f90815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b7f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a150565b6132e3614726565b7f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336132b0565b50565b335f908152609f602052604090205460ff16613385576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f63616c6c6572206368616c6c656e67657220616c6c6f776564000000000000006044820152606401610af2565b60a854156133ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610af2565b6133f7613e04565b60a65460ff1615613464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f616c726561647920696e206368616c6c656e67650000000000000000000000006044820152606401610af2565b8167ffffffffffffffff16609d54106134d9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f626174636820616c72656164792066696e616c697a65640000000000000000006044820152606401610af2565b67ffffffffffffffff82165f90815260a16020526040902054811461355a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610af2565b61356d8267ffffffffffffffff1661156e565b6135d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610af2565b67ffffffffffffffff82165f90815260a4602052604090205468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff1615613675576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f626174636820616c7265616479206368616c6c656e67656400000000000000006044820152606401610af2565b67ffffffffffffffff82165f90815260a26020526040902060010154421061371f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f63616e6e6f74206368616c6c656e6765206261746368206f757473696465207460448201527f6865206368616c6c656e67652077696e646f77000000000000000000000000006064820152608401610af2565b60975f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d13fd7b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613789573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906137ad9190614f94565b341015613816576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e73756666696369656e742076616c756500000000000000000000000000006044820152606401610af2565b67ffffffffffffffff82811660a78190556040805160c0810182528281523360208083018281523484860190815242606086019081525f6080870181815260a0880182815299825260a49095529690962094518554925173ffffffffffffffffffffffffffffffffffffffff1668010000000000000000027fffffffff00000000000000000000000000000000000000000000000000000000909316981697909717178355945160018301559151600282015592516003909301805492511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff941515949094167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009093169290921792909217905573ffffffffffffffffffffffffffffffffffffffff168267ffffffffffffffff167f3a6ea19df25b49e7624e313ce7c1ab23984238e93727260db56a81735b1b99763460405161398291815260200190565b60405180910390a35f609d54600161399a9190614e89565b90505b609e5481116139f2578267ffffffffffffffff1681146139e0576099545f82815260a26020526040812060010180549091906139da908490614e89565b90915550505b806139ea81615072565b91505061399d565b505060a680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905550565b335f90815260a5602052604081205490819003613a9b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f696e76616c69642062617463684368616c6c656e6765526577617264000000006044820152606401610af2565b335f90815260a56020526040812055613ab482826145cf565b8173ffffffffffffffffffffffffffffffffffffffff167f9c25fa83f414ed363c8d39c98fb3e17567b3431cede71eb062c49d2a63ce247a82604051613afc91815260200190565b60405180910390a25050565b5f81815260a4602052604081205468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16158015906115965750505f90815260a46020526040902060030154610100900460ff161590565b613b67613cd0565b5f81118015613b7857506098548114155b613bde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e76616c6964206e65772066696e616c697a6520706572696f6400000000006044820152606401610af2565b609880549082905560408051828152602081018490527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a4379101612001565b613c24613cd0565b73ffffffffffffffffffffffffffffffffffffffff8116613cc7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610af2565b61330a81613fda565b60335473ffffffffffffffffffffffffffffffffffffffff163314612390576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610af2565b5f805f613d5e858561477d565b90505f8160ff165f03613d7f57613d758686614807565b9094509050613df6565b8160ff16600103613d9457613d75868661488a565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f556e737570706f727465642062617463682076657273696f6e000000000000006044820152606401610af2565b808420925050509250929050565b60655460ff1615612390576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610af2565b805f03613e7c575050565b8082035f5b82811015613f3557610100818403811115613e9b57508083035b609b546040517f3c7f5283000000000000000000000000000000000000000000000000000000008152600481018590526024810183905273ffffffffffffffffffffffffffffffffffffffff90911690633c7f5283906044015f604051808303815f87803b158015613f0b575f80fd5b505af1158015613f1d573d5f803e3d5ffd5b50505050610100830192505061010081019050613e81565b50505050565b6040805160c085901b815260f084901b6008820152600a60208502820181019092525f918101613f708161ffff8716866148f7565b82900390912095945050505050565b8082535050565b60605f80808080613f99888a018a615196565b9550955095509550955050818710613fb7579450613fd39350505050565b838710613fcb578295505050505050613fd3565b509293505050505b9392505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff166140e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610af2565b6123906149d7565b5f54610100900460ff16614184576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610af2565b612390614a97565b60a88390555f83815260a460205260408082205460975491517f45bc4d10000000000000000000000000000000000000000000000000000000008152600481018690526801000000000000000090910473ffffffffffffffffffffffffffffffffffffffff908116939216906345bc4d10906024016020604051808303815f875af115801561421d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142419190614f94565b5f86815260a46020526040902060010154909150614260908290614e89565b5f86815260a4602090815260408083205468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16835260a5909152812080549091906142ac908490614e89565b90915550506040516142bf908490615233565b6040519081900381209073ffffffffffffffffffffffffffffffffffffffff84169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b80614376576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496e76616c69642062617463682070726f6f66000000000000000000000000006044820152606401610af2565b5f614385846001015160c01c90565b90505f614393856039015190565b90505f7f00000000000000000000000000000000000000000000000000000000000000006143c2876059015190565b6079880151609989015160b98a015160198b015160405160c09690961b7fffffffffffffffff000000000000000000000000000000000000000000000000166020870152602886019490945260488501929092526068840152608883015260a882015260c8810183905260e801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120609c5490915073ffffffffffffffffffffffffffffffffffffffff16632c09a848614491885160f81c90565b858888866040518663ffffffff1660e01b81526004016144b595949392919061525f565b5f6040518083038186803b1580156144cb575f80fd5b505afa1580156144dd573d5f803e3d5ffd5b50505050505050505050565b5f83815260a4602052604081206001015460a95490919060649061450d9084615290565b61451791906152a7565b90506145238183614e9c565b60aa5f8282546145339190614e89565b909155505073ffffffffffffffffffffffffffffffffffffffff84165f90815260a560205260408120805483929061456c908490614e89565b909155505060405161457f908490615233565b6040519081900381209073ffffffffffffffffffffffffffffffffffffffff86169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b801561469d575f8273ffffffffffffffffffffffffffffffffffffffff16826040515f6040518083038185875af1925050503d805f811461462b576040519150601f19603f3d011682016040523d82523d5f602084013e614630565b606091505b505090508061469b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c656400000000006044820152606401610af2565b505b5050565b6146a9613e04565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586146fc3390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b61472e614b36565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336146fc565b5f816147e5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f456d7074792062617463682068656164657200000000000000000000000000006044820152606401610af2565b82825f8181106147f7576147f76152df565b919091013560f81c949350505050565b5f8160f9811015614874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f626174636820686561646572206c656e67746820746f6f20736d616c6c0000006044820152606401610af2565b6040519150808483378082016040529250929050565b5f816101018114614874576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f626174636820686561646572206c656e67746820697320696e636f72726563746044820152606401610af2565b5f825f03614906575082613fd3565b609b5473ffffffffffffffffffffffffffffffffffffffff165f5b848110156149cd576040517fae453cd5000000000000000000000000000000000000000000000000000000008152600481018590525f9073ffffffffffffffffffffffffffffffffffffffff84169063ae453cd590602401602060405180830381865afa158015614994573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906149b89190614f94565b87525060209095019460019384019301614921565b5093949350505050565b5f54610100900460ff16614a6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610af2565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b5f54610100900460ff16614b2d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610af2565b61239033613fda565b60655460ff16612390576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610af2565b5f60208284031215614bb2575f80fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114614bdc575f80fd5b919050565b5f60208284031215614bf1575f80fd5b613fd382614bb9565b5f8083601f840112614c0a575f80fd5b50813567ffffffffffffffff811115614c21575f80fd5b602083019150836020828501011115614c38575f80fd5b9250929050565b5f805f60408486031215614c51575f80fd5b833567ffffffffffffffff811115614c67575f80fd5b614c7386828701614bfa565b909790965060209590950135949350505050565b5f8060208385031215614c98575f80fd5b823567ffffffffffffffff811115614cae575f80fd5b614cba85828601614bfa565b90969095509350505050565b5f8060408385031215614cd7575f80fd5b823567ffffffffffffffff80821115614cee575f80fd5b9084019060e08287031215614d01575f80fd5b90925060208401359080821115614d16575f80fd5b50830160608186031215614d28575f80fd5b809150509250929050565b5f805f805f8060c08789031215614d48575f80fd5b614d5187614bb9565b9550614d5f60208801614bb9565b9450614d6d60408801614bb9565b9350606087013592506080870135915060a087013590509295509295509295565b5f805f8060408587031215614da1575f80fd5b843567ffffffffffffffff80821115614db8575f80fd5b614dc488838901614bfa565b90965094506020870135915080821115614ddc575f80fd5b50614de987828801614bfa565b95989497509550505050565b801515811461330a575f80fd5b5f60208284031215614e12575f80fd5b8135613fd381614df5565b803567ffffffffffffffff81168114614bdc575f80fd5b5f8060408385031215614e45575f80fd5b614e4e83614e1d565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561159657611596614e5c565b8181038181111561159657611596614e5c565b5f60208284031215614ebf575f80fd5b8151613fd381614df5565b5f60208284031215614eda575f80fd5b813560ff81168114613fd3575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614f1d575f80fd5b83018035915067ffffffffffffffff821115614f37575f80fd5b602001915036819003821315614c38575f80fd5b5f60208284031215614f5b575f80fd5b613fd382614e1d565b5f60208284031215614f74575f80fd5b813561ffff81168114613fd3575f80fd5b818382375f9101908152919050565b5f60208284031215614fa4575f80fd5b5051919050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f6080820187835260206080602085015281885180845260a08601915060208a0193505f5b8181101561504957845173ffffffffffffffffffffffffffffffffffffffff1683529383019391830191600101615017565b50508760408601528481036060860152615064818789614fab565b9a9950505050505050505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036150a2576150a2614e5c565b5060010190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126150e5575f80fd5b8135602067ffffffffffffffff80831115615102576151026150a9565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108482111715615145576151456150a9565b6040529384526020818701810194908101925087851115615164575f80fd5b6020870191505b8482101561518b5761517c82614bb9565b8352918301919083019061516b565b979650505050505050565b5f805f805f8060c087890312156151ab575f80fd5b86359550602087013567ffffffffffffffff808211156151c9575f80fd5b6151d58a838b016150d6565b96506040890135955060608901359150808211156151f1575f80fd5b6151fd8a838b016150d6565b94506080890135935060a0890135915080821115615219575f80fd5b5061522689828a016150d6565b9150509295509295509295565b5f82515f5b818110156152525760208186018101518583015201615238565b505f920191825250919050565b858152846020820152608060408201525f61527e608083018587614fab565b90508260608301529695505050505050565b808202811582820484141761159657611596614e5c565b5f826152da577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffdfea164736f6c6343000818000a" func init() { if err := json.Unmarshal([]byte(RollupStorageLayoutJSON), RollupStorageLayout); err != nil { diff --git a/bindings/go.mod b/bindings/go.mod index 9bddb269..dc0b9c5d 100644 --- a/bindings/go.mod +++ b/bindings/go.mod @@ -2,9 +2,9 @@ module morph-l2/bindings go 1.22 -replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3.1 +replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3.2 -require github.com/morph-l2/go-ethereum v1.10.14-0.20241021080617-0ff2a10a9625 +require github.com/morph-l2/go-ethereum v1.10.14-0.20250424011308-f42440d1ace1 require ( github.com/VictoriaMetrics/fastcache v1.12.2 // indirect diff --git a/bindings/go.sum b/bindings/go.sum index d6e55c30..23fc6b9e 100644 --- a/bindings/go.sum +++ b/bindings/go.sum @@ -109,8 +109,8 @@ github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqky github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/morph-l2/go-ethereum v1.10.14-0.20241021080617-0ff2a10a9625 h1:4+cbRSS4lacSIC81RXxvA04UHhGVC4SHVn+bKeqhPSM= -github.com/morph-l2/go-ethereum v1.10.14-0.20241021080617-0ff2a10a9625/go.mod h1:sMJCfHOBzVRDkM2yF/Hy+oUk2rgC0CQZHTLs0cyzhhk= +github.com/morph-l2/go-ethereum v1.10.14-0.20250424011308-f42440d1ace1 h1:Mtl4361Zdc8w3SgCI7L/NuPeLaVdX1L/uP/D4ur/9Yw= +github.com/morph-l2/go-ethereum v1.10.14-0.20250424011308-f42440d1ace1/go.mod h1:sMJCfHOBzVRDkM2yF/Hy+oUk2rgC0CQZHTLs0cyzhhk= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= diff --git a/contracts/contracts/l1/IL1CrossDomainMessenger.sol b/contracts/contracts/l1/IL1CrossDomainMessenger.sol index ce99bbfa..2e190c70 100644 --- a/contracts/contracts/l1/IL1CrossDomainMessenger.sol +++ b/contracts/contracts/l1/IL1CrossDomainMessenger.sol @@ -37,10 +37,6 @@ interface IL1CrossDomainMessenger is ICrossDomainMessenger { bytes message ); - /// @notice Emitted when have message dropped. - /// @param nonce The index of the message to be dropped. - event DropMessage(uint256 indexed nonce); - /***************************** * Public Mutating Functions * *****************************/ @@ -80,12 +76,4 @@ interface IL1CrossDomainMessenger is ICrossDomainMessenger { uint32 newGasLimit, address refundAddress ) external payable; - - /// @notice Drop a skipped message. - /// @param from The address of the sender of the message. - /// @param to The address of the recipient of the message. - /// @param value The msg.value passed to the message call. - /// @param messageNonce The nonce for the message to drop. - /// @param message The content of the message. - function dropMessage(address from, address to, uint256 value, uint256 messageNonce, bytes memory message) external; } diff --git a/contracts/contracts/l1/L1CrossDomainMessenger.sol b/contracts/contracts/l1/L1CrossDomainMessenger.sol index 475e981d..baa4b7fc 100644 --- a/contracts/contracts/l1/L1CrossDomainMessenger.sol +++ b/contracts/contracts/l1/L1CrossDomainMessenger.sol @@ -42,7 +42,7 @@ contract L1CrossDomainMessenger is IL1CrossDomainMessenger, CrossDomainMessenger mapping(bytes32 => uint256) public messageSendTimestamp; /// @notice Mapping from L1 message hash to drop status. - mapping(bytes32 => bool) public isL1MessageDropped; + mapping(bytes32 => bool) public __isL1MessageDropped; /// @notice The address of Rollup contract. address public rollup; @@ -192,7 +192,7 @@ contract L1CrossDomainMessenger is IL1CrossDomainMessenger, CrossDomainMessenger require(messageSendTimestamp[_xDomainCalldataHash] > 0, "Provided message has not been enqueued"); // cannot replay dropped message - require(!isL1MessageDropped[_xDomainCalldataHash], "Message already dropped"); + require(!__isL1MessageDropped[_xDomainCalldataHash], "Message already dropped"); // compute and deduct the messaging fee to fee vault. uint256 _fee = IL1MessageQueue(_messageQueue).estimateCrossDomainMessageFee(_from, _newGasLimit); @@ -243,61 +243,6 @@ contract L1CrossDomainMessenger is IL1CrossDomainMessenger, CrossDomainMessenger } } - /// @inheritdoc IL1CrossDomainMessenger - function dropMessage( - address _from, - address _to, - uint256 _value, - uint256 _messageNonce, - bytes memory _message - ) external override whenNotPaused notInExecution { - // The criteria for dropping a message: - // 1. The message is a L1 message. - // 2. The message has not been dropped before. - // 3. the message and all of its replacement are finalized in L1. - // 4. the message and all of its replacement are skipped. - // - // Possible denial of service attack: - // + replayMessage is called every time someone want to drop the message. - // + replayMessage is called so many times for a skipped message, thus results a long list. - // - // We limit the number of `replayMessage` calls of each message, which may solve the above problem. - - address _messageQueue = messageQueue; - - // check message exists - bytes memory _xDomainCalldata = _encodeXDomainCalldata(_from, _to, _value, _messageNonce, _message); - bytes32 _xDomainCalldataHash = keccak256(_xDomainCalldata); - require(messageSendTimestamp[_xDomainCalldataHash] > 0, "Provided message has not been enqueued"); - - // check message not dropped - require(!isL1MessageDropped[_xDomainCalldataHash], "Message already dropped"); - - // check message is finalized - uint256 _lastIndex = replayStates[_xDomainCalldataHash].lastIndex; - if (_lastIndex == 0) _lastIndex = _messageNonce; - - // check message is skipped and drop it. - // @note If the list is very long, the message may never be dropped. - while (true) { - IL1MessageQueue(_messageQueue).dropCrossDomainMessage(_lastIndex); - _lastIndex = prevReplayIndex[_lastIndex]; - if (_lastIndex == 0) break; - unchecked { - _lastIndex = _lastIndex - 1; - } - } - - isL1MessageDropped[_xDomainCalldataHash] = true; - emit DropMessage(_messageNonce); - - // set execution context - xDomainMessageSender = Constants.DROP_XDOMAIN_MESSAGE_SENDER; - IMessageDropCallback(_from).onDropMessage{value: _value}(_message); - // clear execution context - xDomainMessageSender = Constants.DEFAULT_XDOMAIN_MESSAGE_SENDER; - } - /************************ * Restricted Functions * ************************/ diff --git a/contracts/contracts/l1/rollup/IL1MessageQueue.sol b/contracts/contracts/l1/rollup/IL1MessageQueue.sol index 96b1e000..3a61d383 100644 --- a/contracts/contracts/l1/rollup/IL1MessageQueue.sol +++ b/contracts/contracts/l1/rollup/IL1MessageQueue.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity =0.8.24; interface IL1MessageQueue { /********** @@ -33,12 +33,7 @@ interface IL1MessageQueue { /// @notice Emitted when some L1 => L2 transactions are included in L1. /// @param startIndex The start index of messages popped. /// @param count The number of messages popped. - /// @param skippedBitmap A bitmap indicates whether a message is skipped. - event DequeueTransaction(uint256 startIndex, uint256 count, uint256 skippedBitmap); - - /// @notice Emitted when a message is dropped from L1. - /// @param index The index of message dropped. - event DropTransaction(uint256 index); + event DequeueTransaction(uint256 startIndex, uint256 count); /// @notice Emitted when owner updates gas oracle contract. /// @param _oldGasOracle The address of old gas oracle contract. @@ -96,14 +91,6 @@ interface IL1MessageQueue { bytes calldata data ) external view returns (bytes32); - /// @notice Return whether the message is skipped. - /// @param queueIndex The queue index of the message to check. - function isMessageSkipped(uint256 queueIndex) external view returns (bool); - - /// @notice Return whether the message is dropped. - /// @param queueIndex The queue index of the message to check. - function isMessageDropped(uint256 queueIndex) external view returns (bool); - /***************************** * Public Mutating Functions * *****************************/ @@ -136,9 +123,5 @@ interface IL1MessageQueue { /// /// @param startIndex The start index to pop. /// @param count The number of messages to pop. - /// @param skippedBitmap A bitmap indicates whether a message is skipped. - function popCrossDomainMessage(uint256 startIndex, uint256 count, uint256 skippedBitmap) external; - - /// @notice Drop a skipped message from the queue. - function dropCrossDomainMessage(uint256 index) external; + function popCrossDomainMessage(uint256 startIndex, uint256 count) external; } diff --git a/contracts/contracts/l1/rollup/IL1MessageQueueWithGasPriceOracle.sol b/contracts/contracts/l1/rollup/IL1MessageQueueWithGasPriceOracle.sol index a4f043ed..275b2b01 100644 --- a/contracts/contracts/l1/rollup/IL1MessageQueueWithGasPriceOracle.sol +++ b/contracts/contracts/l1/rollup/IL1MessageQueueWithGasPriceOracle.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity =0.8.24; interface IL1MessageQueueWithGasPriceOracle { /********** diff --git a/contracts/contracts/l1/rollup/IRollup.sol b/contracts/contracts/l1/rollup/IRollup.sol index e27e9564..caa0d300 100644 --- a/contracts/contracts/l1/rollup/IRollup.sol +++ b/contracts/contracts/l1/rollup/IRollup.sol @@ -8,16 +8,16 @@ interface IRollup { /// @param version The version of current batch. /// @param parentBatchHeader The header of parent batch, see the comments of `BatchHeaderV0Codec`. - /// @param blockContexts The block contexts of current batch. - /// @param skippedL1MessageBitmap The bitmap indicates whether each L1 message is skipped or not. + /// @param lastBlockNumber The last block number in this batch + /// @param numL1Messages The number of L1 messages in this batch /// @param prevStateRoot The state root of parent batch. /// @param postStateRoot The state root of current batch. /// @param withdrawalRoot The withdraw trie root of current batch. struct BatchDataInput { uint8 version; bytes parentBatchHeader; - bytes blockContexts; - bytes skippedL1MessageBitmap; + uint64 lastBlockNumber; + uint16 numL1Messages; bytes32 prevStateRoot; bytes32 postStateRoot; bytes32 withdrawalRoot; diff --git a/contracts/contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol b/contracts/contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol index fdc9d25c..3d86a753 100644 --- a/contracts/contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol +++ b/contracts/contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol @@ -48,11 +48,11 @@ contract L1MessageQueueWithGasPriceOracle is OwnableUpgradeable, IL1MessageQueue /// @notice The max gas limit of L1 transactions. uint256 public maxGasLimit; - /// @dev The bitmap for dropped messages, where `droppedMessageBitmap[i]` keeps the bits from `[i*256, (i+1)*256)`. - BitMapsUpgradeable.BitMap private droppedMessageBitmap; + /// @dev The bitmap for dropped messages, where `droppedMessageBitmap[i]` keeps the bits from `[i*256, (i+1)*256)`. Deprecated. + BitMapsUpgradeable.BitMap private __droppedMessageBitmap; - /// @dev The bitmap for skipped messages, where `skippedMessageBitmap[i]` keeps the bits from `[i*256, (i+1)*256)`. - mapping(uint256 => uint256) private skippedMessageBitmap; + /// @dev The bitmap for skipped messages, where `skippedMessageBitmap[i]` keeps the bits from `[i*256, (i+1)*256)`. Deprecated. + mapping(uint256 => uint256) private __skippedMessageBitmap; /// @inheritdoc IL1MessageQueueWithGasPriceOracle address public whitelistChecker; @@ -260,19 +260,6 @@ contract L1MessageQueueWithGasPriceOracle is OwnableUpgradeable, IL1MessageQueue return hash; } - /// @inheritdoc IL1MessageQueue - function isMessageSkipped(uint256 _queueIndex) external view returns (bool) { - if (_queueIndex >= pendingQueueIndex) return false; - - return _isMessageSkipped(_queueIndex); - } - - /// @inheritdoc IL1MessageQueue - function isMessageDropped(uint256 _queueIndex) external view returns (bool) { - // it should be a skipped message first. - return _isMessageSkipped(_queueIndex) && droppedMessageBitmap.get(_queueIndex); - } - /***************************** * Public Mutating Functions * *****************************/ @@ -320,39 +307,17 @@ contract L1MessageQueueWithGasPriceOracle is OwnableUpgradeable, IL1MessageQueue } /// @inheritdoc IL1MessageQueue - function popCrossDomainMessage(uint256 _startIndex, uint256 _count, uint256 _skippedBitmap) external { + function popCrossDomainMessage(uint256 _startIndex, uint256 _count) external { require(_msgSender() == ROLLUP_CONTRACT, "Only callable by the rollup"); require(_count <= 256, "pop too many messages"); require(pendingQueueIndex == _startIndex, "start index mismatch"); unchecked { - // clear extra bits in `_skippedBitmap`, and if _count = 256, it's designed to overflow. - uint256 mask = (1 << _count) - 1; - _skippedBitmap &= mask; - - uint256 bucket = _startIndex >> 8; - uint256 offset = _startIndex & 0xff; - skippedMessageBitmap[bucket] |= _skippedBitmap << offset; - if (offset + _count > 256) { - skippedMessageBitmap[bucket + 1] = _skippedBitmap >> (256 - offset); - } - pendingQueueIndex = _startIndex + _count; } - emit DequeueTransaction(_startIndex, _count, _skippedBitmap); - } - - /// @inheritdoc IL1MessageQueue - function dropCrossDomainMessage(uint256 _index) external onlyMessenger { - require(_index < pendingQueueIndex, "cannot drop pending message"); - - require(_isMessageSkipped(_index), "drop non-skipped message"); - require(!droppedMessageBitmap.get(_index), "message already dropped"); - droppedMessageBitmap.set(_index); - - emit DropTransaction(_index); + emit DequeueTransaction(_startIndex, _count); } /************************ @@ -409,11 +374,4 @@ contract L1MessageQueueWithGasPriceOracle is OwnableUpgradeable, IL1MessageQueue uint256 intrinsicGas = calculateIntrinsicGasFee(_calldata); require(_gasLimit >= intrinsicGas, "Insufficient gas limit, must be above intrinsic gas"); } - - /// @dev Returns whether the bit at `index` is set. - function _isMessageSkipped(uint256 index) internal view returns (bool) { - uint256 bucket = index >> 8; - uint256 mask = 1 << (index & 0xff); - return skippedMessageBitmap[bucket] & mask != 0; - } } diff --git a/contracts/contracts/l1/rollup/Rollup.sol b/contracts/contracts/l1/rollup/Rollup.sol index cd1e8a9e..c44303dc 100644 --- a/contracts/contracts/l1/rollup/Rollup.sol +++ b/contracts/contracts/l1/rollup/Rollup.sol @@ -4,7 +4,7 @@ pragma solidity =0.8.24; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; import {BatchHeaderCodecV0} from "../../libraries/codec/BatchHeaderCodecV0.sol"; -import {BatchCodecV0} from "../../libraries/codec/BatchCodecV0.sol"; +import {BatchHeaderCodecV1} from "../../libraries/codec/BatchHeaderCodecV1.sol"; import {IRollupVerifier} from "../../libraries/verifier/IRollupVerifier.sol"; import {IL1MessageQueue} from "./IL1MessageQueue.sol"; import {IRollup} from "./IRollup.sol"; @@ -174,6 +174,15 @@ contract Rollup is IRollup, OwnableUpgradeable, PausableUpgradeable { emit UpdateProofRewardPercent(0, _proofRewardPercent); } + function initialize2(bytes32 _prevStateRoot) external reinitializer(2) { + require(_getInitializedVersion() == 2, "must have initialized!"); + require(_prevStateRoot != bytes32(0), "can not set state root with bytes32(0)!"); + + if (committedStateRoots[lastCommittedBatchIndex] == bytes32(0)) { + committedStateRoots[lastCommittedBatchIndex] = _prevStateRoot; + } + } + /************************ * Restricted Functions * ************************/ @@ -185,6 +194,8 @@ contract Rollup is IRollup, OwnableUpgradeable, PausableUpgradeable { (uint256 memPtr, bytes32 _batchHash) = _loadBatchHeader(_batchHeader); uint256 _batchIndex = BatchHeaderCodecV0.getBatchIndex(memPtr); + // check batch index is 0 + require(_batchIndex == 0, "invalid batch index"); bytes32 _postStateRoot = BatchHeaderCodecV0.getPostStateHash(memPtr); require(_postStateRoot != bytes32(0), "zero state root"); // check all fields except `dataHash` and `lastBlockHash` are zero @@ -209,10 +220,7 @@ contract Rollup is IRollup, OwnableUpgradeable, PausableUpgradeable { BatchDataInput calldata batchDataInput, BatchSignatureInput calldata batchSignatureInput ) external payable override onlyActiveStaker nonReqRevert whenNotPaused { - require(batchDataInput.version == 0, "invalid version"); - // check whether the batch is empty - uint256 _blockContextsLength = batchDataInput.blockContexts.length; - require(_blockContextsLength > 0, "batch is empty"); + require(batchDataInput.version == 0 || batchDataInput.version == 1, "invalid version"); require(batchDataInput.prevStateRoot != bytes32(0), "previous state root is zero"); require(batchDataInput.postStateRoot != bytes32(0), "new state root is zero"); @@ -237,51 +245,46 @@ contract Rollup is IRollup, OwnableUpgradeable, PausableUpgradeable { uint256 _totalL1MessagesPoppedOverall = BatchHeaderCodecV0.getTotalL1MessagePopped(_batchPtr); // compute the data hash for batch - uint256 _totalL1MessagesPoppedInBatch; - uint256 _totalNumL1Messages; - bytes32 dataHash; - (dataHash, _totalNumL1Messages) = _commitBatch( - batchDataInput.blockContexts, - _totalL1MessagesPoppedInBatch, - _totalL1MessagesPoppedOverall, - batchDataInput.skippedL1MessageBitmap + bytes32 dataHash = _commitBatch( + batchDataInput.lastBlockNumber, + batchDataInput.numL1Messages, + _totalL1MessagesPoppedOverall ); + unchecked { - _totalL1MessagesPoppedInBatch += _totalNumL1Messages; - _totalL1MessagesPoppedOverall += _totalNumL1Messages; - } - // check the length of bitmap - unchecked { - require( - ((_totalL1MessagesPoppedInBatch + 255) / 256) * 32 == batchDataInput.skippedL1MessageBitmap.length, - "wrong bitmap length" - ); + _totalL1MessagesPoppedOverall += batchDataInput.numL1Messages; } assembly { _batchIndex := add(_batchIndex, 1) // increase batch index } bytes32 _blobVersionedHash = (blobhash(0) == bytes32(0)) ? ZERO_VERSIONED_HASH : blobhash(0); - { - uint256 _headerLength = BatchHeaderCodecV0.BATCH_HEADER_FIXED_LENGTH + - batchDataInput.skippedL1MessageBitmap.length; + { + uint256 _headerLength = BatchHeaderCodecV0.BATCH_HEADER_LENGTH; + if (batchDataInput.version == 1) { + _headerLength = BatchHeaderCodecV1.BATCH_HEADER_LENGTH; + } assembly { _batchPtr := mload(0x40) - mstore(0x40, add(_batchPtr, mul(_headerLength, 32))) + mstore(0x40, add(_batchPtr, _headerLength)) } + // store entries, the order matters BatchHeaderCodecV0.storeVersion(_batchPtr, batchDataInput.version); BatchHeaderCodecV0.storeBatchIndex(_batchPtr, _batchIndex); - BatchHeaderCodecV0.storeL1MessagePopped(_batchPtr, _totalL1MessagesPoppedInBatch); + BatchHeaderCodecV0.storeL1MessagePopped(_batchPtr, batchDataInput.numL1Messages); BatchHeaderCodecV0.storeTotalL1MessagePopped(_batchPtr, _totalL1MessagesPoppedOverall); BatchHeaderCodecV0.storeDataHash(_batchPtr, dataHash); + BatchHeaderCodecV0.storeBlobVersionedHash(_batchPtr, _blobVersionedHash); BatchHeaderCodecV0.storePrevStateHash(_batchPtr, batchDataInput.prevStateRoot); BatchHeaderCodecV0.storePostStateHash(_batchPtr, batchDataInput.postStateRoot); BatchHeaderCodecV0.storeWithdrawRootHash(_batchPtr, batchDataInput.withdrawalRoot); BatchHeaderCodecV0.storeSequencerSetVerifyHash(_batchPtr, keccak256(batchSignatureInput.sequencerSets)); BatchHeaderCodecV0.storeParentBatchHash(_batchPtr, _parentBatchHash); - BatchHeaderCodecV0.storeSkippedBitmap(_batchPtr, batchDataInput.skippedL1MessageBitmap); - BatchHeaderCodecV0.storeBlobVersionedHash(_batchPtr, _blobVersionedHash); + // store last block number if version >= 1 + if (batchDataInput.version >= 1) { + BatchHeaderCodecV1.storeLastBlockNumber(_batchPtr, batchDataInput.lastBlockNumber); + } committedBatches[_batchIndex] = BatchHeaderCodecV0.computeBatchHash(_batchPtr, _headerLength); committedStateRoots[_batchIndex] = batchDataInput.postStateRoot; uint256 proveRemainingTime = 0; @@ -293,7 +296,7 @@ contract Rollup is IRollup, OwnableUpgradeable, PausableUpgradeable { batchDataStore[_batchIndex] = BatchData( block.timestamp, block.timestamp + finalizationPeriodSeconds + proveRemainingTime, - _loadL2BlockNumber(batchDataInput.blockContexts), + batchDataInput.lastBlockNumber, // Before BLS is implemented, the accuracy of the sequencer set uploaded by rollup cannot be guaranteed. // Therefore, if the batch is successfully challenged, only the submitter will be punished. IL1Staking(l1StakingContract).getStakerBitmap(_msgSender()) // => batchSignature.signedSequencersBitmap @@ -474,7 +477,7 @@ contract Rollup is IRollup, OwnableUpgradeable, PausableUpgradeable { *****************************/ /// @dev proveState proves a batch by submitting a proof. - function proveState(bytes calldata _batchHeader, bytes calldata _batchProof) external nonReqRevert whenNotPaused { + function proveState(bytes calldata _batchHeader, bytes calldata _batchProof) external nonReqRevert whenNotPaused onlyActiveStaker{ // get batch data from batch header (uint256 memPtr, bytes32 _batchHash) = _loadBatchHeader(_batchHeader); // check batch hash @@ -529,7 +532,6 @@ contract Rollup is IRollup, OwnableUpgradeable, PausableUpgradeable { // Pop finalized and non-skipped message from L1MessageQueue. _popL1Messages( - BatchHeaderCodecV0.getSkippedBitmapPtr(memPtr), BatchHeaderCodecV0.getTotalL1MessagePopped(memPtr), BatchHeaderCodecV0.getL1MessagePopped(memPtr) ); @@ -594,25 +596,19 @@ contract Rollup is IRollup, OwnableUpgradeable, PausableUpgradeable { **********************/ /// @dev Internal function to pop finalized l1 messages. - /// @param bitmapPtr The memory offset of `skippedL1MessageBitmap`. /// @param totalL1MessagePopped The total number of L1 messages popped in all batches including current batch. /// @param l1MessagePopped The number of L1 messages popped in current batch. - function _popL1Messages(uint256 bitmapPtr, uint256 totalL1MessagePopped, uint256 l1MessagePopped) internal { + function _popL1Messages(uint256 totalL1MessagePopped, uint256 l1MessagePopped) internal { if (l1MessagePopped == 0) return; unchecked { uint256 startIndex = totalL1MessagePopped - l1MessagePopped; - uint256 bitmap; for (uint256 i = 0; i < l1MessagePopped; i += 256) { uint256 _count = 256; if (l1MessagePopped - i < _count) { _count = l1MessagePopped - i; } - assembly { - bitmap := mload(bitmapPtr) - bitmapPtr := add(bitmapPtr, 0x20) - } - IL1MessageQueue(messageQueue).popCrossDomainMessage(startIndex, _count, bitmap); + IL1MessageQueue(messageQueue).popCrossDomainMessage(startIndex, _count); startIndex += 256; } } @@ -711,99 +707,64 @@ contract Rollup is IRollup, OwnableUpgradeable, PausableUpgradeable { } } + /// @notice Extract the version number from a batch header + /// @param batchHeader The encoded batch header bytes + /// @return version The version of the batch header + function _getBatchVersion(bytes calldata batchHeader) internal pure returns (uint8 version) { + require(batchHeader.length > 0, "Empty batch header"); + version = uint8(batchHeader[0]); // Safe extraction of the first byte + } + /// @dev Internal function to load batch header from calldata to memory. /// @param _batchHeader The batch header in calldata. /// @return _memPtr The start memory offset of loaded batch header. /// @return _batchHash The hash of the loaded batch header. function _loadBatchHeader(bytes calldata _batchHeader) internal pure returns (uint256 _memPtr, bytes32 _batchHash) { + uint8 _version = _getBatchVersion(_batchHeader); + // load to memory uint256 _length; - (_memPtr, _length) = BatchHeaderCodecV0.loadAndValidate(_batchHeader); + if (_version == 0) { + (_memPtr, _length) = BatchHeaderCodecV0.loadAndValidate(_batchHeader); + } else if (_version == 1) { + (_memPtr, _length) = BatchHeaderCodecV1.loadAndValidate(_batchHeader); + } else { + revert("Unsupported batch version"); + } // compute batch hash + // all the versions use the same way to compute batch hash _batchHash = BatchHeaderCodecV0.computeBatchHash(_memPtr, _length); } - /// @dev Internal function to load the latestL2BlockNumber. - /// @param _blockContexts The batch block contexts in memory. - function _loadL2BlockNumber(bytes memory _blockContexts) internal pure returns (uint256) { - uint256 blockPtr; - uint256 batchPtr; - assembly { - batchPtr := add(_blockContexts, 0x20) - blockPtr := add(batchPtr, 2) - } - uint256 _numBlocks = BatchCodecV0.validateBatchLength(batchPtr, _blockContexts.length); - for (uint256 i = 0; i < _numBlocks - 1; i++) { - unchecked { - blockPtr += BatchCodecV0.BLOCK_CONTEXT_LENGTH; - } - } - uint256 l2BlockNumber = BatchCodecV0.getBlockNumber(blockPtr); - return l2BlockNumber; - } - /// @dev Internal function to commit a batch with version 0. - /// @param _blockContexts The encoded block contexts to commit. - /// @param _totalL1MessagesPoppedInBatch The total number of L1 messages popped in current batch. + /// @param _lastBlockNumber The last block number in this batch. + /// @param _numL1Messages The number of L1 messages in this batch /// @param _totalL1MessagesPoppedOverall The total number of L1 messages popped in all batches including current batch. - /// @param _skippedL1MessageBitmap The bitmap indicates whether each L1 message is skipped or not. /// @return _dataHash The computed data hash for this batch. - /// @return _totalNumL1MessagesInBatch The total number of L1 message popped in current batch function _commitBatch( - bytes memory _blockContexts, - uint256 _totalL1MessagesPoppedInBatch, - uint256 _totalL1MessagesPoppedOverall, - bytes calldata _skippedL1MessageBitmap - ) internal view returns (bytes32 _dataHash, uint256 _totalNumL1MessagesInBatch) { - uint256 batchPtr; + uint64 _lastBlockNumber, + uint16 _numL1Messages, + uint256 _totalL1MessagesPoppedOverall + ) internal view returns (bytes32 _dataHash) { uint256 startDataPtr; uint256 dataPtr; assembly { dataPtr := mload(0x40) startDataPtr := dataPtr - batchPtr := add(_blockContexts, 0x20) // skip batchContexts.length } - uint256 _numBlocks = BatchCodecV0.validateBatchLength(batchPtr, _blockContexts.length); - assembly { - batchPtr := add(batchPtr, 2) // skip numBlocks - } - // concatenate block contexts, use scope to avoid stack too deep - for (uint256 i = 0; i < _numBlocks; i++) { - dataPtr = BatchCodecV0.copyBlockContext(batchPtr, dataPtr, i); - uint256 blockPtr = batchPtr + i * BatchCodecV0.BLOCK_CONTEXT_LENGTH; - uint256 _numL1MessagesInBlock = BatchCodecV0.getNumL1Messages(blockPtr); - unchecked { - _totalNumL1MessagesInBatch += _numL1MessagesInBlock; - } - } assembly { - mstore(0x40, add(dataPtr, mul(_totalNumL1MessagesInBatch, 0x20))) // reserve memory for l1 message hashes + mstore(dataPtr, shl(192, _lastBlockNumber)) // store lastBlockNumber + dataPtr := add(dataPtr, 8) + mstore(dataPtr, shl(240, _numL1Messages)) // store numL1Messages + dataPtr := add(dataPtr, 2) + mstore(0x40, add(dataPtr, mul(_numL1Messages, 0x20))) // reserve memory for l1 message hashes } - // concatenate tx hashes - while (_numBlocks > 0) { - // concatenate l1 message hashes - uint256 _numL1MessagesInBlock = BatchCodecV0.getNumL1Messages(batchPtr); - dataPtr = _loadL1MessageHashes( - dataPtr, - _numL1MessagesInBlock, - _totalL1MessagesPoppedInBatch, - _totalL1MessagesPoppedOverall, - _skippedL1MessageBitmap - ); - uint256 _numTransactionsInBlock = BatchCodecV0.getNumTransactions(batchPtr); - require(_numTransactionsInBlock >= _numL1MessagesInBlock, "num txs less than num L1 msgs"); - unchecked { - _totalL1MessagesPoppedInBatch += _numL1MessagesInBlock; - _totalL1MessagesPoppedOverall += _numL1MessagesInBlock; - - _numBlocks -= 1; - batchPtr += BatchCodecV0.BLOCK_CONTEXT_LENGTH; - } - } + // concatenate l1 message hashes + dataPtr = _loadL1MessageHashes(dataPtr, _numL1Messages, _totalL1MessagesPoppedOverall); // compute data hash and store to memory assembly { @@ -814,16 +775,12 @@ contract Rollup is IRollup, OwnableUpgradeable, PausableUpgradeable { /// @dev Internal function to load L1 message hashes from the message queue. /// @param _ptr The memory offset to store the transaction hash. /// @param _numL1Messages The number of L1 messages to load. - /// @param _totalL1MessagesPoppedInBatch The total number of L1 messages popped in current batch. /// @param _totalL1MessagesPoppedOverall The total number of L1 messages popped in all batches including current batch. - /// @param _skippedL1MessageBitmap The bitmap indicates whether each L1 message is skipped or not. /// @return uint256 The new memory offset after loading. function _loadL1MessageHashes( uint256 _ptr, uint256 _numL1Messages, - uint256 _totalL1MessagesPoppedInBatch, - uint256 _totalL1MessagesPoppedOverall, - bytes calldata _skippedL1MessageBitmap + uint256 _totalL1MessagesPoppedOverall ) internal view returns (uint256) { if (_numL1Messages == 0) { return _ptr; @@ -831,34 +788,14 @@ contract Rollup is IRollup, OwnableUpgradeable, PausableUpgradeable { IL1MessageQueue _messageQueue = IL1MessageQueue(messageQueue); unchecked { - uint256 _bitmap; - uint256 rem; for (uint256 i = 0; i < _numL1Messages; i++) { - uint256 quo = _totalL1MessagesPoppedInBatch >> 8; - rem = _totalL1MessagesPoppedInBatch & 0xff; - - // load bitmap every 256 bits - if (i == 0 || rem == 0) { - assembly { - _bitmap := calldataload(add(_skippedL1MessageBitmap.offset, mul(0x20, quo))) - } - } - if (((_bitmap >> rem) & 1) == 0) { - // message not skipped - bytes32 _hash = _messageQueue.getCrossDomainMessage(_totalL1MessagesPoppedOverall); - assembly { - mstore(_ptr, _hash) - _ptr := add(_ptr, 0x20) - } + bytes32 _hash = _messageQueue.getCrossDomainMessage(_totalL1MessagesPoppedOverall); + assembly { + mstore(_ptr, _hash) + _ptr := add(_ptr, 0x20) } - - _totalL1MessagesPoppedInBatch += 1; _totalL1MessagesPoppedOverall += 1; } - - // check last L1 message is not skipped, _totalL1MessagesPoppedInBatch must > 0 - rem = (_totalL1MessagesPoppedInBatch - 1) & 0xff; - require(((_bitmap >> rem) & 1) == 0, "cannot skip last L1 message"); } return _ptr; diff --git a/contracts/contracts/l1/staking/L1Staking.sol b/contracts/contracts/l1/staking/L1Staking.sol index 165fec18..9f8af443 100644 --- a/contracts/contracts/l1/staking/L1Staking.sol +++ b/contracts/contracts/l1/staking/L1Staking.sol @@ -69,6 +69,9 @@ contract L1Staking is IL1Staking, Staking, OwnableUpgradeable, ReentrancyGuardUp /// @notice challenge deposit value uint256 public challengeDeposit; + /// @notice nonce of staking L1 => L2 msg + uint256 public nonce; + /********************** * Function Modifiers * **********************/ @@ -219,6 +222,9 @@ contract L1Staking is IL1Staking, Staking, OwnableUpgradeable, ReentrancyGuardUp uint256 valueSum; for (uint256 i = 0; i < sequencers.length; i++) { + if (sequencers[i] == address(0)) { + continue; + } if (withdrawals[sequencers[i]] > 0) { delete withdrawals[sequencers[i]]; valueSum += stakingValue; @@ -475,9 +481,10 @@ contract L1Staking is IL1Staking, Staking, OwnableUpgradeable, ReentrancyGuardUp MESSENGER.sendMessage( address(OTHER_STAKING), 0, - abi.encodeCall(IL2Staking.addStaker, (add)), + abi.encodeCall(IL2Staking.addStaker, (nonce, add)), gasLimitAddStaker ); + nonce = nonce + 1; } /// @notice remove stakers @@ -486,16 +493,22 @@ contract L1Staking is IL1Staking, Staking, OwnableUpgradeable, ReentrancyGuardUp MESSENGER.sendMessage( address(OTHER_STAKING), 0, - abi.encodeCall(IL2Staking.removeStakers, (remove)), + abi.encodeCall(IL2Staking.removeStakers, (nonce, remove)), gasLimitRemoveStakers ); + nonce = nonce + 1; } /// @notice clean staker store function _cleanStakerStore() internal { uint256 i = 0; while (i < deleteList.length) { - if (deleteableHeight[deleteList[i]] <= block.number) { + if (deleteList[i] == address(0)) { + // clean deleteList + delete deleteableHeight[deleteList[i]]; + deleteList[i] = deleteList[deleteList.length - 1]; + deleteList.pop(); + } else if (deleteableHeight[deleteList[i]] <= block.number) { // clean stakerSet delete stakerSet[stakerIndexes[deleteList[i]] - 1]; delete stakerIndexes[deleteList[i]]; diff --git a/contracts/contracts/l2/staking/Distribute.sol b/contracts/contracts/l2/staking/Distribute.sol index 71f6b4ac..c7b132ca 100644 --- a/contracts/contracts/l2/staking/Distribute.sol +++ b/contracts/contracts/l2/staking/Distribute.sol @@ -199,7 +199,7 @@ contract Distribute is IDistribute, OwnableUpgradeable { uint256 endEpochIndex = (targetEpochIndex == 0 || targetEpochIndex > mintedEpochCount - 1) ? mintedEpochCount - 1 : targetEpochIndex; - uint256 reward = _claim(delegatee, delegator, endEpochIndex); + (uint256 reward, ) = _claim(delegatee, delegator, endEpochIndex); if (reward > 0) { _transfer(delegator, reward); } @@ -217,13 +217,19 @@ contract Distribute is IDistribute, OwnableUpgradeable { ? mintedEpochCount - 1 : targetEpochIndex; uint256 reward; - for (uint256 i = 0; i < unclaimed[delegator].delegatees.length(); i++) { + for (uint256 i = 0; i < unclaimed[delegator].delegatees.length(); ) { + bool removed = false; address delegatee = unclaimed[delegator].delegatees.at(i); if ( unclaimed[delegator].delegatees.contains(delegatee) && unclaimed[delegator].unclaimedStart[delegatee] <= endEpochIndex ) { - reward += _claim(delegatee, delegator, endEpochIndex); + (uint256 rewardTmp, bool removedTmp) = _claim(delegatee, delegator, endEpochIndex); + reward += rewardTmp; + removed = removedTmp; + } + if (!removed) { + i++; } } if (reward > 0) { @@ -354,7 +360,11 @@ contract Distribute is IDistribute, OwnableUpgradeable { } /// @notice claim delegator morph reward - function _claim(address delegatee, address delegator, uint256 endEpochIndex) internal returns (uint256 reward) { + function _claim( + address delegatee, + address delegator, + uint256 endEpochIndex + ) internal returns (uint256 reward, bool removed) { require(unclaimed[delegator].delegatees.contains(delegatee), "no remaining reward"); require(unclaimed[delegator].unclaimedStart[delegatee] <= endEpochIndex, "all reward claimed"); @@ -371,6 +381,7 @@ contract Distribute is IDistribute, OwnableUpgradeable { // if undelegated, remove delegator unclaimed info after claimed all if (unclaimed[delegator].undelegated[delegatee] && unclaimed[delegator].unclaimedEnd[delegatee] == i) { + removed = true; unclaimed[delegator].delegatees.remove(delegatee); delete unclaimed[delegator].undelegated[delegatee]; delete unclaimed[delegator].unclaimedStart[delegatee]; diff --git a/contracts/contracts/l2/staking/Gov.sol b/contracts/contracts/l2/staking/Gov.sol index af017097..7edf13a0 100644 --- a/contracts/contracts/l2/staking/Gov.sol +++ b/contracts/contracts/l2/staking/Gov.sol @@ -50,7 +50,7 @@ contract Gov is IGov, OwnableUpgradeable { uint256 public override currentProposalID; /// @notice the start index of undeleted proposals - uint256 private undeletedProposalStart; + uint256 public undeletedProposalStart; /// @notice proposal data mapping(uint256 proposalID => ProposalData) public proposalData; @@ -61,6 +61,9 @@ contract Gov is IGov, OwnableUpgradeable { /// @notice proposal voter info mapping(uint256 proposalID => EnumerableSetUpgradeable.AddressSet) internal votes; + /// @notice latest executed proposal ID + uint256 public latestExecutedProposalID; + /********************** * Function Modifiers * **********************/ @@ -146,6 +149,7 @@ contract Gov is IGov, OwnableUpgradeable { /// @notice vote a proposal function vote(uint256 proposalID) external onlySequencer { require(proposalID <= currentProposalID, "invalid proposalID"); + require(proposalID > latestExecutedProposalID, "expired proposalID"); require(proposalID >= undeletedProposalStart, "proposal pruned"); uint256 expirationTime = proposalInfos[proposalID].expirationTime; require( @@ -160,6 +164,7 @@ contract Gov is IGov, OwnableUpgradeable { } } + /// @notice set voting duration function setVotingDuration(uint256 _votingDuration) external onlyOwner { require(_votingDuration > 0 && _votingDuration != votingDuration, "invalid new proposal voting duration"); uint256 _oldVotingDuration = votingDuration; @@ -180,6 +185,19 @@ contract Gov is IGov, OwnableUpgradeable { _executeProposal(proposalID); } + /// @notice execute a passed proposal + /// @param deleteTo last proposal ID to delete + function cleanUpExpiredProposals(uint256 deleteTo) external { + require(deleteTo < latestExecutedProposalID, "only allow to delete the proposal befor latest passed proposal"); + // when a proposal is passed, the previous proposals will be invalidated and deleted + for (uint256 i = undeletedProposalStart; i <= deleteTo; i++) { + delete proposalData[i]; + delete proposalInfos[i]; + delete votes[i]; + } + undeletedProposalStart = deleteTo + 1; + } + /************************* * Public View Functions * *************************/ @@ -187,7 +205,13 @@ contract Gov is IGov, OwnableUpgradeable { /// @notice return proposal status. {finished, passed, executed} function proposalStatus(uint256 proposalID) public view returns (bool, bool, bool) { require(proposalID <= currentProposalID, "invalid proposalID"); + require(proposalID >= latestExecutedProposalID, "expired proposal"); require(proposalID >= undeletedProposalStart, "proposal pruned"); + + if (proposalID == latestExecutedProposalID) { + return (true, true, true); + } + bool executed = proposalInfos[proposalID].executed; uint256 expirationTime = proposalInfos[proposalID].expirationTime; return ( @@ -210,6 +234,8 @@ contract Gov is IGov, OwnableUpgradeable { /// @notice execute a passed proposal function _executeProposal(uint256 proposalID) internal { + latestExecutedProposalID = proposalID; + if (batchBlockInterval != proposalData[proposalID].batchBlockInterval) { uint256 _oldValue = batchBlockInterval; batchBlockInterval = proposalData[proposalID].batchBlockInterval; @@ -228,14 +254,6 @@ contract Gov is IGov, OwnableUpgradeable { } proposalInfos[proposalID].executed = true; - // when a proposal is passed, the previous proposals will be invalidated and deleted - for (uint256 i = undeletedProposalStart; i < proposalID; i++) { - delete proposalData[i]; - delete proposalInfos[i]; - delete votes[i]; - } - undeletedProposalStart = proposalID; - emit ProposalExecuted(proposalID, batchBlockInterval, batchTimeout, rollupEpoch); } diff --git a/contracts/contracts/l2/staking/IDistribute.sol b/contracts/contracts/l2/staking/IDistribute.sol index 39ac3da9..5bb84d0f 100644 --- a/contracts/contracts/l2/staking/IDistribute.sol +++ b/contracts/contracts/l2/staking/IDistribute.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +pragma solidity =0.8.24; import {EnumerableSetUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol"; diff --git a/contracts/contracts/l2/staking/IL2Staking.sol b/contracts/contracts/l2/staking/IL2Staking.sol index 8e9ef047..793da06b 100644 --- a/contracts/contracts/l2/staking/IL2Staking.sol +++ b/contracts/contracts/l2/staking/IL2Staking.sol @@ -140,12 +140,14 @@ interface IL2Staking { *****************************/ /// @notice add staker, sync from L1 - /// @param add staker to add. {addr, tmKey, blsKey} - function addStaker(Types.StakerInfo calldata add) external; + /// @param nonce msg nonce + /// @param add staker to add. {addr, tmKey, blsKey} + function addStaker(uint256 nonce, Types.StakerInfo calldata add) external; /// @notice remove stakers, sync from L1 - /// @param remove staker to remove - function removeStakers(address[] calldata remove) external; + /// @param nonce msg nonce + /// @param remove staker to remove + function removeStakers(uint256 nonce, address[] calldata remove) external; /// @notice setCommissionRate set delegate commission percentage /// @param commission commission percentage, denominator is 100 diff --git a/contracts/contracts/l2/staking/L2Staking.sol b/contracts/contracts/l2/staking/L2Staking.sol index e63367ad..38b1671b 100644 --- a/contracts/contracts/l2/staking/L2Staking.sol +++ b/contracts/contracts/l2/staking/L2Staking.sol @@ -78,6 +78,9 @@ contract L2Staking is IL2Staking, Staking, OwnableUpgradeable, ReentrancyGuardUp /// @notice delegator's undelegations mapping(address delegator => Undelegation[]) public undelegations; + /// @notice nonce of staking L1 => L2 msg + uint256 public nonce; + /********************** * Function Modifiers * **********************/ @@ -94,6 +97,12 @@ contract L2Staking is IL2Staking, Staking, OwnableUpgradeable, ReentrancyGuardUp _; } + /// @notice check nonce + modifier checkNonce(uint256 _nonce) { + require(_nonce == nonce, "invalid nonce"); + _; + } + /*************** * Constructor * ***************/ @@ -154,8 +163,10 @@ contract L2Staking is IL2Staking, Staking, OwnableUpgradeable, ReentrancyGuardUp ************************/ /// @notice add staker, sync from L1 - /// @param add staker to add. {addr, tmKey, blsKey} - function addStaker(Types.StakerInfo calldata add) external onlyOtherStaking { + /// @param _nonce msg nonce + /// @param add staker to add. {addr, tmKey, blsKey} + function addStaker(uint256 _nonce, Types.StakerInfo calldata add) external onlyOtherStaking checkNonce(_nonce) { + nonce = _nonce + 1; if (stakerRankings[add.addr] == 0) { stakerAddresses.push(add.addr); stakerRankings[add.addr] = stakerAddresses.length; @@ -169,8 +180,62 @@ contract L2Staking is IL2Staking, Staking, OwnableUpgradeable, ReentrancyGuardUp } /// @notice remove stakers, sync from L1. If new sequencer set is nil, layer2 will stop producing blocks - /// @param remove staker to remove - function removeStakers(address[] calldata remove) external onlyOtherStaking { + /// @param _nonce msg nonce + /// @param remove staker to remove + function removeStakers(uint256 _nonce, address[] calldata remove) external onlyOtherStaking checkNonce(_nonce) { + nonce = _nonce + 1; + bool updateSequencerSet = false; + for (uint256 i = 0; i < remove.length; i++) { + if (stakerRankings[remove[i]] <= latestSequencerSetSize) { + updateSequencerSet = true; + } + + if (stakerRankings[remove[i]] > 0) { + // update stakerRankings + for (uint256 j = stakerRankings[remove[i]] - 1; j < stakerAddresses.length - 1; j++) { + stakerAddresses[j] = stakerAddresses[j + 1]; + stakerRankings[stakerAddresses[j]] -= 1; + } + stakerAddresses.pop(); + delete stakerRankings[remove[i]]; + + // update candidateNumber + if (stakerDelegations[remove[i]] > 0) { + candidateNumber -= 1; + } + } + + delete stakers[remove[i]]; + } + emit StakerRemoved(remove); + + if (updateSequencerSet) { + _updateSequencerSet(); + } + } + + /// @notice add staker. Only can be called when a serious bug causes L1 and L2 data to be out of sync + /// @param _nonce msg nonce + /// @param add staker to add. {addr, tmKey, blsKey} + function emergencyAddStaker(uint256 _nonce, Types.StakerInfo calldata add) external onlyOwner checkNonce(_nonce) { + nonce = _nonce + 1; + if (stakerRankings[add.addr] == 0) { + stakerAddresses.push(add.addr); + stakerRankings[add.addr] = stakerAddresses.length; + } + stakers[add.addr] = add; + emit StakerAdded(add.addr, add.tmKey, add.blsKey); + + if (!rewardStarted && stakerAddresses.length <= sequencerSetMaxSize) { + _updateSequencerSet(); + } + } + + /// @notice remove stakers. Only can be called when a serious bug causes L1 and L2 data to be out of sync + /// @param _nonce msg nonce + /// @param remove staker to remove + function emergencyRemoveStakers(uint256 _nonce, address[] calldata remove) external onlyOwner checkNonce(_nonce) { + nonce = _nonce + 1; bool updateSequencerSet = false; for (uint256 i = 0; i < remove.length; i++) { if (stakerRankings[remove[i]] <= latestSequencerSetSize) { @@ -487,8 +552,10 @@ contract L2Staking is IL2Staking, Staking, OwnableUpgradeable, ReentrancyGuardUp if (end > (delegatorsTotalNumber - 1)) { end = delegatorsTotalNumber - 1; } - for (uint256 i = start; i <= end; i++) { - delegatorsInPage[i] = delegators[staker].at(i); + uint256 i = start; + uint256 j = 0; + while (i <= end) { + delegatorsInPage[j++] = delegators[staker].at(i++); } return (delegatorsTotalNumber, delegatorsInPage); } @@ -537,7 +604,7 @@ contract L2Staking is IL2Staking, Staking, OwnableUpgradeable, ReentrancyGuardUp /// @notice transfer morph token function _transfer(address _to, uint256 _amount) internal { uint256 balanceBefore = IMorphToken(MORPH_TOKEN_CONTRACT).balanceOf(_to); - IMorphToken(MORPH_TOKEN_CONTRACT).transfer(_to, _amount); + require(IMorphToken(MORPH_TOKEN_CONTRACT).transfer(_to, _amount), "transfer failed"); uint256 balanceAfter = IMorphToken(MORPH_TOKEN_CONTRACT).balanceOf(_to); require(_amount > 0 && balanceAfter - balanceBefore == _amount, "morph token transfer failed"); } @@ -545,7 +612,7 @@ contract L2Staking is IL2Staking, Staking, OwnableUpgradeable, ReentrancyGuardUp /// @notice transfer morph token from function _transferFrom(address _from, address _to, uint256 _amount) internal { uint256 balanceBefore = IMorphToken(MORPH_TOKEN_CONTRACT).balanceOf(_to); - IMorphToken(MORPH_TOKEN_CONTRACT).transferFrom(_from, _to, _amount); + require(IMorphToken(MORPH_TOKEN_CONTRACT).transferFrom(_from, _to, _amount), "transferFrom failed"); uint256 balanceAfter = IMorphToken(MORPH_TOKEN_CONTRACT).balanceOf(_to); require(_amount > 0 && balanceAfter - balanceBefore == _amount, "morph token transfer failed"); } diff --git a/contracts/contracts/l2/system/IMorphToken.sol b/contracts/contracts/l2/system/IMorphToken.sol index 2c95581d..e4ae59a4 100644 --- a/contracts/contracts/l2/system/IMorphToken.sol +++ b/contracts/contracts/l2/system/IMorphToken.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +pragma solidity =0.8.24; import {IERC20MetadataUpgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/extensions/IERC20MetadataUpgradeable.sol"; diff --git a/contracts/contracts/l2/system/L2TxFeeVault.sol b/contracts/contracts/l2/system/L2TxFeeVault.sol index 0c10c012..84dd2a18 100644 --- a/contracts/contracts/l2/system/L2TxFeeVault.sol +++ b/contracts/contracts/l2/system/L2TxFeeVault.sol @@ -134,6 +134,7 @@ contract L2TxFeeVault is OwnableBase { /// @notice Triggers a withdrawal of funds to the L1 fee wallet. /// @param _value The amount of ETH to withdraw. function withdraw(uint256 _value) public onlyOwner { + require(messenger != address(0), "FeeVault: messenger address cannot be address(0)"); require(recipient != address(0), "FeeVault: recipient address cannot be address(0)"); require( _value >= minWithdrawAmount, @@ -178,7 +179,7 @@ contract L2TxFeeVault is OwnableBase { totalProcessed += _value; } - emit Transfer(_value, recipient, msg.sender); + emit Transfer(_value, _to, msg.sender); (bool success, ) = _to.call{value: _value}(""); require(success, "FeeVault: ETH transfer failed"); } @@ -199,6 +200,7 @@ contract L2TxFeeVault is OwnableBase { /// @param _status The transfer allowed status to update. function updateTransferAllowedStatus(address[] memory _accounts, bool _status) external onlyOwner { for (uint256 i = 0; i < _accounts.length; i++) { + require(_accounts[i] != address(0), "FeeVault: transfer allowed address cannot be address(0)"); transferAllowed[_accounts[i]] = _status; emit UpdateTransferAllowed(_accounts[i], _status); } @@ -209,7 +211,7 @@ contract L2TxFeeVault is OwnableBase { /// @param _status The receive allowed status to update. function updateReceiveAllowed(address[] memory _accounts, bool _status) external onlyOwner { for (uint256 i = 0; i < _accounts.length; i++) { - require(_accounts[i] != address(0), "FeeVault: address cannot be address(0)"); + require(_accounts[i] != address(0), "FeeVault: receive address cannot be address(0)"); receiveAllowed[_accounts[i]] = _status; emit UpdateReceiveAllowed(_accounts[i], _status); } @@ -218,6 +220,7 @@ contract L2TxFeeVault is OwnableBase { /// @notice Update the address of messenger. /// @param _newMessenger The address of messenger to update. function updateMessenger(address _newMessenger) external onlyOwner { + require(_newMessenger != address(0), "FeeVault: new messenger address cannot be address(0)"); address _oldMessenger = messenger; messenger = _newMessenger; @@ -227,6 +230,7 @@ contract L2TxFeeVault is OwnableBase { /// @notice Update the address of recipient. /// @param _newRecipient The address of recipient to update. function updateRecipient(address _newRecipient) external onlyOwner { + require(_newRecipient != address(0), "FeeVault: new recipient address cannot be address(0)"); address _oldRecipient = recipient; recipient = _newRecipient; @@ -236,6 +240,7 @@ contract L2TxFeeVault is OwnableBase { /// @notice Update the minimum withdraw amount. /// @param _newMinWithdrawAmount The minimum withdraw amount to update. function updateMinWithdrawAmount(uint256 _newMinWithdrawAmount) external onlyOwner { + require(_newMinWithdrawAmount > 0, "FeeVault: new minimum withdraw amount cannot be 0"); uint256 _oldMinWithdrawAmount = minWithdrawAmount; minWithdrawAmount = _newMinWithdrawAmount; diff --git a/contracts/contracts/l2/system/MorphToken.sol b/contracts/contracts/l2/system/MorphToken.sol index d2a98933..2665d7d9 100644 --- a/contracts/contracts/l2/system/MorphToken.sol +++ b/contracts/contracts/l2/system/MorphToken.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +pragma solidity =0.8.24; import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; diff --git a/contracts/contracts/l2/system/WrappedEther.sol b/contracts/contracts/l2/system/WrappedEther.sol index 64aa269f..84e37863 100644 --- a/contracts/contracts/l2/system/WrappedEther.sol +++ b/contracts/contracts/l2/system/WrappedEther.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +pragma solidity =0.8.24; import {ERC20} from "@openzeppelin/contracts/token/ERC20/ERC20.sol"; import {ERC20Permit} from "@openzeppelin/contracts/token/ERC20/extensions/draft-ERC20Permit.sol"; diff --git a/contracts/contracts/libraries/ICrossDomainMessenger.sol b/contracts/contracts/libraries/ICrossDomainMessenger.sol index 9ec8f339..8d0ee03f 100644 --- a/contracts/contracts/libraries/ICrossDomainMessenger.sol +++ b/contracts/contracts/libraries/ICrossDomainMessenger.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.9; +pragma solidity =0.8.24; interface ICrossDomainMessenger { /*********** diff --git a/contracts/contracts/libraries/callbacks/IERC677Receiver.sol b/contracts/contracts/libraries/callbacks/IERC677Receiver.sol index fba8d1c9..2eed9628 100644 --- a/contracts/contracts/libraries/callbacks/IERC677Receiver.sol +++ b/contracts/contracts/libraries/callbacks/IERC677Receiver.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.9; +pragma solidity =0.8.24; interface IERC677Receiver { function onTokenTransfer(address sender, uint256 value, bytes memory data) external; diff --git a/contracts/contracts/libraries/callbacks/IGatewayCallback.sol b/contracts/contracts/libraries/callbacks/IGatewayCallback.sol index c138ca63..0a44f01f 100644 --- a/contracts/contracts/libraries/callbacks/IGatewayCallback.sol +++ b/contracts/contracts/libraries/callbacks/IGatewayCallback.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.9; +pragma solidity =0.8.24; interface IGatewayCallback { function onGatewayCallback(bytes memory data) external; diff --git a/contracts/contracts/libraries/callbacks/IMessageDropCallback.sol b/contracts/contracts/libraries/callbacks/IMessageDropCallback.sol index 52925e8e..53961f85 100644 --- a/contracts/contracts/libraries/callbacks/IMessageDropCallback.sol +++ b/contracts/contracts/libraries/callbacks/IMessageDropCallback.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.9; +pragma solidity =0.8.24; interface IMessageDropCallback { function onDropMessage(bytes memory message) external payable; diff --git a/contracts/contracts/libraries/codec/BatchCodecV0.sol b/contracts/contracts/libraries/codec/BatchCodecV0.sol deleted file mode 100644 index bc225406..00000000 --- a/contracts/contracts/libraries/codec/BatchCodecV0.sol +++ /dev/null @@ -1,108 +0,0 @@ -// SPDX-License-Identifier: MIT - -pragma solidity ^0.8.16; - -/* solhint-disable */ - -/// @dev Below is the encoding for `Batch`, total 60*n+1 bytes. -/// ```text -/// * Field Bytes Type Index Comments -/// * numBlocks 2 uint16 0 The number of blocks in this batch -/// * block[0] 60 BlockContext 1 The first block in this batch -/// * ...... -/// * block[i] 60 BlockContext 60*i+1 The (i+1)'th block in this batch -/// * ...... -/// * block[n-1] 60 BlockContext 60*n-59 The last block in this batch -/// ``` -/// -/// @dev Below is the encoding for `BlockContext`, total 60 bytes. -/// ```text -/// * Field Bytes Type Index Comments -/// * blockNumber 8 uint64 0 The height of this block. -/// * timestamp 8 uint64 8 The timestamp of this block. -/// * baseFee 32 uint256 16 The base fee of this block. -/// * gasLimit 8 uint64 48 The gas limit of this block. -/// * numTransactions 2 uint16 56 The number of transactions in this block, both L1 & L2 txs. -/// * numL1Messages 2 uint16 58 The number of l1 messages in this block. -/// ``` -library BatchCodecV0 { - /// @dev Thrown when no blocks in batch. - error ErrorNoBlockInBatch(); - - /// @dev Thrown when the length of batch is incorrect. - error ErrorIncorrectBatchLength(); - - /// @dev The length of one block context. - uint256 internal constant BLOCK_CONTEXT_LENGTH = 60; - - /// @notice Validate the length of batch. - /// @param batchPtr The start memory offset of the batch in memory. - /// @param _length The length of the batch. - /// @return _numBlocks The number of blocks in current batch. - function validateBatchLength(uint256 batchPtr, uint256 _length) internal pure returns (uint256 _numBlocks) { - _numBlocks = getNumBlocks(batchPtr); - - // should contain at least one block - if (_numBlocks == 0) revert ErrorNoBlockInBatch(); - - // should contain the number of the blocks and block contexts - if (_length != 2 + _numBlocks * BLOCK_CONTEXT_LENGTH) revert ErrorIncorrectBatchLength(); - } - - /// @notice Return the number of blocks in current batch. - /// @param batchPtr The start memory offset of the batch in memory. - /// @return _numBlocks The number of blocks in current batch. - function getNumBlocks(uint256 batchPtr) internal pure returns (uint256 _numBlocks) { - assembly { - _numBlocks := shr(240, mload(batchPtr)) - } - } - - /// @notice Copy the block context to another memory. - /// @param blockPtr The start memory offset of the first block context in memory. - /// @param dstPtr The destination memory offset to store the block context. - /// @param index The index of block context to copy. - /// @return uint256 The new destination memory offset after copy. - function copyBlockContext(uint256 blockPtr, uint256 dstPtr, uint256 index) internal pure returns (uint256) { - // only first 58 bytes is needed. - assembly { - blockPtr := add(blockPtr, mul(BLOCK_CONTEXT_LENGTH, index)) - mstore(dstPtr, mload(blockPtr)) // first 32 bytes - mstore( - add(dstPtr, 0x20), - and(mload(add(blockPtr, 0x20)), 0xffffffffffffffffffffffffffffffffffffffffffffffffffff000000000000) - ) // next 26 bytes - - dstPtr := add(dstPtr, 58) - } - - return dstPtr; - } - - /// @notice Return the number of transactions in current block. - /// @param blockPtr The start memory offset of the block context in memory. - /// @return _numTransactions The number of transactions in current block. - function getNumTransactions(uint256 blockPtr) internal pure returns (uint256 _numTransactions) { - assembly { - _numTransactions := shr(240, mload(add(blockPtr, 56))) - } - } - - /// @notice Return the number of L1 messages in current block. - /// @param blockPtr The start memory offset of the block context in memory. - /// @return _numL1Messages The number of L1 messages in current block. - function getNumL1Messages(uint256 blockPtr) internal pure returns (uint256 _numL1Messages) { - assembly { - _numL1Messages := shr(240, mload(add(blockPtr, 58))) - } - } - - /// @notice Return the number of the block. - /// @param blockPtr The start memory offset of the block context in memory. - /// @return _blockNumber The block number of blockPtr in current block. - function getBlockNumber(uint256 blockPtr) internal pure returns (uint256 _blockNumber) { - assembly { - _blockNumber := shr(192, mload(blockPtr)) - } - } -} diff --git a/contracts/contracts/libraries/codec/BatchHeaderCodecV0.sol b/contracts/contracts/libraries/codec/BatchHeaderCodecV0.sol index de79c773..e043816a 100644 --- a/contracts/contracts/libraries/codec/BatchHeaderCodecV0.sol +++ b/contracts/contracts/libraries/codec/BatchHeaderCodecV0.sol @@ -4,7 +4,7 @@ pragma solidity ^0.8.24; // solhint-disable no-inline-assembly -/// @dev Below is the encoding for `BatchHeader` V0, total 249 + ceil(l1MessagePopped / 256) * 32 bytes. +/// @dev Below is the encoding for `BatchHeader` V0, total 249 /// ```text /// * Field Bytes Type Index Comments /// * version 1 uint8 0 The batch version @@ -18,11 +18,10 @@ pragma solidity ^0.8.24; /// * withdrawRootHash 32 bytes32 153 L2 withdrawal tree root hash /// * sequencerSetVerifyHash 32 bytes32 185 L2 sequencers set verify hash /// * parentBatchHash 32 bytes32 217 The parent batch hash -/// * skippedL1MessageBitmap dynamic uint256[] 249 A bitmap to indicate which L1 messages are skipped in the batch /// ``` library BatchHeaderCodecV0 { /// @dev The length of fixed parts of the batch header. - uint256 internal constant BATCH_HEADER_FIXED_LENGTH = 249; + uint256 internal constant BATCH_HEADER_LENGTH = 249; /// @notice Load batch header in calldata to memory. /// @param _batchHeader The encoded batch header bytes in calldata. @@ -30,20 +29,13 @@ library BatchHeaderCodecV0 { /// @return length The length in bytes of the batch header. function loadAndValidate(bytes calldata _batchHeader) internal pure returns (uint256 batchPtr, uint256 length) { length = _batchHeader.length; - require(length >= BATCH_HEADER_FIXED_LENGTH, "batch header length too small"); + require(length >= BATCH_HEADER_LENGTH, "batch header length too small"); // copy batch header to memory. assembly { batchPtr := mload(0x40) calldatacopy(batchPtr, _batchHeader.offset, length) mstore(0x40, add(batchPtr, length)) } - - // check batch header length - uint256 _l1MessagePopped = getL1MessagePopped(batchPtr); - - unchecked { - require(length == BATCH_HEADER_FIXED_LENGTH + ((_l1MessagePopped + 255) / 256) * 32, "wrong bitmap length"); - } } /// @notice Get the version of the batch header. @@ -133,26 +125,6 @@ library BatchHeaderCodecV0 { } } - /// @notice Get the start memory offset for skipped L1 messages bitmap. - /// @param batchPtr The start memory offset of the batch header in memory. - /// @return _bitmapPtr the start memory offset for skipped L1 messages bitmap. - function getSkippedBitmapPtr(uint256 batchPtr) internal pure returns (uint256 _bitmapPtr) { - assembly { - _bitmapPtr := add(batchPtr, BATCH_HEADER_FIXED_LENGTH) - } - } - - /// @notice Get the skipped L1 messages bitmap. - /// @param batchPtr The start memory offset of the batch header in memory. - /// @param index The index of bitmap to load. - /// @return _bitmap The bitmap from bits `index * 256` to `index * 256 + 255`. - function getSkippedBitmap(uint256 batchPtr, uint256 index) internal pure returns (uint256 _bitmap) { - assembly { - batchPtr := add(batchPtr, BATCH_HEADER_FIXED_LENGTH) - _bitmap := mload(add(batchPtr, mul(index, 32))) - } - } - /// @notice Store the version of batch header. /// @param batchPtr The start memory offset of the batch header in memory. /// @param _version The version of batch header. @@ -258,19 +230,6 @@ library BatchHeaderCodecV0 { } } - /// @notice Store the skipped L1 message bitmap of batch header. - /// @param batchPtr The start memory offset of the batch header in memory. - /// @param _skippedL1MessageBitmap The skipped L1 message bitmap. - function storeSkippedBitmap(uint256 batchPtr, bytes calldata _skippedL1MessageBitmap) internal pure { - assembly { - calldatacopy( - add(batchPtr, BATCH_HEADER_FIXED_LENGTH), - _skippedL1MessageBitmap.offset, - _skippedL1MessageBitmap.length - ) - } - } - /// @notice Compute the batch hash. /// @dev Caller should make sure that the encoded batch header is correct. /// diff --git a/contracts/contracts/libraries/codec/BatchHeaderCodecV1.sol b/contracts/contracts/libraries/codec/BatchHeaderCodecV1.sol new file mode 100644 index 00000000..5bda2776 --- /dev/null +++ b/contracts/contracts/libraries/codec/BatchHeaderCodecV1.sol @@ -0,0 +1,59 @@ +// SPDX-License-Identifier: MIT + +pragma solidity ^0.8.24; + +// solhint-disable no-inline-assembly + +/// @dev Below is the encoding for `BatchHeader` V1, total 257 +/// * Field Bytes Type Index Comments +/// * version 1 uint8 0 The batch version +/// * batchIndex 8 uint64 1 The index of the batch +/// * l1MessagePopped 8 uint64 9 Number of L1 messages popped in the batch +/// * totalL1MessagePopped 8 uint64 17 Number of total L1 messages popped after the batch +/// * dataHash 32 bytes32 25 The data hash of the batch +/// * blobVersionedHash 32 bytes32 57 The versioned hash of the blob with this batch’s data +/// * prevStateHash 32 bytes32 89 Preview state root +/// * postStateHash 32 bytes32 121 Post state root +/// * withdrawRootHash 32 bytes32 153 L2 withdrawal tree root hash +/// * sequencerSetVerifyHash 32 bytes32 185 L2 sequencers set verify hash +/// * parentBatchHash 32 bytes32 217 The parent batch hash +/// +/// @dev Below is the feilds for `BatchHeader` V1 +/// * lastBlockNumber 8 uint64 249 The last block number in this batch +/// ``` + +library BatchHeaderCodecV1 { + /// @dev The length of fixed parts of the batch header. + uint256 internal constant BATCH_HEADER_LENGTH = 257; + + /// @notice Load batch header in calldata to memory. + /// @param _batchHeader The encoded batch header bytes in calldata. + /// @return batchPtr The start memory offset of the batch header in memory. + /// @return length The length in bytes of the batch header. + function loadAndValidate(bytes calldata _batchHeader) internal pure returns (uint256 batchPtr, uint256 length) { + length = _batchHeader.length; + require(length == BATCH_HEADER_LENGTH, "batch header length is incorrect"); + // copy batch header to memory. + assembly { + batchPtr := mload(0x40) + calldatacopy(batchPtr, _batchHeader.offset, length) + mstore(0x40, add(batchPtr, length)) + } + } + + /// @notice Get the last block number of the batch. + function getLastBlockNumber(uint256 batchPtr) internal pure returns (uint256 _lastBlockNumber) { + assembly { + _lastBlockNumber := shr(192, mload(add(batchPtr, 249))) + } + } + + /// @notice Store the last block number of the batch. + /// @param batchPtr The start memory offset of the batch header in memory. + /// @param _lastBlockNumber The last block number to store. + function storeLastBlockNumber(uint256 batchPtr, uint256 _lastBlockNumber) internal pure { + assembly { + mstore(add(batchPtr, 249), shl(192, _lastBlockNumber)) + } + } +} diff --git a/contracts/contracts/libraries/common/IWhitelist.sol b/contracts/contracts/libraries/common/IWhitelist.sol index b3278aff..ed28c3be 100644 --- a/contracts/contracts/libraries/common/IWhitelist.sol +++ b/contracts/contracts/libraries/common/IWhitelist.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity =0.8.24; interface IWhitelist { /// @notice Emitted when account whitelist status changed. diff --git a/contracts/contracts/libraries/token/FiatTokenV1.sol b/contracts/contracts/libraries/token/FiatTokenV1.sol deleted file mode 100644 index ed3d19d8..00000000 --- a/contracts/contracts/libraries/token/FiatTokenV1.sol +++ /dev/null @@ -1,959 +0,0 @@ -// SPDX-License-Identifier: Apache-2.0 -pragma solidity =0.8.24; - -// contracts/v1/Ownable.sol -/** - - * - * Copyright (c) 2018 zOS Global Limited. - * Copyright (c) 2018-2020 CENTRE SECZ - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/** - * @notice The Ownable contract has an owner address, and provides basic - * authorization control functions - * @dev Forked from https://github.com/OpenZeppelin/openzeppelin-labs/blob/3887ab77b8adafba4a26ace002f3a684c1a3388b/upgradeability_ownership/contracts/ownership/Ownable.sol - * Modifications: - * 1. Consolidate OwnableStorage into this contract (7/13/18) - * 2. Reformat, conform to Solidity 0.6 syntax, and add error messages (5/13/20) - * 3. Make public functions external (5/27/20) - */ -contract Ownable { - // Owner of the contract - address private _owner; - - /** - * @dev Event to show ownership has been transferred - * @param previousOwner representing the address of the previous owner - * @param newOwner representing the address of the new owner - */ - event OwnershipTransferred(address previousOwner, address newOwner); - - /** - * @dev The constructor sets the original owner of the contract to the sender account. - */ - constructor() { - setOwner(msg.sender); - } - - /** - * @dev Tells the address of the owner - * @return the address of the owner - */ - function owner() external view returns (address) { - return _owner; - } - - /** - * @dev Sets a new owner address - */ - function setOwner(address newOwner) internal { - _owner = newOwner; - } - - /** - * @dev Throws if called by any account other than the owner. - */ - modifier onlyOwner() { - require(msg.sender == _owner, "Ownable: caller is not the owner"); - _; - } - - /** - * @dev Allows the current owner to transfer control of the contract to a newOwner. - * @param newOwner The address to transfer ownership to. - */ - function transferOwnership(address newOwner) external onlyOwner { - require(newOwner != address(0), "Ownable: new owner is the zero address"); - emit OwnershipTransferred(_owner, newOwner); - setOwner(newOwner); - } -} - -// node_modules/@openzeppelin/contracts/math/SafeMath.sol - -/** - * @dev Wrappers over Solidity's arithmetic operations with added overflow - * checks. - * - * Arithmetic operations in Solidity wrap on overflow. This can easily result - * in bugs, because programmers usually assume that an overflow raises an - * error, which is the standard behavior in high level programming languages. - * `SafeMath` restores this intuition by reverting the transaction when an - * operation overflows. - * - * Using this library instead of the unchecked operations eliminates an entire - * class of bugs, so it's recommended to use it always. - */ -library SafeMath { - /** - * @dev Returns the addition of two unsigned integers, with an overflow flag. - * - * _Available since v3.4._ - */ - function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { - uint256 c = a + b; - if (c < a) return (false, 0); - return (true, c); - } - - /** - * @dev Returns the subtraction of two unsigned integers, with an overflow flag. - * - * _Available since v3.4._ - */ - function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { - if (b > a) return (false, 0); - return (true, a - b); - } - - /** - * @dev Returns the multiplication of two unsigned integers, with an overflow flag. - * - * _Available since v3.4._ - */ - function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { - // Gas optimization: this is cheaper than requiring 'a' not being zero, but the - // benefit is lost if 'b' is also tested. - // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 - if (a == 0) return (true, 0); - uint256 c = a * b; - if (c / a != b) return (false, 0); - return (true, c); - } - - /** - * @dev Returns the division of two unsigned integers, with a division by zero flag. - * - * _Available since v3.4._ - */ - function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { - if (b == 0) return (false, 0); - return (true, a / b); - } - - /** - * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. - * - * _Available since v3.4._ - */ - function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { - if (b == 0) return (false, 0); - return (true, a % b); - } - - /** - * @dev Returns the addition of two unsigned integers, reverting on - * overflow. - * - * Counterpart to Solidity's `+` operator. - * - * Requirements: - * - * - Addition cannot overflow. - */ - function add(uint256 a, uint256 b) internal pure returns (uint256) { - uint256 c = a + b; - require(c >= a, "SafeMath: addition overflow"); - return c; - } - - /** - * @dev Returns the subtraction of two unsigned integers, reverting on - * overflow (when the result is negative). - * - * Counterpart to Solidity's `-` operator. - * - * Requirements: - * - * - Subtraction cannot overflow. - */ - function sub(uint256 a, uint256 b) internal pure returns (uint256) { - require(b <= a, "SafeMath: subtraction overflow"); - return a - b; - } - - /** - * @dev Returns the multiplication of two unsigned integers, reverting on - * overflow. - * - * Counterpart to Solidity's `*` operator. - * - * Requirements: - * - * - Multiplication cannot overflow. - */ - function mul(uint256 a, uint256 b) internal pure returns (uint256) { - if (a == 0) return 0; - uint256 c = a * b; - require(c / a == b, "SafeMath: multiplication overflow"); - return c; - } - - /** - * @dev Returns the integer division of two unsigned integers, reverting on - * division by zero. The result is rounded towards zero. - * - * Counterpart to Solidity's `/` operator. Note: this function uses a - * `revert` opcode (which leaves remaining gas untouched) while Solidity - * uses an invalid opcode to revert (consuming all remaining gas). - * - * Requirements: - * - * - The divisor cannot be zero. - */ - function div(uint256 a, uint256 b) internal pure returns (uint256) { - require(b > 0, "SafeMath: division by zero"); - return a / b; - } - - /** - * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), - * reverting when dividing by zero. - * - * Counterpart to Solidity's `%` operator. This function uses a `revert` - * opcode (which leaves remaining gas untouched) while Solidity uses an - * invalid opcode to revert (consuming all remaining gas). - * - * Requirements: - * - * - The divisor cannot be zero. - */ - function mod(uint256 a, uint256 b) internal pure returns (uint256) { - require(b > 0, "SafeMath: modulo by zero"); - return a % b; - } - - /** - * @dev Returns the subtraction of two unsigned integers, reverting with custom message on - * overflow (when the result is negative). - * - * CAUTION: This function is deprecated because it requires allocating memory for the error - * message unnecessarily. For custom revert reasons use {trySub}. - * - * Counterpart to Solidity's `-` operator. - * - * Requirements: - * - * - Subtraction cannot overflow. - */ - function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { - require(b <= a, errorMessage); - return a - b; - } - - /** - * @dev Returns the integer division of two unsigned integers, reverting with custom message on - * division by zero. The result is rounded towards zero. - * - * CAUTION: This function is deprecated because it requires allocating memory for the error - * message unnecessarily. For custom revert reasons use {tryDiv}. - * - * Counterpart to Solidity's `/` operator. Note: this function uses a - * `revert` opcode (which leaves remaining gas untouched) while Solidity - * uses an invalid opcode to revert (consuming all remaining gas). - * - * Requirements: - * - * - The divisor cannot be zero. - */ - function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { - require(b > 0, errorMessage); - return a / b; - } - - /** - * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), - * reverting with custom message when dividing by zero. - * - * CAUTION: This function is deprecated because it requires allocating memory for the error - * message unnecessarily. For custom revert reasons use {tryMod}. - * - * Counterpart to Solidity's `%` operator. This function uses a `revert` - * opcode (which leaves remaining gas untouched) while Solidity uses an - * invalid opcode to revert (consuming all remaining gas). - * - * Requirements: - * - * - The divisor cannot be zero. - */ - function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { - require(b > 0, errorMessage); - return a % b; - } -} - -// node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol - -/** - * @dev Interface of the ERC20 standard as defined in the EIP. - */ -interface IERC20 { - /** - * @dev Returns the amount of tokens in existence. - */ - function totalSupply() external view returns (uint256); - - /** - * @dev Returns the amount of tokens owned by `account`. - */ - function balanceOf(address account) external view returns (uint256); - - /** - * @dev Moves `amount` tokens from the caller's account to `recipient`. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transfer(address recipient, uint256 amount) external returns (bool); - - /** - * @dev Returns the remaining number of tokens that `spender` will be - * allowed to spend on behalf of `owner` through {transferFrom}. This is - * zero by default. - * - * This value changes when {approve} or {transferFrom} are called. - */ - function allowance(address owner, address spender) external view returns (uint256); - - /** - * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * IMPORTANT: Beware that changing an allowance with this method brings the risk - * that someone may use both the old and the new allowance by unfortunate - * transaction ordering. One possible solution to mitigate this race - * condition is to first reduce the spender's allowance to 0 and set the - * desired value afterwards: - * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 - * - * Emits an {Approval} event. - */ - function approve(address spender, uint256 amount) external returns (bool); - - /** - * @dev Moves `amount` tokens from `sender` to `recipient` using the - * allowance mechanism. `amount` is then deducted from the caller's - * allowance. - * - * Returns a boolean value indicating whether the operation succeeded. - * - * Emits a {Transfer} event. - */ - function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); - - /** - * @dev Emitted when `value` tokens are moved from one account (`from`) to - * another (`to`). - * - * Note that `value` may be zero. - */ - event Transfer(address indexed from, address indexed to, uint256 value); - - /** - * @dev Emitted when the allowance of a `spender` for an `owner` is set by - * a call to {approve}. `value` is the new allowance. - */ - event Approval(address indexed owner, address indexed spender, uint256 value); -} - -// contracts/v1/AbstractFiatTokenV1.sol -/** - * Copyright 2023 Circle Internet Financial, LTD. All rights reserved. - * - - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -abstract contract AbstractFiatTokenV1 is IERC20 { - function _approve(address owner, address spender, uint256 value) internal virtual; - - function _transfer(address from, address to, uint256 value) internal virtual; -} - -// contracts/v1/Blacklistable.sol -/** - * Copyright 2023 Circle Internet Financial, LTD. All rights reserved. - * - - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @title Blacklistable Token - * @dev Allows accounts to be blacklisted by a "blacklister" role - */ -abstract contract Blacklistable is Ownable { - address public blacklister; - mapping(address => bool) internal _deprecatedBlacklisted; - - event Blacklisted(address indexed _account); - event UnBlacklisted(address indexed _account); - event BlacklisterChanged(address indexed newBlacklister); - - /** - * @dev Throws if called by any account other than the blacklister. - */ - modifier onlyBlacklister() { - require(msg.sender == blacklister, "Blacklistable: caller is not the blacklister"); - _; - } - - /** - * @dev Throws if argument account is blacklisted. - * @param _account The address to check. - */ - modifier notBlacklisted(address _account) { - require(!_isBlacklisted(_account), "Blacklistable: account is blacklisted"); - _; - } - - /** - * @notice Checks if account is blacklisted. - * @param _account The address to check. - * @return True if the account is blacklisted, false if the account is not blacklisted. - */ - function isBlacklisted(address _account) external view returns (bool) { - return _isBlacklisted(_account); - } - - /** - * @notice Adds account to blacklist. - * @param _account The address to blacklist. - */ - function blacklist(address _account) external onlyBlacklister { - _blacklist(_account); - emit Blacklisted(_account); - } - - /** - * @notice Removes account from blacklist. - * @param _account The address to remove from the blacklist. - */ - function unBlacklist(address _account) external onlyBlacklister { - _unBlacklist(_account); - emit UnBlacklisted(_account); - } - - /** - * @notice Updates the blacklister address. - * @param _newBlacklister The address of the new blacklister. - */ - function updateBlacklister(address _newBlacklister) external onlyOwner { - require(_newBlacklister != address(0), "Blacklistable: new blacklister is the zero address"); - blacklister = _newBlacklister; - emit BlacklisterChanged(blacklister); - } - - /** - * @dev Checks if account is blacklisted. - * @param _account The address to check. - * @return true if the account is blacklisted, false otherwise. - */ - function _isBlacklisted(address _account) internal view virtual returns (bool); - - /** - * @dev Helper method that blacklists an account. - * @param _account The address to blacklist. - */ - function _blacklist(address _account) internal virtual; - - /** - * @dev Helper method that unblacklists an account. - * @param _account The address to unblacklist. - */ - function _unBlacklist(address _account) internal virtual; -} - -// contracts/v1/Pausable.sol -/** - - * - * Copyright (c) 2016 Smart Contract Solutions, Inc. - * Copyright (c) 2018-2020 CENTRE SECZ - * - * Permission is hereby granted, free of charge, to any person obtaining a copy - * of this software and associated documentation files (the "Software"), to deal - * in the Software without restriction, including without limitation the rights - * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell - * copies of the Software, and to permit persons to whom the Software is - * furnished to do so, subject to the following conditions: - * - * The above copyright notice and this permission notice shall be included in - * copies or substantial portions of the Software. - * - * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR - * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, - * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE - * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER - * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, - * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE - * SOFTWARE. - */ - -/** - * @notice Base contract which allows children to implement an emergency stop - * mechanism - * @dev Forked from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/feb665136c0dae9912e08397c1a21c4af3651ef3/contracts/lifecycle/Pausable.sol - * Modifications: - * 1. Added pauser role, switched pause/unpause to be onlyPauser (6/14/2018) - * 2. Removed whenNotPause/whenPaused from pause/unpause (6/14/2018) - * 3. Removed whenPaused (6/14/2018) - * 4. Switches ownable library to use ZeppelinOS (7/12/18) - * 5. Remove constructor (7/13/18) - * 6. Reformat, conform to Solidity 0.6 syntax and add error messages (5/13/20) - * 7. Make public functions external (5/27/20) - */ -contract Pausable is Ownable { - event Pause(); - event Unpause(); - event PauserChanged(address indexed newAddress); - - address public pauser; - bool public paused = false; - - /** - * @dev Modifier to make a function callable only when the contract is not paused. - */ - modifier whenNotPaused() { - require(!paused, "Pausable: paused"); - _; - } - - /** - * @dev throws if called by any account other than the pauser - */ - modifier onlyPauser() { - require(msg.sender == pauser, "Pausable: caller is not the pauser"); - _; - } - - /** - * @dev called by the owner to pause, triggers stopped state - */ - function pause() external onlyPauser { - paused = true; - emit Pause(); - } - - /** - * @dev called by the owner to unpause, returns to normal state - */ - function unpause() external onlyPauser { - paused = false; - emit Unpause(); - } - - /** - * @notice Updates the pauser address. - * @param _newPauser The address of the new pauser. - */ - function updatePauser(address _newPauser) external onlyOwner { - require(_newPauser != address(0), "Pausable: new pauser is the zero address"); - pauser = _newPauser; - emit PauserChanged(pauser); - } -} - -// contracts/v1/FiatTokenV1.sol -/** - * Copyright 2023 Circle Internet Financial, LTD. All rights reserved. - * - - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -/** - * @title FiatToken - * @dev ERC20 Token backed by fiat reserves - */ -contract FiatTokenV1 is AbstractFiatTokenV1, Ownable, Pausable, Blacklistable { - using SafeMath for uint256; - - string public name; - string public symbol; - uint8 public decimals; - string public currency; - address public masterMinter; - bool internal initialized; - - /// @dev A mapping that stores the balance and blacklist states for a given address. - /// The first bit defines whether the address is blacklisted (1 if blacklisted, 0 otherwise). - /// The last 255 bits define the balance for the address. - mapping(address => uint256) internal balanceAndBlacklistStates; - mapping(address => mapping(address => uint256)) internal allowed; - uint256 internal totalSupply_ = 0; - mapping(address => bool) internal minters; - mapping(address => uint256) internal minterAllowed; - - event Mint(address indexed minter, address indexed to, uint256 amount); - event Burn(address indexed burner, uint256 amount); - event MinterConfigured(address indexed minter, uint256 minterAllowedAmount); - event MinterRemoved(address indexed oldMinter); - event MasterMinterChanged(address indexed newMasterMinter); - - /** - * @notice Initializes the fiat token contract. - * @param tokenName The name of the fiat token. - * @param tokenSymbol The symbol of the fiat token. - * @param tokenCurrency The fiat currency that the token represents. - * @param tokenDecimals The number of decimals that the token uses. - * @param newMasterMinter The masterMinter address for the fiat token. - * @param newPauser The pauser address for the fiat token. - * @param newBlacklister The blacklister address for the fiat token. - * @param newOwner The owner of the fiat token. - */ - function initialize( - string memory tokenName, - string memory tokenSymbol, - string memory tokenCurrency, - uint8 tokenDecimals, - address newMasterMinter, - address newPauser, - address newBlacklister, - address newOwner - ) public { - require(!initialized, "FiatToken: contract is already initialized"); - require(newMasterMinter != address(0), "FiatToken: new masterMinter is the zero address"); - require(newPauser != address(0), "FiatToken: new pauser is the zero address"); - require(newBlacklister != address(0), "FiatToken: new blacklister is the zero address"); - require(newOwner != address(0), "FiatToken: new owner is the zero address"); - - name = tokenName; - symbol = tokenSymbol; - currency = tokenCurrency; - decimals = tokenDecimals; - masterMinter = newMasterMinter; - pauser = newPauser; - blacklister = newBlacklister; - setOwner(newOwner); - initialized = true; - } - - /** - * @dev Throws if called by any account other than a minter. - */ - modifier onlyMinters() { - require(minters[msg.sender], "FiatToken: caller is not a minter"); - _; - } - - /** - * @notice Mints fiat tokens to an address. - * @param _to The address that will receive the minted tokens. - * @param _amount The amount of tokens to mint. Must be less than or equal - * to the minterAllowance of the caller. - * @return True if the operation was successful. - */ - function mint( - address _to, - uint256 _amount - ) external whenNotPaused onlyMinters notBlacklisted(msg.sender) notBlacklisted(_to) returns (bool) { - require(_to != address(0), "FiatToken: mint to the zero address"); - require(_amount > 0, "FiatToken: mint amount not greater than 0"); - - uint256 mintingAllowedAmount = minterAllowed[msg.sender]; - require(_amount <= mintingAllowedAmount, "FiatToken: mint amount exceeds minterAllowance"); - - totalSupply_ = totalSupply_.add(_amount); - _setBalance(_to, _balanceOf(_to).add(_amount)); - minterAllowed[msg.sender] = mintingAllowedAmount.sub(_amount); - emit Mint(msg.sender, _to, _amount); - emit Transfer(address(0), _to, _amount); - return true; - } - - /** - * @dev Throws if called by any account other than the masterMinter - */ - modifier onlyMasterMinter() { - require(msg.sender == masterMinter, "FiatToken: caller is not the masterMinter"); - _; - } - - /** - * @notice Gets the minter allowance for an account. - * @param minter The address to check. - * @return The remaining minter allowance for the account. - */ - function minterAllowance(address minter) external view returns (uint256) { - return minterAllowed[minter]; - } - - /** - * @notice Checks if an account is a minter. - * @param account The address to check. - * @return True if the account is a minter, false if the account is not a minter. - */ - function isMinter(address account) external view returns (bool) { - return minters[account]; - } - - /** - * @notice Gets the remaining amount of fiat tokens a spender is allowed to transfer on - * behalf of the token owner. - * @param owner The token owner's address. - * @param spender The spender's address. - * @return The remaining allowance. - */ - function allowance(address owner, address spender) external view override returns (uint256) { - return allowed[owner][spender]; - } - - /** - * @notice Gets the totalSupply of the fiat token. - * @return The totalSupply of the fiat token. - */ - function totalSupply() external view override returns (uint256) { - return totalSupply_; - } - - /** - * @notice Gets the fiat token balance of an account. - * @param account The address to check. - * @return balance The fiat token balance of the account. - */ - function balanceOf(address account) external view override returns (uint256) { - return _balanceOf(account); - } - - /** - * @notice Sets a fiat token allowance for a spender to spend on behalf of the caller. - * @param spender The spender's address. - * @param value The allowance amount. - * @return True if the operation was successful. - */ - function approve( - address spender, - uint256 value - ) external virtual override whenNotPaused notBlacklisted(msg.sender) notBlacklisted(spender) returns (bool) { - _approve(msg.sender, spender, value); - return true; - } - - /** - * @dev Internal function to set allowance. - * @param owner Token owner's address. - * @param spender Spender's address. - * @param value Allowance amount. - */ - function _approve(address owner, address spender, uint256 value) internal override { - require(owner != address(0), "ERC20: approve from the zero address"); - require(spender != address(0), "ERC20: approve to the zero address"); - allowed[owner][spender] = value; - emit Approval(owner, spender, value); - } - - /** - * @notice Transfers tokens from an address to another by spending the caller's allowance. - * @dev The caller must have some fiat token allowance on the payer's tokens. - * @param from Payer's address. - * @param to Payee's address. - * @param value Transfer amount. - * @return True if the operation was successful. - */ - function transferFrom( - address from, - address to, - uint256 value - ) - external - override - whenNotPaused - notBlacklisted(msg.sender) - notBlacklisted(from) - notBlacklisted(to) - returns (bool) - { - require(value <= allowed[from][msg.sender], "ERC20: transfer amount exceeds allowance"); - _transfer(from, to, value); - allowed[from][msg.sender] = allowed[from][msg.sender].sub(value); - return true; - } - - /** - * @notice Transfers tokens from the caller. - * @param to Payee's address. - * @param value Transfer amount. - * @return True if the operation was successful. - */ - function transfer( - address to, - uint256 value - ) external override whenNotPaused notBlacklisted(msg.sender) notBlacklisted(to) returns (bool) { - _transfer(msg.sender, to, value); - return true; - } - - /** - * @dev Internal function to process transfers. - * @param from Payer's address. - * @param to Payee's address. - * @param value Transfer amount. - */ - function _transfer(address from, address to, uint256 value) internal override { - require(from != address(0), "ERC20: transfer from the zero address"); - require(to != address(0), "ERC20: transfer to the zero address"); - require(value <= _balanceOf(from), "ERC20: transfer amount exceeds balance"); - - _setBalance(from, _balanceOf(from).sub(value)); - _setBalance(to, _balanceOf(to).add(value)); - emit Transfer(from, to, value); - } - - /** - * @notice Adds or updates a new minter with a mint allowance. - * @param minter The address of the minter. - * @param minterAllowedAmount The minting amount allowed for the minter. - * @return True if the operation was successful. - */ - function configureMinter( - address minter, - uint256 minterAllowedAmount - ) external whenNotPaused onlyMasterMinter returns (bool) { - minters[minter] = true; - minterAllowed[minter] = minterAllowedAmount; - emit MinterConfigured(minter, minterAllowedAmount); - return true; - } - - /** - * @notice Removes a minter. - * @param minter The address of the minter to remove. - * @return True if the operation was successful. - */ - function removeMinter(address minter) external onlyMasterMinter returns (bool) { - minters[minter] = false; - minterAllowed[minter] = 0; - emit MinterRemoved(minter); - return true; - } - - /** - * @notice Allows a minter to burn some of its own tokens. - * @dev The caller must be a minter, must not be blacklisted, and the amount to burn - * should be less than or equal to the account's balance. - * @param _amount the amount of tokens to be burned. - */ - function burn(uint256 _amount) external whenNotPaused onlyMinters notBlacklisted(msg.sender) { - uint256 balance = _balanceOf(msg.sender); - require(_amount > 0, "FiatToken: burn amount not greater than 0"); - require(balance >= _amount, "FiatToken: burn amount exceeds balance"); - - totalSupply_ = totalSupply_.sub(_amount); - _setBalance(msg.sender, balance.sub(_amount)); - emit Burn(msg.sender, _amount); - emit Transfer(msg.sender, address(0), _amount); - } - - /** - * @notice Updates the master minter address. - * @param _newMasterMinter The address of the new master minter. - */ - function updateMasterMinter(address _newMasterMinter) external onlyOwner { - require(_newMasterMinter != address(0), "FiatToken: new masterMinter is the zero address"); - masterMinter = _newMasterMinter; - emit MasterMinterChanged(masterMinter); - } - - /** - * - */ - function _blacklist(address _account) internal override { - _setBlacklistState(_account, true); - } - - /** - * - */ - function _unBlacklist(address _account) internal override { - _setBlacklistState(_account, false); - } - - /** - * @dev Helper method that sets the blacklist state of an account. - * @param _account The address of the account. - * @param _shouldBlacklist True if the account should be blacklisted, false if the account should be unblacklisted. - */ - function _setBlacklistState(address _account, bool _shouldBlacklist) internal virtual { - _deprecatedBlacklisted[_account] = _shouldBlacklist; - } - - /** - * @dev Helper method that sets the balance of an account. - * @param _account The address of the account. - * @param _balance The new fiat token balance of the account. - */ - function _setBalance(address _account, uint256 _balance) internal virtual { - balanceAndBlacklistStates[_account] = _balance; - } - - /** - * - */ - function _isBlacklisted(address _account) internal view virtual override returns (bool) { - return _deprecatedBlacklisted[_account]; - } - - /** - * @dev Helper method to obtain the balance of an account. - * @param _account The address of the account. - * @return The fiat token balance of the account. - */ - function _balanceOf(address _account) internal view virtual returns (uint256) { - return balanceAndBlacklistStates[_account]; - } -} diff --git a/contracts/contracts/libraries/token/IMorphERC1155Extension.sol b/contracts/contracts/libraries/token/IMorphERC1155Extension.sol index 43e3f804..03a8387e 100644 --- a/contracts/contracts/libraries/token/IMorphERC1155Extension.sol +++ b/contracts/contracts/libraries/token/IMorphERC1155Extension.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +pragma solidity =0.8.24; // Functions needed on top of the ERC1155 standard to be compliant with the Morph bridge interface IMorphERC1155Extension { diff --git a/contracts/contracts/libraries/token/IMorphERC20Extension.sol b/contracts/contracts/libraries/token/IMorphERC20Extension.sol index ee3be77e..b549be91 100644 --- a/contracts/contracts/libraries/token/IMorphERC20Extension.sol +++ b/contracts/contracts/libraries/token/IMorphERC20Extension.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +pragma solidity =0.8.24; // Functions needed on top of the ERC20 standard to be compliant with the Morph bridge interface IMorphERC20Extension { diff --git a/contracts/contracts/libraries/token/IMorphERC721Extension.sol b/contracts/contracts/libraries/token/IMorphERC721Extension.sol index 555048c1..20ce19c2 100644 --- a/contracts/contracts/libraries/token/IMorphERC721Extension.sol +++ b/contracts/contracts/libraries/token/IMorphERC721Extension.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +pragma solidity =0.8.24; // Functions needed on top of the ERC721 standard to be compliant with the Morph bridge interface IMorphERC721Extension { diff --git a/contracts/contracts/libraries/usdc/FiatTokenProxy.sol.flatten b/contracts/contracts/libraries/usdc/FiatTokenProxy.sol.flatten new file mode 100644 index 00000000..2f9e1112 --- /dev/null +++ b/contracts/contracts/libraries/usdc/FiatTokenProxy.sol.flatten @@ -0,0 +1,576 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity <0.8.0 =0.6.12 >=0.6.2; + +// contracts/upgradeability/Proxy.sol +/** + * Copyright 2023 Circle Internet Group, Inc. All rights reserved. + * + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @notice Implements delegation of calls to other contracts, with proper + * forwarding of return values and bubbling of failures. + * It defines a fallback function that delegates all calls to the address + * returned by the abstract _implementation() internal function. + * @dev Forked from https://github.com/zeppelinos/zos-lib/blob/8a16ef3ad17ec7430e3a9d2b5e3f39b8204f8c8d/contracts/upgradeability/Proxy.sol + * Modifications: + * 1. Reformat and conform to Solidity 0.6 syntax (5/13/20) + */ +abstract contract Proxy { + /** + * @dev Fallback function. + * Implemented entirely in `_fallback`. + */ + fallback() external payable { + _fallback(); + } + + /** + * @return The Address of the implementation. + */ + function _implementation() internal virtual view returns (address); + + /** + * @dev Delegates execution to an implementation contract. + * This is a low level function that doesn't return to its internal call site. + * It will return to the external caller whatever the implementation returns. + * @param implementation Address to delegate. + */ + function _delegate(address implementation) internal { + assembly { + // Copy msg.data. We take full control of memory in this inline assembly + // block because it will not return to Solidity code. We overwrite the + // Solidity scratch pad at memory position 0. + calldatacopy(0, 0, calldatasize()) + + // Call the implementation. + // out and outsize are 0 because we don't know the size yet. + let result := delegatecall( + gas(), + implementation, + 0, + calldatasize(), + 0, + 0 + ) + + // Copy the returned data. + returndatacopy(0, 0, returndatasize()) + + switch result + // delegatecall returns 0 on error. + case 0 { + revert(0, returndatasize()) + } + default { + return(0, returndatasize()) + } + } + } + + /** + * @dev Function that is run as the first thing in the fallback function. + * Can be redefined in derived contracts to add functionality. + * Redefinitions must call super._willFallback(). + */ + function _willFallback() internal virtual {} + + /** + * @dev fallback implementation. + * Extracted to enable manual triggering. + */ + function _fallback() internal { + _willFallback(); + _delegate(_implementation()); + } +} + +// node_modules/@openzeppelin/contracts/utils/Address.sol + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + // solhint-disable-next-line no-inline-assembly + assembly { size := extcodesize(account) } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, "Address: insufficient balance"); + + // solhint-disable-next-line avoid-low-level-calls, avoid-call-value + (bool success, ) = recipient.call{ value: amount }(""); + require(success, "Address: unable to send value, recipient may have reverted"); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain`call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, "Address: low-level call failed"); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { + require(address(this).balance >= value, "Address: insufficient balance for call"); + require(isContract(target), "Address: call to non-contract"); + + // solhint-disable-next-line avoid-low-level-calls + (bool success, bytes memory returndata) = target.call{ value: value }(data); + return _verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { + return functionStaticCall(target, data, "Address: low-level static call failed"); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { + require(isContract(target), "Address: static call to non-contract"); + + // solhint-disable-next-line avoid-low-level-calls + (bool success, bytes memory returndata) = target.staticcall(data); + return _verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, "Address: low-level delegate call failed"); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { + require(isContract(target), "Address: delegate call to non-contract"); + + // solhint-disable-next-line avoid-low-level-calls + (bool success, bytes memory returndata) = target.delegatecall(data); + return _verifyCallResult(success, returndata, errorMessage); + } + + function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + // solhint-disable-next-line no-inline-assembly + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} + +// contracts/upgradeability/UpgradeabilityProxy.sol +/** + * Copyright 2023 Circle Internet Group, Inc. All rights reserved. + * + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @notice This contract implements a proxy that allows to change the + * implementation address to which it will delegate. + * Such a change is called an implementation upgrade. + * @dev Forked from https://github.com/zeppelinos/zos-lib/blob/8a16ef3ad17ec7430e3a9d2b5e3f39b8204f8c8d/contracts/upgradeability/UpgradeabilityProxy.sol + * Modifications: + * 1. Reformat, conform to Solidity 0.6 syntax, and add error messages (5/13/20) + * 2. Use Address utility library from the latest OpenZeppelin (5/13/20) + */ +contract UpgradeabilityProxy is Proxy { + /** + * @dev Emitted when the implementation is upgraded. + * @param implementation Address of the new implementation. + */ + event Upgraded(address implementation); + + /** + * @dev Storage slot with the address of the current implementation. + * This is the keccak-256 hash of "org.zeppelinos.proxy.implementation", and is + * validated in the constructor. + */ + bytes32 + private constant IMPLEMENTATION_SLOT = 0x7050c9e0f4ca769c69bd3a8ef740bc37934f8e2c036e5a723fd8ee048ed3f8c3; + + /** + * @dev Contract constructor. + * @param implementationContract Address of the initial implementation. + */ + constructor(address implementationContract) public { + assert( + IMPLEMENTATION_SLOT == + keccak256("org.zeppelinos.proxy.implementation") + ); + + _setImplementation(implementationContract); + } + + /** + * @dev Returns the current implementation. + * @return impl Address of the current implementation + */ + function _implementation() internal override view returns (address impl) { + bytes32 slot = IMPLEMENTATION_SLOT; + assembly { + impl := sload(slot) + } + } + + /** + * @dev Upgrades the proxy to a new implementation. + * @param newImplementation Address of the new implementation. + */ + function _upgradeTo(address newImplementation) internal { + _setImplementation(newImplementation); + emit Upgraded(newImplementation); + } + + /** + * @dev Sets the implementation address of the proxy. + * @param newImplementation Address of the new implementation. + */ + function _setImplementation(address newImplementation) private { + require( + Address.isContract(newImplementation), + "Cannot set a proxy implementation to a non-contract address" + ); + + bytes32 slot = IMPLEMENTATION_SLOT; + + assembly { + sstore(slot, newImplementation) + } + } +} + +// contracts/upgradeability/AdminUpgradeabilityProxy.sol +/** + * Copyright 2023 Circle Internet Group, Inc. All rights reserved. + * + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @notice This contract combines an upgradeability proxy with an authorization + * mechanism for administrative tasks. + * @dev Forked from https://github.com/zeppelinos/zos-lib/blob/8a16ef3ad17ec7430e3a9d2b5e3f39b8204f8c8d/contracts/upgradeability/AdminUpgradeabilityProxy.sol + * Modifications: + * 1. Reformat, conform to Solidity 0.6 syntax, and add error messages (5/13/20) + * 2. Remove ifAdmin modifier from admin() and implementation() (5/13/20) + */ +contract AdminUpgradeabilityProxy is UpgradeabilityProxy { + /** + * @dev Emitted when the administration has been transferred. + * @param previousAdmin Address of the previous admin. + * @param newAdmin Address of the new admin. + */ + event AdminChanged(address previousAdmin, address newAdmin); + + /** + * @dev Storage slot with the admin of the contract. + * This is the keccak-256 hash of "org.zeppelinos.proxy.admin", and is + * validated in the constructor. + */ + bytes32 + private constant ADMIN_SLOT = 0x10d6a54a4754c8869d6886b5f5d7fbfa5b4522237ea5c60d11bc4e7a1ff9390b; + + /** + * @dev Modifier to check whether the `msg.sender` is the admin. + * If it is, it will run the function. Otherwise, it will delegate the call + * to the implementation. + */ + modifier ifAdmin() { + if (msg.sender == _admin()) { + _; + } else { + _fallback(); + } + } + + /** + * @dev Contract constructor. + * It sets the `msg.sender` as the proxy administrator. + * @param implementationContract address of the initial implementation. + */ + constructor(address implementationContract) + public + UpgradeabilityProxy(implementationContract) + { + assert(ADMIN_SLOT == keccak256("org.zeppelinos.proxy.admin")); + + _setAdmin(msg.sender); + } + + /** + * @return The address of the proxy admin. + */ + function admin() external view returns (address) { + return _admin(); + } + + /** + * @return The address of the implementation. + */ + function implementation() external view returns (address) { + return _implementation(); + } + + /** + * @dev Changes the admin of the proxy. + * Only the current admin can call this function. + * @param newAdmin Address to transfer proxy administration to. + */ + function changeAdmin(address newAdmin) external ifAdmin { + require( + newAdmin != address(0), + "Cannot change the admin of a proxy to the zero address" + ); + emit AdminChanged(_admin(), newAdmin); + _setAdmin(newAdmin); + } + + /** + * @dev Upgrade the backing implementation of the proxy. + * Only the admin can call this function. + * @param newImplementation Address of the new implementation. + */ + function upgradeTo(address newImplementation) external ifAdmin { + _upgradeTo(newImplementation); + } + + /** + * @dev Upgrade the backing implementation of the proxy and call a function + * on the new implementation. + * This is useful to initialize the proxied contract. + * @param newImplementation Address of the new implementation. + * @param data Data to send as msg.data in the low level call. + * It should include the signature and the parameters of the function to be + * called, as described in + * https://solidity.readthedocs.io/en/develop/abi-spec.html#function-selector-and-argument-encoding. + */ + function upgradeToAndCall(address newImplementation, bytes calldata data) + external + payable + ifAdmin + { + _upgradeTo(newImplementation); + // prettier-ignore + // solhint-disable-next-line avoid-low-level-calls + (bool success,) = address(this).call{value: msg.value}(data); + // solhint-disable-next-line reason-string + require(success); + } + + /** + * @return adm The admin slot. + */ + function _admin() internal view returns (address adm) { + bytes32 slot = ADMIN_SLOT; + + assembly { + adm := sload(slot) + } + } + + /** + * @dev Sets the address of the proxy admin. + * @param newAdmin Address of the new proxy admin. + */ + function _setAdmin(address newAdmin) internal { + bytes32 slot = ADMIN_SLOT; + + assembly { + sstore(slot, newAdmin) + } + } + + /** + * @dev Only fall back when the sender is not the admin. + */ + function _willFallback() internal override { + require( + msg.sender != _admin(), + "Cannot call fallback function from the proxy admin" + ); + super._willFallback(); + } +} + +// contracts/v1/FiatTokenProxy.sol +/** + * Copyright 2023 Circle Internet Group, Inc. All rights reserved. + * + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @title FiatTokenProxy + * @dev This contract proxies FiatToken calls and enables FiatToken upgrades + */ +contract FiatTokenProxy is AdminUpgradeabilityProxy { + constructor(address implementationContract) + public + AdminUpgradeabilityProxy(implementationContract) + {} +} diff --git a/contracts/contracts/libraries/usdc/FiatTokenV2_2.sol.flatten b/contracts/contracts/libraries/usdc/FiatTokenV2_2.sol.flatten new file mode 100644 index 00000000..9f8d3d41 --- /dev/null +++ b/contracts/contracts/libraries/usdc/FiatTokenV2_2.sol.flatten @@ -0,0 +1,2876 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity <0.8.0 =0.6.12 >=0.6.0 >=0.6.2; + +// contracts/interface/IERC1271.sol +/** + * Copyright 2023 Circle Internet Group, Inc. All rights reserved. + * + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @dev Interface of the ERC1271 standard signature validation method for + * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271]. + */ +interface IERC1271 { + /** + * @dev Should return whether the signature provided is valid for the provided data + * @param hash Hash of the data to be signed + * @param signature Signature byte array associated with the provided data hash + * @return magicValue bytes4 magic value 0x1626ba7e when function passes + */ + function isValidSignature(bytes32 hash, bytes memory signature) + external + view + returns (bytes4 magicValue); +} + +// contracts/util/ECRecover.sol +/** + * Copyright 2023 Circle Internet Group, Inc. All rights reserved. + * + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @title ECRecover + * @notice A library that provides a safe ECDSA recovery function + */ +library ECRecover { + /** + * @notice Recover signer's address from a signed message + * @dev Adapted from: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/65e4ffde586ec89af3b7e9140bdc9235d1254853/contracts/cryptography/ECDSA.sol + * Modifications: Accept v, r, and s as separate arguments + * @param digest Keccak-256 hash digest of the signed message + * @param v v of the signature + * @param r r of the signature + * @param s s of the signature + * @return Signer address + */ + function recover( + bytes32 digest, + uint8 v, + bytes32 r, + bytes32 s + ) internal pure returns (address) { + // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature + // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines + // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most + // signatures from current libraries generate a unique signature with an s-value in the lower half order. + // + // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value + // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or + // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept + // these malleable signatures as well. + if ( + uint256(s) > + 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 + ) { + revert("ECRecover: invalid signature 's' value"); + } + + if (v != 27 && v != 28) { + revert("ECRecover: invalid signature 'v' value"); + } + + // If the signature is valid (and not malleable), return the signer address + address signer = ecrecover(digest, v, r, s); + require(signer != address(0), "ECRecover: invalid signature"); + + return signer; + } + + /** + * @notice Recover signer's address from a signed message + * @dev Adapted from: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/0053ee040a7ff1dbc39691c9e67a69f564930a88/contracts/utils/cryptography/ECDSA.sol + * @param digest Keccak-256 hash digest of the signed message + * @param signature Signature byte array associated with hash + * @return Signer address + */ + function recover(bytes32 digest, bytes memory signature) + internal + pure + returns (address) + { + require(signature.length == 65, "ECRecover: invalid signature length"); + + bytes32 r; + bytes32 s; + uint8 v; + + // ecrecover takes the signature parameters, and the only way to get them + // currently is to use assembly. + /// @solidity memory-safe-assembly + assembly { + r := mload(add(signature, 0x20)) + s := mload(add(signature, 0x40)) + v := byte(0, mload(add(signature, 0x60))) + } + return recover(digest, v, r, s); + } +} + +// contracts/util/EIP712.sol +/** + * Copyright 2023 Circle Internet Group, Inc. All rights reserved. + * + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @title EIP712 + * @notice A library that provides EIP712 helper functions + */ +library EIP712 { + /** + * @notice Make EIP712 domain separator + * @param name Contract name + * @param version Contract version + * @param chainId Blockchain ID + * @return Domain separator + */ + function makeDomainSeparator( + string memory name, + string memory version, + uint256 chainId + ) internal view returns (bytes32) { + return + keccak256( + abi.encode( + // keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)") + 0x8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f, + keccak256(bytes(name)), + keccak256(bytes(version)), + chainId, + address(this) + ) + ); + } + + /** + * @notice Make EIP712 domain separator + * @param name Contract name + * @param version Contract version + * @return Domain separator + */ + function makeDomainSeparator(string memory name, string memory version) + internal + view + returns (bytes32) + { + uint256 chainId; + assembly { + chainId := chainid() + } + return makeDomainSeparator(name, version, chainId); + } +} + +// contracts/util/MessageHashUtils.sol +/** + * Copyright 2023 Circle Internet Group, Inc. All rights reserved. + * + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @dev Signature message hash utilities for producing digests to be consumed by {ECDSA} recovery or signing. + * + * The library provides methods for generating a hash of a message that conforms to the + * https://eips.ethereum.org/EIPS/eip-191[EIP 191] and https://eips.ethereum.org/EIPS/eip-712[EIP 712] + * specifications. + */ +library MessageHashUtils { + /** + * @dev Returns the keccak256 digest of an EIP-712 typed data (EIP-191 version `0x01`). + * Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/21bb89ef5bfc789b9333eb05e3ba2b7b284ac77c/contracts/utils/cryptography/MessageHashUtils.sol + * + * The digest is calculated from a `domainSeparator` and a `structHash`, by prefixing them with + * `\x19\x01` and hashing the result. It corresponds to the hash signed by the + * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`] JSON-RPC method as part of EIP-712. + * + * @param domainSeparator Domain separator + * @param structHash Hashed EIP-712 data struct + * @return digest The keccak256 digest of an EIP-712 typed data + */ + function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) + internal + pure + returns (bytes32 digest) + { + assembly { + let ptr := mload(0x40) + mstore(ptr, "\x19\x01") + mstore(add(ptr, 0x02), domainSeparator) + mstore(add(ptr, 0x22), structHash) + digest := keccak256(ptr, 0x42) + } + } +} + +// contracts/v1/Ownable.sol +/** + + * + * Copyright (c) 2018 zOS Global Limited. + * Copyright (c) 2018-2020 CENTRE SECZ + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/** + * @notice The Ownable contract has an owner address, and provides basic + * authorization control functions + * @dev Forked from https://github.com/OpenZeppelin/openzeppelin-labs/blob/3887ab77b8adafba4a26ace002f3a684c1a3388b/upgradeability_ownership/contracts/ownership/Ownable.sol + * Modifications: + * 1. Consolidate OwnableStorage into this contract (7/13/18) + * 2. Reformat, conform to Solidity 0.6 syntax, and add error messages (5/13/20) + * 3. Make public functions external (5/27/20) + */ +contract Ownable { + // Owner of the contract + address private _owner; + + /** + * @dev Event to show ownership has been transferred + * @param previousOwner representing the address of the previous owner + * @param newOwner representing the address of the new owner + */ + event OwnershipTransferred(address previousOwner, address newOwner); + + /** + * @dev The constructor sets the original owner of the contract to the sender account. + */ + constructor() public { + setOwner(msg.sender); + } + + /** + * @dev Tells the address of the owner + * @return the address of the owner + */ + function owner() external view returns (address) { + return _owner; + } + + /** + * @dev Sets a new owner address + */ + function setOwner(address newOwner) internal { + _owner = newOwner; + } + + /** + * @dev Throws if called by any account other than the owner. + */ + modifier onlyOwner() { + require(msg.sender == _owner, "Ownable: caller is not the owner"); + _; + } + + /** + * @dev Allows the current owner to transfer control of the contract to a newOwner. + * @param newOwner The address to transfer ownership to. + */ + function transferOwnership(address newOwner) external onlyOwner { + require( + newOwner != address(0), + "Ownable: new owner is the zero address" + ); + emit OwnershipTransferred(_owner, newOwner); + setOwner(newOwner); + } +} + +// contracts/v2/EIP712Domain.sol +/** + * Copyright 2023 Circle Internet Group, Inc. All rights reserved. + * + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// solhint-disable func-name-mixedcase + +/** + * @title EIP712 Domain + */ +contract EIP712Domain { + // was originally DOMAIN_SEPARATOR + // but that has been moved to a method so we can override it in V2_2+ + bytes32 internal _DEPRECATED_CACHED_DOMAIN_SEPARATOR; + + /** + * @notice Get the EIP712 Domain Separator. + * @return The bytes32 EIP712 domain separator. + */ + function DOMAIN_SEPARATOR() external view returns (bytes32) { + return _domainSeparator(); + } + + /** + * @dev Internal method to get the EIP712 Domain Separator. + * @return The bytes32 EIP712 domain separator. + */ + function _domainSeparator() internal virtual view returns (bytes32) { + return _DEPRECATED_CACHED_DOMAIN_SEPARATOR; + } +} + +// node_modules/@openzeppelin/contracts/math/SafeMath.sol + +/** + * @dev Wrappers over Solidity's arithmetic operations with added overflow + * checks. + * + * Arithmetic operations in Solidity wrap on overflow. This can easily result + * in bugs, because programmers usually assume that an overflow raises an + * error, which is the standard behavior in high level programming languages. + * `SafeMath` restores this intuition by reverting the transaction when an + * operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + */ +library SafeMath { + /** + * @dev Returns the addition of two unsigned integers, with an overflow flag. + * + * _Available since v3.4._ + */ + function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { + uint256 c = a + b; + if (c < a) return (false, 0); + return (true, c); + } + + /** + * @dev Returns the substraction of two unsigned integers, with an overflow flag. + * + * _Available since v3.4._ + */ + function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { + if (b > a) return (false, 0); + return (true, a - b); + } + + /** + * @dev Returns the multiplication of two unsigned integers, with an overflow flag. + * + * _Available since v3.4._ + */ + function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { + // Gas optimization: this is cheaper than requiring 'a' not being zero, but the + // benefit is lost if 'b' is also tested. + // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 + if (a == 0) return (true, 0); + uint256 c = a * b; + if (c / a != b) return (false, 0); + return (true, c); + } + + /** + * @dev Returns the division of two unsigned integers, with a division by zero flag. + * + * _Available since v3.4._ + */ + function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { + if (b == 0) return (false, 0); + return (true, a / b); + } + + /** + * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. + * + * _Available since v3.4._ + */ + function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { + if (b == 0) return (false, 0); + return (true, a % b); + } + + /** + * @dev Returns the addition of two unsigned integers, reverting on + * overflow. + * + * Counterpart to Solidity's `+` operator. + * + * Requirements: + * + * - Addition cannot overflow. + */ + function add(uint256 a, uint256 b) internal pure returns (uint256) { + uint256 c = a + b; + require(c >= a, "SafeMath: addition overflow"); + return c; + } + + /** + * @dev Returns the subtraction of two unsigned integers, reverting on + * overflow (when the result is negative). + * + * Counterpart to Solidity's `-` operator. + * + * Requirements: + * + * - Subtraction cannot overflow. + */ + function sub(uint256 a, uint256 b) internal pure returns (uint256) { + require(b <= a, "SafeMath: subtraction overflow"); + return a - b; + } + + /** + * @dev Returns the multiplication of two unsigned integers, reverting on + * overflow. + * + * Counterpart to Solidity's `*` operator. + * + * Requirements: + * + * - Multiplication cannot overflow. + */ + function mul(uint256 a, uint256 b) internal pure returns (uint256) { + if (a == 0) return 0; + uint256 c = a * b; + require(c / a == b, "SafeMath: multiplication overflow"); + return c; + } + + /** + * @dev Returns the integer division of two unsigned integers, reverting on + * division by zero. The result is rounded towards zero. + * + * Counterpart to Solidity's `/` operator. Note: this function uses a + * `revert` opcode (which leaves remaining gas untouched) while Solidity + * uses an invalid opcode to revert (consuming all remaining gas). + * + * Requirements: + * + * - The divisor cannot be zero. + */ + function div(uint256 a, uint256 b) internal pure returns (uint256) { + require(b > 0, "SafeMath: division by zero"); + return a / b; + } + + /** + * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), + * reverting when dividing by zero. + * + * Counterpart to Solidity's `%` operator. This function uses a `revert` + * opcode (which leaves remaining gas untouched) while Solidity uses an + * invalid opcode to revert (consuming all remaining gas). + * + * Requirements: + * + * - The divisor cannot be zero. + */ + function mod(uint256 a, uint256 b) internal pure returns (uint256) { + require(b > 0, "SafeMath: modulo by zero"); + return a % b; + } + + /** + * @dev Returns the subtraction of two unsigned integers, reverting with custom message on + * overflow (when the result is negative). + * + * CAUTION: This function is deprecated because it requires allocating memory for the error + * message unnecessarily. For custom revert reasons use {trySub}. + * + * Counterpart to Solidity's `-` operator. + * + * Requirements: + * + * - Subtraction cannot overflow. + */ + function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { + require(b <= a, errorMessage); + return a - b; + } + + /** + * @dev Returns the integer division of two unsigned integers, reverting with custom message on + * division by zero. The result is rounded towards zero. + * + * CAUTION: This function is deprecated because it requires allocating memory for the error + * message unnecessarily. For custom revert reasons use {tryDiv}. + * + * Counterpart to Solidity's `/` operator. Note: this function uses a + * `revert` opcode (which leaves remaining gas untouched) while Solidity + * uses an invalid opcode to revert (consuming all remaining gas). + * + * Requirements: + * + * - The divisor cannot be zero. + */ + function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { + require(b > 0, errorMessage); + return a / b; + } + + /** + * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), + * reverting with custom message when dividing by zero. + * + * CAUTION: This function is deprecated because it requires allocating memory for the error + * message unnecessarily. For custom revert reasons use {tryMod}. + * + * Counterpart to Solidity's `%` operator. This function uses a `revert` + * opcode (which leaves remaining gas untouched) while Solidity uses an + * invalid opcode to revert (consuming all remaining gas). + * + * Requirements: + * + * - The divisor cannot be zero. + */ + function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { + require(b > 0, errorMessage); + return a % b; + } +} + +// node_modules/@openzeppelin/contracts/token/ERC20/IERC20.sol + +/** + * @dev Interface of the ERC20 standard as defined in the EIP. + */ +interface IERC20 { + /** + * @dev Returns the amount of tokens in existence. + */ + function totalSupply() external view returns (uint256); + + /** + * @dev Returns the amount of tokens owned by `account`. + */ + function balanceOf(address account) external view returns (uint256); + + /** + * @dev Moves `amount` tokens from the caller's account to `recipient`. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transfer(address recipient, uint256 amount) external returns (bool); + + /** + * @dev Returns the remaining number of tokens that `spender` will be + * allowed to spend on behalf of `owner` through {transferFrom}. This is + * zero by default. + * + * This value changes when {approve} or {transferFrom} are called. + */ + function allowance(address owner, address spender) external view returns (uint256); + + /** + * @dev Sets `amount` as the allowance of `spender` over the caller's tokens. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * IMPORTANT: Beware that changing an allowance with this method brings the risk + * that someone may use both the old and the new allowance by unfortunate + * transaction ordering. One possible solution to mitigate this race + * condition is to first reduce the spender's allowance to 0 and set the + * desired value afterwards: + * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729 + * + * Emits an {Approval} event. + */ + function approve(address spender, uint256 amount) external returns (bool); + + /** + * @dev Moves `amount` tokens from `sender` to `recipient` using the + * allowance mechanism. `amount` is then deducted from the caller's + * allowance. + * + * Returns a boolean value indicating whether the operation succeeded. + * + * Emits a {Transfer} event. + */ + function transferFrom(address sender, address recipient, uint256 amount) external returns (bool); + + /** + * @dev Emitted when `value` tokens are moved from one account (`from`) to + * another (`to`). + * + * Note that `value` may be zero. + */ + event Transfer(address indexed from, address indexed to, uint256 value); + + /** + * @dev Emitted when the allowance of a `spender` for an `owner` is set by + * a call to {approve}. `value` is the new allowance. + */ + event Approval(address indexed owner, address indexed spender, uint256 value); +} + +// node_modules/@openzeppelin/contracts/utils/Address.sol + +/** + * @dev Collection of functions related to the address type + */ +library Address { + /** + * @dev Returns true if `account` is a contract. + * + * [IMPORTANT] + * ==== + * It is unsafe to assume that an address for which this function returns + * false is an externally-owned account (EOA) and not a contract. + * + * Among others, `isContract` will return false for the following + * types of addresses: + * + * - an externally-owned account + * - a contract in construction + * - an address where a contract will be created + * - an address where a contract lived, but was destroyed + * ==== + */ + function isContract(address account) internal view returns (bool) { + // This method relies on extcodesize, which returns 0 for contracts in + // construction, since the code is only stored at the end of the + // constructor execution. + + uint256 size; + // solhint-disable-next-line no-inline-assembly + assembly { size := extcodesize(account) } + return size > 0; + } + + /** + * @dev Replacement for Solidity's `transfer`: sends `amount` wei to + * `recipient`, forwarding all available gas and reverting on errors. + * + * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost + * of certain opcodes, possibly making contracts go over the 2300 gas limit + * imposed by `transfer`, making them unable to receive funds via + * `transfer`. {sendValue} removes this limitation. + * + * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. + * + * IMPORTANT: because control is transferred to `recipient`, care must be + * taken to not create reentrancy vulnerabilities. Consider using + * {ReentrancyGuard} or the + * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. + */ + function sendValue(address payable recipient, uint256 amount) internal { + require(address(this).balance >= amount, "Address: insufficient balance"); + + // solhint-disable-next-line avoid-low-level-calls, avoid-call-value + (bool success, ) = recipient.call{ value: amount }(""); + require(success, "Address: unable to send value, recipient may have reverted"); + } + + /** + * @dev Performs a Solidity function call using a low level `call`. A + * plain`call` is an unsafe replacement for a function call: use this + * function instead. + * + * If `target` reverts with a revert reason, it is bubbled up by this + * function (like regular Solidity function calls). + * + * Returns the raw returned data. To convert to the expected return value, + * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. + * + * Requirements: + * + * - `target` must be a contract. + * - calling `target` with `data` must not revert. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data) internal returns (bytes memory) { + return functionCall(target, data, "Address: low-level call failed"); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with + * `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { + return functionCallWithValue(target, data, 0, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but also transferring `value` wei to `target`. + * + * Requirements: + * + * - the calling contract must have an ETH balance of at least `value`. + * - the called Solidity function must be `payable`. + * + * _Available since v3.1._ + */ + function functionCallWithValue(address target, bytes memory data, uint256 value) internal returns (bytes memory) { + return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); + } + + /** + * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but + * with `errorMessage` as a fallback revert reason when `target` reverts. + * + * _Available since v3.1._ + */ + function functionCallWithValue(address target, bytes memory data, uint256 value, string memory errorMessage) internal returns (bytes memory) { + require(address(this).balance >= value, "Address: insufficient balance for call"); + require(isContract(target), "Address: call to non-contract"); + + // solhint-disable-next-line avoid-low-level-calls + (bool success, bytes memory returndata) = target.call{ value: value }(data); + return _verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { + return functionStaticCall(target, data, "Address: low-level static call failed"); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a static call. + * + * _Available since v3.3._ + */ + function functionStaticCall(address target, bytes memory data, string memory errorMessage) internal view returns (bytes memory) { + require(isContract(target), "Address: static call to non-contract"); + + // solhint-disable-next-line avoid-low-level-calls + (bool success, bytes memory returndata) = target.staticcall(data); + return _verifyCallResult(success, returndata, errorMessage); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { + return functionDelegateCall(target, data, "Address: low-level delegate call failed"); + } + + /** + * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], + * but performing a delegate call. + * + * _Available since v3.4._ + */ + function functionDelegateCall(address target, bytes memory data, string memory errorMessage) internal returns (bytes memory) { + require(isContract(target), "Address: delegate call to non-contract"); + + // solhint-disable-next-line avoid-low-level-calls + (bool success, bytes memory returndata) = target.delegatecall(data); + return _verifyCallResult(success, returndata, errorMessage); + } + + function _verifyCallResult(bool success, bytes memory returndata, string memory errorMessage) private pure returns(bytes memory) { + if (success) { + return returndata; + } else { + // Look for revert reason and bubble it up if present + if (returndata.length > 0) { + // The easiest way to bubble the revert reason is using memory via assembly + + // solhint-disable-next-line no-inline-assembly + assembly { + let returndata_size := mload(returndata) + revert(add(32, returndata), returndata_size) + } + } else { + revert(errorMessage); + } + } + } +} + +// contracts/v1/AbstractFiatTokenV1.sol +/** + * Copyright 2023 Circle Internet Group, Inc. All rights reserved. + * + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +abstract contract AbstractFiatTokenV1 is IERC20 { + function _approve( + address owner, + address spender, + uint256 value + ) internal virtual; + + function _transfer( + address from, + address to, + uint256 value + ) internal virtual; +} + +// contracts/v1/Blacklistable.sol +/** + * Copyright 2023 Circle Internet Group, Inc. All rights reserved. + * + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @title Blacklistable Token + * @dev Allows accounts to be blacklisted by a "blacklister" role + */ +abstract contract Blacklistable is Ownable { + address public blacklister; + mapping(address => bool) internal _deprecatedBlacklisted; + + event Blacklisted(address indexed _account); + event UnBlacklisted(address indexed _account); + event BlacklisterChanged(address indexed newBlacklister); + + /** + * @dev Throws if called by any account other than the blacklister. + */ + modifier onlyBlacklister() { + require( + msg.sender == blacklister, + "Blacklistable: caller is not the blacklister" + ); + _; + } + + /** + * @dev Throws if argument account is blacklisted. + * @param _account The address to check. + */ + modifier notBlacklisted(address _account) { + require( + !_isBlacklisted(_account), + "Blacklistable: account is blacklisted" + ); + _; + } + + /** + * @notice Checks if account is blacklisted. + * @param _account The address to check. + * @return True if the account is blacklisted, false if the account is not blacklisted. + */ + function isBlacklisted(address _account) external view returns (bool) { + return _isBlacklisted(_account); + } + + /** + * @notice Adds account to blacklist. + * @param _account The address to blacklist. + */ + function blacklist(address _account) external onlyBlacklister { + _blacklist(_account); + emit Blacklisted(_account); + } + + /** + * @notice Removes account from blacklist. + * @param _account The address to remove from the blacklist. + */ + function unBlacklist(address _account) external onlyBlacklister { + _unBlacklist(_account); + emit UnBlacklisted(_account); + } + + /** + * @notice Updates the blacklister address. + * @param _newBlacklister The address of the new blacklister. + */ + function updateBlacklister(address _newBlacklister) external onlyOwner { + require( + _newBlacklister != address(0), + "Blacklistable: new blacklister is the zero address" + ); + blacklister = _newBlacklister; + emit BlacklisterChanged(blacklister); + } + + /** + * @dev Checks if account is blacklisted. + * @param _account The address to check. + * @return true if the account is blacklisted, false otherwise. + */ + function _isBlacklisted(address _account) + internal + virtual + view + returns (bool); + + /** + * @dev Helper method that blacklists an account. + * @param _account The address to blacklist. + */ + function _blacklist(address _account) internal virtual; + + /** + * @dev Helper method that unblacklists an account. + * @param _account The address to unblacklist. + */ + function _unBlacklist(address _account) internal virtual; +} + +// contracts/v1/Pausable.sol +/** + + * + * Copyright (c) 2016 Smart Contract Solutions, Inc. + * Copyright (c) 2018-2020 CENTRE SECZ + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/** + * @notice Base contract which allows children to implement an emergency stop + * mechanism + * @dev Forked from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/feb665136c0dae9912e08397c1a21c4af3651ef3/contracts/lifecycle/Pausable.sol + * Modifications: + * 1. Added pauser role, switched pause/unpause to be onlyPauser (6/14/2018) + * 2. Removed whenNotPause/whenPaused from pause/unpause (6/14/2018) + * 3. Removed whenPaused (6/14/2018) + * 4. Switches ownable library to use ZeppelinOS (7/12/18) + * 5. Remove constructor (7/13/18) + * 6. Reformat, conform to Solidity 0.6 syntax and add error messages (5/13/20) + * 7. Make public functions external (5/27/20) + */ +contract Pausable is Ownable { + event Pause(); + event Unpause(); + event PauserChanged(address indexed newAddress); + + address public pauser; + bool public paused = false; + + /** + * @dev Modifier to make a function callable only when the contract is not paused. + */ + modifier whenNotPaused() { + require(!paused, "Pausable: paused"); + _; + } + + /** + * @dev throws if called by any account other than the pauser + */ + modifier onlyPauser() { + require(msg.sender == pauser, "Pausable: caller is not the pauser"); + _; + } + + /** + * @dev called by the owner to pause, triggers stopped state + */ + function pause() external onlyPauser { + paused = true; + emit Pause(); + } + + /** + * @dev called by the owner to unpause, returns to normal state + */ + function unpause() external onlyPauser { + paused = false; + emit Unpause(); + } + + /** + * @notice Updates the pauser address. + * @param _newPauser The address of the new pauser. + */ + function updatePauser(address _newPauser) external onlyOwner { + require( + _newPauser != address(0), + "Pausable: new pauser is the zero address" + ); + pauser = _newPauser; + emit PauserChanged(pauser); + } +} + +// contracts/util/SignatureChecker.sol +/** + * Copyright 2023 Circle Internet Group, Inc. All rights reserved. + * + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @dev Signature verification helper that can be used instead of `ECRecover.recover` to seamlessly support both ECDSA + * signatures from externally owned accounts (EOAs) as well as ERC1271 signatures from smart contract wallets. + * + * Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/21bb89ef5bfc789b9333eb05e3ba2b7b284ac77c/contracts/utils/cryptography/SignatureChecker.sol + */ +library SignatureChecker { + /** + * @dev Checks if a signature is valid for a given signer and data hash. If the signer is a smart contract, the + * signature is validated against that smart contract using ERC1271, otherwise it's validated using `ECRecover.recover`. + * @param signer Address of the claimed signer + * @param digest Keccak-256 hash digest of the signed message + * @param signature Signature byte array associated with hash + */ + function isValidSignatureNow( + address signer, + bytes32 digest, + bytes memory signature + ) external view returns (bool) { + if (!isContract(signer)) { + return ECRecover.recover(digest, signature) == signer; + } + return isValidERC1271SignatureNow(signer, digest, signature); + } + + /** + * @dev Checks if a signature is valid for a given signer and data hash. The signature is validated + * against the signer smart contract using ERC1271. + * @param signer Address of the claimed signer + * @param digest Keccak-256 hash digest of the signed message + * @param signature Signature byte array associated with hash + * + * NOTE: Unlike ECDSA signatures, contract signatures are revocable, and the outcome of this function can thus + * change through time. It could return true at block N and false at block N+1 (or the opposite). + */ + function isValidERC1271SignatureNow( + address signer, + bytes32 digest, + bytes memory signature + ) internal view returns (bool) { + (bool success, bytes memory result) = signer.staticcall( + abi.encodeWithSelector( + IERC1271.isValidSignature.selector, + digest, + signature + ) + ); + return (success && + result.length >= 32 && + abi.decode(result, (bytes32)) == + bytes32(IERC1271.isValidSignature.selector)); + } + + /** + * @dev Checks if the input address is a smart contract. + */ + function isContract(address addr) internal view returns (bool) { + uint256 size; + assembly { + size := extcodesize(addr) + } + return size > 0; + } +} + +// contracts/v2/AbstractFiatTokenV2.sol +/** + * Copyright 2023 Circle Internet Group, Inc. All rights reserved. + * + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +abstract contract AbstractFiatTokenV2 is AbstractFiatTokenV1 { + function _increaseAllowance( + address owner, + address spender, + uint256 increment + ) internal virtual; + + function _decreaseAllowance( + address owner, + address spender, + uint256 decrement + ) internal virtual; +} + +// node_modules/@openzeppelin/contracts/token/ERC20/SafeERC20.sol + +/** + * @title SafeERC20 + * @dev Wrappers around ERC20 operations that throw on failure (when the token + * contract returns false). Tokens that return no value (and instead revert or + * throw on failure) are also supported, non-reverting calls are assumed to be + * successful. + * To use this library you can add a `using SafeERC20 for IERC20;` statement to your contract, + * which allows you to call the safe operations as `token.safeTransfer(...)`, etc. + */ +library SafeERC20 { + using SafeMath for uint256; + using Address for address; + + function safeTransfer(IERC20 token, address to, uint256 value) internal { + _callOptionalReturn(token, abi.encodeWithSelector(token.transfer.selector, to, value)); + } + + function safeTransferFrom(IERC20 token, address from, address to, uint256 value) internal { + _callOptionalReturn(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value)); + } + + /** + * @dev Deprecated. This function has issues similar to the ones found in + * {IERC20-approve}, and its usage is discouraged. + * + * Whenever possible, use {safeIncreaseAllowance} and + * {safeDecreaseAllowance} instead. + */ + function safeApprove(IERC20 token, address spender, uint256 value) internal { + // safeApprove should only be called when setting an initial allowance, + // or when resetting it to zero. To increase and decrease it, use + // 'safeIncreaseAllowance' and 'safeDecreaseAllowance' + // solhint-disable-next-line max-line-length + require((value == 0) || (token.allowance(address(this), spender) == 0), + "SafeERC20: approve from non-zero to non-zero allowance" + ); + _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, value)); + } + + function safeIncreaseAllowance(IERC20 token, address spender, uint256 value) internal { + uint256 newAllowance = token.allowance(address(this), spender).add(value); + _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); + } + + function safeDecreaseAllowance(IERC20 token, address spender, uint256 value) internal { + uint256 newAllowance = token.allowance(address(this), spender).sub(value, "SafeERC20: decreased allowance below zero"); + _callOptionalReturn(token, abi.encodeWithSelector(token.approve.selector, spender, newAllowance)); + } + + /** + * @dev Imitates a Solidity high-level call (i.e. a regular function call to a contract), relaxing the requirement + * on the return value: the return value is optional (but if data is returned, it must not be false). + * @param token The token targeted by the call. + * @param data The call data (encoded using abi.encode or one of its variants). + */ + function _callOptionalReturn(IERC20 token, bytes memory data) private { + // We need to perform a low level call here, to bypass Solidity's return data size checking mechanism, since + // we're implementing it ourselves. We use {Address.functionCall} to perform this call, which verifies that + // the target address contains contract code and also asserts for success in the low-level call. + + bytes memory returndata = address(token).functionCall(data, "SafeERC20: low-level call failed"); + if (returndata.length > 0) { // Return data is optional + // solhint-disable-next-line max-line-length + require(abi.decode(returndata, (bool)), "SafeERC20: ERC20 operation did not succeed"); + } + } +} + +// contracts/v1.1/Rescuable.sol +/** + * Copyright 2023 Circle Internet Group, Inc. All rights reserved. + * + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +contract Rescuable is Ownable { + using SafeERC20 for IERC20; + + address private _rescuer; + + event RescuerChanged(address indexed newRescuer); + + /** + * @notice Returns current rescuer + * @return Rescuer's address + */ + function rescuer() external view returns (address) { + return _rescuer; + } + + /** + * @notice Revert if called by any account other than the rescuer. + */ + modifier onlyRescuer() { + require(msg.sender == _rescuer, "Rescuable: caller is not the rescuer"); + _; + } + + /** + * @notice Rescue ERC20 tokens locked up in this contract. + * @param tokenContract ERC20 token contract address + * @param to Recipient address + * @param amount Amount to withdraw + */ + function rescueERC20( + IERC20 tokenContract, + address to, + uint256 amount + ) external onlyRescuer { + tokenContract.safeTransfer(to, amount); + } + + /** + * @notice Updates the rescuer address. + * @param newRescuer The address of the new rescuer. + */ + function updateRescuer(address newRescuer) external onlyOwner { + require( + newRescuer != address(0), + "Rescuable: new rescuer is the zero address" + ); + _rescuer = newRescuer; + emit RescuerChanged(newRescuer); + } +} + +// contracts/v1/FiatTokenV1.sol +/** + * Copyright 2023 Circle Internet Group, Inc. All rights reserved. + * + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @title FiatToken + * @dev ERC20 Token backed by fiat reserves + */ +contract FiatTokenV1 is AbstractFiatTokenV1, Ownable, Pausable, Blacklistable { + using SafeMath for uint256; + + string public name; + string public symbol; + uint8 public decimals; + string public currency; + address public masterMinter; + bool internal initialized; + + /// @dev A mapping that stores the balance and blacklist states for a given address. + /// The first bit defines whether the address is blacklisted (1 if blacklisted, 0 otherwise). + /// The last 255 bits define the balance for the address. + mapping(address => uint256) internal balanceAndBlacklistStates; + mapping(address => mapping(address => uint256)) internal allowed; + uint256 internal totalSupply_ = 0; + mapping(address => bool) internal minters; + mapping(address => uint256) internal minterAllowed; + + event Mint(address indexed minter, address indexed to, uint256 amount); + event Burn(address indexed burner, uint256 amount); + event MinterConfigured(address indexed minter, uint256 minterAllowedAmount); + event MinterRemoved(address indexed oldMinter); + event MasterMinterChanged(address indexed newMasterMinter); + + /** + * @notice Initializes the fiat token contract. + * @param tokenName The name of the fiat token. + * @param tokenSymbol The symbol of the fiat token. + * @param tokenCurrency The fiat currency that the token represents. + * @param tokenDecimals The number of decimals that the token uses. + * @param newMasterMinter The masterMinter address for the fiat token. + * @param newPauser The pauser address for the fiat token. + * @param newBlacklister The blacklister address for the fiat token. + * @param newOwner The owner of the fiat token. + */ + function initialize( + string memory tokenName, + string memory tokenSymbol, + string memory tokenCurrency, + uint8 tokenDecimals, + address newMasterMinter, + address newPauser, + address newBlacklister, + address newOwner + ) public { + require(!initialized, "FiatToken: contract is already initialized"); + require( + newMasterMinter != address(0), + "FiatToken: new masterMinter is the zero address" + ); + require( + newPauser != address(0), + "FiatToken: new pauser is the zero address" + ); + require( + newBlacklister != address(0), + "FiatToken: new blacklister is the zero address" + ); + require( + newOwner != address(0), + "FiatToken: new owner is the zero address" + ); + + name = tokenName; + symbol = tokenSymbol; + currency = tokenCurrency; + decimals = tokenDecimals; + masterMinter = newMasterMinter; + pauser = newPauser; + blacklister = newBlacklister; + setOwner(newOwner); + initialized = true; + } + + /** + * @dev Throws if called by any account other than a minter. + */ + modifier onlyMinters() { + require(minters[msg.sender], "FiatToken: caller is not a minter"); + _; + } + + /** + * @notice Mints fiat tokens to an address. + * @param _to The address that will receive the minted tokens. + * @param _amount The amount of tokens to mint. Must be less than or equal + * to the minterAllowance of the caller. + * @return True if the operation was successful. + */ + function mint(address _to, uint256 _amount) + external + whenNotPaused + onlyMinters + notBlacklisted(msg.sender) + notBlacklisted(_to) + returns (bool) + { + require(_to != address(0), "FiatToken: mint to the zero address"); + require(_amount > 0, "FiatToken: mint amount not greater than 0"); + + uint256 mintingAllowedAmount = minterAllowed[msg.sender]; + require( + _amount <= mintingAllowedAmount, + "FiatToken: mint amount exceeds minterAllowance" + ); + + totalSupply_ = totalSupply_.add(_amount); + _setBalance(_to, _balanceOf(_to).add(_amount)); + minterAllowed[msg.sender] = mintingAllowedAmount.sub(_amount); + emit Mint(msg.sender, _to, _amount); + emit Transfer(address(0), _to, _amount); + return true; + } + + /** + * @dev Throws if called by any account other than the masterMinter + */ + modifier onlyMasterMinter() { + require( + msg.sender == masterMinter, + "FiatToken: caller is not the masterMinter" + ); + _; + } + + /** + * @notice Gets the minter allowance for an account. + * @param minter The address to check. + * @return The remaining minter allowance for the account. + */ + function minterAllowance(address minter) external view returns (uint256) { + return minterAllowed[minter]; + } + + /** + * @notice Checks if an account is a minter. + * @param account The address to check. + * @return True if the account is a minter, false if the account is not a minter. + */ + function isMinter(address account) external view returns (bool) { + return minters[account]; + } + + /** + * @notice Gets the remaining amount of fiat tokens a spender is allowed to transfer on + * behalf of the token owner. + * @param owner The token owner's address. + * @param spender The spender's address. + * @return The remaining allowance. + */ + function allowance(address owner, address spender) + external + override + view + returns (uint256) + { + return allowed[owner][spender]; + } + + /** + * @notice Gets the totalSupply of the fiat token. + * @return The totalSupply of the fiat token. + */ + function totalSupply() external override view returns (uint256) { + return totalSupply_; + } + + /** + * @notice Gets the fiat token balance of an account. + * @param account The address to check. + * @return balance The fiat token balance of the account. + */ + function balanceOf(address account) + external + override + view + returns (uint256) + { + return _balanceOf(account); + } + + /** + * @notice Sets a fiat token allowance for a spender to spend on behalf of the caller. + * @param spender The spender's address. + * @param value The allowance amount. + * @return True if the operation was successful. + */ + function approve(address spender, uint256 value) + external + virtual + override + whenNotPaused + notBlacklisted(msg.sender) + notBlacklisted(spender) + returns (bool) + { + _approve(msg.sender, spender, value); + return true; + } + + /** + * @dev Internal function to set allowance. + * @param owner Token owner's address. + * @param spender Spender's address. + * @param value Allowance amount. + */ + function _approve( + address owner, + address spender, + uint256 value + ) internal override { + require(owner != address(0), "ERC20: approve from the zero address"); + require(spender != address(0), "ERC20: approve to the zero address"); + allowed[owner][spender] = value; + emit Approval(owner, spender, value); + } + + /** + * @notice Transfers tokens from an address to another by spending the caller's allowance. + * @dev The caller must have some fiat token allowance on the payer's tokens. + * @param from Payer's address. + * @param to Payee's address. + * @param value Transfer amount. + * @return True if the operation was successful. + */ + function transferFrom( + address from, + address to, + uint256 value + ) + external + override + whenNotPaused + notBlacklisted(msg.sender) + notBlacklisted(from) + notBlacklisted(to) + returns (bool) + { + require( + value <= allowed[from][msg.sender], + "ERC20: transfer amount exceeds allowance" + ); + _transfer(from, to, value); + allowed[from][msg.sender] = allowed[from][msg.sender].sub(value); + return true; + } + + /** + * @notice Transfers tokens from the caller. + * @param to Payee's address. + * @param value Transfer amount. + * @return True if the operation was successful. + */ + function transfer(address to, uint256 value) + external + override + whenNotPaused + notBlacklisted(msg.sender) + notBlacklisted(to) + returns (bool) + { + _transfer(msg.sender, to, value); + return true; + } + + /** + * @dev Internal function to process transfers. + * @param from Payer's address. + * @param to Payee's address. + * @param value Transfer amount. + */ + function _transfer( + address from, + address to, + uint256 value + ) internal override { + require(from != address(0), "ERC20: transfer from the zero address"); + require(to != address(0), "ERC20: transfer to the zero address"); + require( + value <= _balanceOf(from), + "ERC20: transfer amount exceeds balance" + ); + + _setBalance(from, _balanceOf(from).sub(value)); + _setBalance(to, _balanceOf(to).add(value)); + emit Transfer(from, to, value); + } + + /** + * @notice Adds or updates a new minter with a mint allowance. + * @param minter The address of the minter. + * @param minterAllowedAmount The minting amount allowed for the minter. + * @return True if the operation was successful. + */ + function configureMinter(address minter, uint256 minterAllowedAmount) + external + whenNotPaused + onlyMasterMinter + returns (bool) + { + minters[minter] = true; + minterAllowed[minter] = minterAllowedAmount; + emit MinterConfigured(minter, minterAllowedAmount); + return true; + } + + /** + * @notice Removes a minter. + * @param minter The address of the minter to remove. + * @return True if the operation was successful. + */ + function removeMinter(address minter) + external + onlyMasterMinter + returns (bool) + { + minters[minter] = false; + minterAllowed[minter] = 0; + emit MinterRemoved(minter); + return true; + } + + /** + * @notice Allows a minter to burn some of its own tokens. + * @dev The caller must be a minter, must not be blacklisted, and the amount to burn + * should be less than or equal to the account's balance. + * @param _amount the amount of tokens to be burned. + */ + function burn(uint256 _amount) + external + whenNotPaused + onlyMinters + notBlacklisted(msg.sender) + { + uint256 balance = _balanceOf(msg.sender); + require(_amount > 0, "FiatToken: burn amount not greater than 0"); + require(balance >= _amount, "FiatToken: burn amount exceeds balance"); + + totalSupply_ = totalSupply_.sub(_amount); + _setBalance(msg.sender, balance.sub(_amount)); + emit Burn(msg.sender, _amount); + emit Transfer(msg.sender, address(0), _amount); + } + + /** + * @notice Updates the master minter address. + * @param _newMasterMinter The address of the new master minter. + */ + function updateMasterMinter(address _newMasterMinter) external onlyOwner { + require( + _newMasterMinter != address(0), + "FiatToken: new masterMinter is the zero address" + ); + masterMinter = _newMasterMinter; + emit MasterMinterChanged(masterMinter); + } + + /** + * + */ + function _blacklist(address _account) internal override { + _setBlacklistState(_account, true); + } + + /** + * + */ + function _unBlacklist(address _account) internal override { + _setBlacklistState(_account, false); + } + + /** + * @dev Helper method that sets the blacklist state of an account. + * @param _account The address of the account. + * @param _shouldBlacklist True if the account should be blacklisted, false if the account should be unblacklisted. + */ + function _setBlacklistState(address _account, bool _shouldBlacklist) + internal + virtual + { + _deprecatedBlacklisted[_account] = _shouldBlacklist; + } + + /** + * @dev Helper method that sets the balance of an account. + * @param _account The address of the account. + * @param _balance The new fiat token balance of the account. + */ + function _setBalance(address _account, uint256 _balance) internal virtual { + balanceAndBlacklistStates[_account] = _balance; + } + + /** + * + */ + function _isBlacklisted(address _account) + internal + virtual + override + view + returns (bool) + { + return _deprecatedBlacklisted[_account]; + } + + /** + * @dev Helper method to obtain the balance of an account. + * @param _account The address of the account. + * @return The fiat token balance of the account. + */ + function _balanceOf(address _account) + internal + virtual + view + returns (uint256) + { + return balanceAndBlacklistStates[_account]; + } +} + +// contracts/v2/EIP2612.sol +/** + * Copyright 2023 Circle Internet Group, Inc. All rights reserved. + * + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @title EIP-2612 + * @notice Provide internal implementation for gas-abstracted approvals + */ +abstract contract EIP2612 is AbstractFiatTokenV2, EIP712Domain { + // keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)") + bytes32 + public constant PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9; + + mapping(address => uint256) private _permitNonces; + + /** + * @notice Nonces for permit + * @param owner Token owner's address (Authorizer) + * @return Next nonce + */ + function nonces(address owner) external view returns (uint256) { + return _permitNonces[owner]; + } + + /** + * @notice Verify a signed approval permit and execute if valid + * @param owner Token owner's address (Authorizer) + * @param spender Spender's address + * @param value Amount of allowance + * @param deadline The time at which the signature expires (unix time), or max uint256 value to signal no expiration + * @param v v of the signature + * @param r r of the signature + * @param s s of the signature + */ + function _permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) internal { + _permit(owner, spender, value, deadline, abi.encodePacked(r, s, v)); + } + + /** + * @notice Verify a signed approval permit and execute if valid + * @dev EOA wallet signatures should be packed in the order of r, s, v. + * @param owner Token owner's address (Authorizer) + * @param spender Spender's address + * @param value Amount of allowance + * @param deadline The time at which the signature expires (unix time), or max uint256 value to signal no expiration + * @param signature Signature byte array signed by an EOA wallet or a contract wallet + */ + function _permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + bytes memory signature + ) internal { + require( + deadline == type(uint256).max || deadline >= now, + "FiatTokenV2: permit is expired" + ); + + bytes32 typedDataHash = MessageHashUtils.toTypedDataHash( + _domainSeparator(), + keccak256( + abi.encode( + PERMIT_TYPEHASH, + owner, + spender, + value, + _permitNonces[owner]++, + deadline + ) + ) + ); + require( + SignatureChecker.isValidSignatureNow( + owner, + typedDataHash, + signature + ), + "EIP2612: invalid signature" + ); + + _approve(owner, spender, value); + } +} + +// contracts/v2/EIP3009.sol +/** + * Copyright 2023 Circle Internet Group, Inc. All rights reserved. + * + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @title EIP-3009 + * @notice Provide internal implementation for gas-abstracted transfers + * @dev Contracts that inherit from this must wrap these with publicly + * accessible functions, optionally adding modifiers where necessary + */ +abstract contract EIP3009 is AbstractFiatTokenV2, EIP712Domain { + // keccak256("TransferWithAuthorization(address from,address to,uint256 value,uint256 validAfter,uint256 validBefore,bytes32 nonce)") + bytes32 + public constant TRANSFER_WITH_AUTHORIZATION_TYPEHASH = 0x7c7c6cdb67a18743f49ec6fa9b35f50d52ed05cbed4cc592e13b44501c1a2267; + + // keccak256("ReceiveWithAuthorization(address from,address to,uint256 value,uint256 validAfter,uint256 validBefore,bytes32 nonce)") + bytes32 + public constant RECEIVE_WITH_AUTHORIZATION_TYPEHASH = 0xd099cc98ef71107a616c4f0f941f04c322d8e254fe26b3c6668db87aae413de8; + + // keccak256("CancelAuthorization(address authorizer,bytes32 nonce)") + bytes32 + public constant CANCEL_AUTHORIZATION_TYPEHASH = 0x158b0a9edf7a828aad02f63cd515c68ef2f50ba807396f6d12842833a1597429; + + /** + * @dev authorizer address => nonce => bool (true if nonce is used) + */ + mapping(address => mapping(bytes32 => bool)) private _authorizationStates; + + event AuthorizationUsed(address indexed authorizer, bytes32 indexed nonce); + event AuthorizationCanceled( + address indexed authorizer, + bytes32 indexed nonce + ); + + /** + * @notice Returns the state of an authorization + * @dev Nonces are randomly generated 32-byte data unique to the + * authorizer's address + * @param authorizer Authorizer's address + * @param nonce Nonce of the authorization + * @return True if the nonce is used + */ + function authorizationState(address authorizer, bytes32 nonce) + external + view + returns (bool) + { + return _authorizationStates[authorizer][nonce]; + } + + /** + * @notice Execute a transfer with a signed authorization + * @param from Payer's address (Authorizer) + * @param to Payee's address + * @param value Amount to be transferred + * @param validAfter The time after which this is valid (unix time) + * @param validBefore The time before which this is valid (unix time) + * @param nonce Unique nonce + * @param v v of the signature + * @param r r of the signature + * @param s s of the signature + */ + function _transferWithAuthorization( + address from, + address to, + uint256 value, + uint256 validAfter, + uint256 validBefore, + bytes32 nonce, + uint8 v, + bytes32 r, + bytes32 s + ) internal { + _transferWithAuthorization( + from, + to, + value, + validAfter, + validBefore, + nonce, + abi.encodePacked(r, s, v) + ); + } + + /** + * @notice Execute a transfer with a signed authorization + * @dev EOA wallet signatures should be packed in the order of r, s, v. + * @param from Payer's address (Authorizer) + * @param to Payee's address + * @param value Amount to be transferred + * @param validAfter The time after which this is valid (unix time) + * @param validBefore The time before which this is valid (unix time) + * @param nonce Unique nonce + * @param signature Signature byte array produced by an EOA wallet or a contract wallet + */ + function _transferWithAuthorization( + address from, + address to, + uint256 value, + uint256 validAfter, + uint256 validBefore, + bytes32 nonce, + bytes memory signature + ) internal { + _requireValidAuthorization(from, nonce, validAfter, validBefore); + _requireValidSignature( + from, + keccak256( + abi.encode( + TRANSFER_WITH_AUTHORIZATION_TYPEHASH, + from, + to, + value, + validAfter, + validBefore, + nonce + ) + ), + signature + ); + + _markAuthorizationAsUsed(from, nonce); + _transfer(from, to, value); + } + + /** + * @notice Receive a transfer with a signed authorization from the payer + * @dev This has an additional check to ensure that the payee's address + * matches the caller of this function to prevent front-running attacks. + * @param from Payer's address (Authorizer) + * @param to Payee's address + * @param value Amount to be transferred + * @param validAfter The time after which this is valid (unix time) + * @param validBefore The time before which this is valid (unix time) + * @param nonce Unique nonce + * @param v v of the signature + * @param r r of the signature + * @param s s of the signature + */ + function _receiveWithAuthorization( + address from, + address to, + uint256 value, + uint256 validAfter, + uint256 validBefore, + bytes32 nonce, + uint8 v, + bytes32 r, + bytes32 s + ) internal { + _receiveWithAuthorization( + from, + to, + value, + validAfter, + validBefore, + nonce, + abi.encodePacked(r, s, v) + ); + } + + /** + * @notice Receive a transfer with a signed authorization from the payer + * @dev This has an additional check to ensure that the payee's address + * matches the caller of this function to prevent front-running attacks. + * EOA wallet signatures should be packed in the order of r, s, v. + * @param from Payer's address (Authorizer) + * @param to Payee's address + * @param value Amount to be transferred + * @param validAfter The time after which this is valid (unix time) + * @param validBefore The time before which this is valid (unix time) + * @param nonce Unique nonce + * @param signature Signature byte array produced by an EOA wallet or a contract wallet + */ + function _receiveWithAuthorization( + address from, + address to, + uint256 value, + uint256 validAfter, + uint256 validBefore, + bytes32 nonce, + bytes memory signature + ) internal { + require(to == msg.sender, "FiatTokenV2: caller must be the payee"); + _requireValidAuthorization(from, nonce, validAfter, validBefore); + _requireValidSignature( + from, + keccak256( + abi.encode( + RECEIVE_WITH_AUTHORIZATION_TYPEHASH, + from, + to, + value, + validAfter, + validBefore, + nonce + ) + ), + signature + ); + + _markAuthorizationAsUsed(from, nonce); + _transfer(from, to, value); + } + + /** + * @notice Attempt to cancel an authorization + * @param authorizer Authorizer's address + * @param nonce Nonce of the authorization + * @param v v of the signature + * @param r r of the signature + * @param s s of the signature + */ + function _cancelAuthorization( + address authorizer, + bytes32 nonce, + uint8 v, + bytes32 r, + bytes32 s + ) internal { + _cancelAuthorization(authorizer, nonce, abi.encodePacked(r, s, v)); + } + + /** + * @notice Attempt to cancel an authorization + * @dev EOA wallet signatures should be packed in the order of r, s, v. + * @param authorizer Authorizer's address + * @param nonce Nonce of the authorization + * @param signature Signature byte array produced by an EOA wallet or a contract wallet + */ + function _cancelAuthorization( + address authorizer, + bytes32 nonce, + bytes memory signature + ) internal { + _requireUnusedAuthorization(authorizer, nonce); + _requireValidSignature( + authorizer, + keccak256( + abi.encode(CANCEL_AUTHORIZATION_TYPEHASH, authorizer, nonce) + ), + signature + ); + + _authorizationStates[authorizer][nonce] = true; + emit AuthorizationCanceled(authorizer, nonce); + } + + /** + * @notice Validates that signature against input data struct + * @param signer Signer's address + * @param dataHash Hash of encoded data struct + * @param signature Signature byte array produced by an EOA wallet or a contract wallet + */ + function _requireValidSignature( + address signer, + bytes32 dataHash, + bytes memory signature + ) private view { + require( + SignatureChecker.isValidSignatureNow( + signer, + MessageHashUtils.toTypedDataHash(_domainSeparator(), dataHash), + signature + ), + "FiatTokenV2: invalid signature" + ); + } + + /** + * @notice Check that an authorization is unused + * @param authorizer Authorizer's address + * @param nonce Nonce of the authorization + */ + function _requireUnusedAuthorization(address authorizer, bytes32 nonce) + private + view + { + require( + !_authorizationStates[authorizer][nonce], + "FiatTokenV2: authorization is used or canceled" + ); + } + + /** + * @notice Check that authorization is valid + * @param authorizer Authorizer's address + * @param nonce Nonce of the authorization + * @param validAfter The time after which this is valid (unix time) + * @param validBefore The time before which this is valid (unix time) + */ + function _requireValidAuthorization( + address authorizer, + bytes32 nonce, + uint256 validAfter, + uint256 validBefore + ) private view { + require( + now > validAfter, + "FiatTokenV2: authorization is not yet valid" + ); + require(now < validBefore, "FiatTokenV2: authorization is expired"); + _requireUnusedAuthorization(authorizer, nonce); + } + + /** + * @notice Mark an authorization as used + * @param authorizer Authorizer's address + * @param nonce Nonce of the authorization + */ + function _markAuthorizationAsUsed(address authorizer, bytes32 nonce) + private + { + _authorizationStates[authorizer][nonce] = true; + emit AuthorizationUsed(authorizer, nonce); + } +} + +// contracts/v1.1/FiatTokenV1_1.sol +/** + * Copyright 2023 Circle Internet Group, Inc. All rights reserved. + * + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @title FiatTokenV1_1 + * @dev ERC20 Token backed by fiat reserves + */ +contract FiatTokenV1_1 is FiatTokenV1, Rescuable { + +} + +// contracts/v2/FiatTokenV2.sol +/** + * Copyright 2023 Circle Internet Group, Inc. All rights reserved. + * + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @title FiatToken V2 + * @notice ERC20 Token backed by fiat reserves, version 2 + */ +contract FiatTokenV2 is FiatTokenV1_1, EIP3009, EIP2612 { + uint8 internal _initializedVersion; + + /** + * @notice Initialize v2 + * @param newName New token name + */ + function initializeV2(string calldata newName) external { + // solhint-disable-next-line reason-string + require(initialized && _initializedVersion == 0); + name = newName; + _DEPRECATED_CACHED_DOMAIN_SEPARATOR = EIP712.makeDomainSeparator( + newName, + "2" + ); + _initializedVersion = 1; + } + + /** + * @notice Increase the allowance by a given increment + * @param spender Spender's address + * @param increment Amount of increase in allowance + * @return True if successful + */ + function increaseAllowance(address spender, uint256 increment) + external + virtual + whenNotPaused + notBlacklisted(msg.sender) + notBlacklisted(spender) + returns (bool) + { + _increaseAllowance(msg.sender, spender, increment); + return true; + } + + /** + * @notice Decrease the allowance by a given decrement + * @param spender Spender's address + * @param decrement Amount of decrease in allowance + * @return True if successful + */ + function decreaseAllowance(address spender, uint256 decrement) + external + virtual + whenNotPaused + notBlacklisted(msg.sender) + notBlacklisted(spender) + returns (bool) + { + _decreaseAllowance(msg.sender, spender, decrement); + return true; + } + + /** + * @notice Execute a transfer with a signed authorization + * @param from Payer's address (Authorizer) + * @param to Payee's address + * @param value Amount to be transferred + * @param validAfter The time after which this is valid (unix time) + * @param validBefore The time before which this is valid (unix time) + * @param nonce Unique nonce + * @param v v of the signature + * @param r r of the signature + * @param s s of the signature + */ + function transferWithAuthorization( + address from, + address to, + uint256 value, + uint256 validAfter, + uint256 validBefore, + bytes32 nonce, + uint8 v, + bytes32 r, + bytes32 s + ) external whenNotPaused notBlacklisted(from) notBlacklisted(to) { + _transferWithAuthorization( + from, + to, + value, + validAfter, + validBefore, + nonce, + v, + r, + s + ); + } + + /** + * @notice Receive a transfer with a signed authorization from the payer + * @dev This has an additional check to ensure that the payee's address + * matches the caller of this function to prevent front-running attacks. + * @param from Payer's address (Authorizer) + * @param to Payee's address + * @param value Amount to be transferred + * @param validAfter The time after which this is valid (unix time) + * @param validBefore The time before which this is valid (unix time) + * @param nonce Unique nonce + * @param v v of the signature + * @param r r of the signature + * @param s s of the signature + */ + function receiveWithAuthorization( + address from, + address to, + uint256 value, + uint256 validAfter, + uint256 validBefore, + bytes32 nonce, + uint8 v, + bytes32 r, + bytes32 s + ) external whenNotPaused notBlacklisted(from) notBlacklisted(to) { + _receiveWithAuthorization( + from, + to, + value, + validAfter, + validBefore, + nonce, + v, + r, + s + ); + } + + /** + * @notice Attempt to cancel an authorization + * @dev Works only if the authorization is not yet used. + * @param authorizer Authorizer's address + * @param nonce Nonce of the authorization + * @param v v of the signature + * @param r r of the signature + * @param s s of the signature + */ + function cancelAuthorization( + address authorizer, + bytes32 nonce, + uint8 v, + bytes32 r, + bytes32 s + ) external whenNotPaused { + _cancelAuthorization(authorizer, nonce, v, r, s); + } + + /** + * @notice Update allowance with a signed permit + * @param owner Token owner's address (Authorizer) + * @param spender Spender's address + * @param value Amount of allowance + * @param deadline The time at which the signature expires (unix time), or max uint256 value to signal no expiration + * @param v v of the signature + * @param r r of the signature + * @param s s of the signature + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) + external + virtual + whenNotPaused + notBlacklisted(owner) + notBlacklisted(spender) + { + _permit(owner, spender, value, deadline, v, r, s); + } + + /** + * @dev Internal function to increase the allowance by a given increment + * @param owner Token owner's address + * @param spender Spender's address + * @param increment Amount of increase + */ + function _increaseAllowance( + address owner, + address spender, + uint256 increment + ) internal override { + _approve(owner, spender, allowed[owner][spender].add(increment)); + } + + /** + * @dev Internal function to decrease the allowance by a given decrement + * @param owner Token owner's address + * @param spender Spender's address + * @param decrement Amount of decrease + */ + function _decreaseAllowance( + address owner, + address spender, + uint256 decrement + ) internal override { + _approve( + owner, + spender, + allowed[owner][spender].sub( + decrement, + "ERC20: decreased allowance below zero" + ) + ); + } +} + +// contracts/v2/FiatTokenV2_1.sol +/** + * Copyright 2023 Circle Internet Group, Inc. All rights reserved. + * + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// solhint-disable func-name-mixedcase + +/** + * @title FiatToken V2.1 + * @notice ERC20 Token backed by fiat reserves, version 2.1 + */ +contract FiatTokenV2_1 is FiatTokenV2 { + /** + * @notice Initialize v2.1 + * @param lostAndFound The address to which the locked funds are sent + */ + function initializeV2_1(address lostAndFound) external { + // solhint-disable-next-line reason-string + require(_initializedVersion == 1); + + uint256 lockedAmount = _balanceOf(address(this)); + if (lockedAmount > 0) { + _transfer(address(this), lostAndFound, lockedAmount); + } + _blacklist(address(this)); + + _initializedVersion = 2; + } + + /** + * @notice Version string for the EIP712 domain separator + * @return Version string + */ + function version() external pure returns (string memory) { + return "2"; + } +} + +// contracts/v2/FiatTokenV2_2.sol +/** + * Copyright 2023 Circle Internet Group, Inc. All rights reserved. + * + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + + // solhint-disable-line no-unused-import + // solhint-disable-line no-unused-import + // solhint-disable-line no-unused-import + // solhint-disable-line no-unused-import + +// solhint-disable func-name-mixedcase + +/** + * @title FiatToken V2.2 + * @notice ERC20 Token backed by fiat reserves, version 2.2 + */ +contract FiatTokenV2_2 is FiatTokenV2_1 { + /** + * @notice Initialize v2.2 + * @param accountsToBlacklist A list of accounts to migrate from the old blacklist + * @param newSymbol New token symbol + * data structure to the new blacklist data structure. + */ + function initializeV2_2( + address[] calldata accountsToBlacklist, + string calldata newSymbol + ) external { + // solhint-disable-next-line reason-string + require(_initializedVersion == 2); + + // Update fiat token symbol + symbol = newSymbol; + + // Add previously blacklisted accounts to the new blacklist data structure + // and remove them from the old blacklist data structure. + for (uint256 i = 0; i < accountsToBlacklist.length; i++) { + require( + _deprecatedBlacklisted[accountsToBlacklist[i]], + "FiatTokenV2_2: Blacklisting previously unblacklisted account!" + ); + _blacklist(accountsToBlacklist[i]); + delete _deprecatedBlacklisted[accountsToBlacklist[i]]; + } + _blacklist(address(this)); + delete _deprecatedBlacklisted[address(this)]; + + _initializedVersion = 3; + } + + /** + * @dev Internal function to get the current chain id. + * @return The current chain id. + */ + function _chainId() internal virtual view returns (uint256) { + uint256 chainId; + assembly { + chainId := chainid() + } + return chainId; + } + + /** + * + */ + function _domainSeparator() internal override view returns (bytes32) { + return EIP712.makeDomainSeparator(name, "2", _chainId()); + } + + /** + * @notice Update allowance with a signed permit + * @dev EOA wallet signatures should be packed in the order of r, s, v. + * @param owner Token owner's address (Authorizer) + * @param spender Spender's address + * @param value Amount of allowance + * @param deadline The time at which the signature expires (unix time), or max uint256 value to signal no expiration + * @param signature Signature bytes signed by an EOA wallet or a contract wallet + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + bytes memory signature + ) external whenNotPaused { + _permit(owner, spender, value, deadline, signature); + } + + /** + * @notice Execute a transfer with a signed authorization + * @dev EOA wallet signatures should be packed in the order of r, s, v. + * @param from Payer's address (Authorizer) + * @param to Payee's address + * @param value Amount to be transferred + * @param validAfter The time after which this is valid (unix time) + * @param validBefore The time before which this is valid (unix time) + * @param nonce Unique nonce + * @param signature Signature bytes signed by an EOA wallet or a contract wallet + */ + function transferWithAuthorization( + address from, + address to, + uint256 value, + uint256 validAfter, + uint256 validBefore, + bytes32 nonce, + bytes memory signature + ) external whenNotPaused notBlacklisted(from) notBlacklisted(to) { + _transferWithAuthorization( + from, + to, + value, + validAfter, + validBefore, + nonce, + signature + ); + } + + /** + * @notice Receive a transfer with a signed authorization from the payer + * @dev This has an additional check to ensure that the payee's address + * matches the caller of this function to prevent front-running attacks. + * EOA wallet signatures should be packed in the order of r, s, v. + * @param from Payer's address (Authorizer) + * @param to Payee's address + * @param value Amount to be transferred + * @param validAfter The time after which this is valid (unix time) + * @param validBefore The time before which this is valid (unix time) + * @param nonce Unique nonce + * @param signature Signature bytes signed by an EOA wallet or a contract wallet + */ + function receiveWithAuthorization( + address from, + address to, + uint256 value, + uint256 validAfter, + uint256 validBefore, + bytes32 nonce, + bytes memory signature + ) external whenNotPaused notBlacklisted(from) notBlacklisted(to) { + _receiveWithAuthorization( + from, + to, + value, + validAfter, + validBefore, + nonce, + signature + ); + } + + /** + * @notice Attempt to cancel an authorization + * @dev Works only if the authorization is not yet used. + * EOA wallet signatures should be packed in the order of r, s, v. + * @param authorizer Authorizer's address + * @param nonce Nonce of the authorization + * @param signature Signature bytes signed by an EOA wallet or a contract wallet + */ + function cancelAuthorization( + address authorizer, + bytes32 nonce, + bytes memory signature + ) external whenNotPaused { + _cancelAuthorization(authorizer, nonce, signature); + } + + /** + * @dev Helper method that sets the blacklist state of an account on balanceAndBlacklistStates. + * If _shouldBlacklist is true, we apply a (1 << 255) bitmask with an OR operation on the + * account's balanceAndBlacklistState. This flips the high bit for the account to 1, + * indicating that the account is blacklisted. + * + * If _shouldBlacklist if false, we reset the account's balanceAndBlacklistStates to their + * balances. This clears the high bit for the account, indicating that the account is unblacklisted. + * @param _account The address of the account. + * @param _shouldBlacklist True if the account should be blacklisted, false if the account should be unblacklisted. + */ + function _setBlacklistState(address _account, bool _shouldBlacklist) + internal + override + { + balanceAndBlacklistStates[_account] = _shouldBlacklist + ? balanceAndBlacklistStates[_account] | (1 << 255) + : _balanceOf(_account); + } + + /** + * @dev Helper method that sets the balance of an account on balanceAndBlacklistStates. + * Since balances are stored in the last 255 bits of the balanceAndBlacklistStates value, + * we need to ensure that the updated balance does not exceed (2^255 - 1). + * Since blacklisted accounts' balances cannot be updated, the method will also + * revert if the account is blacklisted + * @param _account The address of the account. + * @param _balance The new fiat token balance of the account (max: (2^255 - 1)). + */ + function _setBalance(address _account, uint256 _balance) internal override { + require( + _balance <= ((1 << 255) - 1), + "FiatTokenV2_2: Balance exceeds (2^255 - 1)" + ); + require( + !_isBlacklisted(_account), + "FiatTokenV2_2: Account is blacklisted" + ); + + balanceAndBlacklistStates[_account] = _balance; + } + + /** + * + */ + function _isBlacklisted(address _account) + internal + override + view + returns (bool) + { + return balanceAndBlacklistStates[_account] >> 255 == 1; + } + + /** + * @dev Helper method to obtain the balance of an account. Since balances + * are stored in the last 255 bits of the balanceAndBlacklistStates value, + * we apply a ((1 << 255) - 1) bit bitmask with an AND operation on the + * balanceAndBlacklistState to obtain the balance. + * @param _account The address of the account. + * @return The fiat token balance of the account. + */ + function _balanceOf(address _account) + internal + override + view + returns (uint256) + { + return balanceAndBlacklistStates[_account] & ((1 << 255) - 1); + } + + /** + * + */ + function approve(address spender, uint256 value) + external + override + whenNotPaused + returns (bool) + { + _approve(msg.sender, spender, value); + return true; + } + + /** + * + */ + function permit( + address owner, + address spender, + uint256 value, + uint256 deadline, + uint8 v, + bytes32 r, + bytes32 s + ) external override whenNotPaused { + _permit(owner, spender, value, deadline, v, r, s); + } + + /** + * + */ + function increaseAllowance(address spender, uint256 increment) + external + override + whenNotPaused + returns (bool) + { + _increaseAllowance(msg.sender, spender, increment); + return true; + } + + /** + * + */ + function decreaseAllowance(address spender, uint256 decrement) + external + override + whenNotPaused + returns (bool) + { + _decreaseAllowance(msg.sender, spender, decrement); + return true; + } +} diff --git a/contracts/contracts/libraries/usdc/MasterMinter.sol.flatten b/contracts/contracts/libraries/usdc/MasterMinter.sol.flatten new file mode 100644 index 00000000..94eb3dc2 --- /dev/null +++ b/contracts/contracts/libraries/usdc/MasterMinter.sol.flatten @@ -0,0 +1,676 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity <0.8.0 =0.6.12 >=0.6.0; + +// contracts/minting/MinterManagementInterface.sol +/** + * Copyright 2023 Circle Internet Group, Inc. All rights reserved. + * + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @dev A contract that implements the MinterManagementInterface has external + * functions for adding and removing minters and modifying their allowances. + * An example is the FiatTokenV1 contract. + */ +interface MinterManagementInterface { + function isMinter(address _account) external view returns (bool); + + function minterAllowance(address _minter) external view returns (uint256); + + function configureMinter(address _minter, uint256 _minterAllowedAmount) + external + returns (bool); + + function removeMinter(address _minter) external returns (bool); +} + +// contracts/v1/Ownable.sol +/** + + * + * Copyright (c) 2018 zOS Global Limited. + * Copyright (c) 2018-2020 CENTRE SECZ + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +/** + * @notice The Ownable contract has an owner address, and provides basic + * authorization control functions + * @dev Forked from https://github.com/OpenZeppelin/openzeppelin-labs/blob/3887ab77b8adafba4a26ace002f3a684c1a3388b/upgradeability_ownership/contracts/ownership/Ownable.sol + * Modifications: + * 1. Consolidate OwnableStorage into this contract (7/13/18) + * 2. Reformat, conform to Solidity 0.6 syntax, and add error messages (5/13/20) + * 3. Make public functions external (5/27/20) + */ +contract Ownable { + // Owner of the contract + address private _owner; + + /** + * @dev Event to show ownership has been transferred + * @param previousOwner representing the address of the previous owner + * @param newOwner representing the address of the new owner + */ + event OwnershipTransferred(address previousOwner, address newOwner); + + /** + * @dev The constructor sets the original owner of the contract to the sender account. + */ + constructor() public { + setOwner(msg.sender); + } + + /** + * @dev Tells the address of the owner + * @return the address of the owner + */ + function owner() external view returns (address) { + return _owner; + } + + /** + * @dev Sets a new owner address + */ + function setOwner(address newOwner) internal { + _owner = newOwner; + } + + /** + * @dev Throws if called by any account other than the owner. + */ + modifier onlyOwner() { + require(msg.sender == _owner, "Ownable: caller is not the owner"); + _; + } + + /** + * @dev Allows the current owner to transfer control of the contract to a newOwner. + * @param newOwner The address to transfer ownership to. + */ + function transferOwnership(address newOwner) external onlyOwner { + require( + newOwner != address(0), + "Ownable: new owner is the zero address" + ); + emit OwnershipTransferred(_owner, newOwner); + setOwner(newOwner); + } +} + +// node_modules/@openzeppelin/contracts/math/SafeMath.sol + +/** + * @dev Wrappers over Solidity's arithmetic operations with added overflow + * checks. + * + * Arithmetic operations in Solidity wrap on overflow. This can easily result + * in bugs, because programmers usually assume that an overflow raises an + * error, which is the standard behavior in high level programming languages. + * `SafeMath` restores this intuition by reverting the transaction when an + * operation overflows. + * + * Using this library instead of the unchecked operations eliminates an entire + * class of bugs, so it's recommended to use it always. + */ +library SafeMath { + /** + * @dev Returns the addition of two unsigned integers, with an overflow flag. + * + * _Available since v3.4._ + */ + function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) { + uint256 c = a + b; + if (c < a) return (false, 0); + return (true, c); + } + + /** + * @dev Returns the substraction of two unsigned integers, with an overflow flag. + * + * _Available since v3.4._ + */ + function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) { + if (b > a) return (false, 0); + return (true, a - b); + } + + /** + * @dev Returns the multiplication of two unsigned integers, with an overflow flag. + * + * _Available since v3.4._ + */ + function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) { + // Gas optimization: this is cheaper than requiring 'a' not being zero, but the + // benefit is lost if 'b' is also tested. + // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522 + if (a == 0) return (true, 0); + uint256 c = a * b; + if (c / a != b) return (false, 0); + return (true, c); + } + + /** + * @dev Returns the division of two unsigned integers, with a division by zero flag. + * + * _Available since v3.4._ + */ + function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) { + if (b == 0) return (false, 0); + return (true, a / b); + } + + /** + * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag. + * + * _Available since v3.4._ + */ + function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) { + if (b == 0) return (false, 0); + return (true, a % b); + } + + /** + * @dev Returns the addition of two unsigned integers, reverting on + * overflow. + * + * Counterpart to Solidity's `+` operator. + * + * Requirements: + * + * - Addition cannot overflow. + */ + function add(uint256 a, uint256 b) internal pure returns (uint256) { + uint256 c = a + b; + require(c >= a, "SafeMath: addition overflow"); + return c; + } + + /** + * @dev Returns the subtraction of two unsigned integers, reverting on + * overflow (when the result is negative). + * + * Counterpart to Solidity's `-` operator. + * + * Requirements: + * + * - Subtraction cannot overflow. + */ + function sub(uint256 a, uint256 b) internal pure returns (uint256) { + require(b <= a, "SafeMath: subtraction overflow"); + return a - b; + } + + /** + * @dev Returns the multiplication of two unsigned integers, reverting on + * overflow. + * + * Counterpart to Solidity's `*` operator. + * + * Requirements: + * + * - Multiplication cannot overflow. + */ + function mul(uint256 a, uint256 b) internal pure returns (uint256) { + if (a == 0) return 0; + uint256 c = a * b; + require(c / a == b, "SafeMath: multiplication overflow"); + return c; + } + + /** + * @dev Returns the integer division of two unsigned integers, reverting on + * division by zero. The result is rounded towards zero. + * + * Counterpart to Solidity's `/` operator. Note: this function uses a + * `revert` opcode (which leaves remaining gas untouched) while Solidity + * uses an invalid opcode to revert (consuming all remaining gas). + * + * Requirements: + * + * - The divisor cannot be zero. + */ + function div(uint256 a, uint256 b) internal pure returns (uint256) { + require(b > 0, "SafeMath: division by zero"); + return a / b; + } + + /** + * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), + * reverting when dividing by zero. + * + * Counterpart to Solidity's `%` operator. This function uses a `revert` + * opcode (which leaves remaining gas untouched) while Solidity uses an + * invalid opcode to revert (consuming all remaining gas). + * + * Requirements: + * + * - The divisor cannot be zero. + */ + function mod(uint256 a, uint256 b) internal pure returns (uint256) { + require(b > 0, "SafeMath: modulo by zero"); + return a % b; + } + + /** + * @dev Returns the subtraction of two unsigned integers, reverting with custom message on + * overflow (when the result is negative). + * + * CAUTION: This function is deprecated because it requires allocating memory for the error + * message unnecessarily. For custom revert reasons use {trySub}. + * + * Counterpart to Solidity's `-` operator. + * + * Requirements: + * + * - Subtraction cannot overflow. + */ + function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { + require(b <= a, errorMessage); + return a - b; + } + + /** + * @dev Returns the integer division of two unsigned integers, reverting with custom message on + * division by zero. The result is rounded towards zero. + * + * CAUTION: This function is deprecated because it requires allocating memory for the error + * message unnecessarily. For custom revert reasons use {tryDiv}. + * + * Counterpart to Solidity's `/` operator. Note: this function uses a + * `revert` opcode (which leaves remaining gas untouched) while Solidity + * uses an invalid opcode to revert (consuming all remaining gas). + * + * Requirements: + * + * - The divisor cannot be zero. + */ + function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { + require(b > 0, errorMessage); + return a / b; + } + + /** + * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo), + * reverting with custom message when dividing by zero. + * + * CAUTION: This function is deprecated because it requires allocating memory for the error + * message unnecessarily. For custom revert reasons use {tryMod}. + * + * Counterpart to Solidity's `%` operator. This function uses a `revert` + * opcode (which leaves remaining gas untouched) while Solidity uses an + * invalid opcode to revert (consuming all remaining gas). + * + * Requirements: + * + * - The divisor cannot be zero. + */ + function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) { + require(b > 0, errorMessage); + return a % b; + } +} + +// contracts/minting/Controller.sol +/** + * Copyright 2023 Circle Internet Group, Inc. All rights reserved. + * + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @title Controller + * @notice Generic implementation of the owner-controller-worker model. + * One owner manages many controllers. Each controller manages one worker. + * Workers may be reused across different controllers. + */ +contract Controller is Ownable { + /** + * @dev A controller manages a single worker address. + * controllers[controller] = worker + */ + mapping(address => address) internal controllers; + + event ControllerConfigured( + address indexed _controller, + address indexed _worker + ); + event ControllerRemoved(address indexed _controller); + + /** + * @notice Ensures that caller is the controller of a non-zero worker + * address. + */ + modifier onlyController() { + require( + controllers[msg.sender] != address(0), + "The value of controllers[msg.sender] must be non-zero" + ); + _; + } + + /** + * @notice Gets the worker at address _controller. + */ + function getWorker(address _controller) external view returns (address) { + return controllers[_controller]; + } + + // onlyOwner functions + + /** + * @notice Configure a controller with the given worker. + * @param _controller The controller to be configured with a worker. + * @param _worker The worker to be set for the newly configured controller. + * _worker must not be a non-zero address. To disable a worker, + * use removeController instead. + */ + function configureController(address _controller, address _worker) + public + onlyOwner + { + require( + _controller != address(0), + "Controller must be a non-zero address" + ); + require(_worker != address(0), "Worker must be a non-zero address"); + controllers[_controller] = _worker; + emit ControllerConfigured(_controller, _worker); + } + + /** + * @notice disables a controller by setting its worker to address(0). + * @param _controller The controller to disable. + */ + function removeController(address _controller) public onlyOwner { + require( + _controller != address(0), + "Controller must be a non-zero address" + ); + require( + controllers[_controller] != address(0), + "Worker must be a non-zero address" + ); + controllers[_controller] = address(0); + emit ControllerRemoved(_controller); + } +} + +// contracts/minting/MintController.sol +/** + * Copyright 2023 Circle Internet Group, Inc. All rights reserved. + * + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +// solhint-disable func-name-mixedcase + +/** + * @title MintController + * @dev The MintController contract manages minters for a contract that + * implements the MinterManagerInterface. It lets the owner designate certain + * addresses as controllers, and these controllers then manage the + * minters by adding and removing minters, as well as modifying their minting + * allowance. A controller may manage exactly one minter, but the same minter + * address may be managed by multiple controllers. + * MintController inherits from the Controller contract. It treats the + * Controller workers as minters. + */ +contract MintController is Controller { + using SafeMath for uint256; + + /** + * @dev MintController calls the minterManager to execute/record minter + * management tasks, as well as to query the status of a minter address. + */ + MinterManagementInterface internal minterManager; + + event MinterManagerSet( + address indexed _oldMinterManager, + address indexed _newMinterManager + ); + event MinterConfigured( + address indexed _msgSender, + address indexed _minter, + uint256 _allowance + ); + event MinterRemoved(address indexed _msgSender, address indexed _minter); + event MinterAllowanceIncremented( + address indexed _msgSender, + address indexed _minter, + uint256 _increment, + uint256 _newAllowance + ); + + event MinterAllowanceDecremented( + address indexed msgSender, + address indexed minter, + uint256 decrement, + uint256 newAllowance + ); + + /** + * @notice Initializes the minterManager. + * @param _minterManager The address of the minterManager contract. + */ + constructor(address _minterManager) public { + minterManager = MinterManagementInterface(_minterManager); + } + + /** + * @notice gets the minterManager + */ + function getMinterManager() + external + view + returns (MinterManagementInterface) + { + return minterManager; + } + + // onlyOwner functions + + /** + * @notice Sets the minterManager. + * @param _newMinterManager The address of the new minterManager contract. + */ + function setMinterManager(address _newMinterManager) public onlyOwner { + emit MinterManagerSet(address(minterManager), _newMinterManager); + minterManager = MinterManagementInterface(_newMinterManager); + } + + // onlyController functions + + /** + * @notice Removes the controller's own minter. + */ + function removeMinter() public onlyController returns (bool) { + address minter = controllers[msg.sender]; + emit MinterRemoved(msg.sender, minter); + return minterManager.removeMinter(minter); + } + + /** + * @notice Enables the minter and sets its allowance. + * @param _newAllowance New allowance to be set for minter. + */ + function configureMinter(uint256 _newAllowance) + public + onlyController + returns (bool) + { + address minter = controllers[msg.sender]; + emit MinterConfigured(msg.sender, minter, _newAllowance); + return internal_setMinterAllowance(minter, _newAllowance); + } + + /** + * @notice Increases the minter's allowance if and only if the minter is an + * active minter. + * @dev An minter is considered active if minterManager.isMinter(minter) + * returns true. + */ + function incrementMinterAllowance(uint256 _allowanceIncrement) + public + onlyController + returns (bool) + { + require( + _allowanceIncrement > 0, + "Allowance increment must be greater than 0" + ); + address minter = controllers[msg.sender]; + require( + minterManager.isMinter(minter), + "Can only increment allowance for minters in minterManager" + ); + + uint256 currentAllowance = minterManager.minterAllowance(minter); + uint256 newAllowance = currentAllowance.add(_allowanceIncrement); + + emit MinterAllowanceIncremented( + msg.sender, + minter, + _allowanceIncrement, + newAllowance + ); + + return internal_setMinterAllowance(minter, newAllowance); + } + + /** + * @notice decreases the minter allowance if and only if the minter is + * currently active. The controller can safely send a signed + * decrementMinterAllowance() transaction to a minter and not worry + * about it being used to undo a removeMinter() transaction. + */ + function decrementMinterAllowance(uint256 _allowanceDecrement) + public + onlyController + returns (bool) + { + require( + _allowanceDecrement > 0, + "Allowance decrement must be greater than 0" + ); + address minter = controllers[msg.sender]; + require( + minterManager.isMinter(minter), + "Can only decrement allowance for minters in minterManager" + ); + + uint256 currentAllowance = minterManager.minterAllowance(minter); + uint256 actualAllowanceDecrement = ( + currentAllowance > _allowanceDecrement + ? _allowanceDecrement + : currentAllowance + ); + uint256 newAllowance = currentAllowance.sub(actualAllowanceDecrement); + + emit MinterAllowanceDecremented( + msg.sender, + minter, + actualAllowanceDecrement, + newAllowance + ); + + return internal_setMinterAllowance(minter, newAllowance); + } + + // Internal functions + + /** + * @notice Uses the MinterManagementInterface to enable the minter and + * set its allowance. + * @param _minter Minter to set new allowance of. + * @param _newAllowance New allowance to be set for minter. + */ + function internal_setMinterAllowance(address _minter, uint256 _newAllowance) + internal + returns (bool) + { + return minterManager.configureMinter(_minter, _newAllowance); + } +} + +// contracts/minting/MasterMinter.sol +/** + * Copyright 2023 Circle Internet Group, Inc. All rights reserved. + * + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @title MasterMinter + * @notice MasterMinter uses multiple controllers to manage minters for a + * contract that implements the MinterManagerInterface. + * @dev MasterMinter inherits all its functionality from MintController. + */ +contract MasterMinter is MintController { + constructor(address _minterManager) public MintController(_minterManager) {} +} diff --git a/contracts/contracts/libraries/usdc/MigrationUSDC.sol b/contracts/contracts/libraries/usdc/MigrationUSDC.sol new file mode 100644 index 00000000..ffef27aa --- /dev/null +++ b/contracts/contracts/libraries/usdc/MigrationUSDC.sol @@ -0,0 +1,110 @@ +// SPDX-License-Identifier: MIT + +pragma solidity =0.8.24; + +import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import {PausableUpgradeable} from "@openzeppelin/contracts-upgradeable/security/PausableUpgradeable.sol"; +import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; +import {IERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/IERC20Upgradeable.sol"; +import {SafeERC20Upgradeable} from "@openzeppelin/contracts-upgradeable/token/ERC20/utils/SafeERC20Upgradeable.sol"; + +contract MigrationUSDC is OwnableUpgradeable, PausableUpgradeable, ReentrancyGuardUpgradeable { + using SafeERC20Upgradeable for IERC20Upgradeable; + + error ErrZeroAddress(); + + /// @dev Thrown the token balance is zero. + error ErrorTokenBalanceZero(); + + event Migrate(address indexed user, uint256 amount); + event Transfer(address indexed token, address indexed to, uint256 amount); + event UpdateRecipient(address indexed oldRecipient, address indexed newRecipient); + + /// @notice The address of old USDC address. + address public immutable OLD_USDC; + + /// @notice The address of new USDC address. + address public immutable NEW_USDC; + + /// @notice Wallet that will receive the tokens on L2. + address public recipient; + + /*************** + * Constructor * + ***************/ + /// @notice Constructor for `MigrationUSDC` implementation contract. + /// + /// @param _oldUSDC The address of old USDC in L2. + /// @param _newUSDC The address of new USDC in L2. + constructor(address _oldUSDC, address _newUSDC) { + _disableInitializers(); + + OLD_USDC = _oldUSDC; + NEW_USDC = _newUSDC; + } + + // initialize contract status + function initialize(address _recipient) external initializer { + if (_recipient == address(0)) { + revert ErrZeroAddress(); + } + recipient = _recipient; + + __Ownable_init(); + __Pausable_init(); + __ReentrancyGuard_init(); + + emit UpdateRecipient(address(0), recipient); + } + + // Transfer all old USDC to this contract and then transfer new USDC token to msg sender. + function migrate() external nonReentrant whenNotPaused { + // Get old USDC balance. + uint256 balance = IERC20Upgradeable(OLD_USDC).balanceOf(_msgSender()); + if (balance == 0) { + revert ErrorTokenBalanceZero(); + } + // Transfer token into this contract. + IERC20Upgradeable(OLD_USDC).safeTransferFrom(_msgSender(), address(this), balance); + // Transfer new USDC token to msg sender. + IERC20Upgradeable(NEW_USDC).transfer(_msgSender(), balance); + emit Migrate(_msgSender(), balance); + } + + // Transfer token to other address. + function transferToken(address _token, uint256 _amount) external onlyOwner { + if (recipient == address(0)) { + revert ErrZeroAddress(); + } + uint256 balance = IERC20Upgradeable(_token).balanceOf(address(this)); + if (balance == 0) { + revert ErrorTokenBalanceZero(); + } + // transfer all token + if (balance < _amount) { + _amount = balance; + } + // Transfer token. + IERC20Upgradeable(_token).transfer(recipient, _amount); + emit Transfer(_token, recipient, _amount); + } + + // Update the address of recipient. + function updateRecipient(address _newRecipient) external onlyOwner { + address _oldRecipient = recipient; + recipient = _newRecipient; + + emit UpdateRecipient(_oldRecipient, _newRecipient); + } + + // Change pause status + function setPause(bool status) external onlyOwner { + if (status) { + _requireNotPaused(); + _pause(); + } else { + _requirePaused(); + _unpause(); + } + } +} diff --git a/contracts/contracts/libraries/usdc/SignatureChecker.sol.flatten b/contracts/contracts/libraries/usdc/SignatureChecker.sol.flatten new file mode 100644 index 00000000..5f3ef055 --- /dev/null +++ b/contracts/contracts/libraries/usdc/SignatureChecker.sol.flatten @@ -0,0 +1,219 @@ +// SPDX-License-Identifier: Apache-2.0 +pragma solidity =0.6.12; + +// contracts/interface/IERC1271.sol +/** + * Copyright 2023 Circle Internet Group, Inc. All rights reserved. + * + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @dev Interface of the ERC1271 standard signature validation method for + * contracts as defined in https://eips.ethereum.org/EIPS/eip-1271[ERC-1271]. + */ +interface IERC1271 { + /** + * @dev Should return whether the signature provided is valid for the provided data + * @param hash Hash of the data to be signed + * @param signature Signature byte array associated with the provided data hash + * @return magicValue bytes4 magic value 0x1626ba7e when function passes + */ + function isValidSignature(bytes32 hash, bytes memory signature) + external + view + returns (bytes4 magicValue); +} + +// contracts/util/ECRecover.sol +/** + * Copyright 2023 Circle Internet Group, Inc. All rights reserved. + * + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @title ECRecover + * @notice A library that provides a safe ECDSA recovery function + */ +library ECRecover { + /** + * @notice Recover signer's address from a signed message + * @dev Adapted from: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/65e4ffde586ec89af3b7e9140bdc9235d1254853/contracts/cryptography/ECDSA.sol + * Modifications: Accept v, r, and s as separate arguments + * @param digest Keccak-256 hash digest of the signed message + * @param v v of the signature + * @param r r of the signature + * @param s s of the signature + * @return Signer address + */ + function recover( + bytes32 digest, + uint8 v, + bytes32 r, + bytes32 s + ) internal pure returns (address) { + // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature + // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines + // the valid range for s in (281): 0 < s < secp256k1n ÷ 2 + 1, and for v in (282): v ∈ {27, 28}. Most + // signatures from current libraries generate a unique signature with an s-value in the lower half order. + // + // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value + // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or + // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept + // these malleable signatures as well. + if ( + uint256(s) > + 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0 + ) { + revert("ECRecover: invalid signature 's' value"); + } + + if (v != 27 && v != 28) { + revert("ECRecover: invalid signature 'v' value"); + } + + // If the signature is valid (and not malleable), return the signer address + address signer = ecrecover(digest, v, r, s); + require(signer != address(0), "ECRecover: invalid signature"); + + return signer; + } + + /** + * @notice Recover signer's address from a signed message + * @dev Adapted from: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/0053ee040a7ff1dbc39691c9e67a69f564930a88/contracts/utils/cryptography/ECDSA.sol + * @param digest Keccak-256 hash digest of the signed message + * @param signature Signature byte array associated with hash + * @return Signer address + */ + function recover(bytes32 digest, bytes memory signature) + internal + pure + returns (address) + { + require(signature.length == 65, "ECRecover: invalid signature length"); + + bytes32 r; + bytes32 s; + uint8 v; + + // ecrecover takes the signature parameters, and the only way to get them + // currently is to use assembly. + /// @solidity memory-safe-assembly + assembly { + r := mload(add(signature, 0x20)) + s := mload(add(signature, 0x40)) + v := byte(0, mload(add(signature, 0x60))) + } + return recover(digest, v, r, s); + } +} + +// contracts/util/SignatureChecker.sol +/** + * Copyright 2023 Circle Internet Group, Inc. All rights reserved. + * + + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/** + * @dev Signature verification helper that can be used instead of `ECRecover.recover` to seamlessly support both ECDSA + * signatures from externally owned accounts (EOAs) as well as ERC1271 signatures from smart contract wallets. + * + * Adapted from https://github.com/OpenZeppelin/openzeppelin-contracts/blob/21bb89ef5bfc789b9333eb05e3ba2b7b284ac77c/contracts/utils/cryptography/SignatureChecker.sol + */ +library SignatureChecker { + /** + * @dev Checks if a signature is valid for a given signer and data hash. If the signer is a smart contract, the + * signature is validated against that smart contract using ERC1271, otherwise it's validated using `ECRecover.recover`. + * @param signer Address of the claimed signer + * @param digest Keccak-256 hash digest of the signed message + * @param signature Signature byte array associated with hash + */ + function isValidSignatureNow( + address signer, + bytes32 digest, + bytes memory signature + ) external view returns (bool) { + if (!isContract(signer)) { + return ECRecover.recover(digest, signature) == signer; + } + return isValidERC1271SignatureNow(signer, digest, signature); + } + + /** + * @dev Checks if a signature is valid for a given signer and data hash. The signature is validated + * against the signer smart contract using ERC1271. + * @param signer Address of the claimed signer + * @param digest Keccak-256 hash digest of the signed message + * @param signature Signature byte array associated with hash + * + * NOTE: Unlike ECDSA signatures, contract signatures are revocable, and the outcome of this function can thus + * change through time. It could return true at block N and false at block N+1 (or the opposite). + */ + function isValidERC1271SignatureNow( + address signer, + bytes32 digest, + bytes memory signature + ) internal view returns (bool) { + (bool success, bytes memory result) = signer.staticcall( + abi.encodeWithSelector( + IERC1271.isValidSignature.selector, + digest, + signature + ) + ); + return (success && + result.length >= 32 && + abi.decode(result, (bytes32)) == + bytes32(IERC1271.isValidSignature.selector)); + } + + /** + * @dev Checks if the input address is a smart contract. + */ + function isContract(address addr) internal view returns (bool) { + uint256 size; + assembly { + size := extcodesize(addr) + } + return size > 0; + } +} diff --git a/contracts/contracts/libraries/verifier/IRollupVerifier.sol b/contracts/contracts/libraries/verifier/IRollupVerifier.sol index 29473e6f..de9e5609 100644 --- a/contracts/contracts/libraries/verifier/IRollupVerifier.sol +++ b/contracts/contracts/libraries/verifier/IRollupVerifier.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity =0.8.24; interface IRollupVerifier { /// @notice Verify aggregate zk proof. diff --git a/contracts/contracts/libraries/verifier/ISP1Verifier.sol b/contracts/contracts/libraries/verifier/ISP1Verifier.sol index 328089f2..8c1bccf5 100644 --- a/contracts/contracts/libraries/verifier/ISP1Verifier.sol +++ b/contracts/contracts/libraries/verifier/ISP1Verifier.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.20; +pragma solidity =0.8.24; /// @title SP1 Verifier Interface /// @notice This contract is the interface for the SP1 Verifier. @@ -16,4 +16,4 @@ interface ISP1Verifier { interface ISP1VerifierWithHash is ISP1Verifier { /// @notice Returns the hash of the verifier. function VERIFIER_HASH() external pure returns (bytes32); -} \ No newline at end of file +} diff --git a/contracts/contracts/libraries/verifier/IZkEvmVerifier.sol b/contracts/contracts/libraries/verifier/IZkEvmVerifier.sol index 40d5bab1..07f0bad8 100644 --- a/contracts/contracts/libraries/verifier/IZkEvmVerifier.sol +++ b/contracts/contracts/libraries/verifier/IZkEvmVerifier.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity =0.8.24; interface IZkEvmVerifier { /// @notice Verify aggregate zk proof. diff --git a/contracts/contracts/libraries/verifier/PlonkVerifier.sol b/contracts/contracts/libraries/verifier/PlonkVerifier.sol index 087c25f8..cae70f26 100644 --- a/contracts/contracts/libraries/verifier/PlonkVerifier.sol +++ b/contracts/contracts/libraries/verifier/PlonkVerifier.sol @@ -16,7 +16,7 @@ // Code generated by gnark DO NOT EDIT -pragma solidity ^0.8.19; +pragma solidity =0.8.24; contract PlonkVerifier { diff --git a/contracts/contracts/libraries/verifier/RollupVerifier.sol b/contracts/contracts/libraries/verifier/RollupVerifier.sol index 70326e60..b0db9018 100644 --- a/contracts/contracts/libraries/verifier/RollupVerifier.sol +++ b/contracts/contracts/libraries/verifier/RollupVerifier.sol @@ -1,6 +1,6 @@ -// SPDX-License-Identifier: GPL-3.0 +// SPDX-License-Identifier: MIT -pragma solidity ^0.8.16; +pragma solidity =0.8.24; /* solhint-disable */ library RollupVerifier { diff --git a/contracts/contracts/libraries/verifier/SP1VerifierPlonk.sol b/contracts/contracts/libraries/verifier/SP1VerifierPlonk.sol index d63fb5cf..ee2ae0a0 100644 --- a/contracts/contracts/libraries/verifier/SP1VerifierPlonk.sol +++ b/contracts/contracts/libraries/verifier/SP1VerifierPlonk.sol @@ -1,5 +1,5 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.20; +pragma solidity =0.8.24; import {ISP1Verifier, ISP1VerifierWithHash} from "./ISP1Verifier.sol"; import {PlonkVerifier} from "./PlonkVerifier.sol"; @@ -23,9 +23,7 @@ contract SP1Verifier is PlonkVerifier, ISP1VerifierWithHash { /// @notice Hashes the public values to a field elements inside Bn254. /// @param publicValues The public values. - function hashPublicValues( - bytes calldata publicValues - ) public pure returns (bytes32) { + function hashPublicValues(bytes calldata publicValues) public pure returns (bytes32) { return sha256(publicValues) & bytes32(uint256((1 << 253) - 1)); } @@ -33,11 +31,7 @@ contract SP1Verifier is PlonkVerifier, ISP1VerifierWithHash { /// @param programVKey The verification key for the RISC-V program. /// @param publicValues The public values encoded as bytes. /// @param proofBytes The proof of the program execution the SP1 zkVM encoded as bytes. - function verifyProof( - bytes32 programVKey, - bytes calldata publicValues, - bytes calldata proofBytes - ) external view { + function verifyProof(bytes32 programVKey, bytes calldata publicValues, bytes calldata proofBytes) external view { bytes4 receivedSelector = bytes4(proofBytes[:4]); bytes4 expectedSelector = bytes4(VERIFIER_HASH()); if (receivedSelector != expectedSelector) { @@ -53,4 +47,4 @@ contract SP1Verifier is PlonkVerifier, ISP1VerifierWithHash { revert InvalidProof(); } } -} \ No newline at end of file +} diff --git a/contracts/contracts/libraries/verifier/ZkEvmVerifierV1.sol b/contracts/contracts/libraries/verifier/ZkEvmVerifierV1.sol index 2bae6e30..52da6a8c 100644 --- a/contracts/contracts/libraries/verifier/ZkEvmVerifierV1.sol +++ b/contracts/contracts/libraries/verifier/ZkEvmVerifierV1.sol @@ -7,7 +7,6 @@ import {SP1Verifier} from "./SP1VerifierPlonk.sol"; // solhint-disable no-inline-assembly contract ZkEvmVerifierV1 is IZkEvmVerifier, SP1Verifier { - /// @notice The verification key for the morph executor program. bytes32 public programVkey; diff --git a/contracts/contracts/lido/L1LidoGateway.sol b/contracts/contracts/lido/L1LidoGateway.sol index 444a01ff..39c1c3fe 100644 --- a/contracts/contracts/lido/L1LidoGateway.sol +++ b/contracts/contracts/lido/L1LidoGateway.sol @@ -11,6 +11,9 @@ import {GatewayBase} from "../libraries/gateway/GatewayBase.sol"; import {LidoBridgeableTokens} from "./LidoBridgeableTokens.sol"; import {LidoGatewayManager} from "./LidoGatewayManager.sol"; +/** + * @custom:security-contact official@morphl2.io + */ contract L1LidoGateway is L1ERC20Gateway, LidoBridgeableTokens, LidoGatewayManager { /********** * Errors * @@ -39,8 +42,9 @@ contract L1LidoGateway is L1ERC20Gateway, LidoBridgeableTokens, LidoGatewayManag /// @param _l1Token The address of the bridged token in the L1 chain /// @param _l2Token The address of the token minted on the L2 chain when token bridged constructor(address _l1Token, address _l2Token) LidoBridgeableTokens(_l1Token, _l2Token) { - require(_l1Token != address(0), "zero l1token address"); - require(_l2Token != address(0), "zero l2Token address"); + if (_l1Token == address(0) || _l2Token ==address(0)){ + revert ErrorZeroAddress(); + } _disableInitializers(); } @@ -121,16 +125,17 @@ contract L1LidoGateway is L1ERC20Gateway, LidoBridgeableTokens, LidoGatewayManag if (_data.length != 0) revert DepositAndCallIsNotAllowed(); // 2. Generate message passed to L2LidoGateway. + address _l2Token = l2Token; bytes memory _message = abi.encodeCall( IL2ERC20Gateway.finalizeDepositERC20, - (_token, l2Token, _from, _to, _amount, _data) + (_token, _l2Token, _from, _to, _amount, _data) ); uint256 nonce = IL1CrossDomainMessenger(messenger).messageNonce(); - // 3. Send message to L1CrossDomainMessenger. + // 3. Send message to L1CrossDomainMessenger. IL1CrossDomainMessenger(messenger).sendMessage{value: msg.value}(counterpart, 0, _message, _gasLimit, _from); - emit DepositERC20(_token, l2Token, _from, _to, _amount, _data, nonce); + emit DepositERC20(_token, _l2Token, _from, _to, _amount, _data, nonce); } } diff --git a/contracts/contracts/lido/L2LidoGateway.sol b/contracts/contracts/lido/L2LidoGateway.sol index 8ac046d8..da075c74 100644 --- a/contracts/contracts/lido/L2LidoGateway.sol +++ b/contracts/contracts/lido/L2LidoGateway.sol @@ -12,6 +12,9 @@ import {GatewayBase} from "../libraries/gateway/GatewayBase.sol"; import {LidoBridgeableTokens} from "./LidoBridgeableTokens.sol"; import {LidoGatewayManager} from "./LidoGatewayManager.sol"; +/** + * @custom:security-contact official@morphl2.io + */ contract L2LidoGateway is L2ERC20Gateway, LidoBridgeableTokens, LidoGatewayManager { /********** * Errors * @@ -40,8 +43,9 @@ contract L2LidoGateway is L2ERC20Gateway, LidoBridgeableTokens, LidoGatewayManag /// @param _l1Token The address of the bridged token in the L1 chain /// @param _l2Token The address of the token minted on the L2 chain when token bridged constructor(address _l1Token, address _l2Token) LidoBridgeableTokens(_l1Token, _l2Token) { - require(_l1Token != address(0), "zero l1token address"); - require(_l2Token != address(0), "zero l2Token address"); + if (_l1Token == address(0) || _l2Token ==address(0)){ + revert ErrorZeroAddress(); + } _disableInitializers(); } @@ -59,7 +63,7 @@ contract L2LidoGateway is L2ERC20Gateway, LidoBridgeableTokens, LidoGatewayManag /// @notice Initialize the storage of L2LidoGateway v2. /// @param _depositsEnabler The address of user who can enable deposits - /// @param _depositsEnabler The address of user who can disable deposits + /// @param _depositsDisabler The address of user who can disable deposits /// @param _withdrawalsEnabler The address of user who can enable withdrawals /// @param _withdrawalsDisabler The address of user who can disable withdrawals function initializeV2( @@ -152,9 +156,10 @@ contract L2LidoGateway is L2ERC20Gateway, LidoBridgeableTokens, LidoGatewayManag IMorphERC20Upgradeable(_l2Token).burn(_from, _amount); // 3. Generate message passed to L1LidoGateway. + address _l1Token = l1Token; bytes memory _message = abi.encodeCall( IL1ERC20Gateway.finalizeWithdrawERC20, - (l1Token, _l2Token, _from, _to, _amount, _data) + (_l1Token, _l2Token, _from, _to, _amount, _data) ); uint256 nonce = IL2CrossDomainMessenger(messenger).messageNonce(); @@ -162,6 +167,6 @@ contract L2LidoGateway is L2ERC20Gateway, LidoBridgeableTokens, LidoGatewayManag // 4. send message to L2CrossDomainMessenger IL2CrossDomainMessenger(messenger).sendMessage{value: msg.value}(counterpart, 0, _message, _gasLimit); - emit WithdrawERC20(l1Token, _l2Token, _from, _to, _amount, _data, nonce); + emit WithdrawERC20(_l1Token, _l2Token, _from, _to, _amount, _data, nonce); } } diff --git a/contracts/contracts/lido/L2WstETHToken.sol b/contracts/contracts/lido/L2WstETHToken.sol index fcf76408..e79a3852 100644 --- a/contracts/contracts/lido/L2WstETHToken.sol +++ b/contracts/contracts/lido/L2WstETHToken.sol @@ -8,7 +8,20 @@ import {SignatureCheckerUpgradeable} from "@openzeppelin/contracts-upgradeable/u import {MorphStandardERC20} from "../libraries/token/MorphStandardERC20.sol"; +/** + * @custom:security-contact official@morphl2.io + */ contract L2WstETHToken is MorphStandardERC20 { + /********** + * Errors * + **********/ + + /// @dev Thrown when the deadline is expired. + error ErrorExpiredDeadline(); + + /// @dev Thrown when the given signature is invalid. + error ErrorInvalidSignature(); + /************* * Constants * *************/ @@ -33,16 +46,16 @@ contract L2WstETHToken is MorphStandardERC20 { bytes32 r, bytes32 s ) public virtual override(ERC20PermitUpgradeable, IERC20PermitUpgradeable) { - require(block.timestamp <= deadline, "ERC20Permit: expired deadline"); - + if (block.timestamp > deadline) { + revert ErrorExpiredDeadline(); + } bytes32 structHash = keccak256(abi.encode(_PERMIT_TYPEHASH, owner, spender, value, _useNonce(owner), deadline)); bytes32 hash = _hashTypedDataV4(structHash); - require( - SignatureCheckerUpgradeable.isValidSignatureNow(owner, hash, abi.encodePacked(r, s, v)), - "ERC20Permit: invalid signature" - ); + if (!SignatureCheckerUpgradeable.isValidSignatureNow(owner, hash, abi.encodePacked(r, s, v))){ + revert ErrorInvalidSignature(); + } _approve(owner, spender, value); } diff --git a/contracts/contracts/lido/LidoBridgeableTokens.sol b/contracts/contracts/lido/LidoBridgeableTokens.sol index 2da95ba1..806d43c4 100644 --- a/contracts/contracts/lido/LidoBridgeableTokens.sol +++ b/contracts/contracts/lido/LidoBridgeableTokens.sol @@ -2,6 +2,9 @@ pragma solidity =0.8.24; +/** + * @custom:security-contact official@morphl2.io + */ abstract contract LidoBridgeableTokens { /************* * Constants * @@ -17,6 +20,9 @@ abstract contract LidoBridgeableTokens { * Errors * **********/ + /// @dev Thrown when the given address is `address(0)`. + error ErrorZeroAddress(); + /// @dev Thrown the given `l1Token` is not supported. error ErrorUnsupportedL1Token(); diff --git a/contracts/contracts/lido/LidoGatewayManager.sol b/contracts/contracts/lido/LidoGatewayManager.sol index b70e7883..f9d1247b 100644 --- a/contracts/contracts/lido/LidoGatewayManager.sol +++ b/contracts/contracts/lido/LidoGatewayManager.sol @@ -8,6 +8,9 @@ import {GatewayBase} from "../libraries/gateway/GatewayBase.sol"; // solhint-disable func-name-mixedcase +/** + * @custom:security-contact official@morphl2.io + */ abstract contract LidoGatewayManager is GatewayBase { using EnumerableSetUpgradeable for EnumerableSetUpgradeable.AddressSet; @@ -128,7 +131,7 @@ abstract contract LidoGatewayManager is GatewayBase { /// @notice Initialize the storage of LidoGatewayManager. /// @param _depositsEnabler The address of user who can enable deposits - /// @param _depositsEnabler The address of user who can disable deposits + /// @param _depositsDisabler The address of user who can disable deposits /// @param _withdrawalsEnabler The address of user who can enable withdrawals /// @param _withdrawalsDisabler The address of user who can disable withdrawals function __LidoGatewayManager_init( diff --git a/contracts/contracts/lido/README.md b/contracts/contracts/lido/README.md new file mode 100644 index 00000000..6b453874 --- /dev/null +++ b/contracts/contracts/lido/README.md @@ -0,0 +1,112 @@ +# Lido's Morph Bridge + +The document outlines the process of bridging ERC20-compatible tokens between the Ethereum and Morph chains. + +This marks the initial phase of Lido's integration into the Morph protocol. The primary objective of this implementation is to establish a solid foundation for Lido's long-term expansion goals on the Morph chain. The broader vision for Lido's integration into Layer 2 solutions includes: + +- Bridging Lido's tokens from Layer 1 to Layer 2 chains +- Enabling instant ETH staking on Layer 2 chains, with users receiving stETH/wstETH immediately on the corresponding Layer 2 +- Maintaining a user experience on Layer 2 that closely resembles that of the Ethereum mainnet +At this stage, the implementation aims to deliver a scalable and reliable solution for Lido to bridge ERC20-compatible tokens between Morph and the Ethereum chain. + +## Security surface overview + +| Statement | Answer | +| -------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| It is possible to bridge wstETH forth and back using this bridge | Yes | +| The bridge using a canonical mechanism for message/value passing | Yes | +| The bridge is upgradeable | Yes | +| Upgrade authority for the bridge | Yes | +| Emergency pause/cancel mechanisms and their authorities | TBA | +| The bridged token support permits and ERC-1271 | Yes | +| Are the following things in the scope of this bridge deployment: | | +| - Passing the (w)stETH/USD price feed | No | +| - Passing Lido DAO governance decisions | [Lido DAO Agent](https://etherscan.io/address/0x3e40D73EB977Dc6a537aF587D48316feE66E9C8c) representation via [MorphBridgeExecutor](TBD) | +| Bridges are complicated in that the transaction can succeed on one side and fail on the other. What's the handling mechanism for this issue? | TBA | +| Is there a deployment script that sets all the parameters and authorities correctly? | No, we use hardhat tasks to deploy and perform related permission operations after the test is completed. | +| Is there a post-deploy check script that, given a deployment, checks that all parameters and authorities are set correctly? | No | + +## Morph's Bridging Flow + +The default Morph bridging solution consists of two components: `L1StandardERC20Gateway` and `L2StandardERC20Gateway`. These contracts facilitate the bridging of ERC20 tokens between the Ethereum and Morph chains. + +In the standard bridge, when an ERC20 token is deposited on Layer 1 and sent to the bridge contract, it is "locked" there while an equivalent amount of the L2 token is minted. For withdrawals, the process is reversed: the L2 token amount is burned, and the same amount of L1 tokens is sent to the recipient. + +While the default Morph bridge meets Lido's short-term goal of bridging the wstETH token into Morph, it poses challenges for achieving long-term objectives. For instance, implementing staking from Layer 2 will likely require modifications to both the token and gateway implementations. + +Moreover, Morph offers the flexibility to create a custom bridge solution using the same cross-domain infrastructure as the standard bridge. The only requirement for a custom bridge to be compatible with the default Morph Gateway is the implementation of the `IL1ERC20Gateway` and `IL2ERC20Gateway` interfaces. + +The remainder of the document includes technical specifications for the bridge that Lido will use to transfer tokens between the Ethereum and Morph chains. + + +## Lido's Bridge Implementation + +The current implementation of the token bridge enables the transfer of ERC20-compatible tokens between Ethereum and Morph chains. It also includes administrative features, such as the ability to temporarily disable deposits and withdrawals. This functionality is crucial for quickly addressing potential malicious activities or vulnerabilities within the contracts, as well as facilitating the upgrade process. + +The technical implementation prioritizes the following requirements for the contracts: + +- **Scalability**: The current design must allow for future extensions and new functionalities. +- **Simplicity**: The contracts should be clear, straightforward, and easy for future developers to understand and work with. +- **Gas Efficiency**: The solution should minimize gas costs for users while maintaining clarity and simplicity. + +A high-level overview of the proposed solution can be found in the diagram below: + + +![](https://i.imgur.com/rbIvCr6.png) + +- [**`LidoGatewayManager`**](./LidoGatewayManager.sol): This contract includes administrative methods to manage and monitor the state of the bridging process. +- [**`LidoBridgeableTokens`**](./LidoBridgeableTokens.sol) : This contract implements the logic for validating tokens involved in the bridging process. +- [**`L1LidoGateway`**](./L1LidoGateway.sol): This contract serves as Ethereum's counterpart for bridging registered ERC20-compatible tokens between Ethereum and Morph chains. +- [**`L2LidoGateway`**](./L2LidoGateway.sol): This contract acts as Morph's counterpart for bridging registered ERC20-compatible tokens between Ethereum and Morph chains. +- [**`MorphStandardERC20`**](../libraries/token/MorphStandardERC20.sol): This is an implementation of the `ERC20` token, equipped with administrative methods for minting and burning tokens. +- [**`TransparentUpgradeableProxy`**](https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/proxy/transparent/TransparentUpgradeableProxy.sol) : This is an ERC1967 proxy that includes additional administrative functionalities. + +## Morph's Bridging Flow + +You can find the general process for bridging tokens through Morph's Lido bridge here: [ETH and ERC20 Token Bridge](https://docs.morphl2.io/docs/build-on-morph/build-on-morph/bridge-between-morph-and-ethereum). + +The goal of cross-chain governance is bridging the Lido DAO governance decisions, voted by the LDO holders on Ethereum, to Morph network. The main component of this bridge is MorphBridgeExecutor contract on L2, which queues the action sets sent from L1 Lido Agent through L1Executor. + +![](https://i.imgur.com/4cgEo63.png) + + +## Deployment Process + +To minimize gas costs for users, the `L1LidoGateway`, `L2LidoGateway`, and `MorphStandardERC20` contracts utilize immutable variables wherever possible. However, some of these variables reference each other; for instance, `L1LidoGateway` refers to `L2LidoGateway` and vice versa. By using proxies, we can initially deploy them without invoking the `initialize` function for each gateway, and then call the `initialize` function with the correct contract addresses. + +Alternatively, we could pre-calculate the future addresses of the deployed contracts off-chain and deploy the implementation using these pre-calculated addresses, but this approach is less fault-tolerant than the first option. + +## Integration Risks + +As an additional component in the token flow chain, the Morph protocol and bridges introduce potential points of failure. The main risks associated with the current integration are outlined below: + +### Minting of Uncollateralized L2 Tokens + +An attack could occur if an attacker gains access to call `L2LidoGateway.finalizeDepositERC20()` directly. In this scenario, they could mint uncollateralized tokens on L2 and later initiate a withdrawal. + +To detect such an attack, off-chain monitoring of minting and deposit/withdrawal events is essential. The following statistics can be tracked based on these events: + +- `l1ERC20TokenBridgedAmount`: Total number of tokens bridged on the L1 bridge contract. +- `l2TokenTotalSupply`: Total number of minted L2 tokens. +- `l2TokenNotFinalizedDeposit`: Total number of locked L1 tokens that have not been finalized and relayed from the L2 bridge. +- `l2TokenNotWithdrawn`: Total number of burned L2 tokens that have not been withdrawn from the L1 bridge. + +The following invariant must always hold true: `l1ERC20TokenBridgedAmount == l2TokenTotalSupply + l2TokenNotWithdrawn + l2TokenNotFinalizedDeposit`. + +If this invariant is violated, Lido will enter a dispute period to suspend both the L1 and L2 bridges. During this time, the bridges will be disabled, preventing the minting of L2 tokens and the withdrawal of minted tokens until the issue is resolved. + +### Attack on L1CrossDomainMessenger + +According to the Morph documentation, the `L1CrossDomainMessenger` contract sends messages from L1 to L2 and executes the challenged L2 messages in the `Rollup`. + +This contract plays a crucial role in L2-to-L1 communication, as all messages from L2 that are finalized by a challenger and verified by Merkle proof are executed on behalf of this contract. + +If there is a vulnerability in the `L1CrossDomainMessenger` or `Rollup` that allows an attacker to send arbitrary messages while bypassing the challenge and Merkle proof, they could potentially drain tokens from the L1 bridge. + +Additionally, the upgradeability of the `L1CrossDomainMessenger` and `Rollup` poses risks. An attacker could exploit this by replacing the implementation with malicious functionality, which could lead to the theft of all locked tokens on the L1 bridge. + +To respond swiftly to such an attack, Lido can implement monitoring of the Proxy contract to raise an alert in the event of an implementation upgrade. + +--- + +Feel free to ask if you need further adjustments or additional information! diff --git a/contracts/contracts/mock/BatchHeaderCodecTest.sol b/contracts/contracts/mock/BatchHeaderCodecTest.sol index 6bd6ea01..9b6206c8 100644 --- a/contracts/contracts/mock/BatchHeaderCodecTest.sol +++ b/contracts/contracts/mock/BatchHeaderCodecTest.sol @@ -111,7 +111,6 @@ contract BatchHeaderCodecTest { BatchHeaderCodecV0.storeWithdrawRootHash(_batchPtr, data.withdrawRootHash); BatchHeaderCodecV0.storeSequencerSetVerifyHash(_batchPtr, data.sequencerSetVerifyHash); BatchHeaderCodecV0.storeParentBatchHash(_batchPtr, data.parentBatchHash); - BatchHeaderCodecV0.storeSkippedBitmap(_batchPtr, data.skipMap); - return BatchHeaderCodecV0.computeBatchHash(_batchPtr, BatchHeaderCodecV0.BATCH_HEADER_FIXED_LENGTH); + return BatchHeaderCodecV0.computeBatchHash(_batchPtr, BatchHeaderCodecV0.BATCH_HEADER_LENGTH); } } diff --git a/contracts/contracts/mock/TestUpgrade.sol b/contracts/contracts/mock/TestUpgrade.sol index b814e62a..8904035c 100644 --- a/contracts/contracts/mock/TestUpgrade.sol +++ b/contracts/contracts/mock/TestUpgrade.sol @@ -1,6 +1,6 @@ // SPDX-License-Identifier: MIT -pragma solidity ^0.8.0; +pragma solidity =0.8.24; interface TestUpgrade { function va() external view returns (uint256); function vb() external view returns (uint256); diff --git a/contracts/contracts/test/Gov.t.sol b/contracts/contracts/test/Gov.t.sol index 0fec646f..e0b5482d 100644 --- a/contracts/contracts/test/Gov.t.sol +++ b/contracts/contracts/test/Gov.t.sol @@ -6,6 +6,8 @@ import {IGov} from "../l2/staking/IGov.sol"; import {Types} from "../libraries/common/Types.sol"; import {ICrossDomainMessenger} from "../libraries/ICrossDomainMessenger.sol"; +import "forge-std/console.sol"; + contract GovTest is L2StakingBaseTest { function setUp() public virtual override { super.setUp(); @@ -114,6 +116,7 @@ contract GovTest is L2StakingBaseTest { (expirationTime, executed) = gov.proposalInfos(proposalID); assertTrue(executed); assertEq(block.timestamp + VOTING_DURATION, expirationTime); + (finished, passed, executed) = gov.proposalStatus(proposalID); assertTrue(finished); assertTrue(passed); @@ -176,7 +179,7 @@ contract GovTest is L2StakingBaseTest { assertTrue(passed); assertTrue(executed); - hevm.expectRevert("voting has ended"); + hevm.expectRevert("expired proposalID"); hevm.prank(address(user)); gov.vote(proposalID); hevm.stopPrank(); @@ -230,10 +233,12 @@ contract GovTest is L2StakingBaseTest { abi.encode(address(l2Staking.OTHER_STAKING())) ); hevm.startPrank(address(l2CrossDomainMessenger)); + uint256 nonce = 0; for (uint256 i = SEQUENCER_SIZE; i < SEQUENCER_SIZE * 2; i++) { address staker = address(uint160(beginSeq + i)); Types.StakerInfo memory stakerInfo = ffi.generateStakerInfo(staker); - l2Staking.addStaker(stakerInfo); + l2Staking.addStaker(nonce, stakerInfo); + nonce++; } // remove old sequencer @@ -242,7 +247,7 @@ contract GovTest is L2StakingBaseTest { address staker = address(uint160(beginSeq + i)); removed[i] = staker; } - l2Staking.removeStakers(removed); + l2Staking.removeStakers(nonce, removed); hevm.stopPrank(); (, executed) = gov.proposalInfos(proposalID); @@ -433,6 +438,56 @@ contract GovTest is L2StakingBaseTest { hevm.stopPrank(); } + /** + * @notice delete old data: Reverts if invalid proposal ID + */ + function test_deleteOldData_reverts() external { + IGov.ProposalData memory proposal0 = IGov.ProposalData( + 0, // batchBlockInterval + finalizationPeriodSeconds, // batchTimeout + ROLLUP_EPOCH // rollupEpoch + ); + + // create proposal + address user = address(uint160(beginSeq)); + hevm.prank(address(user)); + uint256 proposalID = gov.createProposal(proposal0); + assertEq(proposalID, 1); + hevm.stopPrank(); + + for (uint256 i = 0; i < SEQUENCER_SIZE; i++) { + user = address(uint160(beginSeq + i)); + hevm.prank(address(user)); + gov.vote(proposalID); + hevm.stopPrank(); + assertTrue(gov.isVoted(proposalID, user)); + } + + uint256 expirationTime; + bool finished; + bool passed; + bool executed; + + (expirationTime, executed) = gov.proposalInfos(proposalID); + assertTrue(executed); + assertEq(block.timestamp + VOTING_DURATION, expirationTime); + (finished, passed, executed) = gov.proposalStatus(proposalID); + assertTrue(finished); + assertTrue(passed); + assertTrue(executed); + + assertEq(gov.batchBlockInterval(), 0); + assertEq(gov.batchTimeout(), finalizationPeriodSeconds); + assertEq(gov.rollupEpoch(), ROLLUP_EPOCH); + assertEq(gov.undeletedProposalStart(), 0); + + hevm.prank(address(user)); + uint256 latestExecutedProposalID = gov.latestExecutedProposalID(); + hevm.expectRevert("only allow to delete the proposal befor latest passed proposal"); + gov.cleanUpExpiredProposals(latestExecutedProposalID); + hevm.stopPrank(); + } + /** * @notice delete old data */ @@ -474,12 +529,13 @@ contract GovTest is L2StakingBaseTest { assertEq(gov.batchBlockInterval(), 0); assertEq(gov.batchTimeout(), finalizationPeriodSeconds); assertEq(gov.rollupEpoch(), ROLLUP_EPOCH); + assertEq(gov.undeletedProposalStart(), 0); - // undeletedProposalStart slot value is 109 - bytes32 undeletedProposalStartBytes32 = hevm.load(address(gov), bytes32(uint256(109))); - uint256 undeletedProposalStart = uint256(undeletedProposalStartBytes32); + hevm.prank(address(user)); + gov.cleanUpExpiredProposals(gov.latestExecutedProposalID() - 1); + hevm.stopPrank(); - assertEq(undeletedProposalStart, gov.currentProposalID()); + assertEq(gov.undeletedProposalStart(), 1); IGov.ProposalData memory proposal1 = IGov.ProposalData( 100, // batchBlockInterval @@ -510,11 +566,12 @@ contract GovTest is L2StakingBaseTest { assertTrue(passed); assertTrue(executed); - // undeletedProposalStart slot value is 109 - undeletedProposalStartBytes32 = hevm.load(address(gov), bytes32(uint256(109))); - undeletedProposalStart = uint256(undeletedProposalStartBytes32); + hevm.prank(address(user)); + gov.cleanUpExpiredProposals(gov.latestExecutedProposalID() - 1); + hevm.stopPrank(); - assertEq(undeletedProposalStart, gov.currentProposalID()); + assertEq(gov.undeletedProposalStart(), gov.currentProposalID()); + assertEq(gov.undeletedProposalStart(), 2); // test old data uint256 preProposalID = 1; diff --git a/contracts/contracts/test/L1CrossDomainMessenger.t.sol b/contracts/contracts/test/L1CrossDomainMessenger.t.sol index a3de0826..0dcb9f1f 100644 --- a/contracts/contracts/test/L1CrossDomainMessenger.t.sol +++ b/contracts/contracts/test/L1CrossDomainMessenger.t.sol @@ -427,69 +427,6 @@ contract L1CrossDomainMessengerTest is L1GatewayBaseTest { assertEq(nonce + 2, l1CrossDomainMessenger.messageNonce()); } - function test_dropMessage_notEnqueued_reverts() external { - address sender = address(this); - address to = address(bob); - bytes memory data = "send message"; - // hevm.deal(sender, 10 ether); - - // send value zero - uint256 value = 0; - uint256 nonce = l1MessageQueueWithGasPriceOracle.nextCrossDomainMessageIndex(); - - // Expect revert when the message has not been enqueued. - hevm.expectRevert("Provided message has not been enqueued"); - l1CrossDomainMessenger.dropMessage(sender, to, value, nonce, data); - } - - function test_dropMessage_succeeds(uint256 amount, address recipient, bytes memory dataToCall) public { - amount = bound(amount, 1, address(this).balance); - bytes memory message = abi.encodeCall( - IL2ETHGateway.finalizeDepositETH, - (address(this), recipient, amount, dataToCall) - ); - - l1ETHGateway.depositETHAndCall{value: amount}(recipient, amount, dataToCall, defaultGasLimit); - - // skip message 0 - hevm.startPrank(address(rollup)); - l1MessageQueueWithGasPriceOracle.popCrossDomainMessage(0, 1, 0x1); - assertEq(l1MessageQueueWithGasPriceOracle.pendingQueueIndex(), 1); - hevm.stopPrank(); - - // Drop message 0 and verify balance - revertOnReceive = false; - uint256 balance = address(this).balance; - l1CrossDomainMessenger.dropMessage(address(l1ETHGateway), address(counterpartGateway), amount, 0, message); - assertEq(balance + amount, address(this).balance); - } - - function test_dropMessage_dropAgain_reverts(uint256 amount, address recipient, bytes memory dataToCall) public { - amount = bound(amount, 1, address(this).balance); - bytes memory message = abi.encodeCall( - IL2ETHGateway.finalizeDepositETH, - (address(this), recipient, amount, dataToCall) - ); - - l1ETHGateway.depositETHAndCall{value: amount}(recipient, amount, dataToCall, defaultGasLimit); - - // skip message 0 - hevm.startPrank(address(rollup)); - l1MessageQueueWithGasPriceOracle.popCrossDomainMessage(0, 1, 0x1); - assertEq(l1MessageQueueWithGasPriceOracle.pendingQueueIndex(), 1); - hevm.stopPrank(); - - // Drop message 0 and verify balance - revertOnReceive = false; - uint256 balance = address(this).balance; - l1CrossDomainMessenger.dropMessage(address(l1ETHGateway), address(counterpartGateway), amount, 0, message); - assertEq(balance + amount, address(this).balance); - - // Expect revert when trying to drop the same message again. - hevm.expectRevert("Message already dropped"); - l1CrossDomainMessenger.dropMessage(address(l1ETHGateway), address(counterpartGateway), amount, 0, message); - } - function test_updateMaxReplayTimes_succeeds(uint256 _maxReplayTimes) external { hevm.assume(_maxReplayTimes > 0); // not owner, revert @@ -529,8 +466,6 @@ contract L1CrossDomainMessengerTest is L1GatewayBaseTest { l1CrossDomainMessenger.proveAndRelayMessage(address(0), address(0), 0, 0, new bytes(0), wdProof, wdRoot); hevm.expectRevert("Pausable: paused"); l1CrossDomainMessenger.replayMessage(address(0), address(0), 0, 0, new bytes(0), 0, address(0)); - hevm.expectRevert("Pausable: paused"); - l1CrossDomainMessenger.dropMessage(address(0), address(0), 0, 0, new bytes(0)); // unpause hevm.prank(multisig); diff --git a/contracts/contracts/test/L1CustomERC20Gateway.t.sol b/contracts/contracts/test/L1CustomERC20Gateway.t.sol index 1ac3f574..f1a63821 100644 --- a/contracts/contracts/test/L1CustomERC20Gateway.t.sol +++ b/contracts/contracts/test/L1CustomERC20Gateway.t.sol @@ -182,31 +182,6 @@ contract L1CustomERC20GatewayTest is L1GatewayBaseTest { _depositERC20WithRecipientAndCalldata(false, amount, recipient, dataToCall, gasLimit, feePerGas); } - function test_dropMessage_succeeds(uint256 amount, address recipient, bytes memory dataToCall) public { - gateway.updateTokenMapping(address(l1Token), address(l2Token)); - - amount = bound(amount, 1, l1Token.balanceOf(address(this))); - bytes memory message = abi.encodeCall( - IL2ERC20Gateway.finalizeDepositERC20, - (address(l1Token), address(l2Token), address(this), recipient, amount, dataToCall) - ); - gateway.depositERC20AndCall(address(l1Token), recipient, amount, dataToCall, defaultGasLimit); - - // skip message 0 - hevm.startPrank(address(rollup)); - l1MessageQueueWithGasPriceOracle.popCrossDomainMessage(0, 1, 0x1); - assertEq(l1MessageQueueWithGasPriceOracle.pendingQueueIndex(), 1); - hevm.stopPrank(); - - // drop message 0 - hevm.expectEmit(true, true, false, true); - emit IL1ERC20Gateway.RefundERC20(address(l1Token), address(this), amount); - - uint256 balance = l1Token.balanceOf(address(this)); - l1CrossDomainMessenger.dropMessage(address(gateway), address(counterpartGateway), 0, 0, message); - assertEq(balance + amount, l1Token.balanceOf(address(this))); - } - function test_onDropMessage_beforeDropMessage_reverts() public { uint256 amount = 1000; diff --git a/contracts/contracts/test/L1ERC1155Gateway.t.sol b/contracts/contracts/test/L1ERC1155Gateway.t.sol index 7d383d38..18fc2f8a 100644 --- a/contracts/contracts/test/L1ERC1155Gateway.t.sol +++ b/contracts/contracts/test/L1ERC1155Gateway.t.sol @@ -157,70 +157,6 @@ contract L1ERC1155GatewayTest is L1GatewayBaseTest, ERC1155TokenReceiver { _testBatchDepositERC1155WithRecipient(tokenCount, amount, recipient, gasLimit, feePerGas); } - function test_dropMessage_succeeds(uint256 tokenId, uint256 amount) public { - gateway.updateTokenMapping(address(l1Token), address(l2Token)); - - tokenId = bound(tokenId, 0, TOKEN_COUNT - 1); - amount = bound(amount, 1, MAX_TOKEN_BALANCE); - bytes memory message = abi.encodeCall( - IL2ERC1155Gateway.finalizeDepositERC1155, - (address(l1Token), address(l2Token), address(this), address(this), tokenId, amount) - ); - gateway.depositERC1155(address(l1Token), tokenId, amount, defaultGasLimit); - - // skip message 0 - hevm.startPrank(address(rollup)); - l1MessageQueueWithGasPriceOracle.popCrossDomainMessage(0, 1, 0x1); - assertEq(l1MessageQueueWithGasPriceOracle.pendingQueueIndex(), 1); - hevm.stopPrank(); - - // drop message 0 - hevm.expectEmit(true, true, false, true); - emit IL1ERC1155Gateway.RefundERC1155(address(l1Token), address(this), tokenId, amount); - - uint256 balance = l1Token.balanceOf(address(this), tokenId); - l1CrossDomainMessenger.dropMessage(address(gateway), address(counterpartGateway), 0, 0, message); - assertEq(balance + amount, l1Token.balanceOf(address(this), tokenId)); - } - - function test_dropMessageBatch_succeeds(uint256 tokenCount, uint256 amount) public { - tokenCount = bound(tokenCount, 1, TOKEN_COUNT); - amount = bound(amount, 1, MAX_TOKEN_BALANCE); - gateway.updateTokenMapping(address(l1Token), address(l2Token)); - - uint256[] memory _tokenIds = new uint256[](tokenCount); - uint256[] memory _amounts = new uint256[](tokenCount); - for (uint256 i = 0; i < tokenCount; i++) { - _tokenIds[i] = i; - _amounts[i] = amount; - } - - bytes memory message = abi.encodeCall( - IL2ERC1155Gateway.finalizeBatchDepositERC1155, - (address(l1Token), address(l2Token), address(this), address(this), _tokenIds, _amounts) - ); - gateway.batchDepositERC1155(address(l1Token), _tokenIds, _amounts, defaultGasLimit); - - // skip message 0 - hevm.startPrank(address(rollup)); - l1MessageQueueWithGasPriceOracle.popCrossDomainMessage(0, 1, 0x1); - assertEq(l1MessageQueueWithGasPriceOracle.pendingQueueIndex(), 1); - hevm.stopPrank(); - - // drop message 0 - hevm.expectEmit(true, true, false, true); - emit IL1ERC1155Gateway.BatchRefundERC1155(address(l1Token), address(this), _tokenIds, _amounts); - - uint256[] memory balances = new uint256[](tokenCount); - for (uint256 i = 0; i < tokenCount; i++) { - balances[i] = l1Token.balanceOf(address(this), _tokenIds[i]); - } - l1CrossDomainMessenger.dropMessage(address(gateway), address(counterpartGateway), 0, 0, message); - for (uint256 i = 0; i < tokenCount; i++) { - assertEq(balances[i] + _amounts[i], l1Token.balanceOf(address(this), _tokenIds[i])); - } - } - function test_onDropMessage_revert(uint256 tokenId, uint256 amount) external { gateway.updateTokenMapping(address(l1Token), address(l2Token)); tokenId = bound(tokenId, 0, TOKEN_COUNT - 1); diff --git a/contracts/contracts/test/L1ERC721Gateway.t.sol b/contracts/contracts/test/L1ERC721Gateway.t.sol index a6ba3b69..b71e36b6 100644 --- a/contracts/contracts/test/L1ERC721Gateway.t.sol +++ b/contracts/contracts/test/L1ERC721Gateway.t.sol @@ -174,65 +174,6 @@ contract L1ERC721GatewayTest is L1GatewayBaseTest, ERC721TokenReceiver { _testBatchDepositERC721WithRecipient(tokenCount, recipient, gasLimit, feePerGas); } - function test_dropMessage_succeeds(uint256 tokenId) public { - gateway.updateTokenMapping(address(l1Token), address(l2Token)); - - tokenId = bound(tokenId, 0, TOKEN_COUNT - 1); - bytes memory message = abi.encodeCall( - IL2ERC721Gateway.finalizeDepositERC721, - (address(l1Token), address(l2Token), address(this), address(this), tokenId) - ); - gateway.depositERC721(address(l1Token), tokenId, defaultGasLimit); - - // skip message 0 - hevm.startPrank(address(rollup)); - l1MessageQueueWithGasPriceOracle.popCrossDomainMessage(0, 1, 0x1); - assertEq(l1MessageQueueWithGasPriceOracle.pendingQueueIndex(), 1); - hevm.stopPrank(); - - // drop message 0 - hevm.expectEmit(true, true, false, true); - emit IL1ERC721Gateway.RefundERC721(address(l1Token), address(this), tokenId); - - assertEq(l1Token.ownerOf(tokenId), address(gateway)); - l1CrossDomainMessenger.dropMessage(address(gateway), address(counterpartGateway), 0, 0, message); - assertEq(l1Token.ownerOf(tokenId), address(this)); - } - - function test_dropMessageBatch_succeeds(uint256 tokenCount) public { - tokenCount = bound(tokenCount, 1, TOKEN_COUNT); - gateway.updateTokenMapping(address(l1Token), address(l2Token)); - - uint256[] memory _tokenIds = new uint256[](tokenCount); - for (uint256 i = 0; i < tokenCount; i++) { - _tokenIds[i] = i; - } - - bytes memory message = abi.encodeCall( - IL2ERC721Gateway.finalizeBatchDepositERC721, - (address(l1Token), address(l2Token), address(this), address(this), _tokenIds) - ); - gateway.batchDepositERC721(address(l1Token), _tokenIds, defaultGasLimit); - - // skip message 0 - hevm.startPrank(address(rollup)); - l1MessageQueueWithGasPriceOracle.popCrossDomainMessage(0, 1, 0x1); - assertEq(l1MessageQueueWithGasPriceOracle.pendingQueueIndex(), 1); - hevm.stopPrank(); - - // drop message 0 - hevm.expectEmit(true, true, false, true); - emit IL1ERC721Gateway.BatchRefundERC721(address(l1Token), address(this), _tokenIds); - for (uint256 i = 0; i < tokenCount; i++) { - assertEq(l1Token.ownerOf(_tokenIds[i]), address(gateway)); - } - - l1CrossDomainMessenger.dropMessage(address(gateway), address(counterpartGateway), 0, 0, message); - for (uint256 i = 0; i < tokenCount; i++) { - assertEq(l1Token.ownerOf(_tokenIds[i]), address(this)); - } - } - function test_finalizeWithdrawERC721_counterError_fails(address sender, address recipient, uint256 tokenId) public { hevm.assume(recipient != address(0)); tokenId = bound(tokenId, 0, TOKEN_COUNT - 1); diff --git a/contracts/contracts/test/L1ETHGateway.t.sol b/contracts/contracts/test/L1ETHGateway.t.sol index c5d0caf4..d7e979b4 100644 --- a/contracts/contracts/test/L1ETHGateway.t.sol +++ b/contracts/contracts/test/L1ETHGateway.t.sol @@ -167,35 +167,6 @@ contract L1ETHGatewayTest is L1GatewayBaseTest { _depositETHWithRecipientAndCalldata(true, amount, recipient, dataToCall, gasLimit, feePerGas); } - function test_dropMessage_succeeds(uint256 amount, address recipient, bytes memory dataToCall) public { - amount = bound(amount, 1, address(this).balance); - bytes memory message = abi.encodeCall( - IL2ETHGateway.finalizeDepositETH, - (address(this), recipient, amount, dataToCall) - ); - l1ETHGateway.depositETHAndCall{value: amount}(recipient, amount, dataToCall, defaultGasLimit); - - // skip message 0 - hevm.startPrank(address(rollup)); - l1MessageQueueWithGasPriceOracle.popCrossDomainMessage(0, 1, 0x1); - assertEq(l1MessageQueueWithGasPriceOracle.pendingQueueIndex(), 1); - hevm.stopPrank(); - - // ETH transfer failed, revert - revertOnReceive = true; - hevm.expectRevert("ETH transfer failed"); - l1CrossDomainMessenger.dropMessage(address(l1ETHGateway), address(counterpartGateway), amount, 0, message); - - // drop message 0 - hevm.expectEmit(true, true, false, true); - emit IL1ETHGateway.RefundETH(address(this), amount); - - revertOnReceive = false; - uint256 balance = address(this).balance; - l1CrossDomainMessenger.dropMessage(address(l1ETHGateway), address(counterpartGateway), amount, 0, message); - assertEq(balance + amount, address(this).balance); - } - function test_finalizeWithdrawETH_counterErr_fails( address sender, address recipient, diff --git a/contracts/contracts/test/L1MessageQueue.t.sol b/contracts/contracts/test/L1MessageQueue.t.sol index 3e027e96..c11fa8f3 100644 --- a/contracts/contracts/test/L1MessageQueue.t.sol +++ b/contracts/contracts/test/L1MessageQueue.t.sol @@ -215,7 +215,7 @@ contract L1MessageQueueTest is L1MessageBaseTest { l1MessageQueue.appendCrossDomainMessage(alice, gasLimit, _calldata); hevm.prank(bob); hevm.expectRevert("Only callable by the rollup"); - l1MessageQueue.popCrossDomainMessage(0, 1, 0x3ff); + l1MessageQueue.popCrossDomainMessage(0, 1); } function test_popCrossDomainMessage_tooManyMessages_reverts() external { @@ -225,7 +225,7 @@ contract L1MessageQueueTest is L1MessageBaseTest { // Expect revert when _count > 256. hevm.prank(alice); hevm.expectRevert("pop too many messages"); - l1MessageQueue.popCrossDomainMessage(0, 257, 0x3ff); + l1MessageQueue.popCrossDomainMessage(0, 257); } function test_popCrossDomainMessage_startIndexMismatch_reverts() external { @@ -235,83 +235,7 @@ contract L1MessageQueueTest is L1MessageBaseTest { // Expect revert when pendingQueueIndex != _startIndex. hevm.prank(alice); hevm.expectRevert("start index mismatch"); - l1MessageQueue.popCrossDomainMessage(1, 2, 0x3ff); - } - - function test_dropCrossDomainMessage_cannotDropPending_reverts() external { - bytes memory _calldata = "0x0"; - uint256 gasLimit = l1MessageQueue.calculateIntrinsicGasFee(_calldata); - - // Store alice as messenger and rollup. - upgradeStorage(address(alice), address(alice), address(alice)); - - // Expect revert when (_index < pendingQueueIndex) is false. - hevm.prank(alice); - l1MessageQueue.appendCrossDomainMessage(alice, gasLimit, _calldata); - hevm.prank(alice); - hevm.expectRevert("cannot drop pending message"); - l1MessageQueue.dropCrossDomainMessage(0); - } - - function test_pop_dropCrossDomainMessage_succeeds() external { - // store alice as messenger and rollup - upgradeStorage(address(alice), address(alice), address(alice)); - assertEq(alice, l1MessageQueue.MESSENGER()); - assertEq(alice, l1MessageQueue.ROLLUP_CONTRACT()); - bytes memory _calldata = "0x0"; - uint256 gasLimit = l1MessageQueue.calculateIntrinsicGasFee(_calldata); - // append 10 message - hevm.startPrank(alice); - for (uint64 i = 0; i < 10; i++) { - l1MessageQueue.appendCrossDomainMessage(alice, gasLimit, _calldata); - } - - // Verify the event QueueTransaction is emitted successfully. - hevm.expectEmit(false, false, false, true); - emit IL1MessageQueue.DequeueTransaction(0, 10, 0x3ff); - - // pop all 10 message - l1MessageQueue.popCrossDomainMessage(0, 10, 0x3ff); - for (uint64 i = 0; i < 10; i++) { - assertTrue(l1MessageQueue.isMessageSkipped(i)); - } - // drop all 10 message - for (uint64 i = 0; i < 10; i++) { - l1MessageQueue.dropCrossDomainMessage(i); - assertTrue(l1MessageQueue.isMessageDropped(i)); - } - hevm.stopPrank(); - } - - function test_dropCrossDomainMessage_dropAgain_reverts() external { - // store alice as messenger and rollup - upgradeStorage(address(alice), address(alice), address(alice)); - assertEq(alice, l1MessageQueue.MESSENGER()); - assertEq(alice, l1MessageQueue.ROLLUP_CONTRACT()); - bytes memory _calldata = "0x0"; - uint256 gasLimit = l1MessageQueue.calculateIntrinsicGasFee(_calldata); - // append 10 message - hevm.startPrank(alice); - for (uint64 i = 0; i < 10; i++) { - l1MessageQueue.appendCrossDomainMessage(alice, gasLimit, _calldata); - } - - // pop all 10 message - l1MessageQueue.popCrossDomainMessage(0, 10, 0x3ff); - for (uint64 i = 0; i < 10; i++) { - assertTrue(l1MessageQueue.isMessageSkipped(i)); - } - // drop all 10 message - for (uint64 i = 0; i < 10; i++) { - l1MessageQueue.dropCrossDomainMessage(i); - assertTrue(l1MessageQueue.isMessageDropped(i)); - } - hevm.stopPrank(); - - // Expect revert when message already dropped. - hevm.prank(alice); - hevm.expectRevert("message already dropped"); - l1MessageQueue.dropCrossDomainMessage(1); + l1MessageQueue.popCrossDomainMessage(1, 2); } function test_updateMaxGasLimit_notOwner_reverts() external { diff --git a/contracts/contracts/test/L1Staking.t.sol b/contracts/contracts/test/L1Staking.t.sol index 825e5040..3324aa57 100644 --- a/contracts/contracts/test/L1Staking.t.sol +++ b/contracts/contracts/test/L1Staking.t.sol @@ -387,12 +387,6 @@ contract StakingTest is L1MessageBaseTest { assertEq(stakersAddr.length, stakersConvert.length); assertEq(stakersAddr[0], stakersConvert[0]); assertEq(stakersAddr[stakersAddr.length - 1], stakersConvert[stakersConvert.length - 1]); - - // console.logString("......................"); - // console.logUint(bitmap); - // console.logUint(stakersAddr.length); - // console.logUint(stakersConvert.length); - // console.logString("......................"); } function test_slash_succeeds() external { diff --git a/contracts/contracts/test/L1StandardERC20Gateway.t.sol b/contracts/contracts/test/L1StandardERC20Gateway.t.sol index 86883d53..d9440daf 100644 --- a/contracts/contracts/test/L1StandardERC20Gateway.t.sol +++ b/contracts/contracts/test/L1StandardERC20Gateway.t.sol @@ -287,40 +287,6 @@ contract L1StandardERC20GatewayTest is L1GatewayBaseTest { assertEq(balanceBefore + amount - fee, balanceAfter); } - function test_dropMessage_succeeds(uint256 amount, address recipient, bytes memory dataToCall) public { - amount = bound(amount, 1, l1Token.balanceOf(address(this)) / 2); - bytes memory message = abi.encodeCall( - IL2ERC20Gateway.finalizeDepositERC20, - ( - address(l1Token), - address(l2Token), - address(this), - recipient, - amount, - abi.encode( - true, - abi.encode(dataToCall, abi.encode(l1Token.symbol(), l1Token.name(), l1Token.decimals())) - ) - ) - ); - l1StandardERC20Gateway.depositERC20AndCall(address(l1Token), recipient, amount, dataToCall, defaultGasLimit); - l1StandardERC20Gateway.depositERC20AndCall(address(l1Token), recipient, amount, dataToCall, defaultGasLimit); - - // skip message 0 and 1 - hevm.startPrank(address(rollup)); - l1MessageQueueWithGasPriceOracle.popCrossDomainMessage(0, 2, 0x3); - assertEq(l1MessageQueueWithGasPriceOracle.pendingQueueIndex(), 2); - hevm.stopPrank(); - - // drop message 1 - hevm.expectEmit(true, true, false, true); - emit IL1ERC20Gateway.RefundERC20(address(l1Token), address(this), amount); - - uint256 balance = l1Token.balanceOf(address(this)); - l1CrossDomainMessenger.dropMessage(address(l1StandardERC20Gateway), address(counterpartGateway), 0, 1, message); - assertEq(balance + amount, l1Token.balanceOf(address(this))); - } - function test_finalizeWithdrawERC20_beforeFinalizeWithdrawERC20_reverts() public { address recipient = address(2048); address _from = address(counterpartGateway); diff --git a/contracts/contracts/test/L1WETHGateway.t.sol b/contracts/contracts/test/L1WETHGateway.t.sol index bc0bf681..1a8aa309 100644 --- a/contracts/contracts/test/L1WETHGateway.t.sol +++ b/contracts/contracts/test/L1WETHGateway.t.sol @@ -197,29 +197,6 @@ contract L1WETHGatewayTest is L1GatewayBaseTest { _depositERC20WithRecipientAndCalldata(true, amount, recipient, dataToCall, gasLimit, feePerGas); } - function test_dropMessage_succeeds(uint256 amount, address recipient, bytes memory dataToCall) public { - amount = bound(amount, 1, l1weth.balanceOf(address(this))); - bytes memory message = abi.encodeCall( - IL2ERC20Gateway.finalizeDepositERC20, - (address(l1weth), address(l2weth), address(this), recipient, amount, dataToCall) - ); - gateway.depositERC20AndCall(address(l1weth), recipient, amount, dataToCall, defaultGasLimit); - - // skip message 0 - hevm.startPrank(address(rollup)); - l1MessageQueueWithGasPriceOracle.popCrossDomainMessage(0, 1, 0x1); - assertEq(l1MessageQueueWithGasPriceOracle.pendingQueueIndex(), 1); - hevm.stopPrank(); - - // drop message 0 - hevm.expectEmit(true, true, false, true); - emit IL1ERC20Gateway.RefundERC20(address(l1weth), address(this), amount); - - uint256 balance = l1weth.balanceOf(address(this)); - l1CrossDomainMessenger.dropMessage(address(gateway), address(counterpartGateway), amount, 0, message); - assertEq(balance + amount, l1weth.balanceOf(address(this))); - } - function test_finalizeWithdrawERC20_counterErr_fails( address sender, address recipient, diff --git a/contracts/contracts/test/L2CustomERC20Gateway.t.sol b/contracts/contracts/test/L2CustomERC20Gateway.t.sol index c5cf4b21..0edf44cb 100644 --- a/contracts/contracts/test/L2CustomERC20Gateway.t.sol +++ b/contracts/contracts/test/L2CustomERC20Gateway.t.sol @@ -66,7 +66,7 @@ contract L2CustomERC20GatewayTest is L2GatewayBaseTest { ); // Deploy a new L2CustomERC20Gateway contract. L2CustomERC20Gateway l2CustomERC20GatewayImplTemp = new L2CustomERC20Gateway(); - + // Expect revert due to zero router address. hevm.expectRevert("zero router address"); ITransparentUpgradeableProxy(address(l2CustomERC20GatewayProxyTemp)).upgradeToAndCall( @@ -80,7 +80,7 @@ contract L2CustomERC20GatewayTest is L2GatewayBaseTest { ) ) ); - + // Expect revert due to zero counterpart address. hevm.expectRevert("zero counterpart address"); ITransparentUpgradeableProxy(address(l2CustomERC20GatewayProxyTemp)).upgradeToAndCall( @@ -134,7 +134,7 @@ contract L2CustomERC20GatewayTest is L2GatewayBaseTest { // Cast the proxy contract address to the L2CustomERC20Gateway contract type to call its methods. L2CustomERC20Gateway l2CustomERC20GatewayTemp = L2CustomERC20Gateway((address(l2CustomERC20GatewayProxyTemp))); hevm.stopPrank(); - + // Verify the counterpart, router and messenger are initialized successfully. assertEq(l2CustomERC20GatewayTemp.counterpart(), address(NON_ZERO_ADDRESS)); assertEq(l2CustomERC20GatewayTemp.router(), address(l2GatewayRouter)); @@ -155,7 +155,7 @@ contract L2CustomERC20GatewayTest is L2GatewayBaseTest { function test_updateTokenMapping_succeeds(address token1, address token2) public { hevm.assume(token1 != address(0)); - + // Expect the UpdateTokenMapping event to be emitted successfully. hevm.expectEmit(true, true, true, true); emit L2CustomERC20Gateway.UpdateTokenMapping(token2, address(0), token1); diff --git a/contracts/contracts/test/L2ERC1155Gateway.t.sol b/contracts/contracts/test/L2ERC1155Gateway.t.sol index 1a6bae76..6757de9f 100644 --- a/contracts/contracts/test/L2ERC1155Gateway.t.sol +++ b/contracts/contracts/test/L2ERC1155Gateway.t.sol @@ -70,7 +70,7 @@ contract L2ERC1155GatewayTest is L2GatewayBaseTest, ERC1155TokenReceiver { ) ) ); - + // Expect revert due to zero messenger address. hevm.expectRevert("zero messenger address"); ITransparentUpgradeableProxy(address(l2ERC1155GatewayProxy)).upgradeToAndCall( @@ -109,7 +109,7 @@ contract L2ERC1155GatewayTest is L2GatewayBaseTest, ERC1155TokenReceiver { // Cast the proxy contract address to the L2ERC1155Gateway contract type to call its methods. L2ERC1155Gateway l2ERC1155GatewayTemp = L2ERC1155Gateway(address(l2ERC1155GatewayProxyTemp)); hevm.stopPrank(); - + // Verify the counterpart and messenger are initialized successfully. assertEq(l2ERC1155GatewayTemp.counterpart(), address(NON_ZERO_ADDRESS)); assertEq(l2ERC1155GatewayTemp.messenger(), address(l2CrossDomainMessenger)); @@ -166,7 +166,14 @@ contract L2ERC1155GatewayTest is L2GatewayBaseTest, ERC1155TokenReceiver { // Expect WithdrawERC1155 event to be emitted. hevm.expectEmit(true, true, true, true); - emit IL2ERC1155Gateway.WithdrawERC1155(address(token), address(token), address(this), address(this), tokenId, amount); + emit IL2ERC1155Gateway.WithdrawERC1155( + address(token), + address(token), + address(this), + address(this), + tokenId, + amount + ); gateway.withdrawERC1155(address(token), tokenId, amount, 0); assertEq(token.balanceOf(address(gateway), tokenId), 0); @@ -240,7 +247,14 @@ contract L2ERC1155GatewayTest is L2GatewayBaseTest, ERC1155TokenReceiver { // Expect BatchWithdrawERC1155 event to be emitted. hevm.expectEmit(true, true, true, true); - emit IL2ERC1155Gateway.BatchWithdrawERC1155(address(token), address(token), address(this), address(this), _tokenIds, _amounts); + emit IL2ERC1155Gateway.BatchWithdrawERC1155( + address(token), + address(token), + address(this), + address(this), + _tokenIds, + _amounts + ); gateway.batchWithdrawERC1155(address(token), _tokenIds, _amounts, 0); for (uint256 i = 0; i < count; i++) { @@ -264,7 +278,14 @@ contract L2ERC1155GatewayTest is L2GatewayBaseTest, ERC1155TokenReceiver { // Expect BatchWithdrawERC1155 event to be emitted. hevm.expectEmit(true, true, true, true); - emit IL2ERC1155Gateway.BatchWithdrawERC1155(address(token), address(token), address(this), to, _tokenIds, _amounts); + emit IL2ERC1155Gateway.BatchWithdrawERC1155( + address(token), + address(token), + address(this), + to, + _tokenIds, + _amounts + ); gateway.batchWithdrawERC1155(address(token), to, _tokenIds, _amounts, 0); for (uint256 i = 0; i < count; i++) { @@ -386,7 +407,14 @@ contract L2ERC1155GatewayTest is L2GatewayBaseTest, ERC1155TokenReceiver { // Expect the FinalizeDepositERC1155 event can be emitted successfully. hevm.expectEmit(true, true, true, true); - emit IL2ERC1155Gateway.FinalizeBatchDepositERC1155(address(token), address(token), from, to, _tokenIds, _amounts); + emit IL2ERC1155Gateway.FinalizeBatchDepositERC1155( + address(token), + address(token), + from, + to, + _tokenIds, + _amounts + ); messenger.callTarget( address(gateway), diff --git a/contracts/contracts/test/L2ERC721Gateway.t.sol b/contracts/contracts/test/L2ERC721Gateway.t.sol index 74aebe1b..44ec84c3 100644 --- a/contracts/contracts/test/L2ERC721Gateway.t.sol +++ b/contracts/contracts/test/L2ERC721Gateway.t.sol @@ -70,7 +70,7 @@ contract L2ERC721GatewayTest is L2GatewayBaseTest { ) ) ); - + // Expect revert due to zero messenger address. hevm.expectRevert("zero messenger address"); ITransparentUpgradeableProxy(address(l2ERC721GatewayProxy)).upgradeToAndCall( @@ -109,7 +109,7 @@ contract L2ERC721GatewayTest is L2GatewayBaseTest { // Cast the proxy contract address to the L2ERC721Gateway contract type to call its methods. L2ERC721Gateway l2ERC721GatewayTemp = L2ERC721Gateway(address(l2ERC721GatewayProxyTemp)); hevm.stopPrank(); - + // Verify the counterpart and messenger are initialized successfully. assertEq(l2ERC721GatewayTemp.counterpart(), address(NON_ZERO_ADDRESS)); assertEq(l2ERC721GatewayTemp.messenger(), address(l2CrossDomainMessenger)); @@ -231,7 +231,13 @@ contract L2ERC721GatewayTest is L2GatewayBaseTest { // Expect BatchWithdrawERC721 event to be emitted. hevm.expectEmit(true, true, true, true); - emit IL2ERC721Gateway.BatchWithdrawERC721(address(token), address(token), address(this), address(this), _tokenIds); + emit IL2ERC721Gateway.BatchWithdrawERC721( + address(token), + address(token), + address(this), + address(this), + _tokenIds + ); gateway.batchWithdrawERC721(address(token), _tokenIds, 0); for (uint256 i = 0; i < count; i++) { diff --git a/contracts/contracts/test/L2GatewayRouter.t.sol b/contracts/contracts/test/L2GatewayRouter.t.sol index 5a4b6076..5d8ca28c 100644 --- a/contracts/contracts/test/L2GatewayRouter.t.sol +++ b/contracts/contracts/test/L2GatewayRouter.t.sol @@ -48,20 +48,16 @@ contract L2GatewayRouterTest is L2GatewayBaseTest { hevm.startPrank(multisig); // Deploy a proxy contract for the L2GatewayRouter. TransparentUpgradeableProxy l2GatewayRouterProxyTempA = new TransparentUpgradeableProxy( - address(emptyContract), - address(multisig), - new bytes(0) + address(emptyContract), + address(multisig), + new bytes(0) ); // Deploy a new L2GatewayRouter contract. L2GatewayRouter l2GatewayRouterImplTempA = new L2GatewayRouter(); // Initialize the proxy with the new implementation. - ITransparentUpgradeableProxy(address(l2GatewayRouterProxyTempA)) - .upgradeToAndCall( - address(l2GatewayRouterImplTempA), - abi.encodeCall( - L2GatewayRouter.initialize, - (address(0), address(0)) - ) + ITransparentUpgradeableProxy(address(l2GatewayRouterProxyTempA)).upgradeToAndCall( + address(l2GatewayRouterImplTempA), + abi.encodeCall(L2GatewayRouter.initialize, (address(0), address(0))) ); // Cast the proxy address to the L2GatewayRouter contract type to call its methods. L2GatewayRouter l2GatewayRouterTempA = L2GatewayRouter(address(l2GatewayRouterProxyTempA)); @@ -72,33 +68,29 @@ contract L2GatewayRouterTest is L2GatewayBaseTest { hevm.startPrank(multisig); // Deploy another proxy contract for the L2GatewayRouter. TransparentUpgradeableProxy l2GatewayRouterProxyTempB = new TransparentUpgradeableProxy( - address(emptyContract), - address(multisig), - new bytes(0) + address(emptyContract), + address(multisig), + new bytes(0) ); // Deploy a new L2GatewayRouter contract. L2GatewayRouter l2GatewayRouterImplTempB = new L2GatewayRouter(); - + // Expect the SetDefaultERC20Gateway event to be emitted successfully. hevm.expectEmit(true, true, false, true); emit IL2GatewayRouter.SetDefaultERC20Gateway(address(0), address(2)); - + // Expect the SetETHGateway event to be emitted successfully. hevm.expectEmit(true, true, false, true); emit IL2GatewayRouter.SetETHGateway(address(0), address(1)); // Initialize the proxy with the new implementation. - ITransparentUpgradeableProxy(address(l2GatewayRouterProxyTempB)) - .upgradeToAndCall( - address(l2GatewayRouterImplTempB), - abi.encodeCall( - L2GatewayRouter.initialize, - (address(1), address(2)) - ) + ITransparentUpgradeableProxy(address(l2GatewayRouterProxyTempB)).upgradeToAndCall( + address(l2GatewayRouterImplTempB), + abi.encodeCall(L2GatewayRouter.initialize, (address(1), address(2))) ); // Cast the proxy address to the L2GatewayRouter contract type to call its methods. L2GatewayRouter l2GatewayRouterTempB = L2GatewayRouter(address(l2GatewayRouterProxyTempB)); hevm.stopPrank(); - + // Verify that the ethGateway and defaultERC20Gateway are initialized correctly. assertEq(l2GatewayRouterTempB.ethGateway(), address(1)); assertEq(l2GatewayRouterTempB.defaultERC20Gateway(), address(2)); diff --git a/contracts/contracts/test/L2Staking.t.sol b/contracts/contracts/test/L2Staking.t.sol index d2a854cc..bd928837 100644 --- a/contracts/contracts/test/L2Staking.t.sol +++ b/contracts/contracts/test/L2Staking.t.sol @@ -156,7 +156,27 @@ contract L2StakingTest is L2StakingBaseTest { // Expect revert due to unauthorized call. hevm.expectRevert("staking: only other staking contract allowed"); - l2Staking.addStaker(stakerInfo); + l2Staking.addStaker(0, stakerInfo); + } + + /** + * @notice test add staker: Reverts if invalid nonce + */ + function test_addStakers_invalidNonce_reverts() public { + hevm.mockCall( + address(l2Staking.MESSENGER()), + abi.encodeCall(ICrossDomainMessenger.xDomainMessageSender, ()), + abi.encode(address(l2Staking.OTHER_STAKING())) + ); + assertEq(SEQUENCER_SIZE, l2Staking.getStakerAddressesLength()); + hevm.startPrank(address(l2CrossDomainMessenger)); + + address staker = address(uint160(beginSeq)); + Types.StakerInfo memory stakerInfo = ffi.generateStakerInfo(staker); + + uint256 nonce = l2Staking.nonce(); + hevm.expectRevert("invalid nonce"); + l2Staking.addStaker(nonce + 1, stakerInfo); } /** @@ -170,6 +190,7 @@ contract L2StakingTest is L2StakingBaseTest { ); assertEq(SEQUENCER_SIZE, l2Staking.getStakerAddressesLength()); hevm.startPrank(address(l2CrossDomainMessenger)); + uint256 nonce = 0; for (uint256 i = SEQUENCER_SIZE; i < SEQUENCER_SIZE * 2 + 1; i++) { address staker = address(uint160(beginSeq + i)); Types.StakerInfo memory stakerInfo = ffi.generateStakerInfo(staker); @@ -177,7 +198,8 @@ contract L2StakingTest is L2StakingBaseTest { // Expect the SequencerSetMaxSizeUpdated event is emitted successfully. hevm.expectEmit(true, true, true, true); emit IL2Staking.StakerAdded(stakerInfo.addr, stakerInfo.tmKey, stakerInfo.blsKey); - l2Staking.addStaker(stakerInfo); + l2Staking.addStaker(nonce, stakerInfo); + nonce++; } assertEq(7, l2Staking.getStakerAddressesLength()); hevm.stopPrank(); @@ -215,10 +237,12 @@ contract L2StakingTest is L2StakingBaseTest { abi.encode(address(l2Staking.OTHER_STAKING())) ); hevm.startPrank(address(l2CrossDomainMessenger)); + uint256 nonce = 0; for (uint256 i = SEQUENCER_SIZE; i < SEQUENCER_SIZE * 2; i++) { address staker = address(uint160(beginSeq + i)); Types.StakerInfo memory stakerInfo = ffi.generateStakerInfo(staker); - l2Staking.addStaker(stakerInfo); + l2Staking.addStaker(nonce, stakerInfo); + nonce++; } hevm.stopPrank(); for (uint256 i = 0; i < SEQUENCER_SIZE * 2; i++) { @@ -252,11 +276,11 @@ contract L2StakingTest is L2StakingBaseTest { hevm.startPrank(address(l2CrossDomainMessenger)); // Add the staker to the L2Staking contract. - l2Staking.addStaker(stakerInfo); + l2Staking.addStaker(0, stakerInfo); uint256 initialLength = l2Staking.getStakerAddressesLength(); // Add the same staker again to the L2Staking contract. - l2Staking.addStaker(stakerInfo); + l2Staking.addStaker(1, stakerInfo); uint256 finalLength = l2Staking.getStakerAddressesLength(); // Assert that the initial length and the final length are equal. @@ -273,7 +297,37 @@ contract L2StakingTest is L2StakingBaseTest { // Expect revert due to unauthorized call. hevm.expectRevert("staking: only other staking contract allowed"); - l2Staking.removeStakers(removed); + l2Staking.removeStakers(0, removed); + } + + /** + * @notice test removed staker: Reverts if invalid nonce + */ + function test_removeStakers_invalidNonce_reverts() public { + hevm.mockCall( + address(l2Staking.MESSENGER()), + abi.encodeCall(ICrossDomainMessenger.xDomainMessageSender, ()), + abi.encode(address(l2Staking.OTHER_STAKING())) + ); + hevm.startPrank(address(l2CrossDomainMessenger)); + + uint256 nonce = 0; + for (uint256 i = SEQUENCER_SIZE; i < SEQUENCER_SIZE * 2; i++) { + address staker = address(uint160(beginSeq + i)); + Types.StakerInfo memory stakerInfo = ffi.generateStakerInfo(staker); + l2Staking.addStaker(nonce, stakerInfo); + nonce++; + } + + address[] memory removed = new address[](2); + removed[0] = address(uint160(beginSeq + 1)); + removed[1] = address(uint160(beginSeq + 4)); + + hevm.expectRevert("invalid nonce"); + l2Staking.removeStakers(nonce + 1, removed); + + hevm.expectRevert("invalid nonce"); + l2Staking.removeStakers(nonce - 1, removed); } /** @@ -287,17 +341,19 @@ contract L2StakingTest is L2StakingBaseTest { ); hevm.startPrank(address(l2CrossDomainMessenger)); + uint256 nonce = 0; for (uint256 i = SEQUENCER_SIZE; i < SEQUENCER_SIZE * 2; i++) { address staker = address(uint160(beginSeq + i)); Types.StakerInfo memory stakerInfo = ffi.generateStakerInfo(staker); - l2Staking.addStaker(stakerInfo); + l2Staking.addStaker(nonce, stakerInfo); + nonce++; } address[] memory removed = new address[](2); removed[0] = address(uint160(beginSeq + 1)); removed[1] = address(uint160(beginSeq + 4)); - l2Staking.removeStakers(removed); + l2Staking.removeStakers(nonce, removed); assertEq(sequencer.getSequencerSet2Size(), 4); hevm.stopPrank(); @@ -328,10 +384,12 @@ contract L2StakingTest is L2StakingBaseTest { hevm.startPrank(address(l2CrossDomainMessenger)); // Add a set of new stakers to the L2Staking contract. + uint256 nonce = 0; for (uint256 i = SEQUENCER_SIZE; i < SEQUENCER_SIZE * 2; i++) { address staker = address(uint160(beginSeq + i)); Types.StakerInfo memory stakerInfo = ffi.generateStakerInfo(staker); - l2Staking.addStaker(stakerInfo); + l2Staking.addStaker(nonce, stakerInfo); + nonce++; } // Create an array of addresses that do not exist in the staker set. @@ -340,7 +398,7 @@ contract L2StakingTest is L2StakingBaseTest { removed[1] = address(uint160(2)); uint256 initialLength = l2Staking.getStakerAddressesLength(); - l2Staking.removeStakers(removed); + l2Staking.removeStakers(nonce, removed); uint256 finalLength = l2Staking.getStakerAddressesLength(); // Assert that the initial length and the final length are equal. @@ -362,10 +420,12 @@ contract L2StakingTest is L2StakingBaseTest { hevm.startPrank(address(l2CrossDomainMessenger)); // Add a set of new stakers to the L2Staking contract. + uint256 nonce = 0; for (uint256 i = SEQUENCER_SIZE; i < SEQUENCER_SIZE * 2; i++) { address staker = address(uint160(beginSeq + i)); Types.StakerInfo memory stakerInfo = ffi.generateStakerInfo(staker); - l2Staking.addStaker(stakerInfo); + l2Staking.addStaker(nonce, stakerInfo); + nonce++; } // Create an array of addresses to be removed. @@ -373,9 +433,10 @@ contract L2StakingTest is L2StakingBaseTest { removed[0] = address(uint160(beginSeq + 1)); removed[1] = address(uint160(beginSeq + 4)); - l2Staking.removeStakers(removed); + l2Staking.removeStakers(nonce, removed); + nonce++; uint256 initialLength = l2Staking.getStakerAddressesLength(); - l2Staking.removeStakers(removed); + l2Staking.removeStakers(nonce, removed); uint256 finalLength = l2Staking.getStakerAddressesLength(); // Assert that the initial length and the final length are equal. @@ -635,7 +696,7 @@ contract L2StakingTest is L2StakingBaseTest { hevm.startPrank(address(l2CrossDomainMessenger)); address[] memory removed = new address[](1); removed[0] = firstStaker; - l2Staking.removeStakers(removed); + l2Staking.removeStakers(0, removed); hevm.stopPrank(); // sequenser size decrease @@ -1178,7 +1239,7 @@ contract L2StakingTest is L2StakingBaseTest { l2Staking.claimReward(secondStaker, 2); uint256 balanceAfter = morphToken.balanceOf(bob); - // sequncer size = 3 + // sequencer size = 3 // proposal same blocks in epoch 2 // commission = 1 // alice delegate 5 ether morph token @@ -1270,12 +1331,6 @@ contract L2StakingTest is L2StakingBaseTest { assertEq(aliceRewards[1], aliceReward2); assertEq(aliceRewards[2], aliceReward3); - // console.logString("......................"); - // console.logUint(aliceReward1); - // console.logUint(aliceReward2); - // console.logUint(aliceReward3); - // console.logString("......................"); - // *************** epoch = 4 ******************** // time = REWARD_EPOCH * 5; hevm.roll(blocksCountOfEpoch * 5); @@ -1286,22 +1341,11 @@ contract L2StakingTest is L2StakingBaseTest { aliceReward2 = distribute.queryUnclaimed(secondStaker, alice); aliceReward3 = distribute.queryUnclaimed(thirdStaker, alice); - // console.logString("......................"); - // console.logUint(aliceReward1); - // console.logUint(aliceReward2); - // console.logUint(aliceReward3); - // console.logString("......................"); - hevm.startPrank(alice); uint256 balanceBefore = morphToken.balanceOf(alice); l2Staking.claimReward(address(0), 0); uint256 balanceAfter = morphToken.balanceOf(alice); - // console.logString("......................"); - // console.logUint(balanceBefore); - // console.logUint(balanceAfter); - // console.logString("......................"); - assertEq(balanceAfter, balanceBefore + aliceReward1 + aliceReward2 + aliceReward3); hevm.stopPrank(); } @@ -1374,9 +1418,6 @@ contract L2StakingTest is L2StakingBaseTest { assertTrue(aliceReward1 > 0); assertTrue(aliceReward2 > 0); assertTrue(aliceReward3 > 0); - // console.logUint(aliceReward1); - // console.logUint(aliceReward2); - // console.logUint(aliceReward3); assertEq(delegetees[0], firstStaker); assertEq(delegetees[1], secondStaker); assertEq(delegetees[2], thirdStaker); @@ -1389,16 +1430,44 @@ contract L2StakingTest is L2StakingBaseTest { l2Staking.claimReward(address(0), 0); uint256 balanceAfter = morphToken.balanceOf(alice); assertEq(balanceAfter, balanceBefore + aliceReward1 + aliceReward2 + aliceReward3); - // console.logUint(balanceBefore); - // console.logUint(balanceAfter); hevm.stopPrank(); + (delegetees, aliceRewards) = distribute.queryAllUnclaimed(alice); + aliceReward1 = distribute.queryUnclaimed(firstStaker, alice); + aliceReward2 = distribute.queryUnclaimed(secondStaker, alice); + aliceReward3 = distribute.queryUnclaimed(thirdStaker, alice); + assertTrue(aliceReward1 == 0); + assertTrue(aliceReward2 == 0); + assertTrue(aliceReward3 == 0); + + assertEq(delegetees[0], firstStaker); + assertEq(delegetees[1], secondStaker); + assertEq(delegetees[2], thirdStaker); + assertEq(aliceRewards[0], aliceReward1); + assertEq(aliceRewards[1], aliceReward2); + assertEq(aliceRewards[2], aliceReward3); + // *************** epoch = 4 ******************** // time = REWARD_EPOCH * 5; hevm.roll(blocksCountOfEpoch * 5); hevm.warp(time); _updateDistribute(3); + (delegetees, aliceRewards) = distribute.queryAllUnclaimed(alice); + aliceReward1 = distribute.queryUnclaimed(firstStaker, alice); + aliceReward2 = distribute.queryUnclaimed(secondStaker, alice); + aliceReward3 = distribute.queryUnclaimed(thirdStaker, alice); + assertTrue(aliceReward1 > 0); + assertTrue(aliceReward2 > 0); + assertTrue(aliceReward3 > 0); + + assertEq(delegetees[0], firstStaker); + assertEq(delegetees[1], secondStaker); + assertEq(delegetees[2], thirdStaker); + assertEq(aliceRewards[0], aliceReward1); + assertEq(aliceRewards[1], aliceReward2); + assertEq(aliceRewards[2], aliceReward3); + // *************** epoch = 5 ******************** // time = REWARD_EPOCH * 6; hevm.roll(blocksCountOfEpoch * 6); @@ -1412,9 +1481,7 @@ contract L2StakingTest is L2StakingBaseTest { assertTrue(aliceReward1 > 0); assertTrue(aliceReward2 > 0); assertTrue(aliceReward3 > 0); - // console.logUint(aliceReward1); - // console.logUint(aliceReward2); - // console.logUint(aliceReward3); + assertEq(delegetees[0], firstStaker); assertEq(delegetees[1], secondStaker); assertEq(delegetees[2], thirdStaker); @@ -1427,8 +1494,6 @@ contract L2StakingTest is L2StakingBaseTest { l2Staking.claimReward(address(0), 0); balanceAfter = morphToken.balanceOf(alice); assertEq(balanceAfter, balanceBefore + aliceReward1 + aliceReward2 + aliceReward3); - // console.logUint(balanceBefore); - // console.logUint(balanceAfter); hevm.stopPrank(); // *************** epoch = 4 ******************** // @@ -1450,9 +1515,7 @@ contract L2StakingTest is L2StakingBaseTest { assertTrue(aliceReward1 > 0); assertTrue(aliceReward2 > 0); assertTrue(aliceReward3 > 0); - // console.logUint(aliceReward1); - // console.logUint(aliceReward2); - // console.logUint(aliceReward3); + assertEq(delegetees[0], firstStaker); assertEq(delegetees[1], secondStaker); assertEq(delegetees[2], thirdStaker); @@ -1465,8 +1528,6 @@ contract L2StakingTest is L2StakingBaseTest { l2Staking.claimReward(address(0), 0); balanceAfter = morphToken.balanceOf(alice); assertEq(balanceAfter, balanceBefore + aliceReward1 + aliceReward2 + aliceReward3); - // console.logUint(balanceBefore); - // console.logUint(balanceAfter); hevm.stopPrank(); } @@ -1524,7 +1585,6 @@ contract L2StakingTest is L2StakingBaseTest { hevm.roll(blocksCountOfEpoch * (3)); hevm.warp(time); _updateDistribute(1); - // console.logUint(morphToken.inflationMintedEpochs()); // *********************************** // uint256 aliceReward1 = distribute.queryUnclaimed(firstStaker, alice); @@ -1532,11 +1592,6 @@ contract L2StakingTest is L2StakingBaseTest { uint256 aliceReward3 = distribute.queryUnclaimed(thirdStaker, alice); hevm.startPrank(alice); uint256 balanceBefore = morphToken.balanceOf(alice); - // console.logString("......................"); - // console.logUint(balanceBefore); - // console.logUint(aliceReward1); - // console.logUint(aliceReward2); - // console.logUint(aliceReward3); l2Staking.claimReward(address(0), 0); hevm.expectRevert("all reward claimed"); @@ -1547,8 +1602,6 @@ contract L2StakingTest is L2StakingBaseTest { l2Staking.claimReward(thirdStaker, 0); uint256 balanceAfter = morphToken.balanceOf(alice); - // console.logUint(balanceAfter); - // console.logString("......................"); assertEq(balanceAfter, balanceBefore + aliceReward1 + aliceReward2 + aliceReward3); hevm.stopPrank(); @@ -1557,7 +1610,6 @@ contract L2StakingTest is L2StakingBaseTest { hevm.roll(blocksCountOfEpoch * (4)); hevm.warp(time); _updateDistribute(2); - // console.logUint(morphToken.inflationMintedEpochs()); // *********************************** // hevm.startPrank(alice); @@ -1566,23 +1618,15 @@ contract L2StakingTest is L2StakingBaseTest { l2Staking.undelegateStake(thirdStaker); hevm.stopPrank(); - // console.logString("......................"); - // console.logString("......................"); aliceReward1 = distribute.queryUnclaimed(firstStaker, alice); aliceReward2 = distribute.queryUnclaimed(secondStaker, alice); aliceReward3 = distribute.queryUnclaimed(thirdStaker, alice); - // console.logUint(aliceReward1); - // console.logUint(aliceReward2); - // console.logUint(aliceReward3); - // console.logString("......................"); - // console.logString("......................"); // *********************************** // time = REWARD_EPOCH * (5); hevm.roll(blocksCountOfEpoch * (5)); hevm.warp(time); _updateDistribute(3); - // console.logUint(morphToken.inflationMintedEpochs()); // *********************************** // // *********************************** // @@ -1590,7 +1634,6 @@ contract L2StakingTest is L2StakingBaseTest { hevm.roll(blocksCountOfEpoch * (6)); hevm.warp(time); _updateDistribute(4); - // console.logUint(morphToken.inflationMintedEpochs()); // *********************************** // // *********************************** // @@ -1598,7 +1641,6 @@ contract L2StakingTest is L2StakingBaseTest { hevm.roll(blocksCountOfEpoch * (7)); hevm.warp(time); _updateDistribute(5); - // console.logUint(morphToken.inflationMintedEpochs()); // *********************************** // // *********************************** // @@ -1606,7 +1648,6 @@ contract L2StakingTest is L2StakingBaseTest { hevm.roll(blocksCountOfEpoch * (8)); hevm.warp(time); _updateDistribute(6); - // console.logUint(morphToken.inflationMintedEpochs()); // *********************************** // uint256 aliceRewardNew1 = distribute.queryUnclaimed(firstStaker, alice); @@ -1614,50 +1655,124 @@ contract L2StakingTest is L2StakingBaseTest { uint256 aliceRewardNew3 = distribute.queryUnclaimed(thirdStaker, alice); hevm.startPrank(alice); - // console.logString("......................"); balanceBefore = morphToken.balanceOf(alice); uint256 balanceBeforeTmp = balanceBefore; - // console.logUint(balanceBefore); - // console.logString("......................"); - - // l2Staking.claimReward(address(0), 0); - - // console.logString("......................"); - - // console.logUint(aliceRewardNew1); balanceBeforeTmp = morphToken.balanceOf(alice); + l2Staking.claimReward(firstStaker, 0); hevm.expectRevert("no remaining reward"); l2Staking.claimReward(firstStaker, 0); balanceAfter = morphToken.balanceOf(alice); - // console.logUint(balanceAfter); assertEq(balanceAfter, balanceBeforeTmp + aliceRewardNew1); - // console.logString("......................"); - - // console.logUint(aliceRewardNew2); balanceBeforeTmp = morphToken.balanceOf(alice); l2Staking.claimReward(secondStaker, 0); hevm.expectRevert("no remaining reward"); l2Staking.claimReward(secondStaker, 0); balanceAfter = morphToken.balanceOf(alice); - // console.logUint(balanceAfter); assertEq(balanceAfter, balanceBeforeTmp + aliceRewardNew2); - // console.logString("......................"); - - // console.logUint(aliceRewardNew3); balanceBeforeTmp = morphToken.balanceOf(alice); l2Staking.claimReward(thirdStaker, 0); hevm.expectRevert("no remaining reward"); l2Staking.claimReward(thirdStaker, 0); balanceAfter = morphToken.balanceOf(alice); - // console.logUint(balanceAfter); + assertEq(balanceAfter, balanceBeforeTmp + aliceRewardNew3); + assertEq(balanceAfter, balanceBefore + aliceRewardNew1 + aliceRewardNew2 + aliceRewardNew3); - // console.logString("......................"); + hevm.expectRevert("invalid delegator or no remaining reward"); + distribute.queryUnclaimed(firstStaker, alice); + hevm.expectRevert("invalid delegator or no remaining reward"); + distribute.queryUnclaimed(secondStaker, alice); + hevm.expectRevert("invalid delegator or no remaining reward"); + distribute.queryUnclaimed(thirdStaker, alice); + hevm.stopPrank(); + } - assertEq(balanceAfter, balanceBefore + aliceRewardNew1 + aliceRewardNew2 + aliceRewardNew3); + /** + * @notice staking -> distribute -> claim -> undelegate -> distribute -> claim + */ + function test_delegatorClaimAllAfterUndelegateLater1Epoch_succeeds() public { + hevm.startPrank(alice); + morphToken.approve(address(l2Staking), type(uint256).max); + l2Staking.delegateStake(firstStaker, 5 ether); + l2Staking.delegateStake(secondStaker, 5 ether); + l2Staking.delegateStake(thirdStaker, 5 ether); + hevm.stopPrank(); + + uint256 time = REWARD_EPOCH; + hevm.warp(time); + + // reward starting + // rewardStartTime = 86400 + // block.timeStamp >= rewardStartTime + // candidateNumber > 0 + hevm.prank(multisig); + l2Staking.startReward(); + + // staker set commission + hevm.prank(firstStaker); + l2Staking.setCommissionRate(1); + hevm.prank(secondStaker); + l2Staking.setCommissionRate(1); + hevm.prank(thirdStaker); + l2Staking.setCommissionRate(1); + + // *************** epoch = 1 ******************** // + time = REWARD_EPOCH * 2; + hevm.warp(time); + + uint256 blocksCountOfEpoch = REWARD_EPOCH / 3; + hevm.roll(blocksCountOfEpoch * 2); + hevm.prank(oracleAddress); + record.setLatestRewardEpochBlock(blocksCountOfEpoch); + _updateDistribute(0); + + // effectiveEpoch = 2 + hevm.startPrank(bob); + morphToken.approve(address(l2Staking), type(uint256).max); + l2Staking.delegateStake(secondStaker, morphBalance - 5 ether); + hevm.stopPrank(); + + // ranking changed by delegate amount + uint256 secondRanking = l2Staking.stakerRankings(secondStaker); + assertEq(secondRanking, 0 + 1); + + // *********************************** // + time = REWARD_EPOCH * (3); + hevm.roll(blocksCountOfEpoch * (3)); + hevm.warp(time); + _updateDistribute(1); + // *********************************** // + + // *********************************** // + time = REWARD_EPOCH * (4); + hevm.roll(blocksCountOfEpoch * (4)); + hevm.warp(time); + _updateDistribute(2); + // *********************************** // + + hevm.startPrank(alice); + l2Staking.undelegateStake(firstStaker); + l2Staking.undelegateStake(secondStaker); + l2Staking.undelegateStake(thirdStaker); + hevm.stopPrank(); + + // *********************************** // + time = REWARD_EPOCH * (5); + hevm.roll(blocksCountOfEpoch * (5)); + hevm.warp(time); + _updateDistribute(3); + // *********************************** // + + uint256 aliceReward1 = distribute.queryUnclaimed(firstStaker, alice); + uint256 aliceReward2 = distribute.queryUnclaimed(secondStaker, alice); + uint256 aliceReward3 = distribute.queryUnclaimed(thirdStaker, alice); + uint256 balanceBefore = morphToken.balanceOf(alice); + + hevm.startPrank(alice); + l2Staking.claimReward(address(0), 0); hevm.expectRevert("invalid delegator or no remaining reward"); distribute.queryUnclaimed(firstStaker, alice); @@ -1665,6 +1780,16 @@ contract L2StakingTest is L2StakingBaseTest { distribute.queryUnclaimed(secondStaker, alice); hevm.expectRevert("invalid delegator or no remaining reward"); distribute.queryUnclaimed(thirdStaker, alice); + + hevm.expectRevert("no remaining reward"); + l2Staking.claimReward(firstStaker, 0); + hevm.expectRevert("no remaining reward"); + l2Staking.claimReward(secondStaker, 0); + hevm.expectRevert("no remaining reward"); + l2Staking.claimReward(thirdStaker, 0); + uint256 balanceAfter = morphToken.balanceOf(alice); + + assertEq(balanceAfter, balanceBefore + aliceReward1 + aliceReward2 + aliceReward3); hevm.stopPrank(); } @@ -1772,13 +1897,12 @@ contract L2StakingTest is L2StakingBaseTest { hevm.stopPrank(); uint256 alice2Reward = distribute.queryUnclaimed(firstStaker, alice2); - console.log("alice2Reward: ", alice2Reward); hevm.startPrank(alice2); uint256 alice2BalanceBefore = morphToken.balanceOf(alice2); - // console.log("alice2BalanceBefore: ", alice2BalanceBefore); + l2Staking.claimReward(firstStaker, 0); uint256 alice2BalanceAfter = morphToken.balanceOf(alice2); - // console.log("alice2BalanceAfter: ", alice2BalanceAfter); + assertEq(alice2BalanceAfter, alice2BalanceBefore + alice2Reward); hevm.stopPrank(); @@ -1851,11 +1975,6 @@ contract L2StakingTest is L2StakingBaseTest { assertEq(aliceRewards[0], aliceReward1); assertEq(aliceRewards[1], aliceReward2); - // console.logString("......................"); - // console.logUint(aliceReward1); - // console.logUint(aliceReward2); - // console.logString("......................"); - // *************** epoch = 4 ******************** // time = REWARD_EPOCH * 5; hevm.roll(blocksCountOfEpoch * 5); @@ -1871,11 +1990,6 @@ contract L2StakingTest is L2StakingBaseTest { IL2Staking.Undelegation[] memory undelegations = l2Staking.getUndelegations(alice); assertEq(undelegations.length, 2); - // console.logString("......................"); - // console.logUint(aliceReward1); - // console.logUint(aliceReward2); - // console.logString("......................"); - // *************** epoch = 5 ******************** // time = REWARD_EPOCH * 6; hevm.roll(blocksCountOfEpoch * 6); @@ -1885,22 +1999,12 @@ contract L2StakingTest is L2StakingBaseTest { aliceReward1 = distribute.queryUnclaimed(firstStaker, alice); aliceReward2 = distribute.queryUnclaimed(secondStaker, alice); - // console.logString("......................"); - // console.logUint(aliceReward1); - // console.logUint(aliceReward2); - // console.logString("......................"); - hevm.startPrank(alice); uint256 balanceBefore = morphToken.balanceOf(alice); l2Staking.claimReward(firstStaker, 0); l2Staking.claimReward(secondStaker, 0); uint256 balanceAfter = morphToken.balanceOf(alice); - // console.logString("......................"); - // console.logUint(balanceBefore); - // console.logUint(balanceAfter); - // console.logString("......................"); - assertEq(balanceAfter, balanceBefore + aliceReward1 + aliceReward2); hevm.stopPrank(); } @@ -1993,7 +2097,7 @@ contract L2StakingTest is L2StakingBaseTest { l2Staking.claimReward(firstStaker, 0); uint256 balanceAfter = morphToken.balanceOf(alice); - // sequncer size = 3 + // sequencer size = 3 // proposal same blocks in every epoch // commission = 1 // alice delegate 5 ether morph token in epoch 0 - 1, undeletegate at epoch 1. valid reward epoch is 0, 1 @@ -2092,17 +2196,120 @@ contract L2StakingTest is L2StakingBaseTest { l2Staking.delegateStake(thirdStaker, 5 ether); hevm.stopPrank(); - (, address[] memory delegator0) = l2Staking.getAllDelegatorsInPagination(firstStaker, 10, 0); - (, address[] memory delegator1) = l2Staking.getAllDelegatorsInPagination(secondStaker, 10, 0); - (, address[] memory delegator2) = l2Staking.getAllDelegatorsInPagination(thirdStaker, 10, 0); + hevm.startPrank(alice1); + morphToken.approve(address(l2Staking), type(uint256).max); + l2Staking.delegateStake(firstStaker, 5 ether); + l2Staking.delegateStake(secondStaker, 5 ether); + hevm.stopPrank(); - assertEq(delegator0.length, 10); - assertEq(delegator1.length, 10); - assertEq(delegator2.length, 10); + hevm.startPrank(alice2); + morphToken.approve(address(l2Staking), type(uint256).max); + l2Staking.delegateStake(firstStaker, 5 ether); + l2Staking.delegateStake(secondStaker, 5 ether); + hevm.stopPrank(); - assertEq(delegator0[0], alice); - assertEq(delegator1[0], alice); - assertEq(delegator2[0], alice); + hevm.startPrank(alice3); + morphToken.approve(address(l2Staking), type(uint256).max); + l2Staking.delegateStake(firstStaker, 5 ether); + hevm.stopPrank(); + + hevm.startPrank(alice4); + morphToken.approve(address(l2Staking), type(uint256).max); + l2Staking.delegateStake(firstStaker, 5 ether); + hevm.stopPrank(); + + // check firstStaker + { + (uint256 total, address[] memory delegators) = l2Staking.getAllDelegatorsInPagination(firstStaker, 10, 0); + assertEq(total, 5); + assertEq(delegators.length, 10); + assertEq(delegators[0], alice); + assertEq(delegators[1], alice1); + assertEq(delegators[2], alice2); + assertEq(delegators[3], alice3); + assertEq(delegators[4], alice4); + assertEq(delegators[5], address(0)); + } + + { + (uint256 total, address[] memory delegators) = l2Staking.getAllDelegatorsInPagination(firstStaker, 1, 0); + assertEq(total, 5); + assertEq(delegators.length, 1); + assertEq(delegators[0], alice); + } + + { + (uint256 total, address[] memory delegators) = l2Staking.getAllDelegatorsInPagination(firstStaker, 1, 1); + assertEq(total, 5); + assertEq(delegators.length, 1); + assertEq(delegators[0], alice1); + } + + { + (uint256 total, address[] memory delegators) = l2Staking.getAllDelegatorsInPagination(firstStaker, 2, 2); + assertEq(total, 5); + assertEq(delegators.length, 2); + assertEq(delegators[0], alice4); + assertEq(delegators[1], address(0)); + } + + { + (uint256 total, address[] memory delegators) = l2Staking.getAllDelegatorsInPagination(firstStaker, 10, 3); + assertEq(total, 5); + assertEq(delegators.length, 10); + assertEq(delegators[0], address(0)); + assertEq(delegators[1], address(0)); + } + + // check secondStaker + { + (uint256 total, address[] memory delegators) = l2Staking.getAllDelegatorsInPagination(secondStaker, 10, 0); + assertEq(total, 3); + assertEq(delegators.length, 10); + assertEq(delegators[0], alice); + assertEq(delegators[1], alice1); + assertEq(delegators[2], alice2); + assertEq(delegators[3], address(0)); + } + + { + (uint256 total, address[] memory delegators) = l2Staking.getAllDelegatorsInPagination(secondStaker, 2, 1); + assertEq(total, 3); + assertEq(delegators.length, 2); + assertEq(delegators[0], alice2); + assertEq(delegators[1], address(0)); + } + + { + (uint256 total, address[] memory delegators) = l2Staking.getAllDelegatorsInPagination(secondStaker, 2, 2); + assertEq(total, 3); + assertEq(delegators.length, 2); + assertEq(delegators[0], address(0)); + assertEq(delegators[1], address(0)); + } + + // check thirdStaker + { + (uint256 total, address[] memory delegators) = l2Staking.getAllDelegatorsInPagination(thirdStaker, 10, 0); + assertEq(total, 1); + assertEq(delegators.length, 10); + assertEq(delegators[0], alice); + assertEq(delegators[1], address(0)); + } + + { + (uint256 total, address[] memory delegators) = l2Staking.getAllDelegatorsInPagination(thirdStaker, 1, 0); + assertEq(total, 1); + assertEq(delegators.length, 1); + assertEq(delegators[0], alice); + } + + { + (uint256 total, address[] memory delegators) = l2Staking.getAllDelegatorsInPagination(thirdStaker, 1, 1); + assertEq(total, 1); + assertEq(delegators.length, 1); + assertEq(delegators[0], address(0)); + } } /** diff --git a/contracts/contracts/test/L2TxFeeVault.t.sol b/contracts/contracts/test/L2TxFeeVault.t.sol index e8575e2d..c56e9eca 100644 --- a/contracts/contracts/test/L2TxFeeVault.t.sol +++ b/contracts/contracts/test/L2TxFeeVault.t.sol @@ -73,12 +73,6 @@ contract L2TxFeeVaultTest is DSTestPlus { vault.withdraw(amount); } - function test_withdraw_zeroReceiptAddress_reverts() public { - vault.updateRecipient(address(0)); - hevm.expectRevert("FeeVault: recipient address cannot be address(0)"); - vault.withdraw(); - } - function test_withdrawOnce_succeeds() public { hevm.deal(address(vault), 11 ether); @@ -251,7 +245,7 @@ contract L2TxFeeVaultTest is DSTestPlus { hevm.deal(address(vault), 11 ether); hevm.expectEmit(true, true, true, true); - emit L2TxFeeVault.Transfer(address(vault).balance, vault.recipient(), address(this)); + emit L2TxFeeVault.Transfer(address(vault).balance, to, address(this)); vault.transferTo(to); assertEq(address(to).balance, 11 ether); @@ -275,7 +269,7 @@ contract L2TxFeeVaultTest is DSTestPlus { hevm.deal(address(vault), 11 ether); hevm.expectEmit(true, true, true, true); - emit L2TxFeeVault.Transfer(address(vault).balance, vault.recipient(), allowed); + emit L2TxFeeVault.Transfer(address(vault).balance, to, allowed); hevm.prank(allowed); vault.transferTo(to); @@ -291,14 +285,14 @@ contract L2TxFeeVaultTest is DSTestPlus { hevm.deal(address(vault), 20 ether); hevm.expectEmit(true, true, true, true); - emit L2TxFeeVault.Transfer(10 ether, vault.recipient(), address(this)); + emit L2TxFeeVault.Transfer(10 ether, to, address(this)); vault.transferTo(to, 10 ether); assertEq(address(to).balance, 10 ether); assertEq(address(vault).balance, 10 ether); hevm.expectEmit(true, true, true, true); - emit L2TxFeeVault.Transfer(5 ether, vault.recipient(), address(this)); + emit L2TxFeeVault.Transfer(5 ether, to, address(this)); vault.transferTo(to, 5 ether); assertEq(address(to).balance, 15 ether); @@ -326,13 +320,13 @@ contract L2TxFeeVaultTest is DSTestPlus { function test_updateTransferAllowedStatus_withZeroAddress_succeeds() public { address[] memory allowedTransfer = new address[](1); - allowedTransfer[0] = address(0); + allowedTransfer[0] = address(1); hevm.expectEmit(true, true, true, true); emit L2TxFeeVault.UpdateTransferAllowed(allowedTransfer[0], true); vault.updateTransferAllowedStatus(allowedTransfer, true); - assertTrue(vault.transferAllowed(address(0))); + assertTrue(vault.transferAllowed(address(1))); } function test_updateReceiveAllowed_notOwner_reverts() public { @@ -347,7 +341,7 @@ contract L2TxFeeVaultTest is DSTestPlus { address[] memory allowedReceive = new address[](1); allowedReceive[0] = address(0); - hevm.expectRevert("FeeVault: address cannot be address(0)"); + hevm.expectRevert("FeeVault: receive address cannot be address(0)"); vault.updateReceiveAllowed(allowedReceive, true); } @@ -419,7 +413,7 @@ contract L2TxFeeVaultTest is DSTestPlus { function test_updateMinWithdrawAmount_zeroMinWithdrawAmount_succeeds() public { uint256 oldAmount = vault.minWithdrawAmount(); - uint256 newAmount = 0 ether; + uint256 newAmount = 1 ether; hevm.expectEmit(true, true, true, true); emit L2TxFeeVault.UpdateMinWithdrawAmount(oldAmount, newAmount); diff --git a/contracts/contracts/test/Rollup.t.sol b/contracts/contracts/test/Rollup.t.sol index 0e3464ca..92d7d9dd 100644 --- a/contracts/contracts/test/Rollup.t.sol +++ b/contracts/contracts/test/Rollup.t.sol @@ -1,11 +1,12 @@ // SPDX-License-Identifier: MIT pragma solidity =0.8.24; -import {BatchCodecV0} from "../libraries/codec/BatchCodecV0.sol"; import {L1MessageBaseTest} from "./base/L1MessageBase.t.sol"; import {Types} from "../libraries/common/Types.sol"; import {IRollup} from "../l1/rollup/IRollup.sol"; import {IL1Staking} from "../l1/staking/IL1Staking.sol"; +import {BatchHeaderCodecV0} from "../libraries/codec/BatchHeaderCodecV0.sol"; +import {BatchHeaderCodecV1} from "../libraries/codec/BatchHeaderCodecV1.sol"; contract RollupCommitBatchTest is L1MessageBaseTest { address public caller = address(0xb4c79daB8f259C7Aee6E5b2Aa729821864227e84); @@ -56,10 +57,7 @@ contract RollupCommitBatchTest is L1MessageBaseTest { rollup.importGenesisBatch(batchHeader0); bytes32 batchHash0 = rollup.committedBatches(0); - bytes memory bitmap; - bytes memory batch; - - // commit batch1, one batch with one block, 1 tx, 1 L1 message, no skip + // commit batch1, verison 0, one batch with one block, 1 tx, 1 L1 message, no skip // => l1 data hash for batch // 0x9ef1e5694bdb014a1eea42be756a8f63bfd8781d6332e9ef3b5126d90c62f110 // => payload for batch header @@ -76,13 +74,13 @@ contract RollupCommitBatchTest is L1MessageBaseTest { // f1f58308e98844ec99e2990d88bfb36e1a30f0e6591e62af90ae6f8498a1b067 // => hash for parent batch header // 00847173b29b238cf319cde79512b7c213e5a8b4138daa7051914c4592b6dfc7 - bytes memory batchHeader1 = new bytes(249 + 32); + bytes memory batchHeader1 = new bytes(BatchHeaderCodecV0.BATCH_HEADER_LENGTH); assembly { mstore(add(batchHeader1, 0x20), 0) // version mstore(add(batchHeader1, add(0x20, 1)), shl(192, 1)) // batchIndex = 1 mstore(add(batchHeader1, add(0x20, 9)), shl(192, 1)) // l1MessagePopped = 1 mstore(add(batchHeader1, add(0x20, 17)), shl(192, 1)) // totalL1MessagePopped = 1 - mstore(add(batchHeader1, add(0x20, 25)), 0x9ef1e5694bdb014a1eea42be756a8f63bfd8781d6332e9ef3b5126d90c62f110) // dataHash + mstore(add(batchHeader1, add(0x20, 25)), 0xcf774750b0b5e45500519bc354320a44c42c1e1e4faf0766b1141a7d3e5bc2ea) // dataHash mstore(add(batchHeader1, add(0x20, 57)), 0x010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014) // l2 tx blob versioned hash mstore(add(batchHeader1, add(0x20, 89)), bytesData1) // prevStateHash mstore(add(batchHeader1, add(0x20, 121)), bytesData1) // postStateHash @@ -92,15 +90,9 @@ contract RollupCommitBatchTest is L1MessageBaseTest { 0xf1f58308e98844ec99e2990d88bfb36e1a30f0e6591e62af90ae6f8498a1b067 ) // sequencerSetVerifyHash mstore(add(batchHeader1, add(0x20, 217)), batchHash0) // parentBatchHash - mstore(add(batchHeader1, add(0x20, 249)), 0) // bitmap0 - } - batch = new bytes(2 + 60); - assembly { - mstore(add(batch, 0x20), shl(240, 1)) // numBlocks = 1 - mstore(add(batch, add(0x22, 56)), shl(240, 1)) // numTransactions = 1 - mstore(add(batch, add(0x22, 58)), shl(240, 1)) // numL1Messages = 1 } - bitmap = new bytes(32); + uint64 lastBlockNumber = 1; + uint16 numL1Messages = 1; hevm.mockCall( address(rollup.l1StakingContract()), abi.encodeCall(IL1Staking.isActiveStaker, (address(0))), @@ -113,14 +105,22 @@ contract RollupCommitBatchTest is L1MessageBaseTest { ); hevm.startPrank(address(0)); hevm.expectEmit(true, true, false, true); - emit IRollup.CommitBatch(1, bytes32(0x135ab7153517794b38566492dee2a60426285da9764f8ad07da93cf7dd560a59)); - batchDataInput = IRollup.BatchDataInput(0, batchHeader0, batch, bitmap, bytesData1, bytesData1, bytesData3); + emit IRollup.CommitBatch(1, bytes32(0xc1862b08d265f073817a8ce0d7cbb426c16d58a86b93464244ab1d027318642e)); + batchDataInput = IRollup.BatchDataInput( + 0, + batchHeader0, + lastBlockNumber, + numL1Messages, + bytesData1, + bytesData1, + bytesData3 + ); rollup.commitBatch(batchDataInput, batchSignatureInput); hevm.stopPrank(); assertFalse(rollup.isBatchFinalized(1)); bytes32 batchHash1 = rollup.committedBatches(1); - assertEq(batchHash1, bytes32(0x135ab7153517794b38566492dee2a60426285da9764f8ad07da93cf7dd560a59)); + assertEq(batchHash1, bytes32(0xc1862b08d265f073817a8ce0d7cbb426c16d58a86b93464244ab1d027318642e)); bytes32 stateRoot1 = rollup.committedStateRoots(1); assertEq(stateRoot1, bytesData1); @@ -132,24 +132,25 @@ contract RollupCommitBatchTest is L1MessageBaseTest { assertEq(rollup.finalizedStateRoots(1), bytesData1); assertTrue(rollup.withdrawalRoots(bytes32(uint256(3)))); assertEq(rollup.lastFinalizedBatchIndex(), 1); - assertFalse(l1MessageQueueWithGasPriceOracle.isMessageSkipped(0)); assertEq(l1MessageQueueWithGasPriceOracle.pendingQueueIndex(), 1); // check deleted values assertFalse(rollup.batchExist(0)); assertEq(rollup.committedStateRoots(0), 0); - // commit batch2 with 4 blocks, correctly + // commit batch2, verison 1, 4 blocks, correctly // 1. block0 has 3 tx, no L1 messages // 2. block1 has 5 tx, 3 L1 messages, no skips // 3. block2 has 10 tx, 5 L1 messages, even is skipped, last is not skipped // 4. block3 has 300 tx, 256 L1 messages, odd position is skipped, last is not skipped - bytes memory batchHeader2 = new bytes(249 + 32 + 32); + bytes memory batchHeader2 = new bytes(BatchHeaderCodecV1.BATCH_HEADER_LENGTH); + lastBlockNumber = 5; + numL1Messages = 264; assembly { - mstore(add(batchHeader2, 0x20), 0) // version + mstore(add(batchHeader2, 0x20), shl(248, 1)) // version mstore(add(batchHeader2, add(0x20, 1)), shl(192, 2)) // batchIndex = 2 mstore(add(batchHeader2, add(0x20, 9)), shl(192, 264)) // l1MessagePopped = 264 mstore(add(batchHeader2, add(0x20, 17)), shl(192, 265)) // totalL1MessagePopped = 265 - mstore(add(batchHeader2, add(0x20, 25)), 0xc67045fcf768071021f5acec08a921553fdae4c33a675d38e4c4a25589c91120) // dataHash + mstore(add(batchHeader2, add(0x20, 25)), 0x688bd49eddb8f52296974c2a243b10b91b305edd68f46190df21a83c13a6e2ec) // dataHash mstore(add(batchHeader2, add(0x20, 57)), 0x010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014) // l2 tx blob versioned hash mstore(add(batchHeader2, add(0x20, 89)), bytesData1) // prevStateHash mstore(add(batchHeader2, add(0x20, 121)), bytesData1) // postStateHash @@ -159,32 +160,7 @@ contract RollupCommitBatchTest is L1MessageBaseTest { 0xf1f58308e98844ec99e2990d88bfb36e1a30f0e6591e62af90ae6f8498a1b067 ) // sequencerSetVerifyHash mstore(add(batchHeader2, add(0x20, 217)), batchHash1) // parentBatchHash - mstore( - add(batchHeader2, add(0x20, 249)), - 77194726158210796949047323339125271902179989777093709359638389338608753093160 - ) // bitmap0 - mstore(add(batchHeader2, add(0x20, 281)), 42) // bitmap1 - } - batch = new bytes(2 + 60 * 4); - assembly { - mstore(add(batch, 0x20), shl(240, 4)) // numBlocks = 4 - mstore(add(batch, add(34, 56)), shl(240, 3)) // block0.numTransactions = 3 - mstore(add(batch, add(34, 58)), shl(240, 0)) // block0.numL1Messages = 0 - mstore(add(batch, add(94, 56)), shl(240, 5)) // block1.numTransactions = 5 - mstore(add(batch, add(94, 58)), shl(240, 3)) // block1.numL1Messages = 3 - mstore(add(batch, add(154, 56)), shl(240, 10)) // block2.numTransactions = 10 - mstore(add(batch, add(154, 58)), shl(240, 5)) // block2.numL1Messages = 5 - mstore(add(batch, add(214, 56)), shl(240, 300)) // block3.numTransactions = 300 - mstore(add(batch, add(214, 58)), shl(240, 256)) // block3.numL1Messages = 256 - } - - bitmap = new bytes(64); - assembly { - mstore( - add(bitmap, add(0x20, 0)), - 77194726158210796949047323339125271902179989777093709359638389338608753093160 - ) // bitmap0 - mstore(add(bitmap, add(0x20, 32)), 42) // bitmap1 + mstore(add(batchHeader2, add(0x20, 249)), shl(192, lastBlockNumber)) // lastBlockNumber } hevm.prank(multisig); @@ -200,15 +176,23 @@ contract RollupCommitBatchTest is L1MessageBaseTest { ); hevm.startPrank(address(0)); hevm.expectEmit(true, true, false, true); - emit IRollup.CommitBatch(2, bytes32(0x71259c7573b1db248381cef917270058e2ca20620c6eae975a1aa76b9858392a)); + emit IRollup.CommitBatch(2, bytes32(0x772132c2e12f21bfc5f2792838e480830f2c1dd2be0f3207b159905a9f321038)); - batchDataInput = IRollup.BatchDataInput(0, batchHeader1, batch, bitmap, bytesData1, bytesData1, bytesData4); + batchDataInput = IRollup.BatchDataInput( + 1, + batchHeader1, + lastBlockNumber, + numL1Messages, + bytesData1, + bytesData1, + bytesData4 + ); rollup.commitBatch(batchDataInput, batchSignatureInput); hevm.stopPrank(); assertFalse(rollup.isBatchFinalized(2)); bytes32 batchHash2 = rollup.committedBatches(2); - assertEq(batchHash2, bytes32(0x71259c7573b1db248381cef917270058e2ca20620c6eae975a1aa76b9858392a)); + assertEq(batchHash2, bytes32(0x772132c2e12f21bfc5f2792838e480830f2c1dd2be0f3207b159905a9f321038)); bytes32 stateRoot2 = rollup.committedStateRoots(2); assertEq(stateRoot2, bytesData1); @@ -227,27 +211,6 @@ contract RollupCommitBatchTest is L1MessageBaseTest { // check deleted values assertFalse(rollup.batchExist(1)); assertEq(rollup.committedStateRoots(1), 0); - - // 1 ~ 4, zero - for (uint256 i = 1; i < 4; i++) { - assertFalse(l1MessageQueueWithGasPriceOracle.isMessageSkipped(i)); - } - // 4 ~ 9, even is nonzero, odd is zero - for (uint256 i = 4; i < 9; i++) { - if (i % 2 == 1 || i == 8) { - assertFalse(l1MessageQueueWithGasPriceOracle.isMessageSkipped(i)); - } else { - assertTrue(l1MessageQueueWithGasPriceOracle.isMessageSkipped(i)); - } - } - // 9 ~ 265, even is nonzero, odd is zero - for (uint256 i = 9; i < 265; i++) { - if (i % 2 == 1 || i == 264) { - assertFalse(l1MessageQueueWithGasPriceOracle.isMessageSkipped(i)); - } else { - assertTrue(l1MessageQueueWithGasPriceOracle.isMessageSkipped(i)); - } - } } } @@ -309,60 +272,21 @@ contract RollupTest is L1MessageBaseTest { // only active staker allowed, revert hevm.startPrank(address(0)); hevm.expectRevert("only active staker allowed"); - batchDataInput = IRollup.BatchDataInput( - 0, - batchHeader0, - new bytes(0), - new bytes(0), - stateRoot, - stateRoot, - getTreeRoot() - ); + batchDataInput = IRollup.BatchDataInput(0, batchHeader0, 0, 0, stateRoot, stateRoot, getTreeRoot()); rollup.commitBatch(batchDataInput, batchSignatureInput); hevm.stopPrank(); // invalid version, revert hevm.startPrank(alice); hevm.expectRevert("invalid version"); - batchDataInput = IRollup.BatchDataInput( - 1, - batchHeader0, - new bytes(0), - new bytes(0), - stateRoot, - stateRoot, - getTreeRoot() - ); + batchDataInput = IRollup.BatchDataInput(2, batchHeader0, 0, 0, stateRoot, stateRoot, getTreeRoot()); rollup.commitBatch(batchDataInput, batchSignatureInput); hevm.stopPrank(); - // batch is empty, revert - hevm.startPrank(alice); - hevm.expectRevert("batch is empty"); - batchDataInput = IRollup.BatchDataInput( - 0, - batchHeader0, - new bytes(0), - new bytes(0), - stateRoot, - stateRoot, - getTreeRoot() - ); - rollup.commitBatch(batchDataInput, batchSignatureInput); - hevm.stopPrank(); - - // batch header length too small, revert + // batch header length incorrect, revert hevm.startPrank(alice); hevm.expectRevert("batch header length too small"); - batchDataInput = IRollup.BatchDataInput( - 0, - new bytes(120), - new bytes(1), - new bytes(0), - stateRoot, - stateRoot, - getTreeRoot() - ); + batchDataInput = IRollup.BatchDataInput(0, new bytes(120), 0, 0, stateRoot, stateRoot, getTreeRoot()); rollup.commitBatch(batchDataInput, batchSignatureInput); hevm.stopPrank(); @@ -372,15 +296,7 @@ contract RollupTest is L1MessageBaseTest { } hevm.startPrank(alice); hevm.expectRevert("incorrect batch index"); - batchDataInput = IRollup.BatchDataInput( - 0, - batchHeader0, - new bytes(1), - new bytes(0), - stateRoot, - stateRoot, - getTreeRoot() - ); + batchDataInput = IRollup.BatchDataInput(0, batchHeader0, 0, 0, stateRoot, stateRoot, getTreeRoot()); rollup.commitBatch(batchDataInput, batchSignatureInput); hevm.stopPrank(); assembly { @@ -393,15 +309,7 @@ contract RollupTest is L1MessageBaseTest { } hevm.startPrank(alice); hevm.expectRevert("incorrect parent batch hash"); - batchDataInput = IRollup.BatchDataInput( - 0, - batchHeader0, - new bytes(1), - new bytes(0), - stateRoot, - stateRoot, - getTreeRoot() - ); + batchDataInput = IRollup.BatchDataInput(0, batchHeader0, 0, 0, stateRoot, stateRoot, getTreeRoot()); rollup.commitBatch(batchDataInput, batchSignatureInput); hevm.stopPrank(); assembly { @@ -412,122 +320,20 @@ contract RollupTest is L1MessageBaseTest { // incorrect previous state root, revert hevm.startPrank(alice); hevm.expectRevert("incorrect previous state root"); - batchDataInput = IRollup.BatchDataInput( - 0, - batchHeader0, - new bytes(1), - new bytes(0), - bytes32(uint256(2)), - stateRoot, - getTreeRoot() - ); - rollup.commitBatch(batchDataInput, batchSignatureInput); - hevm.stopPrank(); - - // wrong bitmap length, revert - hevm.startPrank(alice); - hevm.expectRevert("wrong bitmap length"); - batchDataInput = IRollup.BatchDataInput( - 0, - new bytes(250), - new bytes(1), - new bytes(0), - stateRoot, - stateRoot, - getTreeRoot() - ); + batchDataInput = IRollup.BatchDataInput(0, batchHeader0, 0, 0, bytes32(uint256(2)), stateRoot, getTreeRoot()); rollup.commitBatch(batchDataInput, batchSignatureInput); hevm.stopPrank(); - // no block in batch, revert - bytes memory batch = new bytes(2); + // incorrect batch header length, revert hevm.startPrank(alice); - hevm.expectRevert(BatchCodecV0.ErrorNoBlockInBatch.selector); - batchDataInput = IRollup.BatchDataInput( - 0, - batchHeader0, - batch, - new bytes(0), - stateRoot, - stateRoot, - getTreeRoot() - ); - rollup.commitBatch(batchDataInput, batchSignatureInput); - hevm.stopPrank(); - - // invalid batch length, revert - batch = new bytes(3); - batch[1] = bytes1(uint8(1)); // one block in this batch - hevm.startPrank(alice); - hevm.expectRevert(BatchCodecV0.ErrorIncorrectBatchLength.selector); - batchDataInput = IRollup.BatchDataInput( - 0, - batchHeader0, - batch, - new bytes(0), - stateRoot, - stateRoot, - getTreeRoot() - ); - rollup.commitBatch(batchDataInput, batchSignatureInput); - hevm.stopPrank(); - - // cannot skip last L1 message, revert - batch = new bytes(2 + 60); - bytes memory bitmap = new bytes(32); - batch[1] = bytes1(uint8(1)); // one block in this batch - batch[59] = bytes1(uint8(1)); // numTransactions = 1 - batch[61] = bytes1(uint8(1)); // numL1Messages = 1 - bitmap[31] = bytes1(uint8(1)); - hevm.startPrank(alice); - hevm.expectRevert("cannot skip last L1 message"); - batchDataInput = IRollup.BatchDataInput(0, batchHeader0, batch, bitmap, stateRoot, stateRoot, getTreeRoot()); - rollup.commitBatch(batchDataInput, batchSignatureInput); - hevm.stopPrank(); - - // num txs less than num L1 msgs, revert - batch = new bytes(2 + 60); - bitmap = new bytes(32); - batch[1] = bytes1(uint8(1)); // one block in this batch - batch[59] = bytes1(uint8(1)); // numTransactions = 1 - batch[61] = bytes1(uint8(3)); // numL1Messages = 3 - bitmap[31] = bytes1(uint8(3)); - hevm.startPrank(alice); - hevm.expectRevert("num txs less than num L1 msgs"); - batchDataInput = IRollup.BatchDataInput(0, batchHeader0, batch, bitmap, stateRoot, stateRoot, getTreeRoot()); - rollup.commitBatch(batchDataInput, batchSignatureInput); - hevm.stopPrank(); - - // invalid batch length, revert - batch = new bytes(2 + 60 + 1); - batch[1] = bytes1(uint8(1)); // one block in this batch - hevm.startPrank(alice); - hevm.expectRevert(BatchCodecV0.ErrorIncorrectBatchLength.selector); - batchDataInput = IRollup.BatchDataInput( - 0, - batchHeader0, - batch, - new bytes(0), - stateRoot, - stateRoot, - getTreeRoot() - ); + hevm.expectRevert("batch header length too small"); + batchDataInput = IRollup.BatchDataInput(0, new bytes(248), 0, 0, stateRoot, stateRoot, getTreeRoot()); rollup.commitBatch(batchDataInput, batchSignatureInput); hevm.stopPrank(); // commit batch with one chunk, no tx, correctly - batch = new bytes(2 + 60); - batch[1] = bytes1(uint8(1)); // one block in this batch hevm.startPrank(alice); - batchDataInput = IRollup.BatchDataInput( - 0, - batchHeader0, - batch, - new bytes(0), - stateRoot, - stateRoot, - getTreeRoot() - ); + batchDataInput = IRollup.BatchDataInput(0, batchHeader0, 1, 0, stateRoot, stateRoot, getTreeRoot()); hevm.deal(address(0), 10 ether); rollup.commitBatch(batchDataInput, batchSignatureInput); hevm.stopPrank(); @@ -536,15 +342,7 @@ contract RollupTest is L1MessageBaseTest { // batch is already committed, revert hevm.startPrank(alice); hevm.expectRevert("batch already committed"); - batchDataInput = IRollup.BatchDataInput( - 0, - batchHeader0, - batch, - new bytes(0), - stateRoot, - stateRoot, - getTreeRoot() - ); + batchDataInput = IRollup.BatchDataInput(0, batchHeader0, 1, 0, stateRoot, stateRoot, getTreeRoot()); rollup.commitBatch(batchDataInput, batchSignatureInput); hevm.stopPrank(); } @@ -571,28 +369,18 @@ contract RollupTest is L1MessageBaseTest { bytes32 batchHash0 = rollup.committedBatches(0); // commit one batch - bytes memory batch = new bytes(2 + 60); - batch[1] = bytes1(uint8(1)); // one block in this batch hevm.startPrank(alice); - batchDataInput = IRollup.BatchDataInput( - 0, - batchHeader0, - batch, - new bytes(0), - stateRoot, - stateRoot, - bytes32(uint256(4)) - ); + batchDataInput = IRollup.BatchDataInput(0, batchHeader0, 1, 0, stateRoot, stateRoot, bytes32(uint256(4))); rollup.commitBatch(batchDataInput, batchSignatureInput); // first chunk with too many txs hevm.stopPrank(); - assertEq(rollup.committedBatches(1), 0xb7cb76cf9e9f5878136c1d14e095f5d5b435fe8252cad6eb100e51110033b6ed); + assertEq(rollup.committedBatches(1), 0x25c3e4fee90e53de960c1092746c431ab570eacf8513011902fa65f10c814541); bytes memory batchHeader1 = new bytes(249); assembly { mstore(add(batchHeader1, 0x20), 0) // version mstore(add(batchHeader1, add(0x20, 1)), shl(192, 1)) // batchIndex mstore(add(batchHeader1, add(0x20, 9)), 0) // l1MessagePopped mstore(add(batchHeader1, add(0x20, 17)), 0) // totalL1MessagePopped - mstore(add(batchHeader1, add(0x20, 25)), 0x7cdb9d7f02ea58dfeb797ed6b4f7ea68846e4f2b0e30ed1535fc98b60c4ec809) // dataHash + mstore(add(batchHeader1, add(0x20, 25)), 0xe979da4b80d60a17ce56fa19278c6f3a7e1b43359fb8a8ea46d0264de7d653ab) // dataHash mstore(add(batchHeader1, add(0x20, 57)), 0x010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014) // l2 tx blob versioned hash mstore(add(batchHeader1, add(0x20, 89)), bytesData1) // prevStateHash mstore(add(batchHeader1, add(0x20, 121)), bytesData1) // postStateHash @@ -607,15 +395,7 @@ contract RollupTest is L1MessageBaseTest { // commit another batch hevm.startPrank(alice); - batchDataInput = IRollup.BatchDataInput( - 0, - batchHeader1, - batch, - new bytes(0), - stateRoot, - stateRoot, - bytes32(uint256(4)) - ); + batchDataInput = IRollup.BatchDataInput(0, batchHeader1, 1, 0, stateRoot, stateRoot, bytes32(uint256(4))); rollup.commitBatch(batchDataInput, batchSignatureInput); // first chunk with too many txs hevm.stopPrank(); @@ -627,9 +407,9 @@ contract RollupTest is L1MessageBaseTest { // incorrect batch hash, revert hevm.expectRevert("incorrect batch hash"); - batchHeader1[0] = bytes1(uint8(1)); // change version to 1 + batchHeader1[1] = bytes1(uint8(1)); // change 2nd byte to 1 rollup.revertBatch(batchHeader1, 1); - batchHeader1[0] = bytes1(uint8(0)); // change back + batchHeader1[1] = bytes1(uint8(0)); // change back // revert middle batch, revert hevm.expectRevert("reverting must start from the ending"); @@ -671,15 +451,7 @@ contract RollupTest is L1MessageBaseTest { hevm.startPrank(alice); hevm.expectRevert("Pausable: paused"); - batchDataInput = IRollup.BatchDataInput( - 0, - new bytes(0), - new bytes(0), - new bytes(0), - stateRoot, - stateRoot, - bytes32(uint256(4)) - ); + batchDataInput = IRollup.BatchDataInput(0, new bytes(0), 0, 0, stateRoot, stateRoot, bytes32(uint256(4))); rollup.commitBatch(batchDataInput, batchSignatureInput); hevm.expectRevert("Pausable: paused"); @@ -714,13 +486,22 @@ contract RollupTest is L1MessageBaseTest { function test_importGenesisBlock_succeeds() public { bytes memory batchHeader; bytes32 bytesData1 = bytes32(uint256(1)); + // invalid batch index, revert + batchHeader = new bytes(249); + assembly { + mstore(add(batchHeader, add(0x20, 1)), shl(192, 1)) // batchIndex = 1 + } + hevm.expectRevert("invalid batch index"); + hevm.prank(multisig); + rollup.importGenesisBatch(batchHeader); + // zero state root, revert batchHeader = new bytes(249); hevm.expectRevert("zero state root"); hevm.prank(multisig); rollup.importGenesisBatch(batchHeader); - // batch header length too small, revert + // batch header length incorrect, revert batchHeader = new bytes(248); assembly { mstore(add(batchHeader, add(0x20, 121)), bytesData1) // stateRootHsash @@ -729,17 +510,8 @@ contract RollupTest is L1MessageBaseTest { hevm.prank(multisig); rollup.importGenesisBatch(batchHeader); - // wrong bitmap length, revert - batchHeader = new bytes(250); - assembly { - mstore(add(batchHeader, add(0x20, 121)), bytesData1) // stateRootHsash - } - hevm.expectRevert("wrong bitmap length"); - hevm.prank(multisig); - rollup.importGenesisBatch(batchHeader); - // not all fields are zero, revert - batchHeader = new bytes(249 + 32); + batchHeader = new bytes(249); assembly { mstore(add(batchHeader, add(0x20, 9)), shl(192, 1)) // l1MessagePopped not zero mstore(add(batchHeader, add(0x20, 121)), bytesData1) // stateRootHsash diff --git a/contracts/contracts/test/ZkEvmVerifierV1.t.sol b/contracts/contracts/test/ZkEvmVerifierV1.t.sol index 47f4be4d..9ff08b2d 100644 --- a/contracts/contracts/test/ZkEvmVerifierV1.t.sol +++ b/contracts/contracts/test/ZkEvmVerifierV1.t.sol @@ -33,16 +33,17 @@ contract EvmTest is Test { } // Prove state success. - function test_ValidProof() public view { + function test_ValidProof() public { ProofFixture memory fixture = loadFixture(); evm.verifyPlonk(fixture.proof, fixture.publicValues); } // Prove state fail. - function testFail_InValidProof() public view { + function testRevert_InValidProof() public { + vm.expectRevert(); ProofFixture memory fixture = loadFixture(); // Create a fake proof. fixture.proof[31] = 0x00; evm.verifyPlonk(fixture.proof, fixture.publicValues); } -} \ No newline at end of file +} diff --git a/contracts/contracts/test/base/BatchHeaderCodeV0.t.sol b/contracts/contracts/test/base/BatchHeaderCodeV0.t.sol index d7533aa8..9ecabccd 100644 --- a/contracts/contracts/test/base/BatchHeaderCodeV0.t.sol +++ b/contracts/contracts/test/base/BatchHeaderCodeV0.t.sol @@ -17,7 +17,7 @@ contract BatchHeaderCodeV0Test is DSTestPlus { } function test_btach_decode() public { - bytes memory batchHeader0 = new bytes(249 + 32); + bytes memory batchHeader0 = new bytes(249); assembly { mstore(add(batchHeader0, 0x20), shl(248, 1)) // version mstore(add(batchHeader0, add(0x20, 1)), shl(192, 1)) // batchIndex = 1 @@ -30,7 +30,6 @@ contract BatchHeaderCodeV0Test is DSTestPlus { mstore(add(batchHeader0, add(0x20, 153)), ZERO_VERSIONED_HASH) // withdrawRootHash mstore(add(batchHeader0, add(0x20, 185)), ZERO_VERSIONED_HASH) // sequencerSetVerifyHash mstore(add(batchHeader0, add(0x20, 217)), ZERO_VERSIONED_HASH) // parentBatchHash - mstore(add(batchHeader0, add(0x20, 249)), 0) // bitmap0 } uint256 version = codecTest.getVersion(batchHeader0); @@ -78,7 +77,6 @@ contract BatchHeaderCodeV0Test is DSTestPlus { add(batchHeader0, add(0x20, 217)), 0x5db199130d0c9334530358520a66d09c98c62325011a3665cf3efcc93e77623c ) // parentBatchHash - mstore(add(batchHeader0, add(0x20, 249)), 0) // bitmap0 } { uint256 version = codecTest.getVersion(batchHeader0); diff --git a/contracts/deploy/013-DeployProxys.ts b/contracts/deploy/013-DeployProxys.ts index 334cfe82..24545613 100644 --- a/contracts/deploy/013-DeployProxys.ts +++ b/contracts/deploy/013-DeployProxys.ts @@ -1,6 +1,7 @@ import "@nomiclabs/hardhat-web3" import "@nomiclabs/hardhat-ethers" import "@nomiclabs/hardhat-waffle" +import { Mutex } from 'async-mutex'; import { HardhatRuntimeEnvironment } from "hardhat/types" import { storage, getContractAddressByName, assertContractVariableWithSigner } from "../src/deploy-utils" @@ -188,4 +189,132 @@ export const deployContractProxies = async ( return "" } -export default deployContractProxies +export const deployContractProxyByStorageNameWithNonce = async ( + hre: HardhatRuntimeEnvironment, + path: string, + deployer: any, + storageName: string, + nonce: number +): Promise => { + try { + const emptyContractImplAddr = getContractAddressByName(path, ImplStorageName.EmptyContract); + const ProxyFactoryName = ContractFactoryName.DefaultProxy; + + const ProxyFactory = await hre.ethers.getContractFactory(ProxyFactoryName); + // TransparentUpgradeableProxy deploy with emptyContract as impl, deployer as admin + const proxy = await ProxyFactory.deploy(emptyContractImplAddr, await deployer.getAddress(), "0x", { + nonce: nonce, + }); + await proxy.deployed() + console.log( + `%s=%s ; TX_HASH: %s`, + storageName, + proxy.address.toLocaleLowerCase(), + proxy.deployTransaction.hash + ); + + // check params + const IProxyContract = await hre.ethers.getContractAt(ContractFactoryName.DefaultProxyInterface, proxy.address); + + console.log(await IProxyContract.admin()); + await assertContractVariableWithSigner(IProxyContract, "admin", await deployer.getAddress()); + const blockNumber = await hre.ethers.provider.getBlockNumber(); + console.log("BLOCK_NUMBER: %s", blockNumber); + const err = await storage(path, storageName, proxy.address.toLocaleLowerCase(), blockNumber || 0); + if (err !== "") { + throw new Error(err); + } + + return ""; + } catch (error) { + console.error(`Error deploying ${storageName}:`, error); + return error.message || "Unknown error"; + } +}; + +export const deployContractProxiesConcurrently = async ( + hre: HardhatRuntimeEnvironment, + path: string, + deployer: any, + config: any +): Promise => { + const WETHFactoryName = ContractFactoryName.WETH; + const WETHImplStorageName = ImplStorageName.WETH; + + try { + if (config.l1WETHAddress == "") { + const Factory = await hre.ethers.getContractFactory(WETHFactoryName); + const contract = await Factory.deploy(); + await contract.deployed(); + console.log( + "%s=%s ; TX_HASH: %s", + WETHImplStorageName, + contract.address.toLocaleLowerCase(), + contract.deployTransaction.hash + ); + + const blockNumber = await hre.ethers.provider.getBlockNumber(); + console.log("BLOCK_NUMBER: %s", blockNumber); + + const err = await storage(path, WETHImplStorageName, contract.address.toLocaleLowerCase(), blockNumber || 0); + if (err != "") { + return err; + } + } else { + const blockNumber = await hre.ethers.provider.getBlockNumber(); + const err = await storage(path, WETHImplStorageName, config.l1WETHAddress.toLocaleLowerCase(), blockNumber || 0); + if (err != "") { + return err; + } + } + + console.log("Start to deploy proxies concurrently...") + + const proxyStorageNames = [ + ProxyStorageName.L1CrossDomainMessengerProxyStorageName, + ProxyStorageName.L1MessageQueueWithGasPriceOracleProxyStorageName, + ProxyStorageName.L1StakingProxyStorageName, + ProxyStorageName.RollupProxyStorageName, + ProxyStorageName.L1GatewayRouterProxyStorageName, + ProxyStorageName.L1ETHGatewayProxyStorageName, + ProxyStorageName.L1StandardERC20GatewayProxyStorageName, + ProxyStorageName.L1CustomERC20GatewayProxyStorageName, + ProxyStorageName.L1WithdrawLockERC20GatewayProxyStorageName, + ProxyStorageName.L1ReverseCustomGatewayProxyStorageName, + ProxyStorageName.L1ERC721GatewayProxyStorageName, + ProxyStorageName.L1ERC1155GatewayProxyStorageName, + ProxyStorageName.EnforcedTxGatewayProxyStorageName, + ProxyStorageName.L1WETHGatewayProxyStorageName, + ProxyStorageName.L1USDCGatewayProxyStorageName, + ]; + + let nonce = await hre.ethers.provider.getTransactionCount(deployer.getAddress()) + const mutex = new Mutex(); + const results = await Promise.all( + proxyStorageNames.map(async (storageName) => { + console.log(`Starting deployment for: ${storageName}`); + const release = await mutex.acquire(); // Acquire lock for getting nonce + const nonceToUse = nonce + nonce++; // Increment nonce for each deployment + release(); // Release the lock + + const result = await deployContractProxyByStorageNameWithNonce(hre, path, deployer, storageName, nonceToUse); + console.log(`Deployment completed for: ${storageName}`); + return result; + }) + ); + + const errors = results.filter((err) => err !== ""); + if (errors.length > 0) { + return `Deployment failed with errors: ${errors.join(", ")}`; + } + } catch (error) { + console.error("Error during deployment:", error); + return `Deployment failed with error: ${error.message}`; + } + + return ""; +}; + + +export default deployContractProxies \ No newline at end of file diff --git a/contracts/deploy/014-DeployImpls.ts b/contracts/deploy/014-DeployImpls.ts index 06a58ef1..ed065370 100644 --- a/contracts/deploy/014-DeployImpls.ts +++ b/contracts/deploy/014-DeployImpls.ts @@ -7,6 +7,7 @@ import { } from 'hardhat/types'; import { assertContractVariable, storage, getContractAddressByName } from "../src/deploy-utils"; import { predeploys } from '../src/constants' +import { Mutex } from 'async-mutex'; import { ImplStorageName, @@ -14,6 +15,129 @@ import { ContractFactoryName, } from "../src/types" +export const deployContractImplsConcurrently = async ( + hre: HardhatRuntimeEnvironment, + path: string, + deployer: any, + config: any +): Promise => { + // factory name + const L1CrossDomainMessengerFactoryName = ContractFactoryName.L1CrossDomainMessenger + const L1StakingFactoryName = ContractFactoryName.L1Staking + const L1MessageQueueWithGasPriceOracleFactoryName = ContractFactoryName.L1MessageQueueWithGasPriceOracle + const RollupFactoryName = ContractFactoryName.Rollup + const WhitelistFactoryName = ContractFactoryName.Whitelist + + const L1GatewayRouterFactoryName = ContractFactoryName.L1GatewayRouter + const L1ETHGatewayFactoryName = ContractFactoryName.L1ETHGateway + const L1StandardERC20GatewayFactoryName = ContractFactoryName.L1StandardERC20Gateway + const L1CustomERC20GatewayFactoryName = ContractFactoryName.L1CustomERC20Gateway + const L1WithdrawLockERC20GatewayFactoryName = ContractFactoryName.L1WithdrawLockERC20Gateway + const L1ReverseCustomGatewayFactoryName = ContractFactoryName.L1ReverseCustomGateway + const L1ERC721GatewayFactoryName = ContractFactoryName.L1ERC721Gateway + const L1ERC1155GatewayFactoryName = ContractFactoryName.L1ERC1155Gateway + const L1WETHGatewayFactoryName = ContractFactoryName.L1WETHGateway + const EnforcedTxGatewayFactoryName = ContractFactoryName.EnforcedTxGateway + + // implement storage name + const L1CrossDomainMessengerImplStorageName = ImplStorageName.L1CrossDomainMessengerStorageName + const StakingImplStorageName = ImplStorageName.L1StakingStorageName + const L1MessageQueueWithGasPriceOracleImplStorageName = ImplStorageName.L1MessageQueueWithGasPriceOracle + const RollupImplStorageName = ImplStorageName.RollupStorageName + const L1GatewayRouterImplStorageName = ImplStorageName.L1GatewayRouterStorageName + const L1ETHGatewayImplStorageName = ImplStorageName.L1ETHGatewayStorageName + const L1StandardERC20GatewayImplStorageName = ImplStorageName.L1StandardERC20GatewayStorageName + const L1CustomERC20GatewayImplStorageName = ImplStorageName.L1CustomERC20GatewayStorageName + const L1WithdrawLockERC20GatewayImplStorageName = ImplStorageName.L1WithdrawLockERC20GatewayStorageName + const L1ReverseCustomGatewayImplStorageName = ImplStorageName.L1ReverseCustomGatewayStorageName + const L1WETHGatewayImplStorageName = ImplStorageName.L1WETHGatewayStorageName + const L1ERC721GatewayImplStorageName = ImplStorageName.L1ERC721GatewayStorageName + const L1ERC1155GatewayImplStorageName = ImplStorageName.L1ERC1155GatewayStorageName + const WhitelistImplStorageName = ImplStorageName.Whitelist + const EnforcedTxGatewayStorageName = ImplStorageName.EnforcedTxGatewayStorageName + + // proxy contract address + const L1CrossDomainMessengerProxyAddress = getContractAddressByName(path, ProxyStorageName.L1CrossDomainMessengerProxyStorageName) + const RollupProxyAddress = getContractAddressByName(path, ProxyStorageName.RollupProxyStorageName) + const EnforcedTxGatewayAddress = getContractAddressByName(path, ProxyStorageName.EnforcedTxGatewayProxyStorageName) + + console.log("start to deploy contract implementations concurrently...") + let nonce = await hre.ethers.provider.getTransactionCount(deployer.getAddress()) + const mutex = new Mutex(); + const deployContract = async (factoryName: string, storageName: string, args: any[] = []) => { + const release = await mutex.acquire(); + const nonceToUse = nonce + nonce++; // Increment nonce for each deployment + release(); // Release the lock + + console.log(`Starting deployment for: ${storageName}, args: ${args}, nonce: `, nonceToUse); + const Factory = await hre.ethers.getContractFactory(factoryName) + const contract = await Factory.deploy(...args, { + nonce: nonceToUse, + }) + + + await contract.deployed() + console.log("%s=%s ; TX_HASH: %s", storageName, contract.address.toLocaleLowerCase(), contract.deployTransaction.hash); + + if (factoryName == L1StakingFactoryName) { + await assertContractVariable( + contract, + 'MESSENGER', + L1CrossDomainMessengerProxyAddress + ) + await assertContractVariable( + contract, + 'OTHER_STAKING', + predeploys.L2Staking.toLowerCase() + ) + } + const blockNumber = await hre.ethers.provider.getBlockNumber() + console.log("BLOCK_NUMBER: %s", blockNumber) + console.log(`Deployment completed for: ${storageName}`); + const err = await storage(path, storageName, contract.address.toLocaleLowerCase(), blockNumber || 0) + return err + } + + try { + const deployPromises = [] + + deployPromises.push(deployContract(WhitelistFactoryName, WhitelistImplStorageName, [config.contractAdmin])) + deployPromises.push(deployContract(L1CrossDomainMessengerFactoryName, L1CrossDomainMessengerImplStorageName)) + deployPromises.push(deployContract(L1MessageQueueWithGasPriceOracleFactoryName, L1MessageQueueWithGasPriceOracleImplStorageName, [L1CrossDomainMessengerProxyAddress, RollupProxyAddress, EnforcedTxGatewayAddress])) + deployPromises.push(deployContract(RollupFactoryName, RollupImplStorageName, [config.l2ChainID])) + deployPromises.push(deployContract(L1GatewayRouterFactoryName, L1GatewayRouterImplStorageName)) + deployPromises.push(deployContract(L1StandardERC20GatewayFactoryName, L1StandardERC20GatewayImplStorageName)) + deployPromises.push(deployContract(L1CustomERC20GatewayFactoryName, L1CustomERC20GatewayImplStorageName)) + deployPromises.push(deployContract(L1WithdrawLockERC20GatewayFactoryName, L1WithdrawLockERC20GatewayImplStorageName)) + deployPromises.push(deployContract(L1ReverseCustomGatewayFactoryName, L1ReverseCustomGatewayImplStorageName)) + deployPromises.push(deployContract(L1ETHGatewayFactoryName, L1ETHGatewayImplStorageName)) + + const WETHAddress = getContractAddressByName(path, ImplStorageName.WETH) + deployPromises.push(deployContract(L1WETHGatewayFactoryName, L1WETHGatewayImplStorageName, [WETHAddress, predeploys.L2WETH])) + + deployPromises.push(deployContract(EnforcedTxGatewayFactoryName, EnforcedTxGatewayStorageName)) + deployPromises.push(deployContract(L1ERC721GatewayFactoryName, L1ERC721GatewayImplStorageName)) + deployPromises.push(deployContract(L1ERC1155GatewayFactoryName, L1ERC1155GatewayImplStorageName)) + + deployPromises.push(deployContract(L1StakingFactoryName, StakingImplStorageName, [L1CrossDomainMessengerProxyAddress])) + + const results = await Promise.all(deployPromises) + + for (const result of results) { + if (result != '') { + return result + } + } + + console.log("Complete contract implementations deployment...") + return '' + } catch (err) { + console.error("Error during deployment:", err) + return "Deployment failed" + } +} + export const deployContractImpls = async ( hre: HardhatRuntimeEnvironment, path: string, diff --git a/contracts/deploy/016-RollupInit.ts b/contracts/deploy/016-RollupInit.ts index b403642e..82036f18 100644 --- a/contracts/deploy/016-RollupInit.ts +++ b/contracts/deploy/016-RollupInit.ts @@ -35,7 +35,7 @@ export const RollupInit = async ( const MultipleVersionRollupVerifierImplStorageName = ImplStorageName.MultipleVersionRollupVerifierStorageName console.log('Deploy the MultipleVersionRollupVerifier ...') const MultipleVersionRollupVerifierFactory = await hre.ethers.getContractFactory(MultipleVersionRollupVerifierFactoryName) - const version = [0] + const version = [1] const verifiers = [ZkEvmVerifierV1Address] const MultipleVersionRollupVerifierContract = await MultipleVersionRollupVerifierFactory.deploy(version, verifiers) await MultipleVersionRollupVerifierContract.deployed() diff --git a/contracts/deploy/019-AdminTransfer.ts b/contracts/deploy/019-AdminTransfer.ts index bc36b11f..566396b9 100644 --- a/contracts/deploy/019-AdminTransfer.ts +++ b/contracts/deploy/019-AdminTransfer.ts @@ -13,6 +13,8 @@ import { ContractFactoryName, } from "../src/types" +import { Mutex } from 'async-mutex'; + export const AdminTransferByProxyStorageName = async ( hre: HardhatRuntimeEnvironment, path: string, @@ -50,6 +52,102 @@ export const AdminTransferByProxyStorageName = async ( return '' } +export const AdminTransferByProxyStorageNameConcurrently = async ( + hre: HardhatRuntimeEnvironment, + path: string, + deployer: any, + storageName: string, + nonce: number +): Promise => { + const EmptyContractImplAddr = getContractAddressByName(path, ImplStorageName.EmptyContract) + const ProxyAdminImplAddr = getContractAddressByName(path, ImplStorageName.ProxyAdmin) + const ProxyAddr = getContractAddressByName(path, storageName) + const deployerAddr = (await deployer.getAddress()).toLocaleLowerCase() + + const IProxyContract = await hre.ethers.getContractAt(ContractFactoryName.DefaultProxyInterface, ProxyAddr, deployer) + { + if (storageName != ProxyStorageName.L1USDCGatewayProxyStorageName) { + const implAddr = (await IProxyContract.implementation()).toLocaleLowerCase() + const admin = (await IProxyContract.admin()).toLocaleLowerCase() + if (implAddr === EmptyContractImplAddr.toLocaleLowerCase()) { + return `Proxy implementation address ${implAddr} should not be empty contract address ${EmptyContractImplAddr}` + } + if (admin !== deployerAddr) { + return `Proxy admin address ${admin} should deployer address ${deployerAddr}` + } + } + } + console.log(`change ${storageName} admin transfer from ${deployerAddr} to ProxyAdmin ${ProxyAdminImplAddr} `) + // Set the transaction object, including specifying nonce + const tx = await IProxyContract.populateTransaction.changeAdmin(ProxyAdminImplAddr) + // Manually specify nonce + const txWithNonce = { + ...tx, + nonce: nonce, + } + // Send transaction + const res = await deployer.sendTransaction(txWithNonce) + await res.wait() + await assertContractVariable( + IProxyContract, + 'admin', + ProxyAdminImplAddr, + ProxyAdminImplAddr // caller + ) + console.log(`admin transfer successful `) + return '' +} + +export const AdminTransferConcurrently = async ( + hre: HardhatRuntimeEnvironment, + path: string, + deployer: any, + configTmp: any +): Promise => { + console.log("Start to transfer admin concurrrently...") + const contractsToChange = [ + ProxyStorageName.L1CrossDomainMessengerProxyStorageName, + ProxyStorageName.L1MessageQueueWithGasPriceOracleProxyStorageName, + ProxyStorageName.L1StakingProxyStorageName, + ProxyStorageName.RollupProxyStorageName, + ProxyStorageName.L1GatewayRouterProxyStorageName, + ProxyStorageName.L1ETHGatewayProxyStorageName, + ProxyStorageName.L1StandardERC20GatewayProxyStorageName, + ProxyStorageName.L1CustomERC20GatewayProxyStorageName, + ProxyStorageName.L1WithdrawLockERC20GatewayProxyStorageName, + ProxyStorageName.L1ReverseCustomGatewayProxyStorageName, + ProxyStorageName.L1ERC721GatewayProxyStorageName, + ProxyStorageName.L1ERC1155GatewayProxyStorageName, + ProxyStorageName.EnforcedTxGatewayProxyStorageName, + ProxyStorageName.L1WETHGatewayProxyStorageName, + ProxyStorageName.L1USDCGatewayProxyStorageName + ]; + + let nonce = await hre.ethers.provider.getTransactionCount(deployer.getAddress()) + const mutex = new Mutex(); + const results = await Promise.all(contractsToChange.map(async (storageName) => { + const release = await mutex.acquire(); // Acquire lock for getting nonce + const nonceToUse = nonce + nonce++; // Increment nonce for each deployment + release(); // Release the lock + + const err = await AdminTransferByProxyStorageNameConcurrently(hre, path, deployer, storageName, nonceToUse); + if (err !== '') { + return { storageName, error: err }; + } + return { storageName, error: '' }; + })); + + // Check for errors + for (const result of results) { + if (result.error !== '') { + return `Error occurred during admin transfer for ${result.storageName}: ${result.error}`; + } + } + + return ''; +} + export const AdminTransfer = async ( hre: HardhatRuntimeEnvironment, path: string, @@ -170,4 +268,4 @@ export const AdminTransfer = async ( return '' } -module.exports = { AdminTransfer, AdminTransferByProxyStorageName } \ No newline at end of file +module.exports = { AdminTransfer, AdminTransferByProxyStorageName, AdminTransferConcurrently, AdminTransferByProxyStorageNameConcurrently } \ No newline at end of file diff --git a/contracts/deploy/index.ts b/contracts/deploy/index.ts index 4611d3cd..16f69f20 100644 --- a/contracts/deploy/index.ts +++ b/contracts/deploy/index.ts @@ -1,13 +1,13 @@ import deployProxyAdmin from './010-ProxyAdmin' import deployEmptyContract from './011-EmptyContract' -import deployContractProxies from './013-DeployProxys' +import {deployContractProxies,deployContractProxiesConcurrently} from './013-DeployProxys' import deployZkEvmVerifierV1 from './012-Verifier' -import deployContractImpls from './014-DeployImpls' +import {deployContractImpls, deployContractImplsConcurrently} from './014-DeployImpls' import MessengerInit from './015-MessengerInit' import RollupInit from './016-RollupInit' import GatewayInit from './017-GatewayInit' import StakingInit from './018-StakingInit' -import {AdminTransfer,AdminTransferByProxyStorageName} from './019-AdminTransfer' +import {AdminTransfer,AdminTransferByProxyStorageName, AdminTransferConcurrently} from './019-AdminTransfer' import ContractInit from './020-ContractInit' import StakingRegister from './021-StakingRegister' @@ -17,13 +17,16 @@ export { deployEmptyContract, deployZkEvmVerifierV1, deployContractProxies, + deployContractProxiesConcurrently, deployContractImpls, + deployContractImplsConcurrently, MessengerInit, RollupInit, GatewayInit, StakingInit, AdminTransfer, AdminTransferByProxyStorageName, + AdminTransferConcurrently, ContractInit, StakingRegister } \ No newline at end of file diff --git a/contracts/go.mod b/contracts/go.mod index 61434336..620cffe9 100644 --- a/contracts/go.mod +++ b/contracts/go.mod @@ -2,11 +2,11 @@ module morph-l2/contract go 1.22 -replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3.1 +replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3.2 require ( github.com/iden3/go-iden3-crypto v0.0.16 - github.com/morph-l2/go-ethereum v1.10.14-0.20241021080617-0ff2a10a9625 + github.com/morph-l2/go-ethereum v1.10.14-0.20250424011308-f42440d1ace1 github.com/stretchr/testify v1.9.0 ) diff --git a/contracts/go.sum b/contracts/go.sum index 8f4a20fa..f63fadb0 100644 --- a/contracts/go.sum +++ b/contracts/go.sum @@ -25,8 +25,8 @@ github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/morph-l2/go-ethereum v1.10.14-0.20241021080617-0ff2a10a9625 h1:4+cbRSS4lacSIC81RXxvA04UHhGVC4SHVn+bKeqhPSM= -github.com/morph-l2/go-ethereum v1.10.14-0.20241021080617-0ff2a10a9625/go.mod h1:sMJCfHOBzVRDkM2yF/Hy+oUk2rgC0CQZHTLs0cyzhhk= +github.com/morph-l2/go-ethereum v1.10.14-0.20250424011308-f42440d1ace1 h1:Mtl4361Zdc8w3SgCI7L/NuPeLaVdX1L/uP/D4ur/9Yw= +github.com/morph-l2/go-ethereum v1.10.14-0.20250424011308-f42440d1ace1/go.mod h1:sMJCfHOBzVRDkM2yF/Hy+oUk2rgC0CQZHTLs0cyzhhk= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= diff --git a/contracts/hardhat.config.ts b/contracts/hardhat.config.ts index 0255a598..2d501445 100644 --- a/contracts/hardhat.config.ts +++ b/contracts/hardhat.config.ts @@ -9,6 +9,7 @@ import fs from "fs" import { TASK_COMPILE_SOLIDITY_GET_SOURCE_PATHS } from "hardhat/builtin-tasks/task-names"; import { subtask } from "hardhat/config"; + import "./tasks/deploy" import "./tasks/overflow_test" import "./tasks/check" @@ -17,6 +18,7 @@ import "./tasks/proxy_upgrade" import "./tasks/staking_upgrade" import "./tasks/verifier_upgrade" import "./tasks/token_deploy" +import "./tasks/mainnet_upgrade" import "./src/plugin" import * as process from "process"; diff --git a/contracts/package.json b/contracts/package.json index 51e761e7..706dcc87 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -1,6 +1,6 @@ { "name": "@morph-l2/contracts", - "version": "0.0.9", + "version": "0.1.0", "main": "dist/index", "types": "dist/index", "license": "MIT", @@ -87,7 +87,8 @@ }, "dependencies": { "@morph-l2/core-utils": "0.0.1", + "async-mutex": "^0.5.0", "axios": "^1.4.0", "yarn": "^1.22.21" } -} \ No newline at end of file +} diff --git a/contracts/scripts/lido_impl_deploy.ts b/contracts/scripts/lido_impl_deploy.ts new file mode 100644 index 00000000..f4af1539 --- /dev/null +++ b/contracts/scripts/lido_impl_deploy.ts @@ -0,0 +1,26 @@ +const hre = require("hardhat"); +import 'dotenv/config'; +const { ethers } = hre; + +const L1WstETHAddr = process.env.L1WSTETH; +const L2WstETHAddr = process.env.L2WSTETH; + +async function main() { + if (!ethers.utils.isAddress(L1WstETHAddr) || !ethers.utils.isAddress(L2WstETHAddr)) { + throw new Error("token address invalid"); + } + + const L1LidoGatewayFactory = await ethers.getContractFactory("L1LidoGateway"); + const L2LidoGatewayFactory = await ethers.getContractFactory("L2LidoGateway"); + + const l1LidoGatewayImpl = await L1LidoGatewayFactory.deploy(L1WstETHAddr, L2WstETHAddr) + const l2LidoGatewayImpl = await L2LidoGatewayFactory.deploy(L1WstETHAddr, L2WstETHAddr) + await l1LidoGatewayImpl.deployed() + await l2LidoGatewayImpl.deployed() + console.log(`impl deployed l1LidoGatewayImpl ${l1LidoGatewayImpl.address}, l2LidoGatewayImpl ${l2LidoGatewayImpl.address}`) +} + +main().catch((error) => { + console.error(error); + process.exitCode = 1; +}); \ No newline at end of file diff --git a/contracts/src/deploy-config/holesky.ts b/contracts/src/deploy-config/holesky.ts index 76ceef57..c46372ea 100644 --- a/contracts/src/deploy-config/holesky.ts +++ b/contracts/src/deploy-config/holesky.ts @@ -8,13 +8,13 @@ const config = { l2ChainID: 2810, // L1MessageQueue config - l1MessageQueueMaxGasLimit: 100000000, + l1MessageQueueMaxGasLimit: 30000000, // gasPriceOracle config l2BaseFee: 0.1, // Gwei // verify contract config - programVkey: '0x00bc91a65e39100f3b075c9edf1a60fd1cb025b9413ea19c34c62d455e512685', + programVkey: '0x006c835a4c049b699a3675fefa51b182c7efe404a656151c0410245966724bc3', // rollup contract config // initialize config finalizationPeriodSeconds: 600, diff --git a/contracts/src/deploy-config/l1.ts b/contracts/src/deploy-config/l1.ts index bc0c67ad..0aa7ee78 100644 --- a/contracts/src/deploy-config/l1.ts +++ b/contracts/src/deploy-config/l1.ts @@ -11,13 +11,13 @@ const config = { l2ChainID: 53077, // L1MessageQueue config - l1MessageQueueMaxGasLimit: 100000000, + l1MessageQueueMaxGasLimit: 30000000, // gasPriceOracle config l2BaseFee: 0.1, // Gwei // verify contract config - programVkey: '0x00bc91a65e39100f3b075c9edf1a60fd1cb025b9413ea19c34c62d455e512685', + programVkey: '0x006c835a4c049b699a3675fefa51b182c7efe404a656151c0410245966724bc3', // rollup contract config // initialize config finalizationPeriodSeconds: 10, diff --git a/contracts/src/deploy-config/qanetl1.ts b/contracts/src/deploy-config/qanetl1.ts index 56fe986f..3b95afb4 100644 --- a/contracts/src/deploy-config/qanetl1.ts +++ b/contracts/src/deploy-config/qanetl1.ts @@ -6,15 +6,17 @@ const config = { // chainID config l1ChainID: 900, l2ChainID: 53077, + l1WETHAddress: "", + l1USDCAddress: "", // L1MessageQueue config - l1MessageQueueMaxGasLimit: 100000000, + l1MessageQueueMaxGasLimit: 30000000, // gasPriceOracle config l2BaseFee: 0.1, // Gwei // verify contract config - programVkey: '0x00bc91a65e39100f3b075c9edf1a60fd1cb025b9413ea19c34c62d455e512685', + programVkey: '0x006c835a4c049b699a3675fefa51b182c7efe404a656151c0410245966724bc3', // rollup contract config // initialize config finalizationPeriodSeconds: 600, @@ -38,10 +40,10 @@ const config = { stakingChallengerRewardPercentage: 50, // register sequencers l2SequencerAddresses: [ - "0x25d36d94b64165f72a817ae0ff9bad2ce6914c70", - "0x4a1f64dec538835c125874e275edca367bf6022a", - "0xbb8605961105bb3dcd0e86ef94a1bf9fb2270a29", - "0x7d7201ad7da2b9b9ab9a36c454a3c2d55c4fbdd8" + "0x675cfc328f9f2e79a51e499b2be44462270572fe", + "0xb096665645994775eeba8aa114752d569734dcb4", + "0x3a587733d38e5487d2a7e81d84625f25c99ab3a1", + "0xb6346ded94fc61b637763610d0c59846b7781080" ], l2SequencerTmKeys: [ "0x5280d0eee2a64d3ad29480d15ffd1b048ce5908f180b5ccd65cc3dcf00941abb", diff --git a/contracts/src/deploy-config/sepolia.ts b/contracts/src/deploy-config/sepolia.ts index eed8411d..e8838ba0 100644 --- a/contracts/src/deploy-config/sepolia.ts +++ b/contracts/src/deploy-config/sepolia.ts @@ -18,7 +18,7 @@ const config = { /** * ---to---legacy property */ - programVkey: '0x00bc91a65e39100f3b075c9edf1a60fd1cb025b9413ea19c34c62d455e512685', + programVkey: '0x006c835a4c049b699a3675fefa51b182c7efe404a656151c0410245966724bc3', rollupMinDeposit: 0.0001, rollupProofWindow: 86400, rollupGenesisBlockNumber: 0, diff --git a/contracts/src/deploy-config/testnetl1.ts b/contracts/src/deploy-config/testnetl1.ts index 03600732..2d95a232 100644 --- a/contracts/src/deploy-config/testnetl1.ts +++ b/contracts/src/deploy-config/testnetl1.ts @@ -13,7 +13,7 @@ const config = { sequencerWindowSize: 200, channelTimeout: 120, - programVkey: '0x00bc91a65e39100f3b075c9edf1a60fd1cb025b9413ea19c34c62d455e512685', + programVkey: '0x006c835a4c049b699a3675fefa51b182c7efe404a656151c0410245966724bc3', rollupMinDeposit: 1, rollupProofWindow: 100, rollupGenesisBlockNumber: 0, diff --git a/contracts/tasks/deploy.ts b/contracts/tasks/deploy.ts index 5dc9df47..9ee6739a 100644 --- a/contracts/tasks/deploy.ts +++ b/contracts/tasks/deploy.ts @@ -10,12 +10,15 @@ import { deployEmptyContract, deployZkEvmVerifierV1, deployContractProxies, + deployContractProxiesConcurrently, deployContractImpls, + deployContractImplsConcurrently, MessengerInit, RollupInit, GatewayInit, StakingInit, AdminTransfer, + AdminTransferConcurrently, ContractInit, StakingRegister, } from '../deploy/index' @@ -23,9 +26,11 @@ import { ethers } from "ethers"; task("deploy") .addParam('storagepath') + .addOptionalParam('concurrent', 'Use concurrent deployment', 'false') .setAction(async (taskArgs, hre) => { // Initialization parameters const storagePath = taskArgs.storagepath + const concurrent = taskArgs.concurrent const deployer = await hre.ethers.provider.getSigner(); const config = hre.deployConfig @@ -48,7 +53,11 @@ task("deploy") } console.log('\n---------------------------------- deploy Proxys ----------------------------------') - err = await deployContractProxies(hre, storagePath, deployer,config) + if (concurrent === 'true') { + err = await deployContractProxiesConcurrently(hre, storagePath, deployer,config) + } else { + err = await deployContractProxies(hre, storagePath, deployer,config) + } if (err != '') { console.log('Deploy Proxys failed, err: ', err) return @@ -64,9 +73,11 @@ task("deploy") task("initialize") .addParam('storagepath') + .addOptionalParam('concurrent', 'Use concurrent deployment', 'false') .setAction(async (taskArgs, hre) => { // Initialization parameters const storagePath = taskArgs.storagepath + const concurrent = taskArgs.concurrent const config = hre.deployConfig const deployer = await hre.ethers.provider.getSigner(); @@ -74,7 +85,12 @@ task("initialize") console.log('deployer :', await deployer.getAddress()) console.log('\n---------------------------------- deploy Impls ----------------------------------') - let err = await deployContractImpls(hre, storagePath, deployer, config) + let err: any + if (concurrent === 'true') { + err = await deployContractImplsConcurrently(hre, storagePath, deployer, config) + } else { + err = await deployContractImpls(hre, storagePath, deployer, config) + } if (err != '') { console.log('Deploy deploy Impls failed, err: ', err) return @@ -105,11 +121,19 @@ task("initialize") return } console.log('\n---------------------------------- Admin Transfer ----------------------------------') - err = await AdminTransfer(hre, storagePath, deployer, config) + if (concurrent === 'true') { + err = await AdminTransferConcurrently(hre, storagePath, deployer, config) + } else { + err = await AdminTransfer(hre, storagePath, deployer, config) + } + if (err != '') { console.log('OwnerTransfer failed, err: ', err) return } + + + console.log('\n---------------------------------- Contract Init ----------------------------------') err = await ContractInit(hre, storagePath, deployer, config) if (err != '') { diff --git a/contracts/tasks/mainnet_upgrade.ts b/contracts/tasks/mainnet_upgrade.ts new file mode 100644 index 00000000..bd5af77f --- /dev/null +++ b/contracts/tasks/mainnet_upgrade.ts @@ -0,0 +1,25 @@ +import "@nomiclabs/hardhat-web3"; +import "@nomiclabs/hardhat-ethers"; +import "@nomiclabs/hardhat-waffle"; + +import { task } from "hardhat/config"; +import { ContractFactoryName } from "../src/types"; + +task("rollup-upgrade-hc") + .addParam("l2cid") + .addParam("prevStateRoot") + .setAction(async (taskArgs, hre) => { + const chainId = taskArgs.l2cid + + const RollupFactoryName = ContractFactoryName.Rollup + + const RollupFactory = await hre.ethers.getContractFactory(RollupFactoryName) + const rollupNewImpl = await RollupFactory.deploy(chainId) + await rollupNewImpl.deployed() + let blockNumber = await hre.ethers.provider.getBlockNumber() + console.log(`Rollup new impl deploy at ${rollupNewImpl.address} and height ${blockNumber}`) + + console.log("initialize2 abi code: ", RollupFactory.interface.encodeFunctionData('initialize2', [ + taskArgs.prevStateRoot, + ])) + }) diff --git a/contracts/tasks/overflow_test.ts b/contracts/tasks/overflow_test.ts index 2ad741f3..f7470fd8 100644 --- a/contracts/tasks/overflow_test.ts +++ b/contracts/tasks/overflow_test.ts @@ -81,39 +81,57 @@ task("crossHash") .addParam("message") .addParam("count") .setAction(async (taskArgs, hre) => { - const addr = taskArgs.contractaddr - const message = taskArgs.message - const count = taskArgs.count - - const deployer = await hre.ethers.provider.getSigner(); - const MyContract = await hre.ethers.getContractFactory("L1OverflowTester", deployer); - const contract = MyContract.attach(addr); - - console.log("sending tx for crossHash......") - //const options = {value: ethers.utils.parseEther("1.0")} - const txn = await contract["crossHash(string,uint256)"](message, count, { value: ethers.utils.parseEther("0.002") }) - - //let txn = await contract.crossHash(message, count, options) - await txn.wait(); - console.log(txn) - - }) + try { + const addr = taskArgs.contractaddr; + const message = taskArgs.message; + const count = taskArgs.count; + + const deployer = await hre.ethers.provider.getSigner(); + const MyContract = await hre.ethers.getContractFactory("L1OverflowTester", deployer); + const contract = MyContract.attach(addr); + + console.log("Sending transaction for crossHash..."); + const txn = await contract["crossHash(string,uint256)"](message, count, { + value: ethers.utils.parseEther("0.002") + }); + + const receipt = await txn.wait(); + console.log("Transaction successful:", { + hash: txn.hash, + blockNumber: receipt.blockNumber, + status: receipt.status === 1 ? 'Success' : 'Failed' + }); + } catch (error) { + console.error("Error in crossHash task:", error.message); + throw error; + } + }); task("updateLimit") .addParam("contractaddr") .addParam("gaslimit") .setAction(async (taskArgs, hre) => { - const addr = taskArgs.contractaddr - const gasLimit = taskArgs.gaslimit - const deployer = await hre.ethers.provider.getSigner(); - const MyContract = await hre.ethers.getContractFactory("L1OverflowTester", deployer); - const contract = MyContract.attach(addr); - - console.log("sending tx for updateGasLimit......"); - let txn = await contract.updateGasLimit(gasLimit); - await txn.wait(); - console.log(txn); - }) + try { + const addr = taskArgs.contractaddr; + const gasLimit = taskArgs.gaslimit; + const deployer = await hre.ethers.provider.getSigner(); + const MyContract = await hre.ethers.getContractFactory("L1OverflowTester", deployer); + const contract = MyContract.attach(addr); + + console.log("Sending transaction for updateGasLimit..."); + const txn = await contract.updateGasLimit(gasLimit); + const receipt = await txn.wait(); + + console.log("Transaction successful:", { + hash: txn.hash, + blockNumber: receipt.blockNumber, + status: receipt.status === 1 ? 'Success' : 'Failed' + }); + } catch (error) { + console.error("Error in updateLimit task:", error.message); + throw error; + } + }); task("printResult") .addParam("contractaddr") @@ -152,8 +170,8 @@ task("upgradeRollup") const upgradeTx = await RollupProxyWithSigner.upgradeTo(rollupNewImpl.address) console.log("upgradeTx hash: ", upgradeTx.hash) - const recipt = await upgradeTx.wait() - console.log("recipt status: ", recipt.status) + const receipt = await upgradeTx.wait() + console.log("receipt status: ", receipt.status) console.log("after upgrade the impl contract is :", await RollupProxy.callStatic.implementation({ from: ethers.constants.AddressZero, diff --git a/contracts/tasks/proxy_upgrade.ts b/contracts/tasks/proxy_upgrade.ts index 88b2fb4b..3beefe9c 100644 --- a/contracts/tasks/proxy_upgrade.ts +++ b/contracts/tasks/proxy_upgrade.ts @@ -3,315 +3,28 @@ import "@nomiclabs/hardhat-ethers"; import "@nomiclabs/hardhat-waffle"; import { task } from "hardhat/config"; -import { ethers } from "ethers"; - -import fs from "fs"; -import { ContractFactoryName } from "../src/types" -import { predeploys } from "../src" - -// yarn hardhat upgradeProxy --proxyaddr 0x0165878a594ca255338adfa4d48449f69242eb8f --newimpladdr 0x9a9f2ccfde556a7e9ff0848998aa4a0cfd8863ae --network l1 -task("upgradeProxy") - .addParam("proxyaddr") - .addParam("newimpladdr") - .setAction(async (taskArgs, hre) => { - const ProxyFactory = await hre.ethers.getContractFactory('Proxy') - const proxy = ProxyFactory.attach(taskArgs.proxyaddr) - console.log("before upgrade the impl contract is :", await proxy.connect(hre.waffle.provider).callStatic.implementation({ - from: ethers.constants.AddressZero, - })) - const res = await proxy.upgradeTo(taskArgs.newimpladdr) - - const receipt = await res.wait() - console.log(`receipt status : ${receipt.status}`) - console.log("after upgrade the impl contract is :", await proxy.connect(hre.waffle.provider).callStatic.implementation({ - from: ethers.constants.AddressZero, - })) - }); task("upgradeProxyWithPorxyAdmin") .addParam("proxyadminaddr") .addParam("proxyaddr") .addParam("newimpladdr") .setAction(async (taskArgs, hre) => { - const ProxyAdminFactory = await hre.ethers.getContractAt('TransparentUpgradeableProxy', taskArgs.proxyadminaddr) - const proxyAdmin = ProxyAdminFactory.attach(taskArgs.proxyadminaddr) + if (!hre.ethers.utils.isAddress(taskArgs.proxyadminaddr) || !hre.ethers.utils.isAddress(taskArgs.proxyaddr) + || !hre.ethers.utils.isAddress(taskArgs.newimpladdr)) { + throw new Error("token address invalid"); + } - const ProxyFactory = await hre.ethers.getContractFactory('Proxy') - const proxy = ProxyFactory.attach(taskArgs.proxyaddr) + const proxyAdmin = await hre.ethers.getContractAt('ProxyAdmin', taskArgs.proxyadminaddr) + + const proxy = await hre.ethers.getContractAt('ITransparentUpgradeableProxy', taskArgs.proxyaddr) console.log("before upgrade the impl contract is :", await proxy.connect(hre.waffle.provider).callStatic.implementation({ - from: ethers.constants.AddressZero, + from: taskArgs.proxyadminaddr, })) const res = await proxyAdmin.upgrade(taskArgs.proxyaddr, taskArgs.newimpladdr) const receipt = await res.wait() console.log(`receipt status : ${receipt.status}`) console.log("after upgrade the impl contract is :", await proxy.connect(hre.waffle.provider).callStatic.implementation({ - from: ethers.constants.AddressZero, + from: taskArgs.proxyadminaddr, })) - }); - -// Proxy__L1StandardBridge?? -// Proxy__L1CrossDomainMessenger?? - -/* -Proxy__MorphPortal - -cast call 0xdc64a140aa3e981100a9beca4e685f962f0cf6c9 "GUARDIAN()(address)" --rpc-url http://127.0.0.1:9545 -0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 - -cast call 0xdc64a140aa3e981100a9beca4e685f962f0cf6c9 "SYSTEM_CONFIG()(address)" --rpc-url http://127.0.0.1:9545 -0x8A791620dd6260079BF849Dc5567aDC3F2FdC318 - -cast call 0xdc64a140aa3e981100a9beca4e685f962f0cf6c9 "l1Messenger()(address)" --rpc-url http://127.0.0.1:9545 -0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9 - -cast call 0xdc64a140aa3e981100a9beca4e685f962f0cf6c9 "ROLLUP()(address)" --rpc-url http://127.0.0.1:9545 -0xB7f8BC63BbcaD18155201308C8f3540b07f84F5e - -yarn hardhat upgradeMorphPortalImpl --guardian 0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266 \ ---systemconfigproxyaddr 0x8A791620dd6260079BF849Dc5567aDC3F2FdC318 \ ---rollupproxyaddr 0xB7f8BC63BbcaD18155201308C8f3540b07f84F5e \ ---l1cdmproxyaddr 0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9 --network l1 - -cast logs --from-block 0 --to-block `cast bn` --address 0x8a791620dd6260079bf849dc5567adc3f2fdc318 `cast sig-event "AdminChanged(address,address)"` --rpc-url http://127.0.0.1:9545 - -cast abi-decode --input "AnyFuncName(address,address)" 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fbdb2315678afecb367f032d93f642f64180aa3 - -yarn hardhat upgradeProxyWithPorxyAdmin --proxyadminaddr 0x5FbDB2315678afecb367f032d93F642f64180aa3 \ ---proxyaddr 0xdc64a140aa3e981100a9beca4e685f962f0cf6c9 --newimpladdr 0x4c5859f0F772848b2D91F1D83E2Fe57935348029 \ ---network l1 -*/ -task("upgradeMorphPortalImpl") - .addParam("guardian") - .addParam("systemconfigproxyaddr") - .addParam("rollupproxyaddr") - .addParam("l1cdmproxyaddr") - .setAction(async (taskArgs, hre) => { - const guardian = taskArgs.guardian - const systemconfigproxyaddr = taskArgs.systemconfigproxyaddr - const rollupproxyaddr = taskArgs.rollupproxyaddr - const l1cdmproxyaddr = taskArgs.l1cdmproxyaddr - - const MorphPortalFactory = await hre.ethers.getContractFactory("MorphPortal"); - const morphportalNewImpl = await MorphPortalFactory.deploy( - guardian, - true, - systemconfigproxyaddr, - rollupproxyaddr, - l1cdmproxyaddr, - ); - await morphportalNewImpl.deployed() - console.log("new morphportalNewImpl contract address: ", morphportalNewImpl.address) - }) - -/* -Proxy__MorphMintableERC20Factory - -cast call 0xa513e6e4b8f2a923d98304ec87f64353c4d5c853 "BRIDGE()(address)" --rpc-url http://127.0.0.1:9545 -0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0 - -yarn hardhat upgradeMorphMintableERC20FactoryImpl --l1stbproxyaddr 0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0 --network l1 - -cast logs --from-block 0 --to-block `cast bn` --address 0xa513e6e4b8f2a923d98304ec87f64353c4d5c853 `cast sig-event "AdminChanged(address,address)"` --rpc-url http://127.0.0.1:9545 - -cast abi-decode --input "AnyFuncName(address,address)" 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fbdb2315678afecb367f032d93f642f64180aa3 - -yarn hardhat upgradeProxyWithPorxyAdmin --proxyadminaddr 0x5FbDB2315678afecb367f032d93F642f64180aa3 \ ---proxyaddr 0xa513e6e4b8f2a923d98304ec87f64353c4d5c853 --newimpladdr 0x2bdCC0de6bE1f7D2ee689a0342D76F52E8EFABa3 \ ---network l1 -*/ -task("upgradeMorphMintableERC20FactoryImpl") - .addParam("l1stbproxyaddr") - .setAction(async (taskArgs, hre) => { - const l1stbproxyaddr = taskArgs.l1stbproxyaddr - - const MorphMintableERC20FactoryFactory = await hre.ethers.getContractFactory("MorphMintableERC20Factory"); - const MorphMintableERC20FactoryNewImpl = await MorphMintableERC20FactoryFactory.deploy(l1stbproxyaddr); - await MorphMintableERC20FactoryNewImpl.deployed() - console.log("new MorphMintableERC20FactoryNewImpl contract address: ", MorphMintableERC20FactoryNewImpl.address) - }) - -/* -Proxy__L1ERC721Bridge - -cast call 0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6 "MESSENGER()(address)" --rpc-url http://127.0.0.1:9545 -0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9 - -cast call 0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6 "OTHER_BRIDGE()(address)" --rpc-url http://127.0.0.1:9545 -0x4200000000000000000000000000000000000014 - -yarn hardhat upgradeL1ERC721BridgeImpl --l1cdmproxyaddr 0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9 --otherbridgeaddr 0x4200000000000000000000000000000000000014 --network l1 - -cast logs --from-block 0 --to-block `cast bn` --address 0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6 `cast sig-event "AdminChanged(address,address)"` --rpc-url http://127.0.0.1:9545 - -cast abi-decode --input "AnyFuncName(address,address)" 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fbdb2315678afecb367f032d93f642f64180aa3 - -yarn hardhat upgradeProxyWithPorxyAdmin --proxyadminaddr 0x5FbDB2315678afecb367f032d93F642f64180aa3 \ ---proxyaddr 0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6 --newimpladdr 0x7bc06c482DEAd17c0e297aFbC32f6e63d3846650 \ ---network l1 -*/ -task("upgradeL1ERC721BridgeImpl") - .addParam("l1cdmproxyaddr") - .addParam("otherbridgeaddr") - .setAction(async (taskArgs, hre) => { - const l1cdmproxyaddr = taskArgs.l1cdmproxyaddr - const otherbridgeaddr = taskArgs.otherbridgeaddr - - const L1ERC721BridgeFactory = await hre.ethers.getContractFactory("L1ERC721Bridge"); - const L1ERC721BridgeNewImpl = await L1ERC721BridgeFactory.deploy(l1cdmproxyaddr, otherbridgeaddr); - await L1ERC721BridgeNewImpl.deployed() - console.log("new L1ERC721BridgeNewImpl contract address: ", L1ERC721BridgeNewImpl.address) - }) - -/* -Proxy__SystemConfig - -yarn hardhat upgradeSystemConfigImpl --syscfgproxyaddr 0x8a791620dd6260079bf849dc5567adc3f2fdc318 --network l1 - -cast logs --from-block 0 --to-block `cast bn` --address 0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6 `cast sig-event "AdminChanged(address,address)"` --rpc-url http://127.0.0.1:9545 - -cast abi-decode --input "AnyFuncName(address,address)" 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000005fbdb2315678afecb367f032d93f642f64180aa3 - -yarn hardhat upgradeProxyWithPorxyAdmin --proxyadminaddr 0x5FbDB2315678afecb367f032d93F642f64180aa3 \ ---proxyaddr 0x8a791620dd6260079bf849dc5567adc3f2fdc318 --newimpladdr 0x4ed7c70f96b99c776995fb64377f0d4ab3b0e1c1 \ ---network l1 -*/ -task("upgradeSystemConfigImpl") - .addParam("syscfgproxyaddr") - .setAction(async (taskArgs, hre) => { - - const syscfgFactory = await hre.ethers.getContractFactory('SystemConfig') - const syscfg = syscfgFactory.attach(taskArgs.syscfgproxyaddr) - - const owner = await syscfg.connect(hre.waffle.provider).callStatic.owner({ - from: ethers.constants.AddressZero, - }) - const overhead = await syscfg.connect(hre.waffle.provider).callStatic.overhead({ - from: ethers.constants.AddressZero, - }) - const scalar = await syscfg.connect(hre.waffle.provider).callStatic.scalar({ - from: ethers.constants.AddressZero, - }) - const batcherHash = await syscfg.connect(hre.waffle.provider).callStatic.batcherHash({ - from: ethers.constants.AddressZero, - }) - const gasLimit = await syscfg.connect(hre.waffle.provider).callStatic.gasLimit({ - from: ethers.constants.AddressZero, - }) - const p2pSequencerAddress = "0x9965507D1a55bcC2695C58ba16FB37d819B0A4dc" - const resourceConfig = await syscfg.connect(hre.waffle.provider).callStatic.resourceConfig({ - from: ethers.constants.AddressZero, - }) - - const SyscfgNewImpl = await syscfgFactory.deploy(owner, overhead, scalar, batcherHash, gasLimit, p2pSequencerAddress, resourceConfig); - await SyscfgNewImpl.deployed() - console.log("new SyscfgNewImpl contract address: ", SyscfgNewImpl.address) - }) - -/* -Proxy__SystemDictator - -yarn hardhat upgradeSystemDictatorImpl --network l1 - -yarn hardhat upgradeProxy --proxyaddr 0x610178da211fef7d417bc0e6fed39f05609ad788 --newimpladdr 0xFD471836031dc5108809D173A067e8486B9047A3 --network l1 -*/ -task("upgradeSystemDictatorImpl") - .setAction(async (taskArgs, hre) => { - const SystemDictatorFactory = await hre.ethers.getContractFactory("SystemDictator"); - const SystemDictatorNewImpl = await SystemDictatorFactory.deploy(); - await SystemDictatorNewImpl.deployed() - console.log("new SystemDictatorNewImpl contract address: ", SystemDictatorNewImpl.address) - }) - -/* -Proxy__Rollup - -cast call 0xb7f8bc63bbcad18155201308c8f3540b07f84f5e "layer2ChainId()(uint64)" --rpc-url http://127.0.0.1:9545 -53077 - -cast call 0xb7f8bc63bbcad18155201308c8f3540b07f84f5e "MESSENGER()(address)" --rpc-url http://127.0.0.1:9545 -0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9 - -yarn hardhat upgradeRollupImpl --chainid 53077 --l1cdmproxyaddr 0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9 --network l1 - -yarn hardhat upgradeProxy --proxyaddr 0xb7f8bc63bbcad18155201308c8f3540b07f84f5e --newimpladdr 0x1429859428C0aBc9C2C47C8Ee9FBaf82cFA0F20f --network l1 -*/ -task("upgradeRollupProxy") - .addParam("proxyadminaddr") - .addParam("rollupproxyaddr") - .addParam("chainid") - .setAction(async (taskArgs, hre) => { - const ProxyAdminFactory = await hre.ethers.getContractFactory('ProxyAdmin') - const proxyAdmin = ProxyAdminFactory.attach(taskArgs.proxyadminaddr) - // upgrade - const chainID = taskArgs.chainid - const RollupFactory = await hre.ethers.getContractFactory("Rollup"); - const rollupNewImpl = await RollupFactory.deploy(chainID); - await rollupNewImpl.deployed() - console.log("new rollupNewImpl contract address: ", rollupNewImpl.address) - if (!hre.ethers.utils.isAddress(taskArgs.rollupproxyaddr) || !hre.ethers.utils.isAddress(rollupNewImpl.address)) { - console.log(`not address ${taskArgs.rollupproxyaddr} ${rollupNewImpl.address}`) - return - } - const res = await proxyAdmin.upgrade(taskArgs.rollupproxyaddr, rollupNewImpl.address) - const rec = await res.wait() - console.log(`upgrade rollup ${rec.status === 1}`) - }) - -/* -Proxy__GasOracle - -EnableCurie - -yarn hardhat gasOracleEnableCurie --gasoracleproxyaddr 0x530000000000000000000000000000000000000f --network l2 -*/ -task("gasOracleEnableCurie") - .addParam("gasoracleproxyaddr") - .setAction(async (taskArgs, hre) => { - if (!hre.ethers.utils.isAddress(taskArgs.gasoracleproxyaddr)) { - console.log( - `GasOracle proxy address check failed ${taskArgs.gasoracleproxyaddr}` - ) - return - } - - let iGasOracle = await hre.ethers.getContractAt("GasPriceOracle", taskArgs.gasoracleproxyaddr) - let isCurie = await iGasOracle.isCurie() - - if (isCurie) { - console.log("Already set isCurie") - return - } - - // enable curie - const res = await iGasOracle.enableCurie() - const rec = await res.wait() - isCurie = await iGasOracle.isCurie() - console.log(`Enable curie ${isCurie === true ? "succeed" : "failed"}`) - }) - -/* -Proxy__GasOracle - -yarn hardhat gasOracleProxy-upgrade --l2config ../ops/l2-genesis/deploy-config/qanet-deploy-config.json --network qanetl2 -*/ - -task("gasOracleProxy-upgrade") - .addParam("l2config") - .setAction(async (taskArgs, hre) => { - const data = fs.readFileSync(taskArgs.l2config); - // @ts-ignore - const l2Config = JSON.parse(data); - - const GasPriceOracleFactory = await hre.ethers.getContractFactory("GasPriceOracle") - const gasOracleProxyNewImpl = await GasPriceOracleFactory.deploy(l2Config.gasPriceOracleOwner) - await gasOracleProxyNewImpl.deployed() - let blockNumber = await hre.ethers.provider.getBlockNumber() - console.log(`GasPriceOracle new impl deploy at ${gasOracleProxyNewImpl.address} and height ${blockNumber}`) - - const ProxyAdminFactory = await hre.ethers.getContractFactory(ContractFactoryName.ProxyAdmin) - const proxyAdmin = ProxyAdminFactory.attach(predeploys.ProxyAdmin) - let res = await proxyAdmin.upgrade(predeploys.GasPriceOracle, gasOracleProxyNewImpl.address) - let rec = await res.wait() - console.log(`upgrade gasOracleProxy ${rec.status == 1 ? "success" : "failed"}`) - }) \ No newline at end of file + }); \ No newline at end of file diff --git a/contracts/tasks/staking_upgrade.ts b/contracts/tasks/staking_upgrade.ts index 9a237e62..d9f5e2e7 100644 --- a/contracts/tasks/staking_upgrade.ts +++ b/contracts/tasks/staking_upgrade.ts @@ -434,7 +434,7 @@ task("l1staking-deploy-init") console.log("BLOCK_NUMBER: %s", blockNumber) const err = await storage(newPath, ImplStorageName.L1StakingStorageName, contract.address.toLocaleLowerCase(), blockNumber || 0) if (err != '') { - console.log(`deploy L1Staking implemention failed ${err}`) + console.log(`deploy L1Staking implementation failed ${err}`) return err } } @@ -898,4 +898,4 @@ task("l2-staking-deploy") ) const rec = await res.wait() console.log(`L2Staking upgrade ${rec.status === 1}, new impl ${staking.address}`) - }) \ No newline at end of file + }) diff --git a/contracts/tasks/token_deploy.ts b/contracts/tasks/token_deploy.ts index bd7a10ef..b942b243 100644 --- a/contracts/tasks/token_deploy.ts +++ b/contracts/tasks/token_deploy.ts @@ -253,11 +253,11 @@ task("init-l1-lidogateway") const gateway = await GatewayFactory.attach(taskArgs.l1lidogateway) console.log(`gateway at ${gateway.address}`) - let res = await gateway.initialize(taskArgs.counterpart,taskArgs.router,taskArgs.messenger) + let res = await gateway.initialize(taskArgs.counterpart, taskArgs.router, taskArgs.messenger) let rec = await res.wait() console.log(`initialize ${rec.status == 1}, txHash: ${rec.transactionHash}`) - res = await gateway.initializeV2(taskArgs.opter,taskArgs.opter,taskArgs.opter,taskArgs.opter) + res = await gateway.initializeV2(taskArgs.opter, taskArgs.opter, taskArgs.opter, taskArgs.opter) rec = await res.wait() console.log(`initializeV2 ${rec.status == 1}, txHash: ${rec.transactionHash}`) @@ -268,14 +268,14 @@ task("init-l1-lidogateway") let withdrawalEnabled = await gateway.isWithdrawalsEnabled() console.log(`counterpart ${counterpart}, router ${router}, messenger ${messenger}, depositEnabled ${depositEnabled}, withdrawalEnabled ${withdrawalEnabled}`) - const DEPOSITS_ENABLER_ROLE =await gateway.DEPOSITS_ENABLER_ROLE() - const DEPOSITS_DISABLER_ROLE =await gateway.DEPOSITS_DISABLER_ROLE() - const WITHDRAWALS_ENABLER_ROLE =await gateway.WITHDRAWALS_ENABLER_ROLE() - const WITHDRAWALS_DISABLER_ROLE =await gateway.WITHDRAWALS_DISABLER_ROLE() - const depositE = await gateway.hasRole(DEPOSITS_ENABLER_ROLE,taskArgs.opter) - const depositD = await gateway.hasRole(DEPOSITS_DISABLER_ROLE,taskArgs.opter) - const withdrawE = await gateway.hasRole(WITHDRAWALS_ENABLER_ROLE,taskArgs.opter) - const withdrawD = await gateway.hasRole(WITHDRAWALS_DISABLER_ROLE,taskArgs.opter) + const DEPOSITS_ENABLER_ROLE = await gateway.DEPOSITS_ENABLER_ROLE() + const DEPOSITS_DISABLER_ROLE = await gateway.DEPOSITS_DISABLER_ROLE() + const WITHDRAWALS_ENABLER_ROLE = await gateway.WITHDRAWALS_ENABLER_ROLE() + const WITHDRAWALS_DISABLER_ROLE = await gateway.WITHDRAWALS_DISABLER_ROLE() + const depositE = await gateway.hasRole(DEPOSITS_ENABLER_ROLE, taskArgs.opter) + const depositD = await gateway.hasRole(DEPOSITS_DISABLER_ROLE, taskArgs.opter) + const withdrawE = await gateway.hasRole(WITHDRAWALS_ENABLER_ROLE, taskArgs.opter) + const withdrawD = await gateway.hasRole(WITHDRAWALS_DISABLER_ROLE, taskArgs.opter) console.log(`Role: depositE ${depositE}, depositD ${depositD}, withdrawE ${withdrawE}, withdrawD ${withdrawD}`) }) @@ -301,11 +301,11 @@ task("init-l2-lidogateway") const gateway = await GatewayFactory.attach(taskArgs.l2lidogateway) console.log(`gateway at ${gateway.address}`) - let res = await gateway.initialize(taskArgs.counterpart,taskArgs.router,taskArgs.messenger) + let res = await gateway.initialize(taskArgs.counterpart, taskArgs.router, taskArgs.messenger) let rec = await res.wait() console.log(`initialize ${rec.status == 1}, txHash: ${rec.transactionHash}`) - res = await gateway.initializeV2(taskArgs.opter,taskArgs.opter,taskArgs.opter,taskArgs.opter) + res = await gateway.initializeV2(taskArgs.opter, taskArgs.opter, taskArgs.opter, taskArgs.opter) rec = await res.wait() console.log(`initializeV2 ${rec.status == 1}, txHash: ${rec.transactionHash}`) @@ -316,14 +316,14 @@ task("init-l2-lidogateway") let withdrawalEnabled = await gateway.isWithdrawalsEnabled() console.log(`counterpart ${counterpart}, router ${router}, messenger ${messenger}, depositEnabled ${depositEnabled}, withdrawalEnabled ${withdrawalEnabled}`) - const DEPOSITS_ENABLER_ROLE =await gateway.DEPOSITS_ENABLER_ROLE() - const DEPOSITS_DISABLER_ROLE =await gateway.DEPOSITS_DISABLER_ROLE() - const WITHDRAWALS_ENABLER_ROLE =await gateway.WITHDRAWALS_ENABLER_ROLE() - const WITHDRAWALS_DISABLER_ROLE =await gateway.WITHDRAWALS_DISABLER_ROLE() - const depositE = await gateway.hasRole(DEPOSITS_ENABLER_ROLE,taskArgs.opter) - const depositD = await gateway.hasRole(DEPOSITS_DISABLER_ROLE,taskArgs.opter) - const withdrawE = await gateway.hasRole(WITHDRAWALS_ENABLER_ROLE,taskArgs.opter) - const withdrawD = await gateway.hasRole(WITHDRAWALS_DISABLER_ROLE,taskArgs.opter) + const DEPOSITS_ENABLER_ROLE = await gateway.DEPOSITS_ENABLER_ROLE() + const DEPOSITS_DISABLER_ROLE = await gateway.DEPOSITS_DISABLER_ROLE() + const WITHDRAWALS_ENABLER_ROLE = await gateway.WITHDRAWALS_ENABLER_ROLE() + const WITHDRAWALS_DISABLER_ROLE = await gateway.WITHDRAWALS_DISABLER_ROLE() + const depositE = await gateway.hasRole(DEPOSITS_ENABLER_ROLE, taskArgs.opter) + const depositD = await gateway.hasRole(DEPOSITS_DISABLER_ROLE, taskArgs.opter) + const withdrawE = await gateway.hasRole(WITHDRAWALS_ENABLER_ROLE, taskArgs.opter) + const withdrawD = await gateway.hasRole(WITHDRAWALS_DISABLER_ROLE, taskArgs.opter) console.log(`Role: depositE ${depositE}, depositD ${depositD}, withdrawE ${withdrawE}, withdrawD ${withdrawD}`) }) @@ -336,48 +336,49 @@ task("upgrade-l1-usdcgateway") .addParam("router") .addParam("messenger") .setAction(async (taskArgs, hre) => { - // params check - if (!ethers.utils.isAddress(taskArgs.proxyadmin) || - !ethers.utils.isAddress(taskArgs.l1usdcgatewayproxy) || - !ethers.utils.isAddress(taskArgs.l1token) || - !ethers.utils.isAddress(taskArgs.l2token) || - !ethers.utils.isAddress(taskArgs.counterpart) || - !ethers.utils.isAddress(taskArgs.router) || - !ethers.utils.isAddress(taskArgs.messenger) - ) { - console.error(`address params check failed`) - return - } - // deploy gateway impl - const GatewayFactory = await hre.ethers.getContractFactory("L1USDCGateway") - const gateway = await GatewayFactory.deploy(taskArgs.l1token, taskArgs.l2token) - await gateway.deployed() - console.log(`gateway impl deployed at ${gateway.address}`) - - // upgrade proxy with initialize - const ProxyAdminFactory = await hre.ethers.getContractFactory("ProxyAdmin") - const proxyAdmin = await ProxyAdminFactory.attach(taskArgs.proxyadmin) - console.log(`proxy admin at ${proxyAdmin.address}`) - - let res = await proxyAdmin.upgradeAndCall( - taskArgs.l1usdcgatewayproxy, - gateway.address, - GatewayFactory.interface.encodeFunctionData("initialize", [ - taskArgs.counterpart, - taskArgs.router, - taskArgs.messenger - ] - ) - ) - let rec =await res.wait() - console.log(`upgrade gateway ${rec.status == 1}`) - - const gatewayProxy = GatewayFactory.attach(taskArgs.l1usdcgatewayproxy) - const counterpart = await gatewayProxy.counterpart() - const router = await gatewayProxy.router() - const l1USDC = await gatewayProxy.l1USDC() - const l2USDC = await gatewayProxy.l2USDC() - console.log(`gatewayProxy ${gatewayProxy.address}, counterpart ${counterpart}, router ${router}, l1USDC ${l1USDC}, l2USDC ${l2USDC}`) + // params check + if (!ethers.utils.isAddress(taskArgs.proxyadmin) || + !ethers.utils.isAddress(taskArgs.l1usdcgatewayproxy) || + !ethers.utils.isAddress(taskArgs.l1token) || + !ethers.utils.isAddress(taskArgs.l2token) || + !ethers.utils.isAddress(taskArgs.counterpart) || + !ethers.utils.isAddress(taskArgs.router) || + !ethers.utils.isAddress(taskArgs.messenger) + ) { + console.error(`address params check failed`) + return + } + // deploy gateway impl + const GatewayFactory = await hre.ethers.getContractFactory("L1USDCGateway") + const gateway = await GatewayFactory.deploy(taskArgs.l1token, taskArgs.l2token) + await gateway.deployed() + console.log(`gateway impl deployed at ${gateway.address}`) + + // upgrade proxy with initialize + const ProxyAdminFactory = await hre.ethers.getContractFactory("ProxyAdmin") + const proxyAdmin = await ProxyAdminFactory.attach(taskArgs.proxyadmin) + console.log(`proxy admin at ${proxyAdmin.address}`) + + let res = await proxyAdmin.upgrade( + taskArgs.l1usdcgatewayproxy, + gateway.address + ) + let rec = await res.wait() + console.log(`upgrade gateway ${rec.status == 1}`) + + + const gatewayProxy = GatewayFactory.attach(taskArgs.l1usdcgatewayproxy) + res = await gatewayProxy.initialize(taskArgs.counterpart, taskArgs.router, taskArgs.messenger) + rec = await res.wait() + console.log(`init gateway ${rec.status == 1}`) + + const owner = await gatewayProxy.owner() + const counterpart = await gatewayProxy.counterpart() + const router = await gatewayProxy.router() + const messenger = await gatewayProxy.messenger() + const l1USDC = await gatewayProxy.l1USDC() + const l2USDC = await gatewayProxy.l2USDC() + console.log(`owner ${owner}, gatewayProxy ${gatewayProxy.address}, counterpart ${counterpart}, router ${router}, messenger ${messenger}, l1USDC ${l1USDC}, l2USDC ${l2USDC}`) }) task("upgrade-l2-usdcgateway") @@ -389,48 +390,45 @@ task("upgrade-l2-usdcgateway") .addParam("router") .addParam("messenger") .setAction(async (taskArgs, hre) => { - // params check - if (!ethers.utils.isAddress(taskArgs.proxyadmin) || - !ethers.utils.isAddress(taskArgs.l2usdcgatewayproxy) || - !ethers.utils.isAddress(taskArgs.l1token) || - !ethers.utils.isAddress(taskArgs.l2token) || - !ethers.utils.isAddress(taskArgs.counterpart) || - !ethers.utils.isAddress(taskArgs.router) || - !ethers.utils.isAddress(taskArgs.messenger) - ) { - console.error(`address params check failed`) - return - } - // deploy gateway impl - const GatewayFactory = await hre.ethers.getContractFactory("L2USDCGateway") - const gateway = await GatewayFactory.deploy(taskArgs.l1token, taskArgs.l2token) - await gateway.deployed() - console.log(`gateway impl deployed at ${gateway.address}`) - - // upgrade proxy with initialize - const ProxyAdminFactory = await hre.ethers.getContractFactory("ProxyAdmin") - const proxyAdmin = await ProxyAdminFactory.attach(taskArgs.proxyadmin) - console.log(`proxy admin at ${proxyAdmin.address}`) - - let res = await proxyAdmin.upgradeAndCall( - taskArgs.l2usdcgatewayproxy, - gateway.address, - GatewayFactory.interface.encodeFunctionData("initialize", [ - taskArgs.counterpart, - taskArgs.router, - taskArgs.messenger - ] - ) - ) - let rec =await res.wait() - console.log(`upgrade gateway ${rec.status == 1}`) - - const gatewayProxy = GatewayFactory.attach(taskArgs.l2usdcgatewayproxy) - const counterpart = await gatewayProxy.counterpart() - const router = await gatewayProxy.router() - const l1USDC = await gatewayProxy.l1USDC() - const l2USDC = await gatewayProxy.l2USDC() - console.log(`gatewayProxy ${gatewayProxy.address}, counterpart ${counterpart}, router ${router}, l1USDC ${l1USDC}, l2USDC ${l2USDC}`) + // params check + if (!ethers.utils.isAddress(taskArgs.proxyadmin) || + !ethers.utils.isAddress(taskArgs.l2usdcgatewayproxy) || + !ethers.utils.isAddress(taskArgs.l1token) || + !ethers.utils.isAddress(taskArgs.l2token) || + !ethers.utils.isAddress(taskArgs.counterpart) || + !ethers.utils.isAddress(taskArgs.router) || + !ethers.utils.isAddress(taskArgs.messenger) + ) { + console.error(`address params check failed`) + return + } + // deploy gateway impl + const GatewayFactory = await hre.ethers.getContractFactory("L2USDCGateway") + const gateway = await GatewayFactory.deploy(taskArgs.l1token, taskArgs.l2token) + await gateway.deployed() + console.log(`gateway impl deployed at ${gateway.address}`) + + // upgrade proxy with initialize + const ProxyAdminFactory = await hre.ethers.getContractFactory("ProxyAdmin") + const proxyAdmin = await ProxyAdminFactory.attach(taskArgs.proxyadmin) + console.log(`proxy admin at ${proxyAdmin.address}`) + + let res = await proxyAdmin.upgrade( + taskArgs.l2usdcgatewayproxy, + gateway.address + ) + let rec = await res.wait() + console.log(`upgrade gateway ${rec.status == 1}`) + + const gatewayProxy = GatewayFactory.attach(taskArgs.l2usdcgatewayproxy) + res = await gatewayProxy.initialize(taskArgs.counterpart, taskArgs.router, taskArgs.messenger) + rec = await res.wait() + console.log(`init gateway ${rec.status == 1}`) + const counterpart = await gatewayProxy.counterpart() + const router = await gatewayProxy.router() + const l1USDC = await gatewayProxy.l1USDC() + const l2USDC = await gatewayProxy.l2USDC() + console.log(`gatewayProxy ${gatewayProxy.address}, counterpart ${counterpart}, router ${router}, l1USDC ${l1USDC}, l2USDC ${l2USDC}`) }) task("upgrade-l2-usdc-v2") @@ -454,7 +452,7 @@ task("upgrade-l2-usdc-v2") let res = await proxyAdmin.upgradeAndCall( taskArgs.l2usdcproxy, taskArgs.newimpl, - new ethers.utils.Interface(V2_1ABI).encodeFunctionData("initializeV2",[ + new ethers.utils.Interface(V2_1ABI).encodeFunctionData("initializeV2", [ "USD Coin" ]) ) @@ -491,7 +489,7 @@ task("upgrade-l2-usdc-v2-1") let rec = await res.wait() console.log(`upgrade usdc v2 ${rec.status == 1}`) - const l2usdc = new ethers.Contract(taskArgs.l2usdcproxy,new ethers.utils.Interface(V2_1ABI)) + const l2usdc = new ethers.Contract(taskArgs.l2usdcproxy, new ethers.utils.Interface(V2_1ABI)) res = await l2usdc.connect(deployer).initializeV2("USD Coin") rec = await res.wait() @@ -501,3 +499,115 @@ task("upgrade-l2-usdc-v2-1") rec = await res.wait() console.log(`l2 usdc initializeV2_1 ${rec.status == 1}`) }) + +task("deploy-l1-proxy") + .addParam("proxyadmin") + .addParam("empty") + .setAction(async (taskArgs, hre) => { + // params check + if (!ethers.utils.isAddress(taskArgs.proxyadmin) || + !ethers.utils.isAddress(taskArgs.empty) + ) { + console.error(`address params check failed`) + return + } + + const TransparentProxyFactory = await hre.ethers.getContractFactory("TransparentUpgradeableProxy") + const proxy = await TransparentProxyFactory.deploy( + taskArgs.empty, //logic + taskArgs.proxyadmin, //admin + "0x" + ) + await proxy.deployed() + console.log(`proxy deployed at ${proxy.address}`) + }) + + +task("deploy-l2-usdcgateway") + .addParam("proxyadmin") + .addParam("l1token") + .addParam("l2token") + .addParam("counterpart") + .addParam("router") + .addParam("messenger") + .setAction(async (taskArgs, hre) => { + // params check + if (!ethers.utils.isAddress(taskArgs.proxyadmin) || + !ethers.utils.isAddress(taskArgs.l1token) || + !ethers.utils.isAddress(taskArgs.l2token) || + !ethers.utils.isAddress(taskArgs.counterpart) || + !ethers.utils.isAddress(taskArgs.router) || + !ethers.utils.isAddress(taskArgs.messenger) + ) { + console.error(`address params check failed`) + return + } + // deploy gateway impl + const GatewayFactory = await hre.ethers.getContractFactory("L2USDCGateway") + const gateway = await GatewayFactory.deploy(taskArgs.l1token, taskArgs.l2token) + await gateway.deployed() + console.log(`gateway impl deployed at ${gateway.address}`) + + const TransparentProxyFactory = await hre.ethers.getContractFactory("TransparentUpgradeableProxy") + const proxy = await TransparentProxyFactory.deploy( + gateway.address, //logic + taskArgs.proxyadmin, //admin + GatewayFactory.interface.encodeFunctionData("initialize", [ + taskArgs.counterpart, + taskArgs.router, + taskArgs.messenger + ] + ) + ) + await proxy.deployed() + console.log(`gateway proxy deployed at ${proxy.address}`) + + const gatewayProxy = GatewayFactory.attach(proxy.address) + const owner = await gatewayProxy.owner() + const counterpart = await gatewayProxy.counterpart() + const router = await gatewayProxy.router() + const messenger = await gatewayProxy.messenger() + const l1USDC = await gatewayProxy.l1USDC() + const l2USDC = await gatewayProxy.l2USDC() + console.log(`owner ${owner}, gatewayProxy ${gatewayProxy.address}, counterpart ${counterpart}, router ${router}, messenger ${messenger}, l1USDC ${l1USDC}, l2USDC ${l2USDC}`) + }) + +task("deploy-l2-MigrationUSDC") + .addParam("proxyadmin") + .addParam("oldtoken") + .addParam("newtoken") + .addParam("recipient") + .setAction(async (taskArgs, hre) => { + // params check + if (!ethers.utils.isAddress(taskArgs.proxyadmin) || + !ethers.utils.isAddress(taskArgs.oldtoken) || + !ethers.utils.isAddress(taskArgs.recipient) || + !ethers.utils.isAddress(taskArgs.newtoken) + ) { + console.error(`address params check failed`) + return + } + // deploy gateway impl + const ContractFactory = await hre.ethers.getContractFactory("MigrationUSDC") + const contract = await ContractFactory.deploy(taskArgs.oldtoken, taskArgs.newtoken) + await contract.deployed() + console.log(`MigrationUSDC impl deployed at ${contract.address}`) + + const TransparentProxyFactory = await hre.ethers.getContractFactory("TransparentUpgradeableProxy") + const proxy = await TransparentProxyFactory.deploy( + contract.address, //logic + taskArgs.proxyadmin, //admin + ContractFactory.interface.encodeFunctionData("initialize", [ + taskArgs.recipient + ] + ) + ) + await proxy.deployed() + console.log(`MigrationUSDC proxy deployed at ${proxy.address}`) + + const migrationProxy = ContractFactory.attach(proxy.address) + const owner = await migrationProxy.owner() + const oldtoken = await migrationProxy.OLD_USDC() + const newtoken = await migrationProxy.NEW_USDC() + console.log(`owner ${owner}, oldtoken ${oldtoken}, newtoken ${newtoken}`) + }) \ No newline at end of file diff --git a/contracts/tasks/verifier_upgrade.ts b/contracts/tasks/verifier_upgrade.ts index 06bb8974..94ba46b0 100644 --- a/contracts/tasks/verifier_upgrade.ts +++ b/contracts/tasks/verifier_upgrade.ts @@ -5,11 +5,11 @@ import "@nomiclabs/hardhat-waffle"; import { task } from "hardhat/config"; import { ContractFactoryName } from "../src/types"; -// yarn hardhat upgradeVerifier --rollupVersion 0 --startBatchIndex 0 --multipleVersionRollupVerifier 0x0165878a594ca255338adfa4d48449f69242eb8f --network l1 +// yarn hardhat upgradeVerifier --rollupversion 0 --startbatchindex 0 --multipleversionrollupverifier 0x0165878a594ca255338adfa4d48449f69242eb8f --network l1 task("upgradeVerifier") - .addParam("rollupVersion") - .addParam("startBatchIndex") - .addParam("multipleVersionRollupVerifier") + .addParam("rollupversion") + .addParam("startbatchindex") + .addParam("multipleversionrollupverifier") .setAction(async (taskArgs, hre) => { const config = hre.deployConfig @@ -25,9 +25,9 @@ task("upgradeVerifier") // add verifier to MultipleVersionRollupVerifier const MultipleVersionRollupVerifierFactoryName = ContractFactoryName.MultipleVersionRollupVerifier const MultipleVersionRollupVerifierFactory = await hre.ethers.getContractFactory(MultipleVersionRollupVerifierFactoryName) - const MultipleVersionRollupVerifier = MultipleVersionRollupVerifierFactory.attach(taskArgs.multipleVersionRollupVerifier) + const MultipleVersionRollupVerifier = MultipleVersionRollupVerifierFactory.attach(taskArgs.multipleversionrollupverifier) - const res = await MultipleVersionRollupVerifier.updateVerifier(taskArgs.rollupVersion, taskArgs.startBatchIndex, contract.address.toLocaleLowerCase()) + const res = await MultipleVersionRollupVerifier.updateVerifier(taskArgs.rollupversion, taskArgs.startbatchindex, contract.address.toLocaleLowerCase()) const receipt = await res.wait() console.log(`receipt status : ${receipt.status}`) diff --git a/contracts/yarn.lock b/contracts/yarn.lock index c1d28d9b..4a0d9483 100644 --- a/contracts/yarn.lock +++ b/contracts/yarn.lock @@ -2440,6 +2440,13 @@ async-limiter@~1.0.0: resolved "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz#dd379e94f0db8310b08291f9d64c3209766617fd" integrity sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ== +async-mutex@^0.5.0: + version "0.5.0" + resolved "https://registry.yarnpkg.com/async-mutex/-/async-mutex-0.5.0.tgz#353c69a0b9e75250971a64ac203b0ebfddd75482" + integrity sha512-1A94B18jkJ3DYq284ohPxoXbfTA5HsQ7/Mf4DEhcyLx3Bz27Rh59iScbB6EPiP+B+joue6YCxcMXSbFC1tZKwA== + dependencies: + tslib "^2.4.0" + async@1.x, async@^1.4.2: version "1.5.2" resolved "https://registry.yarnpkg.com/async/-/async-1.5.2.tgz#ec6a61ae56480c0c3cb241c95618e20892f9672a" @@ -10630,6 +10637,11 @@ tslib@^2.1.0: resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.6.2.tgz#703ac29425e7b37cd6fd456e92404d46d1f3e4ae" integrity sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q== +tslib@^2.4.0: + version "2.8.1" + resolved "https://registry.yarnpkg.com/tslib/-/tslib-2.8.1.tgz#612efe4ed235d567e8aba5f2a5fab70280ade83f" + integrity sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w== + tsort@0.0.1: version "0.0.1" resolved "https://registry.yarnpkg.com/tsort/-/tsort-0.0.1.tgz#e2280f5e817f8bf4275657fd0f9aebd44f5a2786" diff --git a/gas-oracle/app/data/blob_with_context.data b/gas-oracle/app/data/blob_with_context.data new file mode 100644 index 00000000..3382e351 --- /dev/null +++ b/gas-oracle/app/data/blob_with_context.data @@ -0,0 +1 @@ +0x00605c484dde002cab0100000000000502090000000066ec47fb000f424000980096800005020a48000b01010c05060d060c0e071d0f0820100914000002f8b40082cf55820d1e843b9aca008502540be40082cbab94b678d52a477dc3a27141006d9e1bdc013ae33fc5b680b844a9059cbb70997970c51812dc3a010c7d01b5000e0d17dc79c801c001a021a4cd5cea6694b10bb76504b7b9ad041d3cfc0ef7002fe44364fb6308c2637d9ba053316ae18ec7cee4b3a8e3ff5bfbeb9421f0530086dcdd4df9aa43f5e2dcbcceb41f80a06148740561c6fa1a689151b45d238d00269ea1cb77eb23ca8f27c237d7c9c51769a05b91e5dc0e28f10950630ad2b30067482bd23068b92dbf32249c1876b909d0956c2001a0433ddb27d0178eb2d800d0f83e21108d3f2f8c9f0bb73636f1e9704a8ad8cf12e9a06b6d1ed518c47300f007a9484d534bdd6dd7bec3f78690532d36ddd445cfdad6532118a793edaf00878311817038864a0be195cb1d0fae365a09ad6bbaef8ccda888bda039d0820049cd66523c6de1cc898cd547e0ca4b3945a73fd8f1c049a4e689183d59228000a0155738e87ad858ddf5358d5d1efcc08331e9a86bfdfab4db8303763555f500783ea0749f0192b31b1fce631f26492be4bec77f10b2e3f7df4c22e482c02500e7d559e5239cb4b14e13ffc3206cedd02c235bfd71902b887c33750098e52f00bd0f18d2d055a07e011f3ff2631f8fdbbc81c1e65f31b4d611233565b59fb200e957174bff46c6d42401a0dee0d8ce4a02a46c4fc41de0b2682940e904694b004bd2125128a6b0ded7eaf090a06653e5811c4655ad869e26dd9097d6732c8800b946fcd1dc054650540f6134a1952577ec3c1a4fbdebb29055fd42c21eccd9001059a1d6f8530001354ab60452adf3fda03cd5341a27bb81df351d19a639b5006e720e97ae3041cbc3265b14ffbfb3a552d026fd93dd4bb2ca29da6b65a1d500409f20baed9144d4840647bb86cfe431466f9894a007728e4601d12a2ff42400c7c110bc6695401c058e86d2ab5dcc96dc23833d7ee52748c24f242809c913001f9a96ed3bb3426d646e2850dba562b878821bf15e8cb1bba00cc20d0d575300bc7eb3eb587a616e8ba6d4560b796af3457246de517751262abf2880a02d2d00b1d7e52eddf7927ad4abbb83bb901a89b0aa62966c6b95f9f83abb60e94ea00066630342c82beb66e1a750570f982c9c3ed1f2b70461901c154a65331b55ea00382901a03f454f43ec01bcb90283ca7594785184d5549776db7e0e2168695c004f2e7753eda037d86f7cfd0e8a1e36ef64f194efef0dcbe5483eeecdff55b6002c5f26bf5b0ca12a80a0433893e15fdd9e8f03a61396981bc76839b8e6fff000165e5b0699d9ee558da239a07fc3d17270bef0a45ca5eb83314536d7068aad0010e3a57acc2f3d60af757245402b02972ca22706dee5e6016becefd45d4a8f0012b2f3fc83b33b03ffafc550fab499a037b614a79eda8a5a36a994c463b28800c745b5cc50533a5bba58698d77346050ab2c01a02d3fb558c49db510127d2f00402c29bd0dae17f38c6297b6f5db27805c3eceb4f3a0058554be81edf262e400d9d2687afd389aa6c5135fa7b8984e4385b8ba424f55582d1a8ff121ea027800326e305cb3ce28adbb471de1cc1d0d49d3ec7aab3264cff540a06bd7ed2832005d6bdb4e3ec732a259ed9ab6864c06cd58a405521005097a4c2e992e6d71c800553de8024fbf08cbe7105bf9e653bdcef329e3084031b07b3d1bb3e09ea05100f957a4855b19c836c110193a4a9d162bdef6d596630645297167fe7a683b2b002f80a0f5ebbe0aaab995099b3d0c0623ac42c60a10ad1b3e0c5581bff3484b00ada365f5a00b89c4e11769623aef0ff8f62278fc7619a46a9cc9e16baee31d00bcc005ab31063001a0bde583db4d5ac3ddcbe1e077bb295849902002ba3d8f00df29da4d89af34ad1a59a06a9d8275cf12082964b1d031f795be0f05dca4ce00c34249063c894e36746a97af31de9dbd6726c87d33bae354fbcc1e6dfdf7cf00b6eae6532c9857a3f8b6ab7106d4a0556ad5ceba0e58b61a5844b2b783fa5200b04399b2673877bfe53a3c652e53d9c63280a0089d9ae24e245e00335448b70095c3943925b7509600aa2722cacff3e356b1e4d5a0017f469dbc012aec1eb90099db1795433216562ecb69ddd0a211f5f124d5a7f8123346274c0d9548d0570081bb6bda1f036f62817a3598b36cf32c06ebce0239e2c013a030c60e6f0e650003d66d23711fadf26b8054f22cdd810f95f59fa6d8c0aea45f7f34bfaeb891008b1fd534dd54c57ea04cd546d746dfc5afa29e16ead074cbe9813516a005a8006e03ba8ef6350fd0049814769620ed514f9ae816527c8fc60e4b4439c50e3500941ec592b6cb85877e39e2002115525178ccc02aa825b0b6679e0bbac5487700b3a0676a6cc3f6e62fe04fbec8f25585dc1fa975c6fbaf714471e83b9d512d000880403601a0f2fd0759a859cc2dec454ecf2f82a0b17333e03515689fe7ea009601b1cbb0900ea032629b6c1bb72bcd0ee339ca7834d04e7062e77611f7f1006d390dd17506654e6d37875a7f98c611b17b99aa1f8af309263b9ddc5d61ad0001c88fc2e8b4f7e3d5b592a01e8720a2febafa908ecfbe74a062005d899e1600ac50e746595f7de1a8a28a4fff3880a0816d178977b777e32c10cf2c1a3b94002b70c897da1f311e0ea4dbe654d74445baa049b58d4776884218515594379d0006fc5a79538bb61b09df46a8ffc0e14cd991583984b96575e465b70555291700555629b8a3c23bcf6baf895b2dec23e28ff78d5c68a005ae47300b7859fca80002e2b42bc648a839ed37da46dd1de7ce03e455132456013a01a080d8bea05000c13a6bc5eb23e92da453210b85f137731df93bdc73182da19a08dea012937c008e453ac6f86b8ffb23ad7c103e351e9ad3a6ce31ba49eac03886488b0e3b3600c32ceade034faecfb0dbc2fb341810e419ae9a984335faab98224b715b2fb000a0568824824950e88dbc26f5c5352f851408c9e2643520b3cf8f7d36e216a80003413c80a02dbdc0742093127f2383ab13da8f76a222f559a815ca470a72cd0076551f0f1547a06d4014af23ed1cd9f6ef558d8b23a38cffbe2f29040b516500a9c3b5bf76cbe71f3d01a0c16bba8cb481523d1c50331cea869048e953a25800424b045d06d71daf7299a35ca02e4adb29397a71f3f77c80c89e76b9b2e15b00c75c21c5c9b07ee7884a1c9dea563e80a03bc0efc9d87f14ae49beb7e65d1a002ff9ce27114a77a2c3c802d2a35f85c1c373a019a4458e87fd43f7cc6fcd6f00e3e15a6311fa239436cc02bfad0673feff22b7d03f01a09232d947630bb0a4008e08d391f5e77ab684d8bf6ff42855d436dae20d1d3d59e5a063473b7b2edb005e553f25bf0ec22feba9d84d8847888769989d8772ab35390b9e4039d8f4f2008e6a0f21e1faf7b2452b7d72389816a23f84b0640264ea42d0e62be9a07f1400e431c449f00d27e43b6659c7ea40509cb88699aa1a84eeca4f28b00591a9410080a01609f6757e86968f406b6e471149005400b151ad7d9e1e4b324f284d4000a78718a05152c4c957025176b0c359dfb4bafbeeda16f7ebcf17a175e99a9a0035d9e6b7b24201a072126b7214c2d534b024317e5deb56e12f02c353f6c9730044a3fba2082b9a68ffa030d361b3fbdf812b9bb57d305bd703adb08ad0d9fc00a5fcfe21947e692a04d5674380a0c6150f1c8a5a8e39f5788baa6c1bd5063f00c4c162d7dfc809f5eab3addcfb971aa04fa0ce293ac900247e108644b1efe800316c154e00dc306dd98e88c2d38fd6fd484401a054617644b9dd81ec4e3adc00ffda3dcbe713617cc8423cdcdbe161e192f6c8e05aa04ebbae889b4332548200cf98ee2f2deabb3ee6faf9dcc9438aa93e22179212ce1b458b9bab51a688730010f2a1acff535cd247e7aba6430128990fd06f8920d9940e85a04e4eb52b8200f042919381f78a4bbd3af3655c6c137c51d8f247691cdbd1cbf19f4680a01e00d893efc0be55fcab80fb26c5aa14f6fe3ab7cdf45f5dda8dde9a5298c0450700a032d5cf06712e7836d23e8373de79e1ee0a48668dde317d1800e849dc913b0006184701a0199d1f2f4544ef7aadd8db842838755d2ba5bc93db5f677bfc3d0031577e6c6f5ea01d2adf5ae68808c5b1357985b26b8129d02fbe622535cde400ec9ca2cf9c62141a4880a0cb5dda4a628541fa566623afe616cce53aae12b0007a4395680076f589b121ce4fa06cc131bad74a32e3000fc19f64e41048c3780051ec043d84bc815683a7b0849e4d496d96b0957809c8ae52149f86dff3c721001dd567280efb4bfd65c7b54bd091e548a02062b20e7b742fb1f13db32f94f4006cee52b591b9f299871708a895872f8a667c4a01a0f76c7f12317bfa8629e900630bcfe59d08807968538982627a9a1a3046e2cdaf5aa02fa9f692a15afd7c0091779ba94f0f225b50bbca93de2366de9a4c910c64d5df154b80a0b984f2c5002b9a3b7bd741315302486ca8381334b9d666f7a08faa2ed79722a676a030b8000a54a7a88b25fed3e90d160e449e84a474fc5e05a771d81fc513c0569de74c0001a07b72115c28aed626266441db9fc38f72a6b51ef7f4b2f9a77731b5488400dae1cda042b2829853687927e841956df5ba9abea7c7a6fa3eb33242ce140a00db26272e4a4d80a05b033e54fc8082d29564e6e5b28251f86e33c35544b3fd0067a0665e4fe37bd10ea007d2cd4e3854ea60f1394ec7e755ec9fd3925cfc10003ed7ef57b8e41e593ddb9e4e45b738e241b464e3b95a4a9411aed52dfadfc400996c1451f34df4c92b57dd3eeca008876723f7a2188539ab02c4e265e3b8f60098385437592eeb1bf70616cc3872bf4fa9d22b5ad20980176decf70e2e97bc0007dbe7cf9438866756b1d7db0bd7fb0bd7a039a67874e17cb0b545fd7a79f5006d0d9af182b12556a6d688b63e4dd3852e474d5001a085fa597a4947215484002a5010e280d65f80c6449cdac9df2c4d08b681def13085a0291ee12a746754004369e60bce58dfad1f2c79e36c4ea6a6fffa21ac4b6882b9505180a0d2c98a00afd7a29d0e8e9981b44e69372bc7eafff536ac204db2016d376a532ee0a02400f6e234884d55ea0d0159280e31eecd58559430747d78899229a73bca2900850052bfe756f8bf9212019a5725abf602616f6ee8cbf4b7f864c25b84a7421e5f005da5a01c9d481bc9b5310375e60ef4a764aaca4a45d2e62aea1f30ec99ef4900f609976453888575e8666ecaece3529b7eba6888dd67f126b7e66bd33c7920005c401aca69d8a04c5697ba8fcd4f972ffcc049e98598047d6245014a2364b800074f9723fa09dc9b5401a049bb5d27d2257af24bdfb68f5e6174bfb24d301500719f0637555941d9b1b104d4a02673925aac7ac9907dfca98d7387709ac322001e222a6869f26acfa353002bd3a955c77ab3ff266c5fb609881f7da4c2ff1c0033c91abbf0a5db7c89ac5be55e047d2da05640c5783e5b84cf5c0eb0375d94004acd350fbc90e3a8d275ea831f3c53d437005680a009e6a7fd6fda5bee1ee1008bce48e0179e1864b2feec22d8efc11187ac36d9e20ca063621af083f2b37b004c4349d71af0306c2745141a53c06ecf1bcae0b08c8ebc3d57d1044f9daa4a0038522228deb9f3833dd524b7070a6a57de01e51ad5c3367b36ada063e8ae5a00c6783040d721ee7bdea411ad4f8b6f06188475ec2c568bedf7e128125801a000469e2cd327501e91dcd82ab516dc498f614df0583ba9dc35e1010683078db40052a01ada9721d329a8ce0f0625838b88d3da0242ccfdf729ee2726740e340600d977f25980a051b9acbaa4c98a48544511ddad09db48eeb2911a26b908252600f85d4eb00f386da05a2ef770f4d9d9caaddef553ebe9a1ceb5d1b1363749fa002307689dfcd69ea6725a885953866bc4bec79d5bd2f5b669964806f89208e20064d0978278b997325749e0a061be40491f53edf6efa80db0c0317eae19f70200e8ba992bba58484c12a1aceff85b01a0a5435acc0ebd4fd3aed45e69e6621100beb18f24f737579d3b2d6a18bb52a832e4a02c2f6efe796b7d3c1a2af8de9f00be37eabb854a42281fb024f2c409f9677c564a5c80a090b9debf2e00203b68002a6e56b4aef1ffe8d9bdc48386f1ef71c1d759e704b6f4a014b38b8b9452e400747150f810f72dcf3683df769cc6d04c40abb2157af21b5ef75da51de6e56b008367f968724e5652d0b8112c3e782427d9a7f4388f143e459d6137a066b96000c4b29ffb2939e21391af55ffe2c74a2f0017ba59904c17f14bb7dfff5c5e0100a0d7cba9180c94f7ad3fa35b24a32990abf0d17dea5fc7f2878420f688dedd00b774a03c2eb0b4155592825603c5a206977b4fba3b608630237fb99168e23000769909b45f80a008e7275e71faf07a2972d1e1a35a9e6aa4967336debbbb6300964f05e6085aba66a0503745ba5f5740086c7432114710896f88d6cc474c7a00ddc9d449348c7783f4c16001a06c525b92e082c31c95d15c0ffba46d615ab4002e68a2ec0dfcf3ddfa4bbeb8cacea02d2518a87357b27568fc22cd7c5422d900ef2bbb82b0f91df9589135271f5ffdf1612cf708e3dd115f9f9de3ebe81d3800c52e7259bb7eba9a631b2e5d2e8c9a5fabeda034ae87e9d74fb69f126f74bc00b7e0d8495d1b42d6350f44b2c03b30938b8f87b26280a0796b4eca5909c0c80060cce4b836704ce91f1b59ba3c2768d0ae992bab9239e7b3a02229c2fa58ae000a35611028f650f84869d555ccbe5caeeb13bacce8a45089f754631717457f007acf89e1433001ffe472733aca40dd96532a9d8fe2e03950c026eab0a01e5b0007a67d09b65bd5c704c0b02e4832282ec0d4b990d55c58957aa68534802764000dabff733464906bf45b570ae67c25c5373c9b47f5f77e741cc27dd90c100a00d3a012db104698136f29b7bca7c4361d6dcf2a46f021c42c579cf5aae5e0fa00a12b2065d50b8871528d15fe0473f49b731329d6ba2f710f3840034733c8d80017bd18c346a01801f8e3f88f7f74ca44e9e9f7f43a09174ab720cbc3dd59b200fc8f263ce417296601a0b5bd8c1ee067d499d876ed3aa6e1174485cef38d2d003d97dc6f0cecd29ca4f3d2a064452e8e67335bea2e5380ebbd59d6dad41c340072e6b4e61b6721a5748f320f9d6780a0451b4c565a1571135a7278ae58f82000364e829738d90797ef632f464ff309b0a0a0152aa127c7b22ad6a4b3431e79004bd623b5cc0213396771a71bf960bd702637ef6801a0843a558d92eec71b770060eda3edb06a97efd6ac6fb1f46dbe79e53c26864ce300a0419deadb418a00009cc26537cabdc9fba3815c023a71771ec4c94536efe3b2e3396980a0b82fc30087831d5ad2d0f31cca02b67491e633492749b04f06fb4b9a105a4ce744a06e00fca93207505087d155e3d2e53f914807353eca57681cb523556ed13077d74e006afc94ef399c1ac106da88c15a90ad6b55112c5596c6b1a8c0b84f84a8e8f7005f3ea016d412fc4feeee2f05c9ae07f258549c1f13c5b14f626a147b4a38b600dbe86d226bad1215aa348c501b526cf1675c1202a798dc76f298b8398512de00c0629696d2c2a072255656388ac3a989daa147ec5c4fe538de8c911666626300c25bf93ebb6b22e16c0e5a6d45cee4a06c8d6833b2e0496a4a4f776201718c008ff0f16c23d2e706e65aa02f54592b4151a09bf42db9d8aeb5602e5b5e1a50003f50aed2f34228b85244a64c6d4c6be08d5e328b93930ea882295779ce0ec80006af9acfee08d5ddae95ac1013a5a022acf9cbe348a6d5f8b8b24e290d111800ef26fd7c909b9f6bf53b5f1b14eb67e06e01a02c2f8ddac09f28bfcc2330b5000166b5a799a8ddfff9f79e495e6da3630de58927a041115fb95e793ed8e29b0069bede5416b74ab45654984bfd4c51866e667542f8286f80a08ae03fc2e0a00019e47ae07b437c50992874c04b902b4121f35eb8fd9f4a1aab2aa00e5ace6f005feb53ba503c5cf157faeeac508cd184818d2a08926f8c8a8aa8ee9e7001a0006fb3c6920d11a2ad66b2ffedba90ecda8e90062d207e68fe28791f2a1efada0086a03312a767def17d60f3f21cdca699b6928cb4ca07c8f433bf18e92d031e0085e2fc710a3cdd007e07e278c232fb91c493849261f50154ec4817dfd68b9e00bcc87bf7e6a00e924876987f3e52fca01464ff89617c09ef0597cc1bff618800565f43f255c4757280a0fe81cb40267c4cd15258016782276e151c5074102800e28231738c52319b1dcde2a06254ad0e238f10de11313730503ef4af9232470068c2f2d569e85b649b99c3c18873397bbe42b74f14764cdb8bc8f3942fd2540036f828c53fb9abc8468a7a1de7d19da074cdd7053891c9e5f62bb1b4a0b803003399cc39f792018deef448fdae7fd9a5f47407d7ebe351cc99f38bdf58ae78009ab72f3e6a1faec54bd1a3772d87742e74d5f4a0295501c3b3257786efb690000b4f0b84d942ea23a4e6f566602c31d7822bfd75c960cad9ad2d8056065b230056c5cf7e32d548d4161517a8fdb606951d7c8c07a1a045f1b8264fbc31386e0027a320d233263bc87f4bbb30f8756d6e3dc435c0bb5fec767a4b6a605d8f5300e7a3b926e547be40cbb84f2a4f45b8d06ec37264faa7891525a0479286737d00a551489089b7df77bb801c4f5d27bf472306e50ae2ef9c40fd2f8e7701a01700e8f7dbf4d8249a695ca0aa89534cb2072c6e17c8f667040fd45c5c05b33a7500a0632712c44f890f8c56e5b4ef0d9515870e1038f350d8512f4dfb651f7a0e00b4907838843b6c7782702243c3ddf6d307a11831022afd6bf88cc8d5cfd2a8002e603185a00423cc572255a6dd40aef3644f5ba5b19db0007b4656ec40ea8200c0f7c318507a7901a0f8146d4afdffdaff96a7ddfce57a8ce4b68dcc396d45007848207432df8c04c43ba05f4a2afc79dda30439f91b8a1ca60b37488d51c600fa411b907a1376a0384cab697a80a087df37455c47e9e11129a44c76d0529d00d5d9bf7fc62b514ff9fd64b84b8cf192a079e19299cff5278b342608b6a70f00d8bec873f746af7a2e4264aa1c37a68a6bd47b80a0429da67993b5df938db700fd4747b2b7e0e1b17444c611f5bd7b8f3394a8003873a01887ddc5919f88d200374c1566365155e36a8cc81a9d052ab1d180e0a1c6607bb07c80a02e16f113005de4e757e78ebb7f71d00ae975b7be53861b6f5de5995d629dedb79fa033c90080441929c6618d856e14a057dab486fa4c0c7cfde6458fff0ad63df77b707d0001a0226fa5c9d4c8a01f950185542c4d156f3efcb5d810fcb5b4903bce2f97005b7807a047ae419c9bd315ced8e9fac4b343687647065645ced5bd071a15e90075f79c9ff77e888ded3df28bac579c42a3001f165fbeded85889124f2d2064004ac70fb88bb170a0686edc60997c99529cbce485a30ef70e3c295d3ce5b8750083d97a9d06bc9e3b397fcaedbd10045426b22579e5da60b78ab4ab25659c4200492f38fdd00d05ae2f0600a002d8a3434c3dc85aa953a9bc86d31947ca1334001d80126eb006b644bf3783451f800f2f41da2873a10b033cad020e2bd7fcd90023087ef8e041883be050dac3ba32b1a049f2dbefb4c1fc301c2020ca516a54003741b0a0ec306fbe675963b9ec2f2647468101a04e4859b18c72255a6439a70091d04f6f73b74b88e6ca11430613fd1722933642dca05e9e4231d2d60c595a003f540409adf143acfb772dc57b8bd156f38dcda9ab383480dfa821784288f0002702229cf8c0834a1a031240104040c811428010fc2708e1254222f803e800005510d5c0caa18801c8a1918328c390819543220294412b501edeb2eac0a9070051419487a307a286200356072a055207560f8a18400f8c3c8c0aa00e5a19500035801cb87a10350872303aa0d2107a607450c500f460e4c0aa0174a09583a80000cac1d50351439001ab039506a107a307450ca003561e460d400f8d0ca81a00401e1c3d881a0419583d1069083d307a2822807a307260d5003ad0ca41540000e5e0ea80aa21c880d5834883d081d5812a06d0012b0fa306a08746065405280007ae1e4405a21c8c0ea834841e18850b9dac47990116605b7826e77425798d0024af93f374725e47ce1f3805e5afe520009cf34b000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 \ No newline at end of file diff --git a/gas-oracle/app/src/abi/Rollup.json b/gas-oracle/app/src/abi/Rollup.json index 10b61fb3..28f7a5c6 100644 --- a/gas-oracle/app/src/abi/Rollup.json +++ b/gas-oracle/app/src/abi/Rollup.json @@ -15,16 +15,6 @@ "name": "ErrZeroAddress", "type": "error" }, - { - "inputs": [], - "name": "ErrorIncorrectBatchLength", - "type": "error" - }, - { - "inputs": [], - "name": "ErrorNoBlockInBatch", - "type": "error" - }, { "anonymous": false, "inputs": [ @@ -619,14 +609,14 @@ "type": "bytes" }, { - "internalType": "bytes", - "name": "blockContexts", - "type": "bytes" + "internalType": "uint64", + "name": "lastBlockNumber", + "type": "uint64" }, { - "internalType": "bytes", - "name": "skippedL1MessageBitmap", - "type": "bytes" + "internalType": "uint16", + "name": "numL1Messages", + "type": "uint16" }, { "internalType": "bytes32", @@ -695,6 +685,25 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "batchIndex", + "type": "uint256" + } + ], + "name": "committedStateRoots", + "outputs": [ + { + "internalType": "bytes32", + "name": "stateRoot", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "finalizationPeriodSeconds", @@ -804,6 +813,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_prevStateRoot", + "type": "bytes32" + } + ], + "name": "initialize2", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -1142,4 +1164,4 @@ "stateMutability": "payable", "type": "receive" } -] \ No newline at end of file +] diff --git a/gas-oracle/app/src/da_scalar/calculate.rs b/gas-oracle/app/src/da_scalar/calculate.rs index 22d409e0..92b0e537 100644 --- a/gas-oracle/app/src/da_scalar/calculate.rs +++ b/gas-oracle/app/src/da_scalar/calculate.rs @@ -5,7 +5,6 @@ use ethers::{ use eyre::anyhow; use serde::{Deserialize, Serialize}; use serde_json::Value; -use std::ops::Mul; use super::{ blob::{kzg_to_versioned_hash, Blob}, @@ -17,8 +16,8 @@ use super::{ pub(super) fn extract_tx_payload( indexed_hashes: Vec, sidecars: &[Value], -) -> Result, ScalarError> { - let mut tx_payload = Vec::::new(); +) -> Result>, ScalarError> { + let mut batch_bytes = Vec::>::new(); for i_h in indexed_hashes { if let Some(sidecar) = sidecars.iter().find(|sidecar| { sidecar["index"].as_str().unwrap_or("1000").parse::().unwrap_or(1000) == i_h.index @@ -63,14 +62,14 @@ pub(super) fn extract_tx_payload( let blob_array: [u8; MAX_BLOB_TX_PAYLOAD_SIZE] = decoded_blob.try_into().unwrap(); let blob_struct = Blob(blob_array); - let mut origin_batch = blob_struct.get_origin_batch().map_err(|e| { + let origin_batch = blob_struct.get_origin_batch().map_err(|e| { ScalarError::CalculateError(anyhow!(format!( "Failed to decode blob tx payload: {}", e ))) })?; - tx_payload.append(&mut origin_batch); + batch_bytes.push(origin_batch); } else { return Err(ScalarError::CalculateError(anyhow!(format!( "no blob in response matches desired index: {}", @@ -78,41 +77,35 @@ pub(super) fn extract_tx_payload( )))); } } - Ok(tx_payload) + Ok(batch_bytes) } -pub fn extract_txn_num(block_contexts: Bytes) -> Option { - if block_contexts.is_empty() || block_contexts.len() < 2 { +pub fn extract_txn_count(origin_batch: &Vec, last_block_num: u64) -> Option { + if origin_batch.is_empty() || origin_batch.len() < 8 { return None; } - - let mut txn_in_batch = 0u64; - let mut l1_txn_in_batch = 0u64; - let bs: &[u8] = &block_contexts; - - // decode blocks from batch - // | 2 byte | 60 bytes | ... | 60 bytes | - // | num blocks | block 1 | ... | block n | - // https://github.com/morph-l2/morph/blob/main/contracts/contracts/libraries/codec/BatchCodecV0.sol - let num_blocks: u16 = ((bs[0] as u16) << 8) | (bs[1] as u16); - - for i in 0..num_blocks as usize { - let txs_num = u16::from_be_bytes( - bs.get((60.mul(i) + 2 + 56)..(60.mul(i) + 2 + 58))?.try_into().ok()?, - ); - let l1_txs_num = u16::from_be_bytes( - bs.get((60.mul(i) + 2 + 58)..(60.mul(i) + 2 + 60))?.try_into().ok()?, - ); - txn_in_batch += txs_num as u64; - l1_txn_in_batch += l1_txs_num as u64; + let first_block_num = u64::from_be_bytes(origin_batch[0..8].try_into().unwrap_or_default()); + let block_count = last_block_num - first_block_num + 1; + if origin_batch.len() < 60 * block_count as usize { + log::error!("invalid blob batch len"); + return None; } + let mut txn_count_in_batch = 0u64; + for i in 0..block_count as usize { + let bys = &origin_batch[60 * i + 56..60 * i + 58]; + let num_txn = u16::from_be_bytes(bys.try_into().unwrap_or_default()); + + let bys = &origin_batch[60 * i + 58..60 * i + 60]; + let num_l1_messages = u16::from_be_bytes(bys.try_into().unwrap_or_default()); + if num_txn < num_l1_messages { + log::error!("total_txn_in_batch < l1_txn_in_batch"); + return None; + } - log::debug!("total_txn_in_batch: {:#?}, l1_txn_in_batch: {:#?}", txn_in_batch, l1_txn_in_batch); - if txn_in_batch < l1_txn_in_batch { - log::error!("total_txn_in_batch < l1_txn_in_batch"); - return None; + txn_count_in_batch += (num_txn - num_l1_messages) as u64; } - Some(txn_in_batch - l1_txn_in_batch) + + Some(txn_count_in_batch) } #[derive(Debug, Serialize, Deserialize)] diff --git a/gas-oracle/app/src/da_scalar/l1_scalar.rs b/gas-oracle/app/src/da_scalar/l1_scalar.rs index 485a02bf..140e8163 100644 --- a/gas-oracle/app/src/da_scalar/l1_scalar.rs +++ b/gas-oracle/app/src/da_scalar/l1_scalar.rs @@ -5,7 +5,7 @@ use tokio::time::{sleep, Duration}; use super::{ blob_client::BeaconNode, - calculate::{data_and_hashes_from_txs, extract_tx_payload, extract_txn_num}, + calculate::{data_and_hashes_from_txs, extract_tx_payload, extract_txn_count}, error::ScalarError, MAX_BLOB_TX_PAYLOAD_SIZE, }; @@ -227,47 +227,10 @@ impl ScalarUpdater { tx_hash: TxHash, block_num: U64, ) -> Result<(u64, u64), ScalarError> { - //Step1. Get transaction - let tx = self - .l1_provider - .get_transaction(tx_hash) - .await - .map_err(|e| { - ScalarError::Error(anyhow!(format!("l1_provider.get_transaction err: {:#?}", e))) - })? - .ok_or_else(|| { - ScalarError::Error(anyhow!(format!( - "ll1_provider.get_transaction is none, tx_hash= {:#?}", - tx_hash - ))) - })?; - - log::info!("hit self rollup tx hash: {:#?}, blocknum: {:#?}", tx_hash, block_num); - - //Step2. Parse transaction data - let data = tx.input; - if data.is_empty() { - return Err(ScalarError::Error(anyhow!(format!( - "overhead_inspect tx.input is empty, tx_hash= {:#?}", - tx_hash - )))); - } - let param = CommitBatchCall::decode(&data).map_err(|e| { - ScalarError::Error(anyhow!(format!( - "overhead_inspect decode tx.input error, tx_hash= {:#?}, err= {:#?}", - tx_hash, e - ))) - })?; - - let block_contexts: Bytes = param.batch_data_input.block_contexts; - let l2_txn = extract_txn_num(block_contexts).unwrap_or(0); - - //Step3. Calculate l2 data gas - let l2_data_len = self - .calculate_l2_data_len_from_blob(tx_hash, block_num, l2_txn) - .await - .map_err(|e| { - log::error!("calculate_l2_data_len_from_blob error: {:#?}", e); + //Step1. get_data_from_blob + let (l2_data_len, l2_txn) = + self.get_data_from_blob(tx_hash, block_num).await.map_err(|e| { + log::error!("get_data_from_blob error: {:#?}", e); e })?; @@ -292,7 +255,7 @@ impl ScalarUpdater { )))); } - //Step4. Calculate scalar + //Step2. Calculate scalar let commit_scalar = (rollup_gas_used.as_u64() + self.finalize_batch_gas_used) * PRECISION / l2_txn.max(self.txn_per_batch); let blob_scalar = if l2_data_len > 0 { @@ -315,15 +278,11 @@ impl ScalarUpdater { Ok((commit_scalar, blob_scalar)) } - async fn calculate_l2_data_len_from_blob( + async fn get_data_from_blob( &self, tx_hash: TxHash, block_num: U64, - l2_txn: u64, - ) -> Result { - if l2_txn == 0 { - return Ok(0); - } + ) -> Result<(u64, u64), ScalarError> { let blob_tx = self .l1_provider .get_transaction(tx_hash) @@ -351,7 +310,7 @@ impl ScalarUpdater { let indexed_hashes = data_and_hashes_from_txs(&blob_block.transactions, &blob_tx); if indexed_hashes.is_empty() { log::info!("no blob in this batch, batch_tx_hash: {:#?}", tx_hash); - return Ok(0); + return Ok((0, 0)); } // Waiting for the next L1 block to be produced. @@ -387,6 +346,19 @@ impl ScalarUpdater { } }; + // Parse last_block_num + if blob_tx.input.is_empty() { + log::warn!("batch inspect: tx.input is empty, tx_hash = {:#?}", tx_hash); + return Err(ScalarError::Error(anyhow!(format!("commitBatch tx.input empty")))); + } + let param = if let Ok(_param) = CommitBatchCall::decode(&blob_tx.input) { + _param + } else { + log::error!("batch inspect: decode tx.input error, tx_hash = {:#?}", tx_hash); + return Err(ScalarError::Error(anyhow!(format!("decode commitBatch tx.input error",)))); + }; + let last_block_num: u64 = param.batch_data_input.last_block_number; + let indexes: Vec = indexed_hashes.iter().map(|item| item.index).collect(); let sidecars_rt = self .beacon_node @@ -407,16 +379,65 @@ impl ScalarUpdater { )))); } - let tx_payload = extract_tx_payload(indexed_hashes, sidecars)?; + let tx_payloads = extract_tx_payload(indexed_hashes, sidecars)?; + let data_with_txn_count: Vec<(u64, u64)> = tx_payloads + .iter() + .map(|batch: &Vec| { + (batch.len() as u64, extract_txn_count(batch, last_block_num).unwrap_or_default()) + }) + .collect(); + + let (total_size, total_count) = data_with_txn_count + .iter() + .fold((0u64, 0u64), |acc, &(size, count)| (acc.0 + size, acc.1 + count)); - Ok(tx_payload.len() as u64) + Ok((total_size, total_count)) } } #[cfg(test)] mod tests { + use crate::da_scalar::blob::Blob; + use super::*; - use std::{env::var, str::FromStr, sync::Arc}; + use std::{env::var, fs, path::Path, str::FromStr, sync::Arc}; + + #[test] + fn test_blob_data() { + let blob_data_path = Path::new("data/blob_with_context.data"); + let data = fs::read_to_string(blob_data_path).expect("Unable to read file"); + let hex_data: Vec = hex::decode(data.trim()).unwrap(); + + let mut blob_array = [0u8; 131072]; + blob_array.copy_from_slice(&hex_data); + + let blob_struct = Blob(blob_array); + let origin_batch = blob_struct + .get_origin_batch() + .map_err(|e| { + ScalarError::CalculateError(anyhow!(format!( + "Failed to decode blob tx payload: {}", + e + ))) + }) + .unwrap(); + + let mut tx_payloads: Vec> = vec![]; + tx_payloads.push(origin_batch); + + let data_with_txn_count: Vec<(u64, u64)> = tx_payloads + .iter() + .map(|batch: &Vec| { + (batch.len() as u64, extract_txn_count(batch, 328208).unwrap_or_default()) + }) + .collect(); + + let (total_size, total_count) = data_with_txn_count + .iter() + .fold((0u64, 0u64), |acc, &(size, count)| (acc.0 + size, acc.1 + count)); + + println!("total_size: {}, total_count: {}", total_size, total_count) + } #[tokio::test] #[ignore] diff --git a/go-ethereum b/go-ethereum index 0ff2a10a..151913b1 160000 --- a/go-ethereum +++ b/go-ethereum @@ -1 +1 @@ -Subproject commit 0ff2a10a9625e38b5d2189ad713d104192c1ae16 +Subproject commit 151913b181b1dba79226e67fd1ccb595d8c60d92 diff --git a/go.work.sum b/go.work.sum index f675befb..5a1efad1 100644 --- a/go.work.sum +++ b/go.work.sum @@ -5,32 +5,58 @@ cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gc cloud.google.com/go v0.100.2 h1:t9Iw5QH5v4XtlEQaCtUY7x6sCABps8sW0acw7e2WQ6Y= cloud.google.com/go v0.100.2/go.mod h1:4Xra9TjzAeYHrl5+oeLlzbM2k3mjVhZh4UqTZ//w99A= cloud.google.com/go v0.110.8/go.mod h1:Iz8AkXJf1qmxC3Oxoep8R1T36w8B92yU29PcBhHO5fk= +cloud.google.com/go v0.112.0 h1:tpFCD7hpHFlQ8yPwT3x+QeXqc2T6+n6T+hmABHfDUSM= cloud.google.com/go v0.112.0/go.mod h1:3jEEVwZ/MHU4djK5t5RHuKOA/GbLddgTdVubX1qnPD4= +cloud.google.com/go/accessapproval v1.7.4 h1:ZvLvJ952zK8pFHINjpMBY5k7LTAp/6pBf50RDMRgBUI= cloud.google.com/go/accessapproval v1.7.4/go.mod h1:/aTEh45LzplQgFYdQdwPMR9YdX0UlhBmvB84uAmQKUc= +cloud.google.com/go/accesscontextmanager v1.8.4 h1:Yo4g2XrBETBCqyWIibN3NHNPQKUfQqti0lI+70rubeE= cloud.google.com/go/accesscontextmanager v1.8.4/go.mod h1:ParU+WbMpD34s5JFEnGAnPBYAgUHozaTmDJU7aCU9+M= +cloud.google.com/go/aiplatform v1.58.0 h1:xyCAfpI4yUMOQ4VtHN/bdmxPQ8xoEkTwFM1nbVmuQhs= cloud.google.com/go/aiplatform v1.58.0/go.mod h1:pwZMGvqe0JRkI1GWSZCtnAfrR4K1bv65IHILGA//VEU= +cloud.google.com/go/analytics v0.22.0 h1:w8KIgW8NRUHFVKjpkwCpLaHsr685tJ+ckPStOaSCZz0= cloud.google.com/go/analytics v0.22.0/go.mod h1:eiROFQKosh4hMaNhF85Oc9WO97Cpa7RggD40e/RBy8w= +cloud.google.com/go/apigateway v1.6.4 h1:VVIxCtVerchHienSlaGzV6XJGtEM9828Erzyr3miUGs= cloud.google.com/go/apigateway v1.6.4/go.mod h1:0EpJlVGH5HwAN4VF4Iec8TAzGN1aQgbxAWGJsnPCGGY= +cloud.google.com/go/apigeeconnect v1.6.4 h1:jSoGITWKgAj/ssVogNE9SdsTqcXnryPzsulENSRlusI= cloud.google.com/go/apigeeconnect v1.6.4/go.mod h1:CapQCWZ8TCjnU0d7PobxhpOdVz/OVJ2Hr/Zcuu1xFx0= +cloud.google.com/go/apigeeregistry v0.8.2 h1:DSaD1iiqvELag+lV4VnnqUUFd8GXELu01tKVdWZrviE= cloud.google.com/go/apigeeregistry v0.8.2/go.mod h1:h4v11TDGdeXJDJvImtgK2AFVvMIgGWjSb0HRnBSjcX8= +cloud.google.com/go/appengine v1.8.4 h1:Qub3fqR7iA1daJWdzjp/Q0Jz0fUG0JbMc7Ui4E9IX/E= cloud.google.com/go/appengine v1.8.4/go.mod h1:TZ24v+wXBujtkK77CXCpjZbnuTvsFNT41MUaZ28D6vg= +cloud.google.com/go/area120 v0.8.4 h1:YnSO8m02pOIo6AEOgiOoUDVbw4pf+bg2KLHi4rky320= cloud.google.com/go/area120 v0.8.4/go.mod h1:jfawXjxf29wyBXr48+W+GyX/f8fflxp642D/bb9v68M= +cloud.google.com/go/artifactregistry v1.14.6 h1:/hQaadYytMdA5zBh+RciIrXZQBWK4vN7EUsrQHG+/t8= cloud.google.com/go/artifactregistry v1.14.6/go.mod h1:np9LSFotNWHcjnOgh8UVK0RFPCTUGbO0ve3384xyHfE= +cloud.google.com/go/asset v1.17.0 h1:dLWfTnbwyrq/Kt8Tr2JiAbre1MEvS2Bl5cAMiYAy5Pg= cloud.google.com/go/asset v1.17.0/go.mod h1:yYLfUD4wL4X589A9tYrv4rFrba0QlDeag0CMcM5ggXU= +cloud.google.com/go/assuredworkloads v1.11.4 h1:FsLSkmYYeNuzDm8L4YPfLWV+lQaUrJmH5OuD37t1k20= cloud.google.com/go/assuredworkloads v1.11.4/go.mod h1:4pwwGNwy1RP0m+y12ef3Q/8PaiWrIDQ6nD2E8kvWI9U= +cloud.google.com/go/automl v1.13.4 h1:i9tOKXX+1gE7+rHpWKjiuPfGBVIYoWvLNIGpWgPtF58= cloud.google.com/go/automl v1.13.4/go.mod h1:ULqwX/OLZ4hBVfKQaMtxMSTlPx0GqGbWN8uA/1EqCP8= +cloud.google.com/go/baremetalsolution v1.2.3 h1:oQiFYYCe0vwp7J8ZmF6siVKEumWtiPFJMJcGuyDVRUk= cloud.google.com/go/baremetalsolution v1.2.3/go.mod h1:/UAQ5xG3faDdy180rCUv47e0jvpp3BFxT+Cl0PFjw5g= +cloud.google.com/go/batch v1.7.0 h1:AxuSPoL2fWn/rUyvWeNCNd0V2WCr+iHRCU9QO1PUmpY= cloud.google.com/go/batch v1.7.0/go.mod h1:J64gD4vsNSA2O5TtDB5AAux3nJ9iV8U3ilg3JDBYejU= +cloud.google.com/go/beyondcorp v1.0.3 h1:VXf9SnrnSmj2BF2cHkoTHvOUp8gjsz1KJFOMW7czdsY= cloud.google.com/go/beyondcorp v1.0.3/go.mod h1:HcBvnEd7eYr+HGDd5ZbuVmBYX019C6CEXBonXbCVwJo= cloud.google.com/go/bigquery v1.8.0 h1:PQcPefKFdaIzjQFbiyOgAqyx8q5djaE7x9Sqe712DPA= +cloud.google.com/go/bigquery v1.58.0 h1:drSd9RcPVLJP2iFMimvOB9SCSIrcl+9HD4II03Oy7A0= cloud.google.com/go/bigquery v1.58.0/go.mod h1:0eh4mWNY0KrBTjUzLjoYImapGORq9gEPT7MWjCy9lik= +cloud.google.com/go/bigtable v1.2.0 h1:F4cCmA4nuV84V5zYQ3MKY+M1Cw1avHDuf3S/LcZPA9c= cloud.google.com/go/bigtable v1.2.0/go.mod h1:JcVAOl45lrTmQfLj7T6TxyMzIN/3FGGcFm+2xVAli2o= +cloud.google.com/go/billing v1.18.0 h1:GvKy4xLy1zF1XPbwP5NJb2HjRxhnhxjjXxvyZ1S/IAo= cloud.google.com/go/billing v1.18.0/go.mod h1:5DOYQStCxquGprqfuid/7haD7th74kyMBHkjO/OvDtk= +cloud.google.com/go/binaryauthorization v1.8.0 h1:PHS89lcFayWIEe0/s2jTBiEOtqghCxzc7y7bRNlifBs= cloud.google.com/go/binaryauthorization v1.8.0/go.mod h1:VQ/nUGRKhrStlGr+8GMS8f6/vznYLkdK5vaKfdCIpvU= +cloud.google.com/go/certificatemanager v1.7.4 h1:5YMQ3Q+dqGpwUZ9X5sipsOQ1fLPsxod9HNq0+nrqc6I= cloud.google.com/go/certificatemanager v1.7.4/go.mod h1:FHAylPe/6IIKuaRmHbjbdLhGhVQ+CWHSD5Jq0k4+cCE= +cloud.google.com/go/channel v1.17.4 h1:yYHOORIM+wkBy3EdwArg/WL7Lg+SoGzlKH9o3Bw2/jE= cloud.google.com/go/channel v1.17.4/go.mod h1:QcEBuZLGGrUMm7kNj9IbU1ZfmJq2apotsV83hbxX7eE= +cloud.google.com/go/cloudbuild v1.15.0 h1:9IHfEMWdCklJ1cwouoiQrnxmP0q3pH7JUt8Hqx4Qbck= cloud.google.com/go/cloudbuild v1.15.0/go.mod h1:eIXYWmRt3UtggLnFGx4JvXcMj4kShhVzGndL1LwleEM= +cloud.google.com/go/clouddms v1.7.3 h1:xe/wJKz55VO1+L891a1EG9lVUgfHr9Ju/I3xh1nwF84= cloud.google.com/go/clouddms v1.7.3/go.mod h1:fkN2HQQNUYInAU3NQ3vRLkV2iWs8lIdmBKOx4nrL6Hc= +cloud.google.com/go/cloudtasks v1.12.4 h1:5xXuFfAjg0Z5Wb81j2GAbB3e0bwroCeSF+5jBn/L650= cloud.google.com/go/cloudtasks v1.12.4/go.mod h1:BEPu0Gtt2dU6FxZHNqqNdGqIG86qyWKBPGnsb7udGY0= cloud.google.com/go/compute v1.20.1/go.mod h1:4tCnrn48xsqlwSAiLf1HXMQk8CONslYbdiEZc9FEIbM= cloud.google.com/go/compute v1.23.1/go.mod h1:CqB3xpmPKKt3OJpW2ndFIXnA9A4xAy/F3Xp1ixncW78= @@ -38,106 +64,200 @@ cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiV cloud.google.com/go/compute v1.23.3/go.mod h1:VCgBUoMnIVIR0CscqQiPJLAG25E3ZRZMzcFZeQ+h8CI= cloud.google.com/go/compute/metadata v0.2.3 h1:mg4jlk7mCAj6xXp9UJ4fjI9VUI5rubuGBW5aJ7UnBMY= cloud.google.com/go/compute/metadata v0.2.3/go.mod h1:VAV5nSsACxMJvgaAuX6Pk2AawlZn8kiOGuCv6gTkwuA= +cloud.google.com/go/contactcenterinsights v1.12.1 h1:EiGBeejtDDtr3JXt9W7xlhXyZ+REB5k2tBgVPVtmNb0= cloud.google.com/go/contactcenterinsights v1.12.1/go.mod h1:HHX5wrz5LHVAwfI2smIotQG9x8Qd6gYilaHcLLLmNis= +cloud.google.com/go/container v1.29.0 h1:jIltU529R2zBFvP8rhiG1mgeTcnT27KhU0H/1d6SQRg= cloud.google.com/go/container v1.29.0/go.mod h1:b1A1gJeTBXVLQ6GGw9/9M4FG94BEGsqJ5+t4d/3N7O4= +cloud.google.com/go/containeranalysis v0.11.3 h1:5rhYLX+3a01drpREqBZVXR9YmWH45RnML++8NsCtuD8= cloud.google.com/go/containeranalysis v0.11.3/go.mod h1:kMeST7yWFQMGjiG9K7Eov+fPNQcGhb8mXj/UcTiWw9U= +cloud.google.com/go/datacatalog v1.19.2 h1:BV5sB7fPc8ccv/obwtHwQtCdLMAgI4KyaQWfkh8/mWg= cloud.google.com/go/datacatalog v1.19.2/go.mod h1:2YbODwmhpLM4lOFe3PuEhHK9EyTzQJ5AXgIy7EDKTEE= +cloud.google.com/go/dataflow v0.9.4 h1:7VmCNWcPJBS/srN2QnStTB6nu4Eb5TMcpkmtaPVhRt4= cloud.google.com/go/dataflow v0.9.4/go.mod h1:4G8vAkHYCSzU8b/kmsoR2lWyHJD85oMJPHMtan40K8w= +cloud.google.com/go/dataform v0.9.1 h1:jV+EsDamGX6cE127+QAcCR/lergVeeZdEQ6DdrxW3sQ= cloud.google.com/go/dataform v0.9.1/go.mod h1:pWTg+zGQ7i16pyn0bS1ruqIE91SdL2FDMvEYu/8oQxs= +cloud.google.com/go/datafusion v1.7.4 h1:Q90alBEYlMi66zL5gMSGQHfbZLB55mOAg03DhwTTfsk= cloud.google.com/go/datafusion v1.7.4/go.mod h1:BBs78WTOLYkT4GVZIXQCZT3GFpkpDN4aBY4NDX/jVlM= +cloud.google.com/go/datalabeling v0.8.4 h1:zrq4uMmunf2KFDl/7dS6iCDBBAxBnKVDyw6+ajz3yu0= cloud.google.com/go/datalabeling v0.8.4/go.mod h1:Z1z3E6LHtffBGrNUkKwbwbDxTiXEApLzIgmymj8A3S8= +cloud.google.com/go/dataplex v1.14.0 h1:/WhVTR4v/L6ACKjlz/9CqkxkrVh2z7C44CLMUf0f60A= cloud.google.com/go/dataplex v1.14.0/go.mod h1:mHJYQQ2VEJHsyoC0OdNyy988DvEbPhqFs5OOLffLX0c= +cloud.google.com/go/dataproc v1.12.0 h1:W47qHL3W4BPkAIbk4SWmIERwsWBaNnWm0P2sdx3YgGU= cloud.google.com/go/dataproc v1.12.0/go.mod h1:zrF3aX0uV3ikkMz6z4uBbIKyhRITnxvr4i3IjKsKrw4= +cloud.google.com/go/dataproc/v2 v2.3.0 h1:tTVP9tTxmc8fixxOd/8s6Q6Pz/+yzn7r7XdZHretQH0= cloud.google.com/go/dataproc/v2 v2.3.0/go.mod h1:G5R6GBc9r36SXv/RtZIVfB8SipI+xVn0bX5SxUzVYbY= +cloud.google.com/go/dataqna v0.8.4 h1:NJnu1kAPamZDs/if3bJ3+Wb6tjADHKL83NUWsaIp2zg= cloud.google.com/go/dataqna v0.8.4/go.mod h1:mySRKjKg5Lz784P6sCov3p1QD+RZQONRMRjzGNcFd0c= cloud.google.com/go/datastore v1.1.0 h1:/May9ojXjRkPBNVrq+oWLqmWCkr4OU5uRY29bu0mRyQ= +cloud.google.com/go/datastore v1.15.0 h1:0P9WcsQeTWjuD1H14JIY7XQscIPQ4Laje8ti96IC5vg= cloud.google.com/go/datastore v1.15.0/go.mod h1:GAeStMBIt9bPS7jMJA85kgkpsMkvseWWXiaHya9Jes8= +cloud.google.com/go/datastream v1.10.3 h1:Z2sKPIB7bT2kMW5Uhxy44ZgdJzxzE5uKjavoW+EuHEE= cloud.google.com/go/datastream v1.10.3/go.mod h1:YR0USzgjhqA/Id0Ycu1VvZe8hEWwrkjuXrGbzeDOSEA= +cloud.google.com/go/deploy v1.17.0 h1:P3SgJ+4rAktC2XqaI10G0ip/vzWluNBrC5VG0abMbLw= cloud.google.com/go/deploy v1.17.0/go.mod h1:XBr42U5jIr64t92gcpOXxNrqL2PStQCXHuKK5GRUuYo= +cloud.google.com/go/dialogflow v1.48.1 h1:1Uq2jDJzjJ3M4xYB608FCCFHfW3JmrTmHIxRSd7JGmY= cloud.google.com/go/dialogflow v1.48.1/go.mod h1:C1sjs2/g9cEwjCltkKeYp3FFpz8BOzNondEaAlCpt+A= +cloud.google.com/go/dlp v1.11.1 h1:OFlXedmPP/5//X1hBEeq3D9kUVm9fb6ywYANlpv/EsQ= cloud.google.com/go/dlp v1.11.1/go.mod h1:/PA2EnioBeXTL/0hInwgj0rfsQb3lpE3R8XUJxqUNKI= +cloud.google.com/go/documentai v1.23.7 h1:hlYieOXUwiJ7HpBR/vEPfr8nfSxveLVzbqbUkSK0c/4= cloud.google.com/go/documentai v1.23.7/go.mod h1:ghzBsyVTiVdkfKaUCum/9bGBEyBjDO4GfooEcYKhN+g= +cloud.google.com/go/domains v0.9.4 h1:ua4GvsDztZ5F3xqjeLKVRDeOvJshf5QFgWGg1CKti3A= cloud.google.com/go/domains v0.9.4/go.mod h1:27jmJGShuXYdUNjyDG0SodTfT5RwLi7xmH334Gvi3fY= +cloud.google.com/go/edgecontainer v1.1.4 h1:Szy3Q/N6bqgQGyxqjI+6xJZbmvPvnFHp3UZr95DKcQ0= cloud.google.com/go/edgecontainer v1.1.4/go.mod h1:AvFdVuZuVGdgaE5YvlL1faAoa1ndRR/5XhXZvPBHbsE= +cloud.google.com/go/errorreporting v0.3.0 h1:kj1XEWMu8P0qlLhm3FwcaFsUvXChV/OraZwA70trRR0= cloud.google.com/go/errorreporting v0.3.0/go.mod h1:xsP2yaAp+OAW4OIm60An2bbLpqIhKXdWR/tawvl7QzU= +cloud.google.com/go/essentialcontacts v1.6.5 h1:S2if6wkjR4JCEAfDtIiYtD+sTz/oXjh2NUG4cgT1y/Q= cloud.google.com/go/essentialcontacts v1.6.5/go.mod h1:jjYbPzw0x+yglXC890l6ECJWdYeZ5dlYACTFL0U/VuM= +cloud.google.com/go/eventarc v1.13.3 h1:+pFmO4eu4dOVipSaFBLkmqrRYG94Xl/TQZFOeohkuqU= cloud.google.com/go/eventarc v1.13.3/go.mod h1:RWH10IAZIRcj1s/vClXkBgMHwh59ts7hSWcqD3kaclg= +cloud.google.com/go/filestore v1.8.0 h1:/+wUEGwk3x3Kxomi2cP5dsR8+SIXxo7M0THDjreFSYo= cloud.google.com/go/filestore v1.8.0/go.mod h1:S5JCxIbFjeBhWMTfIYH2Jx24J6BqjwpkkPl+nBA5DlI= cloud.google.com/go/firestore v1.6.1 h1:8rBq3zRjnHx8UtBvaOWqBB1xq9jH6/wltfQLlTMh2Fw= cloud.google.com/go/firestore v1.6.1/go.mod h1:asNXNOzBdyVQmEU+ggO8UPodTkEVFW5Qx+rwHnAz+EY= +cloud.google.com/go/firestore v1.14.0 h1:8aLcKnMPoldYU3YHgu4t2exrKhLQkqaXAGqT0ljrFVw= cloud.google.com/go/firestore v1.14.0/go.mod h1:96MVaHLsEhbvkBEdZgfN+AS/GIkco1LRpH9Xp9YZfzQ= +cloud.google.com/go/functions v1.15.4 h1:ZjdiV3MyumRM6++1Ixu6N0VV9LAGlCX4AhW6Yjr1t+U= cloud.google.com/go/functions v1.15.4/go.mod h1:CAsTc3VlRMVvx+XqXxKqVevguqJpnVip4DdonFsX28I= +cloud.google.com/go/gkebackup v1.3.4 h1:KhnOrr9A1tXYIYeXKqCKbCI8TL2ZNGiD3dm+d7BDUBg= cloud.google.com/go/gkebackup v1.3.4/go.mod h1:gLVlbM8h/nHIs09ns1qx3q3eaXcGSELgNu1DWXYz1HI= +cloud.google.com/go/gkeconnect v0.8.4 h1:1JLpZl31YhQDQeJ98tK6QiwTpgHFYRJwpntggpQQWis= cloud.google.com/go/gkeconnect v0.8.4/go.mod h1:84hZz4UMlDCKl8ifVW8layK4WHlMAFeq8vbzjU0yJkw= +cloud.google.com/go/gkehub v0.14.4 h1:J5tYUtb3r0cl2mM7+YHvV32eL+uZQ7lONyUZnPikCEo= cloud.google.com/go/gkehub v0.14.4/go.mod h1:Xispfu2MqnnFt8rV/2/3o73SK1snL8s9dYJ9G2oQMfc= +cloud.google.com/go/gkemulticloud v1.1.0 h1:C2Suwn3uPz+Yy0bxVjTlsMrUCaDovkgvfdyIa+EnUOU= cloud.google.com/go/gkemulticloud v1.1.0/go.mod h1:7NpJBN94U6DY1xHIbsDqB2+TFZUfjLUKLjUX8NGLor0= +cloud.google.com/go/grafeas v0.3.0 h1:oyTL/KjiUeBs9eYLw/40cpSZglUC+0F7X4iu/8t7NWs= cloud.google.com/go/grafeas v0.3.0/go.mod h1:P7hgN24EyONOTMyeJH6DxG4zD7fwiYa5Q6GUgyFSOU8= +cloud.google.com/go/gsuiteaddons v1.6.4 h1:uuw2Xd37yHftViSI8J2hUcCS8S7SH3ZWH09sUDLW30Q= cloud.google.com/go/gsuiteaddons v1.6.4/go.mod h1:rxtstw7Fx22uLOXBpsvb9DUbC+fiXs7rF4U29KHM/pE= cloud.google.com/go/iam v1.1.3/go.mod h1:3khUlaBXfPKKe7huYgEpDn6FtgRyMEqbkvBxrQyY5SE= +cloud.google.com/go/iam v1.1.5 h1:1jTsCu4bcsNsE4iiqNT5SHwrDRCfRmIaaaVFhRveTJI= cloud.google.com/go/iam v1.1.5/go.mod h1:rB6P/Ic3mykPbFio+vo7403drjlgvoWfYpJhMXEbzv8= +cloud.google.com/go/iap v1.9.3 h1:M4vDbQ4TLXdaljXVZSwW7XtxpwXUUarY2lIs66m0aCM= cloud.google.com/go/iap v1.9.3/go.mod h1:DTdutSZBqkkOm2HEOTBzhZxh2mwwxshfD/h3yofAiCw= +cloud.google.com/go/ids v1.4.4 h1:VuFqv2ctf/A7AyKlNxVvlHTzjrEvumWaZflUzBPz/M4= cloud.google.com/go/ids v1.4.4/go.mod h1:z+WUc2eEl6S/1aZWzwtVNWoSZslgzPxAboS0lZX0HjI= +cloud.google.com/go/iot v1.7.4 h1:m1WljtkZnvLTIRYW1YTOv5A6H1yKgLHR6nU7O8yf27w= cloud.google.com/go/iot v1.7.4/go.mod h1:3TWqDVvsddYBG++nHSZmluoCAVGr1hAcabbWZNKEZLk= +cloud.google.com/go/kms v1.15.5 h1:pj1sRfut2eRbD9pFRjNnPNg/CzJPuQAzUujMIM1vVeM= cloud.google.com/go/kms v1.15.5/go.mod h1:cU2H5jnp6G2TDpUGZyqTCoy1n16fbubHZjmVXSMtwDI= +cloud.google.com/go/language v1.12.2 h1:zg9uq2yS9PGIOdc0Kz/l+zMtOlxKWonZjjo5w5YPG2A= cloud.google.com/go/language v1.12.2/go.mod h1:9idWapzr/JKXBBQ4lWqVX/hcadxB194ry20m/bTrhWc= +cloud.google.com/go/lifesciences v0.9.4 h1:rZEI/UxcxVKEzyoRS/kdJ1VoolNItRWjNN0Uk9tfexg= cloud.google.com/go/lifesciences v0.9.4/go.mod h1:bhm64duKhMi7s9jR9WYJYvjAFJwRqNj+Nia7hF0Z7JA= +cloud.google.com/go/logging v1.9.0 h1:iEIOXFO9EmSiTjDmfpbRjOxECO7R8C7b8IXUGOj7xZw= cloud.google.com/go/logging v1.9.0/go.mod h1:1Io0vnZv4onoUnsVUQY3HZ3Igb1nBchky0A0y7BBBhE= cloud.google.com/go/longrunning v0.5.2/go.mod h1:nqo6DQbNV2pXhGDbDMoN2bWz68MjZUzqv2YttZiveCs= +cloud.google.com/go/longrunning v0.5.4 h1:w8xEcbZodnA2BbW6sVirkkoC+1gP8wS57EUUgGS0GVg= cloud.google.com/go/longrunning v0.5.4/go.mod h1:zqNVncI0BOP8ST6XQD1+VcvuShMmq7+xFSzOL++V0dI= +cloud.google.com/go/managedidentities v1.6.4 h1:SF/u1IJduMqQQdJA4MDyivlIQ4SrV5qAawkr/ZEREkY= cloud.google.com/go/managedidentities v1.6.4/go.mod h1:WgyaECfHmF00t/1Uk8Oun3CQ2PGUtjc3e9Alh79wyiM= +cloud.google.com/go/maps v1.6.3 h1:Qqs6Dza+PRp5CZO5AfgPnLwU1k3pp0IMFRDtLpT+aCA= cloud.google.com/go/maps v1.6.3/go.mod h1:VGAn809ADswi1ASofL5lveOHPnE6Rk/SFTTBx1yuOLw= +cloud.google.com/go/mediatranslation v0.8.4 h1:VRCQfZB4s6jN0CSy7+cO3m4ewNwgVnaePanVCQh/9Z4= cloud.google.com/go/mediatranslation v0.8.4/go.mod h1:9WstgtNVAdN53m6TQa5GjIjLqKQPXe74hwSCxUP6nj4= +cloud.google.com/go/memcache v1.10.4 h1:cdex/ayDd294XBj2cGeMe6Y+H1JvhN8y78B9UW7pxuQ= cloud.google.com/go/memcache v1.10.4/go.mod h1:v/d8PuC8d1gD6Yn5+I3INzLR01IDn0N4Ym56RgikSI0= +cloud.google.com/go/metastore v1.13.3 h1:94l/Yxg9oBZjin2bzI79oK05feYefieDq0o5fjLSkC8= cloud.google.com/go/metastore v1.13.3/go.mod h1:K+wdjXdtkdk7AQg4+sXS8bRrQa9gcOr+foOMF2tqINE= +cloud.google.com/go/monitoring v1.17.0 h1:blrdvF0MkPPivSO041ihul7rFMhXdVp8Uq7F59DKXTU= cloud.google.com/go/monitoring v1.17.0/go.mod h1:KwSsX5+8PnXv5NJnICZzW2R8pWTis8ypC4zmdRD63Tw= +cloud.google.com/go/networkconnectivity v1.14.3 h1:e9lUkCe2BexsqsUc2bjV8+gFBpQa54J+/F3qKVtW+wA= cloud.google.com/go/networkconnectivity v1.14.3/go.mod h1:4aoeFdrJpYEXNvrnfyD5kIzs8YtHg945Og4koAjHQek= +cloud.google.com/go/networkmanagement v1.9.3 h1:HsQk4FNKJUX04k3OI6gUsoveiHMGvDRqlaFM2xGyvqU= cloud.google.com/go/networkmanagement v1.9.3/go.mod h1:y7WMO1bRLaP5h3Obm4tey+NquUvB93Co1oh4wpL+XcU= +cloud.google.com/go/networksecurity v0.9.4 h1:947tNIPnj1bMGTIEBo3fc4QrrFKS5hh0bFVsHmFm4Vo= cloud.google.com/go/networksecurity v0.9.4/go.mod h1:E9CeMZ2zDsNBkr8axKSYm8XyTqNhiCHf1JO/Vb8mD1w= +cloud.google.com/go/notebooks v1.11.2 h1:eTOTfNL1yM6L/PCtquJwjWg7ZZGR0URFaFgbs8kllbM= cloud.google.com/go/notebooks v1.11.2/go.mod h1:z0tlHI/lREXC8BS2mIsUeR3agM1AkgLiS+Isov3SS70= +cloud.google.com/go/optimization v1.6.2 h1:iFsoexcp13cGT3k/Hv8PA5aK+FP7FnbhwDO9llnruas= cloud.google.com/go/optimization v1.6.2/go.mod h1:mWNZ7B9/EyMCcwNl1frUGEuY6CPijSkz88Fz2vwKPOY= +cloud.google.com/go/orchestration v1.8.4 h1:kgwZ2f6qMMYIVBtUGGoU8yjYWwMTHDanLwM/CQCFaoQ= cloud.google.com/go/orchestration v1.8.4/go.mod h1:d0lywZSVYtIoSZXb0iFjv9SaL13PGyVOKDxqGxEf/qI= +cloud.google.com/go/orgpolicy v1.12.0 h1:sab7cDiyfdthpAL0JkSpyw1C3mNqkXToVOhalm79PJQ= cloud.google.com/go/orgpolicy v1.12.0/go.mod h1:0+aNV/nrfoTQ4Mytv+Aw+stBDBjNf4d8fYRA9herfJI= +cloud.google.com/go/osconfig v1.12.4 h1:OrRCIYEAbrbXdhm13/JINn9pQchvTTIzgmOCA7uJw8I= cloud.google.com/go/osconfig v1.12.4/go.mod h1:B1qEwJ/jzqSRslvdOCI8Kdnp0gSng0xW4LOnIebQomA= +cloud.google.com/go/oslogin v1.13.0 h1:gbA/G4p+youIR4O/Rk6DU181QlBlpwPS16kvJwqEz8o= cloud.google.com/go/oslogin v1.13.0/go.mod h1:xPJqLwpTZ90LSE5IL1/svko+6c5avZLluiyylMb/sRA= +cloud.google.com/go/phishingprotection v0.8.4 h1:sPLUQkHq6b4AL0czSJZ0jd6vL55GSTHz2B3Md+TCZI0= cloud.google.com/go/phishingprotection v0.8.4/go.mod h1:6b3kNPAc2AQ6jZfFHioZKg9MQNybDg4ixFd4RPZZ2nE= +cloud.google.com/go/policytroubleshooter v1.10.2 h1:sq+ScLP83d7GJy9+wpwYJVnY+q6xNTXwOdRIuYjvHT4= cloud.google.com/go/policytroubleshooter v1.10.2/go.mod h1:m4uF3f6LseVEnMV6nknlN2vYGRb+75ylQwJdnOXfnv0= +cloud.google.com/go/privatecatalog v0.9.4 h1:Vo10IpWKbNvc/z/QZPVXgCiwfjpWoZ/wbgful4Uh/4E= cloud.google.com/go/privatecatalog v0.9.4/go.mod h1:SOjm93f+5hp/U3PqMZAHTtBtluqLygrDrVO8X8tYtG0= cloud.google.com/go/pubsub v1.3.1 h1:ukjixP1wl0LpnZ6LWtZJ0mX5tBmjp1f8Sqer8Z2OMUU= +cloud.google.com/go/pubsub v1.34.0 h1:ZtPbfwfi5rLaPeSvDC29fFoE20/tQvGrUS6kVJZJvkU= cloud.google.com/go/pubsub v1.34.0/go.mod h1:alj4l4rBg+N3YTFDDC+/YyFTs6JAjam2QfYsddcAW4c= +cloud.google.com/go/pubsublite v1.8.1 h1:pX+idpWMIH30/K7c0epN6V703xpIcMXWRjKJsz0tYGY= cloud.google.com/go/pubsublite v1.8.1/go.mod h1:fOLdU4f5xldK4RGJrBMm+J7zMWNj/k4PxwEZXy39QS0= +cloud.google.com/go/recaptchaenterprise/v2 v2.9.0 h1:Zrd4LvT9PaW91X/Z13H0i5RKEv9suCLuk8zp+bfOpN4= cloud.google.com/go/recaptchaenterprise/v2 v2.9.0/go.mod h1:Dak54rw6lC2gBY8FBznpOCAR58wKf+R+ZSJRoeJok4w= +cloud.google.com/go/recommendationengine v0.8.4 h1:JRiwe4hvu3auuh2hujiTc2qNgPPfVp+Q8KOpsXlEzKQ= cloud.google.com/go/recommendationengine v0.8.4/go.mod h1:GEteCf1PATl5v5ZsQ60sTClUE0phbWmo3rQ1Js8louU= +cloud.google.com/go/recommender v1.12.0 h1:tC+ljmCCbuZ/ybt43odTFlay91n/HLIhflvaOeb0Dh4= cloud.google.com/go/recommender v1.12.0/go.mod h1:+FJosKKJSId1MBFeJ/TTyoGQZiEelQQIZMKYYD8ruK4= +cloud.google.com/go/redis v1.14.1 h1:J9cEHxG9YLmA9o4jTSvWt/RuVEn6MTrPlYSCRHujxDQ= cloud.google.com/go/redis v1.14.1/go.mod h1:MbmBxN8bEnQI4doZPC1BzADU4HGocHBk2de3SbgOkqs= +cloud.google.com/go/resourcemanager v1.9.4 h1:JwZ7Ggle54XQ/FVYSBrMLOQIKoIT/uer8mmNvNLK51k= cloud.google.com/go/resourcemanager v1.9.4/go.mod h1:N1dhP9RFvo3lUfwtfLWVxfUWq8+KUQ+XLlHLH3BoFJ0= +cloud.google.com/go/resourcesettings v1.6.4 h1:yTIL2CsZswmMfFyx2Ic77oLVzfBFoWBYgpkgiSPnC4Y= cloud.google.com/go/resourcesettings v1.6.4/go.mod h1:pYTTkWdv2lmQcjsthbZLNBP4QW140cs7wqA3DuqErVI= +cloud.google.com/go/retail v1.14.4 h1:geqdX1FNqqL2p0ADXjPpw8lq986iv5GrVcieTYafuJQ= cloud.google.com/go/retail v1.14.4/go.mod h1:l/N7cMtY78yRnJqp5JW8emy7MB1nz8E4t2yfOmklYfg= +cloud.google.com/go/run v1.3.3 h1:qdfZteAm+vgzN1iXzILo3nJFQbzziudkJrvd9wCf3FQ= cloud.google.com/go/run v1.3.3/go.mod h1:WSM5pGyJ7cfYyYbONVQBN4buz42zFqwG67Q3ch07iK4= +cloud.google.com/go/scheduler v1.10.5 h1:eMEettHlFhG5pXsoHouIM5nRT+k+zU4+GUvRtnxhuVI= cloud.google.com/go/scheduler v1.10.5/go.mod h1:MTuXcrJC9tqOHhixdbHDFSIuh7xZF2IysiINDuiq6NI= +cloud.google.com/go/secretmanager v1.11.4 h1:krnX9qpG2kR2fJ+u+uNyNo+ACVhplIAS4Pu7u+4gd+k= cloud.google.com/go/secretmanager v1.11.4/go.mod h1:wreJlbS9Zdq21lMzWmJ0XhWW2ZxgPeahsqeV/vZoJ3w= +cloud.google.com/go/security v1.15.4 h1:sdnh4Islb1ljaNhpIXlIPgb3eYj70QWgPVDKOUYvzJc= cloud.google.com/go/security v1.15.4/go.mod h1:oN7C2uIZKhxCLiAAijKUCuHLZbIt/ghYEo8MqwD/Ty4= +cloud.google.com/go/securitycenter v1.24.3 h1:crdn2Z2rFIy8WffmmhdlX3CwZJusqCiShtnrGFRwpeE= cloud.google.com/go/securitycenter v1.24.3/go.mod h1:l1XejOngggzqwr4Fa2Cn+iWZGf+aBLTXtB/vXjy5vXM= +cloud.google.com/go/servicedirectory v1.11.3 h1:5niCMfkw+jifmFtbBrtRedbXkJm3fubSR/KHbxSJZVM= cloud.google.com/go/servicedirectory v1.11.3/go.mod h1:LV+cHkomRLr67YoQy3Xq2tUXBGOs5z5bPofdq7qtiAw= +cloud.google.com/go/shell v1.7.4 h1:nurhlJcSVFZneoRZgkBEHumTYf/kFJptCK2eBUq/88M= cloud.google.com/go/shell v1.7.4/go.mod h1:yLeXB8eKLxw0dpEmXQ/FjriYrBijNsONpwnWsdPqlKM= +cloud.google.com/go/spanner v1.55.0 h1:YF/A/k73EMYCjp8wcJTpkE+TcrWutHRlsCtlRSfWS64= cloud.google.com/go/spanner v1.55.0/go.mod h1:HXEznMUVhC+PC+HDyo9YFG2Ajj5BQDkcbqB9Z2Ffxi0= +cloud.google.com/go/speech v1.21.0 h1:qkxNao58oF8ghAHE1Eghen7XepawYEN5zuZXYWaUTA4= cloud.google.com/go/speech v1.21.0/go.mod h1:wwolycgONvfz2EDU8rKuHRW3+wc9ILPsAWoikBEWavY= cloud.google.com/go/storage v1.14.0 h1:6RRlFMv1omScs6iq2hfE3IvgE+l6RfJPampq8UZc5TU= +cloud.google.com/go/storage v1.36.0 h1:P0mOkAcaJxhCTvAkMhxMfrTKiNcub4YmmPBtlhAyTr8= cloud.google.com/go/storage v1.36.0/go.mod h1:M6M/3V/D3KpzMTJyPOR/HU6n2Si5QdaXYEsng2xgOs8= +cloud.google.com/go/storagetransfer v1.10.3 h1:YM1dnj5gLjfL6aDldO2s4GeU8JoAvH1xyIwXre63KmI= cloud.google.com/go/storagetransfer v1.10.3/go.mod h1:Up8LY2p6X68SZ+WToswpQbQHnJpOty/ACcMafuey8gc= +cloud.google.com/go/talent v1.6.5 h1:LnRJhhYkODDBoTwf6BeYkiJHFw9k+1mAFNyArwZUZAs= cloud.google.com/go/talent v1.6.5/go.mod h1:Mf5cma696HmE+P2BWJ/ZwYqeJXEeU0UqjHFXVLadEDI= +cloud.google.com/go/texttospeech v1.7.4 h1:ahrzTgr7uAbvebuhkBAAVU6kRwVD0HWsmDsvMhtad5Q= cloud.google.com/go/texttospeech v1.7.4/go.mod h1:vgv0002WvR4liGuSd5BJbWy4nDn5Ozco0uJymY5+U74= +cloud.google.com/go/tpu v1.6.4 h1:XIEH5c0WeYGaVy9H+UueiTaf3NI6XNdB4/v6TFQJxtE= cloud.google.com/go/tpu v1.6.4/go.mod h1:NAm9q3Rq2wIlGnOhpYICNI7+bpBebMJbh0yyp3aNw1Y= +cloud.google.com/go/trace v1.10.4 h1:2qOAuAzNezwW3QN+t41BtkDJOG42HywL73q8x/f6fnM= cloud.google.com/go/trace v1.10.4/go.mod h1:Nso99EDIK8Mj5/zmB+iGr9dosS/bzWCJ8wGmE6TXNWY= +cloud.google.com/go/translate v1.10.0 h1:tncNaKmlZnayMMRX/mMM2d5AJftecznnxVBD4w070NI= cloud.google.com/go/translate v1.10.0/go.mod h1:Kbq9RggWsbqZ9W5YpM94Q1Xv4dshw/gr/SHfsl5yCZ0= +cloud.google.com/go/video v1.20.3 h1:Xrpbm2S9UFQ1pZEeJt9Vqm5t2T/z9y/M3rNXhFoo8Is= cloud.google.com/go/video v1.20.3/go.mod h1:TnH/mNZKVHeNtpamsSPygSR0iHtvrR/cW1/GDjN5+GU= +cloud.google.com/go/videointelligence v1.11.4 h1:YS4j7lY0zxYyneTFXjBJUj2r4CFe/UoIi/PJG0Zt/Rg= cloud.google.com/go/videointelligence v1.11.4/go.mod h1:kPBMAYsTPFiQxMLmmjpcZUMklJp3nC9+ipJJtprccD8= +cloud.google.com/go/vision/v2 v2.7.5 h1:T/ujUghvEaTb+YnFY/jiYwVAkMbIC8EieK0CJo6B4vg= cloud.google.com/go/vision/v2 v2.7.5/go.mod h1:GcviprJLFfK9OLf0z8Gm6lQb6ZFUulvpZws+mm6yPLM= +cloud.google.com/go/vmmigration v1.7.4 h1:qPNdab4aGgtaRX+51jCOtJxlJp6P26qua4o1xxUDjpc= cloud.google.com/go/vmmigration v1.7.4/go.mod h1:yBXCmiLaB99hEl/G9ZooNx2GyzgsjKnw5fWcINRgD70= +cloud.google.com/go/vmwareengine v1.0.3 h1:WY526PqM6QNmFHSqe2sRfK6gRpzWjmL98UFkql2+JDM= cloud.google.com/go/vmwareengine v1.0.3/go.mod h1:QSpdZ1stlbfKtyt6Iu19M6XRxjmXO+vb5a/R6Fvy2y4= +cloud.google.com/go/vpcaccess v1.7.4 h1:zbs3V+9ux45KYq8lxxn/wgXole6SlBHHKKyZhNJoS+8= cloud.google.com/go/vpcaccess v1.7.4/go.mod h1:lA0KTvhtEOb/VOdnH/gwPuOzGgM+CWsmGu6bb4IoMKk= +cloud.google.com/go/webrisk v1.9.4 h1:iceR3k0BCRZgf2D/NiKviVMFfuNC9LmeNLtxUFRB/wI= cloud.google.com/go/webrisk v1.9.4/go.mod h1:w7m4Ib4C+OseSr2GL66m0zMBywdrVNTDKsdEsfMl7X0= +cloud.google.com/go/websecurityscanner v1.6.4 h1:5Gp7h5j7jywxLUp6NTpjNPkgZb3ngl0tUSw6ICWvtJQ= cloud.google.com/go/websecurityscanner v1.6.4/go.mod h1:mUiyMQ+dGpPPRkHgknIZeCzSHJ45+fY4F52nZFDHm2o= +cloud.google.com/go/workflows v1.12.3 h1:qocsqETmLAl34mSa01hKZjcqAvt699gaoFbooGGMvaM= cloud.google.com/go/workflows v1.12.3/go.mod h1:fmOUeeqEwPzIU81foMjTRQIdwQHADi/vEr1cx9R1m5g= +collectd.org v0.3.0 h1:iNBHGw1VvPJxH2B6RiFWFZ+vsjo1lCdRszBeOuwGi00= collectd.org v0.3.0/go.mod h1:A/8DzQBkF6abtvrT2j/AU/4tiBgJWYyh0y/oB/4MlWE= dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9 h1:VpgP7xuJadIUuKccphEpTJnWhS2jkQyMt6Y7pJCD7fY= github.com/Antonboom/errname v0.1.7 h1:mBBDKvEYwPl4WFFNwec1CZO096G6vzK9vvDQzAwkako= @@ -147,21 +267,31 @@ github.com/Antonboom/nilnil v0.1.1/go.mod h1:L1jBqoWM7AOeTD+tSquifKSesRHs4ZdaxvZ github.com/Azure/azure-pipeline-go v0.2.1/go.mod h1:UGSo8XybXnIGZ3epmeBw7Jdz+HiUVpqIlpz/HKHylF4= github.com/Azure/azure-pipeline-go v0.2.2 h1:6oiIS9yaG6XCCzhgAgKFfIWyo4LLCiDhZot6ltoThhY= github.com/Azure/azure-pipeline-go v0.2.2/go.mod h1:4rQ/NZncSvGqNkkOsNpOU1tgoNuIlp9AfUH5G1tvCHc= +github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1 h1:qoVeMsc9/fh/yhxVaA0obYjVH/oI/ihrOoMwsLS9KSA= github.com/Azure/azure-sdk-for-go/sdk/azcore v0.21.1/go.mod h1:fBF9PQNqB8scdgpZ3ufzaLntG0AG7C1WjPMsiFOmfHM= +github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3 h1:E+m3SkZCN0Bf5q7YdTs5lSm2CYY3CK4spn5OmUIiQtk= github.com/Azure/azure-sdk-for-go/sdk/internal v0.8.3/go.mod h1:KLF4gFr6DcKFZwSuH8w8yEK6DpFl3LP5rhdvAb7Yz5I= +github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0 h1:Px2UA+2RvSSvv+RvJNuUB6n7rs5Wsel4dXLe90Um2n4= github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v0.3.0/go.mod h1:tPaiy8S5bQ+S5sOiDlINkp7+Ef339+Nz5L5XO+cnOHo= github.com/Azure/azure-storage-blob-go v0.7.0 h1:MuueVOYkufCxJw5YZzF842DY2MBsp+hLuh2apKY0mck= github.com/Azure/azure-storage-blob-go v0.7.0/go.mod h1:f9YQKtsG1nMisotuTPpO0tjNuEjKRYAcJU8/ydDI++4= +github.com/Azure/go-autorest v14.2.0+incompatible h1:V5VMDjClD3GiElqLWO7mz2MxNAK/vTfRHdAubSIPRgs= github.com/Azure/go-autorest v14.2.0+incompatible/go.mod h1:r+4oMnoxhatjLLJ6zxSWATqVooLgysK6ZNox3g/xq24= github.com/Azure/go-autorest/autorest/adal v0.9.23 h1:Yepx8CvFxwNKpH6ja7RZ+sKX+DWYNldbLiALMC3BTz8= github.com/Azure/go-autorest/autorest/adal v0.9.23/go.mod h1:5pcMqFkdPhviJdlEy3kC/v1ZLnQl0MH6XA5YCcMhy4c= +github.com/Azure/go-autorest/autorest/date v0.3.0 h1:7gUk1U5M/CQbp9WoqinNzJar+8KY+LPI6wiWrP/myHw= github.com/Azure/go-autorest/autorest/date v0.3.0/go.mod h1:BI0uouVdmngYNUzGWeSYnokU+TrmwEsOqdt8Y6sso74= +github.com/Azure/go-autorest/autorest/mocks v0.4.1 h1:K0laFcLE6VLTOwNgSxaGbUcLPuGXlNkbVvq4cW4nIHk= github.com/Azure/go-autorest/autorest/mocks v0.4.1/go.mod h1:LTp+uSrOhSkaKrUy935gNZuuIPPVsHlr9DSOxSayd+k= +github.com/Azure/go-autorest/logger v0.2.1 h1:IG7i4p/mDa2Ce4TRyAO8IHnVhAVF3RFU+ZtXWSmf4Tg= github.com/Azure/go-autorest/logger v0.2.1/go.mod h1:T9E3cAhj2VqvPOtCYAvby9aBXkZmbF5NWuPV8+WeEW8= +github.com/Azure/go-autorest/tracing v0.6.0 h1:TYi4+3m5t6K48TGI9AUdb+IzbnSxvnvUMfuitfgcfuo= github.com/Azure/go-autorest/tracing v0.6.0/go.mod h1:+vhtPC754Xsa23ID7GlGsrdKBpUA79WCAKPPZVC2DeU= github.com/BurntSushi/toml v1.3.2 h1:o7IhLm0Msx3BaB+n3Ag7L8EVlByGnpq14C4YWiu/gL8= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802 h1:1BDTz0u9nC3//pOCMdNH+CiXJVYJh5UQNCOBG7jbELc= +github.com/DATA-DOG/go-sqlmock v1.3.3 h1:CWUqKXe0s8A2z6qCgkP4Kru7wC11YoAnoupUKFDnH08= github.com/DATA-DOG/go-sqlmock v1.3.3/go.mod h1:f/Ixk793poVmq4qj/V1dPUg2JEAKC73Q5eFN3EC/SaM= +github.com/DataDog/datadog-go v3.2.0+incompatible h1:qSG2N4FghB1He/r2mFrWKCaL7dXCilEuNEeAn20fdD4= github.com/DataDog/datadog-go v3.2.0+incompatible/go.mod h1:LButxg5PwREeZtORoXG3tL4fMGNddJ+vMq1mwgfaqoQ= github.com/DataDog/zstd v1.5.2 h1:vUG4lAyuPCXO0TLbXvPv7EB7cNK1QV/luu55UHLrrn8= github.com/DataDog/zstd v1.5.2/go.mod h1:g4AWEaM3yOg3HYfnJ3YIawPnVdXJh9QME85blwSAmyw= @@ -178,7 +308,9 @@ github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3Q github.com/Masterminds/semver v1.5.0/go.mod h1:MB6lktGJrhw8PrUyiEoblNEGEQ+RzHPF078ddwwvV3Y= github.com/OpenPeeDeeP/depguard v1.1.0 h1:pjK9nLPS1FwQYGGpPxoMYpe7qACHOhAWQMQzV71i49o= github.com/OpenPeeDeeP/depguard v1.1.0/go.mod h1:JtAMzWkmFEzDPyAd+W0NHl1lvpQKTvT9jnRVsohBKpc= +github.com/Shopify/sarama v1.19.0 h1:9oksLxC6uxVPHPVYUmq6xhr1BOF/hHobWH2UzO67z1s= github.com/Shopify/sarama v1.19.0/go.mod h1:FVkBWblsNy7DGZRfXLU0O9RCGt5g3g3yEuWXgklEdEo= +github.com/Shopify/toxiproxy v2.1.4+incompatible h1:TKdv8HiTLgE5wdJuEML90aBgNWsokNbMijUGhmcoBJc= github.com/Shopify/toxiproxy v2.1.4+incompatible/go.mod h1:OXgGpZ6Cli1/URJOF1DMxUHB2q5Ap20/P/eIdh4G0pI= github.com/StackExchange/wmi v1.2.1 h1:VIkavFPXSjcnS+O8yTq7NI32k0R5Aj+v39y29VYDOSA= github.com/StackExchange/wmi v1.2.1/go.mod h1:rcmrprowKIVzvc+NUiLncP2uuArMWLCbu9SBzvHz7e8= @@ -186,10 +318,12 @@ github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWk github.com/aead/siphash v1.0.1 h1:FwHfE/T45KPKYuuSAKyyvE+oPWcaQ+CUmFW0bPlM+kg= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5 h1:rFw4nCn9iMW+Vajsk51NtYIcwSTkXr+JGrMd36kTDJw= github.com/afex/hystrix-go v0.0.0-20180502004556-fa1af6a1f4f5/go.mod h1:SkGFH1ia65gfNATL8TAiHDNxPzPdmEL5uirI2Uyuz6c= +github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af h1:wVe6/Ea46ZMeNkQjjBW6xcqyQA/j5e0D6GytH95g0gQ= github.com/ajstarks/svgo v0.0.0-20180226025133-644b8db467af/go.mod h1:K08gAheRH3/J6wwsYMMT4xOr94bZjxIelGM0+d/wbFw= github.com/alecthomas/kingpin/v2 v2.3.2 h1:H0aULhgmSzN8xQ3nX1uxtdlTHYoPLu5AhHxWrKI6ocU= github.com/alecthomas/kingpin/v2 v2.3.2/go.mod h1:0gyi0zQnjuFk8xrkNKamJoyUo382HRL7ATRpFZCw6tE= github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc h1:cAKDfWh5VpdgMhJosfJnn5/FoN2SRZ4p7fJNX58YPaU= +github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751 h1:JYp7IbQjafoB+tBA3gMyHYHrpOtNuDiK/uB5uXxq5wM= github.com/alecthomas/template v0.0.0-20190718012654-fb15b899a751/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho= @@ -199,12 +333,18 @@ github.com/alexkohler/prealloc v1.0.0 h1:Hbq0/3fJPQhNkN0dR95AVrr6R7tou91y0uHG5pO github.com/alexkohler/prealloc v1.0.0/go.mod h1:VetnK3dIgFBBKmg0YnD9F9x6Icjd+9cvfHR56wJVlKE= github.com/alingse/asasalint v0.0.11 h1:SFwnQXJ49Kx/1GghOFz1XGqHYKp21Kq1nHad/0WQRnw= github.com/alingse/asasalint v0.0.11/go.mod h1:nCaoMhw7a9kSJObvQyVzNTPBDbNpdocqrSP7t/cW5+I= +github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883 h1:bvNMNQO63//z+xNgfBlViaCIJKLlCJ6/fmUseuG0wVQ= github.com/andreyvit/diff v0.0.0-20170406064948-c7f18ee00883/go.mod h1:rCTlJbsFo29Kk6CurOXKm700vrz8f0KW0JNfpkRJY/8= +github.com/andybalholm/brotli v1.0.4 h1:V7DdXeJtZscaqfNuAdSRuRFzuiKlHSC/Zh3zl9qY3JY= github.com/andybalholm/brotli v1.0.4/go.mod h1:fO7iG3H7G2nSZ7m0zPUDn85XEX2GTukHGRSepvi9Eig= github.com/antihax/optional v1.0.0 h1:xK2lYat7ZLaVVcIuj82J8kIro4V6kDe0AUDFboUCwcg= +github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db h1:nxAtV4VajJDhKysp2kdcJZsq8Ss1xSA0vZTkVHHJd0E= github.com/apache/arrow/go/arrow v0.0.0-20191024131854-af6fa24be0db/go.mod h1:VTxUBvSJ3s3eHAg65PNgrsn5BtqCRPdmyXh6rAfdxN0= +github.com/apache/arrow/go/v12 v12.0.1 h1:JsR2+hzYYjgSUkBSaahpqCetqZMr76djX80fF/DiJbg= github.com/apache/arrow/go/v12 v12.0.1/go.mod h1:weuTY7JvTG/HDPtMQxEUp7pU73vkLWMLpY67QwZ/WWw= +github.com/apache/thrift v0.16.0 h1:qEy6UW60iVOlUy+b9ZR0d5WzUWYGOo4HfopoyBaNmoY= github.com/apache/thrift v0.16.0/go.mod h1:PHK3hniurgQaNMZYaCLEqXKsYK8upmhPbmdP2FXSqgU= +github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e h1:QEF07wC0T1rKkctt1RINW/+RMTVmiwxETico2l3gxJA= github.com/armon/circbuf v0.0.0-20150827004946-bbbad097214e/go.mod h1:3U/XgcO3hCbHZ8TKRvWD2dDTCfh9M9ya+I9JpbB7O8o= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6 h1:G1bPvciwNyF7IUmKXNt9Ak3m6u9DE1rF+RmtIkBpVdA= github.com/armon/go-metrics v0.0.0-20180917152333-f0300d1749da/go.mod h1:Q73ZrmVTwzkszR9V5SSuryQ31EELlFMUz1kKyl939pY= @@ -212,6 +352,7 @@ github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4 github.com/armon/go-metrics v0.3.10 h1:FR+drcQStOe+32sYyJYyZ7FIdgoGGBnwLl+flodp8Uo= github.com/armon/go-metrics v0.3.10/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= github.com/armon/go-radix v0.0.0-20180808171621-7fddfc383310/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= +github.com/armon/go-radix v1.0.0 h1:F4z6KzEeeQIMeLFa97iZU6vupzoecKdU5TX24SNppXI= github.com/armon/go-radix v1.0.0/go.mod h1:ufUuZ+zHj4x4TnLV4JWEpy2hxWSpsRywHrMgIH9cCH8= github.com/ashanbrown/forbidigo v1.3.0 h1:VkYIwb/xxdireGAdJNZoo24O4lmnEWkactplBlWTShc= github.com/ashanbrown/forbidigo v1.3.0/go.mod h1:vVW7PEdqEFqapJe95xHkTfB1+XvZXBFg8t0sG2FIxmI= @@ -255,14 +396,18 @@ github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAm github.com/aws/smithy-go v1.15.0/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= github.com/aws/smithy-go v1.19.0 h1:KWFKQV80DpP3vJrrA9sVAHQ5gc2z8i4EzrLhLlWXcBM= github.com/aws/smithy-go v1.19.0/go.mod h1:NukqUGpCZIILqqiV0NIjeFh24kd/FAa4beRb6nbIUPE= +github.com/benbjohnson/clock v1.1.0 h1:Q92kusRqC1XV2MjkWETPvjJVqKetz1OzxZB7mHJLju8= github.com/benbjohnson/clock v1.1.0/go.mod h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA= +github.com/bgentry/speakeasy v0.1.0 h1:ByYyxL9InA1OWqxJqqp2A5pYHUrCiAL6K3J+LKSsQkY= github.com/bgentry/speakeasy v0.1.0/go.mod h1:+zsyZBPWlz7T6j88CTgSN5bM796AkVf0kBD4zp0CCIs= github.com/bits-and-blooms/bitset v1.5.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= github.com/bkielbasa/cyclop v1.2.0 h1:7Jmnh0yL2DjKfw28p86YTd/B4lRGcNuu12sKE35sM7A= github.com/bkielbasa/cyclop v1.2.0/go.mod h1:qOI0yy6A7dYC4Zgsa72Ppm9kONl0RoIlPbzot9mhmeI= github.com/blizzy78/varnamelen v0.8.0 h1:oqSblyuQvFsW1hbBHh1zfwrKe3kcSj0rnXkKzsQ089M= github.com/blizzy78/varnamelen v0.8.0/go.mod h1:V9TzQZ4fLJ1DSrjVDfl89H7aMnTvKkApdHeyESmyR7k= +github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40 h1:y4B3+GPxKlrigF1ha5FFErxK+sr6sWxQovRMzwMhejo= github.com/bmizerany/pat v0.0.0-20170815010413-6226ea591a40/go.mod h1:8rLXio+WjiTceGBHIoTvn60HIbs7Hm7bcHjyrSqYB9c= +github.com/boltdb/bolt v1.3.1 h1:JQmyP4ZBrce+ZQu0dY660FMfatumYDLun9hBCUVIkF4= github.com/boltdb/bolt v1.3.1/go.mod h1:clJnj/oiGkjum5o1McbSZDSLxVThjynRyGBgiAx27Ps= github.com/bombsimon/wsl/v3 v3.3.0 h1:Mka/+kRLoQJq7g2rggtgQsjuI/K5Efd87WX96EWFxjM= github.com/bombsimon/wsl/v3 v3.3.0/go.mod h1:st10JtZYLE4D5sC7b8xV4zTKZwAQjCH/Hy2Pm1FNZIc= @@ -284,6 +429,7 @@ github.com/bufbuild/connect-go v0.2.0 h1:WuMI/jLiJIhysHWvLWlxRozV67mGjCOUuDSl/lk github.com/bufbuild/connect-go v0.2.0/go.mod h1:4efZ2eXFENwd4p7tuLaL9m0qtTsCOzuBvrohvRGevDM= github.com/butuzov/ireturn v0.1.1 h1:QvrO2QF2+/Cx1WA/vETCIYBKtRjc30vesdoPUNo1EbY= github.com/butuzov/ireturn v0.1.1/go.mod h1:Wh6Zl3IMtTpaIKbmwzqi6olnM9ptYQxxVacMsOEFPoc= +github.com/c-bata/go-prompt v0.2.2 h1:uyKRz6Z6DUyj49QVijyM339UJV9yhbr70gESwbNU3e0= github.com/c-bata/go-prompt v0.2.2/go.mod h1:VzqtzE2ksDBcdln8G7mk2RX9QyGjH+OVqOCSiVIqS34= github.com/casbin/casbin/v2 v2.37.0 h1:/poEwPSovi4bTOcP752/CsTQiRz2xycyVKFG7GUhbDw= github.com/casbin/casbin/v2 v2.37.0/go.mod h1:vByNa/Fchek0KZUgG5wEsl7iFsiviAYKRtgrQfcJqHg= @@ -297,14 +443,19 @@ github.com/chavacava/garif v0.0.0-20220630083739-93517212f375 h1:E7LT642ysztPWE0 github.com/chavacava/garif v0.0.0-20220630083739-93517212f375/go.mod h1:4m1Rv7xfuwWPNKXlThldNuJvutYM6J95wNuuVmn55To= github.com/chzyer/logex v1.1.10 h1:Swpa1K6QvQznwJRcfTfQJmTE72DqScAa40E+fbHEXEE= github.com/chzyer/logex v1.2.0/go.mod h1:9+9sk7u7pGNWYMkh0hdiL++6OeibzJccyQU4p4MedaY= +github.com/chzyer/logex v1.2.1 h1:XHDu3E6q+gdHgsdTPH6ImJMIp436vR6MPtH8gP05QzM= github.com/chzyer/logex v1.2.1/go.mod h1:JLbx6lG2kDbNRFnfkgvh4eRJRPX1QCoOIWomwysCBrQ= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e h1:fY5BOSpyZCqRo5OhCuC+XN+r/bBCmeuuJtjz+bCNIf8= github.com/chzyer/readline v1.5.0/go.mod h1:x22KAscuvRqlLoK9CsoYsmxoXZMMFVyOl86cAH8qUic= +github.com/chzyer/readline v1.5.1 h1:upd/6fQk4src78LMRzh5vItIt361/o4uq553V8B5sGI= github.com/chzyer/readline v1.5.1/go.mod h1:Eh+b79XXUwfKfcPLepksvw2tcLE/Ct21YObkaSkeBlk= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1 h1:q763qf9huN11kDQavWsoZXJNW3xEE4JJyHa5Q25/sd8= github.com/chzyer/test v0.0.0-20210722231415-061457976a23/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/chzyer/test v1.0.0 h1:p3BQDXSxOhOG0P9z6/hGnII4LGiEPOYBhs8asl/fC04= github.com/chzyer/test v1.0.0/go.mod h1:2JlltgoNkt4TW/z9V/IzDdFaMTM2JPIi26O1pF38GC8= +github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible h1:C29Ae4G5GtYyYMm1aztcyj/J5ckgJm2zwdDajFbx1NY= github.com/circonus-labs/circonus-gometrics v2.3.1+incompatible/go.mod h1:nmEj6Dob7S7YxXgwXpfOuvO54S+tGdZdw9fuRZt25Ag= +github.com/circonus-labs/circonusllhist v0.1.3 h1:TJH+oke8D16535+jHExHj4nQvzlZrj7ug5D7I/orNUA= github.com/circonus-labs/circonusllhist v0.1.3/go.mod h1:kMXHVDlOchFAehlya5ePtbp5jckzBHf4XRpQvBOLI+I= github.com/clbanning/mxj v1.8.4 h1:HuhwZtbyvyOw+3Z1AowPkU87JkJUSv751ELWaiTpj8I= github.com/clbanning/mxj v1.8.4/go.mod h1:BVjHeAH+rl9rs6f+QIpeRl0tfu10SXn1pUSa5PVGJng= @@ -333,9 +484,11 @@ github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF github.com/creack/pty v1.1.9 h1:uDmaGzcdjhF4i/plgjmEsriH11Y0o7RKapEf/LDaM3w= github.com/curioswitch/go-reassign v0.1.2 h1:ekM07+z+VFT560Exz4mTv0/s1yU9gem6CJc/tlYpkmI= github.com/curioswitch/go-reassign v0.1.2/go.mod h1:bFJIHgtTM3hRm2sKXSPkbwNjSFyGURQXyn4IXD2qwfQ= +github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c h1:/ovYnF02fwL0kvspmy9AuyKg1JhdTRUgPw4nUxd9oZM= github.com/cyberdelia/templates v0.0.0-20141128023046-ca7fffd4298c/go.mod h1:GyV+0YP4qX0UQ7r2MoYZ+AvYDp12OF5yg4q8rGnyNh4= github.com/daixiang0/gci v0.6.3 h1:wUAqXChk8HbwXn8AfxD9DYSCp9Bpz1L3e6Q4Roe+q9E= github.com/daixiang0/gci v0.6.3/go.mod h1:EpVfrztufwVgQRXjnX4zuNinEpLj5OmMjtu/+MB0V0c= +github.com/dave/jennifer v1.2.0 h1:S15ZkFMRoJ36mGAQgWL1tnr0NQJh9rZ8qatseX/VbBc= github.com/dave/jennifer v1.2.0/go.mod h1:fIb+770HOpJ2fmN9EPPKOqm1vMGhB+TwXKMZhrIygKg= github.com/dchest/blake512 v1.0.0 h1:oDFEQFIqFSeuA34xLtXZ/rWxCXdSjirjzPhey5EUvmA= github.com/dchest/blake512 v1.0.0/go.mod h1:FV1x7xPPLWukZlpDpWQ88rF/SFwZ5qbskrzhLMB92JI= @@ -346,7 +499,9 @@ github.com/deepmap/oapi-codegen v1.8.2 h1:SegyeYGcdi0jLLrpbCMoJxnUUn8GBXHsvr4rbz github.com/deepmap/oapi-codegen v1.8.2/go.mod h1:YLgSKSDv/bZQB7N4ws6luhozi3cEdRktEqrX88CvjIw= github.com/denis-tingaikin/go-header v0.4.3 h1:tEaZKAlqql6SKCY++utLmkPLd6K8IBM20Ha7UVm+mtU= github.com/denis-tingaikin/go-header v0.4.3/go.mod h1:0wOCWuN71D5qIgE2nz9KrKmuYBAC2Mra5RassOIQ2/c= +github.com/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= +github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8 h1:akOQj8IVgoeFfBTzGOEQakCYshWD6RNo1M5pivFXt70= github.com/dgryski/go-bitstream v0.0.0-20180413035011-3522498ce2c8/go.mod h1:VMaSuZ+SZcx/wljOQKvp5srsbCiKDEb6K2wC4+PiBmQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954 h1:RMLoZVzv4GliuWafOuPuQDKSm1SJph7uCRnnS61JAn4= github.com/distribution/reference v0.5.0 h1:/FUIFXtfc/x2gpa5/VGfiGLuOIdYa1t65IKK2OFGvA0= @@ -361,10 +516,15 @@ github.com/dop251/goja v0.0.0-20211022113120-dc8c55024d06/go.mod h1:R9ET47fwRVRP github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127 h1:qwcF+vdFrvPSEUDSX5RVoRccG8a5DhOdWdQ4zN62zzo= github.com/dop251/goja v0.0.0-20230806174421-c933cf95e127/go.mod h1:QMWlm50DNe14hD7t24KEqZuUdC9sOTy8W6XbCU1mlw4= github.com/dop251/goja_nodejs v0.0.0-20210225215109-d91c329300e7/go.mod h1:hn7BA7c8pLvoGndExHudxTDKZ84Pyvv+90pbBjbTz0Y= +github.com/dop251/goja_nodejs v0.0.0-20211022123610-8dd9abb0616d h1:W1n4DvpzZGOISgp7wWNtraLcHtnmnTwBlJidqtMIuwQ= github.com/dop251/goja_nodejs v0.0.0-20211022123610-8dd9abb0616d/go.mod h1:DngW8aVqWbuLRMHItjPUyqdj+HWPvnQe8V8y1nDpIbM= +github.com/eapache/go-resiliency v1.1.0 h1:1NtRmCAqadE2FN4ZcN6g90TP3uk8cg9rn9eNK2197aU= github.com/eapache/go-resiliency v1.1.0/go.mod h1:kFI+JgMyC7bLPUVY133qvEBtVayf5mFgVsvEsIPBvNs= +github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21 h1:YEetp8/yCZMuEPMUDHG0CW/brkkEp8mzqk2+ODEitlw= github.com/eapache/go-xerial-snappy v0.0.0-20180814174437-776d5712da21/go.mod h1:+020luEh2TKB4/GOp8oxxtq0Daoen/Cii55CzbTV6DU= +github.com/eapache/queue v1.1.0 h1:YOEu7KNc61ntiQlcEeUIoDTJ2o8mQznoNvUhiigpIqc= github.com/eapache/queue v1.1.0/go.mod h1:6eCeP0CKFpHLu8blIFXhExK/dRa7WDZfr6jVFPTqq+I= +github.com/eclipse/paho.mqtt.golang v1.2.0 h1:1F8mhG9+aO5/xpdtFkW4SxOJB67ukuDC3t2y2qayIX0= github.com/eclipse/paho.mqtt.golang v1.2.0/go.mod h1:H9keYFcgq3Qr5OUJm/JZI/i6U7joQ8SYLhZwfeOo6Ts= github.com/edsrzf/mmap-go v1.0.0/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= github.com/envoyproxy/go-control-plane v0.9.9-0.20210217033140-668b12f5399d/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= @@ -394,7 +554,9 @@ github.com/firefart/nonamedreturns v1.0.4 h1:abzI1p7mAEPYuR4A+VLKn4eNDOycjYo2phm github.com/firefart/nonamedreturns v1.0.4/go.mod h1:TDhe/tjI1BXo48CmYbUduTV7BdIga8MAO/xbKdcVsGI= github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e h1:bBLctRc7kr01YGvaDfgLbTwjFNW5jdp5y5rj8XXBHfY= github.com/fjl/gencodec v0.0.0-20230517082657-f9840df7b83e/go.mod h1:AzA8Lj6YtixmJWL+wkKoBGsLWy9gFrAzi4g+5bCKwpY= +github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90 h1:WXb3TSNmHp2vHoCroCIB1foO/yQ36swABL8aOVeDpgg= github.com/fogleman/gg v1.2.1-0.20190220221249-0403632d5b90/go.mod h1:R/bRT+9gY/C5z7JzPU0zXsXHKM4/ayA+zqcVNZzPa1k= +github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2 h1:cZqz+yOJ/R64LcKjNQOdARott/jP7BnUQ9Ah7KaZCvw= github.com/franela/goblin v0.0.0-20210519012713-85d372ac71e2/go.mod h1:VzmDKDJVZI3aJmnRI9VjAn9nJ8qPPsN1fqzr9dqInIo= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8 h1:a9ENSRDFBUPkJ5lCgVZh26+ZbGyoVJG7yb5SSzF5H54= github.com/franela/goreq v0.0.0-20171204163338-bcd34c9993f8/go.mod h1:ZhphrRTfi2rbfLwlschooIH4+wKKDR4Pdxhh+TRoA20= @@ -404,9 +566,12 @@ github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61 h1:IZqZOB2fydHte3kUgx github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61/go.mod h1:Q0X6pkwTILDlzrGEckF6HKjXe48EgsY/l7K7vhY4MW8= github.com/gballet/go-libpcsclite v0.0.0-20190607065134-2772fd86a8ff/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= github.com/getkin/kin-openapi v0.53.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= +github.com/getkin/kin-openapi v0.61.0 h1:6awGqF5nG5zkVpMsAih1QH4VgzS8phTxECUWIFo7zko= github.com/getkin/kin-openapi v0.61.0/go.mod h1:7Yn5whZr5kJi6t+kShccXS8ae1APpYTW6yheSwk8Yi4= github.com/ghodss/yaml v1.0.0 h1:wQHKEahhL6wmXdzwWG11gIVCkOv05bNOh+Rxn0yngAk= +github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd h1:r04MMPyLHj/QwZuMJ5+7tJcBr1AQjpiAK/rZWRrQT7o= github.com/glycerine/go-unsnap-stream v0.0.0-20180323001048-9f0cb55181dd/go.mod h1:/20jfyN9Y5QPEAprSgKAUr+glWDY39ZiUEAYOEv5dsE= +github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31 h1:gclg6gY70GLy3PbkQ1AERPfmLMMagS60DKF78eWwLn8= github.com/glycerine/goconvey v0.0.0-20190410193231-58a59202ab31/go.mod h1:Ogl1Tioa0aV7gstGFO7KhffUsb9M4ydbEbbxpcEDc24= github.com/go-chi/chi/v5 v5.0.0/go.mod h1:BBug9lr0cqtdAhsu6R4AAdvufI0/XBzAQSsUqJpoZOs= github.com/go-chi/chi/v5 v5.0.7 h1:rDTPXLDHGATaeHvVlLcR4Qe0zftYethFucbjVQ1PxU8= @@ -427,10 +592,13 @@ github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ4 github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= github.com/go-ole/go-ole v1.2.5/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-openapi/jsonpointer v0.19.5 h1:gZr+CIYByUqjcgeLXnQu2gHYQC9o73G2XUeOFYEICuY= github.com/go-openapi/jsonpointer v0.19.5/go.mod h1:Pl9vOtqEWErmShwVjC8pYs9cog34VGT37dQOVbmoatg= +github.com/go-openapi/swag v0.19.5 h1:lTz6Ys4CmqqCQmZPBlbQENR1/GucA2bzYTE12Pw4tFY= github.com/go-openapi/swag v0.19.5/go.mod h1:POnQmlKehdgb5mhVOsnJFsivZCEZ/vjK9gh66Z9tfKk= github.com/go-sourcemap/sourcemap v2.1.3+incompatible h1:W1iEw64niKVGogNgBN3ePyLFfuisuzeidWPMPWmECqU= github.com/go-sourcemap/sourcemap v2.1.3+incompatible/go.mod h1:F8jJfvm2KbVjc5NqelyYJmf/v5J0dwNLS2mL4sNA1Jg= +github.com/go-sql-driver/mysql v1.4.1 h1:g24URVg0OFbNUTx9qqY1IRZ9D9z3iPyi5zKhQZpNwpA= github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0 h1:p104kn46Q8WdvHunIJ9dAyjPVtrBPhSr3KT2yUst43I= github.com/go-toolsmith/astcast v1.0.0 h1:JojxlmI6STnFVG9yOImLeGREv8W2ocNUM+iOhR6jE7g= @@ -455,6 +623,7 @@ github.com/gobwas/glob v0.2.3 h1:A4xDbljILXROh+kObIiy5kIaPYD8e96x1tgBhUI5J+Y= github.com/gobwas/glob v0.2.3/go.mod h1:d3Ez4x06l9bZtSvzIay5+Yzi0fmZzPgnTbPcKjJAkT8= github.com/goccy/go-json v0.10.2 h1:CrxCmQqYDkv1z7lO7Wbh2HN93uovUHgrECaO5ZrCXAU= github.com/goccy/go-json v0.10.2/go.mod h1:6MelG93GURQebXPDq3khkgXZkazVtN9CRI+MGFi0w8I= +github.com/godbus/dbus/v5 v5.0.4 h1:9349emZab16e7zQvpmsbtjc18ykshndd8y2PG3sgJbA= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofrs/flock v0.8.1 h1:+gYjHKf32LDeiEEFhQaotPbLuUXjY5ZqxKgXy7n59aw= github.com/gofrs/flock v0.8.1/go.mod h1:F1TvTiK9OcQqauNUHlbJvyl9Qa1QvF/gOUDKA14jxHU= @@ -466,7 +635,9 @@ github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6x github.com/gogo/protobuf v1.3.1/go.mod h1:SlYgWuQ5SjCEi6WLHjHCa1yvBfUnHcTbrrZtXPKa29o= github.com/gogo/protobuf v1.3.2 h1:Ov1cvc58UF3b5XjBnZv7+opcTcQFZebYjWzi34vdm4Q= github.com/golang-jwt/jwt/v4 v4.0.0/go.mod h1:/xlHOz8bRuivTWchD4jCa+NbatV+wEUSzwAxVc6locg= +github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0 h1:DACJavvAHhabrF08vX0COfcOBJRhZ8lUbR+ZWIs0Y5g= github.com/golang/freetype v0.0.0-20170609003504-e2365dfdc4a0/go.mod h1:E/TSTwGwJL78qG/PmXZO1EjYhfJinVAhrmmHX6Z8B9k= +github.com/golang/geo v0.0.0-20190916061304-5b978397cfec h1:lJwO/92dFXWeXOZdoGXgptLmNLwynMSHUmU6besqtiw= github.com/golang/geo v0.0.0-20190916061304-5b978397cfec/go.mod h1:QZ0nwyI2jOfgRAoBvP+ab5aRr7c9x7lhGEJrKvBwjWI= github.com/golang/glog v1.2.0 h1:uCdmnmatrKCgMBlM4rMuJZWOkPDqdbZPnrMXDY4gI68= github.com/golang/glog v1.2.0/go.mod h1:6AhwSGph0fcJtXVM/PEHPqZlFeoLxhs7/t5UDAwmO+w= @@ -496,11 +667,13 @@ github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6/go.mod h1:0AKcRCk github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4 h1:zwtduBRr5SSWhqsYNgcuWO2kFlpdOZbP0+yRjmvPGys= github.com/golangci/unconvert v0.0.0-20180507085042-28b1c447d1f4/go.mod h1:Izgrg8RkN3rCIMLGE9CyYmU9pY2Jer6DgANEnZ/L/cQ= github.com/google/flatbuffers v1.11.0/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= +github.com/google/flatbuffers v2.0.8+incompatible h1:ivUb1cGomAB101ZM1T0nOiWz9pSrTMoa9+EiY7igmkM= github.com/google/flatbuffers v2.0.8+incompatible/go.mod h1:1AeVuKshWv4vARoZatz6mlQ0JxURH0Kv5+zNeJKJCa8= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.6/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.8/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/go-pkcs11 v0.2.1-0.20230907215043-c6f79328ddf9 h1:OF1IPgv+F4NmqmJ98KTjdN97Vs1JxDPB3vbmYzV2dpk= github.com/google/go-pkcs11 v0.2.1-0.20230907215043-c6f79328ddf9/go.mod h1:6eQoGcuNJpa7jnd5pMGdkSaQpNDYvPlXWMcjXXThLlY= github.com/google/go-querystring v1.1.0 h1:AnCroh3fv4ZBgVIf1Iwtovgjaw/GiKJo8M8yD/fhyJ8= github.com/google/go-querystring v1.1.0/go.mod h1:Kcdr2DB4koayq7X8pmAG4sNG59So17icRSOU623lUBU= @@ -509,26 +682,33 @@ github.com/google/gofuzz v1.2.0 h1:xRy4A+RhZaiKjJ1bPfwQ8sedCA+YS2YcCHW6ec7JMi0= github.com/google/gofuzz v1.2.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= github.com/google/martian v2.1.0+incompatible h1:/CP5g8u/VJHijgedC/Legn3BAbAaWPgecwXBIDzw5no= github.com/google/martian/v3 v3.1.0 h1:wCKgOCHuUEVfsaQLpPSJb7VdYCdTVZQAuOdYm1yc/60= +github.com/google/martian/v3 v3.3.2 h1:IqNFLAmvJOgVlpdEBiQbDc2EwKW77amAycfTuWKdfvw= github.com/google/martian/v3 v3.3.2/go.mod h1:oBOf6HBosgwRXnUGWUB05QECsc6uvmMiJ3+6W4l/CUk= github.com/google/pprof v0.0.0-20230207041349-798e818bf904/go.mod h1:uglQLonpP8qtYCYyzA+8c/9qtqgA3qsXGYqCPKARAFg= github.com/google/pprof v0.0.0-20230323073829-e72429f035bd h1:r8yyd+DJDmsUhGrRBxH5Pj7KeFK5l+Y3FsgT8keqKtk= github.com/google/pprof v0.0.0-20230323073829-e72429f035bd/go.mod h1:79YE0hCXdHag9sBkw2o+N/YnZtTkXi0UT9Nnixa5eYk= github.com/google/renameio v0.1.0 h1:GOZbcHa3HfsPKPlmyPyN2KEohoMXOhdMbHrvbpl2QaA= +github.com/google/s2a-go v0.1.7 h1:60BLSyTrOV4/haCDW4zb1guZItoSq8foHCXrAnjBo/o= github.com/google/s2a-go v0.1.7/go.mod h1:50CgR4k1jNlWBu4UfS4AcfhVe1r6pdZPygJ3R8F0Qdw= github.com/google/subcommands v1.2.0 h1:vWQspBTo2nEqTUFita5/KeEWlUL8kQObDFbub/EN9oE= github.com/google/uuid v1.3.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.4.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= github.com/google/uuid v1.5.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/googleapis/enterprise-certificate-proxy v0.3.2 h1:Vie5ybvEvT75RniqhfFxPRy3Bf7vr3h0cechB90XaQs= github.com/googleapis/enterprise-certificate-proxy v0.3.2/go.mod h1:VLSiSSBs/ksPL8kq3OBOQ6WRI2QnaFynd1DCjZ62+V0= github.com/googleapis/gax-go/v2 v2.4.0 h1:dS9eYAjhrE2RjmzYw2XAPvcXfmcQLtFEQWn0CR82awk= github.com/googleapis/gax-go/v2 v2.4.0/go.mod h1:XOTVJ59hdnfJLIP/dh8n5CGryZR2LxK9wbMD5+iXC6c= +github.com/googleapis/gax-go/v2 v2.12.0 h1:A+gCJKdRfqXkr+BIRGtZLibNXf0m1f9E4HG56etFpas= github.com/googleapis/gax-go/v2 v2.12.0/go.mod h1:y+aIqrI5eb1YGMVJfuV3185Ts/D7qKpsEkdD5+I6QGU= github.com/googleapis/google-cloud-go-testing v0.0.0-20200911160855-bcd43fbb19e8 h1:tlyzajkF3030q6M8SvmJSemC9DTHL/xaMa18b65+JM4= +github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1 h1:EGx4pi6eqNxGaHF6qqu48+N2wcFQ5qg5FXgOdqsJ5d8= github.com/gopherjs/gopherjs v0.0.0-20181017120253-0766667cb4d1/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= github.com/gordonklaus/ineffassign v0.0.0-20210914165742-4cc7213b9bc8 h1:PVRE9d4AQKmbelZ7emNig1+NT27DUmKZn5qXxfio54U= github.com/gordonklaus/ineffassign v0.0.0-20210914165742-4cc7213b9bc8/go.mod h1:Qcp2HIAYhR7mNUVSIxZww3Guk4it82ghYcEXIAk+QT0= +github.com/gorilla/context v1.1.1 h1:AWwleXJkX/nhcU9bZSnZoi3h/qGYqQAGhq6zZe/aQW8= github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v1.6.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/mux v1.8.0 h1:i40aqfkR1h2SlN9hojwV5ZA91wcXFOvkdNIeFDP5koI= github.com/gorilla/mux v1.8.0/go.mod h1:DVbg23sWSpFRCP0SfiEN6jmj59UnW/n46BH5rLB71So= github.com/gorilla/websocket v1.4.2/go.mod h1:YR8l580nyteQvAITg2hZ9XVh4b55+EU/adAjf1fMHhE= github.com/gostaticanalysis/analysisutil v0.7.1 h1:ZMCjoue3DtDWQ5WyU16YbjbQEQ3VuzwxALrpYd+HeKk= @@ -543,12 +723,15 @@ github.com/graph-gophers/graphql-go v1.3.0 h1:Eb9x/q6MFpCLz7jBCiP/WTxjSDrYLR1QY4 github.com/graph-gophers/graphql-go v1.3.0/go.mod h1:9CQHMSxwO4MprSdzoIEobiHpoLtHm77vfxsvsIN5Vuc= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0 h1:+9834+KizmvFV7pXQGSXQTsaWhq2GjuNUt0aUU0YBYw= github.com/grpc-ecosystem/go-grpc-middleware v1.3.0/go.mod h1:z0ButlSOZa5vEBq9m2m2hlwIgKw+rp3sdCBRoJY+30Y= +github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0 h1:Ovs26xHkKqVztRpIrF/92BcuyuQ/YW4NSIpoGtfXNho= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= github.com/grpc-ecosystem/grpc-gateway v1.16.0 h1:gmcG1KaJ57LophUzW0Hy8NmPhnMZb4M0+kPpLofRdBo= +github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3 h1:lLT7ZLSzGLI08vc9cpd+tYmNWjdKDqyr/2L+f6U12Fk= github.com/grpc-ecosystem/grpc-gateway/v2 v2.11.3/go.mod h1:o//XUCC/F+yRGJoPO/VU0GSB0f8Nhgmxx0VIRUvaC0w= github.com/hashicorp/consul/api v1.10.1/go.mod h1:XjsvQN+RJGWI2TWy1/kqaE16HrR2J/FWgkYjdZQsX9M= github.com/hashicorp/consul/api v1.12.0 h1:k3y1FYv6nuKyNTqj6w9gXOx5r5CfLj/k/euUeBXj1OY= github.com/hashicorp/consul/api v1.12.0/go.mod h1:6pVBMo0ebnYdt2S3H87XhekM/HHrUoTD2XXb/VrZVy0= +github.com/hashicorp/consul/sdk v0.8.0 h1:OJtKBtEjboEZvG6AOUdh4Z1Zbyu0WcxQ0qatRrZHTVU= github.com/hashicorp/consul/sdk v0.8.0/go.mod h1:GBvyrGALthsZObzUGsfgHZQDXjg4lOjagTIwIR1vPms= github.com/hashicorp/go-bexpr v0.1.10/go.mod h1:oxlubA2vC/gFVfX1A6JGp7ls7uCDlfJn732ehYYg+g0= github.com/hashicorp/go-cleanhttp v0.5.0/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= @@ -563,6 +746,7 @@ github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39E github.com/hashicorp/go-immutable-radix v1.0.0/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= github.com/hashicorp/go-immutable-radix v1.3.1 h1:DKHmCUm2hRBK510BaiZlwvpD40f8bJFeZnpfm2KLowc= github.com/hashicorp/go-immutable-radix v1.3.1/go.mod h1:0y9vanUI8NX6FsYoO3zeMjhV/C5i9g4Q3DwcSNZ4P60= +github.com/hashicorp/go-msgpack v0.5.3 h1:zKjpN5BK/P5lMYrLmBHdBULWbJ0XpYR+7NGzqkZzoD4= github.com/hashicorp/go-msgpack v0.5.3/go.mod h1:ahLV/dePpqEmjfWmKiqvPkv/twdG7iPBM1vqhUKIvfM= github.com/hashicorp/go-multierror v1.0.0/go.mod h1:dHtQlpGsu+cZNNAkkCN/P3hoUDHhCYQXV3UM06sGGrk= github.com/hashicorp/go-multierror v1.1.0/go.mod h1:spPvp8C1qA32ftKqdAHm4hHTbPw+vmowP0z+KUhOZdA= @@ -571,18 +755,24 @@ github.com/hashicorp/go-retryablehttp v0.7.4 h1:ZQgVdpTdAL7WpMIwLzCfbalOcSUdkDZn github.com/hashicorp/go-retryablehttp v0.7.4/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= github.com/hashicorp/go-rootcerts v1.0.2 h1:jzhAVGtqPKbwpyCPELlgNWhE1znq+qwJtW5Oi2viEzc= github.com/hashicorp/go-rootcerts v1.0.2/go.mod h1:pqUvnprVnM5bf7AOirdbb01K4ccR319Vf4pU3K5EGc8= +github.com/hashicorp/go-sockaddr v1.0.0 h1:GeH6tui99pF4NJgfnhp+L6+FfobzVW3Ah46sLo0ICXs= github.com/hashicorp/go-sockaddr v1.0.0/go.mod h1:7Xibr9yA9JjQq1JpNB2Vw7kxv8xerXegt+ozgdvDeDU= +github.com/hashicorp/go-syslog v1.0.0 h1:KaodqZuhUoZereWVIYmpUgZysurB1kBLX2j0MwMrUAE= github.com/hashicorp/go-syslog v1.0.0/go.mod h1:qPfqrKkXGihmCqbJM2mZgkZGvKG1dFdvsLplgctolz4= github.com/hashicorp/go-uuid v1.0.0/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= +github.com/hashicorp/go-uuid v1.0.1 h1:fv1ep09latC32wFoVwnqcnKJGnMSdBanPczbHAYm1BE= github.com/hashicorp/go-uuid v1.0.1/go.mod h1:6SBZvOh/SIDV7/2o3Jml5SYk/TvGqwFJ/bN7x4byOro= github.com/hashicorp/go-version v1.6.0 h1:feTTfFNnjP967rlCxM/I9g701jU+RN74YKx2mOkIeek= github.com/hashicorp/go-version v1.6.0/go.mod h1:fltr4n8CU8Ke44wwGCBoEymUuxUHl09ZGVZPK5anwXA= github.com/hashicorp/golang-lru v0.5.4/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= github.com/hashicorp/golang-lru v0.5.5-0.20210104140557-80c98217689d/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI65Y= github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= github.com/hashicorp/mdns v1.0.1/go.mod h1:4gW7WsVCke5TE7EPeYliwHlRUyBtfCwuFwuMg2DmyNY= +github.com/hashicorp/mdns v1.0.4 h1:sY0CMhFmjIPDMlTB+HfymFHCaYLhgifZ0QhjaYKD/UQ= github.com/hashicorp/mdns v1.0.4/go.mod h1:mtBihi+LeNXGtG8L9dX59gAEa12BDtBQSp4v/YAJqrc= github.com/hashicorp/memberlist v0.2.2/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= +github.com/hashicorp/memberlist v0.3.0 h1:8+567mCcFDnS5ADl7lrpxPMWiFCElyUEeW0gtj34fMA= github.com/hashicorp/memberlist v0.3.0/go.mod h1:MS2lj3INKhZjWNqd3N0m3J+Jxf3DAOnAH9VT3Sh9MUE= github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= @@ -593,11 +783,14 @@ github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSo github.com/hpcloud/tail v1.0.0 h1:nfCOvKYfkgYP8hkirhJocXT2+zOD8yUNjXaWfTlyFKI= github.com/hudl/fargo v1.4.0 h1:ZDDILMbB37UlAVLlWcJ2Iz1XuahZZTDZfdCKeclfq2s= github.com/hudl/fargo v1.4.0/go.mod h1:9Ai6uvFy5fQNq6VPKtg+Ceq1+eTY4nKUlR2JElEOcDo= +github.com/iancoleman/strcase v0.3.0 h1:nTXanmYxhfFAMjZL34Ov6gkzEsSJZ5DbhxWjvSASxEI= github.com/iancoleman/strcase v0.3.0/go.mod h1:iwCmte+B7n89clKwxIoIXy/HfoL7AsD47ZCWhYzw7ho= github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639 h1:mV02weKRL81bEnm8A0HT1/CAelMQDBuQIfLw8n+d6xI= github.com/ianlancetaylor/demangle v0.0.0-20220319035150-800ac71e25c2/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= +github.com/ianlancetaylor/demangle v0.0.0-20220517205856-0058ec4f073c h1:rwmN+hgiyp8QyBqzdEX43lTjKAxaqCrYHaU5op5P9J8= github.com/ianlancetaylor/demangle v0.0.0-20220517205856-0058ec4f073c/go.mod h1:aYm2/VgdVmcIU8iMfdMvDMsRAQjcfZSKFby6HOFvi/w= github.com/iden3/go-iden3-crypto v0.0.12/go.mod h1:swXIv0HFbJKobbQBtsB50G7IHr6PbTowutSew/iBEoo= +github.com/influxdata/flux v0.65.1 h1:77BcVUCzvN5HMm8+j9PRBQ4iZcu98Dl4Y9rf+J5vhnc= github.com/influxdata/flux v0.65.1/go.mod h1:J754/zds0vvpfwuq7Gc2wRdVwEodfpCFM7mYlOw2LqY= github.com/influxdata/influxdb v1.8.3 h1:WEypI1BQFTT4teLM+1qkEcvUi0dAvopAI/ir0vAiBg8= github.com/influxdata/influxdb v1.8.3/go.mod h1:JugdFhsvvI8gadxOI6noqNeeBHvWNTbfYGtiAn+2jhI= @@ -605,14 +798,19 @@ github.com/influxdata/influxdb-client-go/v2 v2.4.0 h1:HGBfZYStlx3Kqvsv1h2pJixbCl github.com/influxdata/influxdb-client-go/v2 v2.4.0/go.mod h1:vLNHdxTJkIf2mSLvGrpj8TCcISApPoXkaxP8g9uRlW8= github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab h1:HqW4xhhynfjrtEiiSGcQUd6vrK23iMam1FO8rI7mwig= github.com/influxdata/influxdb1-client v0.0.0-20200827194710-b269163b24ab/go.mod h1:qj24IKcXYK6Iy9ceXlo3Tc+vtHo9lIhSX5JddghvEPo= +github.com/influxdata/influxql v1.1.1-0.20200828144457-65d3ef77d385 h1:ED4e5Cc3z5vSN2Tz2GkOHN7vs4Sxe2yds6CXvDnvZFE= github.com/influxdata/influxql v1.1.1-0.20200828144457-65d3ef77d385/go.mod h1:gHp9y86a/pxhjJ+zMjNXiQAA197Xk9wLxaz+fGG+kWk= github.com/influxdata/line-protocol v0.0.0-20180522152040-32c6aa80de5e/go.mod h1:4kt73NQhadE3daL3WhR5EJ/J2ocX0PZzwxQ0gXJ7oFE= github.com/influxdata/line-protocol v0.0.0-20200327222509-2487e7298839/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097 h1:vilfsDSy7TDxedi9gyBkMvAirat/oRcL0lFdJBf6tdM= github.com/influxdata/line-protocol v0.0.0-20210311194329-9aa0e372d097/go.mod h1:xaLFMmpvUxqXtVkUJfg9QmT88cDaCJ3ZKgdZ78oO8Qo= +github.com/influxdata/promql/v2 v2.12.0 h1:kXn3p0D7zPw16rOtfDR+wo6aaiH8tSMfhPwONTxrlEc= github.com/influxdata/promql/v2 v2.12.0/go.mod h1:fxOPu+DY0bqCTCECchSRtWfc+0X19ybifQhZoQNF5D8= +github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6 h1:UzJnB7VRL4PSkUJHwsyzseGOmrO/r4yA+AuxGJxiZmA= github.com/influxdata/roaring v0.4.13-0.20180809181101-fc520f41fab6/go.mod h1:bSgUQ7q5ZLSO+bKBGqJiCBGAl+9DxyW63zLTujjUlOE= +github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9 h1:MHTrDWmQpHq/hkq+7cw9oYAt2PqUw52TZazRA0N7PGE= github.com/influxdata/tdigest v0.0.0-20181121200506-bf2b5ad3c0a9/go.mod h1:Js0mqiSBE6Ffsg94weZZ2c+v/ciT8QRHFOap7EKDrR0= +github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368 h1:+TUUmaFa4YD1Q+7bH9o5NCHQGPMqZCYJiNW6lIIS9z4= github.com/influxdata/usage-client v0.0.0-20160829180054-6d3895376368/go.mod h1:Wbbw6tYNvwa5dlB6304Sd+82Z3f7PmVZHVKU637d4po= github.com/informalsystems/tm-load-test v1.0.0 h1:e1IeUw8701HWCMuOM1vLM/XcpH2Lrb88GNWdFAPDmmA= github.com/informalsystems/tm-load-test v1.0.0/go.mod h1:WVaSKaQdfZK3v0C74EMzn7//+3aeCZF8wkIKBz2/M74= @@ -633,6 +831,7 @@ github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af h1:KA9B github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af/go.mod h1:HEWGJkRDzjJY2sqdDwxccsGicWEf9BQOZsq2tV+xzM0= github.com/jmespath/go-jmespath v0.4.0 h1:BEgLn5cpjn8UN1mAw4NjwDrS35OdebyEtFe+9YPoQUg= github.com/jmespath/go-jmespath v0.4.0/go.mod h1:T8mJZnbsbmF+m6zOOFylbeCJqk5+pHWvzYPziyZiYoo= +github.com/jmespath/go-jmespath/internal/testify v1.5.1 h1:shLQSRRSCCPj3f2gpwzGwWFoC7ycTf1rcQZHOlsJ6N8= github.com/jmespath/go-jmespath/internal/testify v1.5.1/go.mod h1:L3OGu8Wl2/fWfCI6z80xFu9LTZmf1ZRjMHUOPmWr69U= github.com/jpillora/backoff v1.0.0 h1:uvFg412JmmHBHw7iwprIxkPMI+sGQ4kzOWsMeHnm2EA= github.com/jpillora/backoff v1.0.0/go.mod h1:J/6gKK9jxlEcS3zixgDgUAsiuZ7yrSoa/FX5e0EB2j4= @@ -643,13 +842,17 @@ github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/ github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= +github.com/jsternberg/zap-logfmt v1.0.0 h1:0Dz2s/eturmdUS34GM82JwNEdQ9hPoJgqptcEKcbpzY= github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= github.com/julz/importas v0.1.0 h1:F78HnrsjY3cR7j0etXy5+TU1Zuy7Xt08X/1aJnH5xXY= github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5 h1:PJr+ZMXIecYc1Ey2zucXdR73SMBtgjPgwa31099IMv0= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef h1:2jNeR4YUziVtswNP9sEFAI913cVrzH85T+8Q6LpYbT0= github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= github.com/karalabe/usb v0.0.2 h1:M6QQBNxF+CQ8OFvxrT90BA0qBOXymndZnk5q235mFc4= github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= @@ -658,17 +861,22 @@ github.com/kisielk/errcheck v1.6.2 h1:uGQ9xI8/pgc9iOoCe7kWQgRE6SBTrCGmTSf0LrEtY7 github.com/kisielk/errcheck v1.6.2/go.mod h1:nXw/i/MfnvRHqXa7XXmQMUB0oNFGuBrNI8d8NLy0LPw= github.com/kisielk/gotool v1.0.0 h1:AV2c/EiW3KqPNT9ZKl07ehoAGi4C5/01Cfbblndcapg= github.com/kkdai/bstream v0.0.0-20161212061736-f391b8402d23 h1:FOOIBWrEkLgmlgGfMuZT83xIwfPDxEI2OHu6xUmJMFE= +github.com/klauspost/asmfmt v1.3.2 h1:4Ri7ox3EwapiOjCki+hw14RyKk201CN4rzyCJRFLpK4= github.com/klauspost/asmfmt v1.3.2/go.mod h1:AG8TuvYojzulgDAMCnYn50l/5QV3Bs/tp6j0HLHbNSE= github.com/klauspost/compress v1.4.0/go.mod h1:RyIbtBH6LamlWaDj8nUwkbUhJ87Yi3uG0guNDohfE1A= github.com/klauspost/compress v1.13.4/go.mod h1:8dP1Hq4DHOhN9w426knH3Rhby4rFm6D8eO+e+Dq5Gzg= github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= +github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5 h1:2U0HzY8BJ8hVwDKIzp7y4voR9CX/nvcfymLmg2UiOio= github.com/klauspost/cpuid v0.0.0-20170728055534-ae7887de9fa5/go.mod h1:Pj4uuM528wm8OyEC2QMXAi2YiTZ96dNQPGgoMS4s3ek= +github.com/klauspost/cpuid/v2 v2.0.9 h1:lgaqFMSdTdQYdZ04uHyN2d/eKdOMyi2YLSvlQIBFYa4= github.com/klauspost/cpuid/v2 v2.0.9/go.mod h1:FInQzS24/EEf25PyTYn52gqo7WaD8xa0213Md/qVLRg= +github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6 h1:KAZ1BW2TCmT6PRihDPpocIy1QTtsAsrx6TneU/4+CMg= github.com/klauspost/crc32 v0.0.0-20161016154125-cb6bfca970f6/go.mod h1:+ZoRqAPRLkC4NPOvfYeR5KNOrY6TD+/sAC3HXPZgDYg= github.com/klauspost/pgzip v1.0.2-0.20170402124221-0bf5dcad4ada/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/klauspost/pgzip v1.2.5 h1:qnWYvvKqedOF2ulHpMG72XQol4ILEJ8k2wwRl/Km8oE= github.com/klauspost/pgzip v1.2.5/go.mod h1:Ch1tH69qFZu15pkjo5kYi6mth2Zzwzt50oCQKQE9RUs= github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk= +github.com/konsorten/go-windows-terminal-sequences v1.0.3 h1:CE8S1cTafDpPvMhIxNJKvHsGVBgn1xWYf1NbHQhywc8= github.com/konsorten/go-windows-terminal-sequences v1.0.3/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/fs v0.1.0 h1:Jskdu9ieNAYnjxsi0LbQp1ulIKZV1LAFgK1tWhpZgl8= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515 h1:T+h1c/A9Gawja4Y9mFVWj2vyii2bbUNDw3kt9VxK2EY= @@ -683,7 +891,9 @@ github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0 github.com/kylelemons/godebug v1.1.0/go.mod h1:9/0rRGxNHcop5bhtWyNeEfOS8JIWk580+fNqagV/RAw= github.com/kyoh86/exportloopref v0.1.8 h1:5Ry/at+eFdkX9Vsdw3qU4YkvGtzuVfzT4X7S77LoN/M= github.com/kyoh86/exportloopref v0.1.8/go.mod h1:1tUcJeiioIs7VWe5gcOObrux3lb66+sBqGZrRkMwPgg= +github.com/labstack/echo/v4 v4.2.1 h1:LF5Iq7t/jrtUuSutNuiEWtB5eiHfZ5gSe2pcu5exjQw= github.com/labstack/echo/v4 v4.2.1/go.mod h1:AA49e0DZ8kk5jTOOCKNuPR6oTnBS0dYiM4FW1e6jwpg= +github.com/labstack/gommon v0.3.0 h1:JEeO0bvc78PKdyHxloTKiF8BD5iGrH8T6MSeGvSgob0= github.com/labstack/gommon v0.3.0/go.mod h1:MULnywXg0yavhxWKc+lOruYdAhDwPK9wf0OL7NoOu+k= github.com/ldez/gomoddirectives v0.2.3 h1:y7MBaisZVDYmKvt9/l1mjNCiSA1BVn34U0ObUcJwlhA= github.com/ldez/gomoddirectives v0.2.3/go.mod h1:cpgBogWITnCfRq2qGoDkKMEVSaarhdBr6g8G04uz6d0= @@ -694,13 +904,16 @@ github.com/leonklingele/grouper v1.1.0/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7s github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/lufeee/execinquery v1.2.1 h1:hf0Ems4SHcUGBxpGN7Jz78z1ppVkP/837ZlETPCEtOM= github.com/lufeee/execinquery v1.2.1/go.mod h1:EC7DrEKView09ocscGHC+apXMIaorh4xqSxS/dy8SbM= +github.com/lyft/protoc-gen-star/v2 v2.0.3 h1:/3+/2sWyXeMLzKd1bX+ixWKgEMsULrIivpDsuaF441o= github.com/lyft/protoc-gen-star/v2 v2.0.3/go.mod h1:amey7yeodaJhXSbf/TlLvWiqQfLOSpEk//mLlc+axEk= github.com/mailru/easyjson v0.0.0-20190614124828-94de47d64c63/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= +github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e h1:hB2xlXdHp/pmPZq0y3QnmWAArdw9PqbmotexnWx/FU8= github.com/mailru/easyjson v0.0.0-20190626092158-b2ccc519800e/go.mod h1:C1wdFJiN94OJF2b5HbByQZoLdCWB1Yqtg26g4irojpc= github.com/maratori/testpackage v1.1.0 h1:GJY4wlzQhuBusMF1oahQCBtUV/AQ/k69IZ68vxaac2Q= github.com/maratori/testpackage v1.1.0/go.mod h1:PeAhzU8qkCwdGEMTEupsHJNlQu2gZopMC6RjbhmHeDc= github.com/matoous/godox v0.0.0-20210227103229-6504466cf951 h1:pWxk9e//NbPwfxat7RXkts09K+dEBJWakUWwICVqYbA= github.com/matoous/godox v0.0.0-20210227103229-6504466cf951/go.mod h1:1BELzlh859Sh1c6+90blK8lbYy0kwQf1bYlBhBysy1s= +github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd h1:HvFwW+cm9bCbZ/+vuGNq7CRWXql8c0y8nGeYpqmpvmk= github.com/matryer/moq v0.0.0-20190312154309-6cfb0558e1bd/go.mod h1:9ELz6aaclSIGnZBoaSLZ3NAl1VTufbOrXBPvtcy6WiQ= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= @@ -723,7 +936,9 @@ github.com/mattn/go-isatty v0.0.14/go.mod h1:7GGIvUiUoEMVVmxf/4nioHXj79iQHKdU27k github.com/mattn/go-isatty v0.0.17/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-runewidth v0.0.3/go.mod h1:LwmH8dsx7+W8Uxz3IHJYH5QSwggIsqBzpuz5H//U1FU= github.com/mattn/go-runewidth v0.0.13/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-sqlite3 v1.11.0 h1:LDdKkqtYlom37fkvqs8rMPFKAMe8+SgjbwZ6ex1/A/Q= github.com/mattn/go-sqlite3 v1.11.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= +github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104 h1:d8RFOZ2IiFtFWBcKEHAFYJcPTf0wY5q0exFNJZVWa1U= github.com/mattn/go-tty v0.0.0-20180907095812-13ff1204f104/go.mod h1:XPvLUNfbS4fJH25nqRHfWLMa1ONC8Amw+mIA639KxkE= github.com/matttproud/golang_protobuf_extensions v1.0.4 h1:mmDVorXM7PCGKw94cs5zkfA9PSy5pEvNWRP0ET0TIVo= github.com/matttproud/golang_protobuf_extensions v1.0.4/go.mod h1:BSXmuO+STAnVfrANrmjBb36TMTDstsz7MSK+HVaYKv4= @@ -736,11 +951,15 @@ github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKju github.com/miekg/dns v1.1.41/go.mod h1:p6aan82bvRIyn+zDIv9xYNUpwa73JcSh9BKwknJysuI= github.com/miekg/dns v1.1.43 h1:JKfpVSCB84vrAmHzyrsxB5NAr5kLoMXZArPSw7Qlgyg= github.com/miekg/dns v1.1.43/go.mod h1:+evo5L0630/F6ca/Z9+GAqzhjGyn8/c+TBaOyfEl0V4= +github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8 h1:AMFGa4R4MiIpspGNG7Z948v4n35fFGB3RR3G/ry4FWs= github.com/minio/asm2plan9s v0.0.0-20200509001527-cdd76441f9d8/go.mod h1:mC1jAcsrzbxHt8iiaC+zU4b1ylILSosueou12R++wfY= +github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3 h1:+n/aFZefKZp7spd8DFdX7uMikMLXX4oubIzJF4kv/wI= github.com/minio/c2goasm v0.0.0-20190812172519-36a3d3bbc4f3/go.mod h1:RagcQ7I8IeTMnF8JTXieKnO4Z6JCsikNEzj0DwauVzE= github.com/minio/highwayhash v1.0.1/go.mod h1:BQskDq+xkJ12lmlUUi7U0M5Swg3EWR+dLTk+kldvVxY= +github.com/mitchellh/cli v1.1.0 h1:tEElEatulEHDeedTxwckzyYMA5c86fbmNIUL1hBIiTg= github.com/mitchellh/cli v1.1.0/go.mod h1:xcISNoH86gajksDmfB23e/pu+B+GeFRMYmoHXxx3xhI= github.com/mitchellh/go-homedir v1.1.0 h1:lukF9ziXFxDFPkA1vsr5zpc1XuPDn/wFntq5mG+4E0Y= +github.com/mitchellh/go-testing-interface v1.0.0 h1:fzU/JVNcaqHQEcVFAKeR41fkiLdIPrefOvVG1VZ96U0= github.com/mitchellh/go-testing-interface v1.0.0/go.mod h1:kRemZodwjscx+RGhAo8eIhFbs2+BFgRtFPeD/KE+zxI= github.com/mitchellh/mapstructure v0.0.0-20160808181253-ca63d7c062ee/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= github.com/mitchellh/mapstructure v1.4.2/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= @@ -761,6 +980,15 @@ github.com/morikuni/aec v1.0.0 h1:nP9CBfwrvYnBRgY6qfDQkygYDmYwOilePFkwzv4dU8A= github.com/morikuni/aec v1.0.0/go.mod h1:BbKIizmSmc5MMPqRYbxO4ZU0S0+P200+tUnFx7PXmsc= github.com/morph-l2/go-ethereum v0.5.0/go.mod h1:sMJCfHOBzVRDkM2yF/Hy+oUk2rgC0CQZHTLs0cyzhhk= github.com/morph-l2/go-ethereum v0.6.0/go.mod h1:Z8nCRf+BHV5GwFKpVamy6yur7LrKkzqaPfQcwYnq0bE= +github.com/morph-l2/go-ethereum v1.10.14-0.20241028101924-8c247ffe3315 h1:egBq7X488cY3PMSecpyf34H6zqwix0WwcDzcCOeKlYU= +github.com/morph-l2/go-ethereum v1.10.14-0.20241028101924-8c247ffe3315/go.mod h1:sMJCfHOBzVRDkM2yF/Hy+oUk2rgC0CQZHTLs0cyzhhk= +github.com/morph-l2/go-ethereum v1.10.14-0.20241224100051-1582a364edc0 h1:w0RXAFr/x9fWNgQkcrmSnZseYCNkbBFDWgEIfSqhCeY= +github.com/morph-l2/go-ethereum v1.10.14-0.20241224100051-1582a364edc0/go.mod h1:sMJCfHOBzVRDkM2yF/Hy+oUk2rgC0CQZHTLs0cyzhhk= +github.com/morph-l2/go-ethereum v1.10.14-0.20250218031646-de5160c106de h1:NOzYvFCuqWZ0bg2GAcC2S9cwd1rThSCTwyJCT8Iwfgc= +github.com/morph-l2/go-ethereum v1.10.14-0.20250218031646-de5160c106de/go.mod h1:sMJCfHOBzVRDkM2yF/Hy+oUk2rgC0CQZHTLs0cyzhhk= +github.com/morph-l2/tendermint v0.3.1 h1:yqyM3/p9sCNmFSsIFeIxS5RBgXHWqbtyNHx16I9cIZ0= +github.com/morph-l2/tendermint v0.3.1/go.mod h1:TtCzp9l6Z6yDUiwv3TbqKqw8Q8RKp3fSz5+adO1/Y8w= +github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae h1:VeRdUYdCw49yizlSbMEn2SZ+gT+3IUKx8BqxyQdz+BY= github.com/mschoch/smat v0.0.0-20160514031455-90eadee771ae/go.mod h1:qAyveg+e4CE+eKJXWVjKXM4ck2QobLqTDytGJbLLhJg= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f h1:KUppIJq7/+SVif2QVs3tOP0zanoHgBEVAwHxUSIzRqU= github.com/mwitkow/go-conntrack v0.0.0-20190716064945-2f068394615f/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -770,6 +998,7 @@ github.com/naoina/go-stringutil v0.1.0 h1:rCUeRUHjBjGTSHl0VC00jUPLz8/F9dDzYI70Hz github.com/naoina/go-stringutil v0.1.0/go.mod h1:XJ2SJL9jCtBh+P9q5btrd/Ylo8XwT/h1USek5+NqSA0= github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416 h1:shk/vn9oCoOTmwcouEdwIeOtOGA/ELRUw/GwvxwfT+0= github.com/naoina/toml v0.1.2-0.20170918210437-9fafd6967416/go.mod h1:NBIhNtsFMo3G2szEBne+bO4gS192HuIYRqfvOWb4i1E= +github.com/nats-io/jwt v1.2.2 h1:w3GMTO969dFg+UOKTmmyuu7IGdusK+7Ytlt//OYH/uU= github.com/nats-io/jwt v1.2.2/go.mod h1:/xX356yQA6LuXI9xWW7mZNpxgF2mBmGecH+Fj34sP5Q= github.com/nats-io/jwt/v2 v2.0.3 h1:i/O6cmIsjpcQyWDYNcq2JyZ3/VTF8SJ4JWluI5OhpvI= github.com/nats-io/jwt/v2 v2.0.3/go.mod h1:VRP+deawSXyhNjXmxPCHskrR6Mq50BqpEI5SEcNiGlY= @@ -784,6 +1013,7 @@ github.com/nats-io/nuid v1.0.1 h1:5iA8DT8V7q8WK2EScv2padNa/rTESc1KdnPw4TC2paw= github.com/nats-io/nuid v1.0.1/go.mod h1:19wcPz3Ph3q0Jbyiqsd0kePYG7A95tJPxeL+1OSON2c= github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354 h1:4kuARK6Y6FxaNu/BnU2OAaLF86eTVhP2hjTB6iMvItA= github.com/nbutton23/zxcvbn-go v0.0.0-20210217022336-fa2cb2858354/go.mod h1:KSVJerMDfblTH7p5MZaTt+8zaT2iEk3AkVb9PQdZuE8= +github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e h1:fD57ERR4JtEqsWbfPhv4DMiApHyliiK5xCTNVSPiaAs= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/nishanths/exhaustive v0.8.1 h1:0QKNascWv9qIHY7zRoZSxeRr6kuk5aAT3YXLTiDmjTo= github.com/nishanths/exhaustive v0.8.1/go.mod h1:qj+zJJUgJ76tR92+25+03oYUhzF4R7/2Wk7fGTfCHmg= @@ -803,7 +1033,9 @@ github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYr github.com/openzipkin/zipkin-go v0.2.5 h1:UwtQQx2pyPIgWYHRg+epgdx1/HnBQTgN3/oIYEJTQzU= github.com/openzipkin/zipkin-go v0.2.5/go.mod h1:KpXfKdgRDnnhsxw4pNIH9Md5lyFqKUa4YDFlwRYAMyE= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/pascaldekloe/goe v0.1.0 h1:cBOtyMzM9HTpWjXfbbunk26uA6nG3a8n06Wieeh0MwY= github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= +github.com/paulbellamy/ratecounter v0.2.0 h1:2L/RhJq+HA8gBQImDXtLPrDXK5qAj6ozWVK/zFXVJGs= github.com/paulbellamy/ratecounter v0.2.0/go.mod h1:Hfx1hDpSGoqxkVVpBi/IlYD7kChlfo5C6hzIHwPqfFE= github.com/performancecopilot/speed/v4 v4.0.0 h1:VxEDCmdkfbQYDlcr/GC9YoN9PQ6p8ulk9xVsepYy9ZY= github.com/performancecopilot/speed/v4 v4.0.0/go.mod h1:qxrSyuDGrTOWfV+uKRFhfxw6h/4HXRGUiZiufxo49BM= @@ -812,9 +1044,12 @@ github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 h1:oYW+YCJ1pachXTQm github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7/go.mod h1:CRroGNssyjTd/qIG2FyxByd2S8JEAZXBl4qUrZf8GS0= github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d h1:CdDQnGF8Nq9ocOS/xlSptM1N3BbrA6/kmaep5ggwaIA= github.com/phayes/checkstyle v0.0.0-20170904204023-bfd46e6a821d/go.mod h1:3OzsM7FXDQlpCiw2j81fOmAwQLnZnLGXVKUzeKQXIAw= +github.com/philhofer/fwd v1.0.0 h1:UbZqGr5Y38ApvM/V/jEljVxwocdweyH+vmYvRPBnbqQ= github.com/philhofer/fwd v1.0.0/go.mod h1:gk3iGcWd9+svBvR0sR+KPcfE+RNWozjowpeBVG3ZVNU= github.com/pierrec/lz4 v1.0.2-0.20190131084431-473cd7ce01a1/go.mod h1:3/3N9NVKO0jef7pBehbT1qWhCMrIgbYNnFAZCqQ5LRc= +github.com/pierrec/lz4 v2.0.5+incompatible h1:2xWsjqPFWcplujydGg4WmhC/6fZqK42wMM8aXeqhl0I= github.com/pierrec/lz4 v2.0.5+incompatible/go.mod h1:pdkljMzZIN41W+lC3N2tnIh5sFi+IEE17M5jbnwPHcY= +github.com/pierrec/lz4/v4 v4.1.15 h1:MO0/ucJhngq7299dKLwIMtgTfbkoSPF6AoMYDd8Q4q0= github.com/pierrec/lz4/v4 v4.1.15/go.mod h1:gZWDp/Ze/IJXGXf23ltt2EXimqmTUXEy0GFuRQyBid4= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8 h1:KoWmjvw+nsYOo29YJK9vDA65RGE3NrOnUtO7a+RF9HU= github.com/pkg/browser v0.0.0-20210911075715-681adbf594b8/go.mod h1:HKlIX3XHQyzLZPlr7++PzdhaXEj94dEiJgZDTsxEqUI= @@ -823,6 +1058,7 @@ github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6J github.com/pkg/profile v1.7.0 h1:hnbDkaNWPCLMO9wGLdBFTIZvzDrDfBM2072E1S9gJkA= github.com/pkg/profile v1.7.0/go.mod h1:8Uer0jas47ZQMJ7VD+OHknK4YDY07LPUC6dEvqDjvNo= github.com/pkg/sftp v1.13.1 h1:I2qBYMChEhIjOgazfJmV3/mZM256btk6wkCDRmW7JYs= +github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5 h1:tFwafIEMf0B7NlcxV/zJ6leBIa81D3hgGSgsE5hCkOQ= github.com/pkg/term v0.0.0-20180730021639-bffc007b7fd5/go.mod h1:eCbImbZ95eXtAUIbLAuAVnBnwf83mjf6QIVH8SHYwqQ= github.com/pointlander/compress v1.1.1-0.20190518213731-ff44bd196cc3 h1:hUmXhbljNFtrH5hzV9kiRoddZ5nfPTq3K0Sb2hYYiqE= github.com/pointlander/compress v1.1.1-0.20190518213731-ff44bd196cc3/go.mod h1:q5NXNGzqj5uPnVuhGkZfmgHqNUhf15VLi6L9kW0VEc0= @@ -833,6 +1069,7 @@ github.com/pointlander/peg v1.0.1/go.mod h1:5hsGDQR2oZI4QoWz0/Kdg3VSVEC31iJw/b7W github.com/polyfloyd/go-errorlint v1.0.2 h1:kp1yvHflYhTmw5m3MmBy8SCyQkKPjwDthVuMH0ug6Yk= github.com/polyfloyd/go-errorlint v1.0.2/go.mod h1:APVvOesVSAnne5SClsPxPdfvZTVDojXh1/G3qb5wjGI= github.com/posener/complete v1.1.1/go.mod h1:em0nMJCgc9GFtwrmVmEMR/ZL6WyhyjMBndrE9hABlRI= +github.com/posener/complete v1.2.3 h1:NP0eAhjcjImqslEwo/1hq7gpajME0fTLTezBKDqfXqo= github.com/posener/complete v1.2.3/go.mod h1:WZIdtGGp+qx0sLrYKtIRAruyNpv6hFCicSgv7Sy7s/s= github.com/prometheus/client_golang v1.4.0/go.mod h1:e9GMxYsXl05ICDXkRhurwBS4Q3OK1iX/F2sw+iXX5zU= github.com/prometheus/client_golang v1.7.1/go.mod h1:PY5Wy2awLA44sXw4AOSfFBetzPP4j5+D6mVACh+pe2M= @@ -862,6 +1099,7 @@ github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:r github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567 h1:M8mH9eK4OUR4lu7Gd+PU1fV2/qnDNfzT635KRSObncs= github.com/quasilyte/stdinfo v0.0.0-20220114132959-f7386bf02567/go.mod h1:DWNGW8A4Y+GyBgPuaQJuWiy0XYftx4Xm/y5Jqk9I6VQ= github.com/rcrowley/go-metrics v0.0.0-20181016184325-3113b8401b8a/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= +github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52 h1:RnWNS9Hlm8BIkjr6wx8li5abe0fr73jljLycdfemTp0= github.com/retailnext/hllpp v1.0.1-0.20180308014038-101a6d2f8b52/go.mod h1:RDpi1RftBQPUCDRw6SmxeaREsAaRKnOclghuzp/WRzc= github.com/rjeczalik/notify v0.9.1/go.mod h1:rKwnCoCGeuQnwBtTSPL9Dad03Vh2n40ePRrjvIXnJho= github.com/rogpeppe/fastuuid v1.2.0 h1:Ppwyp6VYCF1nvBTXL3trRso7mXMlRrw9ooo375wvi2s= @@ -875,6 +1113,7 @@ github.com/ryancurrah/gomodguard v1.2.4 h1:CpMSDKan0LtNGGhPrvupAoLeObRFjND8/tU1r github.com/ryancurrah/gomodguard v1.2.4/go.mod h1:+Kem4VjWwvFpUJRJSwa16s1tBJe+vbv02+naTow2f6M= github.com/ryanrolds/sqlclosecheck v0.3.0 h1:AZx+Bixh8zdUBxUA1NxbxVAS78vTPq4rCb8OUZI9xFw= github.com/ryanrolds/sqlclosecheck v0.3.0/go.mod h1:1gREqxyTGR3lVtpngyFo3hZAgk0KCtEdgEkHwDbigdA= +github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f h1:UFr9zpz4xgTnIE5yIMtWAMngCdZ9p/+q6lTbgelo80M= github.com/ryanuber/columnize v0.0.0-20160712163229-9b3edd62028f/go.mod h1:sm1tb6uqfes/u+d4ooFouqFdy9/2g9QGwK3SQygK0Ts= github.com/sagikazarmark/crypt v0.6.0 h1:REOEXCs/NFY/1jOCEouMuT4zEniE5YoXbvpC5X/TLF8= github.com/sagikazarmark/crypt v0.6.0/go.mod h1:U8+INwJo3nBv1m6A/8OBXAq7Jnpspk5AxSgDyEQcea8= @@ -886,11 +1125,14 @@ github.com/sashamelentyev/usestdlibvars v1.13.0 h1:uObNudVEEHf6JbOJy5bgKJloA1bWj github.com/sashamelentyev/usestdlibvars v1.13.0/go.mod h1:D2Wb7niIYmTB+gB8z7kh8tyP5ccof1dQ+SFk+WW5NtY= github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= github.com/securego/gosec/v2 v2.13.1 h1:7mU32qn2dyC81MH9L2kefnQyRMUarfDER3iQyMHcjYM= github.com/securego/gosec/v2 v2.13.1/go.mod h1:EO1sImBMBWFjOTFzMWfTRrZW6M15gm60ljzrmy/wtHo= github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= +github.com/segmentio/kafka-go v0.2.0 h1:HtCSf6B4gN/87yc5qTl7WsxPKQIIGXLPPM1bMCPOsoY= github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= +github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU= github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= @@ -904,7 +1146,9 @@ github.com/sivchari/nosnakecase v1.7.0 h1:7QkpWIRMe8x25gckkFd2A5Pi6Ymo0qgr4JrhGt github.com/sivchari/nosnakecase v1.7.0/go.mod h1:CwDzrzPea40/GB6uynrNLiorAlgFRvRbFSgJx2Gs+QY= github.com/sivchari/tenv v1.7.0 h1:d4laZMBK6jpe5PWepxlV9S+LC0yXqvYHiq8E6ceoVVE= github.com/sivchari/tenv v1.7.0/go.mod h1:64yStXKSOxDfX47NlhVwND4dHwfZDdbp2Lyl018Icvg= +github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d h1:zE9ykElWQ6/NYmHa3jpm/yHnI4xSofP+UP6SpjHcSeM= github.com/smartystreets/assertions v0.0.0-20180927180507-b2de0cb4f26d/go.mod h1:OnSkiWE9lh6wB0YB77sQom3nweQdgAjqCqsofrRNTgc= +github.com/smartystreets/goconvey v1.6.4 h1:fv0U8FUIMPNf1L9lnHLvLhgicrIVChEkdzIKYqbNC9s= github.com/smartystreets/goconvey v1.6.4/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa h1:YJfZp12Z3AFhSBeXOlv4BO55RMwPn2NoQeDsrdWnBtY= github.com/snikch/goodman v0.0.0-20171125024755-10e37e294daa/go.mod h1:oJyF+mSPHbB5mVY2iO9KV3pTt/QbIkGaO8gQ2WrDbP4= @@ -940,6 +1184,7 @@ github.com/timakin/bodyclose v0.0.0-20210704033933-f49887972144 h1:kl4KhGNsJIbDH github.com/timakin/bodyclose v0.0.0-20210704033933-f49887972144/go.mod h1:Qimiffbc6q9tBWlVV6x0P9sat/ao1xEkREYPPj9hphk= github.com/timonwong/logrlint v0.1.0 h1:phZCcypL/vtx6cGxObJgWZ5wexZF5SXFPLOM+ru0e/M= github.com/timonwong/logrlint v0.1.0/go.mod h1:Zleg4Gw+kRxNej+Ra7o+tEaW5k1qthTaYKU7rSD39LU= +github.com/tinylib/msgp v1.0.2 h1:DfdQrzQa7Yh2es9SuLkixqxuXS2SxsdYn0KbdrOGWD8= github.com/tinylib/msgp v1.0.2/go.mod h1:+d+yLhGm8mzTaHzB+wgMYrodPfmZrzkirds8fDWklFE= github.com/tklauser/go-sysconf v0.3.12/go.mod h1:Ho14jnntGE1fpdOqQEEaiKRpvIavV0hSfmBq8nJbHYI= github.com/tklauser/numcpus v0.6.1/go.mod h1:1XfjsgE2zo8GVw7POkMbHENHzVg3GzmoZ9fESEdAacY= @@ -947,6 +1192,7 @@ github.com/tomarrell/wrapcheck/v2 v2.6.2 h1:3dI6YNcrJTQ/CJQ6M/DUkc0gnqYSIk6o0rCh github.com/tomarrell/wrapcheck/v2 v2.6.2/go.mod h1:ao7l5p0aOlUNJKI0qVwB4Yjlqutd0IvAB9Rdwyilxvg= github.com/tommy-muehle/go-mnd/v2 v2.5.0 h1:iAj0a8e6+dXSL7Liq0aXPox36FiN1dBbjA6lt9fl65s= github.com/tommy-muehle/go-mnd/v2 v2.5.0/go.mod h1:WsUAkMJMYww6l/ufffCD3m+P7LEvr8TnZn9lwVDlgzw= +github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926 h1:G3dpKMzFDjgEh2q1Z7zUUtKa8ViPtH+ocF0bE0g00O8= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8 h1:3SVOIvH7Ae1KRYyQWRjXWJEA9sS/c/pjvH++55Gr648= github.com/ultraware/funlen v0.0.3 h1:5ylVWm8wsNwH5aWo9438pwvsK0QiqVuUrt9bn7S/iLA= @@ -954,19 +1200,25 @@ github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lP github.com/ultraware/whitespace v0.0.5 h1:hh+/cpIcopyMYbZNVov9iSxvJU3OYQg78Sfaqzi/CzI= github.com/ultraware/whitespace v0.0.5/go.mod h1:aVMh/gQve5Maj9hQ/hg+F75lr/X5A89uZnzAmWSineA= github.com/urfave/cli/v2 v2.10.2/go.mod h1:f8iq5LtQ/bLxafbdBSLPPNsgaW0l/2fYYEHhAyPlwvo= +github.com/urfave/cli/v2 v2.25.7 h1:VAzn5oq403l5pHjc4OhD54+XGO9cdKVL/7lDjF+iKUs= github.com/urfave/cli/v2 v2.25.7/go.mod h1:8qnjx1vcq5s2/wpsqoZFndg2CE5tNFyrTvS6SinrnYQ= github.com/uudashr/gocognit v1.0.6 h1:2Cgi6MweCsdB6kpcVQp7EW4U23iBFQWfTXiWlyp842Y= github.com/uudashr/gocognit v1.0.6/go.mod h1:nAIUuVBnYU7pcninia3BHOvQkpQCeO76Uscky5BOwcY= +github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/valyala/fasttemplate v1.2.1 h1:TVEnxayobAdVkhQfrfes2IzOB6o+z4roRkPF52WA1u4= github.com/valyala/fasttemplate v1.2.1/go.mod h1:KHLXt3tVN2HBp8eijSv/kGJopbvo7S+qRAEEKiv+SiQ= github.com/vektra/mockery/v2 v2.14.0 h1:KZ1p5Hrn8tiY+LErRMr14HHle6khxo+JKOXLBW/yfqs= github.com/vektra/mockery/v2 v2.14.0/go.mod h1:bnD1T8tExSgPD1ripLkDbr60JA9VtQeu12P3wgLZd7M= +github.com/willf/bitset v1.1.3 h1:ekJIKh6+YbUIVt9DfNbkR5d6aFcFTLDRyJNAACURBg8= github.com/willf/bitset v1.1.3/go.mod h1:RjeCKbqT1RxIR/KWY6phxZiaY1IyutSBfGjNPySAYV4= github.com/xhit/go-str2duration/v2 v2.1.0 h1:lxklc02Drh6ynqX+DdPyp5pCKLUQpRT8bp8Ydu2Bstc= github.com/xhit/go-str2duration/v2 v2.1.0/go.mod h1:ohY8p+0f07DiV6Em5LKB0s2YpLtXVyJfNt1+BlmyAsU= +github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6 h1:YdYsPAZ2pC6Tow/nPZOPQ96O3hm/ToAkGsPLzedXERk= github.com/xlab/treeprint v0.0.0-20180616005107-d6fb6747feb6/go.mod h1:ce1O1j6UtZfjr22oyGxGLbauSBp2YVXpARAosm7dHBg= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77 h1:ESFSdwYZvkeru3RtdrYueztKhOBCSAAzS4Gf+k0tEow= +github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673 h1:bAn7/zixMGCfxrRTfdpNzjtPYqr8smhKouy9mxVdGPU= github.com/xrash/smetrics v0.0.0-20201216005158-039620a65673/go.mod h1:N3UwUGtsrSj3ccvlPHLoLsHnpR27oXr4ZE984MbSER8= github.com/yagipy/maintidx v1.0.0 h1:h5NvIsCz+nRDapQ0exNv4aJ0yXSI0420omVANTv3GJM= github.com/yagipy/maintidx v1.0.0/go.mod h1:0qNf/I/CCZXSMhsRsrEPDZ+DkekpKLXAJfsTACwgXLk= @@ -975,6 +1227,7 @@ github.com/yeya24/promlinter v0.2.0/go.mod h1:u54lkmBOZrpEbQQ6gox2zWKKLKu2SGe+2K github.com/yuin/goldmark v1.2.1 h1:ruQGxdhGHe7FWOJPT0mKs5+pD2Xs1Bm/kdGlHO04FmM= github.com/yuin/goldmark v1.3.5/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1Zlc8k= github.com/yuin/goldmark v1.4.13 h1:fVcFKWvrslecOb/tg+Cc05dkeYx540o0FuFt3nUVDoE= +github.com/zeebo/xxh3 v1.0.2 h1:xZmwmqxHZA8AI603jOQ0tMqmBr9lPeFwGg6d+xy9DC0= github.com/zeebo/xxh3 v1.0.2/go.mod h1:5NWz9Sef7zIDm2JHfFlcQvNekmcEl9ekUZQQKCYaDcA= gitlab.com/bosi/decorder v0.2.3 h1:gX4/RgK16ijY8V+BRQHAySfQAb354T7/xQpDB2n10P0= gitlab.com/bosi/decorder v0.2.3/go.mod h1:9K1RB5+VPNQYtXtTDAzd2OEftsZb1oV0IrJrzChSdGE= @@ -1003,16 +1256,19 @@ go.opentelemetry.io/otel v1.21.0 h1:hzLeKBZEL7Okw2mGzZ0cc4k/A7Fta0uoPgaJCr8fsFc= go.opentelemetry.io/otel v1.21.0/go.mod h1:QZzNPQPm1zLX4gZK4cMi+71eaorMSGT3A4znnUvNNEo= go.opentelemetry.io/otel/metric v1.21.0 h1:tlYWfeo+Bocx5kLEloTjbcDwBuELRrIFxwdQ36PlJu4= go.opentelemetry.io/otel/metric v1.21.0/go.mod h1:o1p3CA8nNHW8j5yuQLdc1eeqEaPfzug24uvsyIEJRWM= +go.opentelemetry.io/otel/sdk v1.21.0 h1:FTt8qirL1EysG6sTQRZ5TokkU8d0ugCj8htOgThZXQ8= go.opentelemetry.io/otel/sdk v1.21.0/go.mod h1:Nna6Yv7PWTdgJHVRD9hIYywQBRx7pbox6nwBnZIxl/E= go.opentelemetry.io/otel/trace v1.21.0 h1:WD9i5gzvoUPuXIXH24ZNBudiarZDKuekPqi/E8fpfLc= go.opentelemetry.io/otel/trace v1.21.0/go.mod h1:LGbsEB0f9LGjN+OZaQQ26sohbOmiMR+BaslueVtS/qQ= go.opentelemetry.io/proto/otlp v0.7.0 h1:rwOQPCuKAKmwGKq2aVNnYIibI6wnV7EvzgfTCzcdGg8= +go.opentelemetry.io/proto/otlp v1.0.0 h1:T0TX0tmXU8a3CbNXzEKGeU5mIVOdf0oykP+u2lIVU/I= go.opentelemetry.io/proto/otlp v1.0.0/go.mod h1:Sy6pihPLfYHkr3NkUbEhGHFhINUSI/v80hjKIs5JXpM= go.uber.org/atomic v1.3.2/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/atomic v1.7.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE= go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc= go.uber.org/goleak v1.1.11-0.20210813005559-691160354723/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= +go.uber.org/goleak v1.1.11 h1:wy28qYRKZgnJTxGxvye5/wgWr1EKjmUDGYox5mGlRlI= go.uber.org/goleak v1.1.11/go.mod h1:cwTWslyiVhfpKIDGSZEM2HlOvcqm+tG4zioyIeLoqMQ= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/multierr v1.6.0/go.mod h1:cdWPpRnG4AhwMwsgIHip0KRBQjJy5kYEpYjJxpXp9iU= @@ -1048,6 +1304,7 @@ golang.org/x/exp/typeparams v0.0.0-20220613132600-b0d781184e0d/go.mod h1:AbB0pIl golang.org/x/image v0.0.0-20180708004352-c73c2afc3b81/go.mod h1:ux5Hcp/YLpHSI86hEcLt0YII63i6oz57MZXIpbrjZUs= golang.org/x/image v0.0.0-20190802002840-cff245a6509b h1:+qEpEAPhDZ1o0x3tHzZTQDArnOixOzGD9HUJfcg0mb4= golang.org/x/lint v0.0.0-20201208152925-83fdc39ff7b5 h1:2M3HP5CCK1Si9FQhwnzYhXdG6DXeebvUHFpre8QvbyI= +golang.org/x/lint v0.0.0-20210508222113-6edffad5e616 h1:VLliZ0d+/avPrXXH+OakdXhpJuEoBZuwh1m2j7U6Iug= golang.org/x/lint v0.0.0-20210508222113-6edffad5e616/go.mod h1:3xt1FjdF8hUf6vQPIChWIBhFzV8gjjsPE/fR3IyQdNY= golang.org/x/mobile v0.0.0-20190719004257-d2bd2a29d028 h1:4+4C/Iv2U4fMZBiMCc98MG1In4gJY5YRhtpDNeDeHWs= golang.org/x/mod v0.4.2/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= @@ -1135,6 +1392,7 @@ golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.13.0/go.mod h1:HvlwmtVNQAhOuCjW7xxvovg8wbNq7LwfXh/k7wXUl58= golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df h1:5Pf6pFKu98ODmgnpvkJ3kFUOQGGLIzLIkbzUHp47618= golang.org/x/xerrors v0.0.0-20220907171357-04be3eba64a2/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028 h1:+cNy6SZtPcJQH3LJVLOSmiC7MMxXNOb3PU/VUEz+EhU= golang.org/x/xerrors v0.0.0-20231012003039-104605ab7028/go.mod h1:NDW/Ps6MPRej6fsCIbMTohpP40sJ/P/vI1MoTEGwX90= gonum.org/v1/gonum v0.0.0-20180816165407-929014505bf4/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= gonum.org/v1/gonum v0.0.0-20181121035319-3f7ecaa7e8ca/go.mod h1:Y+Yx5eoAFn32cQvJDxZx5Dpnq+c3wtXuadVZAcxbbBo= @@ -1142,12 +1400,15 @@ gonum.org/v1/gonum v0.6.0/go.mod h1:9mxDZsDKxgMAuccQkewq682L+0eCu4dCN2yonUJTCLU= gonum.org/v1/gonum v0.8.2 h1:CCXrcPKiGGotvnN6jfUsKk4rRqm7q09/YbKb5xCEvtM= gonum.org/v1/gonum v0.8.2/go.mod h1:oe/vMfY3deqTw+1EZJhuvEW2iwGF1bW9wwu7XCu0+v0= gonum.org/v1/netlib v0.0.0-20181029234149-ec6d1f5cefe6/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0 h1:OE9mWmgKkjJyEmDAAtGMPjXu+YNeGvK9VTSHY6+Qihc= gonum.org/v1/netlib v0.0.0-20190313105609-8cb42192e0e0/go.mod h1:wa6Ws7BG/ESfp6dHfk7C6KdzKA7wR7u/rKwOGE66zvw= +gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b h1:Qh4dB5D/WpoUUp3lSod7qgoyEHbDGPUWjIbnqdqqe1k= gonum.org/v1/plot v0.0.0-20190515093506-e2840ee46a6b/go.mod h1:Wt8AAjI+ypCyYX3nZBvf6cAIx93T+c/OS2HFAYskSZc= google.golang.org/api v0.81.0 h1:o8WF5AvfidafWbFjsRyupxyEQJNUWxLZJCK5NXrxZZ8= google.golang.org/api v0.81.0/go.mod h1:FA6Mb/bZxj706H2j+j2d6mHEEaHBmbbWnkfvmorOCko= google.golang.org/api v0.149.0/go.mod h1:Mwn1B7JTXrzXtnvmzQE2BD6bYZQ8DShKZDZbeN9I7qI= google.golang.org/api v0.150.0/go.mod h1:ccy+MJ6nrYFgE3WgRx/AMXOxOmU8Q4hSa+jjibzhxcg= +google.golang.org/api v0.155.0 h1:vBmGhCYs0djJttDNynWo44zosHlPvHmA0XiN2zP2DtA= google.golang.org/api v0.155.0/go.mod h1:GI5qK5f40kCpHfPn6+YzGAByIKWv8ujFnmoWm7Igduk= google.golang.org/appengine v1.6.8 h1:IhEN5q69dyKagZPYMSdIjS2HqprW324FRQZJcGqPAsM= google.golang.org/appengine v1.6.8/go.mod h1:1jJ3jBArFh5pcgW8gCtRJnepW8FzD1V44FJffLiz/Ds= @@ -1167,6 +1428,7 @@ google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917/go. google.golang.org/genproto/googleapis/api v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:B5xPO//w8qmBDjGReYLpR6UJPnkldGkCSMoH/2vxJeg= google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80 h1:Lj5rbfG876hIAYFjqiJnPHfhXbv+nzTWfm04Fg/XSVU= google.golang.org/genproto/googleapis/api v0.0.0-20240123012728-ef4313101c80/go.mod h1:4jWUdICTdgc3Ibxmr8nAJiiLHwQBY0UI0XZcEMaFKaA= +google.golang.org/genproto/googleapis/bytestream v0.0.0-20231212172506-995d672761c0 h1:Y6QQt9D/syZt/Qgnz5a1y2O3WunQeeVDfS9+Xr82iFA= google.golang.org/genproto/googleapis/bytestream v0.0.0-20231212172506-995d672761c0/go.mod h1:guYXGPwC6jwxgWKW5Y405fKWOFNwlvUlUnzyp9i0uqo= google.golang.org/genproto/googleapis/rpc v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:swOH3j0KzcDDgGUWr+SNpyTen5YrXjS3eyPzFYKc6lc= google.golang.org/genproto/googleapis/rpc v0.0.0-20231030173426-d783a09b4405/go.mod h1:67X1fPuzjcrkymZzZV1vvkFeTn2Rvc6lYF9MYFGCcwE= @@ -1178,6 +1440,7 @@ google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQ google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= @@ -1208,7 +1471,9 @@ mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jC mvdan.cc/unparam v0.0.0-20220706161116-678bad134442 h1:seuXWbRB1qPrS3NQnHmFKLJLtskWyueeIzmLXghMGgk= mvdan.cc/unparam v0.0.0-20220706161116-678bad134442/go.mod h1:F/Cxw/6mVrNKqrR2YjFf5CaW0Bw4RL8RfbEf4GRggJk= rsc.io/binaryregexp v0.2.0 h1:HfqmD5MEmC0zvwBuF187nq9mdnXjXsSivRiXN7SmRkE= +rsc.io/pdf v0.1.1 h1:k1MczvYDUvJBe93bYd7wrZLLUEcLZAuF824/I4e5Xr4= rsc.io/pdf v0.1.1/go.mod h1:n8OzWcQ6Sp37PL01nO98y4iUCRdTGarVfzxY20ICaU4= rsc.io/quote/v3 v3.1.0 h1:9JKUTTIUgS6kzR9mK1YuGKv6Nl+DijDNIc0ghT58FaY= rsc.io/sampler v1.3.0 h1:7uVkIFmeBqHfdjD+gZwtXXI+RODJ2Wc4O7MPEh/QiW4= +sigs.k8s.io/yaml v1.2.0 h1:kr/MCeFWJWTwyaHoR9c8EjH9OumOmoF9YGiZd7lFm/Q= sigs.k8s.io/yaml v1.2.0/go.mod h1:yfXDCHCao9+ENCvLSE62v9VSji2MKu5jeNfTrofGhJc= diff --git a/node/Makefile b/node/Makefile index ee464b9d..1ab1e309 100644 --- a/node/Makefile +++ b/node/Makefile @@ -87,6 +87,12 @@ testnet-clean: testnet-down rm -rf ./mytestnet .PHONY: testnet-clean +install-tendermint: + if [ ! -d build/bin ]; then mkdir -p build/bin; fi + go mod download + env GO111MODULE=on CGO_ENABLED=1 go install -v $(LDFLAGS) ./cmd/tendermint +.PHONY: tendermint + diff --git a/node/core/batch.go b/node/core/batch.go index e463f5f4..987c4bf0 100644 --- a/node/core/batch.go +++ b/node/core/batch.go @@ -3,35 +3,32 @@ package node import ( "bytes" "context" - "errors" "fmt" "math/big" - "github.com/morph-l2/go-ethereum/accounts/abi/bind" + "morph-l2/node/types" + "github.com/morph-l2/go-ethereum/common" eth "github.com/morph-l2/go-ethereum/core/types" "github.com/morph-l2/go-ethereum/crypto" "github.com/morph-l2/go-ethereum/crypto/bls12381" "github.com/tendermint/tendermint/l2node" tmtypes "github.com/tendermint/tendermint/types" - - "morph-l2/node/types" ) type BatchingCache struct { - parentBatchHeader *types.BatchHeader + parentBatchHeader *types.BatchHeaderBytes prevStateRoot common.Hash // accumulated batch data batchData *types.BatchData totalL1MessagePopped uint64 - skippedBitmap []*big.Int postStateRoot common.Hash withdrawRoot common.Hash lastPackedBlockHeight uint64 // caches sealedBatchHeader according to the above accumulated batch data - sealedBatchHeader *types.BatchHeader + sealedBatchHeader *types.BatchHeaderBytes sealedSidecar *eth.BlobTxSidecar currentBlockContext []byte @@ -39,7 +36,6 @@ type BatchingCache struct { currentTxs tmtypes.Txs currentL1TxsHashes []common.Hash totalL1MessagePoppedAfterCurBlock uint64 - skippedBitmapAfterCurBlock []*big.Int currentStateRoot common.Hash currentWithdrawRoot common.Hash currentBlockBytes []byte @@ -65,7 +61,6 @@ func (bc *BatchingCache) ClearCurrent() { bc.currentTxs = nil bc.currentL1TxsHashes = nil bc.currentBlockContext = nil - bc.skippedBitmapAfterCurBlock = nil bc.totalL1MessagePoppedAfterCurBlock = 0 bc.currentStateRoot = common.Hash{} bc.currentWithdrawRoot = common.Hash{} @@ -85,7 +80,7 @@ func (e *Executor) CalculateCapWithProposalBlock(currentBlockBytes []byte, curre return false, err } - parentBatchHeader := new(types.BatchHeader) + var parentBatchHeader types.BatchHeaderBytes if len(parentBatchHeaderBytes) == 0 { genesisHeader, err := e.l2Client.HeaderByNumber(context.Background(), big.NewInt(0)) if err != nil { @@ -95,24 +90,24 @@ func (e *Executor) CalculateCapWithProposalBlock(currentBlockBytes []byte, curre if err != nil { return false, err } - parentBatchHeader = &genesisBatchHeader + parentBatchHeader = genesisBatchHeader.Bytes() } else { - *parentBatchHeader, err = types.DecodeBatchHeader(parentBatchHeaderBytes) - if err != nil { - return false, err - } + parentBatchHeader = parentBatchHeaderBytes } - // skipped L1 message bitmap, an array of 256-bit bitmaps - var skippedBitmap []*big.Int var txsPayload []byte var l1TxHashes []common.Hash - var totalL1MessagePopped = parentBatchHeader.TotalL1MessagePopped var lastHeightBeforeCurrentBatch uint64 var lastBlockStateRoot common.Hash var lastBlockWithdrawRoot common.Hash var l2TxNum int + totalL1MessagePopped, err := parentBatchHeader.TotalL1MessagePopped() + if err != nil { + e.logger.Error("failed to get totalL1MessagePopped from parentBatchHeader", "error", err) + return false, err + } + for i, blockBz := range blocks { wBlock := new(types.WrappedBlock) if err = wBlock.UnmarshalBinary(blockBz); err != nil { @@ -129,11 +124,11 @@ func (e *Executor) CalculateCapWithProposalBlock(currentBlockBytes []byte, curre } totalL1MessagePoppedBefore := totalL1MessagePopped - txsPayload, l1TxHashes, totalL1MessagePopped, skippedBitmap, l2TxNum, err = ParsingTxs(transactions[i], parentBatchHeader.TotalL1MessagePopped, totalL1MessagePoppedBefore, skippedBitmap) + txsPayload, l1TxHashes, totalL1MessagePopped, l2TxNum, err = ParsingTxs(transactions[i], totalL1MessagePoppedBefore) if err != nil { return false, err } - l1TxNum := int(totalL1MessagePopped - totalL1MessagePoppedBefore) // include skipped L1 messages + l1TxNum := int(totalL1MessagePopped - totalL1MessagePoppedBefore) e.logger.Info("fetched block", "block height", wBlock.Number, "involved transaction count", len(transactions[i]), "l2 tx num", l2TxNum, "l1 tx num", l1TxNum) blockContext := wBlock.BlockContextBytes(l2TxNum+l1TxNum, l1TxNum) e.batchingCache.batchData.Append(blockContext, txsPayload, l1TxHashes) @@ -142,7 +137,7 @@ func (e *Executor) CalculateCapWithProposalBlock(currentBlockBytes []byte, curre } // make sure passed block is the next block of the last packed block - curHeight, err := heightFromBCBytes(currentBlockBytes) + curHeight, err := types.HeightFromBlockBytes(currentBlockBytes) if err != nil { return false, err } @@ -150,8 +145,7 @@ func (e *Executor) CalculateCapWithProposalBlock(currentBlockBytes []byte, curre return false, fmt.Errorf("wrong propose height passed. lastPackedBlockHeight: %d, passed height: %d", e.batchingCache.lastPackedBlockHeight, curHeight) } - e.batchingCache.parentBatchHeader = parentBatchHeader - e.batchingCache.skippedBitmap = skippedBitmap + e.batchingCache.parentBatchHeader = &parentBatchHeader header, err := e.l2Client.HeaderByNumber(context.Background(), big.NewInt(int64(lastHeightBeforeCurrentBatch))) if err != nil { return false, err @@ -161,13 +155,15 @@ func (e *Executor) CalculateCapWithProposalBlock(currentBlockBytes []byte, curre e.batchingCache.withdrawRoot = lastBlockWithdrawRoot // initialize latest batch index - e.metrics.BatchIndex.Set(float64(e.batchingCache.parentBatchHeader.BatchIndex)) + index, _ := e.batchingCache.parentBatchHeader.BatchIndex() + e.metrics.BatchIndex.Set(float64(index)) } - height, err := heightFromBCBytes(currentBlockBytes) + block, err := types.WrappedBlockFromBytes(currentBlockBytes) if err != nil { return false, err } + height := block.Number if height <= e.batchingCache.lastPackedBlockHeight { return false, fmt.Errorf("wrong propose height passed. lastPackedBlockHeight: %d, passed height: %d", e.batchingCache.lastPackedBlockHeight, height) } else if height > e.batchingCache.lastPackedBlockHeight+1 { // skipped some blocks, cache is dirty. need rebuild the cache @@ -182,159 +178,13 @@ func (e *Executor) CalculateCapWithProposalBlock(currentBlockBytes []byte, curre return false, err } - exceeded, err := e.batchingCache.batchData.EstimateCompressedSizeWithNewPayload(e.batchingCache.currentTxsPayload) - - return exceeded, err -} - -// SealBatch seals the accumulated blocks into a batch -// It should be called after CalculateBatchSizeWithProposalBlock which ensure the accumulated blocks is correct. -func (e *Executor) SealBatch() ([]byte, []byte, error) { - if e.batchingCache.IsEmpty() { - return nil, nil, errors.New("failed to seal batch. No data found in batch cache") - } - - // compute skipped bitmap - skippedL1MessageBitmapBytes := make([]byte, len(e.batchingCache.skippedBitmap)*32) - for ii, num := range e.batchingCache.skippedBitmap { - bz := num.Bytes() - padding := 32 - len(bz) - copy(skippedL1MessageBitmapBytes[32*ii+padding:], bz) - } - - sidecar, err := types.EncodeTxsPayloadToBlob(e.batchingCache.batchData.TxsPayload()) - if err != nil { - return nil, nil, err - } - blobHashes := []common.Hash{types.EmptyVersionedHash} - if sidecar != nil && len(sidecar.Blobs) > 0 { - blobHashes = sidecar.BlobHashes() + var exceeded bool + if e.isBatchUpgraded(block.Timestamp) { + exceeded, err = e.batchingCache.batchData.WillExceedCompressedSizeLimit(e.batchingCache.currentBlockContext, e.batchingCache.currentTxsPayload) + } else { + exceeded, err = e.batchingCache.batchData.EstimateCompressedSizeWithNewPayload(e.batchingCache.currentTxsPayload) } - - sequencerSetVerifyHash, err := e.sequencerCaller.SequencerSetVerifyHash(nil) - if err != nil { - return nil, nil, fmt.Errorf("failed to get sequencerSetVerifyHash, err: %w", err) - } - - batchHeader := types.BatchHeader{ - Version: 0, - BatchIndex: e.batchingCache.parentBatchHeader.BatchIndex + 1, - L1MessagePopped: e.batchingCache.totalL1MessagePopped - e.batchingCache.parentBatchHeader.TotalL1MessagePopped, - TotalL1MessagePopped: e.batchingCache.totalL1MessagePopped, - DataHash: e.batchingCache.batchData.DataHash(), - BlobVersionedHash: blobHashes[0], // currently we only have one blob - PrevStateRoot: e.batchingCache.prevStateRoot, - PostStateRoot: e.batchingCache.postStateRoot, - WithdrawalRoot: e.batchingCache.withdrawRoot, - SequencerSetVerifyHash: sequencerSetVerifyHash, - ParentBatchHash: e.batchingCache.parentBatchHeader.Hash(), - SkippedL1MessageBitmap: skippedL1MessageBitmapBytes, - } - e.batchingCache.sealedBatchHeader = &batchHeader - e.batchingCache.sealedSidecar = sidecar - batchHash := e.batchingCache.sealedBatchHeader.Hash() - e.logger.Info("Sealed batch header", "batchHash", batchHash.Hex()) - e.logger.Info(fmt.Sprintf("===batchIndex: %d \n===L1MessagePopped: %d \n===TotalL1MessagePopped: %d \n===dataHash: %x \n===blockNum: %d \n===ParentBatchHash: %x \n===SkippedL1MessageBitmap: %x \n", - batchHeader.BatchIndex, - batchHeader.L1MessagePopped, - batchHeader.TotalL1MessagePopped, - batchHeader.DataHash, - e.batchingCache.batchData.BlockNum(), - batchHeader.ParentBatchHash, - batchHeader.SkippedL1MessageBitmap)) - blockContexts, _ := e.batchingCache.batchData.Encode() - e.logger.Info(fmt.Sprintf("===blockContexts: %x \n", blockContexts)) - - return batchHash[:], e.batchingCache.sealedBatchHeader.Encode(), nil -} - -// CommitBatch commit the sealed batch. It does nothing if no batch header is sealed. -// It is supposed to be called when the current block is confirmed. -func (e *Executor) CommitBatch(currentBlockBytes []byte, currentTxs tmtypes.Txs, blsDatas []l2node.BlsData) error { - if e.batchingCache.IsEmpty() || e.batchingCache.sealedBatchHeader == nil { // nothing to commit - return nil - } - - // reconstruct current block context - // it is possible that the confirmed current block is different from the existing cached current block context - if !bytes.Equal(currentBlockBytes, e.batchingCache.currentBlockBytes) || - !bytes.Equal(currentTxs.Hash(), e.batchingCache.currentTxsHash) { - e.logger.Info("current block is changed, reconstructing current context...") - if err := e.setCurrentBlock(currentBlockBytes, currentTxs); err != nil { - return err - } - } - - blockContexts, err := e.batchingCache.batchData.Encode() - if err != nil { - return err - } - - curHeight, err := heightFromBCBytes(e.batchingCache.currentBlockBytes) - if err != nil { - return err - } - - var batchSigs []eth.BatchSignature - if !e.devSequencer { - batchSigs, err = e.ConvertBlsDatas(blsDatas) - if err != nil { - return err - } - } - - currentIndex := e.batchingCache.parentBatchHeader.BatchIndex + 1 - - // The batch needs the sequencer set info at the end height of the batch, which is equal to current height - 1. - callOpts := &bind.CallOpts{ - BlockNumber: big.NewInt(int64(curHeight - 1)), - } - sequencerSetBytes, err := e.sequencerCaller.GetSequencerSetBytes(callOpts) - if err != nil { - e.logger.Error("failed to GetSequencerSetBytes", "query at height of", curHeight-1, "error", err) - return err - } - - if err = e.l2Client.CommitBatch(context.Background(), ð.RollupBatch{ - Version: 0, - Index: currentIndex, - Hash: e.batchingCache.sealedBatchHeader.Hash(), - ParentBatchHeader: e.batchingCache.parentBatchHeader.Encode(), - CurrentSequencerSetBytes: sequencerSetBytes, - BlockContexts: blockContexts, - SkippedL1MessageBitmap: e.batchingCache.sealedBatchHeader.SkippedL1MessageBitmap, - PrevStateRoot: e.batchingCache.prevStateRoot, - PostStateRoot: e.batchingCache.postStateRoot, - WithdrawRoot: e.batchingCache.withdrawRoot, - Sidecar: e.batchingCache.sealedSidecar, - }, batchSigs); err != nil { - return err - } - - // update newest batch index - e.metrics.BatchIndex.Set(float64(currentIndex)) - - // commit sealed batch header; move current block into the next batch - e.batchingCache.parentBatchHeader = e.batchingCache.sealedBatchHeader - e.batchingCache.prevStateRoot = e.batchingCache.postStateRoot - e.batchingCache.sealedBatchHeader = nil - e.batchingCache.sealedSidecar = nil - - _, _, totalL1MessagePopped, skippedBitmap, _, err := ParsingTxs(e.batchingCache.currentTxs, e.batchingCache.totalL1MessagePopped, e.batchingCache.totalL1MessagePopped, nil) - if err != nil { - return err - } - e.batchingCache.totalL1MessagePopped = totalL1MessagePopped - e.batchingCache.skippedBitmap = skippedBitmap - e.batchingCache.postStateRoot = e.batchingCache.currentStateRoot - e.batchingCache.withdrawRoot = e.batchingCache.currentWithdrawRoot - e.batchingCache.lastPackedBlockHeight = curHeight - e.batchingCache.batchData = types.NewBatchData() - e.batchingCache.batchData.Append(e.batchingCache.currentBlockContext, e.batchingCache.currentTxsPayload, e.batchingCache.currentL1TxsHashes) - e.batchingCache.ClearCurrent() - - e.logger.Info("Committed batch", "batchIndex", currentIndex) - return nil + return exceeded, err } func (e *Executor) AppendBlsData(height int64, batchHash []byte, data l2node.BlsData) error { @@ -368,7 +218,7 @@ func (e *Executor) PackCurrentBlock(currentBlockBytes []byte, currentTxs tmtypes } } - curHeight, err := heightFromBCBytes(currentBlockBytes) + curHeight, err := types.HeightFromBlockBytes(currentBlockBytes) if err != nil { return err } @@ -376,7 +226,6 @@ func (e *Executor) PackCurrentBlock(currentBlockBytes []byte, currentTxs tmtypes e.batchingCache.batchData = types.NewBatchData() } e.batchingCache.batchData.Append(e.batchingCache.currentBlockContext, e.batchingCache.currentTxsPayload, e.batchingCache.currentL1TxsHashes) - e.batchingCache.skippedBitmap = e.batchingCache.skippedBitmapAfterCurBlock e.batchingCache.totalL1MessagePopped = e.batchingCache.totalL1MessagePoppedAfterCurBlock e.batchingCache.withdrawRoot = e.batchingCache.currentWithdrawRoot e.batchingCache.postStateRoot = e.batchingCache.currentStateRoot @@ -392,7 +241,7 @@ func (e *Executor) BatchHash(batchHeaderBytes []byte) ([]byte, error) { } func (e *Executor) setCurrentBlock(currentBlockBytes []byte, currentTxs tmtypes.Txs) error { - currentTxsPayload, curL1TxsHashes, totalL1MessagePopped, skippedBitmap, l2TxNum, err := ParsingTxs(currentTxs, e.batchingCache.parentBatchHeader.TotalL1MessagePopped, e.batchingCache.totalL1MessagePopped, e.batchingCache.skippedBitmap) + currentTxsPayload, curL1TxsHashes, totalL1MessagePopped, l2TxNum, err := ParsingTxs(currentTxs, e.batchingCache.totalL1MessagePopped) if err != nil { return err } @@ -408,7 +257,6 @@ func (e *Executor) setCurrentBlock(currentBlockBytes []byte, currentTxs tmtypes. e.batchingCache.currentTxs = currentTxs e.batchingCache.currentL1TxsHashes = curL1TxsHashes e.batchingCache.totalL1MessagePoppedAfterCurBlock = totalL1MessagePopped - e.batchingCache.skippedBitmapAfterCurBlock = skippedBitmap e.batchingCache.currentStateRoot = curBlock.StateRoot e.batchingCache.currentWithdrawRoot = curBlock.WithdrawTrieRoot e.batchingCache.currentBlockBytes = currentBlockBytes @@ -416,21 +264,14 @@ func (e *Executor) setCurrentBlock(currentBlockBytes []byte, currentTxs tmtypes. return nil } -func ParsingTxs(transactions tmtypes.Txs, totalL1MessagePoppedBeforeTheBatch, totalL1MessagePoppedBefore uint64, skippedBitmapBefore []*big.Int) (txsPayload []byte, l1TxHashes []common.Hash, totalL1MessagePopped uint64, skippedBitmap []*big.Int, l2TxNum int, err error) { - // the first queue index that belongs to this batch - baseIndex := totalL1MessagePoppedBeforeTheBatch +func ParsingTxs(transactions tmtypes.Txs, totalL1MessagePoppedBefore uint64) (txsPayload []byte, l1TxHashes []common.Hash, totalL1MessagePopped uint64, l2TxNum int, err error) { // the next queue index that we need to process nextIndex := totalL1MessagePoppedBefore - skippedBitmap = make([]*big.Int, len(skippedBitmapBefore)) - for i, bm := range skippedBitmapBefore { - skippedBitmap[i] = new(big.Int).SetBytes(bm.Bytes()) - } - for i, txBz := range transactions { var tx eth.Transaction if err = tx.UnmarshalBinary(txBz); err != nil { - return nil, nil, 0, nil, 0, fmt.Errorf("transaction %d is not valid: %v", i, err) + return nil, nil, 0, 0, fmt.Errorf("transaction %d is not valid: %v", i, err) } if isL1MessageTxType(txBz) { @@ -439,25 +280,7 @@ func ParsingTxs(transactions tmtypes.Txs, totalL1MessagePoppedBeforeTheBatch, to currentIndex := tx.L1MessageQueueIndex() if currentIndex < nextIndex { - return nil, nil, 0, nil, 0, fmt.Errorf("unexpected batch payload, expected queue index: %d, got: %d. transaction hash: %v", nextIndex, currentIndex, tx.Hash()) - } - - // mark skipped messages - for skippedIndex := nextIndex; skippedIndex < currentIndex; skippedIndex++ { - quo := int((skippedIndex - baseIndex) / 256) - rem := int((skippedIndex - baseIndex) % 256) - for len(skippedBitmap) <= quo { - bitmap := big.NewInt(0) - skippedBitmap = append(skippedBitmap, bitmap) - } - skippedBitmap[quo].SetBit(skippedBitmap[quo], rem, 1) - } - - // process included message - quo := int((currentIndex - baseIndex) / 256) - for len(skippedBitmap) <= quo { - bitmap := big.NewInt(0) - skippedBitmap = append(skippedBitmap, bitmap) + return nil, nil, 0, 0, fmt.Errorf("unexpected batch payload, expected queue index: %d, got: %d. transaction hash: %v", nextIndex, currentIndex, tx.Hash()) } nextIndex = currentIndex + 1 @@ -471,7 +294,7 @@ func ParsingTxs(transactions tmtypes.Txs, totalL1MessagePoppedBeforeTheBatch, to return } -func GenesisBatchHeader(genesisHeader *eth.Header) (types.BatchHeader, error) { +func GenesisBatchHeader(genesisHeader *eth.Header) (types.BatchHeaderV0, error) { wb := types.WrappedBlock{ ParentHash: genesisHeader.ParentHash, Miner: genesisHeader.Coinbase, @@ -487,8 +310,7 @@ func GenesisBatchHeader(genesisHeader *eth.Header) (types.BatchHeader, error) { batchData := types.NewBatchData() batchData.Append(blockContext, nil, nil) - return types.BatchHeader{ - Version: 0, + return types.BatchHeaderV0{ BatchIndex: 0, L1MessagePopped: 0, TotalL1MessagePopped: 0, @@ -511,7 +333,9 @@ func (e *Executor) ConvertBlsDatas(blsDatas []l2node.BlsData) (ret []eth.BatchSi } func (e *Executor) ConvertBlsData(blsData l2node.BlsData) (*eth.BatchSignature, error) { - val, found := e.valsByTmKey[[32]byte(blsData.Signer)] + var signer [32]byte + copy(signer[:], blsData.Signer) + val, found := e.valsByTmKey[signer] if !found { return nil, fmt.Errorf("found invalid validator: %x", blsData.Signer) } @@ -524,10 +348,6 @@ func (e *Executor) ConvertBlsData(blsData l2node.BlsData) (*eth.BatchSignature, return &bs, nil } -func heightFromBCBytes(blockBytes []byte) (uint64, error) { - var curBlock = new(types.WrappedBlock) - if err := curBlock.UnmarshalBinary(blockBytes); err != nil { - return 0, err - } - return curBlock.Number, nil +func (e *Executor) isBatchUpgraded(blockTime uint64) bool { + return blockTime >= e.UpgradeBatchTime } diff --git a/node/core/batch_commit.go b/node/core/batch_commit.go new file mode 100644 index 00000000..c0f16176 --- /dev/null +++ b/node/core/batch_commit.go @@ -0,0 +1,113 @@ +package node + +import ( + "bytes" + "context" + "fmt" + "math/big" + "morph-l2/node/types" + + "github.com/morph-l2/go-ethereum/accounts/abi/bind" + eth "github.com/morph-l2/go-ethereum/core/types" + "github.com/tendermint/tendermint/l2node" + tmtypes "github.com/tendermint/tendermint/types" +) + +// CommitBatch commits the sealed batch. It does nothing if no batch header is sealed. +// It should be called when the current block is confirmed. +func (e *Executor) CommitBatch(currentBlockBytes []byte, currentTxs tmtypes.Txs, blsDatas []l2node.BlsData) error { + // If no batch data is available, do nothing + if e.batchingCache.IsEmpty() || e.batchingCache.sealedBatchHeader == nil { + return nil + } + + // Reconstruct current block context if needed + if !bytes.Equal(currentBlockBytes, e.batchingCache.currentBlockBytes) || !bytes.Equal(currentTxs.Hash(), e.batchingCache.currentTxsHash) { + e.logger.Info("Current block has changed. Reconstructing current context...") + if err := e.setCurrentBlock(currentBlockBytes, currentTxs); err != nil { + return fmt.Errorf("failed to set current block: %w", err) + } + } + + // Get current block height + curHeight, err := types.HeightFromBlockBytes(e.batchingCache.currentBlockBytes) + if err != nil { + return fmt.Errorf("failed to parse current block height: %w", err) + } + + // Convert BlsData to batch signatures (if applicable) + var batchSigs []eth.BatchSignature + if !e.devSequencer { + batchSigs, err = e.ConvertBlsDatas(blsDatas) + if err != nil { + return fmt.Errorf("failed to convert BLS data: %w", err) + } + } + + // Get the sequencer set at current height - 1 + callOpts := &bind.CallOpts{BlockNumber: big.NewInt(int64(curHeight - 1))} + sequencerSetBytes, err := e.sequencerCaller.GetSequencerSetBytes(callOpts) + if err != nil { + e.logger.Error("Failed to GetSequencerSetBytes", "blockHeight", curHeight-1, "error", err) + return fmt.Errorf("failed to get sequencer set bytes: %w", err) + } + + // Encode batch data and commit batch to L2 client + blockContexts, err := e.batchingCache.batchData.Encode() + if err != nil { + return fmt.Errorf("failed to encode block contexts: %w", err) + } + + version, err := e.batchingCache.sealedBatchHeader.Version() + if err != nil { + return fmt.Errorf("failed to get batch version: %w", err) + } + + parentBatchIndex, _ := e.batchingCache.parentBatchHeader.BatchIndex() + hash, _ := e.batchingCache.sealedBatchHeader.Hash() + l1MessagePopped, _ := e.batchingCache.sealedBatchHeader.L1MessagePopped() + // Construct the batch and commit it + if err = e.l2Client.CommitBatch(context.Background(), ð.RollupBatch{ + Version: uint(version), + Index: parentBatchIndex + 1, + Hash: hash, + ParentBatchHeader: *e.batchingCache.parentBatchHeader, + CurrentSequencerSetBytes: sequencerSetBytes, + BlockContexts: blockContexts, + PrevStateRoot: e.batchingCache.prevStateRoot, + PostStateRoot: e.batchingCache.postStateRoot, + WithdrawRoot: e.batchingCache.withdrawRoot, + Sidecar: e.batchingCache.sealedSidecar, + LastBlockNumber: e.batchingCache.lastPackedBlockHeight, + NumL1Messages: uint16(l1MessagePopped), + }, batchSigs); err != nil { + return fmt.Errorf("failed to commit batch to L2 client: %w", err) + } + + // Update batch index metric + e.metrics.BatchIndex.Set(float64(parentBatchIndex + 1)) + + // Commit the batch and reset the cache for the next batch + e.commitSealedBatch(curHeight) + + e.logger.Info("Committed batch", "batchIndex", parentBatchIndex+1) + return nil +} + +// commitSealedBatch commits the sealed batch and resets cache for the next batch. +func (e *Executor) commitSealedBatch(curHeight uint64) { + e.batchingCache.parentBatchHeader = e.batchingCache.sealedBatchHeader + e.batchingCache.prevStateRoot = e.batchingCache.postStateRoot + e.batchingCache.sealedBatchHeader = nil + e.batchingCache.sealedSidecar = nil + + e.batchingCache.totalL1MessagePopped = e.batchingCache.totalL1MessagePoppedAfterCurBlock + e.batchingCache.postStateRoot = e.batchingCache.currentStateRoot + e.batchingCache.withdrawRoot = e.batchingCache.currentWithdrawRoot + e.batchingCache.lastPackedBlockHeight = curHeight + + // Reset batch data and current context + e.batchingCache.batchData = types.NewBatchData() + e.batchingCache.batchData.Append(e.batchingCache.currentBlockContext, e.batchingCache.currentTxsPayload, e.batchingCache.currentL1TxsHashes) + e.batchingCache.ClearCurrent() +} diff --git a/node/core/batch_seal.go b/node/core/batch_seal.go new file mode 100644 index 00000000..be02cdfe --- /dev/null +++ b/node/core/batch_seal.go @@ -0,0 +1,151 @@ +package node + +import ( + "errors" + "fmt" + + "morph-l2/node/types" + + "github.com/morph-l2/go-ethereum/common" + eth "github.com/morph-l2/go-ethereum/core/types" +) + +// SealBatch seals the accumulated blocks into a batch. +// It ensures proper compression and data preparation based on the batch version. +// It should be called after CalculateBatchSizeWithProposalBlock which ensure the accumulated blocks is correct. +func (e *Executor) SealBatch() ([]byte, []byte, error) { + // Ensure the batching cache is not empty + if e.batchingCache.IsEmpty() { + return nil, nil, errors.New("failed to seal batch: batch cache is empty") + } + + // Parse the current block from the cache + block, err := types.WrappedBlockFromBytes(e.batchingCache.currentBlockBytes) + if err != nil { + return nil, nil, fmt.Errorf("failed to parse current block: %w", err) + } + + // Compress and get data hash based on batch version + compressedPayload, batchDataHash, err := e.handleBatchSealing(block.Timestamp) + if err != nil { + return nil, nil, err + } + + // Generate sidecar for blob data + sidecar, err := types.MakeBlobTxSidecar(compressedPayload) + if err != nil { + return nil, nil, fmt.Errorf("failed to create blob sidecar: %w", err) + } + + // Retrieve sequencer verification hash + sequencerSetVerifyHash, err := e.sequencerCaller.SequencerSetVerifyHash(nil) + if err != nil { + return nil, nil, fmt.Errorf("failed to get sequencer set verification hash: %w", err) + } + + // Create batch header + batchHeader := e.createBatchHeader(batchDataHash, sidecar, sequencerSetVerifyHash, block.Timestamp) + + // Cache the sealed header and sidecar + e.batchingCache.sealedBatchHeader = &batchHeader + e.batchingCache.sealedSidecar = sidecar + + batchHash, err := batchHeader.Hash() + if err != nil { + return nil, nil, fmt.Errorf("failed to hash sealed batch header: %w", err) + } + // Log information about the sealed batch + e.logSealedBatch(batchHeader, batchHash) + // Return the batch hash and encoded batch header + return batchHash[:], batchHeader, nil +} + +// handleBatchSealing determines which version to use for compression and calculates the data hash. +func (e *Executor) handleBatchSealing(blockTimestamp uint64) ([]byte, common.Hash, error) { + var ( + compressedPayload []byte + batchDataHash common.Hash + err error + ) + + // Check if the batch should use the upgraded version + if e.isBatchUpgraded(blockTimestamp) { + compressedPayload, err = types.CompressBatchBytes(e.batchingCache.batchData.TxsPayloadV2()) + if err != nil { + return nil, common.Hash{}, fmt.Errorf("failed to compress upgraded payload: %w", err) + } + + if len(compressedPayload) <= types.MaxBlobBytesSize { + batchDataHash, err = e.batchingCache.batchData.DataHashV2() + if err != nil { + return nil, common.Hash{}, fmt.Errorf("failed to calculate upgraded data hash: %w", err) + } + return compressedPayload, batchDataHash, nil + } + } + + // Fallback to old version if upgraded is not used + compressedPayload, err = types.CompressBatchBytes(e.batchingCache.batchData.TxsPayload()) + if err != nil { + return nil, common.Hash{}, fmt.Errorf("failed to compress payload: %w", err) + } + batchDataHash = e.batchingCache.batchData.DataHash() + + return compressedPayload, batchDataHash, nil +} + +// createBatchHeader creates a BatchHeader from the given parameters. +func (e *Executor) createBatchHeader(dataHash common.Hash, sidecar *eth.BlobTxSidecar, sequencerSetVerifyHash common.Hash, blockTimestamp uint64) types.BatchHeaderBytes { + blobHashes := []common.Hash{types.EmptyVersionedHash} + if sidecar != nil && len(sidecar.Blobs) > 0 { + blobHashes = sidecar.BlobHashes() + } + + parentBatchHeaderTotalL1, _ := e.batchingCache.parentBatchHeader.TotalL1MessagePopped() + + l1MessagePopped := e.batchingCache.totalL1MessagePopped - parentBatchHeaderTotalL1 + + parentBatchIndex, _ := e.batchingCache.parentBatchHeader.BatchIndex() + parentBatchHash, _ := e.batchingCache.parentBatchHeader.Hash() + batchHeaderV0 := types.BatchHeaderV0{ + BatchIndex: parentBatchIndex + 1, + L1MessagePopped: l1MessagePopped, + TotalL1MessagePopped: e.batchingCache.totalL1MessagePopped, + DataHash: dataHash, + BlobVersionedHash: blobHashes[0], + PrevStateRoot: e.batchingCache.prevStateRoot, + PostStateRoot: e.batchingCache.postStateRoot, + WithdrawalRoot: e.batchingCache.withdrawRoot, + SequencerSetVerifyHash: sequencerSetVerifyHash, + ParentBatchHash: parentBatchHash, + } + if e.isBatchUpgraded(blockTimestamp) { + batchHeaderV1 := types.BatchHeaderV1{ + BatchHeaderV0: batchHeaderV0, + LastBlockNumber: e.batchingCache.lastPackedBlockHeight, + } + return batchHeaderV1.Bytes() + } + + return batchHeaderV0.Bytes() +} + +// logSealedBatch logs the details of the sealed batch for debugging purposes. +func (e *Executor) logSealedBatch(batchHeader types.BatchHeaderBytes, batchHash common.Hash) { + e.logger.Info("Sealed batch header", "batchHash", batchHash.Hex()) + batchIndex, _ := batchHeader.BatchIndex() + l1MessagePopped, _ := batchHeader.L1MessagePopped() + totalL1MessagePopped, _ := batchHeader.TotalL1MessagePopped() + dataHash, _ := batchHeader.DataHash() + parentBatchHash, _ := batchHeader.ParentBatchHash() + e.logger.Info(fmt.Sprintf("===batchIndex: %d \n===L1MessagePopped: %d \n===TotalL1MessagePopped: %d \n===dataHash: %x \n===blockNum: %d \n===ParentBatchHash: %x \n", + batchIndex, + l1MessagePopped, + totalL1MessagePopped, + dataHash, + e.batchingCache.batchData.BlockNum(), + parentBatchHash)) + + blockContexts, _ := e.batchingCache.batchData.Encode() + e.logger.Info(fmt.Sprintf("===blockContexts: %x \n", blockContexts)) +} diff --git a/node/core/config.go b/node/core/config.go index 5457b298..f14d6648 100644 --- a/node/core/config.go +++ b/node/core/config.go @@ -22,6 +22,11 @@ import ( "morph-l2/node/types" ) +var ( + MainnetUpgradeBatchTime uint64 = 2000 + HoleskyUpgradeBatchTime uint64 = 350000 +) + type Config struct { L2 *types.L2Config `json:"l2"` L2CrossDomainMessengerAddress common.Address `json:"cross_domain_messenger_address"` @@ -29,6 +34,7 @@ type Config struct { GovAddress common.Address `json:"gov_address"` L2StakingAddress common.Address `json:"l2staking_address"` MaxL1MessageNumPerBlock uint64 `json:"max_l1_message_num_per_block"` + UpgradeBatchTime uint64 `json:"upgrade_batch_time"` DevSequencer bool `json:"dev_sequencer"` Logger tmlog.Logger `json:"logger"` } @@ -151,5 +157,16 @@ func (c *Config) SetCliContext(ctx *cli.Context) error { c.DevSequencer = ctx.GlobalBool(flags.DevSequencer.Name) } + // setup batch upgrade index + switch { + case ctx.GlobalIsSet(flags.MainnetFlag.Name): + c.UpgradeBatchTime = MainnetUpgradeBatchTime + case ctx.GlobalIsSet(flags.HoleskyFlag.Name): + c.UpgradeBatchTime = HoleskyUpgradeBatchTime + case ctx.GlobalIsSet(flags.UpgradeBatchTime.Name): + c.UpgradeBatchTime = ctx.GlobalUint64(flags.UpgradeBatchTime.Name) + logger.Info("set UpgradeBatchTime: ", ctx.GlobalUint64(flags.UpgradeBatchTime.Name)) + } + return nil } diff --git a/node/core/executor.go b/node/core/executor.go index 27fad542..a7209526 100644 --- a/node/core/executor.go +++ b/node/core/executor.go @@ -51,8 +51,9 @@ type Executor struct { isSequencer bool devSequencer bool - rollupABI *abi.ABI - batchingCache *BatchingCache + UpgradeBatchTime uint64 + rollupABI *abi.ABI + batchingCache *BatchingCache logger tmlog.Logger metrics *Metrics @@ -119,6 +120,7 @@ func NewExecutor(newSyncFunc NewSyncerFunc, config *Config, tmPubKey crypto.PubK devSequencer: config.DevSequencer, rollupABI: rollupAbi, batchingCache: NewBatchingCache(), + UpgradeBatchTime: config.UpgradeBatchTime, logger: logger, metrics: PrometheusMetrics("morphnode"), } @@ -144,7 +146,7 @@ var _ l2node.L2Node = (*Executor)(nil) func (e *Executor) RequestBlockData(height int64) (txs [][]byte, blockMeta []byte, collectedL1Msgs bool, err error) { if e.l1MsgReader == nil { - err = fmt.Errorf("RequestBlockData is not alllowed to be called") + err = fmt.Errorf("RequestBlockData is not allowed to be called") return } e.logger.Info("RequestBlockData request", "height", height) @@ -195,7 +197,6 @@ func (e *Executor) RequestBlockData(height int64) (txs [][]byte, blockMeta []byt NextL1MessageIndex: l2Block.NextL1MessageIndex, Hash: l2Block.Hash, CollectedL1TxHashes: collectedL1TxHashes, - SkippedL1Txs: l2Block.SkippedTxs, } blockMeta, err = wb.MarshalBinary() txs = l2Block.Transactions @@ -207,7 +208,7 @@ func (e *Executor) RequestBlockData(height int64) (txs [][]byte, blockMeta []byt func (e *Executor) CheckBlockData(txs [][]byte, metaData []byte) (valid bool, err error) { if e.l1MsgReader == nil { - return false, fmt.Errorf("RequestBlockData is not alllowed to be called") + return false, fmt.Errorf("RequestBlockData is not allowed to be called") } if len(metaData) == 0 { e.logger.Error("metaData cannot be nil") @@ -239,7 +240,6 @@ func (e *Executor) CheckBlockData(txs [][]byte, metaData []byte) (valid bool, er WithdrawTrieRoot: wrappedBlock.WithdrawTrieRoot, NextL1MessageIndex: wrappedBlock.NextL1MessageIndex, Hash: wrappedBlock.Hash, - SkippedTxs: wrappedBlock.SkippedL1Txs, Transactions: txs, } @@ -306,7 +306,6 @@ func (e *Executor) DeliverBlock(txs [][]byte, metaData []byte, consensusData l2n LogsBloom: wrappedBlock.LogsBloom, WithdrawTrieRoot: wrappedBlock.WithdrawTrieRoot, NextL1MessageIndex: wrappedBlock.NextL1MessageIndex, - SkippedTxs: wrappedBlock.SkippedL1Txs, Hash: wrappedBlock.Hash, Transactions: txs, diff --git a/node/core/l1_message.go b/node/core/l1_message.go index 207f3dfa..83a7ec7c 100644 --- a/node/core/l1_message.go +++ b/node/core/l1_message.go @@ -19,11 +19,10 @@ func (e *Executor) updateNextL1MessageIndex(l2Block *catalyst.ExecutableL2Data) // validateL1Messages has the constraints // 1. all the collected L1 messages belonged to the given L1TxHash are exist. // 2. the collected L1 messages belonged to the given L1TxHash are sequenced correctly. -// 3. the L1 messages from the block.Transactions are sorted correctly(queueIndex increases but does not have to be continuous). +// 3. the L1 messages from the block.Transactions are sorted correctly. // 4. the L1 message from the block.Transactions must be one of the collected L1Messages. // 5. all the L1 messages from the block.Transactions must precede other normal L2 transactions. -// 6. the block.NextL1MessageIndex MUST be greater the queue index of the last involved L1Message in the block. -// 7. the skipped transactions from ExecutableL2Data extracted Must be the same as the ones from Layer1. +// 6. the block.NextL1MessageIndex MUST be equal to the queue index of the last involved L1Message in the block. func (e *Executor) validateL1Messages(block *catalyst.ExecutableL2Data, collectedL1TxHashes []common.Hash) error { nextExpectedIndex := e.nextL1MsgIndex @@ -54,7 +53,6 @@ func (e *Executor) validateL1Messages(block *catalyst.ExecutableL2Data, collecte nextExpectedIndex = e.nextL1MsgIndex L1SectionOver := false - var skipped eth.Transactions // check the L1 messages from block.Transactions for i, txBz := range block.Transactions { if !isL1MessageTxType(txBz) { @@ -74,7 +72,7 @@ func (e *Executor) validateL1Messages(block *catalyst.ExecutableL2Data, collecte currentTxQueueIndex := tx.L1MessageQueueIndex() // constraints 3 - if currentTxQueueIndex < nextExpectedIndex { + if currentTxQueueIndex != nextExpectedIndex { return types.ErrInvalidL1MessageOrder } @@ -96,44 +94,17 @@ func (e *Executor) validateL1Messages(block *catalyst.ExecutableL2Data, collecte e.logger.Error("wrong L1Message content", "index", currentTxQueueIndex) return types.ErrUnknownL1Message } - for queueIndex := nextExpectedIndex; queueIndex < currentTxQueueIndex; queueIndex++ { - skippedTx, ok := cache[queueIndex] - if !ok { - e.logger.Error("lost skipped L1Message collected", "queueIndex", queueIndex) - return types.ErrInvalidSkippedL1Message - } - skipped = append(skipped, skippedTx) - } nextExpectedIndex = currentTxQueueIndex + 1 } // constraints 6 - if block.NextL1MessageIndex < nextExpectedIndex { + if block.NextL1MessageIndex != nextExpectedIndex { e.logger.Error("wrong NextL1MessageIndex in the block", "indexOfLastInvolvedL1Tx", nextExpectedIndex-1, "block.NextL1MessageIndex", block.NextL1MessageIndex) return types.ErrWrongNextL1MessageIndex } - for queueIndex := nextExpectedIndex; queueIndex < block.NextL1MessageIndex; queueIndex++ { - skippedTx, ok := cache[queueIndex] - if !ok { - e.logger.Error("lost skipped L1Message collected", "queueIndex", queueIndex) - return types.ErrInvalidL1Message - } - skipped = append(skipped, skippedTx) - } - // constraints 7 - if len(skipped) != len(block.SkippedTxs) { - e.logger.Error("found wrong number of skipped txs", "expected skippedTx num", len(skipped), "actual", len(block.SkippedTxs)) - return types.ErrInvalidSkippedL1Message - } - for i, skippedTx := range skipped { - if skippedTx.Hash() != block.SkippedTxs[i].Tx.Hash() { - e.logger.Error("found wrong skipped tx hash", "expected skippedTx hash", skippedTx.Hash().Hex(), "actual", block.SkippedTxs[i].Tx.Hash()) - return types.ErrInvalidSkippedL1Message - } - } return nil } diff --git a/node/core/l1_message_test.go b/node/core/l1_message_test.go index cd4ae9a1..d425dbe1 100644 --- a/node/core/l1_message_test.go +++ b/node/core/l1_message_test.go @@ -164,86 +164,26 @@ func TestValidateL1Messages(t *testing.T) { }) t.Run("constraint 6: testing block.NextL1MessageIndex", func(t *testing.T) { - to := common.BigToAddress(big.NewInt(1)) - skippedL1WithIndex10 := eth.L1MessageTx{ - QueueIndex: uint64(10), - Gas: 21000, - To: &to, - Value: big.NewInt(100), - Sender: common.BigToAddress(big.NewInt(int64(10))), - } - l1Message10 := types.L1Message{ - L1TxHash: common.BigToHash(big.NewInt(int64(10))), - L1MessageTx: skippedL1WithIndex10, - } - thisL1Reader := l1Reader.copy() - thisL1Reader.addL1Message(l1Message10) executor := Executor{ nextL1MsgIndex: 0, - l1MsgReader: thisL1Reader, + l1MsgReader: &l1Reader, logger: tmlog.NewTMLogger(tmlog.NewSyncWriter(os.Stdout)), } block := &catalyst.ExecutableL2Data{ - NextL1MessageIndex: 11, + NextL1MessageIndex: 10, Transactions: l1TxBytes, - SkippedTxs: []*eth.SkippedTransaction{ - {Tx: eth.NewTx(&skippedL1WithIndex10)}, - }, } - collectedL1TxHashesCopy := append(collectedL1TxHashes, common.BigToHash(big.NewInt(int64(10)))) - err := executor.validateL1Messages(block, collectedL1TxHashesCopy) + err := executor.validateL1Messages(block, collectedL1TxHashes) require.NoError(t, err) block = &catalyst.ExecutableL2Data{ - NextL1MessageIndex: 9, + NextL1MessageIndex: 11, Transactions: l1TxBytes, } err = executor.validateL1Messages(block, collectedL1TxHashes) require.ErrorIs(t, err, types.ErrWrongNextL1MessageIndex) }) - t.Run("constraint 7: invalid skipped L1 messages", func(t *testing.T) { - executor := Executor{ - nextL1MsgIndex: 0, - l1MsgReader: &l1Reader, - logger: tmlog.NewTMLogger(tmlog.NewSyncWriter(os.Stdout)), - } - - originTxs := block.Transactions[:] - l1TxBytes := make([][]byte, 0) - l1TxBytes = append(append(l1TxBytes, originTxs[:2]...), originTxs[3:]...) - - thisBlock := &catalyst.ExecutableL2Data{ - NextL1MessageIndex: 10, - Transactions: l1TxBytes, - } - - err := executor.validateL1Messages(thisBlock, collectedL1TxHashes) - require.EqualError(t, err, types.ErrInvalidSkippedL1Message.Error()) - - skippedTx := new(eth.Transaction) - err = skippedTx.UnmarshalBinary(originTxs[2]) - require.NoError(t, err) - thisBlock = &catalyst.ExecutableL2Data{ - NextL1MessageIndex: 10, - Transactions: l1TxBytes, - SkippedTxs: []*eth.SkippedTransaction{ - {Tx: skippedTx}, - }, - } - err = executor.validateL1Messages(thisBlock, collectedL1TxHashes) - require.NoError(t, err) - - thisBlock = &catalyst.ExecutableL2Data{ - NextL1MessageIndex: 10, - Transactions: l1TxBytes, - SkippedTxs: []*eth.SkippedTransaction{ - {Tx: skippedTx}, - }, - } - err = executor.validateL1Messages(thisBlock, collectedL1TxHashes) - require.NoError(t, err) - }) } var _ types.L1MessageReader = (*testL1MsgReader)(nil) diff --git a/node/db/keys.go b/node/db/keys.go index 33400922..b0d50ddc 100644 --- a/node/db/keys.go +++ b/node/db/keys.go @@ -3,8 +3,9 @@ package db import "encoding/binary" var ( - syncedL1HeightKey = []byte("LastSyncedL1Height") - L1MessagePrefix = []byte("l1") + syncedL1HeightKey = []byte("LastSyncedL1Height") + L1MessagePrefix = []byte("l1") + BatchBlockNumberPrefix = []byte("batch") derivationL1HeightKey = []byte("LastDerivationL1Height") ) @@ -20,3 +21,8 @@ func encodeEnqueueIndex(index uint64) []byte { func L1MessageKey(enqueueIndex uint64) []byte { return append(L1MessagePrefix, encodeEnqueueIndex(enqueueIndex)...) } + +// BatchBlockNumberKey = BatchBlockNumberKeyPrefix + batchIndex (uint64 big endian) +func BatchBlockNumberKey(batchIndex uint64) []byte { + return append(BatchBlockNumberPrefix, encodeEnqueueIndex(batchIndex)...) +} diff --git a/node/db/store.go b/node/db/store.go index dcabfc09..1a87a227 100644 --- a/node/db/store.go +++ b/node/db/store.go @@ -121,7 +121,6 @@ func (s *Store) ReadL1MessageByIndex(index uint64) *types.L1Message { } return &l1Msg - } func (s *Store) WriteLatestDerivationL1Height(latest uint64) { diff --git a/node/derivation/batch_info.go b/node/derivation/batch_info.go index 8b55ed92..d795092b 100644 --- a/node/derivation/batch_info.go +++ b/node/derivation/batch_info.go @@ -1,16 +1,20 @@ package derivation import ( + "bytes" "encoding/binary" "fmt" + "io" "math/big" "github.com/morph-l2/go-ethereum/common" + "github.com/morph-l2/go-ethereum/common/hexutil" eth "github.com/morph-l2/go-ethereum/core/types" geth "github.com/morph-l2/go-ethereum/eth" "github.com/morph-l2/go-ethereum/eth/catalyst" "morph-l2/node/types" + "morph-l2/node/zstd" ) type BlockContext struct { @@ -53,9 +57,9 @@ type BatchInfo struct { lastBlockNumber uint64 firstBlockNumber uint64 - root common.Hash - withdrawalRoot common.Hash - skippedL1MessageBitmap *big.Int + root common.Hash + withdrawalRoot common.Hash + parentTotalL1MessagePopped uint64 } func (bi *BatchInfo) FirstBlockNumber() uint64 { @@ -76,26 +80,103 @@ func (bi *BatchInfo) TxNum() uint64 { // ParseBatch This method is externally referenced for parsing Batch func (bi *BatchInfo) ParseBatch(batch geth.RPCRollupBatch) error { + if len(batch.Sidecar.Blobs) == 0 { + return fmt.Errorf("blobs length can not be zero") + } + parentBatchHeader := types.BatchHeaderBytes(batch.ParentBatchHeader) + parentBatchIndex, err := parentBatchHeader.BatchIndex() + if err != nil { + return fmt.Errorf("decode batch header index error:%v", err) + } + totalL1MessagePopped, err := parentBatchHeader.TotalL1MessagePopped() + if err != nil { + return fmt.Errorf("decode batch header totalL1MessagePopped error:%v", err) + } + bi.parentTotalL1MessagePopped = totalL1MessagePopped bi.root = batch.PostStateRoot + bi.batchIndex = parentBatchIndex + 1 bi.withdrawalRoot = batch.WithdrawRoot - bi.skippedL1MessageBitmap = new(big.Int).SetBytes(batch.SkippedL1MessageBitmap[:]) bi.version = uint64(batch.Version) tq := newTxQueue() + var rawBlockContexts hexutil.Bytes + var txsData []byte + var blockCount uint64 + if batch.Version > 0 { + parentVersion, err := parentBatchHeader.Version() + if err != nil { + return fmt.Errorf("decode batch header version error:%v", err) + } + if parentVersion == 0 { + blobData, err := types.RetrieveBlobBytes(&batch.Sidecar.Blobs[0]) + if err != nil { + return err + } + batchBytes, err := zstd.DecompressBatchBytes(blobData) + if err != nil { + return fmt.Errorf("decompress batch bytes error:%v", err) + } + var startBlock BlockContext + if err := startBlock.Decode(batchBytes[:60]); err != nil { + return fmt.Errorf("decode chunk block context error:%v", err) + } + blockCount = batch.LastBlockNumber - startBlock.Number + 1 + } else { + parentBatchBlock, err := parentBatchHeader.LastBlockNumber() + if err != nil { + return fmt.Errorf("decode batch header lastBlockNumber error:%v", err) + } + blockCount = batch.LastBlockNumber - parentBatchBlock + } + + } + // If BlockContexts is not nil, the block context should not be included in the blob. + // Therefore, the required length must be zero. + length := blockCount * 60 for _, blob := range batch.Sidecar.Blobs { blobCopy := blob - data, err := types.DecodeTxsFromBlob(&blobCopy) + blobData, err := types.RetrieveBlobBytes(&blobCopy) if err != nil { return err } - tq.enqueue(data) + batchBytes, err := zstd.DecompressBatchBytes(blobData) + if err != nil { + return err + } + reader := bytes.NewReader(batchBytes) + if batch.BlockContexts == nil { + if len(batchBytes) < int(length) { + rawBlockContexts = append(rawBlockContexts, batchBytes...) + length -= uint64(len(batchBytes)) + reader.Reset(nil) + } else { + bcBytes := make([]byte, length) + _, err = reader.Read(bcBytes) + if err != nil { + return fmt.Errorf("read block context error:%s", err.Error()) + } + rawBlockContexts = append(rawBlockContexts, bcBytes...) + length = 0 + } + } + data, err := io.ReadAll(reader) + if err != nil { + return fmt.Errorf("read txBytes error:%s", err.Error()) + } + txsData = append(txsData, data...) } - - blockNum := binary.BigEndian.Uint16(batch.BlockContexts[:2]) - rawBlockContexts := batch.BlockContexts[2:] + if batch.BlockContexts != nil { + blockCount = uint64(binary.BigEndian.Uint16(batch.BlockContexts[:2])) + rawBlockContexts = batch.BlockContexts[2 : 60*blockCount+2] + } + data, err := types.DecodeTxsFromBytes(txsData) + if err != nil { + return err + } + tq.enqueue(data) var txsNum uint64 var l1MsgNum uint64 - blockContexts := make([]*BlockContext, int(blockNum)) - for i := 0; i < int(blockNum); i++ { + blockContexts := make([]*BlockContext, int(blockCount)) + for i := 0; i < int(blockCount); i++ { var block BlockContext if err := block.Decode(rawBlockContexts[i*60 : i*60+60]); err != nil { return fmt.Errorf("decode chunk block context error:%v", err) @@ -103,7 +184,7 @@ func (bi *BatchInfo) ParseBatch(batch geth.RPCRollupBatch) error { if i == 0 { bi.firstBlockNumber = block.Number } - if i == int(blockNum)-1 { + if i == int(blockCount)-1 { bi.lastBlockNumber = block.Number } var safeL2Data catalyst.SafeL2Data @@ -119,11 +200,9 @@ func (bi *BatchInfo) ParseBatch(batch geth.RPCRollupBatch) error { } var txs []*eth.Transaction var err error - if len(batch.Sidecar.Blobs) != 0 { - txs, err = tq.dequeue(int(block.txsNum) - int(block.l1MsgNum)) - if err != nil { - return fmt.Errorf("decode txsPayload error:%v", err) - } + txs, err = tq.dequeue(int(block.txsNum) - int(block.l1MsgNum)) + if err != nil { + return fmt.Errorf("decode txsPayload error:%v", err) } txsNum += uint64(block.txsNum) l1MsgNum += uint64(block.l1MsgNum) @@ -135,7 +214,6 @@ func (bi *BatchInfo) ParseBatch(batch geth.RPCRollupBatch) error { } bi.txNum += txsNum bi.blockContexts = blockContexts - return nil } diff --git a/node/derivation/beacon.go b/node/derivation/beacon.go index ab35a373..d94101d6 100644 --- a/node/derivation/beacon.go +++ b/node/derivation/beacon.go @@ -241,3 +241,35 @@ func dataAndHashesFromTxs(txs types.Transactions, targetTx *types.Transaction) [ } return hashes } + +// Note: ForceGetAllBlobs is defined in derivation.go in the same package + +// GetBlobSidecarsEnhanced is an enhanced version of GetBlobSidecars method, combining two approaches to fetch blob data +// If the first method fails or returns no blobs, it will try the second method +func (cl *L1BeaconClient) GetBlobSidecarsEnhanced(ctx context.Context, ref L1BlockRef, hashes []IndexedBlobHash) ([]*BlobSidecar, error) { + // First try using the original GetBlobSidecars method + blobSidecars, err := cl.GetBlobSidecars(ctx, ref, hashes) + if err != nil || len(blobSidecars) == 0 { + // If failed or no blobs retrieved, try the second method + slotFn, err := cl.GetTimeToSlotFn(ctx) + if err != nil { + return nil, fmt.Errorf("failed to get timeToSlotFn: %w", err) + } + + slot, err := slotFn(ref.Time) + if err != nil { + return nil, fmt.Errorf("failed to calculate slot: %w", err) + } + + // Build request URL and use apiReq method directly + method := fmt.Sprintf("%s%d", sidecarsMethodPrefix, slot) + var blobResp APIGetBlobSidecarsResponse + if err := cl.apiReq(ctx, &blobResp, method); err != nil { + return nil, fmt.Errorf("failed to request blob sidecars: %w", err) + } + + return blobResp.Data, nil + } + + return blobSidecars, nil +} diff --git a/node/derivation/beacon_test.go b/node/derivation/beacon_test.go new file mode 100644 index 00000000..2f79aa0c --- /dev/null +++ b/node/derivation/beacon_test.go @@ -0,0 +1 @@ +package derivation diff --git a/node/derivation/config.go b/node/derivation/config.go index 386a0f2e..439acbc4 100644 --- a/node/derivation/config.go +++ b/node/derivation/config.go @@ -12,6 +12,7 @@ import ( "github.com/morph-l2/go-ethereum/common" "github.com/morph-l2/go-ethereum/common/hexutil" + "github.com/morph-l2/go-ethereum/log" "github.com/morph-l2/go-ethereum/rpc" "github.com/urfave/cli" @@ -36,6 +37,7 @@ type Config struct { BeaconRpc string `json:"beacon_rpc"` RollupContractAddress common.Address `json:"rollup_contract_address"` StartHeight uint64 `json:"start_height"` + BaseHeight uint64 `json:"base_height"` PollInterval time.Duration `json:"poll_interval"` LogProgressInterval time.Duration `json:"log_progress_interval"` FetchBlockRange uint64 `json:"fetch_block_range"` @@ -61,6 +63,11 @@ func (c *Config) SetCliContext(ctx *cli.Context) error { if ctx.GlobalIsSet(flags.L1Confirmations.Name) { c.L1.Confirmations = rpc.BlockNumber(ctx.GlobalInt64(flags.L1Confirmations.Name)) } + // The current setting priority is greater than Env L1Confirmations + if ctx.GlobalIsSet(flags.DerivationConfirmations.Name) { + c.L1.Confirmations = rpc.BlockNumber(ctx.GlobalInt64(flags.DerivationConfirmations.Name)) + log.Warn("derivation confirmations reset to ", c.L1.Confirmations) + } if ctx.GlobalIsSet(flags.RollupContractAddress.Name) { addr := common.HexToAddress(ctx.GlobalString(flags.RollupContractAddress.Name)) c.RollupContractAddress = addr @@ -80,6 +87,10 @@ func (c *Config) SetCliContext(ctx *cli.Context) error { } } + if ctx.GlobalIsSet(flags.DerivationBaseHeight.Name) { + c.BaseHeight = ctx.GlobalUint64(flags.DerivationBaseHeight.Name) + } + if ctx.GlobalIsSet(flags.DerivationPollInterval.Name) { c.PollInterval = ctx.GlobalDuration(flags.DerivationPollInterval.Name) if c.PollInterval == 0 { diff --git a/node/derivation/derivation.go b/node/derivation/derivation.go index ae0beb7a..25afbc0d 100644 --- a/node/derivation/derivation.go +++ b/node/derivation/derivation.go @@ -10,10 +10,13 @@ import ( "time" "github.com/morph-l2/go-ethereum" + "github.com/morph-l2/go-ethereum/accounts/abi" "github.com/morph-l2/go-ethereum/accounts/abi/bind" "github.com/morph-l2/go-ethereum/common" + "github.com/morph-l2/go-ethereum/common/hexutil" eth "github.com/morph-l2/go-ethereum/core/types" "github.com/morph-l2/go-ethereum/crypto" + "github.com/morph-l2/go-ethereum/crypto/kzg4844" geth "github.com/morph-l2/go-ethereum/eth" "github.com/morph-l2/go-ethereum/ethclient" "github.com/morph-l2/go-ethereum/ethclient/authclient" @@ -22,6 +25,7 @@ import ( "morph-l2/bindings/bindings" "morph-l2/bindings/predeploys" + nodecommon "morph-l2/node/common" "morph-l2/node/sync" "morph-l2/node/types" "morph-l2/node/validator" @@ -35,7 +39,7 @@ var ( type Derivation struct { ctx context.Context syncer *sync.Syncer - l1Client DeployContractBackend + l1Client *ethclient.Client RollupContractAddress common.Address confirmations rpc.BlockNumber l2Client *types.RetryableClient @@ -46,11 +50,16 @@ type Derivation struct { l1BeaconClient *L1BeaconClient L2ToL1MessagePasser *bindings.L2ToL1MessagePasser + rollupABI *abi.ABI + legacyRollupABI *abi.ABI // before remove skipMap + beforeMoveBlockCtxABI *abi.ABI + db Database cancel context.CancelFunc startHeight uint64 + baseHeight uint64 fetchBlockRange uint64 pollInterval time.Duration logProgressInterval time.Duration @@ -81,6 +90,18 @@ func NewDerivationClient(ctx context.Context, cfg *Config, syncer *sync.Syncer, if err != nil { return nil, err } + rollupAbi, err := bindings.RollupMetaData.GetAbi() + if err != nil { + return nil, err + } + legacyRollupAbi, err := types.LegacyRollupMetaData.GetAbi() + if err != nil { + return nil, err + } + beforeMoveBlockCtxAbi, err := types.BeforeMoveBlockCtxABI.GetAbi() + if err != nil { + return nil, err + } ctx, cancel := context.WithCancel(ctx) logger = logger.With("module", "derivation") metrics := PrometheusMetrics("morphnode") @@ -102,6 +123,9 @@ func NewDerivationClient(ctx context.Context, cfg *Config, syncer *sync.Syncer, syncer: syncer, validator: validator, rollup: rollup, + rollupABI: rollupAbi, + legacyRollupABI: legacyRollupAbi, + beforeMoveBlockCtxABI: beforeMoveBlockCtxAbi, logger: logger, RollupContractAddress: cfg.RollupContractAddress, confirmations: cfg.L1.Confirmations, @@ -109,6 +133,7 @@ func NewDerivationClient(ctx context.Context, cfg *Config, syncer *sync.Syncer, cancel: cancel, stop: make(chan struct{}), startHeight: cfg.StartHeight, + baseHeight: cfg.BaseHeight, fetchBlockRange: cfg.FetchBlockRange, pollInterval: cfg.PollInterval, logProgressInterval: cfg.LogProgressInterval, @@ -157,7 +182,11 @@ func (d *Derivation) Stop() { func (d *Derivation) derivationBlock(ctx context.Context) { latestDerivation := d.db.ReadLatestDerivationL1Height() - latest := d.syncer.LatestSynced() + latest, err := d.getLatestConfirmedBlockNumber(d.ctx) + if err != nil { + d.logger.Error("get latest block number failed", "err", err) + return + } var start uint64 if latestDerivation == nil { start = d.startHeight @@ -207,6 +236,9 @@ func (d *Derivation) derivationBlock(ctx context.Context) { d.logger.Info("batch derivation complete", "batch_index", batchInfo.batchIndex, "currentBatchEndBlock", lastHeader.Number.Uint64()) d.metrics.SetL2DeriveHeight(lastHeader.Number.Uint64()) d.metrics.SetSyncedBatchIndex(batchInfo.batchIndex) + if lastHeader.Number.Uint64() <= d.baseHeight { + continue + } withdrawalRoot, err := d.L2ToL1MessagePasser.MessageRoot(&bind.CallOpts{ BlockNumber: lastHeader.Number, }) @@ -263,60 +295,100 @@ func (d *Derivation) fetchRollupDataByTxHash(txHash common.Hash, blockNumber uin if pending { return nil, errors.New("pending transaction") } - abi, err := bindings.RollupMetaData.GetAbi() + batch, err := d.UnPackData(tx.Data()) if err != nil { return nil, err } - if !bytes.Equal(abi.Methods["commitBatch"].ID, tx.Data()[:4]) { - return nil, types.ErrNotCommitBatchTx - } - args, err := abi.Methods["commitBatch"].Inputs.Unpack(tx.Data()[4:]) - if err != nil { - return nil, fmt.Errorf("submitBatches Unpack error:%v", err) - } - rollupBatchData := args[0].(struct { - Version uint8 "json:\"version\"" - ParentBatchHeader []uint8 "json:\"parentBatchHeader\"" - BlockContexts []uint8 "json:\"blockContexts\"" - SkippedL1MessageBitmap []uint8 "json:\"skippedL1MessageBitmap\"" - PrevStateRoot [32]uint8 "json:\"prevStateRoot\"" - PostStateRoot [32]uint8 "json:\"postStateRoot\"" - WithdrawalRoot [32]uint8 "json:\"withdrawalRoot\"" - }) - - // query blob - block, err := d.l1Client.BlockByNumber(d.ctx, big.NewInt(int64(blockNumber))) - if err != nil { - return nil, err - } - indexedBlobHashes := dataAndHashesFromTxs(block.Transactions(), tx) + // Get block header to retrieve timestamp header, err := d.l1Client.HeaderByNumber(d.ctx, big.NewInt(int64(blockNumber))) if err != nil { return nil, err } - var bts eth.BlobTxSidecar - if len(indexedBlobHashes) != 0 { - bts, err = d.l1BeaconClient.GetBlobSidecar(context.Background(), L1BlockRef{ + + // Get transaction blob hashes + blobHashes := tx.BlobHashes() + if len(blobHashes) > 0 { + d.logger.Info("Transaction contains blobs", "txHash", txHash, "blobCount", len(blobHashes)) + + // Initialize indexedBlobHashes as nil + var indexedBlobHashes []IndexedBlobHash + + // Only try to build IndexedBlobHash array if not forcing get all blobs + // Try to get the block to build IndexedBlobHash array + block, err := d.l1Client.BlockByNumber(d.ctx, big.NewInt(int64(blockNumber))) + if err == nil { + // Successfully got the block, now build IndexedBlobHash array + d.logger.Info("Building IndexedBlobHash array from block", "blockNumber", blockNumber) + indexedBlobHashes = dataAndHashesFromTxs(block.Transactions(), tx) + d.logger.Info("Built IndexedBlobHash array", "count", len(indexedBlobHashes)) + } else { + d.logger.Info("Failed to get block, will try fetching all blobs", "blockNumber", blockNumber, "error", err) + } + + // Get all blobs corresponding to this timestamp + blobSidecars, err := d.l1BeaconClient.GetBlobSidecarsEnhanced(d.ctx, L1BlockRef{ Time: header.Time, }, indexedBlobHashes) if err != nil { - return nil, fmt.Errorf("getBlockSidecar error:%v", err) + return nil, fmt.Errorf("failed to get blobs, continuing processing:%v", err) } - } + if len(blobSidecars) > 0 { + // Create blob sidecar + var blobTxSidecar eth.BlobTxSidecar + matchedCount := 0 + + // Match blobs + for _, sidecar := range blobSidecars { + var commitment kzg4844.Commitment + copy(commitment[:], sidecar.KZGCommitment[:]) + versionedHash := KZGToVersionedHash(commitment) + + for _, expectedHash := range blobHashes { + if bytes.Equal(versionedHash[:], expectedHash[:]) { + matchedCount++ + d.logger.Info("Found matching blob", "index", sidecar.Index, "hash", versionedHash.Hex()) + + // Decode and process blob data + var blob Blob + b, err := hexutil.Decode(sidecar.Blob) + if err != nil { + d.logger.Error("Failed to decode blob data", "error", err) + continue + } + copy(blob[:], b) + + // Verify blob + if err := VerifyBlobProof(&blob, commitment, kzg4844.Proof(sidecar.KZGProof)); err != nil { + d.logger.Error("Blob verification failed", "error", err) + continue + } + + // Add to sidecar + blobTxSidecar.Blobs = append(blobTxSidecar.Blobs, *blob.KZGBlob()) + blobTxSidecar.Commitments = append(blobTxSidecar.Commitments, commitment) + blobTxSidecar.Proofs = append(blobTxSidecar.Proofs, kzg4844.Proof(sidecar.KZGProof)) + break + } + } + } - batch := geth.RPCRollupBatch{ - Version: uint(rollupBatchData.Version), - ParentBatchHeader: rollupBatchData.ParentBatchHeader, - BlockContexts: rollupBatchData.BlockContexts, - SkippedL1MessageBitmap: rollupBatchData.SkippedL1MessageBitmap, - PrevStateRoot: common.BytesToHash(rollupBatchData.PrevStateRoot[:]), - PostStateRoot: common.BytesToHash(rollupBatchData.PostStateRoot[:]), - WithdrawRoot: common.BytesToHash(rollupBatchData.WithdrawalRoot[:]), - Sidecar: bts, + d.logger.Info("Blob matching results", "matched", matchedCount, "expected", len(blobHashes)) + if matchedCount == 0 { + return nil, fmt.Errorf("no matching versionedHash was found") + } + batch.Sidecar = blobTxSidecar + } else { + return nil, fmt.Errorf("not matched blob,txHash:%v,blockNumber:%v", txHash, blockNumber) + } } - rollupData, err := d.parseBatch(batch) + // Get L2 height + l2Height, err := d.l2Client.BlockNumber(d.ctx) + if err != nil { + return nil, fmt.Errorf("query l2 block number error:%v", err) + } + rollupData, err := d.parseBatch(batch, l2Height) if err != nil { d.logger.Error("parse batch failed", "txNonce", tx.Nonce(), "txHash", txHash, "l1BlockNumber", blockNumber) @@ -328,36 +400,109 @@ func (d *Derivation) fetchRollupDataByTxHash(txHash common.Hash, blockNumber uin return rollupData, nil } -func (d *Derivation) parseBatch(batch geth.RPCRollupBatch) (*BatchInfo, error) { - parentBatchHeader, err := types.DecodeBatchHeader(batch.ParentBatchHeader) - if err != nil { - return nil, fmt.Errorf("decode batch header error:%v", err) +func (d *Derivation) UnPackData(data []byte) (geth.RPCRollupBatch, error) { + var batch geth.RPCRollupBatch + if bytes.Equal(d.beforeMoveBlockCtxABI.Methods["commitBatch"].ID, data[:4]) { + args, err := d.beforeMoveBlockCtxABI.Methods["commitBatch"].Inputs.Unpack(data[4:]) + if err != nil { + return batch, fmt.Errorf("submitBatches Unpack error:%v", err) + } + rollupBatchData := args[0].(struct { + Version uint8 "json:\"version\"" + ParentBatchHeader []uint8 "json:\"parentBatchHeader\"" + BlockContexts []uint8 "json:\"blockContexts\"" + PrevStateRoot [32]uint8 "json:\"prevStateRoot\"" + PostStateRoot [32]uint8 "json:\"postStateRoot\"" + WithdrawalRoot [32]uint8 "json:\"withdrawalRoot\"" + }) + batch = geth.RPCRollupBatch{ + Version: uint(rollupBatchData.Version), + ParentBatchHeader: rollupBatchData.ParentBatchHeader, + BlockContexts: rollupBatchData.BlockContexts, + PrevStateRoot: common.BytesToHash(rollupBatchData.PrevStateRoot[:]), + PostStateRoot: common.BytesToHash(rollupBatchData.PostStateRoot[:]), + WithdrawRoot: common.BytesToHash(rollupBatchData.WithdrawalRoot[:]), + } + } else if bytes.Equal(d.legacyRollupABI.Methods["commitBatch"].ID, data[:4]) { + args, err := d.legacyRollupABI.Methods["commitBatch"].Inputs.Unpack(data[4:]) + if err != nil { + return batch, fmt.Errorf("submitBatches Unpack error:%v", err) + } + rollupBatchData := args[0].(struct { + Version uint8 "json:\"version\"" + ParentBatchHeader []uint8 "json:\"parentBatchHeader\"" + BlockContexts []uint8 "json:\"blockContexts\"" + SkippedL1MessageBitmap []uint8 "json:\"skippedL1MessageBitmap\"" + PrevStateRoot [32]uint8 "json:\"prevStateRoot\"" + PostStateRoot [32]uint8 "json:\"postStateRoot\"" + WithdrawalRoot [32]uint8 "json:\"withdrawalRoot\"" + }) + batch = geth.RPCRollupBatch{ + Version: uint(rollupBatchData.Version), + ParentBatchHeader: rollupBatchData.ParentBatchHeader, + BlockContexts: rollupBatchData.BlockContexts, + PrevStateRoot: common.BytesToHash(rollupBatchData.PrevStateRoot[:]), + PostStateRoot: common.BytesToHash(rollupBatchData.PostStateRoot[:]), + WithdrawRoot: common.BytesToHash(rollupBatchData.WithdrawalRoot[:]), + } + } else if bytes.Equal(d.rollupABI.Methods["commitBatch"].ID, data[:4]) { + args, err := d.rollupABI.Methods["commitBatch"].Inputs.Unpack(data[4:]) + if err != nil { + return batch, fmt.Errorf("submitBatches Unpack error:%v", err) + } + rollupBatchData := args[0].(struct { + Version uint8 "json:\"version\"" + ParentBatchHeader []uint8 "json:\"parentBatchHeader\"" + LastBlockNumber uint64 "json:\"lastBlockNumber\"" + NumL1Messages uint16 "json:\"numL1Messages\"" + PrevStateRoot [32]uint8 "json:\"prevStateRoot\"" + PostStateRoot [32]uint8 "json:\"postStateRoot\"" + WithdrawalRoot [32]uint8 "json:\"withdrawalRoot\"" + }) + batch = geth.RPCRollupBatch{ + Version: uint(rollupBatchData.Version), + ParentBatchHeader: rollupBatchData.ParentBatchHeader, + LastBlockNumber: rollupBatchData.LastBlockNumber, + NumL1Messages: rollupBatchData.NumL1Messages, + PrevStateRoot: common.BytesToHash(rollupBatchData.PrevStateRoot[:]), + PostStateRoot: common.BytesToHash(rollupBatchData.PostStateRoot[:]), + WithdrawRoot: common.BytesToHash(rollupBatchData.WithdrawalRoot[:]), + } + } else { + return batch, types.ErrNotCommitBatchTx } + return batch, nil +} + +func (d *Derivation) parseBatch(batch geth.RPCRollupBatch, l2Height uint64) (*BatchInfo, error) { batchInfo := new(BatchInfo) if err := batchInfo.ParseBatch(batch); err != nil { return nil, fmt.Errorf("parse batch error:%v", err) } - if err := d.handleL1Message(batchInfo, parentBatchHeader.TotalL1MessagePopped); err != nil { + if err := d.handleL1Message(batchInfo, batchInfo.parentTotalL1MessagePopped, l2Height); err != nil { return nil, fmt.Errorf("handle l1 message error:%v", err) } - batchInfo.batchIndex = parentBatchHeader.BatchIndex + 1 return batchInfo, nil } -func (d *Derivation) handleL1Message(rollupData *BatchInfo, parentTotalL1MessagePopped uint64) error { +func (d *Derivation) handleL1Message(rollupData *BatchInfo, parentTotalL1MessagePopped, l2Height uint64) error { totalL1MessagePopped := parentTotalL1MessagePopped for bIndex, block := range rollupData.blockContexts { + // This may happen to nodes started from snapshot, in which case we will no longer handle L1Msg + if block.Number <= l2Height { + continue + } var l1Transactions []*eth.Transaction l1Messages, err := d.getL1Message(totalL1MessagePopped, uint64(block.l1MsgNum)) if err != nil { return fmt.Errorf("get l1 message error:%v", err) } + if len(l1Messages) != int(block.l1MsgNum) { + return fmt.Errorf("invalid l1 msg num,expect %v,have %v", block.l1MsgNum, l1Messages) + } totalL1MessagePopped += uint64(block.l1MsgNum) if len(l1Messages) > 0 { for _, l1Message := range l1Messages { - if rollupData.skippedL1MessageBitmap.Bit(int(l1Message.QueueIndex)-int(parentTotalL1MessagePopped)) == 1 { - continue - } transaction := eth.NewTx(&l1Message.L1MessageTx) l1Transactions = append(l1Transactions, transaction) } @@ -408,3 +553,7 @@ func (d *Derivation) derive(rollupData *BatchInfo) (*eth.Header, error) { return lastHeader, nil } + +func (d *Derivation) getLatestConfirmedBlockNumber(ctx context.Context) (uint64, error) { + return nodecommon.GetLatestConfirmedBlockNumber(ctx, d.l1Client, d.confirmations) +} diff --git a/node/derivation/derivation_test.go b/node/derivation/derivation_test.go index e54a7654..69eb750d 100644 --- a/node/derivation/derivation_test.go +++ b/node/derivation/derivation_test.go @@ -2,36 +2,42 @@ package derivation import ( "testing" + + "github.com/morph-l2/go-ethereum/common/hexutil" + "github.com/stretchr/testify/require" + + "morph-l2/bindings/bindings" + "morph-l2/node/types" +) + +var ( + errorData = "0x92f65af30000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008e0000000000000000000000000000000000000000000000000000000000000098000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000006a02b8abfcc1aa740eb6330093a5ef9c1d09c39672c390926de6db9089554b620322b8abfcc1aa740eb6330093a5ef9c1d09c39672c390926de6db9089554b6203227ae5ba08d7291c96c8cbddcc148bf48a6d68c7974b94356f53754ef6171d75700000000000000000000000000000000000000000000000000000000000006c00000000000000000000000000000000000000000000000000000000000000059000000000000000127000000000000000000000000000000006a5279896e0503ca805ecdb9208afa1ae78e214ceae183cf59fba3a8788e4598b0cd5e7bf4073160681199a5f107e15ec96c350840ebedb522a79c73615037b9000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004b11400000000000015520000000065e43bfb000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015530000000065e43c02000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015540000000065e43c08000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015550000000065e43c0f000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015560000000065e43c15000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015570000000065e43c1c000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015580000000065e43c22000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015590000000065e43c280000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000155a0000000065e43c2f0000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000155b0000000065e43c350000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000155c0000000065e43c3c0000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000155d0000000065e43c420000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000155e0000000065e43c490000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000155f0000000065e43c4f000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015600000000065e43c56000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015610000000065e43c5c000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015620000000065e43c62000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015630000000065e43c69000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015640000000065e43c6f000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015650000000065e43c7600000000000000000000000000000000000000000000000000000000000000000000000000989680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000001656c61193a9eca0201811fc18e071ee949910f696d7464fb3ed32ce9e9f022967f03962fb34c8533f0d01c13e808f4c000000000000000000000000000000000a066efeb662c0804b6c35a0be989a5fbd6a229261b12a176195772febca89e806e3fa2bebe19f95c7491af5afc7334e000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000001656c61193a9eca0201811fc18e071ee949910f696d7464fb3ed32ce9e9f022967f03962fb34c8533f0d01c13e808f4c000000000000000000000000000000000a066efeb662c0804b6c35a0be989a5fbd6a229261b12a176195772febca89e806e3fa2bebe19f95c7491af5afc7334e" + legacyData = "0xd63b3549000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000260292474b44bd10019728c36f474d43e57f666da244f857f10155d3b1df986d37700ba12e4dbe3733969348ffaf757b9225bdc7a3c48a5119f9a31256bbaa206fd6c0ab4151eda56c3b5b3f680e5100a43957ccb5aed62431468c550838e42f6df00000000000000000000000000000000000000000000000000000000000000f9000000000000008a98000000000000000000000000000001fbabd382d81484e2b0dc54e4d50d5767c312cd80d9c333217cc54d2a7395b06e650146a9e49d91463c241819423fac7ffa814a0a04473cace0e7a00b42da68ecd00a75fef5e27def60bbd05a3d76a3ca335df4d182a33e63c7f6c8e7890fe323f2292474b44bd10019728c36f474d43e57f666da244f857f10155d3b1df986d3776c0ab4151eda56c3b5b3f680e5100a43957ccb5aed62431468c550838e42f6dffed06619f2ec164eedb2121c02eda056059e58b8651d8b73785ab73f8aa3a555ac69de82ab218b900846f782176e21f0fa200cd8d8e8a70f64624e80d45d68a800000000000000000000000000000000000000000000000000000000000000000000000000003e000100000000000776ed00000000672b021600000000000000000000000000000000000000000000000000000000000f42400000000001c9c38003f9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000004e4600000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000675cfc328f9f2e79a51e499b2be44462270572fe000000000000000000000000b096665645994775eeba8aa114752d569734dcb40000000000000000000000003a587733d38e5487d2a7e81d84625f25c99ab3a1000000000000000000000000b6346ded94fc61b637763610d0c59846b77810800000000000000000000000000000000000000000000000000000000000000004000000000000000000000000675cfc328f9f2e79a51e499b2be44462270572fe000000000000000000000000b096665645994775eeba8aa114752d569734dcb40000000000000000000000003a587733d38e5487d2a7e81d84625f25c99ab3a1000000000000000000000000b6346ded94fc61b637763610d0c59846b77810800000000000000000000000000000000000000000000000000000000000000004000000000000000000000000b096665645994775eeba8aa114752d569734dcb40000000000000000000000003a587733d38e5487d2a7e81d84625f25c99ab3a1000000000000000000000000675cfc328f9f2e79a51e499b2be44462270572fe000000000000000000000000b6346ded94fc61b637763610d0c59846b778108000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000002c6d7a4e30d442f8d1acdc5068b604b75d1fc37673a07d51e0e56f3cbe28c36fa177a7d490b0147b89dbcc9e496f7d80000000000000000000000000000000001dddd9c85d12fb203286351cd1def0e5e830194ccc8ca494420adaa75db7613bf4cbe61fb316b8df2ec89eeda2b04e1" + beforeMoveBctxData = "0x4a8d544f000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000260292474b44bd10019728c36f474d43e57f666da244f857f10155d3b1df986d37700ba12e4dbe3733969348ffaf757b9225bdc7a3c48a5119f9a31256bbaa206fd6c0ab4151eda56c3b5b3f680e5100a43957ccb5aed62431468c550838e42f6df00000000000000000000000000000000000000000000000000000000000000f9000000000000008a98000000000000000000000000000001fbabd382d81484e2b0dc54e4d50d5767c312cd80d9c333217cc54d2a7395b06e650146a9e49d91463c241819423fac7ffa814a0a04473cace0e7a00b42da68ecd00a75fef5e27def60bbd05a3d76a3ca335df4d182a33e63c7f6c8e7890fe323f2292474b44bd10019728c36f474d43e57f666da244f857f10155d3b1df986d3776c0ab4151eda56c3b5b3f680e5100a43957ccb5aed62431468c550838e42f6dffed06619f2ec164eedb2121c02eda056059e58b8651d8b73785ab73f8aa3a555ac69de82ab218b900846f782176e21f0fa200cd8d8e8a70f64624e80d45d68a800000000000000000000000000000000000000000000000000000000000000000000000000003e000100000000000776ed00000000672b021600000000000000000000000000000000000000000000000000000000000f42400000000001c9c38003f9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000004e4600000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000675cfc328f9f2e79a51e499b2be44462270572fe000000000000000000000000b096665645994775eeba8aa114752d569734dcb40000000000000000000000003a587733d38e5487d2a7e81d84625f25c99ab3a1000000000000000000000000b6346ded94fc61b637763610d0c59846b77810800000000000000000000000000000000000000000000000000000000000000004000000000000000000000000675cfc328f9f2e79a51e499b2be44462270572fe000000000000000000000000b096665645994775eeba8aa114752d569734dcb40000000000000000000000003a587733d38e5487d2a7e81d84625f25c99ab3a1000000000000000000000000b6346ded94fc61b637763610d0c59846b77810800000000000000000000000000000000000000000000000000000000000000004000000000000000000000000b096665645994775eeba8aa114752d569734dcb40000000000000000000000003a587733d38e5487d2a7e81d84625f25c99ab3a1000000000000000000000000675cfc328f9f2e79a51e499b2be44462270572fe000000000000000000000000b6346ded94fc61b637763610d0c59846b778108000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000002c6d7a4e30d442f8d1acdc5068b604b75d1fc37673a07d51e0e56f3cbe28c36fa177a7d490b0147b89dbcc9e496f7d80000000000000000000000000000000001dddd9c85d12fb203286351cd1def0e5e830194ccc8ca494420adaa75db7613bf4cbe61fb316b8df2ec89eeda2b04e1" ) -func TestDecodeBatch(t *testing.T) { - //abi, err := bindings.RollupMetaData.GetAbi() - //require.NoError(t, err) - //hexData := "0x92f65af30000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008e0000000000000000000000000000000000000000000000000000000000000098000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000006a02b8abfcc1aa740eb6330093a5ef9c1d09c39672c390926de6db9089554b620322b8abfcc1aa740eb6330093a5ef9c1d09c39672c390926de6db9089554b6203227ae5ba08d7291c96c8cbddcc148bf48a6d68c7974b94356f53754ef6171d75700000000000000000000000000000000000000000000000000000000000006c00000000000000000000000000000000000000000000000000000000000000059000000000000000127000000000000000000000000000000006a5279896e0503ca805ecdb9208afa1ae78e214ceae183cf59fba3a8788e4598b0cd5e7bf4073160681199a5f107e15ec96c350840ebedb522a79c73615037b9000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004b11400000000000015520000000065e43bfb000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015530000000065e43c02000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015540000000065e43c08000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015550000000065e43c0f000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015560000000065e43c15000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015570000000065e43c1c000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015580000000065e43c22000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015590000000065e43c280000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000155a0000000065e43c2f0000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000155b0000000065e43c350000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000155c0000000065e43c3c0000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000155d0000000065e43c420000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000155e0000000065e43c490000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000155f0000000065e43c4f000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015600000000065e43c56000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015610000000065e43c5c000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015620000000065e43c62000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015630000000065e43c69000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015640000000065e43c6f000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015650000000065e43c7600000000000000000000000000000000000000000000000000000000000000000000000000989680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000001656c61193a9eca0201811fc18e071ee949910f696d7464fb3ed32ce9e9f022967f03962fb34c8533f0d01c13e808f4c000000000000000000000000000000000a066efeb662c0804b6c35a0be989a5fbd6a229261b12a176195772febca89e806e3fa2bebe19f95c7491af5afc7334e000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000001656c61193a9eca0201811fc18e071ee949910f696d7464fb3ed32ce9e9f022967f03962fb34c8533f0d01c13e808f4c000000000000000000000000000000000a066efeb662c0804b6c35a0be989a5fbd6a229261b12a176195772febca89e806e3fa2bebe19f95c7491af5afc7334e" - //txData, err := hexutil.Decode(hexData) - //require.NoError(t, err) - //args, err := abi.Methods["commitBatch"].Inputs.Unpack(txData[4:]) - //require.NoError(t, err) - //rollupBatchData := args[0].(struct { - // Version uint8 "json:\"version\"" - // ParentBatchHeader []uint8 "json:\"parentBatchHeader\"" - // BlockContexts []uint8 "json:\"blockContexts\"" - // SkippedL1MessageBitmap []uint8 "json:\"skippedL1MessageBitmap\"" - // PrevStateRoot [32]uint8 "json:\"prevStateRoot\"" - // PostStateRoot [32]uint8 "json:\"postStateRoot\"" - // WithdrawalRoot [32]uint8 "json:\"withdrawalRoot\"" - //}) - // - //batch := eth.RPCRollupBatch{ - // Version: uint(rollupBatchData.Version), - // ParentBatchHeader: rollupBatchData.ParentBatchHeader, - // BlockContexts: rollupBatchData.BlockContexts, - // SkippedL1MessageBitmap: rollupBatchData.SkippedL1MessageBitmap, - // PrevStateRoot: common.BytesToHash(rollupBatchData.PrevStateRoot[:]), - // PostStateRoot: common.BytesToHash(rollupBatchData.PostStateRoot[:]), - // WithdrawRoot: common.BytesToHash(rollupBatchData.WithdrawalRoot[:]), - //} - //batchInfo := new(BatchInfo) - //err = batchInfo.ParseBatch(batch) - //require.NoError(t, err) +func TestUnPackData(t *testing.T) { + rollupAbi, err := bindings.RollupMetaData.GetAbi() + require.NoError(t, err) + legacyRollupAbi, err := types.LegacyRollupMetaData.GetAbi() + require.NoError(t, err) + beforeMoveBlockCtxABI, err := types.BeforeMoveBlockCtxABI.GetAbi() + require.NoError(t, err) + d := Derivation{ + rollupABI: rollupAbi, + legacyRollupABI: legacyRollupAbi, + beforeMoveBlockCtxABI: beforeMoveBlockCtxABI, + } + errorTxData, err := hexutil.Decode(errorData) + require.NoError(t, err) + _, err = d.UnPackData(errorTxData) + require.Error(t, err) + legacyTxData, err := hexutil.Decode(legacyData) + require.NoError(t, err) + _, err = d.UnPackData(legacyTxData) + require.NoError(t, err) + beforeMoveBctxTxData, err := hexutil.Decode(beforeMoveBctxData) + require.NoError(t, err) + _, err = d.UnPackData(beforeMoveBctxTxData) + require.NoError(t, err) } diff --git a/node/flags/flags.go b/node/flags/flags.go index 7867b509..7ea7c21b 100644 --- a/node/flags/flags.go +++ b/node/flags/flags.go @@ -170,6 +170,12 @@ var ( EnvVar: prefixEnvVar("VALIDATOR"), } + ChallengeEnable = cli.BoolFlag{ + Name: "validator.challengeEnable", + Usage: "Enable the validator challenge", + EnvVar: prefixEnvVar("VALIDATOR_CHALLENGE_ENABLE"), + } + // validator ValidatorPrivateKey = cli.StringFlag{ Name: "validator.privateKey", @@ -190,6 +196,12 @@ var ( EnvVar: prefixEnvVar("DERIVATION_START_HEIGHT"), } + DerivationBaseHeight = cli.Uint64Flag{ + Name: "derivation.baseHeight", + Usage: "The starting height of l2 derive, usually the node snapshot or other trusted starting height, before which stateRoot will not be checked", + EnvVar: prefixEnvVar("DERIVATION_BASE_HEIGHT"), + } + DerivationPollInterval = cli.DurationFlag{ Name: "derivation.pollInterval", Usage: "Frequency at which we query for rollup data", @@ -207,6 +219,27 @@ var ( Usage: "Number of blocks that we collect in a single eth_getLogs query", EnvVar: prefixEnvVar("DERIVATION_FETCH_BLOCK_RANGE"), } + + // Batch rules + UpgradeBatchTime = cli.Uint64Flag{ + Name: "upgrade.batchTime", + Usage: "Batch index at which the sequencers start to upgrade the batch format", + EnvVar: prefixEnvVar("UPGRADE_BATCH_TIME"), + } + MainnetFlag = cli.BoolFlag{ + Name: "mainnet", + Usage: "Morph mainnet", + } + HoleskyFlag = cli.BoolFlag{ + Name: "holesky", + Usage: "Morph Holesky", + } + + DerivationConfirmations = cli.Int64Flag{ + Name: "derivation.confirmations", + Usage: "The number of confirmations needed on L1 for finalization. If not set, the default value is l1.confirmations", + EnvVar: prefixEnvVar("DERIVATION_CONFIRMATIONS"), + } // Logger LogLevel = &cli.StringFlag{ Name: "log.level", @@ -294,6 +327,7 @@ var Flags = []cli.Flag{ TendermintConfigPath, MockEnabled, ValidatorEnable, + ChallengeEnable, // validator ValidatorPrivateKey, @@ -301,11 +335,18 @@ var Flags = []cli.Flag{ // derivation RollupContractAddress, DerivationStartHeight, + DerivationBaseHeight, DerivationPollInterval, DerivationLogProgressInterval, DerivationFetchBlockRange, + DerivationConfirmations, L1BeaconAddr, + // batch rules + UpgradeBatchTime, + MainnetFlag, + HoleskyFlag, + // logger LogLevel, LogFormat, diff --git a/node/go.mod b/node/go.mod index 2ffdd757..b28269b8 100644 --- a/node/go.mod +++ b/node/go.mod @@ -2,7 +2,7 @@ module morph-l2/node go 1.22 -replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3.1 +replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3.2 require ( github.com/cenkalti/backoff/v4 v4.1.3 @@ -10,7 +10,7 @@ require ( github.com/hashicorp/go-multierror v1.1.1 github.com/hashicorp/golang-lru v1.0.2 github.com/klauspost/compress v1.17.9 - github.com/morph-l2/go-ethereum v1.10.14-0.20241021080617-0ff2a10a9625 + github.com/morph-l2/go-ethereum v1.10.14-0.20250424011308-f42440d1ace1 github.com/prometheus/client_golang v1.17.0 github.com/spf13/viper v1.13.0 github.com/stretchr/testify v1.9.0 diff --git a/node/go.sum b/node/go.sum index 452bdc25..b2b21adf 100644 --- a/node/go.sum +++ b/node/go.sum @@ -360,10 +360,10 @@ github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqky github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/morph-l2/go-ethereum v1.10.14-0.20241021080617-0ff2a10a9625 h1:4+cbRSS4lacSIC81RXxvA04UHhGVC4SHVn+bKeqhPSM= -github.com/morph-l2/go-ethereum v1.10.14-0.20241021080617-0ff2a10a9625/go.mod h1:sMJCfHOBzVRDkM2yF/Hy+oUk2rgC0CQZHTLs0cyzhhk= -github.com/morph-l2/tendermint v0.3.1 h1:yqyM3/p9sCNmFSsIFeIxS5RBgXHWqbtyNHx16I9cIZ0= -github.com/morph-l2/tendermint v0.3.1/go.mod h1:TtCzp9l6Z6yDUiwv3TbqKqw8Q8RKp3fSz5+adO1/Y8w= +github.com/morph-l2/go-ethereum v1.10.14-0.20250424011308-f42440d1ace1 h1:Mtl4361Zdc8w3SgCI7L/NuPeLaVdX1L/uP/D4ur/9Yw= +github.com/morph-l2/go-ethereum v1.10.14-0.20250424011308-f42440d1ace1/go.mod h1:sMJCfHOBzVRDkM2yF/Hy+oUk2rgC0CQZHTLs0cyzhhk= +github.com/morph-l2/tendermint v0.3.2 h1:Gu6Uj2G6c3YP2NAKFi7A46JZaOCdD4zfZDKCjt0pDm8= +github.com/morph-l2/tendermint v0.3.2/go.mod h1:TtCzp9l6Z6yDUiwv3TbqKqw8Q8RKp3fSz5+adO1/Y8w= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= diff --git a/node/types/batch.go b/node/types/batch.go index 19058cef..c9746dfc 100644 --- a/node/types/batch.go +++ b/node/types/batch.go @@ -6,91 +6,25 @@ import ( "morph-l2/node/zstd" + "github.com/morph-l2/go-ethereum/accounts/abi/bind" "github.com/morph-l2/go-ethereum/common" - "github.com/morph-l2/go-ethereum/common/hexutil" "github.com/morph-l2/go-ethereum/crypto" ) -var EmptyVersionedHash = common.HexToHash("0x010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014") - -type BatchHeader struct { - // Encoded in BatchHeaderV0Codec - Version uint8 - BatchIndex uint64 - L1MessagePopped uint64 - TotalL1MessagePopped uint64 - DataHash common.Hash - BlobVersionedHash common.Hash - PrevStateRoot common.Hash - PostStateRoot common.Hash - WithdrawalRoot common.Hash - SequencerSetVerifyHash common.Hash - ParentBatchHash common.Hash - SkippedL1MessageBitmap hexutil.Bytes - - //cache - EncodedBytes hexutil.Bytes -} - -// Encode encodes the BatchHeader into RollupV2 BatchHeaderV0Codec Encoding. -func (b *BatchHeader) Encode() []byte { - if len(b.EncodedBytes) > 0 { - return b.EncodedBytes - } - batchBytes := make([]byte, 249+len(b.SkippedL1MessageBitmap)) - batchBytes[0] = b.Version - binary.BigEndian.PutUint64(batchBytes[1:], b.BatchIndex) - binary.BigEndian.PutUint64(batchBytes[9:], b.L1MessagePopped) - binary.BigEndian.PutUint64(batchBytes[17:], b.TotalL1MessagePopped) - copy(batchBytes[25:], b.DataHash[:]) - copy(batchBytes[57:], b.BlobVersionedHash[:]) - copy(batchBytes[89:], b.PrevStateRoot[:]) - copy(batchBytes[121:], b.PostStateRoot[:]) - copy(batchBytes[153:], b.WithdrawalRoot[:]) - copy(batchBytes[185:], b.SequencerSetVerifyHash[:]) - copy(batchBytes[217:], b.ParentBatchHash[:]) - copy(batchBytes[249:], b.SkippedL1MessageBitmap[:]) - b.EncodedBytes = batchBytes - return batchBytes -} - -// Hash calculates the hash of the batch header. -func (b *BatchHeader) Hash() common.Hash { - if len(b.EncodedBytes) == 0 { - b.Encode() - } - - return crypto.Keccak256Hash(b.EncodedBytes) -} - -// DecodeBatchHeader attempts to decode the given byte slice into a BatchHeader. -func DecodeBatchHeader(data []byte) (BatchHeader, error) { - if len(data) < 249 { - return BatchHeader{}, fmt.Errorf("insufficient data for BatchHeader") +var ( + EmptyVersionedHash = common.HexToHash("0x010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014") + LegacyRollupMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_chainID\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ErrZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorIncorrectBatchLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorNoBlockInBatch\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"string\",\"name\":\"res\",\"type\":\"string\"}],\"name\":\"ChallengeRes\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ChallengeRewardClaim\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"batchIndex\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"challengeDeposit\",\"type\":\"uint256\"}],\"name\":\"ChallengeState\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"name\":\"CommitBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"withdrawRoot\",\"type\":\"bytes32\"}],\"name\":\"FinalizeBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ProveRemainingClaimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"name\":\"RevertBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"}],\"name\":\"UpdateChallenger\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldPeriod\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPeriod\",\"type\":\"uint256\"}],\"name\":\"UpdateFinalizationPeriodSeconds\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldPercent\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPercent\",\"type\":\"uint256\"}],\"name\":\"UpdateProofRewardPercent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldWindow\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newWindow\",\"type\":\"uint256\"}],\"name\":\"UpdateProofWindow\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldVerifier\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newVerifier\",\"type\":\"address\"}],\"name\":\"UpdateVerifier\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"LAYER_2_CHAIN_ID\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__maxNumTxInChunk\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"addChallenger\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"batchChallengeReward\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batchChallenged\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchChallengedSuccess\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchDataStore\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"originTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"finalizeTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"signedSequencersBitmap\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchExist\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchInChallenge\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchInsideChallengeWindow\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"batchIndex\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"_batchHash\",\"type\":\"bytes32\"}],\"name\":\"challengeState\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"challenges\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"batchIndex\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"challengeDeposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"challengeSuccess\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"finished\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"claimProveRemaining\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"claimReward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"parentBatchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blockContexts\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"skippedL1MessageBitmap\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"prevStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"postStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"withdrawalRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structIRollup.BatchDataInput\",\"name\":\"batchDataInput\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"signedSequencersBitmap\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"sequencerSets\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"structIRollup.BatchSignatureInput\",\"name\":\"batchSignatureInput\",\"type\":\"tuple\"}],\"name\":\"commitBatch\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"committedBatches\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"finalizationPeriodSeconds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"}],\"name\":\"finalizeBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"finalizedStateRoots\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"}],\"name\":\"importGenesisBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"inChallenge\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1StakingContract\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_messageQueue\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_verifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_finalizationPeriodSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_proofWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_proofRewardPercent\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"}],\"name\":\"isBatchFinalized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"challengerAddress\",\"type\":\"address\"}],\"name\":\"isChallenger\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isChallenger\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1StakingContract\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastCommittedBatchIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastFinalizedBatchIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageQueue\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proofRewardPercent\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proofWindow\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proveRemaining\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_batchProof\",\"type\":\"bytes\"}],\"name\":\"proveState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"removeChallenger\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_count\",\"type\":\"uint256\"}],\"name\":\"revertBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"revertReqIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_status\",\"type\":\"bool\"}],\"name\":\"setPause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newPeriod\",\"type\":\"uint256\"}],\"name\":\"updateFinalizePeriodSeconds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newWindow\",\"type\":\"uint256\"}],\"name\":\"updateProofWindow\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newProofRewardPercent\",\"type\":\"uint256\"}],\"name\":\"updateRewardPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newVerifier\",\"type\":\"address\"}],\"name\":\"updateVerifier\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"verifier\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"withdrawalRoot\",\"type\":\"bytes32\"}],\"name\":\"withdrawalRoots\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"exist\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", } - b := BatchHeader{ - Version: data[0], - - BatchIndex: binary.BigEndian.Uint64(data[1:9]), - L1MessagePopped: binary.BigEndian.Uint64(data[9:17]), - TotalL1MessagePopped: binary.BigEndian.Uint64(data[17:25]), - DataHash: common.BytesToHash(data[25:57]), - BlobVersionedHash: common.BytesToHash(data[57:89]), - PrevStateRoot: common.BytesToHash(data[89:121]), - PostStateRoot: common.BytesToHash(data[121:153]), - WithdrawalRoot: common.BytesToHash(data[153:185]), - SequencerSetVerifyHash: common.BytesToHash(data[185:217]), - ParentBatchHash: common.BytesToHash(data[217:249]), - SkippedL1MessageBitmap: data[249:], - - EncodedBytes: data, + BeforeMoveBlockCtxABI = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_chainID\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ErrZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorIncorrectBatchLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorNoBlockInBatch\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"string\",\"name\":\"res\",\"type\":\"string\"}],\"name\":\"ChallengeRes\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ChallengeRewardClaim\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"batchIndex\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"challengeDeposit\",\"type\":\"uint256\"}],\"name\":\"ChallengeState\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"name\":\"CommitBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"withdrawRoot\",\"type\":\"bytes32\"}],\"name\":\"FinalizeBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ProveRemainingClaimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"name\":\"RevertBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"}],\"name\":\"UpdateChallenger\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldPeriod\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPeriod\",\"type\":\"uint256\"}],\"name\":\"UpdateFinalizationPeriodSeconds\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldPercent\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPercent\",\"type\":\"uint256\"}],\"name\":\"UpdateProofRewardPercent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldWindow\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newWindow\",\"type\":\"uint256\"}],\"name\":\"UpdateProofWindow\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldVerifier\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newVerifier\",\"type\":\"address\"}],\"name\":\"UpdateVerifier\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"LAYER_2_CHAIN_ID\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__maxNumTxInChunk\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"addChallenger\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"batchChallengeReward\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batchChallenged\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchChallengedSuccess\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchDataStore\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"originTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"finalizeTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"signedSequencersBitmap\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchExist\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchInChallenge\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchInsideChallengeWindow\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"batchIndex\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"_batchHash\",\"type\":\"bytes32\"}],\"name\":\"challengeState\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"challenges\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"batchIndex\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"challengeDeposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"challengeSuccess\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"finished\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"claimProveRemaining\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"claimReward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"parentBatchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blockContexts\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"prevStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"postStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"withdrawalRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structIRollup.BatchDataInput\",\"name\":\"batchDataInput\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"signedSequencersBitmap\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"sequencerSets\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"structIRollup.BatchSignatureInput\",\"name\":\"batchSignatureInput\",\"type\":\"tuple\"}],\"name\":\"commitBatch\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"committedBatches\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"committedStateRoots\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"finalizationPeriodSeconds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"}],\"name\":\"finalizeBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"finalizedStateRoots\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"}],\"name\":\"importGenesisBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"inChallenge\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1StakingContract\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_messageQueue\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_verifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_finalizationPeriodSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_proofWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_proofRewardPercent\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"_prevStateRoot\",\"type\":\"bytes32\"}],\"name\":\"initialize2\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"}],\"name\":\"isBatchFinalized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"challengerAddress\",\"type\":\"address\"}],\"name\":\"isChallenger\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isChallenger\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1StakingContract\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastCommittedBatchIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastFinalizedBatchIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageQueue\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proofRewardPercent\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proofWindow\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proveRemaining\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_batchProof\",\"type\":\"bytes\"}],\"name\":\"proveState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"removeChallenger\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_count\",\"type\":\"uint256\"}],\"name\":\"revertBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"revertReqIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_status\",\"type\":\"bool\"}],\"name\":\"setPause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newPeriod\",\"type\":\"uint256\"}],\"name\":\"updateFinalizePeriodSeconds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newWindow\",\"type\":\"uint256\"}],\"name\":\"updateProofWindow\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newProofRewardPercent\",\"type\":\"uint256\"}],\"name\":\"updateRewardPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newVerifier\",\"type\":\"address\"}],\"name\":\"updateVerifier\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"verifier\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"withdrawalRoot\",\"type\":\"bytes32\"}],\"name\":\"withdrawalRoots\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"exist\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", } - return b, nil -} +) type BatchData struct { blockContexts []byte l1TxHashes []byte + l1TxNum uint16 blockNum uint16 txsPayload []byte @@ -115,6 +49,7 @@ func (cks *BatchData) Append(blockContext, txsPayload []byte, l1TxHashes []commo for _, txHash := range l1TxHashes { cks.l1TxHashes = append(cks.l1TxHashes, txHash.Bytes()...) } + cks.l1TxNum += uint16(len(l1TxHashes)) } // Encode encodes the data into bytes @@ -154,10 +89,47 @@ func (cks *BatchData) DataHash() common.Hash { return crypto.Keccak256Hash(bz) } +// DataHashV2 computes the Keccak-256 hash of the batch data, incorporating +// the last block height, L1 transaction count, and L1 transaction hashes. +func (cks *BatchData) DataHashV2() (common.Hash, error) { + // Validate blockContexts length + if len(cks.blockContexts) < 60 { + return common.Hash{}, fmt.Errorf("blockContexts too short, length: %d", len(cks.blockContexts)) + } + + // Extract the last 60 bytes + lastBlockContext := cks.blockContexts[len(cks.blockContexts)-60:] + + // Parse block height + height, err := HeightFromBlockContextBytes(lastBlockContext) + if err != nil { + return common.Hash{}, fmt.Errorf("failed to parse blockContext: context length=%d, lastBlockContext=%x, err=%w", + len(cks.blockContexts), lastBlockContext, err) + } + + // Compute the hash + return cks.calculateHash(height), nil +} + +func (cks *BatchData) calculateHash(height uint64) common.Hash { + // Preallocate memory for efficiency + hashData := make([]byte, 8+2+len(cks.l1TxHashes)) // 8 bytes for height, 2 bytes for l1TxNum + copy(hashData[:8], Uint64ToBigEndianBytes(height)) + copy(hashData[8:10], Uint16ToBigEndianBytes(cks.l1TxNum)) + copy(hashData[10:], cks.l1TxHashes) + + return crypto.Keccak256Hash(hashData) +} + func (cks *BatchData) TxsPayload() []byte { return cks.txsPayload } +// TxsPayloadV2 returns the bytes combining the block contexts with the tx payload +func (cks *BatchData) TxsPayloadV2() []byte { + return append(cks.blockContexts, cks.txsPayload...) +} + func (cks *BatchData) BlockNum() uint16 { return cks.blockNum } func (cks *BatchData) EstimateCompressedSizeWithNewPayload(txPayload []byte) (bool, error) { @@ -171,3 +143,28 @@ func (cks *BatchData) EstimateCompressedSizeWithNewPayload(txPayload []byte) (bo } return len(compressed) > MaxBlobBytesSize, nil } + +func (cks *BatchData) combinePayloads(newBlockContext, newTxPayload []byte) []byte { + totalLength := len(cks.blockContexts) + len(newBlockContext) + len(cks.txsPayload) + len(newTxPayload) + combined := make([]byte, totalLength) + copy(combined, cks.blockContexts) + copy(combined[len(cks.blockContexts):], newBlockContext) + copy(combined[len(cks.blockContexts)+len(newBlockContext):], cks.txsPayload) + copy(combined[len(cks.blockContexts)+len(newBlockContext)+len(cks.txsPayload):], newTxPayload) + return combined +} + +// WillExceedCompressedSizeLimit checks if the size of the combined block contexts +// and transaction payloads (after compression) exceeds the maximum allowed size. +func (cks *BatchData) WillExceedCompressedSizeLimit(newBlockContext, newTxPayload []byte) (bool, error) { + // Combine the existing and new block contexts and transaction payloads + combinedBytes := cks.combinePayloads(newBlockContext, newTxPayload) + if len(combinedBytes) <= MaxBlobBytesSize { + return false, nil + } + compressed, err := zstd.CompressBatchBytes(combinedBytes) + if err != nil { + return false, fmt.Errorf("compression failed: %w", err) + } + return len(compressed) > MaxBlobBytesSize, nil +} diff --git a/node/types/batch_header.go b/node/types/batch_header.go new file mode 100644 index 00000000..d8832a7e --- /dev/null +++ b/node/types/batch_header.go @@ -0,0 +1,215 @@ +package types + +import ( + "encoding/binary" + "errors" + + "github.com/morph-l2/go-ethereum/common" + "github.com/morph-l2/go-ethereum/common/hexutil" + "github.com/morph-l2/go-ethereum/crypto" +) + +type ( + BatchHeaderBytes []byte +) + +const ( + expectedLengthV0 = 249 + expectedLengthV1 = 257 + + BatchHeaderVersion0 = 0 + BatchHeaderVersion1 = 1 +) + +var ( + ErrInvalidBatchHeaderLength = errors.New("invalid BatchHeaderBytes length") + ErrInvalidBatchHeaderVersion = errors.New("invalid BatchHeaderBytes version") + ErrEmptyBatchHeaderBytes = errors.New("empty BatchHeaderBytes") + ErrNotFoundInBatchHeader = errors.New("not found in BatchHeaderBytes") +) + +func (b BatchHeaderBytes) validate() error { + version, err := b.Version() + if err != nil { + return err + } + switch version { + case BatchHeaderVersion0: + if len(b) != expectedLengthV0 { + return ErrInvalidBatchHeaderLength + } + case BatchHeaderVersion1: + if len(b) != expectedLengthV1 { + return ErrInvalidBatchHeaderLength + } + default: + return ErrInvalidBatchHeaderVersion + } + return nil +} + +func (b BatchHeaderBytes) Bytes() []byte { + return b[:] +} + +func (b BatchHeaderBytes) Hash() (common.Hash, error) { + if err := b.validate(); err != nil { + return common.Hash{}, err + } + return crypto.Keccak256Hash(b), nil +} + +func (b BatchHeaderBytes) Version() (uint8, error) { + if len(b) == 0 { + return 0, ErrEmptyBatchHeaderBytes + } + return b[0], nil +} + +func (b BatchHeaderBytes) BatchIndex() (uint64, error) { + if err := b.validate(); err != nil { + return 0, err + } + return binary.BigEndian.Uint64(b[1:9]), nil +} + +func (b BatchHeaderBytes) L1MessagePopped() (uint64, error) { + if err := b.validate(); err != nil { + return 0, err + } + return binary.BigEndian.Uint64(b[9:17]), nil +} + +func (b BatchHeaderBytes) TotalL1MessagePopped() (uint64, error) { + if err := b.validate(); err != nil { + return 0, err + } + return binary.BigEndian.Uint64(b[17:25]), nil +} + +func (b BatchHeaderBytes) DataHash() (common.Hash, error) { + if err := b.validate(); err != nil { + return common.Hash{}, err + } + return common.BytesToHash(b[25:57]), nil +} + +func (b BatchHeaderBytes) BlobVersionedHash() (common.Hash, error) { + if err := b.validate(); err != nil { + return common.Hash{}, err + } + return common.BytesToHash(b[57:89]), nil +} + +func (b BatchHeaderBytes) PrevStateRoot() (common.Hash, error) { + if err := b.validate(); err != nil { + return common.Hash{}, err + } + return common.BytesToHash(b[89:121]), nil +} + +func (b BatchHeaderBytes) PostStateRoot() (common.Hash, error) { + if err := b.validate(); err != nil { + return common.Hash{}, err + } + return common.BytesToHash(b[121:153]), nil +} + +func (b BatchHeaderBytes) WithdrawalRoot() (common.Hash, error) { + if err := b.validate(); err != nil { + return common.Hash{}, err + } + return common.BytesToHash(b[153:185]), nil +} + +func (b BatchHeaderBytes) SequencerSetVerifyHash() (common.Hash, error) { + if err := b.validate(); err != nil { + return common.Hash{}, err + } + return common.BytesToHash(b[185:217]), nil +} + +func (b BatchHeaderBytes) ParentBatchHash() (common.Hash, error) { + if err := b.validate(); err != nil { + return common.Hash{}, err + } + return common.BytesToHash(b[217:249]), nil +} + +func (b BatchHeaderBytes) LastBlockNumber() (uint64, error) { + if err := b.validate(); err != nil { + return 0, err + } + version, _ := b.Version() + if version < 1 { + return 0, errors.New("LastBlockNumber is not available in version 0") + } + return binary.BigEndian.Uint64(b[249:257]), nil +} + +// structed batch header for version 0 +type BatchHeaderV0 struct { + BatchIndex uint64 + L1MessagePopped uint64 + TotalL1MessagePopped uint64 + DataHash common.Hash + BlobVersionedHash common.Hash + PrevStateRoot common.Hash + PostStateRoot common.Hash + WithdrawalRoot common.Hash + SequencerSetVerifyHash common.Hash + ParentBatchHash common.Hash + + //cache + EncodedBytes hexutil.Bytes +} + +func (b BatchHeaderV0) Bytes() BatchHeaderBytes { + if len(b.EncodedBytes) > 0 { + return BatchHeaderBytes(b.EncodedBytes) + } + batchBytes := make([]byte, expectedLengthV0) + batchBytes[0] = BatchHeaderVersion0 + binary.BigEndian.PutUint64(batchBytes[1:], b.BatchIndex) + binary.BigEndian.PutUint64(batchBytes[9:], b.L1MessagePopped) + binary.BigEndian.PutUint64(batchBytes[17:], b.TotalL1MessagePopped) + copy(batchBytes[25:], b.DataHash[:]) + copy(batchBytes[57:], b.BlobVersionedHash[:]) + copy(batchBytes[89:], b.PrevStateRoot[:]) + copy(batchBytes[121:], b.PostStateRoot[:]) + copy(batchBytes[153:], b.WithdrawalRoot[:]) + copy(batchBytes[185:], b.SequencerSetVerifyHash[:]) + copy(batchBytes[217:], b.ParentBatchHash[:]) + b.EncodedBytes = batchBytes + return batchBytes +} + +type BatchHeaderV1 struct { + BatchHeaderV0 + LastBlockNumber uint64 + + //cache + EncodedBytes hexutil.Bytes +} + +func (b BatchHeaderV1) Bytes() BatchHeaderBytes { + if len(b.EncodedBytes) > 0 { + return BatchHeaderBytes(b.EncodedBytes) + } + batchBytes := make([]byte, expectedLengthV1) + batchBytes[0] = BatchHeaderVersion1 + binary.BigEndian.PutUint64(batchBytes[1:], b.BatchIndex) + binary.BigEndian.PutUint64(batchBytes[9:], b.L1MessagePopped) + binary.BigEndian.PutUint64(batchBytes[17:], b.TotalL1MessagePopped) + copy(batchBytes[25:], b.DataHash[:]) + copy(batchBytes[57:], b.BlobVersionedHash[:]) + copy(batchBytes[89:], b.PrevStateRoot[:]) + copy(batchBytes[121:], b.PostStateRoot[:]) + copy(batchBytes[153:], b.WithdrawalRoot[:]) + copy(batchBytes[185:], b.SequencerSetVerifyHash[:]) + copy(batchBytes[217:], b.ParentBatchHash[:]) + binary.BigEndian.PutUint64(batchBytes[249:], b.LastBlockNumber) + + b.EncodedBytes = batchBytes + return batchBytes +} diff --git a/node/types/batch_test.go b/node/types/batch_test.go index 25dc43e3..97a3393e 100644 --- a/node/types/batch_test.go +++ b/node/types/batch_test.go @@ -2,16 +2,15 @@ package types import ( "math/big" + "morph-l2/bindings/bindings" "testing" "github.com/morph-l2/go-ethereum/common" "github.com/stretchr/testify/require" - "github.com/tendermint/tendermint/libs/rand" ) func TestBatchHeader(t *testing.T) { - expectedBatchHeader := BatchHeader{ - Version: 0, + expectedBatchHeaderV0 := BatchHeaderV0{ BatchIndex: 10, L1MessagePopped: 5, TotalL1MessagePopped: 20, @@ -22,22 +21,62 @@ func TestBatchHeader(t *testing.T) { WithdrawalRoot: common.BigToHash(big.NewInt(103)), SequencerSetVerifyHash: common.BigToHash(big.NewInt(104)), ParentBatchHash: common.BigToHash(big.NewInt(200)), - SkippedL1MessageBitmap: rand.Bytes(10), } - bytes := expectedBatchHeader.Encode() + batchHeaderBytes := expectedBatchHeaderV0.Bytes() - decoded, err := DecodeBatchHeader(bytes) - require.NoError(t, err) - require.EqualValues(t, expectedBatchHeader.Version, decoded.Version) - require.EqualValues(t, expectedBatchHeader.BatchIndex, decoded.BatchIndex) - require.EqualValues(t, expectedBatchHeader.L1MessagePopped, decoded.L1MessagePopped) - require.EqualValues(t, expectedBatchHeader.TotalL1MessagePopped, decoded.TotalL1MessagePopped) - require.EqualValues(t, expectedBatchHeader.DataHash, decoded.DataHash) - require.EqualValues(t, expectedBatchHeader.BlobVersionedHash, decoded.BlobVersionedHash) - require.EqualValues(t, expectedBatchHeader.PrevStateRoot, decoded.PrevStateRoot) - require.EqualValues(t, expectedBatchHeader.PostStateRoot, decoded.PostStateRoot) - require.EqualValues(t, expectedBatchHeader.WithdrawalRoot, decoded.WithdrawalRoot) - require.EqualValues(t, expectedBatchHeader.SequencerSetVerifyHash, decoded.SequencerSetVerifyHash) - require.EqualValues(t, expectedBatchHeader.ParentBatchHash, decoded.ParentBatchHash) - require.EqualValues(t, expectedBatchHeader.SkippedL1MessageBitmap, decoded.SkippedL1MessageBitmap) + version, err := batchHeaderBytes.Version() + require.NoError(t, err) + batchIndex, err := batchHeaderBytes.BatchIndex() + require.NoError(t, err) + l1MessagePopped, err := batchHeaderBytes.L1MessagePopped() + require.NoError(t, err) + totalL1MessagePopped, err := batchHeaderBytes.TotalL1MessagePopped() + require.NoError(t, err) + dataHash, err := batchHeaderBytes.DataHash() + require.NoError(t, err) + blobVersionedHash, err := batchHeaderBytes.BlobVersionedHash() + require.NoError(t, err) + prevStateRoot, err := batchHeaderBytes.PrevStateRoot() + require.NoError(t, err) + postStateRoot, err := batchHeaderBytes.PostStateRoot() + require.NoError(t, err) + withdrawalRoot, err := batchHeaderBytes.WithdrawalRoot() + require.NoError(t, err) + sequencerSetVerifyHash, err := batchHeaderBytes.SequencerSetVerifyHash() + require.NoError(t, err) + parentBatchHash, err := batchHeaderBytes.ParentBatchHash() + require.NoError(t, err) + + require.EqualValues(t, 0, version) + require.EqualValues(t, expectedBatchHeaderV0.BatchIndex, batchIndex) + require.EqualValues(t, expectedBatchHeaderV0.L1MessagePopped, l1MessagePopped) + require.EqualValues(t, expectedBatchHeaderV0.TotalL1MessagePopped, totalL1MessagePopped) + require.EqualValues(t, expectedBatchHeaderV0.DataHash, dataHash) + require.EqualValues(t, expectedBatchHeaderV0.BlobVersionedHash, blobVersionedHash) + require.EqualValues(t, expectedBatchHeaderV0.PrevStateRoot, prevStateRoot) + require.EqualValues(t, expectedBatchHeaderV0.PostStateRoot, postStateRoot) + require.EqualValues(t, expectedBatchHeaderV0.WithdrawalRoot, withdrawalRoot) + require.EqualValues(t, expectedBatchHeaderV0.SequencerSetVerifyHash, sequencerSetVerifyHash) + require.EqualValues(t, expectedBatchHeaderV0.ParentBatchHash, parentBatchHash) + + expectedBatchHeaderV1 := BatchHeaderV1{ + BatchHeaderV0: expectedBatchHeaderV0, + LastBlockNumber: 1000, + }.Bytes() + version, err = expectedBatchHeaderV1.Version() + require.NoError(t, err) + lastBlockNumber, err := expectedBatchHeaderV1.LastBlockNumber() + require.NoError(t, err) + require.EqualValues(t, 1, version) + require.EqualValues(t, 1000, lastBlockNumber) +} + +func TestMethodID(t *testing.T) { + beforeSkipABI, err := LegacyRollupMetaData.GetAbi() + require.NoError(t, err) + beforeMoveBlockCtxABI, err := BeforeMoveBlockCtxABI.GetAbi() + require.NoError(t, err) + currentABI, err := bindings.RollupMetaData.GetAbi() + require.NoError(t, err) + require.NotEqualValues(t, beforeSkipABI.Methods["commitBatch"].ID, beforeMoveBlockCtxABI.Methods["commitBatch"].ID, currentABI.Methods["commitBatch"].ID) } diff --git a/node/types/blob.go b/node/types/blob.go index a6b86e26..05070d7b 100644 --- a/node/types/blob.go +++ b/node/types/blob.go @@ -110,6 +110,17 @@ func MakeBlobTxSidecar(blobBytes []byte) (*eth.BlobTxSidecar, error) { }, nil } +func CompressBatchBytes(batchBytes []byte) ([]byte, error) { + if len(batchBytes) == 0 { + return nil, nil + } + compressedBatchBytes, err := zstd.CompressBatchBytes(batchBytes) + if err != nil { + return nil, fmt.Errorf("failed to compress batch bytes, err: %w", err) + } + return compressedBatchBytes, nil +} + func EncodeTxsPayloadToBlob(batchBytes []byte) (*eth.BlobTxSidecar, error) { if len(batchBytes) == 0 { return MakeBlobTxSidecar(batchBytes) @@ -238,6 +249,150 @@ func DecodeTxsFromBlob(blob *kzg4844.Blob) (eth.Transactions, error) { return txs, nil } +func DecodeBlocksFromBlob(blob *kzg4844.Blob) (eth.Transactions, error) { + if isEmptyBlob(blob) { + return eth.Transactions{}, nil + } + data, err := RetrieveBlobBytes(blob) + if err != nil { + return nil, err + } + batchBytes, err := zstd.DecompressBatchBytes(data) + if err != nil { + return nil, err + } + reader := bytes.NewReader(batchBytes) + txs := make(eth.Transactions, 0) + for { + var ( + firstByte byte + fullTxBytes []byte + innerTx eth.TxData + err error + ) + if err = binary.Read(reader, binary.BigEndian, &firstByte); err != nil { + // if the blob byte array is completely consumed, then break the loop + if err == io.EOF { + break + } + return nil, err + } + // zero byte is found after valid tx bytes, break the loop + if firstByte == 0 { + break + } + + switch firstByte { + case eth.AccessListTxType: + if err := binary.Read(reader, binary.BigEndian, &firstByte); err != nil { + return nil, err + } + innerTx = new(eth.AccessListTx) + case eth.DynamicFeeTxType: + if err := binary.Read(reader, binary.BigEndian, &firstByte); err != nil { + return nil, err + } + innerTx = new(eth.DynamicFeeTx) + default: + if firstByte <= 0xf7 { // legacy tx first byte must be greater than 0xf7(247) + return nil, fmt.Errorf("not supported tx type: %d", firstByte) + } + innerTx = new(eth.LegacyTx) + } + + // we support the tx types of LegacyTxType/AccessListTxType/DynamicFeeTxType + //if firstByte == eth.AccessListTxType || firstByte == eth.DynamicFeeTxType { + // // the firstByte here is used to indicate tx type, so skip it + // if err := binary.Read(reader, binary.BigEndian, &firstByte); err != nil { + // return nil, err + // } + //} else if firstByte <= 0xf7 { // legacy tx first byte must be greater than 0xf7(247) + // return nil, fmt.Errorf("not supported tx type: %d", firstByte) + //} + fullTxBytes, err = extractInnerTxFullBytes(firstByte, reader) + if err != nil { + return nil, err + } + if err = rlp.DecodeBytes(fullTxBytes, innerTx); err != nil { + return nil, err + } + txs = append(txs, eth.NewTx(innerTx)) + } + return txs, nil +} + +func DecodeTxsFromBytes(txsBytes []byte) (eth.Transactions, error) { + //if isEmptyBlob(blob) { + // return eth.Transactions{}, nil + //} + //data, err := RetrieveBlobBytes(blob) + //if err != nil { + // return nil, err + //} + //batchBytes, err := zstd.DecompressBatchBytes(data) + //if err != nil { + // return nil, err + //} + reader := bytes.NewReader(txsBytes) + txs := make(eth.Transactions, 0) + for { + var ( + firstByte byte + fullTxBytes []byte + innerTx eth.TxData + err error + ) + if err = binary.Read(reader, binary.BigEndian, &firstByte); err != nil { + // if the blob byte array is completely consumed, then break the loop + if err == io.EOF { + break + } + return nil, err + } + // zero byte is found after valid tx bytes, break the loop + if firstByte == 0 { + break + } + + switch firstByte { + case eth.AccessListTxType: + if err := binary.Read(reader, binary.BigEndian, &firstByte); err != nil { + return nil, err + } + innerTx = new(eth.AccessListTx) + case eth.DynamicFeeTxType: + if err := binary.Read(reader, binary.BigEndian, &firstByte); err != nil { + return nil, err + } + innerTx = new(eth.DynamicFeeTx) + default: + if firstByte <= 0xf7 { // legacy tx first byte must be greater than 0xf7(247) + return nil, fmt.Errorf("not supported tx type: %d", firstByte) + } + innerTx = new(eth.LegacyTx) + } + + // we support the tx types of LegacyTxType/AccessListTxType/DynamicFeeTxType + //if firstByte == eth.AccessListTxType || firstByte == eth.DynamicFeeTxType { + // // the firstByte here is used to indicate tx type, so skip it + // if err := binary.Read(reader, binary.BigEndian, &firstByte); err != nil { + // return nil, err + // } + //} else if firstByte <= 0xf7 { // legacy tx first byte must be greater than 0xf7(247) + // return nil, fmt.Errorf("not supported tx type: %d", firstByte) + //} + fullTxBytes, err = extractInnerTxFullBytes(firstByte, reader) + if err != nil { + return nil, err + } + if err = rlp.DecodeBytes(fullTxBytes, innerTx); err != nil { + return nil, err + } + txs = append(txs, eth.NewTx(innerTx)) + } + return txs, nil +} + func isEmptyBlob(blob *kzg4844.Blob) bool { for _, b := range blob { if b != 0 { diff --git a/node/types/consensus_message.go b/node/types/consensus_message.go index c29985bb..94742380 100644 --- a/node/types/consensus_message.go +++ b/node/types/consensus_message.go @@ -3,11 +3,11 @@ package types import ( "bytes" "encoding/binary" + "fmt" "math/big" - "github.com/morph-l2/go-ethereum/core/types" - "github.com/morph-l2/go-ethereum/common" + "github.com/morph-l2/go-ethereum/core/types" "github.com/morph-l2/go-ethereum/rlp" ) @@ -89,7 +89,7 @@ type WrappedBlock struct { Hash common.Hash `json:"hash"` CollectedL1TxHashes []common.Hash `json:"l1TxHashes" rlp:"optional"` - SkippedL1Txs []*types.SkippedTransaction `json:"skippedL1Txs" rlp:"optional"` + SkippedL1Txs []*types.SkippedTransaction `json:"-" rlp:"optional"` BaseFee *big.Int `json:"baseFeePerGas" rlp:"optional"` } @@ -146,3 +146,26 @@ func (wb *WrappedBlock) DecodeBlockContext(bc []byte) (uint16, uint16, error) { } return txsNum, l1MsgNum, nil } + +func WrappedBlockFromBytes(blockBytes []byte) (*WrappedBlock, error) { + var curBlock = new(WrappedBlock) + if err := curBlock.UnmarshalBinary(blockBytes); err != nil { + return nil, err + } + return curBlock, nil +} + +func HeightFromBlockBytes(blockBytes []byte) (uint64, error) { + curBlock, err := WrappedBlockFromBytes(blockBytes) + if err != nil { + return 0, err + } + return curBlock.Number, nil +} + +func HeightFromBlockContextBytes(blockContextBytes []byte) (uint64, error) { + if len(blockContextBytes) != 60 { + return 0, fmt.Errorf("wrong block context bytes length, input: %x", blockContextBytes) + } + return binary.BigEndian.Uint64(blockContextBytes[:8]), nil +} diff --git a/node/types/derivation.go b/node/types/derivation.go deleted file mode 100644 index c0304688..00000000 --- a/node/types/derivation.go +++ /dev/null @@ -1,6 +0,0 @@ -package types - -type BatchBls struct { - //BlsData *eth.BLSData - BlockNumber uint64 // last blockNumber of batch -} diff --git a/node/types/retryable_client.go b/node/types/retryable_client.go index cf874ab8..3d3ad949 100644 --- a/node/types/retryable_client.go +++ b/node/types/retryable_client.go @@ -3,6 +3,7 @@ package types import ( "context" "math/big" + "strings" "github.com/cenkalti/backoff/v4" "github.com/morph-l2/go-ethereum" @@ -15,13 +16,14 @@ import ( ) const ( - ConnectionRefused = "connection refused" - EOFError = "EOF" - JWTStaleToken = "stale token" - JWTExpiredToken = "token is expired" - MinerClosed = "miner closed" - ExecutionAborted = "execution aborted" - Timeout = "timed out" + ConnectionRefused = "connection refused" + EOFError = "EOF" + JWTStaleToken = "stale token" + JWTExpiredToken = "token is expired" + MinerClosed = "miner closed" + ExecutionAborted = "execution aborted" + Timeout = "timed out" + DiscontinuousBlockError = "discontinuous block number" ) type RetryableClient struct { @@ -220,7 +222,7 @@ func (rc *RetryableClient) CodeAt(ctx context.Context, contract common.Address, return } -// currently we want every error retryable +// currently we want every error retryable, except the DiscontinuousBlockError func retryableError(err error) bool { // return strings.Contains(err.Error(), ConnectionRefused) || // strings.Contains(err.Error(), EOFError) || @@ -229,5 +231,5 @@ func retryableError(err error) bool { // strings.Contains(err.Error(), MinerClosed) || // strings.Contains(err.Error(), ExecutionAborted) || // strings.Contains(err.Error(), Timeout) - return true + return !strings.Contains(err.Error(), DiscontinuousBlockError) } diff --git a/node/validator/config.go b/node/validator/config.go index 3d36fe9a..986fd16d 100644 --- a/node/validator/config.go +++ b/node/validator/config.go @@ -27,18 +27,20 @@ func NewConfig() *Config { func (c *Config) SetCliContext(ctx *cli.Context) error { l1NodeAddr := ctx.GlobalString(flags.L1NodeAddr.Name) l1ChainID := ctx.GlobalUint64(flags.L1ChainID.Name) - hexPrvKey := ctx.GlobalString(flags.ValidatorPrivateKey.Name) - hex := strings.TrimPrefix(hexPrvKey, "0x") - privateKey, err := crypto.HexToECDSA(hex) - if err != nil { - return err + c.challengeEnable = ctx.GlobalBool(flags.ChallengeEnable.Name) + if c.challengeEnable { + hexPrvKey := ctx.GlobalString(flags.ValidatorPrivateKey.Name) + hex := strings.TrimPrefix(hexPrvKey, "0x") + privateKey, err := crypto.HexToECDSA(hex) + if err != nil { + return err + } + c.PrivateKey = privateKey } - c.challengeEnable = ctx.GlobalIsSet(flags.ValidatorEnable.Name) addrHex := ctx.GlobalString(flags.RollupContractAddress.Name) rollupContract := common.HexToAddress(addrHex) c.l1RPC = l1NodeAddr c.L1ChainID = big.NewInt(int64(l1ChainID)) - c.PrivateKey = privateKey c.rollupContract = rollupContract return nil } diff --git a/node/validator/validator.go b/node/validator/validator.go index 627123c4..224c8c3d 100644 --- a/node/validator/validator.go +++ b/node/validator/validator.go @@ -38,11 +38,12 @@ func NewValidator(cfg *Config, rollup *bindings.Rollup, logger tmlog.Logger) (*V return nil, fmt.Errorf("dial l1 node error:%v", err) } return &Validator{ - cli: cli, - contract: rollup, - privateKey: cfg.PrivateKey, - l1ChainID: cfg.L1ChainID, - logger: logger, + cli: cli, + contract: rollup, + privateKey: cfg.PrivateKey, + l1ChainID: cfg.L1ChainID, + challengeEnable: cfg.challengeEnable, + logger: logger, }, nil } @@ -68,13 +69,6 @@ func (v *Validator) ChallengeState(batchIndex uint64) error { } opts.GasPrice = gasPrice opts.NoSend = true - //publicKey := v.privateKey.Public() - // publicKeyECDSA, ok := publicKey.(*ecdsa.PublicKey) - // if !ok { - // log.Error("cannot assert type: publicKey is not of type *ecdsa.PublicKey") - // } - - //receiver := crypto.PubkeyToAddress(*publicKeyECDSA) batchHash, err := v.contract.CommittedBatches( &bind.CallOpts{ Pending: false, diff --git a/ops/devnet-morph/devnet/__init__.py b/ops/devnet-morph/devnet/__init__.py index 62e5504f..061c3535 100644 --- a/ops/devnet-morph/devnet/__init__.py +++ b/ops/devnet-morph/devnet/__init__.py @@ -83,8 +83,8 @@ def devnet_l1(paths, result=None): }) wait_up(9545) wait_for_rpc_server('127.0.0.1:9545') - log.info('Sleep another 20s...') - time.sleep(20) + log.info('Sleep another 10s...') + time.sleep(10) res = eth_accounts('127.0.0.1:9545') response = json.loads(res) account = response['result'][0] @@ -135,7 +135,7 @@ def devnet_deploy(paths, args): 'yarn', 'build' ], env={}, cwd=paths.contracts_dir) run_command([ - 'npx', 'hardhat', 'deploy', '--network', 'l1', '--storagepath', paths.deployment_dir + 'npx', 'hardhat', 'deploy', '--network', 'l1', '--storagepath', paths.deployment_dir, '--concurrent', 'true' ], env={}, cwd=paths.contracts_dir) log.info('Generating L2 genesis and rollup configs.') @@ -171,7 +171,7 @@ def devnet_deploy(paths, args): modified_line = re.sub(pattern3, f"batchHeader: '{genesis_batch_header}'", line) print(modified_line, end='') run_command([ - 'npx', 'hardhat', 'initialize', '--network', 'l1', '--storagepath', paths.deployment_dir + 'npx', 'hardhat', 'initialize', '--network', 'l1', '--storagepath', paths.deployment_dir, '--concurrent', 'true' ], env={}, cwd=paths.contracts_dir) # run_command([ @@ -229,7 +229,7 @@ def devnet_deploy(paths, args): run_command(['docker', 'compose', '-f', 'docker-compose-4nodes.yml', 'up', - '-d'], check=False, cwd=paths.ops_dir, + '--no-recreate','-d'], check=False, cwd=paths.ops_dir, env={ 'MORPH_PORTAL': addresses['Proxy__L1MessageQueueWithGasPriceOracle'], 'MORPH_ROLLUP': addresses['Proxy__Rollup'], diff --git a/ops/devnet-morph/devnet/setup_nodes.py b/ops/devnet-morph/devnet/setup_nodes.py new file mode 100644 index 00000000..7e72c730 --- /dev/null +++ b/ops/devnet-morph/devnet/setup_nodes.py @@ -0,0 +1,122 @@ +import os +import shutil +import subprocess +import sys +import re + +def setup_devnet_nodes(): + """ + Set up the devnet nodes, modify configuration files using toml library, and copy key files. + """ + root_dir = subprocess.check_output(["git", "rev-parse", "--show-toplevel"], text=True).strip() + # Check if Tendermint is installed + if shutil.which("tendermint") is None: + print("Tendermint is not installed. Starting the build process...") + node_dir = os.path.join(root_dir, "node") + ops_dir = os.path.join(root_dir, "ops", "docker") + + if not os.path.isdir(node_dir): + print(f"Error: Node directory not found at {node_dir}. Exiting.") + sys.exit(1) + + os.chdir(node_dir) + print(f"Building Tendermint in {node_dir}...") + if subprocess.call(["make", "install-tendermint"]) != 0: + print("Error: Failed to build Tendermint. Exiting.") + sys.exit(1) + + # back to the root directory + os.chdir(root_dir) + print("Tendermint build process completed.") + + # Check if .devnet directory already exists + docker_dir = os.path.join(root_dir, "ops", "docker") + devnet_dir = os.path.join(docker_dir, ".devnet") + if os.path.exists(devnet_dir): + print(".devnet directory already exists. Devnet nodes setup has already been completed. Exiting.") + return + + # Run the Tendermint testnet command + print("Setting up the devnet...") + command = [ + "tendermint", "testnet", "--v", "4", "--n", "1", "--o", devnet_dir, + "--populate-persistent-peers", + "--hostname", "node-0", + "--hostname", "node-1", + "--hostname", "node-2", + "--hostname", "node-3", + "--hostname", "sentry-node-0" + ] + + if subprocess.call(command) != 0: + print("Failed to set up devnet.") + sys.exit(1) + + # Modify config.toml files using toml library + print("Modifying config.toml files...") + config_files = [ + os.path.join(devnet_dir, f"node{i}/config/config.toml") for i in range(5) + ] + + persistent_peers_value = ( + "93e27ea2306e158a8146d5f44caaab97496797d2@node-0:26656," + "7f78b7d7a7e6bad4faf68d5731d437f4288d96d0@node-1:26656," + "06c699be2f9aeb9f7ec79f508a95ff80576deb12@node-2:26656," + "b1a131f40d5d3abefe0dd787513c936ef62ac2d6@node-3:26656," + "dae813274913aaf39e7cd3226a0aa8bce00644e1@sentry-node-0:26656" + ) + + for i, config_file in enumerate(config_files): + if not os.path.isfile(config_file): + print(f"Error: {config_file} not found. Exiting.") + sys.exit(1) + + with open(config_file, "r") as f: + content = f.read() + + # Replace the required fields + content = content.replace('create_empty_blocks_interval = "0s"', 'create_empty_blocks_interval = "5s"') + content = content.replace('peer_gossip_sleep_duration = "100ms"', 'peer_gossip_sleep_duration = "10ms"') + content = content.replace('flush_throttle_timeout = "100ms"', 'flush_throttle_timeout = "10ms"') + content = content.replace('max_packet_msg_payload_size = 1024', 'max_packet_msg_payload_size = 10485760') + content = content.replace('send_rate = 5120000', 'send_rate = 52428800') + content = content.replace('recv_rate = 5120000', 'recv_rate = 102428800') + content = content.replace('block_sync = false', 'block_sync = true') + content = re.sub(r'persistent_peers\s*=\s*".*?"', f'persistent_peers = "{persistent_peers_value}"', content) + + # Modify pex for nodes 0 to 3 + if i < 4: + content = content.replace('pex = true', 'pex = false') + + with open(config_file, "w") as f: + f.write(content) + + print("All config.toml files have been updated successfully.") + + # Copy key files to devnet node directories + print("Copying key files...") + node_dirs = [f"node{i}" for i in range(5)] + + for node in node_dirs: + source_dir = os.path.join(docker_dir, node) + dest_dir = os.path.join(devnet_dir, node, "config") + + if not os.path.isdir(source_dir) or not os.path.isdir(dest_dir): + print(f"Error: Missing source or destination directory for {node}. Exiting.") + sys.exit(1) + + # Copy specific files + shutil.copyfile(os.path.join(source_dir, "node_key.json"), os.path.join(dest_dir, "node_key.json")) + + # Skip copying for node4 bls_key.json and priv_validator_key.json + if node != "node4": + shutil.copyfile(os.path.join(source_dir, "bls_key.json"), os.path.join(dest_dir, "bls_key.json")) + shutil.copyfile(os.path.join(source_dir, "priv_validator_key.json"), os.path.join(dest_dir, "priv_validator_key.json")) + + # Copy and rename genesis file + shutil.copyfile(os.path.join(docker_dir, "tendermint-devnet-genesis.json"), os.path.join(dest_dir, "genesis.json")) + + print(f"Files copied successfully for {node}.") + + print("All key files have been copied successfully.") + print("Devnet nodes setup completed successfully.") diff --git a/ops/devnet-morph/main.py b/ops/devnet-morph/main.py index 20cc1cb6..b773b50e 100644 --- a/ops/devnet-morph/main.py +++ b/ops/devnet-morph/main.py @@ -1,7 +1,9 @@ import devnet +from devnet.setup_nodes import setup_devnet_nodes def main(): + setup_devnet_nodes() devnet.main() diff --git a/ops/docker/.env b/ops/docker/.env index 98dff2a0..238f5019 100644 --- a/ops/docker/.env +++ b/ops/docker/.env @@ -4,9 +4,10 @@ JWT_SECRET_PATH=/jwt-secret.txt NODE_DATA_DIR=/data L1_ETH_RPC=http://l1:8545 L1_BEACON_CHAIN_RPC=http://beacon-chain:3500 -L1_CROSS_DOMAIN_MESSENGER=0x5fc8d32690cc91d4c39d9d3abcbd16989f875707 -MORPH_PORTAL=0x0165878a594ca255338adfa4d48449f69242eb8f -MORPH_ROLLUP=0x2279b7a0a67db372996a5fab50d91eaa73d2ebe6 +L1_CROSS_DOMAIN_MESSENGER=0xcf7ed3acca5a467e9e704c703e8d87f634fb0fc9 +MORPH_PORTAL=0xdc64a140aa3e981100a9beca4e685f962f0cf6c9 +MORPH_ROLLUP=0x0165878a594ca255338adfa4d48449f69242eb8f BUILD_GETH=l2-geth RUST_LOG=info -Proxy__L1Staking=0xa513e6e4b8f2a923d98304ec87f64353c4d5c853 +Proxy__L1Staking=0x5fc8d32690cc91d4c39d9d3abcbd16989f875707 +BATCH_UPGRADE_TIME=0 diff --git a/ops/docker/Dockerfile.l1 b/ops/docker/Dockerfile.l1 index ff74e4ba..16ac1be4 100644 --- a/ops/docker/Dockerfile.l1 +++ b/ops/docker/Dockerfile.l1 @@ -1,4 +1,4 @@ -FROM ethereum/client-go:v1.12.2 +FROM ethereum/client-go:v1.14.11 RUN apk add --no-cache jq diff --git a/ops/docker/Dockerfile.l1-beacon b/ops/docker/Dockerfile.l1-beacon index da003563..a4886981 100644 --- a/ops/docker/Dockerfile.l1-beacon +++ b/ops/docker/Dockerfile.l1-beacon @@ -6,9 +6,9 @@ COPY ops/docker/consensus /consensus COPY ops/docker/execution /execution RUN ./prysmctl testnet generate-genesis --fork=deneb --num-validators=64 --genesis-time-delay=0 --output-ssz=/consensus/genesis.ssz --chain-config-file=/consensus/config.yml --geth-genesis-json-in=/execution/genesis.json --geth-genesis-json-out=/execution/genesis.json -FROM ethereum/client-go:latest as geth-genesis +FROM ethereum/client-go:v1.14.11 as geth-genesis COPY --from=chain-genesis /execution /execution -RUN geth --datadir=/execution init /execution/genesis.json +RUN geth --datadir=/execution --state.scheme=hash init /execution/genesis.json FROM gcr.io/prysmaticlabs/prysm/beacon-chain:v4.2.1 as beacon-chain diff --git a/ops/docker/Dockerfile.l2-node b/ops/docker/Dockerfile.l2-node new file mode 100644 index 00000000..eab8377e --- /dev/null +++ b/ops/docker/Dockerfile.l2-node @@ -0,0 +1,25 @@ +# Build Stage +FROM ghcr.io/morph-l2/go-ubuntu-builder:go-1.22-ubuntu as builder + +# Set working directory and copy necessary files +COPY . /morph +WORKDIR /morph/node + +# Run build command +RUN make build + +# Final Stage +FROM ghcr.io/morph-l2/go-ubuntu-builder:go-1.22-ubuntu + +# Update and install dependencies, then clean up unnecessary files +RUN apt-get -qq update \ + && apt-get -qq install -y --no-install-recommends ca-certificates \ + && rm -rf /var/lib/apt/lists/* + +# Copy the built binaries from the builder image to the final image +COPY --from=builder /morph/node/build/bin/tendermint /usr/local/bin/ +COPY --from=builder /morph/node/build/bin/morphnode /usr/local/bin/ + +# Set the default command +CMD ["morphnode", "--home", "/data"] + diff --git a/ops/docker/Dockerfile.l2-node-1 b/ops/docker/Dockerfile.l2-node-1 index 4ef95807..0e86e94c 100644 --- a/ops/docker/Dockerfile.l2-node-1 +++ b/ops/docker/Dockerfile.l2-node-1 @@ -1,5 +1,5 @@ # Build Geth in a stock Go builder container -FROM morph/go-ubuntu-builder:go-1.22-ubuntu as builder +FROM ghcr.io/morph-l2/go-ubuntu-builder:go-1.22-ubuntu as builder COPY . /morph WORKDIR /morph/node RUN make build diff --git a/ops/docker/Dockerfile.l2-node-4 b/ops/docker/Dockerfile.l2-node-4 index bbcc23c1..40b0119a 100644 --- a/ops/docker/Dockerfile.l2-node-4 +++ b/ops/docker/Dockerfile.l2-node-4 @@ -1,5 +1,5 @@ # Build Geth in a stock Go builder container -FROM morph/go-ubuntu-builder:go-1.22-ubuntu as builder +FROM ghcr.io/morph-l2/go-ubuntu-builder:go-1.22-ubuntu as builder RUN apt-get -qq update \ && apt-get -qq install -y --no-install-recommends ca-certificates COPY . /morph diff --git a/ops/docker/Dockerfile.staking-oracle b/ops/docker/Dockerfile.staking-oracle index 4354c568..5d78373e 100644 --- a/ops/docker/Dockerfile.staking-oracle +++ b/ops/docker/Dockerfile.staking-oracle @@ -1,18 +1,18 @@ -# Build Geth in a stock Go builder container -FROM morph/go-ubuntu-builder:go-1.22-ubuntu as builder - -# RUN apk add --no-cache gcc musl-dev linux-headers git make +FROM ghcr.io/morph-l2/go-ubuntu-builder:go-1.22-ubuntu as builder +# Copy source code and build application COPY . /morph - WORKDIR /morph/oracle - RUN make build -# Pull Geth into a second stage deploy alpine container -FROM builder +# Deploy stage using the same base image (morph/go-ubuntu-builder:go-1.22-ubuntu) +FROM ghcr.io/morph-l2/go-ubuntu-builder:go-1.22-ubuntu + +# Install only necessary dependencies (e.g., ca-certificates for networking) +RUN apt-get update && apt-get install -y --no-install-recommends ca-certificates && rm -rf /var/lib/apt/lists/* -# RUN apk add --no-cache ca-certificates +# Copy the built binary from the builder stage COPY --from=builder /morph/oracle/build/bin/staking-oracle /usr/local/bin/ +# Set the default command to run the staking oracle CMD ["staking-oracle"] \ No newline at end of file diff --git a/ops/docker/Dockerfile.submitter b/ops/docker/Dockerfile.submitter index 726530c2..5d84686a 100644 --- a/ops/docker/Dockerfile.submitter +++ b/ops/docker/Dockerfile.submitter @@ -1,5 +1,5 @@ # Build Geth in a stock Go builder container -FROM morph/go-ubuntu-builder:go-1.22-ubuntu as builder +FROM ghcr.io/morph-l2/go-ubuntu-builder:go-1.22-ubuntu as builder COPY . /morph @@ -8,7 +8,7 @@ WORKDIR /morph/tx-submitter RUN make build # Pull Geth into a second stage deploy alpine container -FROM morph/go-ubuntu-builder:go-1.22-ubuntu +FROM ghcr.io/morph-l2/go-ubuntu-builder:go-1.22-ubuntu RUN apt-get -qq update \ && apt-get -qq install -y --no-install-recommends ca-certificates diff --git a/ops/docker/docker-compose-4nodes.yml b/ops/docker/docker-compose-4nodes.yml index cddec285..7353ee63 100644 --- a/ops/docker/docker-compose-4nodes.yml +++ b/ops/docker/docker-compose-4nodes.yml @@ -84,7 +84,7 @@ services: # APIs to allow for proof-of-stake consensus via Prysm. l1: container_name: l1-geth - image: ethereum/client-go:v1.13.12 + image: ethereum/client-go:v1.14.11 command: - --http - --http.api=web3,debug,eth,txpool,net,engine @@ -225,11 +225,10 @@ services: depends_on: morph-geth-0: condition: service_started - image: morph-node-0:latest + image: morph-node:latest build: context: ../.. - dockerfile: ops/docker/Dockerfile.l2-node-4 - target: node0 + dockerfile: ops/docker/Dockerfile.l2-node restart: unless-stopped ports: - "26656" @@ -244,8 +243,9 @@ services: - MORPH_NODE_SYNC_DEPOSIT_CONTRACT_ADDRESS=${MORPH_PORTAL:-0x6900000000000000000000000000000000000001} - MORPH_NODE_L1_CONFIRMATIONS=0 - MORPH_NODE_SYNC_START_HEIGHT=${MORPH_NODE_SYNC_START_HEIGHT:-1} + - MORPH_NODE_UPGRADE_BATCH_TIME=${BATCH_UPGRADE_TIME} volumes: - - "node_data_0:${NODE_DATA_DIR}" + - ".devnet/node0:${NODE_DATA_DIR}" - "${PWD}/jwt-secret.txt:${JWT_SECRET_PATH}" command: > morphnode @@ -254,15 +254,9 @@ services: node-1: container_name: node-1 depends_on: - morph-geth-1: - condition: service_started node-0: condition: service_started - image: morph-node-1:latest - build: - context: ../.. - dockerfile: ops/docker/Dockerfile.l2-node-4 - target: node1 + image: morph-node:latest restart: unless-stopped ports: - "26656" @@ -277,8 +271,9 @@ services: - MORPH_NODE_SYNC_DEPOSIT_CONTRACT_ADDRESS=${MORPH_PORTAL:-0x6900000000000000000000000000000000000001} - MORPH_NODE_L1_CONFIRMATIONS=0 - MORPH_NODE_SYNC_START_HEIGHT=${MORPH_NODE_SYNC_START_HEIGHT:-1} + - MORPH_NODE_UPGRADE_BATCH_TIME=${BATCH_UPGRADE_TIME} volumes: - - "node_data_1:${NODE_DATA_DIR}" + - ".devnet/node1:${NODE_DATA_DIR}" - "${PWD}/jwt-secret.txt:${JWT_SECRET_PATH}" command: > morphnode @@ -287,15 +282,9 @@ services: node-2: container_name: node-2 depends_on: - morph-geth-2: - condition: service_started node-0: condition: service_started - image: morph-node-2:latest - build: - context: ../.. - dockerfile: ops/docker/Dockerfile.l2-node-4 - target: node2 + image: morph-node:latest restart: unless-stopped ports: - "26656" @@ -311,8 +300,9 @@ services: - MORPH_NODE_SYNC_DEPOSIT_CONTRACT_ADDRESS=${MORPH_PORTAL:-0x6900000000000000000000000000000000000001} - MORPH_NODE_L1_CONFIRMATIONS=0 - MORPH_NODE_SYNC_START_HEIGHT=${MORPH_NODE_SYNC_START_HEIGHT:-1} + - MORPH_NODE_UPGRADE_BATCH_TIME=${BATCH_UPGRADE_TIME} volumes: - - "node_data_2:${NODE_DATA_DIR}" + - ".devnet/node2:${NODE_DATA_DIR}" - "${PWD}/jwt-secret.txt:${JWT_SECRET_PATH}" command: > morphnode @@ -321,15 +311,9 @@ services: node-3: container_name: node-3 depends_on: - morph-geth-3: - condition: service_started node-0: condition: service_started - image: morph-node-3:latest - build: - context: ../.. - dockerfile: ops/docker/Dockerfile.l2-node-4 - target: node3 + image: morph-node:latest restart: unless-stopped ports: - "26656" @@ -345,8 +329,9 @@ services: - MORPH_NODE_SYNC_DEPOSIT_CONTRACT_ADDRESS=${MORPH_PORTAL:-0x6900000000000000000000000000000000000001} - MORPH_NODE_L1_CONFIRMATIONS=0 - MORPH_NODE_SYNC_START_HEIGHT=${MORPH_NODE_SYNC_START_HEIGHT:-1} + - MORPH_NODE_UPGRADE_BATCH_TIME=${BATCH_UPGRADE_TIME} volumes: - - "node_data_3:${NODE_DATA_DIR}" + - ".devnet/node3:${NODE_DATA_DIR}" - "${PWD}/jwt-secret.txt:${JWT_SECRET_PATH}" command: > morphnode @@ -380,13 +365,9 @@ services: sentry-node-0: container_name: sentry-node-0 depends_on: - sentry-geth-0: + node-0: condition: service_started - image: sentry-node-0:latest - build: - context: ../.. - dockerfile: ops/docker/Dockerfile.l2-node-4 - target: sentry0 + image: morph-node:latest restart: unless-stopped ports: - "26656" @@ -403,7 +384,7 @@ services: - MORPH_NODE_L1_CONFIRMATIONS=0 - MORPH_NODE_SYNC_START_HEIGHT=${MORPH_NODE_SYNC_START_HEIGHT:-1} volumes: - - "sentry_node_data:${NODE_DATA_DIR}" + - ".devnet/node4:${NODE_DATA_DIR}" - "${PWD}/jwt-secret.txt:${JWT_SECRET_PATH}" command: > morphnode @@ -438,9 +419,8 @@ services: depends_on: validator_geth: condition: service_started - build: - context: ../.. - dockerfile: ops/docker/Dockerfile.l2-node-1 + node-0: + condition: service_started image: morph-node:latest ports: - "26660" diff --git a/ops/l2-genesis/cmd/genesis/cmd.go b/ops/l2-genesis/cmd/genesis/cmd.go index 30f249e5..aac68d39 100644 --- a/ops/l2-genesis/cmd/genesis/cmd.go +++ b/ops/l2-genesis/cmd/genesis/cmd.go @@ -115,11 +115,11 @@ var Subcommands = cli.Commands{ if err != nil { return err } - fmt.Printf("generated genesis batch header bytes: %x \n", genesisBatchHeader.Encode()) + fmt.Printf("generated genesis batch header bytes: %x \n", genesisBatchHeader.Bytes()) if err := writeGenesisFile(genBatchHeaderFile, genesisBatchHeader); err != nil { return err } - genesisBatchHeaderBytes = genesisBatchHeader.EncodedBytes + genesisBatchHeaderBytes = genesisBatchHeader.Bytes() } rollupConfig, err := config.RollupConfig(l1StartBlock, l2GenesisBlockHash, l2GenesisBlock.Number().Uint64(), l2GenesisBlock.Root(), withdrawRoot, genesisBatchHeaderBytes) diff --git a/ops/l2-genesis/deploy-config/qanet-deploy-config.json b/ops/l2-genesis/deploy-config/qanet-deploy-config.json index 0f573d0e..6bb1d033 100644 --- a/ops/l2-genesis/deploy-config/qanet-deploy-config.json +++ b/ops/l2-genesis/deploy-config/qanet-deploy-config.json @@ -14,8 +14,8 @@ "fundDevAccounts": false, "l1StartingBlockTag": "earliest", - "maxTxPerBlock": 10000, - "maxTxPayloadBytesPerBlock": 345000, + "maxTxPerBlock": 1000, + "maxTxPayloadBytesPerBlock": 122880, "gasPriceOracleOverhead": 2500, "gasPriceOracleScalar": 1000000000, @@ -42,10 +42,10 @@ "l2StakingUnDelegatedLockEpochs": 2, "l2StakingRewardStartTime": 1728000000, "l2StakingAddresses": [ - "0x25d36d94b64165f72a817ae0ff9bad2ce6914c70", - "0x4a1f64dec538835c125874e275edca367bf6022a", - "0xbb8605961105bb3dcd0e86ef94a1bf9fb2270a29", - "0x7d7201ad7da2b9b9ab9a36c454a3c2d55c4fbdd8" + "0x675cfc328f9f2e79a51e499b2be44462270572fe", + "0xb096665645994775eeba8aa114752d569734dcb4", + "0x3a587733d38e5487d2a7e81d84625f25c99ab3a1", + "0xb6346ded94fc61b637763610d0c59846b7781080" ], "l2StakingTmKeys": [ "0x5280d0eee2a64d3ad29480d15ffd1b048ce5908f180b5ccd65cc3dcf00941abb", diff --git a/ops/l2-genesis/go.mod b/ops/l2-genesis/go.mod index a950d67b..8f84307d 100644 --- a/ops/l2-genesis/go.mod +++ b/ops/l2-genesis/go.mod @@ -2,11 +2,11 @@ module morph-l2/morph-deployer go 1.22 -replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3.1 +replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3.2 require ( github.com/holiman/uint256 v1.2.4 - github.com/morph-l2/go-ethereum v1.10.14-0.20241021080617-0ff2a10a9625 + github.com/morph-l2/go-ethereum v1.10.14-0.20250424011308-f42440d1ace1 github.com/stretchr/testify v1.9.0 github.com/urfave/cli v1.22.14 ) diff --git a/ops/l2-genesis/go.sum b/ops/l2-genesis/go.sum index 0a1a50c8..8eeef9b9 100644 --- a/ops/l2-genesis/go.sum +++ b/ops/l2-genesis/go.sum @@ -143,8 +143,8 @@ github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqky github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/morph-l2/go-ethereum v1.10.14-0.20241021080617-0ff2a10a9625 h1:4+cbRSS4lacSIC81RXxvA04UHhGVC4SHVn+bKeqhPSM= -github.com/morph-l2/go-ethereum v1.10.14-0.20241021080617-0ff2a10a9625/go.mod h1:sMJCfHOBzVRDkM2yF/Hy+oUk2rgC0CQZHTLs0cyzhhk= +github.com/morph-l2/go-ethereum v1.10.14-0.20250424011308-f42440d1ace1 h1:Mtl4361Zdc8w3SgCI7L/NuPeLaVdX1L/uP/D4ur/9Yw= +github.com/morph-l2/go-ethereum v1.10.14-0.20250424011308-f42440d1ace1/go.mod h1:sMJCfHOBzVRDkM2yF/Hy+oUk2rgC0CQZHTLs0cyzhhk= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= diff --git a/ops/l2-genesis/morph-chain-ops/genesis/config.go b/ops/l2-genesis/morph-chain-ops/genesis/config.go index 9102c780..650e283b 100644 --- a/ops/l2-genesis/morph-chain-ops/genesis/config.go +++ b/ops/l2-genesis/morph-chain-ops/genesis/config.go @@ -125,6 +125,9 @@ type DeployConfig struct { //MorphTokenDailyInflationRate uint64 `json:"morphTokenDailyInflationRate"` FundDevAccounts bool `json:"fundDevAccounts"` + + // Upgrade configs + Morph203Time *uint64 `json:"morph203Time,omitempty"` } // GetDeployedAddresses will get the deployed addresses of deployed L1 contracts diff --git a/ops/l2-genesis/morph-chain-ops/genesis/genesis.go b/ops/l2-genesis/morph-chain-ops/genesis/genesis.go index 89f6ca4a..3e896273 100644 --- a/ops/l2-genesis/morph-chain-ops/genesis/genesis.go +++ b/ops/l2-genesis/morph-chain-ops/genesis/genesis.go @@ -35,6 +35,11 @@ func NewL2Genesis(config *DeployConfig, block *types.Block) (*core.Genesis, erro sequencerFeeVaultReceipt = predeploys.L2TxFeeVaultAddr } + var morph203Time *uint64 + if config.Morph203Time != nil { + morph203Time = config.Morph203Time + } + morphChainConfig := params.ChainConfig{ ChainID: new(big.Int).SetUint64(config.L2ChainID), HomesteadBlock: big.NewInt(0), @@ -55,6 +60,7 @@ func NewL2Genesis(config *DeployConfig, block *types.Block) (*core.Genesis, erro ShanghaiBlock: big.NewInt(0), BernoulliBlock: big.NewInt(0), CurieBlock: big.NewInt(0), + Morph203Time: morph203Time, TerminalTotalDifficulty: big.NewInt(0), Morph: params.MorphConfig{ UseZktrie: true, diff --git a/ops/l2-genesis/morph-chain-ops/genesis/layer_two_test.go b/ops/l2-genesis/morph-chain-ops/genesis/layer_two_test.go index 8ce0e6ae..56f945ac 100644 --- a/ops/l2-genesis/morph-chain-ops/genesis/layer_two_test.go +++ b/ops/l2-genesis/morph-chain-ops/genesis/layer_two_test.go @@ -80,5 +80,5 @@ func Test_BuildL2DeveloperGenesis(t *testing.T) { l2GenesisBlock := l2Genesis.ToBlock(nil) genesisBatchHeader, err := node.GenesisBatchHeader(l2GenesisBlock.Header()) require.NoError(t, err) - t.Logf("generated genesis batch header bytes: %x \n", genesisBatchHeader.Encode()) + t.Logf("generated genesis batch header bytes: %x \n", genesisBatchHeader.Bytes()) } diff --git a/ops/tools/batchparse/main.go b/ops/tools/batchparse/main.go index 3b1b9a44..429756a1 100644 --- a/ops/tools/batchparse/main.go +++ b/ops/tools/batchparse/main.go @@ -3,9 +3,10 @@ package main import ( "context" "fmt" - "morph-l2/node/derivation" "github.com/morph-l2/go-ethereum/ethclient" + + "morph-l2/node/derivation" ) var ( diff --git a/ops/tools/go.mod b/ops/tools/go.mod index 887f6911..d5f3153f 100644 --- a/ops/tools/go.mod +++ b/ops/tools/go.mod @@ -2,10 +2,10 @@ module morph-l2/tools go 1.22 -replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3.1 +replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3.2 require ( - github.com/morph-l2/go-ethereum v1.10.14-0.20241021080617-0ff2a10a9625 + github.com/morph-l2/go-ethereum v1.10.14-0.20250424011308-f42440d1ace1 github.com/tendermint/tendermint v0.35.9 ) diff --git a/ops/tools/go.sum b/ops/tools/go.sum index 95dd6436..803010fa 100644 --- a/ops/tools/go.sum +++ b/ops/tools/go.sum @@ -163,10 +163,10 @@ github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqky github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/morph-l2/go-ethereum v1.10.14-0.20241021080617-0ff2a10a9625 h1:4+cbRSS4lacSIC81RXxvA04UHhGVC4SHVn+bKeqhPSM= -github.com/morph-l2/go-ethereum v1.10.14-0.20241021080617-0ff2a10a9625/go.mod h1:sMJCfHOBzVRDkM2yF/Hy+oUk2rgC0CQZHTLs0cyzhhk= -github.com/morph-l2/tendermint v0.3.1 h1:yqyM3/p9sCNmFSsIFeIxS5RBgXHWqbtyNHx16I9cIZ0= -github.com/morph-l2/tendermint v0.3.1/go.mod h1:TtCzp9l6Z6yDUiwv3TbqKqw8Q8RKp3fSz5+adO1/Y8w= +github.com/morph-l2/go-ethereum v1.10.14-0.20250424011308-f42440d1ace1 h1:Mtl4361Zdc8w3SgCI7L/NuPeLaVdX1L/uP/D4ur/9Yw= +github.com/morph-l2/go-ethereum v1.10.14-0.20250424011308-f42440d1ace1/go.mod h1:sMJCfHOBzVRDkM2yF/Hy+oUk2rgC0CQZHTLs0cyzhhk= +github.com/morph-l2/tendermint v0.3.2 h1:Gu6Uj2G6c3YP2NAKFi7A46JZaOCdD4zfZDKCjt0pDm8= +github.com/morph-l2/tendermint v0.3.2/go.mod h1:TtCzp9l6Z6yDUiwv3TbqKqw8Q8RKp3fSz5+adO1/Y8w= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= diff --git a/ops/tools/multisend/main.go b/ops/tools/multisend/main.go index 67254279..c3265365 100644 --- a/ops/tools/multisend/main.go +++ b/ops/tools/multisend/main.go @@ -46,7 +46,7 @@ func main() { start := time.Now() var count int for { - if count == 10000000 || time.Now().Sub(start) > duration { + if count == 10000000 || time.Since(start) > duration { fmt.Println("completed") break } diff --git a/oracle/go.mod b/oracle/go.mod index 8d86dcb7..fdc02b6b 100644 --- a/oracle/go.mod +++ b/oracle/go.mod @@ -2,12 +2,12 @@ module morph-l2/oracle go 1.22 -replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3.1 +replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3.2 require ( github.com/go-kit/kit v0.12.0 github.com/morph-l2/externalsign v0.3.1 - github.com/morph-l2/go-ethereum v1.10.14-0.20241021080617-0ff2a10a9625 + github.com/morph-l2/go-ethereum v1.10.14-0.20250424011308-f42440d1ace1 github.com/prometheus/client_golang v1.17.0 github.com/stretchr/testify v1.9.0 github.com/tendermint/tendermint v0.35.9 diff --git a/oracle/go.sum b/oracle/go.sum index 7d0b4244..c57d0dee 100644 --- a/oracle/go.sum +++ b/oracle/go.sum @@ -173,14 +173,12 @@ github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqky github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/morph-l2/externalsign v0.3.0 h1:eVGON//ofO5eJSZvJQW+8HUeaGlg4seaS99SzS8GQc4= -github.com/morph-l2/externalsign v0.3.0/go.mod h1:b6NJ4GUiiG/gcSJsp3p8ExsIs4ZdphlrVALASnVoGJE= github.com/morph-l2/externalsign v0.3.1 h1:UYFDZFB0L85A4rDvuwLNBiGEi0kSmg9AZ2v8Q5O4dQo= github.com/morph-l2/externalsign v0.3.1/go.mod h1:b6NJ4GUiiG/gcSJsp3p8ExsIs4ZdphlrVALASnVoGJE= -github.com/morph-l2/go-ethereum v1.10.14-0.20241021080617-0ff2a10a9625 h1:4+cbRSS4lacSIC81RXxvA04UHhGVC4SHVn+bKeqhPSM= -github.com/morph-l2/go-ethereum v1.10.14-0.20241021080617-0ff2a10a9625/go.mod h1:sMJCfHOBzVRDkM2yF/Hy+oUk2rgC0CQZHTLs0cyzhhk= -github.com/morph-l2/tendermint v0.3.1 h1:yqyM3/p9sCNmFSsIFeIxS5RBgXHWqbtyNHx16I9cIZ0= -github.com/morph-l2/tendermint v0.3.1/go.mod h1:TtCzp9l6Z6yDUiwv3TbqKqw8Q8RKp3fSz5+adO1/Y8w= +github.com/morph-l2/go-ethereum v1.10.14-0.20250424011308-f42440d1ace1 h1:Mtl4361Zdc8w3SgCI7L/NuPeLaVdX1L/uP/D4ur/9Yw= +github.com/morph-l2/go-ethereum v1.10.14-0.20250424011308-f42440d1ace1/go.mod h1:sMJCfHOBzVRDkM2yF/Hy+oUk2rgC0CQZHTLs0cyzhhk= +github.com/morph-l2/tendermint v0.3.2 h1:Gu6Uj2G6c3YP2NAKFi7A46JZaOCdD4zfZDKCjt0pDm8= +github.com/morph-l2/tendermint v0.3.2/go.mod h1:TtCzp9l6Z6yDUiwv3TbqKqw8Q8RKp3fSz5+adO1/Y8w= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= diff --git a/oracle/oracle/batch.go b/oracle/oracle/batch.go index 7f29d202..2384637c 100644 --- a/oracle/oracle/batch.go +++ b/oracle/oracle/batch.go @@ -10,6 +10,7 @@ import ( "morph-l2/bindings/bindings" "morph-l2/node/derivation" + nodetypes "morph-l2/node/types" "morph-l2/oracle/backoff" "github.com/morph-l2/go-ethereum/accounts/abi/bind" @@ -19,6 +20,10 @@ import ( "github.com/morph-l2/go-ethereum/log" ) +var BeforeRemoveSkipMapMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"_chainID\",\"type\":\"uint64\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ErrZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorIncorrectBatchLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ErrorNoBlockInBatch\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"winner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"string\",\"name\":\"res\",\"type\":\"string\"}],\"name\":\"ChallengeRes\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ChallengeRewardClaim\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint64\",\"name\":\"batchIndex\",\"type\":\"uint64\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"challengeDeposit\",\"type\":\"uint256\"}],\"name\":\"ChallengeState\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"name\":\"CommitBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"withdrawRoot\",\"type\":\"bytes32\"}],\"name\":\"FinalizeBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Paused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"ProveRemainingClaimed\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"name\":\"RevertBatch\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"Unpaused\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"status\",\"type\":\"bool\"}],\"name\":\"UpdateChallenger\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldPeriod\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPeriod\",\"type\":\"uint256\"}],\"name\":\"UpdateFinalizationPeriodSeconds\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldPercent\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPercent\",\"type\":\"uint256\"}],\"name\":\"UpdateProofRewardPercent\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"oldWindow\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newWindow\",\"type\":\"uint256\"}],\"name\":\"UpdateProofWindow\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"oldVerifier\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newVerifier\",\"type\":\"address\"}],\"name\":\"UpdateVerifier\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"LAYER_2_CHAIN_ID\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"\",\"type\":\"uint64\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"__maxNumTxInChunk\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"addChallenger\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"batchChallengeReward\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"batchChallenged\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchChallengedSuccess\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchDataStore\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"originTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"finalizeTimestamp\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"blockNumber\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"signedSequencersBitmap\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchExist\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchInChallenge\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"batchInsideChallengeWindow\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint64\",\"name\":\"batchIndex\",\"type\":\"uint64\"},{\"internalType\":\"bytes32\",\"name\":\"_batchHash\",\"type\":\"bytes32\"}],\"name\":\"challengeState\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"challenges\",\"outputs\":[{\"internalType\":\"uint64\",\"name\":\"batchIndex\",\"type\":\"uint64\"},{\"internalType\":\"address\",\"name\":\"challenger\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"challengeDeposit\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"startTime\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"challengeSuccess\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"finished\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"claimProveRemaining\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"}],\"name\":\"claimReward\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"},{\"internalType\":\"bytes\",\"name\":\"parentBatchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"blockContexts\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"skippedL1MessageBitmap\",\"type\":\"bytes\"},{\"internalType\":\"bytes32\",\"name\":\"prevStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"postStateRoot\",\"type\":\"bytes32\"},{\"internalType\":\"bytes32\",\"name\":\"withdrawalRoot\",\"type\":\"bytes32\"}],\"internalType\":\"structIRollup.BatchDataInput\",\"name\":\"batchDataInput\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"uint256\",\"name\":\"signedSequencersBitmap\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"sequencerSets\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"signature\",\"type\":\"bytes\"}],\"internalType\":\"structIRollup.BatchSignatureInput\",\"name\":\"batchSignatureInput\",\"type\":\"tuple\"}],\"name\":\"commitBatch\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"committedBatches\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"batchHash\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"finalizationPeriodSeconds\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"}],\"name\":\"finalizeBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"batchIndex\",\"type\":\"uint256\"}],\"name\":\"finalizedStateRoots\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"stateRoot\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"}],\"name\":\"importGenesisBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"inChallenge\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_l1StakingContract\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_messageQueue\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"_verifier\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_finalizationPeriodSeconds\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_proofWindow\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"_proofRewardPercent\",\"type\":\"uint256\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_batchIndex\",\"type\":\"uint256\"}],\"name\":\"isBatchFinalized\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"challengerAddress\",\"type\":\"address\"}],\"name\":\"isChallenger\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"isChallenger\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"l1StakingContract\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastCommittedBatchIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"lastFinalizedBatchIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"messageQueue\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"paused\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proofRewardPercent\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proofWindow\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"proveRemaining\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_batchProof\",\"type\":\"bytes\"}],\"name\":\"proveState\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_account\",\"type\":\"address\"}],\"name\":\"removeChallenger\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"uint256\",\"name\":\"_count\",\"type\":\"uint256\"}],\"name\":\"revertBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"revertReqIndex\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_status\",\"type\":\"bool\"}],\"name\":\"setPause\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newPeriod\",\"type\":\"uint256\"}],\"name\":\"updateFinalizePeriodSeconds\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newWindow\",\"type\":\"uint256\"}],\"name\":\"updateProofWindow\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_newProofRewardPercent\",\"type\":\"uint256\"}],\"name\":\"updateRewardPercentage\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_newVerifier\",\"type\":\"address\"}],\"name\":\"updateVerifier\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"verifier\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"withdrawalRoot\",\"type\":\"bytes32\"}],\"name\":\"withdrawalRoots\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"exist\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"stateMutability\":\"payable\",\"type\":\"receive\"}]", +} + type BatchInfoMap map[common.Hash][]BatchInfo type RollupBatch struct { TxCount uint64 @@ -35,7 +40,7 @@ type BatchInfo struct { func (o *Oracle) GetStartBlock(nextBatchSubmissionIndex *big.Int) (uint64, error) { if nextBatchSubmissionIndex.Uint64() == 1 { - return o.cfg.StartBlock, nil + return o.cfg.StartBlock + 1, nil } bs, err := o.record.BatchSubmissions(nil, new(big.Int).Sub(nextBatchSubmissionIndex, big.NewInt(1))) if err != nil { @@ -45,8 +50,19 @@ func (o *Oracle) GetStartBlock(nextBatchSubmissionIndex *big.Int) (uint64, error } func (o *Oracle) GetBatchSubmission(ctx context.Context, startBlock, nextBatchSubmissionIndex uint64) ([]bindings.IRecordBatchSubmission, error) { - var rLogs []types.Log + var recordBatchSubmissions []bindings.IRecordBatchSubmission + lastLogs, err := o.fetchRollupLog(ctx, startBlock-1, startBlock-1) + if err != nil { + return nil, fmt.Errorf("fetch rollupLog error:%v", err) + } + if err = o.getBatchSubmissionByLogs(lastLogs, &recordBatchSubmissions, nextBatchSubmissionIndex); err != nil { + return nil, fmt.Errorf("GetBatchSubmissionByLogs error:%v", err) + } + if len(recordBatchSubmissions) == maxBatchSize { + return recordBatchSubmissions, nil + } for { + batchIndex := nextBatchSubmissionIndex + uint64(len(recordBatchSubmissions)) endBlock := startBlock + o.cfg.MaxSize header, err := o.l1Client.HeaderByNumber(o.ctx, nil) if err != nil { @@ -59,84 +75,130 @@ func (o *Oracle) GetBatchSubmission(ctx context.Context, startBlock, nextBatchSu if endBlock >= header.Number.Uint64() { endBlock = header.Number.Uint64() } - rLogs, err = o.fetchRollupLog(ctx, startBlock, endBlock) + fetchLogs, err := o.fetchRollupLog(ctx, startBlock, endBlock) if err != nil { return nil, fmt.Errorf("fetch rollupLog error:%v", err) } - if len(rLogs) > 1 { - break + if err = o.getBatchSubmissionByLogs(fetchLogs, &recordBatchSubmissions, batchIndex); err != nil { + return nil, fmt.Errorf("GetBatchSubmissionByLogs error:%v", err) + } + if len(recordBatchSubmissions) == maxBatchSize { + return recordBatchSubmissions, nil } startBlock = endBlock + 1 } +} - var recordBatchSubmissions []bindings.IRecordBatchSubmission - batchIndex := nextBatchSubmissionIndex +func (o *Oracle) getBatchSubmissionByLogs(rLogs []types.Log, recordBatchSubmissions *[]bindings.IRecordBatchSubmission, batchIndex uint64) error { for _, lg := range rLogs { - tx, pending, err := o.l1Client.TransactionByHash(ctx, lg.TxHash) + tx, pending, err := o.l1Client.TransactionByHash(o.ctx, lg.TxHash) if err != nil { - return nil, fmt.Errorf("get transaction by hash error:%v", err) + return fmt.Errorf("get transaction by hash error:%v", err) } signer := types.NewLondonSignerWithEIP4844(tx.ChainId()) msg, err := tx.AsMessage(signer, tx.GasFeeCap()) if err != nil { - return nil, err + return err } header, err := o.l1Client.HeaderByNumber(context.Background(), big.NewInt(int64(lg.BlockNumber))) if err != nil { - return nil, fmt.Errorf("get header by number error:%v", err) + return fmt.Errorf("get header by number error:%v", err) } if pending { - return nil, errors.New("pending transaction") + return errors.New("pending transaction") + } + beforeRemoveSkipMapAbi, err := BeforeRemoveSkipMapMetaData.GetAbi() + if err != nil { + return err } abi, err := bindings.RollupMetaData.GetAbi() if err != nil { - return nil, err + return err + } + var batch eth.RPCRollupBatch + if bytes.Equal(tx.Data()[0:4], abi.Methods["commitBatch"].ID) { + args, err := abi.Methods["commitBatch"].Inputs.Unpack(tx.Data()[4:]) + if err != nil { + log.Error("fetch batch info failed", "txHash", lg.TxHash, "blockNumber", lg.BlockNumber, "error", err) + return fmt.Errorf("unpack commitBatch error:%v", err) + } + rollupBatchData := args[0].(struct { + Version uint8 "json:\"version\"" + ParentBatchHeader []uint8 "json:\"parentBatchHeader\"" + BlockContexts []uint8 "json:\"blockContexts\"" + PrevStateRoot [32]uint8 "json:\"prevStateRoot\"" + PostStateRoot [32]uint8 "json:\"postStateRoot\"" + WithdrawalRoot [32]uint8 "json:\"withdrawalRoot\"" + }) + batch = eth.RPCRollupBatch{ + Version: uint(rollupBatchData.Version), + ParentBatchHeader: rollupBatchData.ParentBatchHeader, + BlockContexts: rollupBatchData.BlockContexts, + PrevStateRoot: common.BytesToHash(rollupBatchData.PrevStateRoot[:]), + PostStateRoot: common.BytesToHash(rollupBatchData.PostStateRoot[:]), + WithdrawRoot: common.BytesToHash(rollupBatchData.WithdrawalRoot[:]), + } + } else if bytes.Equal(tx.Data()[0:4], beforeRemoveSkipMapAbi.Methods["commitBatch"].ID) { + args, err := beforeRemoveSkipMapAbi.Methods["commitBatch"].Inputs.Unpack(tx.Data()[4:]) + if err != nil { + log.Error("fetch batch info failed", "txHash", lg.TxHash, "blockNumber", lg.BlockNumber, "error", err) + return fmt.Errorf("unpack commitBatch error:%v", err) + } + + rollupBatchData := args[0].(struct { + Version uint8 "json:\"version\"" + ParentBatchHeader []uint8 "json:\"parentBatchHeader\"" + BlockContexts []uint8 "json:\"blockContexts\"" + SkippedL1MessageBitmap []uint8 "json:\"skippedL1MessageBitmap\"" + PrevStateRoot [32]uint8 "json:\"prevStateRoot\"" + PostStateRoot [32]uint8 "json:\"postStateRoot\"" + WithdrawalRoot [32]uint8 "json:\"withdrawalRoot\"" + }) + batch = eth.RPCRollupBatch{ + Version: uint(rollupBatchData.Version), + ParentBatchHeader: rollupBatchData.ParentBatchHeader, + BlockContexts: rollupBatchData.BlockContexts, + //SkippedL1MessageBitmap: rollupBatchData.SkippedL1MessageBitmap, + PrevStateRoot: common.BytesToHash(rollupBatchData.PrevStateRoot[:]), + PostStateRoot: common.BytesToHash(rollupBatchData.PostStateRoot[:]), + WithdrawRoot: common.BytesToHash(rollupBatchData.WithdrawalRoot[:]), + } + parentBatchHeader := nodetypes.BatchHeaderBytes(batch.ParentBatchHeader) + parentVersion, err := parentBatchHeader.Version() + if err != nil { + return fmt.Errorf("decode parent batch version error:%v", err) + } + if batch.Version == 1 && parentVersion == 0 { + parentBatchIndex, err := parentBatchHeader.BatchIndex() + if err != nil { + return fmt.Errorf("decode parent batch index error:%v", err) + } + parentBatch, err := o.l2Client.GetRollupBatchByIndex(o.ctx, parentBatchIndex) + if err != nil { + return fmt.Errorf("get parent batch error:%v", err) + } + batch.Sidecar = parentBatch.Sidecar + } + } else { + continue } rollupCommitBatch, parseErr := o.rollup.ParseCommitBatch(lg) if parseErr != nil { log.Error("get l2 BlockNumber", "err", err) - return nil, parseErr - } - - if !bytes.Equal(abi.Methods["commitBatch"].ID, tx.Data()[:4]) { - continue + return parseErr } if rollupCommitBatch.BatchIndex.Uint64() < batchIndex { continue } if rollupCommitBatch.BatchIndex.Uint64() > batchIndex { - return nil, fmt.Errorf(fmt.Sprintf("batch is incontinuity,expect %v,have %v", batchIndex, rollupCommitBatch.BatchIndex.Uint64())) + return fmt.Errorf(fmt.Sprintf("batch is incontinuity,expect %v,have %v", batchIndex, rollupCommitBatch.BatchIndex.Uint64())) } // set batchIndex to new batch index + 1 batchIndex = rollupCommitBatch.BatchIndex.Uint64() + 1 - args, err := abi.Methods["commitBatch"].Inputs.Unpack(tx.Data()[4:]) - if err != nil { - log.Error("fetch batch info failed", "txHash", lg.TxHash, "blockNumber", lg.BlockNumber, "error", err) - return nil, err - } - rollupBatchData := args[0].(struct { - Version uint8 "json:\"version\"" - ParentBatchHeader []uint8 "json:\"parentBatchHeader\"" - BlockContexts []uint8 "json:\"blockContexts\"" - SkippedL1MessageBitmap []uint8 "json:\"skippedL1MessageBitmap\"" - PrevStateRoot [32]uint8 "json:\"prevStateRoot\"" - PostStateRoot [32]uint8 "json:\"postStateRoot\"" - WithdrawalRoot [32]uint8 "json:\"withdrawalRoot\"" - }) - - batch := eth.RPCRollupBatch{ - Version: uint(rollupBatchData.Version), - ParentBatchHeader: rollupBatchData.ParentBatchHeader, - BlockContexts: rollupBatchData.BlockContexts, - SkippedL1MessageBitmap: rollupBatchData.SkippedL1MessageBitmap, - PrevStateRoot: common.BytesToHash(rollupBatchData.PrevStateRoot[:]), - PostStateRoot: common.BytesToHash(rollupBatchData.PostStateRoot[:]), - WithdrawRoot: common.BytesToHash(rollupBatchData.WithdrawalRoot[:]), - } var batchData derivation.BatchInfo if err = batchData.ParseBatch(batch); err != nil { - return nil, fmt.Errorf("parse batch error:%v", err) + return fmt.Errorf("parse batch error:%v", err) } log.Info("received new batch", "batch_index", rollupCommitBatch.BatchIndex.Uint64()) recordBatchSubmission := bindings.IRecordBatchSubmission{ @@ -147,12 +209,12 @@ func (o *Oracle) GetBatchSubmission(ctx context.Context, startBlock, nextBatchSu RollupTime: big.NewInt(int64(header.Time)), RollupBlock: big.NewInt(int64(lg.BlockNumber)), } - recordBatchSubmissions = append(recordBatchSubmissions, recordBatchSubmission) - if len(recordBatchSubmissions) == maxBatchSize { - return recordBatchSubmissions, nil + *recordBatchSubmissions = append(*recordBatchSubmissions, recordBatchSubmission) + if len(*recordBatchSubmissions) == maxBatchSize { + return nil } } - return recordBatchSubmissions, nil + return nil } func (o *Oracle) fetchRollupLog(ctx context.Context, start, end uint64) ([]types.Log, error) { @@ -221,9 +283,13 @@ func (o *Oracle) submitRecord() error { if err != nil { return fmt.Errorf("record finalized batch error:%v,batchLength:%v", err, len(batchSubmissions)) } - log.Info("record finalized batch success", "txHash", tx.Hash(), "batchLength", len(batchSubmissions)) + err = o.l2Client.SendTransaction(o.ctx, tx) + if err != nil { + return fmt.Errorf("send transaction error:%v", err) + } + log.Info("record finalized batch success", "txHash", tx.Hash(), "batchLength", len(batchSubmissions), "nonce", tx.Nonce()) var receipt *types.Receipt - err = backoff.Do(30, backoff.Exponential(), func() error { + err = backoff.Do(3, backoff.Exponential(), func() error { var err error receipt, err = o.waitReceiptWithCtx(o.ctx, tx.Hash()) return err diff --git a/oracle/oracle/oracle.go b/oracle/oracle/oracle.go index 5c789e93..8f688313 100644 --- a/oracle/oracle/oracle.go +++ b/oracle/oracle/oracle.go @@ -63,7 +63,7 @@ func Main() func(ctx *cli.Context) error { log.Info("metrics server enabled", "host", cfg.MetricsHostname, "port", cfg.MetricsPort) } <-(chan struct{})(nil) - log.Info("staking oracle stoped") + log.Info("staking oracle stopped") return nil } } diff --git a/oracle/oracle/reward.go b/oracle/oracle/reward.go index f67ad451..fd765b37 100644 --- a/oracle/oracle/reward.go +++ b/oracle/oracle/reward.go @@ -310,7 +310,7 @@ func (o *Oracle) setStartBlock() { if errors.Is(err, ErrRewardNotStart) { log.Info(err.Error()) } else { - log.Error("query reward start falied", "error", err) + log.Error("query reward start failed", "error", err) } time.Sleep(defaultSleepTime) continue diff --git a/oracle/oracle/rollup.go b/oracle/oracle/rollup.go index 6c9256b0..c6052faf 100644 --- a/oracle/oracle/rollup.go +++ b/oracle/oracle/rollup.go @@ -140,7 +140,7 @@ func (o *Oracle) recordRollupEpoch() error { } epochs, err := o.generateRollupEpoch(epochIndex.Int64(), rollupEpoch.EndTime.Int64(), epochTime.Int64(), updateTime, int64(endBlock), int64(header.Time), math.MaxInt64, sets) if err != nil { - return fmt.Errorf("gernerate rollup epoch info error:%v", err) + return fmt.Errorf("generate rollup epoch info error:%v", err) } rollupEpochInfos = append(rollupEpochInfos, epochs...) } diff --git a/prover/Cargo.lock b/prover/Cargo.lock index 7b21316e..bca96208 100644 --- a/prover/Cargo.lock +++ b/prover/Cargo.lock @@ -5095,7 +5095,7 @@ dependencies = [ [[package]] name = "revm" version = "14.0.0" -source = "git+https://github.com/morph-l2/revm?branch=release/v42#f5f08b959a6f051dce324c471e58a2a6b574c3d1" +source = "git+https://github.com/morph-l2/revm?branch=release/v42#91f2d1a886e60c40b13ec178f3160001c71c0912" dependencies = [ "auto_impl", "cfg-if 1.0.0", @@ -5109,7 +5109,7 @@ dependencies = [ [[package]] name = "revm-interpreter" version = "10.0.0" -source = "git+https://github.com/morph-l2/revm?branch=release/v42#f5f08b959a6f051dce324c471e58a2a6b574c3d1" +source = "git+https://github.com/morph-l2/revm?branch=release/v42#91f2d1a886e60c40b13ec178f3160001c71c0912" dependencies = [ "cfg-if 1.0.0", "revm-primitives", @@ -5119,7 +5119,7 @@ dependencies = [ [[package]] name = "revm-precompile" version = "11.0.0" -source = "git+https://github.com/morph-l2/revm?branch=release/v42#f5f08b959a6f051dce324c471e58a2a6b574c3d1" +source = "git+https://github.com/morph-l2/revm?branch=release/v42#91f2d1a886e60c40b13ec178f3160001c71c0912" dependencies = [ "aurora-engine-modexp", "c-kzg", @@ -5136,7 +5136,7 @@ dependencies = [ [[package]] name = "revm-primitives" version = "9.0.0" -source = "git+https://github.com/morph-l2/revm?branch=release/v42#f5f08b959a6f051dce324c471e58a2a6b574c3d1" +source = "git+https://github.com/morph-l2/revm?branch=release/v42#91f2d1a886e60c40b13ec178f3160001c71c0912" dependencies = [ "alloy-eips", "alloy-primitives 0.8.0", diff --git a/prover/Cargo.toml b/prover/Cargo.toml index 24401aab..1c27113c 100644 --- a/prover/Cargo.toml +++ b/prover/Cargo.toml @@ -24,11 +24,6 @@ license = "MIT OR Apache-2.0" homepage = "https://github.com/morph-l2/morph/tree/main/prover" repository = "https://github.com/morph-l2/morph/tree/main/prover" - - - - - [workspace.dependencies] alloy ={ version ="0.3"} hex = "0.4" diff --git a/prover/Makefile b/prover/Makefile index ff397cdc..2961c169 100644 --- a/prover/Makefile +++ b/prover/Makefile @@ -1,7 +1,6 @@ build-plonk-circuits: docker build -f Dockerfile.sp1-plonk -t sp1-plonk:latest . - save-plonk-circuits: rm -rf plonk-circuits && \ mkdir -p plonk-circuits && \ @@ -17,11 +16,10 @@ start-server: stop-server: docker compose -f docker-compose-app.yml down - build-shadow-prove: - cd bin/shadow-prove + cd bin/shadow-prove && \ cargo build --release build-challenge: - cd bin/challenge + cd bin/challenge && \ cargo build --release \ No newline at end of file diff --git a/prover/README.md b/prover/README.md index 813c0b4c..b8a2b718 100644 --- a/prover/README.md +++ b/prover/README.md @@ -26,7 +26,7 @@ To build the program to risc-v bin: ```sh cd bin/client cargo prove build - +``` This will output the compiled ELF to the file program/elf/riscv32im-succinct-zkvm-elf. diff --git a/prover/bin/challenge/src/abi/Rollup.json b/prover/bin/challenge/src/abi/Rollup.json index 10b61fb3..28f7a5c6 100644 --- a/prover/bin/challenge/src/abi/Rollup.json +++ b/prover/bin/challenge/src/abi/Rollup.json @@ -15,16 +15,6 @@ "name": "ErrZeroAddress", "type": "error" }, - { - "inputs": [], - "name": "ErrorIncorrectBatchLength", - "type": "error" - }, - { - "inputs": [], - "name": "ErrorNoBlockInBatch", - "type": "error" - }, { "anonymous": false, "inputs": [ @@ -619,14 +609,14 @@ "type": "bytes" }, { - "internalType": "bytes", - "name": "blockContexts", - "type": "bytes" + "internalType": "uint64", + "name": "lastBlockNumber", + "type": "uint64" }, { - "internalType": "bytes", - "name": "skippedL1MessageBitmap", - "type": "bytes" + "internalType": "uint16", + "name": "numL1Messages", + "type": "uint16" }, { "internalType": "bytes32", @@ -695,6 +685,25 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "batchIndex", + "type": "uint256" + } + ], + "name": "committedStateRoots", + "outputs": [ + { + "internalType": "bytes32", + "name": "stateRoot", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "finalizationPeriodSeconds", @@ -804,6 +813,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_prevStateRoot", + "type": "bytes32" + } + ], + "name": "initialize2", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -1142,4 +1164,4 @@ "stateMutability": "payable", "type": "receive" } -] \ No newline at end of file +] diff --git a/prover/bin/challenge/src/handler.rs b/prover/bin/challenge/src/handler.rs index 58429344..cdb8ea42 100644 --- a/prover/bin/challenge/src/handler.rs +++ b/prover/bin/challenge/src/handler.rs @@ -1,4 +1,4 @@ -use crate::abi::rollup_abi::{CommitBatchCall, Rollup, RollupErrors}; +use crate::abi::rollup_abi::{CommitBatchCall, Rollup}; use crate::external_sign::ExternalSign; use crate::metrics::METRICS; use crate::util::read_env_var; @@ -152,7 +152,7 @@ impl ChallengeHandler { None => continue, }; - let mut batch_info = match batch_inspect(l1_provider, challenged_rollup_hash).await { + let mut batch_info = match batch_inspect(l1_rollup, l1_provider, batch_index, challenged_rollup_hash).await { Some(mut b) => { b.batch_index = batch_index; b.parent_batch_hash = batch_hash.as_bytes().try_into().unwrap_or_default(); @@ -161,15 +161,15 @@ impl ChallengeHandler { None => continue, }; - let blocks = &batch_info.blocks_info; + let blocks_len = batch_info.end_block - batch_info.start_block + 1; log::info!( "batch info: batch index = {:#?}, blocks len = {:#?}, start_block = {:#?}, end_block = {:#?}", batch_info.batch_index, - blocks.len(), - blocks.first().unwrap_or(&0u64), - blocks.last().unwrap_or(&0u64), + batch_info.end_block - batch_info.start_block + 1, + batch_info.start_block, + batch_info.end_block, ); - METRICS.blocks_len.set(blocks.len() as i64); + METRICS.blocks_len.set((batch_info.end_block - batch_info.start_block + 1) as i64); if let Some(batch_proof) = query_proof(batch_index).await { if !batch_proof.proof_data.is_empty() { @@ -183,8 +183,8 @@ impl ChallengeHandler { // Step4. Make a call to the Prove server. let request = ProveRequest { batch_index, - start_block: *blocks.first().unwrap_or(&0u64), - end_block: *blocks.last().unwrap_or(&0u64), + start_block: batch_info.start_block, + end_block: batch_info.end_block, rpc: l2_rpc.to_owned(), }; let rt = tokio::task::spawn_blocking(move || util::call_prover(serde_json::to_string(&request).unwrap(), "/prove_batch")) @@ -218,7 +218,7 @@ impl ChallengeHandler { } // Step5. query proof and prove onchain state. - let mut max_waiting_time: usize = 1600 * blocks.len(); //block_prove_time =30min + let mut max_waiting_time: usize = 1600 * blocks_len as usize; //block_prove_time =30min while max_waiting_time > 300 { sleep(Duration::from_secs(300)).await; max_waiting_time -= 300; @@ -408,7 +408,8 @@ async fn detecte_challenge_event(latest: U64, l1_rollup: &RollupType, l1_provide struct BatchInfo { version: u8, batch_index: u64, - blocks_info: Vec, + start_block: u64, + end_block: u64, l1_message_popped: u64, total_l1_message_popped: u64, data_hash: [u8; 32], @@ -418,10 +419,16 @@ struct BatchInfo { withdrawal_root: [u8; 32], sequencer_set_verify_hash: [u8; 32], parent_batch_hash: [u8; 32], - skipped_l1_message_bitmap: Bytes, } -async fn batch_inspect(l1_provider: &Provider, hash: TxHash) -> Option { +async fn batch_inspect(l1_rollup: &RollupType, l1_provider: &Provider, batch_index: u64, hash: TxHash) -> Option { + let prev_batch_last_bn: U256 = match l1_rollup.batch_data_store(U256::from(batch_index - 1)).await { + Ok(s) => s.2, + Err(e) => { + log::error!("l1_rollup.batch_data_store err: {:#?}", e); + return None; + } + }; //Step1. Get transaction let result = l1_provider.get_transaction(hash).await; let tx = match result { @@ -450,20 +457,20 @@ async fn batch_inspect(l1_provider: &Provider, hash: TxHash) -> Option Option<(Vec, u64)> { - if block_contexts.is_empty() { - return None; - } - - let mut blocks: Vec = vec![]; - let mut txn_in_batch = 0u32; - let mut total_l1_txn = 0u64; - let bs: &[u8] = &block_contexts; - - // decode blocks from batch - // | 2 bytes | 60 bytes | ... | 60 bytes | - // | num blocks | block 1 | ... | block n | - let num_blocks: u16 = ((bs[0] as u16) << 8) | (bs[1] as u16); - - for i in 0..num_blocks as usize { - let block_num = u64::from_be_bytes(bs.get((60.mul(i) + 2)..(60.mul(i) + 2 + 8))?.try_into().unwrap()); - let txs_num = u16::from_be_bytes(bs.get((60.mul(i) + 2 + 56)..(60.mul(i) + 2 + 58))?.try_into().unwrap()); - let l1_txs_num = u16::from_be_bytes(bs.get((60.mul(i) + 2 + 58)..(60.mul(i) + 2 + 60))?.try_into().unwrap()); - txn_in_batch += txs_num as u32; - total_l1_txn += l1_txs_num as u64; - - blocks.push(block_num); - } - - METRICS.txn_len.set(txn_in_batch.into()); - log::info!("total_l2txn_in_batch: {:#?}", txn_in_batch); - log::debug!("num_blocks: {:#?}, decode_blocks: {:#?}", num_blocks, blocks); - Some((blocks, total_l1_txn)) -} - async fn send_transaction( contract: Address, calldata: Option, @@ -593,11 +569,7 @@ async fn sign_tx( pub fn contract_error(e: ContractError) -> String { let error_msg = if let Some(contract_err) = e.as_revert() { - if let Some(data) = RollupErrors::decode_with_selector(contract_err.as_ref()) { - format!("exec error: {:?}", data) - } else { - format!("unknown contract error: {:?}", contract_err) - } + format!("contract error: {:?}", contract_err) } else { format!("error: {:?}", e) }; diff --git a/prover/bin/challenge/src/main.rs b/prover/bin/challenge/src/main.rs index 04d3c15c..f134ac40 100644 --- a/prover/bin/challenge/src/main.rs +++ b/prover/bin/challenge/src/main.rs @@ -48,10 +48,8 @@ async fn metric_mng() { fn register_metrics() { // detected batch index. REGISTRY.register(Box::new(METRICS.detected_batch_index.clone())).unwrap(); - // chunks len. + // blocks len. REGISTRY.register(Box::new(METRICS.blocks_len.clone())).unwrap(); - // txn len. - REGISTRY.register(Box::new(METRICS.txn_len.clone())).unwrap(); // prover status. REGISTRY.register(Box::new(METRICS.verify_result.clone())).unwrap(); // wallet balance. diff --git a/prover/bin/challenge/src/metrics.rs b/prover/bin/challenge/src/metrics.rs index 4e014ab1..480d01f2 100644 --- a/prover/bin/challenge/src/metrics.rs +++ b/prover/bin/challenge/src/metrics.rs @@ -4,7 +4,6 @@ use prometheus::{Gauge, IntGauge, Registry}; pub struct Metrics { pub detected_batch_index: IntGauge, pub blocks_len: IntGauge, - pub txn_len: IntGauge, pub verify_result: IntGauge, pub wallet_balance: Gauge, } @@ -14,7 +13,6 @@ lazy_static! { pub static ref METRICS: Metrics = Metrics { detected_batch_index: IntGauge::new("detected_batch_index", "detected batch index").expect("detected metric can be created"), blocks_len: IntGauge::new("blocks_len", "blocks len").expect("blocks_len metric can be created"), - txn_len: IntGauge::new("txn_len", "txn len").expect("txn_len metric can be created"), verify_result: IntGauge::new("verify_result", "verify result").expect("verify metric can be created"), wallet_balance: Gauge::new("handler_wallet_balance", "handler wallet balance").expect("wallet metric can be created"), }; diff --git a/prover/bin/client/elf/riscv32im-succinct-zkvm-elf b/prover/bin/client/elf/riscv32im-succinct-zkvm-elf index 5656ce4d..e0daba3d 100755 Binary files a/prover/bin/client/elf/riscv32im-succinct-zkvm-elf and b/prover/bin/client/elf/riscv32im-succinct-zkvm-elf differ diff --git a/prover/bin/host/src/lib.rs b/prover/bin/host/src/lib.rs index 928db6cb..7c814717 100644 --- a/prover/bin/host/src/lib.rs +++ b/prover/bin/host/src/lib.rs @@ -145,7 +145,7 @@ mod tests { std::env::set_var("TRUSTED_SETUP_4844", "../../configs/4844_trusted_setup.txt"); let blob_info: BlobInfo = populate_kzg(&blob).unwrap(); - let (versioned_hash, batch_data) = BlobVerifier::verify(&blob_info).unwrap(); + let (versioned_hash, batch_data) = BlobVerifier::verify(&blob_info, 1).unwrap(); println!( "versioned_hash: {:?}, batch_data len: {:?}", hex::encode(versioned_hash.as_slice()), diff --git a/prover/bin/server/src/lib.rs b/prover/bin/server/src/lib.rs index 799e5b5f..1b8cad32 100644 --- a/prover/bin/server/src/lib.rs +++ b/prover/bin/server/src/lib.rs @@ -7,13 +7,16 @@ use once_cell::sync::Lazy; use prometheus::{IntGauge, Registry}; // environment variables -pub static PROVER_PROOF_DIR: Lazy = Lazy::new(|| read_env_var("PROVER_PROOF_DIR", "./proof".to_string())); -pub static PROVER_L2_RPC: Lazy = Lazy::new(|| read_env_var("PROVER_L2_RPC", "localhost:8545".to_string())); +pub static PROVER_PROOF_DIR: Lazy = + Lazy::new(|| read_env_var("PROVER_PROOF_DIR", "./proof".to_string())); +pub static PROVER_L2_RPC: Lazy = + Lazy::new(|| read_env_var("PROVER_L2_RPC", "localhost:8545".to_string())); // metrics pub static REGISTRY: Lazy = Lazy::new(Registry::new); -pub static PROVE_RESULT: Lazy = - Lazy::new(|| IntGauge::new("prove_result", "prove result").expect("prove metric can be created")); // 1 = Ok, 2 = Fail +pub static PROVE_RESULT: Lazy = Lazy::new(|| { + IntGauge::new("prove_result", "prove result").expect("prove metric can be created") +}); // 1 = Ok, 2 = Fail pub static PROVE_TIME: Lazy = Lazy::new(|| IntGauge::new("prove_time", "prove time").expect("time metric can be created")); diff --git a/prover/bin/server/src/queue.rs b/prover/bin/server/src/queue.rs index a32609d7..b82e1bff 100644 --- a/prover/bin/server/src/queue.rs +++ b/prover/bin/server/src/queue.rs @@ -117,7 +117,7 @@ fn save_batch_header(blocks: &mut Vec, batch_index: u64) { blocks.iter_mut().for_each(|blobk| blobk.flatten()); let batch_info = EVMVerifier::verify(blocks).unwrap(); let blob_info = morph_executor_host::get_blob_info(blocks).unwrap(); - let (versioned_hash, _) = BlobVerifier::verify(&blob_info).unwrap(); + let (versioned_hash, _) = BlobVerifier::verify(&blob_info, blocks.len()).unwrap(); // Save batch_header // | batch_data_hash | versioned_hash | sequencer_root | diff --git a/prover/bin/shadow-prove/Cargo.lock b/prover/bin/shadow-prove/Cargo.lock index 539489b8..e671567f 100644 --- a/prover/bin/shadow-prove/Cargo.lock +++ b/prover/bin/shadow-prove/Cargo.lock @@ -30,6 +30,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" dependencies = [ "cfg-if 1.0.0", + "getrandom", "once_cell", "version_check", "zerocopy", @@ -67,9 +68,9 @@ checksum = "5c6cb57a04249c6480766f7f7cef5467412af1490f8d1e243141daddada3264f" [[package]] name = "alloy" -version = "0.3.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8367891bf380210abb0d6aa30c5f85a9080cb4a066c4d5c5acadad630823751b" +checksum = "59febb24956a41c29bb5f450978fbe825bd6456b3f80586c8bd558dc882e7b6a" dependencies = [ "alloy-consensus", "alloy-contract", @@ -100,23 +101,40 @@ dependencies = [ [[package]] name = "alloy-consensus" -version = "0.3.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "629b62e38d471cc15fea534eb7283d2f8a4e8bdb1811bcc5d66dda6cfce6fae1" +checksum = "e88e1edea70787c33e11197d3f32ae380f3db19e6e061e539a5bcf8184a6b326" dependencies = [ "alloy-eips", "alloy-primitives", "alloy-rlp", "alloy-serde", + "alloy-trie", + "auto_impl", "c-kzg", + "derive_more", + "serde", +] + +[[package]] +name = "alloy-consensus-any" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "57b1bb53f40c0273cd1975573cd457b39213e68584e36d1401d25fd0398a1d65" +dependencies = [ + "alloy-consensus", + "alloy-eips", + "alloy-primitives", + "alloy-rlp", + "alloy-serde", "serde", ] [[package]] name = "alloy-contract" -version = "0.3.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0eefe64fd344cffa9cf9e3435ec4e93e6e9c3481bc37269af988bf497faf4a6a" +checksum = "1b668c78c4b1f12f474ede5a85e8ce550d0aa1ef7d49fd1d22855a43b960e725" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", @@ -129,14 +147,14 @@ dependencies = [ "alloy-transport", "futures", "futures-util", - "thiserror", + "thiserror 2.0.9", ] [[package]] name = "alloy-core" -version = "0.8.5" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5ce854562e7cafd5049189d0268d6e5cba05fe6c9cb7c6f8126a79b94800629c" +checksum = "c618bd382f0bc2ac26a7e4bfae01c9b015ca8f21b37ca40059ae35a7e62b3dc6" dependencies = [ "alloy-dyn-abi", "alloy-json-abi", @@ -147,9 +165,9 @@ dependencies = [ [[package]] name = "alloy-dyn-abi" -version = "0.8.5" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b499852e1d0e9b8c6db0f24c48998e647c0d5762a01090f955106a7700e4611" +checksum = "41056bde53ae10ffbbf11618efbe1e0290859e5eab0fe9ef82ebdb62f12a866f" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -175,20 +193,21 @@ dependencies = [ [[package]] name = "alloy-eip7702" -version = "0.1.0" +version = "0.4.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "37d319bb544ca6caeab58c39cea8921c55d924d4f68f2c60f24f914673f9a74a" +checksum = "4c986539255fb839d1533c128e190e557e52ff652c9ef62939e233a81dd93f7e" dependencies = [ "alloy-primitives", "alloy-rlp", + "derive_more", "serde", ] [[package]] name = "alloy-eips" -version = "0.3.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "f923dd5fca5f67a43d81ed3ebad0880bd41f6dd0ada930030353ac356c54cd0f" +checksum = "5f9fadfe089e9ccc0650473f2d4ef0a28bc015bbca5631d9f0f09e49b557fdb3" dependencies = [ "alloy-eip2930", "alloy-eip7702", @@ -204,20 +223,21 @@ dependencies = [ [[package]] name = "alloy-genesis" -version = "0.3.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3a7a18afb0b318616b6b2b0e2e7ac5529d32a966c673b48091c9919e284e6aca" +checksum = "2b2a4cf7b70f3495788e74ce1c765260ffe38820a2a774ff4aacb62e31ea73f9" dependencies = [ "alloy-primitives", "alloy-serde", + "alloy-trie", "serde", ] [[package]] name = "alloy-json-abi" -version = "0.8.5" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a438d4486b5d525df3b3004188f9d5cd1d65cd30ecc41e5a3ccef6f6342e8af9" +checksum = "c357da577dfb56998d01f574d81ad7a1958d248740a7981b205d69d65a7da404" dependencies = [ "alloy-primitives", "alloy-sol-type-parser", @@ -227,29 +247,31 @@ dependencies = [ [[package]] name = "alloy-json-rpc" -version = "0.3.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3c717b5298fad078cd3a418335b266eba91b511383ca9bd497f742d5975d5ab" +checksum = "e29040b9d5fe2fb70415531882685b64f8efd08dfbd6cc907120650504821105" dependencies = [ "alloy-primitives", "alloy-sol-types", "serde", "serde_json", - "thiserror", + "thiserror 2.0.9", "tracing", ] [[package]] name = "alloy-network" -version = "0.3.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fb3705ce7d8602132bcf5ac7a1dd293a42adc2f183abf5907c30ac535ceca049" +checksum = "510cc00b318db0dfccfdd2d032411cfae64fc144aef9679409e014145d3dacc4" dependencies = [ "alloy-consensus", + "alloy-consensus-any", "alloy-eips", "alloy-json-rpc", "alloy-network-primitives", "alloy-primitives", + "alloy-rpc-types-any", "alloy-rpc-types-eth", "alloy-serde", "alloy-signer", @@ -257,15 +279,18 @@ dependencies = [ "async-trait", "auto_impl", "futures-utils-wasm", - "thiserror", + "serde", + "serde_json", + "thiserror 2.0.9", ] [[package]] name = "alloy-network-primitives" -version = "0.3.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94ad40869867ed2d9cd3842b1e800889e5b49e6b92da346e93862b4a741bedf3" +checksum = "9081c099e798b8a2bba2145eb82a9a146f01fc7a35e9ab6e7b43305051f97550" dependencies = [ + "alloy-consensus", "alloy-eips", "alloy-primitives", "alloy-serde", @@ -274,16 +299,17 @@ dependencies = [ [[package]] name = "alloy-primitives" -version = "0.8.5" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "260d3ff3bff0bb84599f032a2f2c6828180b0ea0cd41fdaf44f39cef3ba41861" +checksum = "6259a506ab13e1d658796c31e6e39d2e2ee89243bcc505ddc613b35732e0a430" dependencies = [ "alloy-rlp", "bytes", "cfg-if 1.0.0", "const-hex", "derive_more", - "hashbrown", + "foldhash", + "hashbrown 0.15.2", "hex-literal", "indexmap", "itoa", @@ -301,9 +327,9 @@ dependencies = [ [[package]] name = "alloy-provider" -version = "0.3.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "927f708dd457ed63420400ee5f06945df9632d5d101851952056840426a10dc5" +checksum = "dc2dfaddd9a30aa870a78a4e1316e3e115ec1e12e552cbc881310456b85c1f24" dependencies = [ "alloy-chains", "alloy-consensus", @@ -323,21 +349,24 @@ dependencies = [ "futures", "futures-utils-wasm", "lru", + "parking_lot", "pin-project", "reqwest 0.12.7", + "schnellru", "serde", "serde_json", - "thiserror", + "thiserror 2.0.9", "tokio", "tracing", "url", + "wasmtimer", ] [[package]] name = "alloy-rlp" -version = "0.3.8" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "26154390b1d205a4a7ac7352aa2eb4f81f391399d4e2f546fb81a2f8bb383f62" +checksum = "f542548a609dca89fcd72b3b9f355928cf844d4363c5eed9c5273a3dd225e097" dependencies = [ "alloy-rlp-derive", "arrayvec", @@ -346,22 +375,23 @@ dependencies = [ [[package]] name = "alloy-rlp-derive" -version = "0.3.8" +version = "0.3.10" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4d0f2d905ebd295e7effec65e5f6868d153936130ae718352771de3e7d03c75c" +checksum = "5a833d97bf8a5f0f878daf2c8451fff7de7f9de38baa5a45d936ec718d81255a" dependencies = [ "proc-macro2", "quote", - "syn 2.0.78", + "syn 2.0.91", ] [[package]] name = "alloy-rpc-client" -version = "0.3.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7d82952dca71173813d4e5733e2c986d8b04aea9e0f3b0a576664c232ad050a5" +checksum = "531137b283547d5b9a5cafc96b006c64ef76810c681d606f28be9781955293b6" dependencies = [ "alloy-json-rpc", + "alloy-primitives", "alloy-transport", "alloy-transport-http", "futures", @@ -374,35 +404,47 @@ dependencies = [ "tower 0.5.1", "tracing", "url", + "wasmtimer", ] [[package]] name = "alloy-rpc-types" -version = "0.3.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "64333d639f2a0cf73491813c629a405744e16343a4bc5640931be707c345ecc5" +checksum = "3410a472ce26c457e9780f708ee6bd540b30f88f1f31fdab7a11d00bd6aa1aee" dependencies = [ + "alloy-primitives", "alloy-rpc-types-eth", "alloy-serde", "serde", ] +[[package]] +name = "alloy-rpc-types-any" +version = "0.8.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ed98e1af55a7d856bfa385f30f63d8d56be2513593655c904a8f4a7ec963aa3e" +dependencies = [ + "alloy-consensus-any", + "alloy-rpc-types-eth", + "alloy-serde", +] + [[package]] name = "alloy-rpc-types-eth" -version = "0.3.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "83aa984386deda02482660aa31cb8ca1e63d533f1c31a52d7d181ac5ec68e9b8" +checksum = "8737d7a6e37ca7bba9c23e9495c6534caec6760eb24abc9d5ffbaaba147818e1" dependencies = [ "alloy-consensus", + "alloy-consensus-any", "alloy-eips", "alloy-network-primitives", "alloy-primitives", "alloy-rlp", "alloy-serde", "alloy-sol-types", - "cfg-if 1.0.0", "derive_more", - "hashbrown", "itertools 0.13.0", "serde", "serde_json", @@ -410,9 +452,9 @@ dependencies = [ [[package]] name = "alloy-serde" -version = "0.3.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "731f75ec5d383107fd745d781619bd9cedf145836c51ecb991623d41278e71fa" +checksum = "5851bf8d5ad33014bd0c45153c603303e730acc8a209450a7ae6b4a12c2789e2" dependencies = [ "alloy-primitives", "serde", @@ -421,23 +463,23 @@ dependencies = [ [[package]] name = "alloy-signer" -version = "0.3.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "307324cca94354cd654d6713629f0383ec037e1ff9e3e3d547212471209860c0" +checksum = "7e10ca565da6500cca015ba35ee424d59798f2e1b85bc0dd8f81dafd401f029a" dependencies = [ "alloy-primitives", "async-trait", "auto_impl", "elliptic-curve", "k256", - "thiserror", + "thiserror 2.0.9", ] [[package]] name = "alloy-signer-local" -version = "0.3.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fabe917ab1778e760b4701628d1cae8e028ee9d52ac6307de4e1e9286ab6b5f" +checksum = "47fababf5a745133490cde927d48e50267f97d3d1209b9fc9f1d1d666964d172" dependencies = [ "alloy-consensus", "alloy-network", @@ -446,28 +488,28 @@ dependencies = [ "async-trait", "k256", "rand", - "thiserror", + "thiserror 2.0.9", ] [[package]] name = "alloy-sol-macro" -version = "0.8.5" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "68e7f6e8fe5b443f82b3f1e15abfa191128f71569148428e49449d01f6f49e8b" +checksum = "d9d64f851d95619233f74b310f12bcf16e0cbc27ee3762b6115c14a84809280a" dependencies = [ "alloy-sol-macro-expander", "alloy-sol-macro-input", "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.78", + "syn 2.0.91", ] [[package]] name = "alloy-sol-macro-expander" -version = "0.8.5" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6b96ce28d2fde09abb6135f410c41fad670a3a770b6776869bd852f1df102e6f" +checksum = "6bf7ed1574b699f48bf17caab4e6e54c6d12bc3c006ab33d58b1e227c1c3559f" dependencies = [ "alloy-json-abi", "alloy-sol-macro-input", @@ -477,16 +519,16 @@ dependencies = [ "proc-macro-error2", "proc-macro2", "quote", - "syn 2.0.78", + "syn 2.0.91", "syn-solidity", "tiny-keccak", ] [[package]] name = "alloy-sol-macro-input" -version = "0.8.5" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "906746396a8296537745711630d9185746c0b50c033d5e9d18b0a6eba3d53f90" +checksum = "8c02997ccef5f34f9c099277d4145f183b422938ed5322dc57a089fe9b9ad9ee" dependencies = [ "alloy-json-abi", "const-hex", @@ -495,15 +537,15 @@ dependencies = [ "proc-macro2", "quote", "serde_json", - "syn 2.0.78", + "syn 2.0.91", "syn-solidity", ] [[package]] name = "alloy-sol-type-parser" -version = "0.8.5" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "bc85178909a49c8827ffccfc9103a7ce1767ae66a801b69bdc326913870bf8e6" +checksum = "ce13ff37285b0870d0a0746992a4ae48efaf34b766ae4c2640fa15e5305f8e73" dependencies = [ "serde", "winnow", @@ -511,9 +553,9 @@ dependencies = [ [[package]] name = "alloy-sol-types" -version = "0.8.5" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d86a533ce22525969661b25dfe296c112d35eb6861f188fd284f8bd4bb3842ae" +checksum = "1174cafd6c6d810711b4e00383037bdb458efc4fe3dbafafa16567e0320c54d8" dependencies = [ "alloy-json-abi", "alloy-primitives", @@ -524,9 +566,9 @@ dependencies = [ [[package]] name = "alloy-transport" -version = "0.3.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33616b2edf7454302a1d48084db185e52c309f73f6c10be99b0fe39354b3f1e9" +checksum = "538a04a37221469cac0ce231b737fd174de2fdfcdd843bdd068cb39ed3e066ad" dependencies = [ "alloy-json-rpc", "base64 0.22.1", @@ -534,18 +576,19 @@ dependencies = [ "futures-utils-wasm", "serde", "serde_json", - "thiserror", + "thiserror 2.0.9", "tokio", "tower 0.5.1", "tracing", "url", + "wasmtimer", ] [[package]] name = "alloy-transport-http" -version = "0.3.6" +version = "0.8.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a944f5310c690b62bbb3e7e5ce34527cbd36b2d18532a797af123271ce595a49" +checksum = "2ed40eb1e1265b2911512f6aa1dcece9702d078f5a646730c45e39e2be00ac1c" dependencies = [ "alloy-json-rpc", "alloy-transport", @@ -556,6 +599,22 @@ dependencies = [ "url", ] +[[package]] +name = "alloy-trie" +version = "0.7.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1e428104b2445a4f929030891b3dbf8c94433a8349ba6480946bf6af7975c2f6" +dependencies = [ + "alloy-primitives", + "alloy-rlp", + "arrayvec", + "derive_more", + "nybbles", + "serde", + "smallvec", + "tracing", +] + [[package]] name = "android-tzdata" version = "0.1.1" @@ -706,6 +765,9 @@ name = "arrayvec" version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "7c02d123df017efcdfbd739ef81735b36c5ba83ec3c59c80a9d7ecc718f92e50" +dependencies = [ + "serde", +] [[package]] name = "async-compression" @@ -742,7 +804,7 @@ checksum = "16e62a023e7c117e27523144c5d2459f4397fcc3cab0085af8e2224f643a0193" dependencies = [ "proc-macro2", "quote", - "syn 2.0.78", + "syn 2.0.91", ] [[package]] @@ -753,7 +815,7 @@ checksum = "721cae7de5c34fbb2acd27e21e6d2cf7b886dce0c27388d46c4e6c47ea4318dd" dependencies = [ "proc-macro2", "quote", - "syn 2.0.78", + "syn 2.0.91", ] [[package]] @@ -775,7 +837,7 @@ checksum = "3c87f3f15e7794432337fc718554eaa4dc8f04c9677a950ffe366f20a162ae42" dependencies = [ "proc-macro2", "quote", - "syn 2.0.78", + "syn 2.0.91", ] [[package]] @@ -1027,9 +1089,9 @@ dependencies = [ [[package]] name = "const-hex" -version = "1.12.0" +version = "1.14.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "94fb8a24a26d37e1ffd45343323dc9fe6654ceea44c12f2fcb3d7ac29e610bc6" +checksum = "4b0485bab839b018a8f1723fc5391819fea5f8f0f32288ef8a735fd096b6160c" dependencies = [ "cfg-if 1.0.0", "cpufeatures", @@ -1120,7 +1182,7 @@ checksum = "5041cc499144891f3790297212f32a74fb938e5136a14943f338ef9e0ae276cf" dependencies = [ "cfg-if 1.0.0", "crossbeam-utils", - "hashbrown", + "hashbrown 0.14.5", "lock_api", "once_cell", "parking_lot_core", @@ -1164,7 +1226,7 @@ checksum = "cb7330aeadfbe296029522e6c40f315320aba36fc43a5b3632f3795348f3bd22" dependencies = [ "proc-macro2", "quote", - "syn 2.0.78", + "syn 2.0.91", "unicode-xid", ] @@ -1338,7 +1400,7 @@ dependencies = [ "log", "nu-ansi-term", "regex", - "thiserror", + "thiserror 1.0.64", ] [[package]] @@ -1347,6 +1409,12 @@ version = "1.0.7" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3f9eec918d3f24069decb9af1554cad7c880e2da24a9afd88aca000531ab82c1" +[[package]] +name = "foldhash" +version = "0.1.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a0d2fde1f7b3d48b8395d5f2de76c18a528bd6a9cdde438df747bfcba3e05d6f" + [[package]] name = "foreign-types" version = "0.3.2" @@ -1433,7 +1501,7 @@ checksum = "87750cf4b7a4c0625b1529e4c543c2182106e4dedc60a2a6455e00d212c489ac" dependencies = [ "proc-macro2", "quote", - "syn 2.0.78", + "syn 2.0.91", ] [[package]] @@ -1536,6 +1604,12 @@ dependencies = [ "tracing", ] +[[package]] +name = "hashbrown" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43a3c133739dddd0d2990f9a4bdf8eb4b21ef50e4851ca85ab661199821d510e" + [[package]] name = "hashbrown" version = "0.14.5" @@ -1544,6 +1618,15 @@ checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" dependencies = [ "ahash", "allocator-api2", +] + +[[package]] +name = "hashbrown" +version = "0.15.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bf151400ff0baff5465007dd2f3e717f3fe502074ca563069ce3a6629d07b289" +dependencies = [ + "foldhash", "serde", ] @@ -1810,7 +1893,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "68b900aa2f7301e21c36462b170ee99994de34dff39a4a6a528e80e7376d07e5" dependencies = [ "equivalent", - "hashbrown", + "hashbrown 0.14.5", "serde", ] @@ -1970,7 +2053,7 @@ version = "0.12.4" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "37ee39891760e7d94734f6f63fedc29a2e4a152f836120753a72503f09fcf904" dependencies = [ - "hashbrown", + "hashbrown 0.14.5", ] [[package]] @@ -2104,7 +2187,20 @@ checksum = "af1844ef2428cc3e1cb900be36181049ef3d3193c63e43026cfe202983b27a56" dependencies = [ "proc-macro2", "quote", - "syn 2.0.78", + "syn 2.0.91", +] + +[[package]] +name = "nybbles" +version = "0.3.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "55a62e678a89501192cc5ebf47dcbc656b608ae5e1c61c9251fe35230f119fe3" +dependencies = [ + "alloy-rlp", + "const-hex", + "proptest", + "serde", + "smallvec", ] [[package]] @@ -2145,7 +2241,7 @@ checksum = "a948666b637a0f465e8564c73e89d4dde00d72d4d473cc972f390fc3dcee7d9c" dependencies = [ "proc-macro2", "quote", - "syn 2.0.78", + "syn 2.0.91", ] [[package]] @@ -2234,7 +2330,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "fdbef9d1d47087a895abd220ed25eb4ad973a5e26f6a4367b038c25e28dfc2d9" dependencies = [ "memchr", - "thiserror", + "thiserror 1.0.64", "ucd-trie", ] @@ -2255,7 +2351,7 @@ checksum = "2f38a4412a78282e09a2cf38d195ea5420d15ba0602cb375210efbc877243965" dependencies = [ "proc-macro2", "quote", - "syn 2.0.78", + "syn 2.0.91", ] [[package]] @@ -2334,14 +2430,14 @@ dependencies = [ "proc-macro-error-attr2", "proc-macro2", "quote", - "syn 2.0.78", + "syn 2.0.91", ] [[package]] name = "proc-macro2" -version = "1.0.86" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5e719e8df665df0d1c8fbfd238015744736151d4445ec0836b8e628aae103b77" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] @@ -2373,7 +2469,7 @@ dependencies = [ "procfs", "protobuf", "spin", - "thiserror", + "thiserror 1.0.64", ] [[package]] @@ -2730,6 +2826,17 @@ dependencies = [ "windows-sys 0.59.0", ] +[[package]] +name = "schnellru" +version = "0.2.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9a8ef13a93c54d20580de1e5c413e624e53121d42fc7e2c11d10ef7f8b02367" +dependencies = [ + "ahash", + "cfg-if 1.0.0", + "hashbrown 0.13.2", +] + [[package]] name = "scopeguard" version = "1.2.0" @@ -2814,7 +2921,7 @@ checksum = "243902eda00fad750862fc144cea25caca5e20d615af0a81bee94ca738f1df1f" dependencies = [ "proc-macro2", "quote", - "syn 2.0.78", + "syn 2.0.91", ] [[package]] @@ -2932,6 +3039,9 @@ name = "smallvec" version = "1.13.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "3c5e1a9a646d36c3599cd173a41282daf47c44583ad367b8e6837255952e5c67" +dependencies = [ + "serde", +] [[package]] name = "socket2" @@ -2984,7 +3094,7 @@ dependencies = [ "proc-macro2", "quote", "rustversion", - "syn 2.0.78", + "syn 2.0.91", ] [[package]] @@ -3006,9 +3116,9 @@ dependencies = [ [[package]] name = "syn" -version = "2.0.78" +version = "2.0.91" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "81b9b4733a9c8b8aaa20634df36eeb68cc0c0669f2e18fb287006b496a14195d" +checksum = "d53cbcb5a243bd33b7858b1d7f4aca2153490815872d86d955d6ea29f743c035" dependencies = [ "proc-macro2", "quote", @@ -3017,14 +3127,14 @@ dependencies = [ [[package]] name = "syn-solidity" -version = "0.8.5" +version = "0.8.15" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0ab661c8148c2261222a4d641ad5477fd4bea79406a99056096a0b41b35617a5" +checksum = "219389c1ebe89f8333df8bdfb871f6631c552ff399c23cac02480b6088aad8f0" dependencies = [ "paste", "proc-macro2", "quote", - "syn 2.0.78", + "syn 2.0.91", ] [[package]] @@ -3097,7 +3207,16 @@ version = "1.0.64" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d50af8abc119fb8bb6dbabcfa89656f46f84aa0ac7688088608076ad2b459a84" dependencies = [ - "thiserror-impl", + "thiserror-impl 1.0.64", +] + +[[package]] +name = "thiserror" +version = "2.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f072643fd0190df67a8bab670c20ef5d8737177d6ac6b2e9a236cb096206b2cc" +dependencies = [ + "thiserror-impl 2.0.9", ] [[package]] @@ -3108,7 +3227,18 @@ checksum = "08904e7672f5eb876eaaf87e0ce17857500934f4981c4a0ab2b4aa98baac7fc3" dependencies = [ "proc-macro2", "quote", - "syn 2.0.78", + "syn 2.0.91", +] + +[[package]] +name = "thiserror-impl" +version = "2.0.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7b50fa271071aae2e6ee85f842e2e28ba8cd2c5fb67f11fcb1fd70b276f9e7d4" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.91", ] [[package]] @@ -3170,7 +3300,7 @@ checksum = "693d596312e88961bc67d7f1f97af8a70227d9f90c31bba5806eec004978d752" dependencies = [ "proc-macro2", "quote", - "syn 2.0.78", + "syn 2.0.91", ] [[package]] @@ -3337,7 +3467,7 @@ checksum = "34704c8d6ebcbc939824180af020566b01a7c01f80641264eba0999f6c2b6be7" dependencies = [ "proc-macro2", "quote", - "syn 2.0.78", + "syn 2.0.91", ] [[package]] @@ -3505,7 +3635,7 @@ dependencies = [ "once_cell", "proc-macro2", "quote", - "syn 2.0.78", + "syn 2.0.91", "wasm-bindgen-shared", ] @@ -3539,7 +3669,7 @@ checksum = "afc340c74d9005395cf9dd098506f7f44e38f2b4a21c6aaacf9a105ea5e1e836" dependencies = [ "proc-macro2", "quote", - "syn 2.0.78", + "syn 2.0.91", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -3550,6 +3680,20 @@ version = "0.2.93" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "c62a0a307cb4a311d3a07867860911ca130c3494e8c2719593806c08bc5d0484" +[[package]] +name = "wasmtimer" +version = "0.4.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0048ad49a55b9deb3953841fa1fc5858f0efbcb7a18868c899a360269fac1b23" +dependencies = [ + "futures", + "js-sys", + "parking_lot", + "pin-utils", + "slab", + "wasm-bindgen", +] + [[package]] name = "web-sys" version = "0.3.70" @@ -3824,7 +3968,7 @@ checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" dependencies = [ "proc-macro2", "quote", - "syn 2.0.78", + "syn 2.0.91", ] [[package]] @@ -3844,7 +3988,7 @@ checksum = "ce36e65b0d2999d2aafac989fb249189a141aee1f53c612c1f37d72631959f69" dependencies = [ "proc-macro2", "quote", - "syn 2.0.78", + "syn 2.0.91", ] [[package]] diff --git a/prover/bin/shadow-prove/Cargo.toml b/prover/bin/shadow-prove/Cargo.toml index 5768b2ca..becb4cea 100644 --- a/prover/bin/shadow-prove/Cargo.toml +++ b/prover/bin/shadow-prove/Cargo.toml @@ -10,7 +10,7 @@ repository = "https://github.com/morph-l2/morph/tree/main/prover" # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html [dependencies] -alloy = { version = "0.3", features = [ +alloy = { version = "0.8", features = [ "contract", "signer-local", "rpc-types-eth", diff --git a/prover/bin/shadow-prove/abi/Rollup.json b/prover/bin/shadow-prove/abi/Rollup.json index 10b61fb3..28f7a5c6 100644 --- a/prover/bin/shadow-prove/abi/Rollup.json +++ b/prover/bin/shadow-prove/abi/Rollup.json @@ -15,16 +15,6 @@ "name": "ErrZeroAddress", "type": "error" }, - { - "inputs": [], - "name": "ErrorIncorrectBatchLength", - "type": "error" - }, - { - "inputs": [], - "name": "ErrorNoBlockInBatch", - "type": "error" - }, { "anonymous": false, "inputs": [ @@ -619,14 +609,14 @@ "type": "bytes" }, { - "internalType": "bytes", - "name": "blockContexts", - "type": "bytes" + "internalType": "uint64", + "name": "lastBlockNumber", + "type": "uint64" }, { - "internalType": "bytes", - "name": "skippedL1MessageBitmap", - "type": "bytes" + "internalType": "uint16", + "name": "numL1Messages", + "type": "uint16" }, { "internalType": "bytes32", @@ -695,6 +685,25 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "batchIndex", + "type": "uint256" + } + ], + "name": "committedStateRoots", + "outputs": [ + { + "internalType": "bytes32", + "name": "stateRoot", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "finalizationPeriodSeconds", @@ -804,6 +813,19 @@ "stateMutability": "nonpayable", "type": "function" }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "_prevStateRoot", + "type": "bytes32" + } + ], + "name": "initialize2", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, { "inputs": [ { @@ -1142,4 +1164,4 @@ "stateMutability": "payable", "type": "receive" } -] \ No newline at end of file +] diff --git a/prover/bin/shadow-prove/src/lib.rs b/prover/bin/shadow-prove/src/lib.rs index e1307491..80f58da9 100644 --- a/prover/bin/shadow-prove/src/lib.rs +++ b/prover/bin/shadow-prove/src/lib.rs @@ -9,5 +9,6 @@ pub mod util; #[derive(Clone, Debug)] pub struct BatchInfo { pub batch_index: u64, - pub blocks: Vec, + pub start_block: u64, + pub end_block: u64, } diff --git a/prover/bin/shadow-prove/src/main.rs b/prover/bin/shadow-prove/src/main.rs index e5ce82eb..dc8302b4 100644 --- a/prover/bin/shadow-prove/src/main.rs +++ b/prover/bin/shadow-prove/src/main.rs @@ -34,6 +34,7 @@ async fn main() { let l1_verify_rpc: String = read_parse_env("SHADOW_PROVING_VERIFY_L1_RPC"); let l1_rpc: String = read_parse_env("SHADOW_PROVING_L1_RPC"); + let l2_rpc: String = read_parse_env("SHADOW_PROVING_L2_RPC"); let private_key: String = read_parse_env("SHADOW_PROVING_PRIVATE_KEY"); let rollup: String = read_parse_env("SHADOW_PROVING_L1_ROLLUP"); @@ -41,9 +42,12 @@ async fn main() { let signer: PrivateKeySigner = private_key.parse().expect("parse PrivateKeySigner"); let wallet: EthereumWallet = EthereumWallet::from(signer.clone()); - let provider: RootProvider> = + let l1_provider: RootProvider> = ProviderBuilder::new().on_http(l1_rpc.parse().expect("parse l1_rpc to Url")); + let l2_provider: RootProvider> = + ProviderBuilder::new().on_http(l2_rpc.parse().expect("parse l2_rpc to Url")); + let verify_provider: RootProvider> = ProviderBuilder::new().on_http(l1_verify_rpc.parse().expect("parse l1_rpc to Url")); @@ -55,7 +59,8 @@ async fn main() { let batch_syncer = BatchSyncer::new( Address::from_str(&rollup).unwrap(), Address::from_str(&shadow_rollup).unwrap(), - provider.clone(), + l1_provider.clone(), + l2_provider.clone(), l1_signer.clone(), ); @@ -227,7 +232,7 @@ async fn test_prove_batch() { ); let tx_hash = B256::from_str(&next_tx_hash).unwrap(); - let batch_header = shadow_prove::shadow_rollup::batch_header_inspect(&provider, tx_hash) + let batch_header = shadow_proving::shadow_rollup::batch_header_inspect(&provider, tx_hash) .await .ok_or_else(|| "Failed to inspect batch header".to_string()) .unwrap(); @@ -261,7 +266,7 @@ async fn test_prove_batch() { let rt = shadow_tx.send().await.unwrap(); println!("commitBatch success: {:?}", rt.tx_hash()); - let batch_info = BatchInfo { batch_index, blocks: vec![1000001, 1000002] }; + let batch_info = BatchInfo { batch_index, start_block: 1000001, end_block: 1000002 }; shadow_prover.prove(batch_info).await.unwrap(); } diff --git a/prover/bin/shadow-prove/src/shadow_prove.rs b/prover/bin/shadow-prove/src/shadow_prove.rs index dd3e5094..12e950fd 100644 --- a/prover/bin/shadow-prove/src/shadow_prove.rs +++ b/prover/bin/shadow-prove/src/shadow_prove.rs @@ -93,8 +93,7 @@ async fn handle_with_prover( { let l2_rpc = var("SHADOW_PROVING_L2_RPC").expect("Cannot detect L2_RPC env var"); let batch_index = batch_info.batch_index; - let blocks = &batch_info.blocks; - let blocks_len = blocks.len(); + let blocks_len = batch_info.end_block - batch_info.start_block + 1; METRICS.shadow_blocks_len.set(blocks_len as i64); METRICS.shadow_batch_index.set(batch_index as i64); @@ -106,7 +105,7 @@ async fn handle_with_prover( "Start prove batch of: {:?}, blocks.len = {:?}, block_start = {:#?}", batch_index, blocks_len, - blocks[0] + batch_info.start_block ); // Query existing proof @@ -121,8 +120,8 @@ async fn handle_with_prover( // Request the proverServer to prove. let request = ProveRequest { batch_index, - start_block: *blocks.first().unwrap_or(&0u64), - end_block: *blocks.last().unwrap_or(&0u64), + start_block: batch_info.start_block, + end_block: batch_info.end_block, rpc: l2_rpc.to_owned(), shadow: true, }; @@ -155,7 +154,7 @@ async fn handle_with_prover( } // Step5. query proof and prove onchain state. - let mut max_waiting_time: usize = 1600 * blocks_len; //block_prove_time =30min + let mut max_waiting_time: usize = 1600 * blocks_len as usize; //block_prove_time =30min while max_waiting_time > 300 { sleep(Duration::from_secs(300)).await; max_waiting_time -= 300; // Query results every 5 minutes. diff --git a/prover/bin/shadow-prove/src/shadow_rollup.rs b/prover/bin/shadow-prove/src/shadow_rollup.rs index 31402ae4..6c41d848 100644 --- a/prover/bin/shadow-prove/src/shadow_rollup.rs +++ b/prover/bin/shadow-prove/src/shadow_rollup.rs @@ -1,5 +1,6 @@ use crate::{metrics::METRICS, util::read_env_var, BatchInfo}; use alloy::{ + consensus::Transaction, network::{Network, ReceiptResponse}, primitives::{Address, Bytes, TxHash, U256, U64}, providers::{Provider, RootProvider}, @@ -10,7 +11,6 @@ use alloy::{ Transport, }, }; -use std::ops::Mul; use crate::{ Rollup::{self, RollupInstance}, @@ -20,6 +20,7 @@ use crate::{ #[derive(Clone, Debug)] pub struct BatchSyncer { l1_provider: RootProvider>, + l2_provider: RootProvider>, l1_rollup: RollupInstance, RootProvider>>, l1_shadow_rollup: ShadowRollupInstance, } @@ -33,13 +34,14 @@ where pub fn new( rollup_address: Address, shadow_rollup_address: Address, - provider: RootProvider>, + l1_provider: RootProvider>, + l2_provider: RootProvider>, wallet: P, ) -> Self { - let l1_rollup = Rollup::RollupInstance::new(rollup_address, provider.clone()); + let l1_rollup = Rollup::RollupInstance::new(rollup_address, l1_provider.clone()); let l1_shadow_rollup = ShadowRollup::new(shadow_rollup_address, wallet); - Self { l1_provider: provider, l1_rollup, l1_shadow_rollup } + Self { l1_provider, l2_provider, l1_rollup, l1_shadow_rollup } } /** @@ -55,6 +57,7 @@ where U64::from(latest), &self.l1_rollup, &self.l1_provider, + &self.l2_provider, ) .await { @@ -74,7 +77,7 @@ where // Assembling a batche of the same commitment. #[rustfmt::skip] - // Below is the encoding for `BatchHeader`, reference: morph-repo/contracts/contracts/libraries/codec/BatchHeaderCodecV0.sol + // Below is the encoding for `BatchHeader`, reference: morph-repo/contracts/contracts/libraries/codec/BatchHeaderCodecV1.sol // // * Field Bytes Type Index Comments // * version 1 uint8 0 The batch version @@ -89,6 +92,8 @@ where // * sequencerSetVerifyHash 32 bytes32 185 L2 sequencers set verify hash // * parentBatchHash 32 bytes32 217 The parent batch hash // * skippedL1MessageBitmap dynamic uint256[] 249 A bitmap to indicate which L1 messages are skipped in the batch + // @dev Below is the feilds for `BatchHeader` V1 + // * lastBlockNumber 8 uint64 249 The last block number in this batch // ``` let batch_store = ShadowRollup::BatchStore { prevStateRoot: batch_header @@ -156,6 +161,7 @@ async fn get_committed_batch( latest: U64, l1_rollup: &RollupInstance, l1_provider: &RootProvider>, + l2_provider: &RootProvider>, ) -> Result, String> where P: Provider + Clone, @@ -177,29 +183,16 @@ where log::warn!("There have been no commit_batch logs for the last 600 blocks"); return Ok(None); } - if logs.len() < 2 { + if logs.len() < 3 { log::warn!("No enough commit_batch logs for the last 600 blocks"); return Ok(None); } logs.sort_by(|a, b| a.block_number.unwrap().cmp(&b.block_number.unwrap())); - // A rollup commit_batch_input contains prev batch_header. - let next_tx_hash = match logs.last() { - Some(log) => log.transaction_hash.unwrap_or_default(), - - None => { - return Err("find commit_batch log error".to_string()); - } - }; - let batch_header = batch_header_inspect(l1_provider, next_tx_hash) - .await - .ok_or_else(|| "Failed to inspect batch header".to_string())?; - - let (batch_index, tx_hash) = match logs.get(logs.len() - 2) { + let batch_index = match logs.get(logs.len() - 2) { Some(log) => { let _index = U256::from_be_slice(log.topics()[1].as_slice()); - let _tx_hash = log.transaction_hash.unwrap_or_default(); - (_index.to::(), _tx_hash) + _index.to::() } None => { return Err("find commit_batch log error".to_string()); @@ -209,16 +202,17 @@ where if batch_index == 0 { return Err(String::from("batch_index is 0")); } - let (blocks, total_txn_count) = match batch_blocks_inspect(l1_provider, tx_hash).await { - Some(block_txn) => block_txn, - None => return Err(String::from("batch_blocks_inspect none")), - }; + let (blocks, total_txn_count) = + match batch_blocks_inspect(l1_rollup, l2_provider, batch_index).await { + Some(block_txn) => block_txn, + None => return Err(String::from("batch_blocks_inspect none")), + }; - if blocks.is_empty() { + if blocks.0 <= blocks.1 { return Err(String::from("blocks is empty")); } - if blocks.len() > read_env_var("SHADOW_PROVING_MAX_BLOCK", 300) { + if blocks.1 - blocks.0 + 1 > read_env_var("SHADOW_PROVING_MAX_BLOCK", 300) { log::warn!("Too many blocks in the latest batch to shadow prove"); return Ok(None); } @@ -228,7 +222,20 @@ where return Ok(None); } - let batch_info: BatchInfo = BatchInfo { batch_index, blocks }; + let batch_info: BatchInfo = + BatchInfo { batch_index, start_block: blocks.0, end_block: blocks.1 }; + + // A rollup commit_batch_input contains prev batch_header. + let next_tx_hash = match logs.last() { + Some(log) => log.transaction_hash.unwrap_or_default(), + + None => { + return Err("find commit_batch log error".to_string()); + } + }; + let batch_header = batch_header_inspect(l1_provider, next_tx_hash) + .await + .ok_or_else(|| "Failed to inspect batch header".to_string())?; log::info!("Found the committed batch, batch index = {:#?}", batch_index); Ok(Some((batch_info, batch_header))) @@ -253,7 +260,7 @@ pub async fn batch_header_inspect( }; //Step2. Parse transaction data - let data = tx.input; + let data = tx.input(); if data.is_empty() { log::warn!("batch inspect: tx.input is empty, tx_hash = {:#?}", hash); @@ -269,74 +276,51 @@ pub async fn batch_header_inspect( Some(parent_batch_header) } -async fn batch_blocks_inspect( - l1_provider: &RootProvider>, - hash: TxHash, -) -> Option<(Vec, u32)> { - //Step1. Get transaction - let result = l1_provider.get_transaction_by_hash(hash).await; - let tx = match result { - Ok(Some(tx)) => tx, - Ok(None) => { - log::error!("l1_provider.get_transaction is none"); - return None; - } +async fn batch_blocks_inspect( + l1_rollup: &RollupInstance, + l2_provider: &RootProvider>, + batch_index: u64, +) -> Option<((u64, u64), u64)> +where + P: Provider + Clone, + T: Transport + Clone, + N: Network, +{ + let prev_bn = match l1_rollup.batchDataStore(U256::from(batch_index - 1)).call().await { + Ok(s) => s.blockNumber.to::(), Err(e) => { - log::error!("l1_provider.get_transaction err: {:#?}", e); + log::error!("l1_rollup.batch_data_store err: {:#?}", e); return None; } }; - //Step2. Parse transaction data - let data = tx.input; - - if data.is_empty() { - log::warn!("batch inspect: tx.input is empty, tx_hash = {:#?}", hash); - return None; - } - let param = if let Ok(_param) = Rollup::commitBatchCall::abi_decode(&data, false) { - _param - } else { - log::error!("batch inspect: decode tx.input error, tx_hash = {:#?}", hash); - return None; + let current_bn = match l1_rollup.batchDataStore(U256::from(batch_index)).call().await { + Ok(s) => s.blockNumber.to::(), + Err(e) => { + log::error!("l1_rollup.batch_data_store err: {:#?}", e); + return None; + } }; - let block_contexts: Bytes = param.batchDataInput.blockContexts; - decode_blocks(block_contexts) -} -fn decode_blocks(block_contexts: Bytes) -> Option<(Vec, u32)> { - if block_contexts.is_empty() || block_contexts.len() < 2 { - return Some((vec![], 0)); - } - - let mut blocks: Vec = vec![]; - let mut txn_in_batch = 0u32; - let bs: &[u8] = &block_contexts; - - // decode blocks from batch - // | 2 byte | 60 bytes | ... | 60 bytes | - // | num blocks | block 1 | ... | block n | - // https://github.com/morph-l2/morph/blob/main/contracts/contracts/libraries/codec/BatchCodecV0.sol - let num_blocks: u16 = ((bs[0] as u16) << 8) | (bs[1] as u16); - - for i in 0..num_blocks as usize { - let block_num = - u64::from_be_bytes(bs.get((60.mul(i) + 2)..(60.mul(i) + 2 + 8))?.try_into().ok()?); - let txs_num = u16::from_be_bytes( - bs.get((60.mul(i) + 2 + 56)..(60.mul(i) + 2 + 58))?.try_into().ok()?, - ); - txn_in_batch += txs_num as u32; - blocks.push(block_num); + let mut total_tx_count: u64 = 0; + for i in prev_bn + 1..current_bn + 1 { + total_tx_count += l2_provider + .get_block_transaction_count_by_number(i.into()) + .await + .unwrap_or_default() + .unwrap_or_default(); } - METRICS.shadow_txn_len.set(txn_in_batch.into()); log::info!( "decode_blocks, blocks_len: {:#?}, start_block: {:#?}, txn_in_batch: {:?}", - num_blocks, - blocks.first().unwrap_or(&0), - txn_in_batch + current_bn - prev_bn, + prev_bn + 1, + total_tx_count ); - Some((blocks, txn_in_batch)) + + METRICS.shadow_txn_len.set(total_tx_count as i64); + + Some(((prev_bn + 1, current_bn), total_tx_count)) } async fn is_prove_success( @@ -363,24 +347,6 @@ where Some(is_prove_success) } -#[tokio::test] -async fn test_decode_blocks() { - use std::{fs::File, io::Read, str::FromStr}; - - env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("debug")).init(); - - let mut file = File::open("./src/input.data").unwrap(); - let mut contents = String::new(); - file.read_to_string(&mut contents).unwrap(); - let input = Bytes::from_str(contents.as_str()).unwrap(); - - let param = Rollup::commitBatchCall::abi_decode(&input, false).unwrap(); - let blocks: Bytes = param.batchDataInput.blockContexts; - let rt = decode_blocks(blocks).unwrap(); - assert!(rt.0.len() == 11); - assert!(rt.0[3] == 1112u64); -} - #[tokio::test] async fn test_sync_batch() { use alloy::{ @@ -395,13 +361,18 @@ async fn test_sync_batch() { let l1_rpc: String = var("SHADOW_PROVING_VERIFY_L1_RPC").unwrap_or( var("SHADOW_PROVING_L1_RPC").expect("Shadow prove cannot detect L1_RPC env var"), ); + let l2_rpc: String = var("SHADOW_PROVING_VERIFY_L2_RPC").unwrap_or( + var("SHADOW_PROVING_L2_RPC").expect("Shadow prove cannot detect L2_RPC env var"), + ); let private_key = var("SHADOW_PROVING_PRIVATE_KEY") .expect("Cannot detect SHADOW_PROVING_PRIVATE_KEY env var"); let signer: PrivateKeySigner = private_key.parse().unwrap(); let wallet: EthereumWallet = EthereumWallet::from(signer.clone()); - let provider: RootProvider> = + let l1_provider: RootProvider> = ProviderBuilder::new().on_http(l1_rpc.parse().unwrap()); + let l2_provider: RootProvider> = + ProviderBuilder::new().on_http(l2_rpc.parse().unwrap()); let rollup = var("SHADOW_PROVING_L1_ROLLUP").expect("Cannot detect L1_ROLLUP env var"); let shadow_rollup = @@ -415,7 +386,8 @@ async fn test_sync_batch() { let bs = BatchSyncer::new( Address::from_str(&rollup).unwrap(), Address::from_str(&shadow_rollup).unwrap(), - provider, + l1_provider, + l2_provider, l1_signer, ); bs.sync_batch().await.unwrap(); diff --git a/prover/crates/core/src/batch.rs b/prover/crates/core/src/batch.rs index faddf950..202de080 100644 --- a/prover/crates/core/src/batch.rs +++ b/prover/crates/core/src/batch.rs @@ -27,16 +27,14 @@ impl BatchInfo { /// Construct by block traces pub fn from_block_traces(traces: &[T]) -> (Self, Rc) { let chain_id = traces.first().unwrap().chain_id(); - let prev_state_root = traces - .first() - .expect("at least 1 block needed") - .root_before(); + let prev_state_root = traces.first().expect("at least 1 block needed").root_before(); let post_state_root = traces.last().expect("at least 1 block needed").root_after(); let mut data_hasher = Keccak::v256(); - for trace in traces.iter() { - trace.hash_da_header(&mut data_hasher); - } + data_hasher.update(&traces.last().unwrap().number().to_be_bytes()); + let num_l1_txs: u16 = traces.iter().map(|x| x.num_l1_txs()).sum::() as u16; + data_hasher.update(&num_l1_txs.to_be_bytes()); + for trace in traces.iter() { trace.hash_l1_msg(&mut data_hasher); } @@ -143,9 +141,7 @@ mod tests { pub struct BlockTraceJsonRpcResult { pub result: BlockTrace, } - serde_json::from_str::(s) - .unwrap() - .result + serde_json::from_str::(s).unwrap().result }); let fork_config = HardforkConfig::default_from_chain_id(traces[0].chain_id()); diff --git a/prover/crates/core/src/database.rs b/prover/crates/core/src/database.rs index 2e6f7206..1db47d33 100644 --- a/prover/crates/core/src/database.rs +++ b/prover/crates/core/src/database.rs @@ -9,8 +9,7 @@ use sbv_primitives::{ zk_trie::{SharedMemoryDb, ZkMemoryDb, ZkTrie}, Block, }; -use std::rc::Rc; -use std::{cell::RefCell, collections::HashMap, convert::Infallible, fmt}; +use std::{cell::RefCell, collections::HashMap, convert::Infallible, fmt, rc::Rc}; type Result = std::result::Result; @@ -92,19 +91,13 @@ impl ReadOnlyDB { address: Address, storage_root: B256, ) -> Option { - self.prev_storage_roots - .borrow_mut() - .insert(address, storage_root) + self.prev_storage_roots.borrow_mut().insert(address, storage_root) } /// Get the previous storage root of an account. #[inline] pub(crate) fn prev_storage_root(&self, address: &Address) -> B256 { - self.prev_storage_roots - .borrow() - .get(address) - .copied() - .unwrap_or_default() + self.prev_storage_roots.borrow().get(address).copied().unwrap_or_default() } /// Get the zkTrie root. @@ -162,41 +155,35 @@ impl DatabaseRef for ReadOnlyDB { /// Get basic account information. fn basic_ref(&self, address: Address) -> Result, Self::Error> { - Ok(self - .zktrie_db_ref - .get_account(address.as_slice()) - .map(|account_data| { - let code_size = - u64::from_be_bytes((&account_data[0][16..24]).try_into().unwrap()) as usize; - let nonce = u64::from_be_bytes((&account_data[0][24..]).try_into().unwrap()); - let balance = U256::from_be_bytes(account_data[1]); - let code_hash = B256::from(account_data[3]); - let poseidon_code_hash = B256::from(account_data[4]); - - let storage_root = B256::from(account_data[2]); - self.prev_storage_roots - .borrow_mut() - .entry(address) - .or_insert(storage_root.0.into()); - - let zktrie_db = self.zktrie_db.clone(); - self.storage_trie_refs.borrow_mut().insert( - address, - Lazy::new(Box::new(move || { - zktrie_db - .new_ref_trie(&storage_root.0) - .expect("storage trie associated with account not found") - })), - ); - AccountInfo { - balance, - nonce, - code_size, - code_hash, - poseidon_code_hash, - code: self.code_db.get(&code_hash).cloned(), - } - })) + Ok(self.zktrie_db_ref.get_account(address.as_slice()).map(|account_data| { + let code_size = + u64::from_be_bytes((&account_data[0][16..24]).try_into().unwrap()) as usize; + let nonce = u64::from_be_bytes((&account_data[0][24..]).try_into().unwrap()); + let balance = U256::from_be_bytes(account_data[1]); + let code_hash = B256::from(account_data[3]); + let poseidon_code_hash = B256::from(account_data[4]); + + let storage_root = B256::from(account_data[2]); + self.prev_storage_roots.borrow_mut().entry(address).or_insert(storage_root.0.into()); + + let zktrie_db = self.zktrie_db.clone(); + self.storage_trie_refs.borrow_mut().insert( + address, + Lazy::new(Box::new(move || { + zktrie_db + .new_ref_trie(&storage_root.0) + .expect("storage trie associated with account not found") + })), + ); + AccountInfo { + balance, + nonce, + code_size, + code_hash, + poseidon_code_hash, + code: self.code_db.get(&code_hash).cloned(), + } + })) } /// Get account code by its code hash. @@ -217,22 +204,20 @@ impl DatabaseRef for ReadOnlyDB { /// Get storage value of address at index. fn storage_ref(&self, address: Address, index: U256) -> Result { let mut storage_trie_refs = self.storage_trie_refs.borrow_mut(); - let trie = storage_trie_refs - .entry(address) - .or_insert_with_key(|address| { - let storage_root = self - .zktrie_db_ref - .get_account(address.as_slice()) - .map(|account_data| B256::from(account_data[2])) - .unwrap_or_default(); - let zktrie_db = self.zktrie_db.clone(); - Lazy::new(Box::new(move || { - zktrie_db - .clone() - .new_ref_trie(&storage_root.0) - .expect("storage trie associated with account not found") - })) - }); + let trie = storage_trie_refs.entry(address).or_insert_with_key(|address| { + let storage_root = self + .zktrie_db_ref + .get_account(address.as_slice()) + .map(|account_data| B256::from(account_data[2])) + .unwrap_or_default(); + let zktrie_db = self.zktrie_db.clone(); + Lazy::new(Box::new(move || { + zktrie_db + .clone() + .new_ref_trie(&storage_root.0) + .expect("storage trie associated with account not found") + })) + }); Ok(trie .get_store(&index.to_be_bytes::<32>()) diff --git a/prover/crates/core/src/error.rs b/prover/crates/core/src/error.rs index d3a60808..8fad6233 100644 --- a/prover/crates/core/src/error.rs +++ b/prover/crates/core/src/error.rs @@ -1,5 +1,4 @@ -use revm::primitives::alloy_primitives::SignatureError; -use revm::primitives::{EVMError, B256}; +use revm::primitives::{alloy_primitives::SignatureError, EVMError, B256}; use std::convert::Infallible; /// Error variants encountered during manipulation of a zkTrie. diff --git a/prover/crates/core/src/executor/builder.rs b/prover/crates/core/src/executor/builder.rs index 57e55121..1c6c82ae 100644 --- a/prover/crates/core/src/executor/builder.rs +++ b/prover/crates/core/src/executor/builder.rs @@ -1,5 +1,6 @@ -use crate::error::ZkTrieError; -use crate::{executor::hooks::ExecuteHooks, EvmExecutor, HardforkConfig, ReadOnlyDB}; +use crate::{ + error::ZkTrieError, executor::hooks::ExecuteHooks, EvmExecutor, HardforkConfig, ReadOnlyDB, +}; use core::fmt; use revm::db::CacheDB; use sbv_primitives::{zk_trie::ZkMemoryDb, Block}; @@ -25,11 +26,7 @@ impl fmt::Debug for EvmExecutorBuilder<'_, ()> { impl<'e> EvmExecutorBuilder<'e, ()> { /// Create a new builder. pub fn new(zktrie_db: Rc) -> Self { - Self { - hardfork_config: (), - execute_hooks: ExecuteHooks::default(), - zktrie_db, - } + Self { hardfork_config: (), execute_hooks: ExecuteHooks::default(), zktrie_db } } } diff --git a/prover/crates/core/src/executor/hooks.rs b/prover/crates/core/src/executor/hooks.rs index 8e45cb8a..a5b8889e 100644 --- a/prover/crates/core/src/executor/hooks.rs +++ b/prover/crates/core/src/executor/hooks.rs @@ -53,10 +53,7 @@ impl Debug for ExecuteHooks<'_> { fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result { f.debug_struct("ExecuteHooks") .field("tx_rlp_handlers", &self.tx_rlp_handlers.len()) - .field( - "post_tx_execution_handlers", - &self.post_tx_execution_handlers.len(), - ) + .field("post_tx_execution_handlers", &self.post_tx_execution_handlers.len()) .finish() } } diff --git a/prover/crates/core/src/executor/mod.rs b/prover/crates/core/src/executor/mod.rs index d03bfcb6..bc5c03b1 100644 --- a/prover/crates/core/src/executor/mod.rs +++ b/prover/crates/core/src/executor/mod.rs @@ -265,7 +265,7 @@ impl EvmExecutor<'_> { cycle_track!( zktrie .update_account(addr.as_slice(), &acc_data) - .expect("failed to update account"), + .unwrap_or_else(|_| panic!("failed to update account: {}", addr)), "Zktrie::update_account" ); diff --git a/prover/crates/core/src/hardfork.rs b/prover/crates/core/src/hardfork.rs index 65ddfd77..d908fab3 100644 --- a/prover/crates/core/src/hardfork.rs +++ b/prover/crates/core/src/hardfork.rs @@ -13,20 +13,20 @@ pub const MORPH_TESTNET_CHAIN_ID: u64 = 2810; /// Morph mainnet chain id pub const MORPH_MAINNET_CHAIN_ID: u64 = 2818; -/// Hardfork heights for Scroll networks, grouped by chain id. +/// Hardfork heights for Morph networks, grouped by chain id. static HARDFORK_HEIGHTS: Lazy>> = Lazy::new(|| { let mut map = HashMap::new(); map.insert( MORPH_DEVNET_CHAIN_ID, - HashMap::from([(SpecId::BERNOULLI, 0), (SpecId::CURIE, 0)]), + HashMap::from([(SpecId::BERNOULLI, 0), (SpecId::CURIE, 0), (SpecId::MORPH203, 0)]), ); map.insert( MORPH_TESTNET_CHAIN_ID, - HashMap::from([(SpecId::BERNOULLI, 0), (SpecId::CURIE, 0)]), + HashMap::from([(SpecId::BERNOULLI, 0), (SpecId::CURIE, 0), (SpecId::MORPH203, 0)]), ); map.insert( MORPH_MAINNET_CHAIN_ID, - HashMap::from([(SpecId::BERNOULLI, 0), (SpecId::CURIE, 0)]), + HashMap::from([(SpecId::BERNOULLI, 0), (SpecId::CURIE, 0), (SpecId::MORPH203, 0)]), ); map @@ -37,6 +37,7 @@ static HARDFORK_HEIGHTS: Lazy>> = Lazy::new(|| pub struct HardforkConfig { bernoulli_block: u64, curie_block: u64, + morph203_block: u64, } impl HardforkConfig { @@ -46,6 +47,7 @@ impl HardforkConfig { Self { bernoulli_block: heights.get(&SpecId::BERNOULLI).copied().unwrap_or(0), curie_block: heights.get(&SpecId::CURIE).copied().unwrap_or(0), + morph203_block: heights.get(&SpecId::MORPH203).copied().unwrap_or(0), } } else { dev_warn!( @@ -68,12 +70,19 @@ impl HardforkConfig { self } + /// Set the Morph203 block number. + pub fn set_morph203_block(&mut self, morph203_block: u64) -> &mut Self { + self.morph203_block = morph203_block; + self + } + /// Get the hardfork spec id for a block number. pub fn get_spec_id(&self, block_number: u64) -> SpecId { match block_number { n if n < self.bernoulli_block => SpecId::PRE_BERNOULLI, n if n < self.curie_block => SpecId::BERNOULLI, - _ => SpecId::CURIE, + n if n < self.morph203_block => SpecId::CURIE, + _ => SpecId::MORPH203, } } @@ -103,14 +112,8 @@ impl HardforkConfig { let l1_gas_price_oracle_acc = Account { info: l1_gas_price_oracle_info, storage: HashMap::from([ - ( - l1_gas_price_oracle::IS_CURIE_SLOT, - EvmStorageSlot::new(U256::from(1)), - ), - ( - l1_gas_price_oracle::L1_BLOB_BASEFEE_SLOT, - EvmStorageSlot::new(U256::from(1)), - ), + (l1_gas_price_oracle::IS_CURIE_SLOT, EvmStorageSlot::new(U256::from(1))), + (l1_gas_price_oracle::L1_BLOB_BASEFEE_SLOT, EvmStorageSlot::new(U256::from(1))), ( l1_gas_price_oracle::COMMIT_SCALAR_SLOT, EvmStorageSlot::new(l1_gas_price_oracle::INITIAL_COMMIT_SCALAR), @@ -123,10 +126,7 @@ impl HardforkConfig { status: AccountStatus::Touched, }; - db.commit(HashMap::from([( - l1_gas_price_oracle_addr, - l1_gas_price_oracle_acc, - )])); + db.commit(HashMap::from([(l1_gas_price_oracle_addr, l1_gas_price_oracle_acc)])); Ok(()) } diff --git a/prover/crates/morph-executor/client/src/lib.rs b/prover/crates/morph-executor/client/src/lib.rs index 6b1457b4..2e630930 100644 --- a/prover/crates/morph-executor/client/src/lib.rs +++ b/prover/crates/morph-executor/client/src/lib.rs @@ -1,17 +1,31 @@ pub mod types; mod verifier; use alloy::hex; -use sbv_primitives::{TxTrace, B256}; +use sbv_primitives::{Block, TxTrace, B256}; use sbv_utils::dev_info; use types::input::ClientInput; pub use verifier::{blob_verifier::BlobVerifier, evm_verifier::EVMVerifier}; pub fn verify(input: &ClientInput) -> Result { // Verify DA - let (versioned_hash, batch_data) = BlobVerifier::verify(&input.blob_info).unwrap(); + let num_blocks = input.l2_traces.len(); + let (versioned_hash, batch_data) = BlobVerifier::verify(&input.blob_info, num_blocks).unwrap(); println!("cycle-tracker-start: traces-to-data"); + let mut batch_from_trace: Vec = Vec::with_capacity(num_blocks * 60); let mut tx_bytes: Vec = vec![]; for trace in &input.l2_traces { + // BlockContext + let mut block_ctx: Vec = Vec::with_capacity(60); + block_ctx.extend_from_slice(&trace.number().to_be_bytes()); + block_ctx.extend_from_slice(&trace.timestamp().to::().to_be_bytes()); + block_ctx + .extend_from_slice(&trace.base_fee_per_gas().unwrap_or_default().to_be_bytes::<32>()); + block_ctx.extend_from_slice(&trace.gas_limit().to::().to_be_bytes()); + block_ctx.extend_from_slice(&(trace.transactions.len() as u16).to_be_bytes()); + block_ctx.extend_from_slice(&(trace.num_l1_txs() as u16).to_be_bytes()); + batch_from_trace.extend(block_ctx); + + // Collect txns let x = trace .transactions .iter() @@ -20,8 +34,10 @@ pub fn verify(input: &ClientInput) -> Result { .collect::>(); tx_bytes.extend(x); } + batch_from_trace.extend(tx_bytes); + println!("cycle-tracker-end: traces-to-data"); - assert_eq!(batch_data, tx_bytes, "blob data mismatch!"); + assert_eq!(batch_data, batch_from_trace, "blob data mismatch!"); // Verify EVM exec. println!("cycle-tracker-start: evm-verify"); diff --git a/prover/crates/morph-executor/client/src/verifier/blob_verifier.rs b/prover/crates/morph-executor/client/src/verifier/blob_verifier.rs index 12835f4e..c0b3986d 100644 --- a/prover/crates/morph-executor/client/src/verifier/blob_verifier.rs +++ b/prover/crates/morph-executor/client/src/verifier/blob_verifier.rs @@ -10,13 +10,16 @@ use crate::types::{blob::get_origin_batch, input::BlobInfo}; pub struct BlobVerifier; impl BlobVerifier { - pub fn verify(blob_info: &BlobInfo) -> Result<(B256, Vec), anyhow::Error> { + pub fn verify( + blob_info: &BlobInfo, + num_blocks: usize, + ) -> Result<(B256, Vec), anyhow::Error> { // decode println!("cycle-tracker-start: decode_blob"); let origin_batch = get_origin_batch(&blob_info.blob_data).unwrap(); cfg_if::cfg_if! { if #[cfg(not(target_os = "zkvm"))] { - let tx_list = crate::types::blob::decode_transactions(origin_batch.as_slice()); + let tx_list = crate::types::blob::decode_transactions(&origin_batch.as_slice()[num_blocks*60..]); println!("decoded tx_list_len: {:?}", tx_list.len()); } } diff --git a/prover/crates/morph-executor/host/src/lib.rs b/prover/crates/morph-executor/host/src/lib.rs index 5f0de76f..05249a59 100644 --- a/prover/crates/morph-executor/host/src/lib.rs +++ b/prover/crates/morph-executor/host/src/lib.rs @@ -1,6 +1,6 @@ use anyhow::anyhow; use morph_executor_utils::read_env_var; -use sbv_primitives::{types::BlockTrace, TxTrace}; +use sbv_primitives::{types::BlockTrace, Block, TxTrace}; use std::{io::Write, path::Path, sync::Arc}; use zstd_util::{init_zstd_encoder, N_BLOCK_SIZE_TARGET}; @@ -39,9 +39,23 @@ pub fn get_blob_info(block_trace: &Vec) -> Result) -> [u8; BLOB_DATA_SIZE] { - // collect txns + let num_blocks = block_trace.len(); + let mut batch_from_trace: Vec = Vec::with_capacity(num_blocks * 60); let mut tx_bytes: Vec = vec![]; for trace in block_trace { + // BlockContext + // https://github.com/morph-l2/morph/blob/main/contracts/contracts/libraries/codec/BatchCodecV0.sol + let mut block_ctx: Vec = Vec::with_capacity(60); + block_ctx.extend_from_slice(&trace.number().to_be_bytes()); + block_ctx.extend_from_slice(&trace.timestamp().to::().to_be_bytes()); + block_ctx + .extend_from_slice(&trace.base_fee_per_gas().unwrap_or_default().to_be_bytes::<32>()); + block_ctx.extend_from_slice(&trace.gas_limit().to::().to_be_bytes()); + block_ctx.extend_from_slice(&(trace.transactions.len() as u16).to_be_bytes()); + block_ctx.extend_from_slice(&(trace.num_l1_txs() as u16).to_be_bytes()); + batch_from_trace.extend(block_ctx); + + // Collect txns let x = trace .transactions .iter() @@ -50,8 +64,8 @@ pub fn get_blob_data(block_trace: &Vec) -> [u8; BLOB_DATA_SIZE] { .collect::>(); tx_bytes.extend(x); } - - encode_blob(tx_bytes) + batch_from_trace.extend(tx_bytes); + encode_blob(batch_from_trace) } pub fn encode_blob(tx_bytes: Vec) -> [u8; 131072] { diff --git a/prover/crates/morph-executor/host/src/zstd_util.rs b/prover/crates/morph-executor/host/src/zstd_util.rs index 693c0db6..c49386c2 100644 --- a/prover/crates/morph-executor/host/src/zstd_util.rs +++ b/prover/crates/morph-executor/host/src/zstd_util.rs @@ -26,13 +26,9 @@ pub(crate) fn init_zstd_encoder(target_block_size: u32) -> Encoder<'static, Vec< .set_parameter(CParameter::LiteralCompressionMode(ParamSwitch::Disable)) .expect("infallible"); // with a hack in zstd we can set window log <= 17 with single segment kept - encoder - .set_parameter(CParameter::WindowLog(17)) - .expect("infallible"); + encoder.set_parameter(CParameter::WindowLog(17)).expect("infallible"); // set target block size to fit within a single block. - encoder - .set_parameter(CParameter::TargetCBlockSize(target_block_size)) - .expect("infallible"); + encoder.set_parameter(CParameter::TargetCBlockSize(target_block_size)).expect("infallible"); // do not include the checksum at the end of the encoded data. encoder.include_checksum(false).expect("infallible"); // do not include magic bytes at the start of the frame since we will have a single diff --git a/prover/crates/primitives/src/lib.rs b/prover/crates/primitives/src/lib.rs index b5521c92..ca1af534 100644 --- a/prover/crates/primitives/src/lib.rs +++ b/prover/crates/primitives/src/lib.rs @@ -122,12 +122,8 @@ pub trait Block: Debug { let num_txs = (self.num_l1_txs() + self.num_l2_txs()) as u16; hasher.update(&self.number().to_be_bytes()); hasher.update(&self.timestamp().to::().to_be_bytes()); - hasher.update( - &self - .base_fee_per_gas() - .unwrap_or_default() - .to_be_bytes::<{ U256::BYTES }>(), - ); + hasher + .update(&self.base_fee_per_gas().unwrap_or_default().to_be_bytes::<{ U256::BYTES }>()); hasher.update(&self.gas_limit().to::().to_be_bytes()); hasher.update(&num_txs.to_be_bytes()); } @@ -135,11 +131,7 @@ pub trait Block: Debug { /// Hash the l1 messages of the block #[inline] fn hash_l1_msg(&self, hasher: &mut impl tiny_keccak::Hasher) { - for tx_hash in self - .transactions() - .filter(|tx| tx.is_l1_tx()) - .map(|tx| tx.tx_hash()) - { + for tx_hash in self.transactions().filter(|tx| tx.is_l1_tx()).map(|tx| tx.tx_hash()) { hasher.update(tx_hash.as_slice()) } } diff --git a/prover/crates/primitives/src/types/mod.rs b/prover/crates/primitives/src/types/mod.rs index c7200974..156c40cc 100644 --- a/prover/crates/primitives/src/types/mod.rs +++ b/prover/crates/primitives/src/types/mod.rs @@ -126,22 +126,15 @@ const MAGICSMTBYTES: &[u8] = "THIS IS SOME MAGIC BYTES FOR SMT m1rRXgP2xpDI".as_ impl BlockTrace { /// Convert legacy traces to the latest format pub fn flatten(&mut self) { - let account_proofs = self.storage_trace.proofs.iter().flat_map(|kv_map| { - kv_map - .iter() - .map(|(k, bts)| (k, bts.iter().map(Bytes::as_ref))) - }); - - let storage_proofs = self - .storage_trace - .storage_proofs - .iter() - .flat_map(|(k, kv_map)| { - kv_map - .iter() - .map(move |(sk, bts)| (k, sk, bts.iter().map(Bytes::as_ref))) + let account_proofs = + self.storage_trace.proofs.iter().flat_map(|kv_map| { + kv_map.iter().map(|(k, bts)| (k, bts.iter().map(Bytes::as_ref))) }); + let storage_proofs = self.storage_trace.storage_proofs.iter().flat_map(|(k, kv_map)| { + kv_map.iter().map(move |(sk, bts)| (k, sk, bts.iter().map(Bytes::as_ref))) + }); + let proofs = account_proofs .flat_map(|(_, bytes)| bytes) .chain(storage_proofs.flat_map(|(_, _, bytes)| bytes)); @@ -305,10 +298,7 @@ mod tests { let trace = serde_json::from_str::(TRACE).unwrap()["result"].clone(); let coinbase: Coinbase = serde_json::from_value(trace["coinbase"].clone()).unwrap(); - assert_eq!( - coinbase.address, - address!("5300000000000000000000000000000000000005") - ); + assert_eq!(coinbase.address, address!("5300000000000000000000000000000000000005")); let header: BlockHeader = serde_json::from_value(trace["header"].clone()).unwrap(); assert_eq!(header.number, U256::from(8370400)); @@ -322,9 +312,7 @@ mod tests { assert_eq!(header.difficulty, U256::from(0x2)); assert_eq!( header.mix_hash, - Some(b256!( - "0000000000000000000000000000000000000000000000000000000000000000" - )) + Some(b256!("0000000000000000000000000000000000000000000000000000000000000000")) ); let transactions: Vec = @@ -339,14 +327,8 @@ mod tests { assert_eq!(transactions[4].gas_price, U256::from(0x48c1a5b)); assert_eq!(transactions[5].gas_tip_cap, Some(U256::from(0x416e))); assert_eq!(transactions[6].gas_fee_cap, Some(U256::from(0x4f4f99a))); - assert_eq!( - transactions[7].from, - address!("32a29339a23afff0febd75bef656b9bf32967085") - ); - assert_eq!( - transactions[8].to, - Some(address!("a2a9fd768d482caf519d749d3123a133db278a66")), - ); + assert_eq!(transactions[7].from, address!("32a29339a23afff0febd75bef656b9bf32967085")); + assert_eq!(transactions[8].to, Some(address!("a2a9fd768d482caf519d749d3123a133db278a66")),); assert_eq!(transactions[9].chain_id, U64::from(0x82750)); assert_eq!(transactions[10].value, uint!(0x297ee5eafa233c_U256)); assert_eq!(transactions[11].data, bytes!("21c69a19000000000000000000000000f610a9dfb7c89644979b4a0f27063e9e7d7cda320000000000000000000000000000000000000000000000000086e6edc73882e2000000000000000000000000956df8424b556f0076e8abf5481605f5a791cc7f000000000000000000000000956df8424b556f0076e8abf5481605f5a791cc7f00000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000244627dd56a000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000001ea01a200020000000000000000000000000000000000000000000000000086e6edc73882e2006018df4b145f074d63efa24dbd61dd00da2cdb3697f610a9dfb7c89644979b4a0f27063e9e7d7cda3200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000066bcce7c000000000000000000000000000000000000000000000000009b579427d194d20000000000000000000000000000000000000000000000000086e6edc73882e202007e07060300e6000000000000000000000000fffd8963efd1fc6a506488495d951d5263988d2500000000000000000000000000000000000000000000000000000000000000a00000000000000000000000000000000000000000000000000000000000000014010037060300920300e603010e03012e03014e03007e6e6cc7163fa93a693ee8491bb2b01656ba5ea1f3070a00000000000000000000000000000000000000000000000000000000000003019805000002007e02018405004053000000000000000000000000000000000000040201c705004002009202006a050040004802008000000106010e00000000e40040016e01840184070040002001b801be0000010060000001be01c70000050040000001db01e10000030060000001e101ea00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000")); @@ -397,21 +379,13 @@ mod tests { assert_eq!(block.header.hash, archived_block.header.hash); assert_eq!(block.header.timestamp, archived_block.header.timestamp); assert_eq!(block.header.gas_limit, archived_block.header.gas_limit); - assert_eq!( - block.header.base_fee_per_gas, - archived_block.header.base_fee_per_gas - ); + assert_eq!(block.header.base_fee_per_gas, archived_block.header.base_fee_per_gas); assert_eq!(block.header.difficulty, archived_block.header.difficulty); assert_eq!(block.header.mix_hash, archived_block.header.mix_hash); - let txs = block - .transactions - .iter() - .map(|tx| tx.try_build_typed_tx().unwrap()); - let archived_txs = archived_block - .transactions - .iter() - .map(|tx| tx.try_build_typed_tx().unwrap()); + let txs = block.transactions.iter().map(|tx| tx.try_build_typed_tx().unwrap()); + let archived_txs = + archived_block.transactions.iter().map(|tx| tx.try_build_typed_tx().unwrap()); for (tx, archived_tx) in txs.zip(archived_txs) { assert_eq!(tx, archived_tx); } @@ -420,14 +394,8 @@ mod tests { assert_eq!(code.code.as_ref(), archived_code.code.as_ref()); } - assert_eq!( - block.storage_trace.root_before, - archived_block.storage_trace.root_before - ); - assert_eq!( - block.storage_trace.root_after, - archived_block.storage_trace.root_after - ); + assert_eq!(block.storage_trace.root_before, archived_block.storage_trace.root_before); + assert_eq!(block.storage_trace.root_after, archived_block.storage_trace.root_after); // for (proof, archived_proof) in block // .storage_trace // .flatten_proofs @@ -438,9 +406,6 @@ mod tests { // assert_eq!(proof.get(1).as_ref(), archived_proof.1.as_ref()); // } - assert_eq!( - block.start_l1_queue_index, - archived_block.start_l1_queue_index - ); + assert_eq!(block.start_l1_queue_index, archived_block.start_l1_queue_index); } } diff --git a/prover/crates/primitives/src/types/tx.rs b/prover/crates/primitives/src/types/tx.rs index 2bea250b..69f7c8f1 100644 --- a/prover/crates/primitives/src/types/tx.rs +++ b/prover/crates/primitives/src/types/tx.rs @@ -56,7 +56,14 @@ pub struct TxL1Msg { /// Transaction Trace #[serde_as] #[derive( - rkyv::Archive, rkyv::Serialize, rkyv::Deserialize, serde::Serialize, serde::Deserialize, Default, Debug, Clone, + rkyv::Archive, + rkyv::Serialize, + rkyv::Deserialize, + serde::Serialize, + serde::Deserialize, + Default, + Debug, + Clone, )] #[archive(check_bytes)] #[archive_attr(derive(Debug, Hash, PartialEq, Eq))] @@ -224,7 +231,8 @@ impl TxTrace for ArchivedTransactionTrace { } fn access_list(&self) -> AccessList { - rkyv::Deserialize::::deserialize(&self.access_list, &mut rkyv::Infallible).unwrap() + rkyv::Deserialize::::deserialize(&self.access_list, &mut rkyv::Infallible) + .unwrap() } fn signature(&self) -> Result { diff --git a/prover/crates/utils/src/metrics/registry.rs b/prover/crates/utils/src/metrics/registry.rs index 949f37b3..c4bc3cb4 100644 --- a/prover/crates/utils/src/metrics/registry.rs +++ b/prover/crates/utils/src/metrics/registry.rs @@ -28,11 +28,7 @@ pub(super) fn init() -> Registry { let mut registry = registry::Registry::default(); let block_counter = Counter::default(); - registry.register( - "block_counter", - "Number of blocks processed", - block_counter.clone(), - ); + registry.register("block_counter", "Number of blocks processed", block_counter.clone()); let fetched_rpc_block_height = Gauge::default(); registry.register( diff --git a/prover/crates/utils/src/utils/debug.rs b/prover/crates/utils/src/utils/debug.rs index 6c7ea33f..a593218f 100644 --- a/prover/crates/utils/src/utils/debug.rs +++ b/prover/crates/utils/src/utils/debug.rs @@ -74,23 +74,9 @@ impl DebugRecorder { pub fn record_storage(&mut self, addr: Address, key: U256, value: U256) { let entry = self.storages.entry(addr).or_default(); if !value.is_zero() { - entry.insert( - key, - StorageOps { - kind: "update", - key, - value: Some(value), - }, - ); + entry.insert(key, StorageOps { kind: "update", key, value: Some(value) }); } else { - entry.insert( - key, - StorageOps { - kind: "delete", - key, - value: None, - }, - ); + entry.insert(key, StorageOps { kind: "delete", key, value: None }); } } } diff --git a/prover/testdata/morph203/morph203_0_traces.json b/prover/testdata/morph203/morph203_0_traces.json new file mode 100644 index 00000000..725866e5 --- /dev/null +++ b/prover/testdata/morph203/morph203_0_traces.json @@ -0,0 +1,13648 @@ +[ + [ + { + "chainID": 53077, + "version": "2.0.3-mainnet-0295a3d4", + "coinbase": { + "address": "0x716170d0687c3d31cc10debe0daa1ddd3fe3d792", + "nonce": 0, + "balance": "0x2bfc759a36b47a6c", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + "header": { + "parentHash": "0xecc4b5c578237034ccf9b8808631f1929e4ee948379b03ecb74d0d762a494601", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "miner": "0x0000000000000000000000000000000000000000", + "stateRoot": "0x06282a9b276c3b80d658aca386f03e479d9379af169e73801488632461d86525", + "transactionsRoot": "0x8568a88cc0b207ce2353ba1fa44711789124dcfdf5513729568143d0791c1813", + "receiptsRoot": "0x4afb8f07521fdb953720dca7a0bffabae4eab07fb3440965769665601c2dc526", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000004000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000", + "difficulty": "0x0", + "number": "0x78336", + "gasLimit": "0x3b9aca00", + "gasUsed": "0x17d11", + "timestamp": "0x67d39c45", + "extraData": "0x", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x0000000000000000", + "nextL1MsgIndex": "0x1428f6", + "batchHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "baseFeePerGas": "0xf4240", + "withdrawalsRoot": null, + "blobGasUsed": null, + "excessBlobGas": null, + "parentBeaconBlockRoot": null, + "hash": "0xe9e89fba373845d51992a05507d9aafe1f59281ae4a27ea98236807e73bfa92d" + }, + "transactions": [ + { + "type": 2, + "nonce": 2170, + "txHash": "0xe87351b15850f98a08820abc98ed6e13e6226db90ead6a8a5b4064d05d470bf0", + "gas": 97553, + "gasPrice": "0xf4240", + "gasTipCap": "0xf4240", + "gasFeeCap": "0xf4240", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0xf78ce1e2f0de8fd15ce6ac4ddec6982413fda499", + "chainId": "0xcf55", + "value": "0x0", + "data": "0x637bd1640000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000468656c6f00000000000000000000000000000000000000000000000000000000", + "isCreate": false, + "accessList": [], + "v": "0x0", + "r": "0xe09b0a4e6a6b8cb8bb9c2138f17431a8b7712ffeecbef1e4a229d5fe9620e582", + "s": "0x17d892d4f240758ec33d7e849e5561a1971e4351cace52d381f645537e4890f3" + } + ], + "storageTrace": { + "rootBefore": "0x1c3c7f10ba4091cba575777e91ceb7db804dd686e697dc7f0aa20a7d83761375", + "rootAfter": "0x06282a9b276c3b80d658aca386f03e479d9379af169e73801488632461d86525", + "proofs": { + "0x0000000000000000000000000000000000000003": [ + "0x0914e497f5219f809a1da1d4f2f115131b5dc9ad48724a1106b36d065909ad440a2d77f0dd9bbdc44acce00f7ab1067709208957504f8664b75b5a2fa79d88b04f", + "0x0914698788d45d66a67b900ee5938ae433aa83c5c4c43e5d866680d7b1f2661bba1b2ca4446bcde185d101b0d0c7f09c3e659d1607550762d2a4534c0f62946586", + "0x090695394d7e90c7ab229f35a5bf7e984623a40a92cc4355e174eeb0fa43215cb1007f89220807403164fd521d78dc5244d8b1e74320055a60d4f8a3755c80dee8", + "0x09144d123dd26f6dfe0f857b293c4a99d7b0966a8b0749c1dde7e84dcf3036332915c9497f86d8eda791789359e2c944057e6d1069e651edaaae10cc5f1c602ff6", + "0x0900f7bca7214a6e6fcbcbfce1fd023985457d325de3f6cd151af34aaa2bda0636158c5f76d728ac8bf46731ad2e9905d779cf1ef8b4b38d392ed707ff81c6fad2", + "0x0919990527de00f1ddc538fcc0490d594a39b51dbbcaf1f26cdfe9be1bea7835401b69fa24ece85c0c60ec95c5f7a989b91a39f2cb495af36bead9017d76765db2", + "0x09197fbc425c6b18955436ccb7aa7095b99255f5ec2a9ccf356217108c0dc2ca99005c0f07bbf970d785c2c1c3866d26896d42fabf1e0808132915988fbc9c3f3a", + "0x091f1b98802e0b01dbb250552f1a9f7ad8e29cfce3462125c643e9e7be51f5c1e31571d732d58a06af66e8ecc4052a3433ec5092741932405013e9c041ae9c3e4a", + "0x09192e7d947a87813060baab27ee3f32a589e8bc57006a0802e624badb579b8b5f22ebf768ed68a8888c6e9a2c1f06f50e9e692efcaa1cc550796bb49c5a5936a6", + "0x07207869ed88c227637248ddc4bbc4067dcde50f0a1723c6e6c3746f10e454c5d5162c9af98705cf012ced1bf86d1cea75d219159b0bf0a94535a8cca7e5a71661", + "0x0621d7539d4749f67f5554bd5d8863324e3f59745fa8c8b1cb53bad21bac57d0ba1af71caa20f24d10027026702a6060186b00d0bd76b977817f762ec044222c01", + "0x042fc8c52a10b9301b599089efee0123d4d71053d427c2a8ea6bff1cc93186fe260508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c621c5d486a08000000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420267f56f44cc61487af9df27cc6da1566c757eb56000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5300000000000000000000000000000000000001": [ + "0x0914e497f5219f809a1da1d4f2f115131b5dc9ad48724a1106b36d065909ad440a2d77f0dd9bbdc44acce00f7ab1067709208957504f8664b75b5a2fa79d88b04f", + "0x0914698788d45d66a67b900ee5938ae433aa83c5c4c43e5d866680d7b1f2661bba1b2ca4446bcde185d101b0d0c7f09c3e659d1607550762d2a4534c0f62946586", + "0x090695394d7e90c7ab229f35a5bf7e984623a40a92cc4355e174eeb0fa43215cb1007f89220807403164fd521d78dc5244d8b1e74320055a60d4f8a3755c80dee8", + "0x092c04089db803ecef80badd1d52cc8e74d960051a224edde4f155a91b47c6d59327b48395b98d9dee704b606911b11f95fc96160e498e19fbcf3ecc069e0a768e", + "0x09222c59fb203c2136a3a186f2913505e1ca71f725701fddec9401ac0c19878ada27ef17d0195f0506df6a5b34dd52e09c851bc6b6af5fbdec53099aaed7f4d2fc", + "0x092cc07548fafc69a4dc7cfa2a483453f9f9819d104ccc8452b044584316b2918a0b1550511655ecc100037fab01d02dc8afb8b117bedad7f9ff3900d0747d44a6", + "0x091e5bd0832fb5a9827c679c75db95f1a559a07972a60b9c51ec435ea0633394390febfd3ab5fff6718b8ec4122a449fb8320d7a813240d702a4fda781e0a9bdce", + "0x092b96c11dcd9903dd8dfbca4f5acaf64c98f7aa8d1908e90d22682169ff2ba88c1aba44333a24240b0ba627dceff3778abc51012b698672802aea6c8c26bbfe18", + "0x090df918b89bd13e0c0a0745ccee3ac8ba25569fa5ba386d501311f0bf98a643331a327742a33e16c8ac782d9cef4cb06d98b731e6ca13b0c5450951b020f9b0c6", + "0x0820f409300cb23fffe97841b4b70f4c160f90393f7d29ecb5d2dc25f15c89fb550000000000000000000000000000000000000000000000000000000000000000", + "0x061276876f7f3ac122c96a402a706e93a7da84ad82496958bf8cf8d2baefa8c02a20abfaf6bc20fadf9a7609c0562a0ff138977845b052cf9e5d4c52cb2adedbe3", + "0x0427cfcbd2fe87474008e199ef5bff09273803bbf38032c75a36a7726b3c88f8a205080000000000000000000000000000000000000000000000000aec000000000000000000000000000000000000000000000000000000000000000000000000000000002b2d37d04a6c2068ba19a08e79f3eeabfc6d2d1d516fcd700d4c377b23f9fc3f44107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f84205300000000000000000000000000000000000001000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x530000000000000000000000000000000000000f": [ + "0x0914e497f5219f809a1da1d4f2f115131b5dc9ad48724a1106b36d065909ad440a2d77f0dd9bbdc44acce00f7ab1067709208957504f8664b75b5a2fa79d88b04f", + "0x0914698788d45d66a67b900ee5938ae433aa83c5c4c43e5d866680d7b1f2661bba1b2ca4446bcde185d101b0d0c7f09c3e659d1607550762d2a4534c0f62946586", + "0x09104f87b11816f6619611fbd4dfb6b8425a675325a61e91a29346b0adeca37af01600e6198f3de08a2b8ae6b32493e7f0f2ac288d195b9bae360081d2edb9a17f", + "0x0923887f7f2b818306eb521f1c9a28fa1180772e0603e778536d3bd047562df33521b0c8c03e0e8783c187c12a2309a02be178b53f86ad845a9a2d0f82d342a027", + "0x092acea573988b3a33584f55cee3da7527b7ec93c39ee431d6a00e9e1c0908c32907d5d2c7ba73004c814f367fcfa9bbed0636535570c02819442719331f977f69", + "0x090e9d499bfcd7a95f27f1232e8299d71b9e312b56a5c2f96de6ba2114ce6427600bffa1d771c4f6eb4bbdc666b4ee82f7ea04a51f7c036d38e88ce7e9f7deb0d2", + "0x092e0e76440cf40d49e6a6441452c7ff3db1c5530a007c6d11b54c655302baa6a12719c9e93c1c4ab00f37d68d1fbde1ad2c4c0f540add6fc908b56c496d140ff6", + "0x082596dc85315e1b7b634ed1b19fd101397a8aaee2a296aca23e1f154d83bf2ca81d502de1ce7abdbf1e224e458bcbde4742e517dfc7ff124fca95bc7d6916a573", + "0x0418a86f98026d1a55f6fee616f04d51be16c033651ffaafb0514287ec067d04e805080000000000000000000000000000000000000000000000000aec000000000000000000000000000000000000000000000000000000000000000000000000000000002d56fafe62ab5b6fed6b2a6cd3e6eaff4b96665a12fda3cb3fcd69f5e7bee95f44107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f8420530000000000000000000000000000000000000f000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5300000000000000000000000000000000000017": [ + "0x0914e497f5219f809a1da1d4f2f115131b5dc9ad48724a1106b36d065909ad440a2d77f0dd9bbdc44acce00f7ab1067709208957504f8664b75b5a2fa79d88b04f", + "0x0914698788d45d66a67b900ee5938ae433aa83c5c4c43e5d866680d7b1f2661bba1b2ca4446bcde185d101b0d0c7f09c3e659d1607550762d2a4534c0f62946586", + "0x09104f87b11816f6619611fbd4dfb6b8425a675325a61e91a29346b0adeca37af01600e6198f3de08a2b8ae6b32493e7f0f2ac288d195b9bae360081d2edb9a17f", + "0x0923887f7f2b818306eb521f1c9a28fa1180772e0603e778536d3bd047562df33521b0c8c03e0e8783c187c12a2309a02be178b53f86ad845a9a2d0f82d342a027", + "0x0921db0def816c47288e31e114f2d320d1bef10a2ce0ed76f2333bfbaf4c9665df164af8117b30ef75c3a4e008ea19aceaa6e63940ecf5e5a545aab0906e772f19", + "0x09243159bed6b5236c01d76e3c7ce8656377ede3215a267875ebd69ecb83609c2f1d430d8e77abbe31d81de9fd34eb7963320d07e618379663173532df9fd64a45", + "0x0901b9f43d7930c744b2f5c270fc55ebc1dad912c53348dc7fc91c254d4f65dc731935412eb3f2d483f1fad4cda432ea52bf9a2fcc83bb4998daae1e3fcb942d70", + "0x090e532e6013b5c675cdd7dd5dbca734c748a7f04cbd659dd2ae0bc5eafa5970c91e3d73de759429994c0b1ca675ad7693042bdd444939eb4adbf7098f3863b137", + "0x091cf7b52fea8453a4ca0b91aa9982cfa67d70de187ba25db4a8f248026ca3e530001cfc254334d3a06381cc5cee1769ae6912ce781377cc01b9c6917605338915", + "0x07092aee158cd2b81331e1ce9909492eb4317b6c5bc4794d546b62069798d0b24428cd8e8880db728741786b4fa7256d94a30e266ca07390acd342670e53ccb6b9", + "0x060e3bf5a186646517ca6d50e9d232f03b095fcceb727e719819a496973c2a8cf81102b8f2eac7af07547b293c5389e362fced543befbe69dc6fa5ec89b7df96e3", + "0x041918c47a133f759975cc95c0dba82051d9b5cd65407e76ef1366a9deaa14f28005080000000000000000000000000000000000000000000000000aec00000000000000000000000000000000000000000000000000000000000000000000000000000000047815c1b6b86b3270e62056fbc5c2f5e6d06a5d3255217e122006dece0bb56544107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f84205300000000000000000000000000000000000017000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x716170D0687c3d31CC10DebE0dAa1DDD3FE3D792": [ + "0x0914e497f5219f809a1da1d4f2f115131b5dc9ad48724a1106b36d065909ad440a2d77f0dd9bbdc44acce00f7ab1067709208957504f8664b75b5a2fa79d88b04f", + "0x0914698788d45d66a67b900ee5938ae433aa83c5c4c43e5d866680d7b1f2661bba1b2ca4446bcde185d101b0d0c7f09c3e659d1607550762d2a4534c0f62946586", + "0x09104f87b11816f6619611fbd4dfb6b8425a675325a61e91a29346b0adeca37af01600e6198f3de08a2b8ae6b32493e7f0f2ac288d195b9bae360081d2edb9a17f", + "0x0901ae383d775a5593e8a9c58ec5e32d5b37296baa0363f05956ce31e20bf28f362e8e22f6b7f16ccaf973dab95034586851dd90ea30d65d8870b91aea2af5b8a3", + "0x092b26192ebc81162aa68594a054c44db6465a42a82afa2a88ea3a15f1d179742e14387ced0d9189063544aa46dd43112a978fc35e7526b39c40008a376e773d8c", + "0x0912f32fcd87faa8889ff2b91d786a0ef976de3b5553d5284f8cbd6e9729bd31aa130bd62f7e696e7c3e834cc85fa3d8725effbd8f5e8aec1c8e7f966d82744b08", + "0x0929be597731cca26d8264df590bb5eb3bbcb0549c210ccce091381bea0a5ed92901c5e622b20c6495e875b575e3dd145b99700697726bb02b8cbf73912c4f5949", + "0x09298da2e6f54d728445d34319cf317db690b4458e1cc40328ef50785d552a54e12bccf6a108d2a9e2970cc735937477086dde10fb57254012939a5fe256f882c3", + "0x0905a84a34349628360a471a26d87e83b5cb22108b4e512f899ff26456556e9c7a023de0555312a2fb89fadd6c4ef42e0aa5c403f884adf6ed26ce9de2bee551d9", + "0x07000000000000000000000000000000000000000000000000000000000000000009118a4378481478ba2ce8cb6ee78986b1136bdc712a83c1d4f7a8f6189baf82", + "0x0921ddfb4b9e43ab809479c10047a21a49a811c5ba8cc53280e5d7502943c0030d0b005e6f905f2e56b9bce131dac69841124cd59c226fe3cab7ae8c5aa8811426", + "0x060d815f195b8f33c180f64db3447bf925590e5c4dc51cababf56ffed7c673a5b804f6276c48cec8cdf8fe675b19d5cb173b53fca9d0c8f4e0b2015528dc843fcf", + "0x0414b0bb4090afcdae623b69d996022ea82c221cd1a3c00c5b13acb37d750f87fc0508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002bfc7464b51c6e890000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420716170d0687c3d31cc10debe0daa1ddd3fe3d792000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xF78ce1E2f0De8FD15cE6aC4DdeC6982413fda499": [ + "0x0914e497f5219f809a1da1d4f2f115131b5dc9ad48724a1106b36d065909ad440a2d77f0dd9bbdc44acce00f7ab1067709208957504f8664b75b5a2fa79d88b04f", + "0x0914698788d45d66a67b900ee5938ae433aa83c5c4c43e5d866680d7b1f2661bba1b2ca4446bcde185d101b0d0c7f09c3e659d1607550762d2a4534c0f62946586", + "0x090695394d7e90c7ab229f35a5bf7e984623a40a92cc4355e174eeb0fa43215cb1007f89220807403164fd521d78dc5244d8b1e74320055a60d4f8a3755c80dee8", + "0x092c04089db803ecef80badd1d52cc8e74d960051a224edde4f155a91b47c6d59327b48395b98d9dee704b606911b11f95fc96160e498e19fbcf3ecc069e0a768e", + "0x09222c59fb203c2136a3a186f2913505e1ca71f725701fddec9401ac0c19878ada27ef17d0195f0506df6a5b34dd52e09c851bc6b6af5fbdec53099aaed7f4d2fc", + "0x091594815ce3dab93b7a7a68e15e4f028c70130867a0c79816cea289fa703f32612c06a687e38230484a4b6da57e9789bd2b162494b8996940dde8f76be97e18e9", + "0x0904cb8ed1ee836a65563cf69814f12e7f05d7fe12957ac9dc97368e9dd1da8e27003f6c7ab23583dcb86714887fb7001654b639aef9b6a428eb3b1ec49d1ffaba", + "0x090443b59957547874bbad45056b1194c9316d47b51ddac3098927333ab421292a19d66853551b5572832ff2b8fb72db53abe9fd30f56d6234918b51b1a50d3e75", + "0x0705f62a2631030f319cc83d3aed31907f893959137f58b48b7b3e8c22d877ea371bdec89829016afd7afc01d165ff7df8703bd585530f3a630989764f6eaa4b6b", + "0x081155333bd99d7309a59d3167d1015363dac4f00305fe9fb1663e70bd6d40e14e0000000000000000000000000000000000000000000000000000000000000000", + "0x082964b1230661041e032c985207341ef4fd4b33e64382d28bb03210e69d8cb1ff0000000000000000000000000000000000000000000000000000000000000000", + "0x0613932eb8f57fa5abe741533e08ccd2a04ad892f622243099b59dda840a0d0d8e0e8e9abd7780da5da2ef86496348acf63857300969c2e704a31e7ea401be45f7", + "0x040dc14d1e73c0c578e5be438abfab5d1a47a0eef96e1d759f6997244869c1011205080000000000000000000000000000000000000000000000001dfd0000000000000001000000000000000000000000000000000000000000000000000000000000000026d6ebbf5a9ab0fb041cf1ceda5a52dff6eb7ec8f2bb21c4c281dbcacfd6351c04ebeb19827e292abcff3ed0df7e0643f284c1a3a1be79552f95e2d68f273404290a6dffbef8eab27533357244828872617f855e589938736a13aa522e946bd520f78ce1e2f0de8fd15ce6ac4ddec6982413fda499000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266": [ + "0x0914e497f5219f809a1da1d4f2f115131b5dc9ad48724a1106b36d065909ad440a2d77f0dd9bbdc44acce00f7ab1067709208957504f8664b75b5a2fa79d88b04f", + "0x0914698788d45d66a67b900ee5938ae433aa83c5c4c43e5d866680d7b1f2661bba1b2ca4446bcde185d101b0d0c7f09c3e659d1607550762d2a4534c0f62946586", + "0x090695394d7e90c7ab229f35a5bf7e984623a40a92cc4355e174eeb0fa43215cb1007f89220807403164fd521d78dc5244d8b1e74320055a60d4f8a3755c80dee8", + "0x092c04089db803ecef80badd1d52cc8e74d960051a224edde4f155a91b47c6d59327b48395b98d9dee704b606911b11f95fc96160e498e19fbcf3ecc069e0a768e", + "0x09222c59fb203c2136a3a186f2913505e1ca71f725701fddec9401ac0c19878ada27ef17d0195f0506df6a5b34dd52e09c851bc6b6af5fbdec53099aaed7f4d2fc", + "0x091594815ce3dab93b7a7a68e15e4f028c70130867a0c79816cea289fa703f32612c06a687e38230484a4b6da57e9789bd2b162494b8996940dde8f76be97e18e9", + "0x0904cb8ed1ee836a65563cf69814f12e7f05d7fe12957ac9dc97368e9dd1da8e27003f6c7ab23583dcb86714887fb7001654b639aef9b6a428eb3b1ec49d1ffaba", + "0x091a2e42b984a6b38ac4cee46e54d20e4b5333e29262d465ec5d3f94bdf62986bf0ae88f70036904a5ef65ca32ef6fe25a82526a71c7952aff24d5c988058ca52c", + "0x081bbe96ae8365df9b15e2165199c3502d9f5b962f585948040c008398fa1dbbee09b11876e7719db807b8d2c600e5babd3239cf90972e0301a6b204796f78205d", + "0x0829a6a7fe3afd17c3514e17e52d173e6cd61b855562b19e2ecfd817080a7e0e940000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000000f057731e85b476292bfe91038b46ee1bca6cf7eb16cb08f09145a2509da58bc", + "0x060b1f2c348f9e213843ddee3beda053c5fd99bcf747ca7928f56d58507b422fc11dd09d967fa39b772f3fa838f3d9d63ab3cac97964be50bf0bbce7053209285c", + "0x040d972511ec05ac7e25d155e7d292ab9a61b2227df344cd0eabfeff6f423c64d205080000000000000000000000000000000000000000000000000000000000000000087a000000000000000000000000000000000000000000000655cea7368c7bbc197f0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420f39fd6e51aad88f6f4ce6ab8827279cfffb92266000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "storageProofs": { + "0x5300000000000000000000000000000000000001": { + "0x0000000000000000000000000000000000000000000000000000000000000021": [ + "0x09185c96062cbc2b564296e9e1bce3354dbcbf9f5879fd062d5b50bb358f81517e2a2dbce5edb6723342643101ac68123f3790ae822b572ec8bbd69da035c7b935", + "0x092d047e244b411ce9155f14462cfb81958ef4b4c2a08fc3fd4189484a8b7711a40462e3566daed4615c6e51a0e598dfb9a7ed84c831bfc516151e9f5ffb8110ca", + "0x09261fe911b00d2fd329c6b0e4b6d4c3a810b95a82ff32e6946a3244614feb91d205b63b9955f3a8244688b1a6cb053a7559f79129086239b473999e85be4c4282", + "0x07251841563b13c8aa1784b2d917584c358e1607710c0e0b41e5b1c45a07ceac601daf38969872c436599f595013a03f6c004d1f072aa7c8347f6ead35212900a8", + "0x08249e00f5aae6d513fc492c019a4e4de721a60764cada3866244a95db0d4e38bf0000000000000000000000000000000000000000000000000000000000000000", + "0x0818749973fd91f5be3859e8cfa68caee44893779b104075dd793bf4c486475b5b0000000000000000000000000000000000000000000000000000000000000000", + "0x07000000000000000000000000000000000000000000000000000000000000000017d7d830e47e7f6da4ddbf680cf2eb1f9b538cec3240c26711d780f22f093f9a", + "0x0700000000000000000000000000000000000000000000000000000000000000000abb47e0d1f63a2287426a57ee22892129c848adcfadb74266fee6b726c86ede", + "0x07000000000000000000000000000000000000000000000000000000000000000021e13181b559aa6ad86c239a49008b70447de95cb59caa3242701b556ff6d030", + "0x0609a3a225fccec46d81cb0f42943e252523157488c3f7712cc9528ec8eceeee2d0736af2262ac152f39d5da51e394c65d8ab9f3223c051e5be4c43e508a8766cf", + "0x042f683d080c393f5fb2ade2190fd56e8a5e8fa26533acdea8cce25caa236027cc01010000f15fe55ccda900eb1a64fa9abee8054e44b6915dae17e21aef095f4cd49d2a67200000000000000000000000000000000000000000000000000000000000000021", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x530000000000000000000000000000000000000f": { + "0x0000000000000000000000000000000000000000000000000000000000000001": [ + "0x090a47cdf7291bf5686a20e9325d5e85cd4c10009d5a5b727819689a559d47c621305837382344bb8c16c78c482e68e414dcaf0dd956b894c85acca1ae8d3b661a", + "0x090b1b80070a297010cca4d2fb3048fe8814f318eb8a6034a339d8e843544f1d1b2930aa108d1bfc505b36919afcd36848860c81ec8b00c0787b390250bfa7e31a", + "0x090084ca152c72cefb55b42146c2ac6b95a984db669d559d50cea6b7e776e5a6b31952bdec2ac6cd00c8bebfc77863f183bd2c9d09cd1938ebb9fe5fc2e2d2c1f4", + "0x0826741766ba756a60481cdbfbf1385b2e19410e0b174723be76ccce90749c19b71721b818bb25fdc0627fbd0f0ced2d5f58f1065a3e11d06073b58139aa144311", + "0x0700000000000000000000000000000000000000000000000000000000000000002aa3eec54733e8552173f9294865bf49cf8b2c952706e74cee743186ad4cd928", + "0x080ccb96bae7a65349544b73c51e1c17e905afa52b470cd3d12f5068df70ae80380000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000001982d84b59e872b109cb1b01bc1d03406977eb16aeef0ca94449c0e4dbde6426", + "0x08148058fb1d8433119f2f078417d61bd03610293c07a22079d8add13751806be00000000000000000000000000000000000000000000000000000000000000000", + "0x080b933363c8e146ca259ddce0026a7cda36a75da17137370243f5452dad2e2bd10000000000000000000000000000000000000000000000000000000000000000", + "0x07000000000000000000000000000000000000000000000000000000000000000029d862e775a17f6a182820b3ef22a94850f73238972142e77c423a5ccda02739", + "0x0607f1a71dd97c713b6e6f0e0429b179a7f7a5d1a95605340f87f7b3b5c6571655156a0960a84fa4287f66d18b9c39ab9d403fa6b6dddd126f47758aadcb82e122", + "0x0426049ba6de63003492eb078a01a8aa4f4a0e67f28f0955c2eba9101d5d2eea50010100000000000000000000000000000000000000000000000000000000000005f5e108200000000000000000000000000000000000000000000000000000000000000001", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000002": [ + "0x090a47cdf7291bf5686a20e9325d5e85cd4c10009d5a5b727819689a559d47c621305837382344bb8c16c78c482e68e414dcaf0dd956b894c85acca1ae8d3b661a", + "0x090b1b80070a297010cca4d2fb3048fe8814f318eb8a6034a339d8e843544f1d1b2930aa108d1bfc505b36919afcd36848860c81ec8b00c0787b390250bfa7e31a", + "0x090084ca152c72cefb55b42146c2ac6b95a984db669d559d50cea6b7e776e5a6b31952bdec2ac6cd00c8bebfc77863f183bd2c9d09cd1938ebb9fe5fc2e2d2c1f4", + "0x061b12dcd1a582e1e93ccb441e0688e482eb23efa9fb802dd24b7e5a46a7fcd9e21e144bbeb8f4c147dafacf9567e13b1b15e4804a9d74df2da7619735d765c1be", + "0x04020953ad52de135367a1ba2629636216ed5174cce5629d11b5d97fe733f07dcc0101000000000000000000000000000000000000000000000000000000000000000009c4200000000000000000000000000000000000000000000000000000000000000002", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000003": [ + "0x090a47cdf7291bf5686a20e9325d5e85cd4c10009d5a5b727819689a559d47c621305837382344bb8c16c78c482e68e414dcaf0dd956b894c85acca1ae8d3b661a", + "0x0700000000000000000000000000000000000000000000000000000000000000001f63b7a392d1af6e501f653490c2436a2b6ecc4835f91bfc8983aded770a595c", + "0x070ee2ca3e190e48951aa8d5bb00d33ba76a92de69a807dfa6f2eaa9881e303f3226ee193ec0e0368b03645561b95ea6fee2df8bb5f1db80afc64364ec993655f8", + "0x0406c50541f08911ad149aa545dd3d606f86ee63c751a795c7d57f0d3f85e6bdeb01010000000000000000000000000000000000000000000000000000000000003b9aca00200000000000000000000000000000000000000000000000000000000000000003", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000006": [ + "0x090a47cdf7291bf5686a20e9325d5e85cd4c10009d5a5b727819689a559d47c621305837382344bb8c16c78c482e68e414dcaf0dd956b894c85acca1ae8d3b661a", + "0x090b1b80070a297010cca4d2fb3048fe8814f318eb8a6034a339d8e843544f1d1b2930aa108d1bfc505b36919afcd36848860c81ec8b00c0787b390250bfa7e31a", + "0x090084ca152c72cefb55b42146c2ac6b95a984db669d559d50cea6b7e776e5a6b31952bdec2ac6cd00c8bebfc77863f183bd2c9d09cd1938ebb9fe5fc2e2d2c1f4", + "0x061b12dcd1a582e1e93ccb441e0688e482eb23efa9fb802dd24b7e5a46a7fcd9e21e144bbeb8f4c147dafacf9567e13b1b15e4804a9d74df2da7619735d765c1be", + "0x04064ef33f6d7044a6aa1458b710bb24a531e379030cf6ca490d84fff1d8e79c94010100000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000006", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000007": [ + "0x090a47cdf7291bf5686a20e9325d5e85cd4c10009d5a5b727819689a559d47c621305837382344bb8c16c78c482e68e414dcaf0dd956b894c85acca1ae8d3b661a", + "0x090b1b80070a297010cca4d2fb3048fe8814f318eb8a6034a339d8e843544f1d1b2930aa108d1bfc505b36919afcd36848860c81ec8b00c0787b390250bfa7e31a", + "0x082b571cbf4c65b2bf5a694234230c0bb2e95c55920e0c050a73027dea6f5535ab0000000000000000000000000000000000000000000000000000000000000000", + "0x082119746c2afd71d1574bea80b47eab52d70db3990cd1c9f6d4df98eaed5c3ff01555b1ad85223923b16c0129d117eb56e12b2c4310ff3014c28b40684e3ea69d", + "0x040d1e80106f23933567a7c4881177b5d6c45a3f319feafe560a28df75769db9ba0101000000000000000000000000000000000000000000000000000000000b33edbfaf14200000000000000000000000000000000000000000000000000000000000000007", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000008": [ + "0x090a47cdf7291bf5686a20e9325d5e85cd4c10009d5a5b727819689a559d47c621305837382344bb8c16c78c482e68e414dcaf0dd956b894c85acca1ae8d3b661a", + "0x0700000000000000000000000000000000000000000000000000000000000000001f63b7a392d1af6e501f653490c2436a2b6ecc4835f91bfc8983aded770a595c", + "0x070ee2ca3e190e48951aa8d5bb00d33ba76a92de69a807dfa6f2eaa9881e303f3226ee193ec0e0368b03645561b95ea6fee2df8bb5f1db80afc64364ec993655f8", + "0x060e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200302bd20972a48695c1c418461cc2124f0c246ad1bb41e1d8d05cd9527784228a", + "0x0412c0c59f64422dd5b7ce259c4aa62e9bf4e2bcc4f0da068e332b9f4e502ba38f01010000000000000000000000000000000000000000000000000000000000174876e800200000000000000000000000000000000000000000000000000000000000000008", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000009": [ + "0x090a47cdf7291bf5686a20e9325d5e85cd4c10009d5a5b727819689a559d47c621305837382344bb8c16c78c482e68e414dcaf0dd956b894c85acca1ae8d3b661a", + "0x0700000000000000000000000000000000000000000000000000000000000000001f63b7a392d1af6e501f653490c2436a2b6ecc4835f91bfc8983aded770a595c", + "0x05", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x5300000000000000000000000000000000000017": { + "0x0000000000000000000000000000000000000000000000000000000000000065": [ + "0x091e6f7e3b2102387b1b88b997f51470252cf226b68be43284a52489de59a2abb0105259f0b8858b399570780c836f31751cc2566ba5935c50b2db952c1020abb0", + "0x091623ed516b763c3dd7bd75be87d3bda3bc50b9909eb6f832c706e2f973246c131bb859e26b23e5d0474d863af33c2a1163103f5881396448cd8ef9cfe18f9b92", + "0x0812bc2e9bd37f44093eb71c7af67706fd9be1a51a828a3d321b792b5490c6ad560e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200", + "0x07290cb26e75385afbd8fce76271781f49ca9f5737fe573f7a121642a43bdba61a04c601c63ad45f2c8c8c8cbe20c788ef63e574ce0e800153c8b0c855dca3c0be", + "0x0702bdcd1f95c7883b7b633e040eb8263e1fb0ab97a3fa5e590f4ba82b29ee3e5a2284968786ddc52459cd3e8be14da7533c8470c63575eaccae28bd65169074f9", + "0x07000000000000000000000000000000000000000000000000000000000000000028bcb7656960130b704e5cd2afdc5bf933752cc290e10ce8de9ff4eeff23fa71", + "0x060bf27252e269c88af00daf8e309f853351131ba9cb56aa8ffdc008546b4eefc9236d89b8a52ce6f920048f57605af94c276903d51b48d2a9549a2d4ce38af1e2", + "0x042115c9b0a0938aa1ce2e8c01581e5aa931288249a453588de70cf2c5dae26a7b0101000072fce9da9f9cca9ae7f43acbcc6060e82ef37152a13cee828b492343ec19eebc200000000000000000000000000000000000000000000000000000000000000065", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0xF78ce1E2f0De8FD15cE6aC4DdeC6982413fda499": { + "0x10f63bf6e119ea77f5bac4f2d14208f7bc130150e39d1898d11f3a85a4539e7b": [ + "0x072c5531fcb1f5d89ebf48434141bed498aa7fcbda8b8fdaf05553e80047967cc50794d00aa0fb0c977fad9810122d1d52810dfe10dd3f060f3d5060cb09d412e1", + "0x060393b6637f65dba38e4cc22851199d78b393b9f21f66654a30897d2189fc45560ff058d1013c8ee7b5a512e60ee9552e15d9781db2966fa03bf6cfbec6b70d6e", + "0x041e8c398d459c37919cfeed406cdf7ae1f710c7cfc105ed6a51d296d7efed716501010000000000000000000000000000000000000000000000000000000000000000000320a4aae6489168c8521ffa6667018748a8c49347b927c24ead8028d9a8d58f66af", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x411092aa40253bc3a57548e804d0118e38225673267c809e7a24d0ef673c1e36": [ + "0x072c5531fcb1f5d89ebf48434141bed498aa7fcbda8b8fdaf05553e80047967cc50794d00aa0fb0c977fad9810122d1d52810dfe10dd3f060f3d5060cb09d412e1", + "0x060393b6637f65dba38e4cc22851199d78b393b9f21f66654a30897d2189fc45560ff058d1013c8ee7b5a512e60ee9552e15d9781db2966fa03bf6cfbec6b70d6e", + "0x041e8c398d459c37919cfeed406cdf7ae1f710c7cfc105ed6a51d296d7efed716501010000000000000000000000000000000000000000000000000000000000000000000320a4aae6489168c8521ffa6667018748a8c49347b927c24ead8028d9a8d58f66af", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xa7f7d1323a52987879f36312c5073aaaebefb56b07868f38dc16e0fe5a6e3cea": [ + "0x072c5531fcb1f5d89ebf48434141bed498aa7fcbda8b8fdaf05553e80047967cc50794d00aa0fb0c977fad9810122d1d52810dfe10dd3f060f3d5060cb09d412e1", + "0x0402ff3d98d60879a35a5db7d2391babef2157d459d0d3fe39288673e1d095e872010100000000000000000000000000000000000000000000000000000000000000000001209b9b887057e67f014dddce475a6d1228ae8479d9c0a14dc111f4e71032020c24", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + } + } + }, + "codes": [ + { + "codeSize": 0, + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "code": "0x" + }, + { + "codeSize": 7677, + "keccakCodeHash": "0x04ebeb19827e292abcff3ed0df7e0643f284c1a3a1be79552f95e2d68f273404", + "hash": "0x290a6dffbef8eab27533357244828872617f855e589938736a13aa522e946bd5", + "code": "0x608060405234801561000f575f80fd5b506004361061009c575f3560e01c8063637bd16411610064578063637bd1641461019057806365207521146101c05780638a59e100146101f05780638f527e9414610220578063dbd81bc71461023e5761009c565b80630c8f3129146100a057806321ceca81146100d0578063447a4c62146101005780635e109b571461013057806363138d4f14610160575b5f80fd5b6100ba60048036038101906100b59190611296565b61026e565b6040516100c791906112f7565b60405180910390f35b6100ea60048036038101906100e591906113ae565b6103ad565b6040516100f79190611455565b60405180910390f35b61011a600480360381019061011591906114a8565b610460565b60405161012791906112f7565b60405180910390f35b61014a600480360381019061014591906113ae565b61075f565b60405161015791906112f7565b60405180910390f35b61017a60048036038101906101759190611296565b610770565b60405161018791906112f7565b60405180910390f35b6101aa60048036038101906101a591906113ae565b6108af565b6040516101b791906112f7565b60405180910390f35b6101da60048036038101906101d59190611296565b6108c0565b6040516101e791906112f7565b60405180910390f35b61020a600480360381019061020591906114d3565b610a50565b60405161021791906112f7565b60405180910390f35b610228610d94565b6040516102359190611455565b60405180910390f35b610258600480360381019061025391906113ae565b610fbc565b60405161026591906112f7565b60405180910390f35b5f8061027a8351610ff0565b60405160200161028a91906115b1565b60405160208183030381529060405290505f80600373ffffffffffffffffffffffffffffffffffffffff16856040516102c3919061160c565b5f60405180830381855afa9150503d805f81146102fb576040519150601f19603f3d011682016040523d82523d5f602084013e610300565b606091505b5091509150815f846040516103159190611622565b90815260200160405180910390205f6101000a81548160ff0219169083151502179055508060018460405161034a9190611622565b908152602001604051809103902090816103649190611832565b507ffafe735b5fe8b90ced311e90adbc382883d7ed521d7a3d16541de0ff8d44c0018383834260405161039a9493929190611958565b60405180910390a1819350505050919050565b6001818051602081018201805184825260208301602085012081835280955050505050505f9150905080546103e190611665565b80601f016020809104026020016040519081016040528092919081815260200182805461040d90611665565b80156104585780601f1061042f57610100808354040283529160200191610458565b820191905f5260205f20905b81548152906001019060200180831161043b57829003601f168201915b505050505081565b5f8061046b83610ff0565b60405160200161047b91906119f3565b60405160208183030381529060405290505f60c08461049a9190611a41565b67ffffffffffffffff8111156104b3576104b2611172565b5b6040519080825280601f01601f1916602001820160405280156104e55781602001600182028036833780820191505090505b5090505f5b8481101561064b575f60c0826105009190611a41565b905060018261050f9190611a82565b60f81b83601f836105209190611a82565b8151811061053157610530611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060028261056c9190611a82565b60f81b836040601f8461057f9190611a82565b6105899190611a82565b8151811061059a57610599611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053506003826105d59190611a82565b60f81b8360206040601f856105ea9190611a82565b6105f49190611a82565b6105fe9190611a82565b8151811061060f5761060e611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505080806001019150506104ea565b505f80600873ffffffffffffffffffffffffffffffffffffffff1683604051610674919061160c565b5f60405180830381855afa9150503d805f81146106ac576040519150601f19603f3d011682016040523d82523d5f602084013e6106b1565b606091505b5091509150815f856040516106c69190611622565b90815260200160405180910390205f6101000a81548160ff021916908315150217905550806001856040516106fb9190611622565b908152602001604051809103902090816107159190611832565b507ffafe735b5fe8b90ced311e90adbc382883d7ed521d7a3d16541de0ff8d44c0018483834260405161074b9493929190611958565b60405180910390a181945050505050919050565b5f61076982610770565b9050919050565b5f8061077c8351610ff0565b60405160200161078c9190611b2c565b60405160208183030381529060405290505f80600273ffffffffffffffffffffffffffffffffffffffff16856040516107c5919061160c565b5f60405180830381855afa9150503d805f81146107fd576040519150601f19603f3d011682016040523d82523d5f602084013e610802565b606091505b5091509150815f846040516108179190611622565b90815260200160405180910390205f6101000a81548160ff0219169083151502179055508060018460405161084c9190611622565b908152602001604051809103902090816108669190611832565b507ffafe735b5fe8b90ced311e90adbc382883d7ed521d7a3d16541de0ff8d44c0018383834260405161089c9493929190611958565b60405180910390a1819350505050919050565b5f6108b98261026e565b9050919050565b5f60d5825114610905576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fc90611bbd565b60405180910390fd5b5f6040518060400160405280600781526020017f426c616b6532460000000000000000000000000000000000000000000000000081525090505f80600973ffffffffffffffffffffffffffffffffffffffff1685604051610966919061160c565b5f60405180830381855afa9150503d805f811461099e576040519150601f19603f3d011682016040523d82523d5f602084013e6109a3565b606091505b5091509150815f846040516109b89190611622565b90815260200160405180910390205f6101000a81548160ff021916908315150217905550806001846040516109ed9190611622565b90815260200160405180910390209081610a079190611832565b507ffafe735b5fe8b90ced311e90adbc382883d7ed521d7a3d16541de0ff8d44c00183838342604051610a3d9493929190611958565b60405180910390a1819350505050919050565b5f80610a5b85610ff0565b610a6485610ff0565b610a6d85610ff0565b604051602001610a7f93929190611c6f565b60405160208183030381529060405290505f8385876060610aa09190611a82565b610aaa9190611a82565b610ab49190611a82565b67ffffffffffffffff811115610acd57610acc611172565b5b6040519080825280601f01601f191660200182016040528015610aff5781602001600182028036833780820191505090505b5090505f865f1b90505f865f1b90505f865f1b90508260208501528160408501528060608501525f891115610b8d57600760f81b8460018b6060610b439190611a82565b610b4d9190611cc0565b81518110610b5e57610b5d611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505b5f881115610bff57600360f81b8460018a8c6060610bab9190611a82565b610bb59190611a82565b610bbf9190611cc0565b81518110610bd057610bcf611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505b5f871115610c7c57601160f81b846001898b8d6060610c1e9190611a82565b610c289190611a82565b610c329190611a82565b610c3c9190611cc0565b81518110610c4d57610c4c611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505b5f80600573ffffffffffffffffffffffffffffffffffffffff1686604051610ca4919061160c565b5f60405180830381855afa9150503d805f8114610cdc576040519150601f19603f3d011682016040523d82523d5f602084013e610ce1565b606091505b5091509150815f88604051610cf69190611622565b90815260200160405180910390205f6101000a81548160ff02191690831515021790555080600188604051610d2b9190611622565b90815260200160405180910390209081610d459190611832565b507ffafe735b5fe8b90ced311e90adbc382883d7ed521d7a3d16541de0ff8d44c00187838342604051610d7b9493929190611958565b60405180910390a1819750505050505050509392505050565b60605f60d567ffffffffffffffff811115610db257610db1611172565b5b6040519080825280601f01601f191660200182016040528015610de45781602001600182028036833780820191505090505b5090505f60f81b815f81518110610dfe57610dfd611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f60f81b81600181518110610e4457610e43611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f60f81b81600281518110610e8a57610e89611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600c60f81b81600381518110610ed157610ed0611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f600490505b60d4811015610f6d5761010081610f1c9190611d20565b60f81b828281518110610f3257610f31611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053508080600101915050610f05565b50600160f81b8160d481518110610f8757610f86611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053508091505090565b5f818051602081018201805184825260208301602085012081835280955050505050505f915054906101000a900460ff1681565b60605f8203611036576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611144565b5f8290505f5b5f821461106557808061104e90611d50565b915050600a8261105e9190611d97565b915061103c565b5f8167ffffffffffffffff8111156110805761107f611172565b5b6040519080825280601f01601f1916602001820160405280156110b25781602001600182028036833780820191505090505b5090505b5f851461113d576001826110ca9190611cc0565b9150600a856110d99190611d20565b60306110e59190611a82565b60f81b8183815181106110fb576110fa611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a856111369190611d97565b94506110b6565b8093505050505b919050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6111a882611162565b810181811067ffffffffffffffff821117156111c7576111c6611172565b5b80604052505050565b5f6111d9611149565b90506111e5828261119f565b919050565b5f67ffffffffffffffff82111561120457611203611172565b5b61120d82611162565b9050602081019050919050565b828183375f83830152505050565b5f61123a611235846111ea565b6111d0565b9050828152602081018484840111156112565761125561115e565b5b61126184828561121a565b509392505050565b5f82601f83011261127d5761127c61115a565b5b813561128d848260208601611228565b91505092915050565b5f602082840312156112ab576112aa611152565b5b5f82013567ffffffffffffffff8111156112c8576112c7611156565b5b6112d484828501611269565b91505092915050565b5f8115159050919050565b6112f1816112dd565b82525050565b5f60208201905061130a5f8301846112e8565b92915050565b5f67ffffffffffffffff82111561132a57611329611172565b5b61133382611162565b9050602081019050919050565b5f61135261134d84611310565b6111d0565b90508281526020810184848401111561136e5761136d61115e565b5b61137984828561121a565b509392505050565b5f82601f8301126113955761139461115a565b5b81356113a5848260208601611340565b91505092915050565b5f602082840312156113c3576113c2611152565b5b5f82013567ffffffffffffffff8111156113e0576113df611156565b5b6113ec84828501611381565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f611427826113f5565b61143181856113ff565b935061144181856020860161140f565b61144a81611162565b840191505092915050565b5f6020820190508181035f83015261146d818461141d565b905092915050565b5f819050919050565b61148781611475565b8114611491575f80fd5b50565b5f813590506114a28161147e565b92915050565b5f602082840312156114bd576114bc611152565b5b5f6114ca84828501611494565b91505092915050565b5f805f606084860312156114ea576114e9611152565b5b5f6114f786828701611494565b935050602061150886828701611494565b925050604061151986828701611494565b9150509250925092565b5f81905092915050565b7f524950454d443136305f000000000000000000000000000000000000000000005f82015250565b5f611561600a83611523565b915061156c8261152d565b600a82019050919050565b5f81519050919050565b5f61158b82611577565b6115958185611523565b93506115a581856020860161140f565b80840191505092915050565b5f6115bb82611555565b91506115c78284611581565b915081905092915050565b5f81905092915050565b5f6115e6826113f5565b6115f081856115d2565b935061160081856020860161140f565b80840191505092915050565b5f61161782846115dc565b915081905092915050565b5f61162d8284611581565b915081905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061167c57607f821691505b60208210810361168f5761168e611638565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026116f17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826116b6565b6116fb86836116b6565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61173661173161172c84611475565b611713565b611475565b9050919050565b5f819050919050565b61174f8361171c565b61176361175b8261173d565b8484546116c2565b825550505050565b5f90565b61177761176b565b611782818484611746565b505050565b5b818110156117a55761179a5f8261176f565b600181019050611788565b5050565b601f8211156117ea576117bb81611695565b6117c4846116a7565b810160208510156117d3578190505b6117e76117df856116a7565b830182611787565b50505b505050565b5f82821c905092915050565b5f61180a5f19846008026117ef565b1980831691505092915050565b5f61182283836117fb565b9150826002028217905092915050565b61183b826113f5565b67ffffffffffffffff81111561185457611853611172565b5b61185e8254611665565b6118698282856117a9565b5f60209050601f83116001811461189a575f8415611888578287015190505b6118928582611817565b8655506118f9565b601f1984166118a886611695565b5f5b828110156118cf578489015182556001820191506020850194506020810190506118aa565b868310156118ec57848901516118e8601f8916826117fb565b8355505b6001600288020188555050505b505050505050565b5f82825260208201905092915050565b5f61191b82611577565b6119258185611901565b935061193581856020860161140f565b61193e81611162565b840191505092915050565b61195281611475565b82525050565b5f6080820190508181035f8301526119708187611911565b905061197f60208301866112e8565b8181036040830152611991818561141d565b90506119a06060830184611949565b95945050505050565b7f50616972696e675f0000000000000000000000000000000000000000000000005f82015250565b5f6119dd600883611523565b91506119e8826119a9565b600882019050919050565b5f6119fd826119d1565b9150611a098284611581565b915081905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611a4b82611475565b9150611a5683611475565b9250828202611a6481611475565b91508282048414831517611a7b57611a7a611a14565b5b5092915050565b5f611a8c82611475565b9150611a9783611475565b9250828201905080821115611aaf57611aae611a14565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f5348413235365f000000000000000000000000000000000000000000000000005f82015250565b5f611b16600783611523565b9150611b2182611ae2565b600782019050919050565b5f611b3682611b0a565b9150611b428284611581565b915081905092915050565b7f426c616b6532662072657175697265732065786163746c7920323133206279745f8201527f657320696e707574000000000000000000000000000000000000000000000000602082015250565b5f611ba7602883611901565b9150611bb282611b4d565b604082019050919050565b5f6020820190508181035f830152611bd481611b9b565b9050919050565b7f4d6f644578705f000000000000000000000000000000000000000000000000005f82015250565b5f611c0f600783611523565b9150611c1a82611bdb565b600782019050919050565b7f5f000000000000000000000000000000000000000000000000000000000000005f82015250565b5f611c59600183611523565b9150611c6482611c25565b600182019050919050565b5f611c7982611c03565b9150611c858286611581565b9150611c9082611c4d565b9150611c9c8285611581565b9150611ca782611c4d565b9150611cb38284611581565b9150819050949350505050565b5f611cca82611475565b9150611cd583611475565b9250828203905081811115611ced57611cec611a14565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f611d2a82611475565b9150611d3583611475565b925082611d4557611d44611cf3565b5b828206905092915050565b5f611d5a82611475565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611d8c57611d8b611a14565b5b600182019050919050565b5f611da182611475565b9150611dac83611475565b925082611dbc57611dbb611cf3565b5b82820490509291505056fea264697066735822122005118c223c12b158349613416fd6342abd507776ce6306cce1e9a99fa8e7b9bb64736f6c634300081a0033" + } + ], + "txStorageTraces": [ + { + "rootBefore": "0x1c3c7f10ba4091cba575777e91ceb7db804dd686e697dc7f0aa20a7d83761375", + "rootAfter": "0x06282a9b276c3b80d658aca386f03e479d9379af169e73801488632461d86525", + "proofs": { + "0x0000000000000000000000000000000000000003": [ + "0x0914e497f5219f809a1da1d4f2f115131b5dc9ad48724a1106b36d065909ad440a2d77f0dd9bbdc44acce00f7ab1067709208957504f8664b75b5a2fa79d88b04f", + "0x0914698788d45d66a67b900ee5938ae433aa83c5c4c43e5d866680d7b1f2661bba1b2ca4446bcde185d101b0d0c7f09c3e659d1607550762d2a4534c0f62946586", + "0x090695394d7e90c7ab229f35a5bf7e984623a40a92cc4355e174eeb0fa43215cb1007f89220807403164fd521d78dc5244d8b1e74320055a60d4f8a3755c80dee8", + "0x09144d123dd26f6dfe0f857b293c4a99d7b0966a8b0749c1dde7e84dcf3036332915c9497f86d8eda791789359e2c944057e6d1069e651edaaae10cc5f1c602ff6", + "0x0900f7bca7214a6e6fcbcbfce1fd023985457d325de3f6cd151af34aaa2bda0636158c5f76d728ac8bf46731ad2e9905d779cf1ef8b4b38d392ed707ff81c6fad2", + "0x0919990527de00f1ddc538fcc0490d594a39b51dbbcaf1f26cdfe9be1bea7835401b69fa24ece85c0c60ec95c5f7a989b91a39f2cb495af36bead9017d76765db2", + "0x09197fbc425c6b18955436ccb7aa7095b99255f5ec2a9ccf356217108c0dc2ca99005c0f07bbf970d785c2c1c3866d26896d42fabf1e0808132915988fbc9c3f3a", + "0x091f1b98802e0b01dbb250552f1a9f7ad8e29cfce3462125c643e9e7be51f5c1e31571d732d58a06af66e8ecc4052a3433ec5092741932405013e9c041ae9c3e4a", + "0x09192e7d947a87813060baab27ee3f32a589e8bc57006a0802e624badb579b8b5f22ebf768ed68a8888c6e9a2c1f06f50e9e692efcaa1cc550796bb49c5a5936a6", + "0x07207869ed88c227637248ddc4bbc4067dcde50f0a1723c6e6c3746f10e454c5d5162c9af98705cf012ced1bf86d1cea75d219159b0bf0a94535a8cca7e5a71661", + "0x0621d7539d4749f67f5554bd5d8863324e3f59745fa8c8b1cb53bad21bac57d0ba1af71caa20f24d10027026702a6060186b00d0bd76b977817f762ec044222c01", + "0x042fc8c52a10b9301b599089efee0123d4d71053d427c2a8ea6bff1cc93186fe260508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c621c5d486a08000000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420267f56f44cc61487af9df27cc6da1566c757eb56000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x716170D0687c3d31CC10DebE0dAa1DDD3FE3D792": [ + "0x0914e497f5219f809a1da1d4f2f115131b5dc9ad48724a1106b36d065909ad440a2d77f0dd9bbdc44acce00f7ab1067709208957504f8664b75b5a2fa79d88b04f", + "0x0914698788d45d66a67b900ee5938ae433aa83c5c4c43e5d866680d7b1f2661bba1b2ca4446bcde185d101b0d0c7f09c3e659d1607550762d2a4534c0f62946586", + "0x09104f87b11816f6619611fbd4dfb6b8425a675325a61e91a29346b0adeca37af01600e6198f3de08a2b8ae6b32493e7f0f2ac288d195b9bae360081d2edb9a17f", + "0x0901ae383d775a5593e8a9c58ec5e32d5b37296baa0363f05956ce31e20bf28f362e8e22f6b7f16ccaf973dab95034586851dd90ea30d65d8870b91aea2af5b8a3", + "0x092b26192ebc81162aa68594a054c44db6465a42a82afa2a88ea3a15f1d179742e14387ced0d9189063544aa46dd43112a978fc35e7526b39c40008a376e773d8c", + "0x0912f32fcd87faa8889ff2b91d786a0ef976de3b5553d5284f8cbd6e9729bd31aa130bd62f7e696e7c3e834cc85fa3d8725effbd8f5e8aec1c8e7f966d82744b08", + "0x0929be597731cca26d8264df590bb5eb3bbcb0549c210ccce091381bea0a5ed92901c5e622b20c6495e875b575e3dd145b99700697726bb02b8cbf73912c4f5949", + "0x09298da2e6f54d728445d34319cf317db690b4458e1cc40328ef50785d552a54e12bccf6a108d2a9e2970cc735937477086dde10fb57254012939a5fe256f882c3", + "0x0905a84a34349628360a471a26d87e83b5cb22108b4e512f899ff26456556e9c7a023de0555312a2fb89fadd6c4ef42e0aa5c403f884adf6ed26ce9de2bee551d9", + "0x07000000000000000000000000000000000000000000000000000000000000000009118a4378481478ba2ce8cb6ee78986b1136bdc712a83c1d4f7a8f6189baf82", + "0x0921ddfb4b9e43ab809479c10047a21a49a811c5ba8cc53280e5d7502943c0030d0b005e6f905f2e56b9bce131dac69841124cd59c226fe3cab7ae8c5aa8811426", + "0x060d815f195b8f33c180f64db3447bf925590e5c4dc51cababf56ffed7c673a5b804f6276c48cec8cdf8fe675b19d5cb173b53fca9d0c8f4e0b2015528dc843fcf", + "0x0414b0bb4090afcdae623b69d996022ea82c221cd1a3c00c5b13acb37d750f87fc0508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002bfc7464b51c6e890000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420716170d0687c3d31cc10debe0daa1ddd3fe3d792000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xF78ce1E2f0De8FD15cE6aC4DdeC6982413fda499": [ + "0x0914e497f5219f809a1da1d4f2f115131b5dc9ad48724a1106b36d065909ad440a2d77f0dd9bbdc44acce00f7ab1067709208957504f8664b75b5a2fa79d88b04f", + "0x0914698788d45d66a67b900ee5938ae433aa83c5c4c43e5d866680d7b1f2661bba1b2ca4446bcde185d101b0d0c7f09c3e659d1607550762d2a4534c0f62946586", + "0x090695394d7e90c7ab229f35a5bf7e984623a40a92cc4355e174eeb0fa43215cb1007f89220807403164fd521d78dc5244d8b1e74320055a60d4f8a3755c80dee8", + "0x092c04089db803ecef80badd1d52cc8e74d960051a224edde4f155a91b47c6d59327b48395b98d9dee704b606911b11f95fc96160e498e19fbcf3ecc069e0a768e", + "0x09222c59fb203c2136a3a186f2913505e1ca71f725701fddec9401ac0c19878ada27ef17d0195f0506df6a5b34dd52e09c851bc6b6af5fbdec53099aaed7f4d2fc", + "0x091594815ce3dab93b7a7a68e15e4f028c70130867a0c79816cea289fa703f32612c06a687e38230484a4b6da57e9789bd2b162494b8996940dde8f76be97e18e9", + "0x0904cb8ed1ee836a65563cf69814f12e7f05d7fe12957ac9dc97368e9dd1da8e27003f6c7ab23583dcb86714887fb7001654b639aef9b6a428eb3b1ec49d1ffaba", + "0x090443b59957547874bbad45056b1194c9316d47b51ddac3098927333ab421292a19d66853551b5572832ff2b8fb72db53abe9fd30f56d6234918b51b1a50d3e75", + "0x0705f62a2631030f319cc83d3aed31907f893959137f58b48b7b3e8c22d877ea371bdec89829016afd7afc01d165ff7df8703bd585530f3a630989764f6eaa4b6b", + "0x081155333bd99d7309a59d3167d1015363dac4f00305fe9fb1663e70bd6d40e14e0000000000000000000000000000000000000000000000000000000000000000", + "0x082964b1230661041e032c985207341ef4fd4b33e64382d28bb03210e69d8cb1ff0000000000000000000000000000000000000000000000000000000000000000", + "0x0613932eb8f57fa5abe741533e08ccd2a04ad892f622243099b59dda840a0d0d8e0e8e9abd7780da5da2ef86496348acf63857300969c2e704a31e7ea401be45f7", + "0x040dc14d1e73c0c578e5be438abfab5d1a47a0eef96e1d759f6997244869c1011205080000000000000000000000000000000000000000000000001dfd0000000000000001000000000000000000000000000000000000000000000000000000000000000026d6ebbf5a9ab0fb041cf1ceda5a52dff6eb7ec8f2bb21c4c281dbcacfd6351c04ebeb19827e292abcff3ed0df7e0643f284c1a3a1be79552f95e2d68f273404290a6dffbef8eab27533357244828872617f855e589938736a13aa522e946bd520f78ce1e2f0de8fd15ce6ac4ddec6982413fda499000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266": [ + "0x0914e497f5219f809a1da1d4f2f115131b5dc9ad48724a1106b36d065909ad440a2d77f0dd9bbdc44acce00f7ab1067709208957504f8664b75b5a2fa79d88b04f", + "0x0914698788d45d66a67b900ee5938ae433aa83c5c4c43e5d866680d7b1f2661bba1b2ca4446bcde185d101b0d0c7f09c3e659d1607550762d2a4534c0f62946586", + "0x090695394d7e90c7ab229f35a5bf7e984623a40a92cc4355e174eeb0fa43215cb1007f89220807403164fd521d78dc5244d8b1e74320055a60d4f8a3755c80dee8", + "0x092c04089db803ecef80badd1d52cc8e74d960051a224edde4f155a91b47c6d59327b48395b98d9dee704b606911b11f95fc96160e498e19fbcf3ecc069e0a768e", + "0x09222c59fb203c2136a3a186f2913505e1ca71f725701fddec9401ac0c19878ada27ef17d0195f0506df6a5b34dd52e09c851bc6b6af5fbdec53099aaed7f4d2fc", + "0x091594815ce3dab93b7a7a68e15e4f028c70130867a0c79816cea289fa703f32612c06a687e38230484a4b6da57e9789bd2b162494b8996940dde8f76be97e18e9", + "0x0904cb8ed1ee836a65563cf69814f12e7f05d7fe12957ac9dc97368e9dd1da8e27003f6c7ab23583dcb86714887fb7001654b639aef9b6a428eb3b1ec49d1ffaba", + "0x091a2e42b984a6b38ac4cee46e54d20e4b5333e29262d465ec5d3f94bdf62986bf0ae88f70036904a5ef65ca32ef6fe25a82526a71c7952aff24d5c988058ca52c", + "0x081bbe96ae8365df9b15e2165199c3502d9f5b962f585948040c008398fa1dbbee09b11876e7719db807b8d2c600e5babd3239cf90972e0301a6b204796f78205d", + "0x0829a6a7fe3afd17c3514e17e52d173e6cd61b855562b19e2ecfd817080a7e0e940000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000000f057731e85b476292bfe91038b46ee1bca6cf7eb16cb08f09145a2509da58bc", + "0x060b1f2c348f9e213843ddee3beda053c5fd99bcf747ca7928f56d58507b422fc11dd09d967fa39b772f3fa838f3d9d63ab3cac97964be50bf0bbce7053209285c", + "0x040d972511ec05ac7e25d155e7d292ab9a61b2227df344cd0eabfeff6f423c64d205080000000000000000000000000000000000000000000000000000000000000000087a000000000000000000000000000000000000000000000655cea7368c7bbc197f0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420f39fd6e51aad88f6f4ce6ab8827279cfffb92266000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "storageProofs": { + "0xF78ce1E2f0De8FD15cE6aC4DdeC6982413fda499": { + "0x10f63bf6e119ea77f5bac4f2d14208f7bc130150e39d1898d11f3a85a4539e7b": [ + "0x072c5531fcb1f5d89ebf48434141bed498aa7fcbda8b8fdaf05553e80047967cc50794d00aa0fb0c977fad9810122d1d52810dfe10dd3f060f3d5060cb09d412e1", + "0x060393b6637f65dba38e4cc22851199d78b393b9f21f66654a30897d2189fc45560ff058d1013c8ee7b5a512e60ee9552e15d9781db2966fa03bf6cfbec6b70d6e", + "0x041e8c398d459c37919cfeed406cdf7ae1f710c7cfc105ed6a51d296d7efed716501010000000000000000000000000000000000000000000000000000000000000000000320a4aae6489168c8521ffa6667018748a8c49347b927c24ead8028d9a8d58f66af", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x411092aa40253bc3a57548e804d0118e38225673267c809e7a24d0ef673c1e36": [ + "0x072c5531fcb1f5d89ebf48434141bed498aa7fcbda8b8fdaf05553e80047967cc50794d00aa0fb0c977fad9810122d1d52810dfe10dd3f060f3d5060cb09d412e1", + "0x060393b6637f65dba38e4cc22851199d78b393b9f21f66654a30897d2189fc45560ff058d1013c8ee7b5a512e60ee9552e15d9781db2966fa03bf6cfbec6b70d6e", + "0x041e8c398d459c37919cfeed406cdf7ae1f710c7cfc105ed6a51d296d7efed716501010000000000000000000000000000000000000000000000000000000000000000000320a4aae6489168c8521ffa6667018748a8c49347b927c24ead8028d9a8d58f66af", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xa7f7d1323a52987879f36312c5073aaaebefb56b07868f38dc16e0fe5a6e3cea": [ + "0x072c5531fcb1f5d89ebf48434141bed498aa7fcbda8b8fdaf05553e80047967cc50794d00aa0fb0c977fad9810122d1d52810dfe10dd3f060f3d5060cb09d412e1", + "0x0402ff3d98d60879a35a5db7d2391babef2157d459d0d3fe39288673e1d095e872010100000000000000000000000000000000000000000000000000000000000000000001209b9b887057e67f014dddce475a6d1228ae8479d9c0a14dc111f4e71032020c24", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + } + } + } + ], + "executionResults": [ + { + "l1DataFee": "0x11ecafb65a3", + "gas": 97553, + "failed": false, + "returnValue": "0000000000000000000000000000000000000000000000000000000000000001", + "from": { + "address": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "nonce": 2170, + "balance": "0x655cea7368c7bbc197f", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + "to": { + "address": "0xf78ce1e2f0de8fd15ce6ac4ddec6982413fda499", + "nonce": 1, + "balance": "0x0", + "keccakCodeHash": "0x04ebeb19827e292abcff3ed0df7e0643f284c1a3a1be79552f95e2d68f273404", + "poseidonCodeHash": "0x290a6dffbef8eab27533357244828872617f855e589938736a13aa522e946bd5", + "codeSize": 7677 + }, + "accountAfter": [ + { + "address": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "nonce": 2171, + "balance": "0x655cea73556fa240d9c", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + { + "address": "0xf78ce1e2f0de8fd15ce6ac4ddec6982413fda499", + "nonce": 1, + "balance": "0x0", + "keccakCodeHash": "0x04ebeb19827e292abcff3ed0df7e0643f284c1a3a1be79552f95e2d68f273404", + "poseidonCodeHash": "0x290a6dffbef8eab27533357244828872617f855e589938736a13aa522e946bd5", + "codeSize": 7677 + }, + { + "address": "0x716170d0687c3d31cc10debe0daa1ddd3fe3d792", + "nonce": 0, + "balance": "0x2bfc759a36b47a6c", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + } + ], + "structLogs": [ + { + "pc": 0, + "op": "PUSH1", + "gas": 76033, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2, + "op": "PUSH1", + "gas": 76030, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4, + "op": "MSTORE", + "gas": 76027, + "gasCost": 12, + "depth": 1 + }, + { + "pc": 5, + "op": "CALLVALUE", + "gas": 76015, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6, + "op": "DUP1", + "gas": 76013, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7, + "op": "ISZERO", + "gas": 76010, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 8, + "op": "PUSH2", + "gas": 76007, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 11, + "op": "JUMPI", + "gas": 76004, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 15, + "op": "JUMPDEST", + "gas": 75994, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 16, + "op": "POP", + "gas": 75993, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 17, + "op": "PUSH1", + "gas": 75991, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 19, + "op": "CALLDATASIZE", + "gas": 75988, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 20, + "op": "LT", + "gas": 75986, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 21, + "op": "PUSH2", + "gas": 75983, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 24, + "op": "JUMPI", + "gas": 75980, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 25, + "op": "PUSH0", + "gas": 75970, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 26, + "op": "CALLDATALOAD", + "gas": 75968, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 27, + "op": "PUSH1", + "gas": 75965, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 29, + "op": "SHR", + "gas": 75962, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 30, + "op": "DUP1", + "gas": 75959, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 31, + "op": "PUSH4", + "gas": 75956, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 36, + "op": "GT", + "gas": 75953, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 37, + "op": "PUSH2", + "gas": 75950, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 40, + "op": "JUMPI", + "gas": 75947, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 41, + "op": "DUP1", + "gas": 75937, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 42, + "op": "PUSH4", + "gas": 75934, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 47, + "op": "EQ", + "gas": 75931, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 48, + "op": "PUSH2", + "gas": 75928, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 51, + "op": "JUMPI", + "gas": 75925, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 400, + "op": "JUMPDEST", + "gas": 75915, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 401, + "op": "PUSH2", + "gas": 75914, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 404, + "op": "PUSH1", + "gas": 75911, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 406, + "op": "DUP1", + "gas": 75908, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 407, + "op": "CALLDATASIZE", + "gas": 75905, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 408, + "op": "SUB", + "gas": 75903, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 409, + "op": "DUP2", + "gas": 75900, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 410, + "op": "ADD", + "gas": 75897, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 411, + "op": "SWAP1", + "gas": 75894, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 412, + "op": "PUSH2", + "gas": 75891, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 415, + "op": "SWAP2", + "gas": 75888, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 416, + "op": "SWAP1", + "gas": 75885, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 417, + "op": "PUSH2", + "gas": 75882, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 420, + "op": "JUMP", + "gas": 75879, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5038, + "op": "JUMPDEST", + "gas": 75871, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5039, + "op": "PUSH0", + "gas": 75870, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5040, + "op": "PUSH1", + "gas": 75868, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5042, + "op": "DUP3", + "gas": 75865, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5043, + "op": "DUP5", + "gas": 75862, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5044, + "op": "SUB", + "gas": 75859, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5045, + "op": "SLT", + "gas": 75856, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5046, + "op": "ISZERO", + "gas": 75853, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5047, + "op": "PUSH2", + "gas": 75850, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5050, + "op": "JUMPI", + "gas": 75847, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 5059, + "op": "JUMPDEST", + "gas": 75837, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5060, + "op": "PUSH0", + "gas": 75836, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5061, + "op": "DUP3", + "gas": 75834, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5062, + "op": "ADD", + "gas": 75831, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5063, + "op": "CALLDATALOAD", + "gas": 75828, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5064, + "op": "PUSH8", + "gas": 75825, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5073, + "op": "DUP2", + "gas": 75822, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5074, + "op": "GT", + "gas": 75819, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5075, + "op": "ISZERO", + "gas": 75816, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5076, + "op": "PUSH2", + "gas": 75813, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5079, + "op": "JUMPI", + "gas": 75810, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 5088, + "op": "JUMPDEST", + "gas": 75800, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5089, + "op": "PUSH2", + "gas": 75799, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5092, + "op": "DUP5", + "gas": 75796, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5093, + "op": "DUP3", + "gas": 75793, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5094, + "op": "DUP6", + "gas": 75790, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5095, + "op": "ADD", + "gas": 75787, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5096, + "op": "PUSH2", + "gas": 75784, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5099, + "op": "JUMP", + "gas": 75781, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4993, + "op": "JUMPDEST", + "gas": 75773, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4994, + "op": "PUSH0", + "gas": 75772, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4995, + "op": "DUP3", + "gas": 75770, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4996, + "op": "PUSH1", + "gas": 75767, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4998, + "op": "DUP4", + "gas": 75764, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4999, + "op": "ADD", + "gas": 75761, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5000, + "op": "SLT", + "gas": 75758, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5001, + "op": "PUSH2", + "gas": 75755, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5004, + "op": "JUMPI", + "gas": 75752, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 5013, + "op": "JUMPDEST", + "gas": 75742, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5014, + "op": "DUP2", + "gas": 75741, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5015, + "op": "CALLDATALOAD", + "gas": 75738, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5016, + "op": "PUSH2", + "gas": 75735, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5019, + "op": "DUP5", + "gas": 75732, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5020, + "op": "DUP3", + "gas": 75729, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5021, + "op": "PUSH1", + "gas": 75726, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5023, + "op": "DUP7", + "gas": 75723, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5024, + "op": "ADD", + "gas": 75720, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5025, + "op": "PUSH2", + "gas": 75717, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5028, + "op": "JUMP", + "gas": 75714, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4928, + "op": "JUMPDEST", + "gas": 75706, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4929, + "op": "PUSH0", + "gas": 75705, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4930, + "op": "PUSH2", + "gas": 75703, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4933, + "op": "PUSH2", + "gas": 75700, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4936, + "op": "DUP5", + "gas": 75697, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4937, + "op": "PUSH2", + "gas": 75694, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4940, + "op": "JUMP", + "gas": 75691, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4880, + "op": "JUMPDEST", + "gas": 75683, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4881, + "op": "PUSH0", + "gas": 75682, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4882, + "op": "PUSH8", + "gas": 75680, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4891, + "op": "DUP3", + "gas": 75677, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4892, + "op": "GT", + "gas": 75674, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4893, + "op": "ISZERO", + "gas": 75671, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4894, + "op": "PUSH2", + "gas": 75668, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4897, + "op": "JUMPI", + "gas": 75665, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4906, + "op": "JUMPDEST", + "gas": 75655, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4907, + "op": "PUSH2", + "gas": 75654, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4910, + "op": "DUP3", + "gas": 75651, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4911, + "op": "PUSH2", + "gas": 75648, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4914, + "op": "JUMP", + "gas": 75645, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4450, + "op": "JUMPDEST", + "gas": 75637, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4451, + "op": "PUSH0", + "gas": 75636, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4452, + "op": "PUSH1", + "gas": 75634, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4454, + "op": "NOT", + "gas": 75631, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4455, + "op": "PUSH1", + "gas": 75628, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4457, + "op": "DUP4", + "gas": 75625, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4458, + "op": "ADD", + "gas": 75622, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4459, + "op": "AND", + "gas": 75619, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4460, + "op": "SWAP1", + "gas": 75616, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4461, + "op": "POP", + "gas": 75613, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4462, + "op": "SWAP2", + "gas": 75611, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4463, + "op": "SWAP1", + "gas": 75608, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4464, + "op": "POP", + "gas": 75605, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4465, + "op": "JUMP", + "gas": 75603, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4915, + "op": "JUMPDEST", + "gas": 75595, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4916, + "op": "SWAP1", + "gas": 75594, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4917, + "op": "POP", + "gas": 75591, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4918, + "op": "PUSH1", + "gas": 75589, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4920, + "op": "DUP2", + "gas": 75586, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4921, + "op": "ADD", + "gas": 75583, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4922, + "op": "SWAP1", + "gas": 75580, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4923, + "op": "POP", + "gas": 75577, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4924, + "op": "SWAP2", + "gas": 75575, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4925, + "op": "SWAP1", + "gas": 75572, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4926, + "op": "POP", + "gas": 75569, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4927, + "op": "JUMP", + "gas": 75567, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4941, + "op": "JUMPDEST", + "gas": 75559, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4942, + "op": "PUSH2", + "gas": 75558, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4945, + "op": "JUMP", + "gas": 75555, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4560, + "op": "JUMPDEST", + "gas": 75547, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4561, + "op": "PUSH0", + "gas": 75546, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4562, + "op": "PUSH2", + "gas": 75544, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4565, + "op": "PUSH2", + "gas": 75541, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4568, + "op": "JUMP", + "gas": 75538, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4425, + "op": "JUMPDEST", + "gas": 75530, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4426, + "op": "PUSH0", + "gas": 75529, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4427, + "op": "PUSH1", + "gas": 75527, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4429, + "op": "MLOAD", + "gas": 75524, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4430, + "op": "SWAP1", + "gas": 75521, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4431, + "op": "POP", + "gas": 75518, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4432, + "op": "SWAP1", + "gas": 75516, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4433, + "op": "JUMP", + "gas": 75513, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4569, + "op": "JUMPDEST", + "gas": 75505, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4570, + "op": "SWAP1", + "gas": 75504, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4571, + "op": "POP", + "gas": 75501, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4572, + "op": "PUSH2", + "gas": 75499, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4575, + "op": "DUP3", + "gas": 75496, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4576, + "op": "DUP3", + "gas": 75493, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4577, + "op": "PUSH2", + "gas": 75490, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4580, + "op": "JUMP", + "gas": 75487, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4511, + "op": "JUMPDEST", + "gas": 75479, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4512, + "op": "PUSH2", + "gas": 75478, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4515, + "op": "DUP3", + "gas": 75475, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4516, + "op": "PUSH2", + "gas": 75472, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4519, + "op": "JUMP", + "gas": 75469, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4450, + "op": "JUMPDEST", + "gas": 75461, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4451, + "op": "PUSH0", + "gas": 75460, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4452, + "op": "PUSH1", + "gas": 75458, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4454, + "op": "NOT", + "gas": 75455, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4455, + "op": "PUSH1", + "gas": 75452, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4457, + "op": "DUP4", + "gas": 75449, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4458, + "op": "ADD", + "gas": 75446, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4459, + "op": "AND", + "gas": 75443, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4460, + "op": "SWAP1", + "gas": 75440, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4461, + "op": "POP", + "gas": 75437, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4462, + "op": "SWAP2", + "gas": 75435, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4463, + "op": "SWAP1", + "gas": 75432, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4464, + "op": "POP", + "gas": 75429, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4465, + "op": "JUMP", + "gas": 75427, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4520, + "op": "JUMPDEST", + "gas": 75419, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4521, + "op": "DUP2", + "gas": 75418, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4522, + "op": "ADD", + "gas": 75415, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4523, + "op": "DUP2", + "gas": 75412, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4524, + "op": "DUP2", + "gas": 75409, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4525, + "op": "LT", + "gas": 75406, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4526, + "op": "PUSH8", + "gas": 75403, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4535, + "op": "DUP3", + "gas": 75400, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4536, + "op": "GT", + "gas": 75397, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4537, + "op": "OR", + "gas": 75394, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4538, + "op": "ISZERO", + "gas": 75391, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4539, + "op": "PUSH2", + "gas": 75388, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4542, + "op": "JUMPI", + "gas": 75385, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4551, + "op": "JUMPDEST", + "gas": 75375, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4552, + "op": "DUP1", + "gas": 75374, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4553, + "op": "PUSH1", + "gas": 75371, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4555, + "op": "MSTORE", + "gas": 75368, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4556, + "op": "POP", + "gas": 75365, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4557, + "op": "POP", + "gas": 75363, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4558, + "op": "POP", + "gas": 75361, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4559, + "op": "JUMP", + "gas": 75359, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4581, + "op": "JUMPDEST", + "gas": 75351, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4582, + "op": "SWAP2", + "gas": 75350, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4583, + "op": "SWAP1", + "gas": 75347, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4584, + "op": "POP", + "gas": 75344, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4585, + "op": "JUMP", + "gas": 75342, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4946, + "op": "JUMPDEST", + "gas": 75334, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4947, + "op": "SWAP1", + "gas": 75333, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4948, + "op": "POP", + "gas": 75330, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4949, + "op": "DUP3", + "gas": 75328, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4950, + "op": "DUP2", + "gas": 75325, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4951, + "op": "MSTORE", + "gas": 75322, + "gasCost": 9, + "depth": 1 + }, + { + "pc": 4952, + "op": "PUSH1", + "gas": 75313, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4954, + "op": "DUP2", + "gas": 75310, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4955, + "op": "ADD", + "gas": 75307, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4956, + "op": "DUP5", + "gas": 75304, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4957, + "op": "DUP5", + "gas": 75301, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4958, + "op": "DUP5", + "gas": 75298, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4959, + "op": "ADD", + "gas": 75295, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4960, + "op": "GT", + "gas": 75292, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4961, + "op": "ISZERO", + "gas": 75289, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4962, + "op": "PUSH2", + "gas": 75286, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4965, + "op": "JUMPI", + "gas": 75283, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4974, + "op": "JUMPDEST", + "gas": 75273, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4975, + "op": "PUSH2", + "gas": 75272, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4978, + "op": "DUP5", + "gas": 75269, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4979, + "op": "DUP3", + "gas": 75266, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4980, + "op": "DUP6", + "gas": 75263, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4981, + "op": "PUSH2", + "gas": 75260, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4984, + "op": "JUMP", + "gas": 75257, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4634, + "op": "JUMPDEST", + "gas": 75249, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4635, + "op": "DUP3", + "gas": 75248, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4636, + "op": "DUP2", + "gas": 75245, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4637, + "op": "DUP4", + "gas": 75242, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4638, + "op": "CALLDATACOPY", + "gas": 75239, + "gasCost": 9, + "depth": 1 + }, + { + "pc": 4639, + "op": "PUSH0", + "gas": 75230, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4640, + "op": "DUP4", + "gas": 75228, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4641, + "op": "DUP4", + "gas": 75225, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4642, + "op": "ADD", + "gas": 75222, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4643, + "op": "MSTORE", + "gas": 75219, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 4644, + "op": "POP", + "gas": 75213, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4645, + "op": "POP", + "gas": 75211, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4646, + "op": "POP", + "gas": 75209, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4647, + "op": "JUMP", + "gas": 75207, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4985, + "op": "JUMPDEST", + "gas": 75199, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4986, + "op": "POP", + "gas": 75198, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4987, + "op": "SWAP4", + "gas": 75196, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4988, + "op": "SWAP3", + "gas": 75193, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4989, + "op": "POP", + "gas": 75190, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4990, + "op": "POP", + "gas": 75188, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4991, + "op": "POP", + "gas": 75186, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4992, + "op": "JUMP", + "gas": 75184, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5029, + "op": "JUMPDEST", + "gas": 75176, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5030, + "op": "SWAP2", + "gas": 75175, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5031, + "op": "POP", + "gas": 75172, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5032, + "op": "POP", + "gas": 75170, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5033, + "op": "SWAP3", + "gas": 75168, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5034, + "op": "SWAP2", + "gas": 75165, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5035, + "op": "POP", + "gas": 75162, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5036, + "op": "POP", + "gas": 75160, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5037, + "op": "JUMP", + "gas": 75158, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5100, + "op": "JUMPDEST", + "gas": 75150, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5101, + "op": "SWAP2", + "gas": 75149, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5102, + "op": "POP", + "gas": 75146, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5103, + "op": "POP", + "gas": 75144, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5104, + "op": "SWAP3", + "gas": 75142, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5105, + "op": "SWAP2", + "gas": 75139, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5106, + "op": "POP", + "gas": 75136, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5107, + "op": "POP", + "gas": 75134, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5108, + "op": "JUMP", + "gas": 75132, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 421, + "op": "JUMPDEST", + "gas": 75124, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 422, + "op": "PUSH2", + "gas": 75123, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 425, + "op": "JUMP", + "gas": 75120, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 2223, + "op": "JUMPDEST", + "gas": 75112, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 2224, + "op": "PUSH0", + "gas": 75111, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2225, + "op": "PUSH2", + "gas": 75109, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2228, + "op": "DUP3", + "gas": 75106, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2229, + "op": "PUSH2", + "gas": 75103, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2232, + "op": "JUMP", + "gas": 75100, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 622, + "op": "JUMPDEST", + "gas": 75092, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 623, + "op": "PUSH0", + "gas": 75091, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 624, + "op": "DUP1", + "gas": 75089, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 625, + "op": "PUSH2", + "gas": 75086, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 628, + "op": "DUP4", + "gas": 75083, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 629, + "op": "MLOAD", + "gas": 75080, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 630, + "op": "PUSH2", + "gas": 75077, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 633, + "op": "JUMP", + "gas": 75074, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4080, + "op": "JUMPDEST", + "gas": 75066, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4081, + "op": "PUSH1", + "gas": 75065, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4083, + "op": "PUSH0", + "gas": 75062, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4084, + "op": "DUP3", + "gas": 75060, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4085, + "op": "SUB", + "gas": 75057, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4086, + "op": "PUSH2", + "gas": 75054, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4089, + "op": "JUMPI", + "gas": 75051, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4150, + "op": "JUMPDEST", + "gas": 75041, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4151, + "op": "PUSH0", + "gas": 75040, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4152, + "op": "DUP3", + "gas": 75038, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4153, + "op": "SWAP1", + "gas": 75035, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4154, + "op": "POP", + "gas": 75032, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4155, + "op": "PUSH0", + "gas": 75030, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4156, + "op": "JUMPDEST", + "gas": 75028, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4157, + "op": "PUSH0", + "gas": 75027, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4158, + "op": "DUP3", + "gas": 75025, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4159, + "op": "EQ", + "gas": 75022, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4160, + "op": "PUSH2", + "gas": 75019, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4163, + "op": "JUMPI", + "gas": 75016, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4164, + "op": "DUP1", + "gas": 75006, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4165, + "op": "DUP1", + "gas": 75003, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4166, + "op": "PUSH2", + "gas": 75000, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4169, + "op": "SWAP1", + "gas": 74997, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4170, + "op": "PUSH2", + "gas": 74994, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4173, + "op": "JUMP", + "gas": 74991, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7504, + "op": "JUMPDEST", + "gas": 74983, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7505, + "op": "PUSH0", + "gas": 74982, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7506, + "op": "PUSH2", + "gas": 74980, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7509, + "op": "DUP3", + "gas": 74977, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7510, + "op": "PUSH2", + "gas": 74974, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7513, + "op": "JUMP", + "gas": 74971, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 74963, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 74962, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 74960, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 74957, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 74954, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 74952, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 74949, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 74946, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 74944, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7514, + "op": "JUMPDEST", + "gas": 74936, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7515, + "op": "SWAP2", + "gas": 74935, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7516, + "op": "POP", + "gas": 74932, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7517, + "op": "PUSH32", + "gas": 74930, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7550, + "op": "DUP3", + "gas": 74927, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7551, + "op": "SUB", + "gas": 74924, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7552, + "op": "PUSH2", + "gas": 74921, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7555, + "op": "JUMPI", + "gas": 74918, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7564, + "op": "JUMPDEST", + "gas": 74908, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7565, + "op": "PUSH1", + "gas": 74907, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7567, + "op": "DUP3", + "gas": 74904, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7568, + "op": "ADD", + "gas": 74901, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7569, + "op": "SWAP1", + "gas": 74898, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7570, + "op": "POP", + "gas": 74895, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7571, + "op": "SWAP2", + "gas": 74893, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7572, + "op": "SWAP1", + "gas": 74890, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7573, + "op": "POP", + "gas": 74887, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7574, + "op": "JUMP", + "gas": 74885, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4174, + "op": "JUMPDEST", + "gas": 74877, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4175, + "op": "SWAP2", + "gas": 74876, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4176, + "op": "POP", + "gas": 74873, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4177, + "op": "POP", + "gas": 74871, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4178, + "op": "PUSH1", + "gas": 74869, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4180, + "op": "DUP3", + "gas": 74866, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4181, + "op": "PUSH2", + "gas": 74863, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4184, + "op": "SWAP2", + "gas": 74860, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4185, + "op": "SWAP1", + "gas": 74857, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4186, + "op": "PUSH2", + "gas": 74854, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4189, + "op": "JUMP", + "gas": 74851, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7575, + "op": "JUMPDEST", + "gas": 74843, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7576, + "op": "PUSH0", + "gas": 74842, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7577, + "op": "PUSH2", + "gas": 74840, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7580, + "op": "DUP3", + "gas": 74837, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7581, + "op": "PUSH2", + "gas": 74834, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7584, + "op": "JUMP", + "gas": 74831, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 74823, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 74822, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 74820, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 74817, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 74814, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 74812, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 74809, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 74806, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 74804, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7585, + "op": "JUMPDEST", + "gas": 74796, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7586, + "op": "SWAP2", + "gas": 74795, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7587, + "op": "POP", + "gas": 74792, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7588, + "op": "PUSH2", + "gas": 74790, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7591, + "op": "DUP4", + "gas": 74787, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7592, + "op": "PUSH2", + "gas": 74784, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7595, + "op": "JUMP", + "gas": 74781, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 74773, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 74772, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 74770, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 74767, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 74764, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 74762, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 74759, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 74756, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 74754, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7596, + "op": "JUMPDEST", + "gas": 74746, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7597, + "op": "SWAP3", + "gas": 74745, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7598, + "op": "POP", + "gas": 74742, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7599, + "op": "DUP3", + "gas": 74740, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7600, + "op": "PUSH2", + "gas": 74737, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7603, + "op": "JUMPI", + "gas": 74734, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7612, + "op": "JUMPDEST", + "gas": 74724, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7613, + "op": "DUP3", + "gas": 74723, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7614, + "op": "DUP3", + "gas": 74720, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7615, + "op": "DIV", + "gas": 74717, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 7616, + "op": "SWAP1", + "gas": 74712, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7617, + "op": "POP", + "gas": 74709, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7618, + "op": "SWAP3", + "gas": 74707, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7619, + "op": "SWAP2", + "gas": 74704, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7620, + "op": "POP", + "gas": 74701, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7621, + "op": "POP", + "gas": 74699, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7622, + "op": "JUMP", + "gas": 74697, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4190, + "op": "JUMPDEST", + "gas": 74689, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4191, + "op": "SWAP2", + "gas": 74688, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4192, + "op": "POP", + "gas": 74685, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4193, + "op": "PUSH2", + "gas": 74683, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4196, + "op": "JUMP", + "gas": 74680, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4156, + "op": "JUMPDEST", + "gas": 74672, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4157, + "op": "PUSH0", + "gas": 74671, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4158, + "op": "DUP3", + "gas": 74669, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4159, + "op": "EQ", + "gas": 74666, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4160, + "op": "PUSH2", + "gas": 74663, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4163, + "op": "JUMPI", + "gas": 74660, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4197, + "op": "JUMPDEST", + "gas": 74650, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4198, + "op": "PUSH0", + "gas": 74649, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4199, + "op": "DUP2", + "gas": 74647, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4200, + "op": "PUSH8", + "gas": 74644, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4209, + "op": "DUP2", + "gas": 74641, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4210, + "op": "GT", + "gas": 74638, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4211, + "op": "ISZERO", + "gas": 74635, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4212, + "op": "PUSH2", + "gas": 74632, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4215, + "op": "JUMPI", + "gas": 74629, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4224, + "op": "JUMPDEST", + "gas": 74619, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4225, + "op": "PUSH1", + "gas": 74618, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4227, + "op": "MLOAD", + "gas": 74615, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4228, + "op": "SWAP1", + "gas": 74612, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4229, + "op": "DUP1", + "gas": 74609, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4230, + "op": "DUP3", + "gas": 74606, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4231, + "op": "MSTORE", + "gas": 74603, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4232, + "op": "DUP1", + "gas": 74600, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4233, + "op": "PUSH1", + "gas": 74597, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4235, + "op": "ADD", + "gas": 74594, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4236, + "op": "PUSH1", + "gas": 74591, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4238, + "op": "NOT", + "gas": 74588, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4239, + "op": "AND", + "gas": 74585, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4240, + "op": "PUSH1", + "gas": 74582, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4242, + "op": "ADD", + "gas": 74579, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4243, + "op": "DUP3", + "gas": 74576, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4244, + "op": "ADD", + "gas": 74573, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4245, + "op": "PUSH1", + "gas": 74570, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4247, + "op": "MSTORE", + "gas": 74567, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4248, + "op": "DUP1", + "gas": 74564, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4249, + "op": "ISZERO", + "gas": 74561, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4250, + "op": "PUSH2", + "gas": 74558, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4253, + "op": "JUMPI", + "gas": 74555, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4254, + "op": "DUP2", + "gas": 74545, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4255, + "op": "PUSH1", + "gas": 74542, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4257, + "op": "ADD", + "gas": 74539, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4258, + "op": "PUSH1", + "gas": 74536, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4260, + "op": "DUP3", + "gas": 74533, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4261, + "op": "MUL", + "gas": 74530, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 4262, + "op": "DUP1", + "gas": 74525, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4263, + "op": "CALLDATASIZE", + "gas": 74522, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4264, + "op": "DUP4", + "gas": 74520, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4265, + "op": "CALLDATACOPY", + "gas": 74517, + "gasCost": 9, + "depth": 1 + }, + { + "pc": 4266, + "op": "DUP1", + "gas": 74508, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4267, + "op": "DUP3", + "gas": 74505, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4268, + "op": "ADD", + "gas": 74502, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4269, + "op": "SWAP2", + "gas": 74499, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4270, + "op": "POP", + "gas": 74496, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4271, + "op": "POP", + "gas": 74494, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4272, + "op": "SWAP1", + "gas": 74492, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4273, + "op": "POP", + "gas": 74489, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4274, + "op": "JUMPDEST", + "gas": 74487, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4275, + "op": "POP", + "gas": 74486, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4276, + "op": "SWAP1", + "gas": 74484, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4277, + "op": "POP", + "gas": 74481, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4278, + "op": "JUMPDEST", + "gas": 74479, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4279, + "op": "PUSH0", + "gas": 74478, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4280, + "op": "DUP6", + "gas": 74476, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4281, + "op": "EQ", + "gas": 74473, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4282, + "op": "PUSH2", + "gas": 74470, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4285, + "op": "JUMPI", + "gas": 74467, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4286, + "op": "PUSH1", + "gas": 74457, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4288, + "op": "DUP3", + "gas": 74454, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4289, + "op": "PUSH2", + "gas": 74451, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4292, + "op": "SWAP2", + "gas": 74448, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4293, + "op": "SWAP1", + "gas": 74445, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4294, + "op": "PUSH2", + "gas": 74442, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4297, + "op": "JUMP", + "gas": 74439, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7360, + "op": "JUMPDEST", + "gas": 74431, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7361, + "op": "PUSH0", + "gas": 74430, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7362, + "op": "PUSH2", + "gas": 74428, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7365, + "op": "DUP3", + "gas": 74425, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7366, + "op": "PUSH2", + "gas": 74422, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7369, + "op": "JUMP", + "gas": 74419, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 74411, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 74410, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 74408, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 74405, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 74402, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 74400, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 74397, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 74394, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 74392, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7370, + "op": "JUMPDEST", + "gas": 74384, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7371, + "op": "SWAP2", + "gas": 74383, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7372, + "op": "POP", + "gas": 74380, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7373, + "op": "PUSH2", + "gas": 74378, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7376, + "op": "DUP4", + "gas": 74375, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7377, + "op": "PUSH2", + "gas": 74372, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7380, + "op": "JUMP", + "gas": 74369, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 74361, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 74360, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 74358, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 74355, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 74352, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 74350, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 74347, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 74344, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 74342, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7381, + "op": "JUMPDEST", + "gas": 74334, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7382, + "op": "SWAP3", + "gas": 74333, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7383, + "op": "POP", + "gas": 74330, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7384, + "op": "DUP3", + "gas": 74328, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7385, + "op": "DUP3", + "gas": 74325, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7386, + "op": "SUB", + "gas": 74322, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7387, + "op": "SWAP1", + "gas": 74319, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7388, + "op": "POP", + "gas": 74316, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7389, + "op": "DUP2", + "gas": 74314, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7390, + "op": "DUP2", + "gas": 74311, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7391, + "op": "GT", + "gas": 74308, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7392, + "op": "ISZERO", + "gas": 74305, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7393, + "op": "PUSH2", + "gas": 74302, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7396, + "op": "JUMPI", + "gas": 74299, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7405, + "op": "JUMPDEST", + "gas": 74289, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7406, + "op": "SWAP3", + "gas": 74288, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7407, + "op": "SWAP2", + "gas": 74285, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7408, + "op": "POP", + "gas": 74282, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7409, + "op": "POP", + "gas": 74280, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7410, + "op": "JUMP", + "gas": 74278, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4298, + "op": "JUMPDEST", + "gas": 74270, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4299, + "op": "SWAP2", + "gas": 74269, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4300, + "op": "POP", + "gas": 74266, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4301, + "op": "PUSH1", + "gas": 74264, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4303, + "op": "DUP6", + "gas": 74261, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4304, + "op": "PUSH2", + "gas": 74258, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4307, + "op": "SWAP2", + "gas": 74255, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4308, + "op": "SWAP1", + "gas": 74252, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4309, + "op": "PUSH2", + "gas": 74249, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4312, + "op": "JUMP", + "gas": 74246, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7456, + "op": "JUMPDEST", + "gas": 74238, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7457, + "op": "PUSH0", + "gas": 74237, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7458, + "op": "PUSH2", + "gas": 74235, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7461, + "op": "DUP3", + "gas": 74232, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7462, + "op": "PUSH2", + "gas": 74229, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7465, + "op": "JUMP", + "gas": 74226, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 74218, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 74217, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 74215, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 74212, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 74209, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 74207, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 74204, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 74201, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 74199, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7466, + "op": "JUMPDEST", + "gas": 74191, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7467, + "op": "SWAP2", + "gas": 74190, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7468, + "op": "POP", + "gas": 74187, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7469, + "op": "PUSH2", + "gas": 74185, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7472, + "op": "DUP4", + "gas": 74182, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7473, + "op": "PUSH2", + "gas": 74179, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7476, + "op": "JUMP", + "gas": 74176, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 74168, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 74167, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 74165, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 74162, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 74159, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 74157, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 74154, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 74151, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 74149, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7477, + "op": "JUMPDEST", + "gas": 74141, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7478, + "op": "SWAP3", + "gas": 74140, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7479, + "op": "POP", + "gas": 74137, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7480, + "op": "DUP3", + "gas": 74135, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7481, + "op": "PUSH2", + "gas": 74132, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7484, + "op": "JUMPI", + "gas": 74129, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7493, + "op": "JUMPDEST", + "gas": 74119, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7494, + "op": "DUP3", + "gas": 74118, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7495, + "op": "DUP3", + "gas": 74115, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7496, + "op": "MOD", + "gas": 74112, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 7497, + "op": "SWAP1", + "gas": 74107, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7498, + "op": "POP", + "gas": 74104, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7499, + "op": "SWAP3", + "gas": 74102, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7500, + "op": "SWAP2", + "gas": 74099, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7501, + "op": "POP", + "gas": 74096, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7502, + "op": "POP", + "gas": 74094, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7503, + "op": "JUMP", + "gas": 74092, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4313, + "op": "JUMPDEST", + "gas": 74084, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4314, + "op": "PUSH1", + "gas": 74083, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4316, + "op": "PUSH2", + "gas": 74080, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4319, + "op": "SWAP2", + "gas": 74077, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4320, + "op": "SWAP1", + "gas": 74074, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4321, + "op": "PUSH2", + "gas": 74071, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4324, + "op": "JUMP", + "gas": 74068, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6786, + "op": "JUMPDEST", + "gas": 74060, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6787, + "op": "PUSH0", + "gas": 74059, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6788, + "op": "PUSH2", + "gas": 74057, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6791, + "op": "DUP3", + "gas": 74054, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6792, + "op": "PUSH2", + "gas": 74051, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6795, + "op": "JUMP", + "gas": 74048, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 74040, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 74039, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 74037, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 74034, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 74031, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 74029, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 74026, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 74023, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 74021, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6796, + "op": "JUMPDEST", + "gas": 74013, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6797, + "op": "SWAP2", + "gas": 74012, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6798, + "op": "POP", + "gas": 74009, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6799, + "op": "PUSH2", + "gas": 74007, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6802, + "op": "DUP4", + "gas": 74004, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6803, + "op": "PUSH2", + "gas": 74001, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6806, + "op": "JUMP", + "gas": 73998, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 73990, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 73989, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 73987, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 73984, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 73981, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 73979, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 73976, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 73973, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 73971, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6807, + "op": "JUMPDEST", + "gas": 73963, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6808, + "op": "SWAP3", + "gas": 73962, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6809, + "op": "POP", + "gas": 73959, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6810, + "op": "DUP3", + "gas": 73957, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6811, + "op": "DUP3", + "gas": 73954, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6812, + "op": "ADD", + "gas": 73951, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6813, + "op": "SWAP1", + "gas": 73948, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6814, + "op": "POP", + "gas": 73945, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6815, + "op": "DUP1", + "gas": 73943, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6816, + "op": "DUP3", + "gas": 73940, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6817, + "op": "GT", + "gas": 73937, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6818, + "op": "ISZERO", + "gas": 73934, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6819, + "op": "PUSH2", + "gas": 73931, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6822, + "op": "JUMPI", + "gas": 73928, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6831, + "op": "JUMPDEST", + "gas": 73918, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6832, + "op": "SWAP3", + "gas": 73917, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6833, + "op": "SWAP2", + "gas": 73914, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6834, + "op": "POP", + "gas": 73911, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6835, + "op": "POP", + "gas": 73909, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6836, + "op": "JUMP", + "gas": 73907, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4325, + "op": "JUMPDEST", + "gas": 73899, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4326, + "op": "PUSH1", + "gas": 73898, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4328, + "op": "SHL", + "gas": 73895, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4329, + "op": "DUP2", + "gas": 73892, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4330, + "op": "DUP4", + "gas": 73889, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4331, + "op": "DUP2", + "gas": 73886, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4332, + "op": "MLOAD", + "gas": 73883, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4333, + "op": "DUP2", + "gas": 73880, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4334, + "op": "LT", + "gas": 73877, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4335, + "op": "PUSH2", + "gas": 73874, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4338, + "op": "JUMPI", + "gas": 73871, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4347, + "op": "JUMPDEST", + "gas": 73861, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4348, + "op": "PUSH1", + "gas": 73860, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4350, + "op": "ADD", + "gas": 73857, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4351, + "op": "ADD", + "gas": 73854, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4352, + "op": "SWAP1", + "gas": 73851, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4353, + "op": "PUSH31", + "gas": 73848, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4385, + "op": "NOT", + "gas": 73845, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4386, + "op": "AND", + "gas": 73842, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4387, + "op": "SWAP1", + "gas": 73839, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4388, + "op": "DUP2", + "gas": 73836, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4389, + "op": "PUSH0", + "gas": 73833, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4390, + "op": "BYTE", + "gas": 73831, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4391, + "op": "SWAP1", + "gas": 73828, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4392, + "op": "MSTORE8", + "gas": 73825, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4393, + "op": "POP", + "gas": 73822, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4394, + "op": "PUSH1", + "gas": 73820, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4396, + "op": "DUP6", + "gas": 73817, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4397, + "op": "PUSH2", + "gas": 73814, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4400, + "op": "SWAP2", + "gas": 73811, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4401, + "op": "SWAP1", + "gas": 73808, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4402, + "op": "PUSH2", + "gas": 73805, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4405, + "op": "JUMP", + "gas": 73802, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7575, + "op": "JUMPDEST", + "gas": 73794, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7576, + "op": "PUSH0", + "gas": 73793, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7577, + "op": "PUSH2", + "gas": 73791, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7580, + "op": "DUP3", + "gas": 73788, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7581, + "op": "PUSH2", + "gas": 73785, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7584, + "op": "JUMP", + "gas": 73782, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 73774, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 73773, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 73771, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 73768, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 73765, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 73763, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 73760, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 73757, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 73755, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7585, + "op": "JUMPDEST", + "gas": 73747, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7586, + "op": "SWAP2", + "gas": 73746, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7587, + "op": "POP", + "gas": 73743, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7588, + "op": "PUSH2", + "gas": 73741, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7591, + "op": "DUP4", + "gas": 73738, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7592, + "op": "PUSH2", + "gas": 73735, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7595, + "op": "JUMP", + "gas": 73732, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 73724, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 73723, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 73721, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 73718, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 73715, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 73713, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 73710, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 73707, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 73705, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7596, + "op": "JUMPDEST", + "gas": 73697, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7597, + "op": "SWAP3", + "gas": 73696, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7598, + "op": "POP", + "gas": 73693, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7599, + "op": "DUP3", + "gas": 73691, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7600, + "op": "PUSH2", + "gas": 73688, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7603, + "op": "JUMPI", + "gas": 73685, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7612, + "op": "JUMPDEST", + "gas": 73675, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7613, + "op": "DUP3", + "gas": 73674, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7614, + "op": "DUP3", + "gas": 73671, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7615, + "op": "DIV", + "gas": 73668, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 7616, + "op": "SWAP1", + "gas": 73663, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7617, + "op": "POP", + "gas": 73660, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7618, + "op": "SWAP3", + "gas": 73658, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7619, + "op": "SWAP2", + "gas": 73655, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7620, + "op": "POP", + "gas": 73652, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7621, + "op": "POP", + "gas": 73650, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7622, + "op": "JUMP", + "gas": 73648, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4406, + "op": "JUMPDEST", + "gas": 73640, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4407, + "op": "SWAP5", + "gas": 73639, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4408, + "op": "POP", + "gas": 73636, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4409, + "op": "PUSH2", + "gas": 73634, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4412, + "op": "JUMP", + "gas": 73631, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4278, + "op": "JUMPDEST", + "gas": 73623, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4279, + "op": "PUSH0", + "gas": 73622, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4280, + "op": "DUP6", + "gas": 73620, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4281, + "op": "EQ", + "gas": 73617, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4282, + "op": "PUSH2", + "gas": 73614, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4285, + "op": "JUMPI", + "gas": 73611, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4413, + "op": "JUMPDEST", + "gas": 73601, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4414, + "op": "DUP1", + "gas": 73600, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4415, + "op": "SWAP4", + "gas": 73597, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4416, + "op": "POP", + "gas": 73594, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4417, + "op": "POP", + "gas": 73592, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4418, + "op": "POP", + "gas": 73590, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4419, + "op": "POP", + "gas": 73588, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4420, + "op": "JUMPDEST", + "gas": 73586, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4421, + "op": "SWAP2", + "gas": 73585, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4422, + "op": "SWAP1", + "gas": 73582, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4423, + "op": "POP", + "gas": 73579, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4424, + "op": "JUMP", + "gas": 73577, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 634, + "op": "JUMPDEST", + "gas": 73569, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 635, + "op": "PUSH1", + "gas": 73568, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 637, + "op": "MLOAD", + "gas": 73565, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 638, + "op": "PUSH1", + "gas": 73562, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 640, + "op": "ADD", + "gas": 73559, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 641, + "op": "PUSH2", + "gas": 73556, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 644, + "op": "SWAP2", + "gas": 73553, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 645, + "op": "SWAP1", + "gas": 73550, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 646, + "op": "PUSH2", + "gas": 73547, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 649, + "op": "JUMP", + "gas": 73544, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5553, + "op": "JUMPDEST", + "gas": 73536, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5554, + "op": "PUSH0", + "gas": 73535, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5555, + "op": "PUSH2", + "gas": 73533, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5558, + "op": "DUP3", + "gas": 73530, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5559, + "op": "PUSH2", + "gas": 73527, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5562, + "op": "JUMP", + "gas": 73524, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5461, + "op": "JUMPDEST", + "gas": 73516, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5462, + "op": "PUSH0", + "gas": 73515, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5463, + "op": "PUSH2", + "gas": 73513, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5466, + "op": "PUSH1", + "gas": 73510, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5468, + "op": "DUP4", + "gas": 73507, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5469, + "op": "PUSH2", + "gas": 73504, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5472, + "op": "JUMP", + "gas": 73501, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5411, + "op": "JUMPDEST", + "gas": 73493, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5412, + "op": "PUSH0", + "gas": 73492, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5413, + "op": "DUP2", + "gas": 73490, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5414, + "op": "SWAP1", + "gas": 73487, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5415, + "op": "POP", + "gas": 73484, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5416, + "op": "SWAP3", + "gas": 73482, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5417, + "op": "SWAP2", + "gas": 73479, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5418, + "op": "POP", + "gas": 73476, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5419, + "op": "POP", + "gas": 73474, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5420, + "op": "JUMP", + "gas": 73472, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5473, + "op": "JUMPDEST", + "gas": 73464, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5474, + "op": "SWAP2", + "gas": 73463, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5475, + "op": "POP", + "gas": 73460, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5476, + "op": "PUSH2", + "gas": 73458, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5479, + "op": "DUP3", + "gas": 73455, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5480, + "op": "PUSH2", + "gas": 73452, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5483, + "op": "JUMP", + "gas": 73449, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5421, + "op": "JUMPDEST", + "gas": 73441, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5422, + "op": "PUSH32", + "gas": 73440, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5455, + "op": "PUSH0", + "gas": 73437, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5456, + "op": "DUP3", + "gas": 73435, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5457, + "op": "ADD", + "gas": 73432, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5458, + "op": "MSTORE", + "gas": 73429, + "gasCost": 9, + "depth": 1 + }, + { + "pc": 5459, + "op": "POP", + "gas": 73420, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5460, + "op": "JUMP", + "gas": 73418, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5484, + "op": "JUMPDEST", + "gas": 73410, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5485, + "op": "PUSH1", + "gas": 73409, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5487, + "op": "DUP3", + "gas": 73406, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5488, + "op": "ADD", + "gas": 73403, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5489, + "op": "SWAP1", + "gas": 73400, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5490, + "op": "POP", + "gas": 73397, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5491, + "op": "SWAP2", + "gas": 73395, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5492, + "op": "SWAP1", + "gas": 73392, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5493, + "op": "POP", + "gas": 73389, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5494, + "op": "JUMP", + "gas": 73387, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5563, + "op": "JUMPDEST", + "gas": 73379, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5564, + "op": "SWAP2", + "gas": 73378, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5565, + "op": "POP", + "gas": 73375, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5566, + "op": "PUSH2", + "gas": 73373, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5569, + "op": "DUP3", + "gas": 73370, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5570, + "op": "DUP5", + "gas": 73367, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5571, + "op": "PUSH2", + "gas": 73364, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5574, + "op": "JUMP", + "gas": 73361, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5505, + "op": "JUMPDEST", + "gas": 73353, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5506, + "op": "PUSH0", + "gas": 73352, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5507, + "op": "PUSH2", + "gas": 73350, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5510, + "op": "DUP3", + "gas": 73347, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5511, + "op": "PUSH2", + "gas": 73344, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5514, + "op": "JUMP", + "gas": 73341, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5495, + "op": "JUMPDEST", + "gas": 73333, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5496, + "op": "PUSH0", + "gas": 73332, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5497, + "op": "DUP2", + "gas": 73330, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5498, + "op": "MLOAD", + "gas": 73327, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5499, + "op": "SWAP1", + "gas": 73324, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5500, + "op": "POP", + "gas": 73321, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5501, + "op": "SWAP2", + "gas": 73319, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5502, + "op": "SWAP1", + "gas": 73316, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5503, + "op": "POP", + "gas": 73313, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5504, + "op": "JUMP", + "gas": 73311, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5515, + "op": "JUMPDEST", + "gas": 73303, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5516, + "op": "PUSH2", + "gas": 73302, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5519, + "op": "DUP2", + "gas": 73299, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5520, + "op": "DUP6", + "gas": 73296, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5521, + "op": "PUSH2", + "gas": 73293, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5524, + "op": "JUMP", + "gas": 73290, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5411, + "op": "JUMPDEST", + "gas": 73282, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5412, + "op": "PUSH0", + "gas": 73281, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5413, + "op": "DUP2", + "gas": 73279, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5414, + "op": "SWAP1", + "gas": 73276, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5415, + "op": "POP", + "gas": 73273, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5416, + "op": "SWAP3", + "gas": 73271, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5417, + "op": "SWAP2", + "gas": 73268, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5418, + "op": "POP", + "gas": 73265, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5419, + "op": "POP", + "gas": 73263, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5420, + "op": "JUMP", + "gas": 73261, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5525, + "op": "JUMPDEST", + "gas": 73253, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5526, + "op": "SWAP4", + "gas": 73252, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5527, + "op": "POP", + "gas": 73249, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5528, + "op": "PUSH2", + "gas": 73247, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5531, + "op": "DUP2", + "gas": 73244, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5532, + "op": "DUP6", + "gas": 73241, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5533, + "op": "PUSH1", + "gas": 73238, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5535, + "op": "DUP7", + "gas": 73235, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5536, + "op": "ADD", + "gas": 73232, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5537, + "op": "PUSH2", + "gas": 73229, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5540, + "op": "JUMP", + "gas": 73226, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5135, + "op": "JUMPDEST", + "gas": 73218, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5136, + "op": "DUP3", + "gas": 73217, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5137, + "op": "DUP2", + "gas": 73214, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5138, + "op": "DUP4", + "gas": 73211, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5139, + "op": "opcode 0x5e not defined", + "gas": 73208, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 5140, + "op": "PUSH0", + "gas": 73202, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5141, + "op": "DUP4", + "gas": 73200, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5142, + "op": "DUP4", + "gas": 73197, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5143, + "op": "ADD", + "gas": 73194, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5144, + "op": "MSTORE", + "gas": 73191, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 5145, + "op": "POP", + "gas": 73185, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5146, + "op": "POP", + "gas": 73183, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5147, + "op": "POP", + "gas": 73181, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5148, + "op": "JUMP", + "gas": 73179, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5541, + "op": "JUMPDEST", + "gas": 73171, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5542, + "op": "DUP1", + "gas": 73170, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5543, + "op": "DUP5", + "gas": 73167, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5544, + "op": "ADD", + "gas": 73164, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5545, + "op": "SWAP2", + "gas": 73161, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5546, + "op": "POP", + "gas": 73158, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5547, + "op": "POP", + "gas": 73156, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5548, + "op": "SWAP3", + "gas": 73154, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5549, + "op": "SWAP2", + "gas": 73151, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5550, + "op": "POP", + "gas": 73148, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5551, + "op": "POP", + "gas": 73146, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5552, + "op": "JUMP", + "gas": 73144, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5575, + "op": "JUMPDEST", + "gas": 73136, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5576, + "op": "SWAP2", + "gas": 73135, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5577, + "op": "POP", + "gas": 73132, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5578, + "op": "DUP2", + "gas": 73130, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5579, + "op": "SWAP1", + "gas": 73127, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5580, + "op": "POP", + "gas": 73124, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5581, + "op": "SWAP3", + "gas": 73122, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5582, + "op": "SWAP2", + "gas": 73119, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5583, + "op": "POP", + "gas": 73116, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5584, + "op": "POP", + "gas": 73114, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5585, + "op": "JUMP", + "gas": 73112, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 650, + "op": "JUMPDEST", + "gas": 73104, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 651, + "op": "PUSH1", + "gas": 73103, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 653, + "op": "MLOAD", + "gas": 73100, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 654, + "op": "PUSH1", + "gas": 73097, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 656, + "op": "DUP2", + "gas": 73094, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 657, + "op": "DUP4", + "gas": 73091, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 658, + "op": "SUB", + "gas": 73088, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 659, + "op": "SUB", + "gas": 73085, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 660, + "op": "DUP2", + "gas": 73082, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 661, + "op": "MSTORE", + "gas": 73079, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 662, + "op": "SWAP1", + "gas": 73076, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 663, + "op": "PUSH1", + "gas": 73073, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 665, + "op": "MSTORE", + "gas": 73070, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 666, + "op": "SWAP1", + "gas": 73067, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 667, + "op": "POP", + "gas": 73064, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 668, + "op": "PUSH0", + "gas": 73062, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 669, + "op": "DUP1", + "gas": 73060, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 670, + "op": "PUSH1", + "gas": 73057, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 672, + "op": "PUSH20", + "gas": 73054, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 693, + "op": "AND", + "gas": 73051, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 694, + "op": "DUP6", + "gas": 73048, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 695, + "op": "PUSH1", + "gas": 73045, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 697, + "op": "MLOAD", + "gas": 73042, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 698, + "op": "PUSH2", + "gas": 73039, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 701, + "op": "SWAP2", + "gas": 73036, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 702, + "op": "SWAP1", + "gas": 73033, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 703, + "op": "PUSH2", + "gas": 73030, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 706, + "op": "JUMP", + "gas": 73027, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5644, + "op": "JUMPDEST", + "gas": 73019, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5645, + "op": "PUSH0", + "gas": 73018, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5646, + "op": "PUSH2", + "gas": 73016, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5649, + "op": "DUP3", + "gas": 73013, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5650, + "op": "DUP5", + "gas": 73010, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5651, + "op": "PUSH2", + "gas": 73007, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5654, + "op": "JUMP", + "gas": 73004, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5596, + "op": "JUMPDEST", + "gas": 72996, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5597, + "op": "PUSH0", + "gas": 72995, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5598, + "op": "PUSH2", + "gas": 72993, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5601, + "op": "DUP3", + "gas": 72990, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5602, + "op": "PUSH2", + "gas": 72987, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5605, + "op": "JUMP", + "gas": 72984, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5109, + "op": "JUMPDEST", + "gas": 72976, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5110, + "op": "PUSH0", + "gas": 72975, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5111, + "op": "DUP2", + "gas": 72973, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5112, + "op": "MLOAD", + "gas": 72970, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5113, + "op": "SWAP1", + "gas": 72967, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5114, + "op": "POP", + "gas": 72964, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5115, + "op": "SWAP2", + "gas": 72962, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5116, + "op": "SWAP1", + "gas": 72959, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5117, + "op": "POP", + "gas": 72956, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5118, + "op": "JUMP", + "gas": 72954, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5606, + "op": "JUMPDEST", + "gas": 72946, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5607, + "op": "PUSH2", + "gas": 72945, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5610, + "op": "DUP2", + "gas": 72942, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5611, + "op": "DUP6", + "gas": 72939, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5612, + "op": "PUSH2", + "gas": 72936, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5615, + "op": "JUMP", + "gas": 72933, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5586, + "op": "JUMPDEST", + "gas": 72925, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5587, + "op": "PUSH0", + "gas": 72924, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5588, + "op": "DUP2", + "gas": 72922, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5589, + "op": "SWAP1", + "gas": 72919, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5590, + "op": "POP", + "gas": 72916, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5591, + "op": "SWAP3", + "gas": 72914, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5592, + "op": "SWAP2", + "gas": 72911, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5593, + "op": "POP", + "gas": 72908, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5594, + "op": "POP", + "gas": 72906, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5595, + "op": "JUMP", + "gas": 72904, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5616, + "op": "JUMPDEST", + "gas": 72896, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5617, + "op": "SWAP4", + "gas": 72895, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5618, + "op": "POP", + "gas": 72892, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5619, + "op": "PUSH2", + "gas": 72890, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5622, + "op": "DUP2", + "gas": 72887, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5623, + "op": "DUP6", + "gas": 72884, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5624, + "op": "PUSH1", + "gas": 72881, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5626, + "op": "DUP7", + "gas": 72878, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5627, + "op": "ADD", + "gas": 72875, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5628, + "op": "PUSH2", + "gas": 72872, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5631, + "op": "JUMP", + "gas": 72869, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5135, + "op": "JUMPDEST", + "gas": 72861, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5136, + "op": "DUP3", + "gas": 72860, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5137, + "op": "DUP2", + "gas": 72857, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5138, + "op": "DUP4", + "gas": 72854, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5139, + "op": "opcode 0x5e not defined", + "gas": 72851, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 5140, + "op": "PUSH0", + "gas": 72845, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5141, + "op": "DUP4", + "gas": 72843, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5142, + "op": "DUP4", + "gas": 72840, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5143, + "op": "ADD", + "gas": 72837, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5144, + "op": "MSTORE", + "gas": 72834, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5145, + "op": "POP", + "gas": 72831, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5146, + "op": "POP", + "gas": 72829, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5147, + "op": "POP", + "gas": 72827, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5148, + "op": "JUMP", + "gas": 72825, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5632, + "op": "JUMPDEST", + "gas": 72817, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5633, + "op": "DUP1", + "gas": 72816, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5634, + "op": "DUP5", + "gas": 72813, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5635, + "op": "ADD", + "gas": 72810, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5636, + "op": "SWAP2", + "gas": 72807, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5637, + "op": "POP", + "gas": 72804, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5638, + "op": "POP", + "gas": 72802, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5639, + "op": "SWAP3", + "gas": 72800, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5640, + "op": "SWAP2", + "gas": 72797, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5641, + "op": "POP", + "gas": 72794, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5642, + "op": "POP", + "gas": 72792, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5643, + "op": "JUMP", + "gas": 72790, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5655, + "op": "JUMPDEST", + "gas": 72782, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5656, + "op": "SWAP2", + "gas": 72781, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5657, + "op": "POP", + "gas": 72778, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5658, + "op": "DUP2", + "gas": 72776, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5659, + "op": "SWAP1", + "gas": 72773, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5660, + "op": "POP", + "gas": 72770, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5661, + "op": "SWAP3", + "gas": 72768, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5662, + "op": "SWAP2", + "gas": 72765, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5663, + "op": "POP", + "gas": 72762, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5664, + "op": "POP", + "gas": 72760, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5665, + "op": "JUMP", + "gas": 72758, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 707, + "op": "JUMPDEST", + "gas": 72750, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 708, + "op": "PUSH0", + "gas": 72749, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 709, + "op": "PUSH1", + "gas": 72747, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 711, + "op": "MLOAD", + "gas": 72744, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 712, + "op": "DUP1", + "gas": 72741, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 713, + "op": "DUP4", + "gas": 72738, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 714, + "op": "SUB", + "gas": 72735, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 715, + "op": "DUP2", + "gas": 72732, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 716, + "op": "DUP6", + "gas": 72729, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 717, + "op": "GAS", + "gas": 72726, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 718, + "op": "STATICCALL", + "gas": 72724, + "gasCost": 71590, + "depth": 1 + }, + { + "pc": 719, + "op": "SWAP2", + "gas": 71904, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 720, + "op": "POP", + "gas": 71901, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 721, + "op": "POP", + "gas": 71899, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 722, + "op": "RETURNDATASIZE", + "gas": 71897, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 723, + "op": "DUP1", + "gas": 71895, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 724, + "op": "PUSH0", + "gas": 71892, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 725, + "op": "DUP2", + "gas": 71890, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 726, + "op": "EQ", + "gas": 71887, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 727, + "op": "PUSH2", + "gas": 71884, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 730, + "op": "JUMPI", + "gas": 71881, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 731, + "op": "PUSH1", + "gas": 71871, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 733, + "op": "MLOAD", + "gas": 71868, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 734, + "op": "SWAP2", + "gas": 71865, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 735, + "op": "POP", + "gas": 71862, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 736, + "op": "PUSH1", + "gas": 71860, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 738, + "op": "NOT", + "gas": 71857, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 739, + "op": "PUSH1", + "gas": 71854, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 741, + "op": "RETURNDATASIZE", + "gas": 71851, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 742, + "op": "ADD", + "gas": 71849, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 743, + "op": "AND", + "gas": 71846, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 744, + "op": "DUP3", + "gas": 71843, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 745, + "op": "ADD", + "gas": 71840, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 746, + "op": "PUSH1", + "gas": 71837, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 748, + "op": "MSTORE", + "gas": 71834, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 749, + "op": "RETURNDATASIZE", + "gas": 71831, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 750, + "op": "DUP3", + "gas": 71829, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 751, + "op": "MSTORE", + "gas": 71826, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 752, + "op": "RETURNDATASIZE", + "gas": 71823, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 753, + "op": "PUSH0", + "gas": 71821, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 754, + "op": "PUSH1", + "gas": 71819, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 756, + "op": "DUP5", + "gas": 71816, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 757, + "op": "ADD", + "gas": 71813, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 758, + "op": "RETURNDATACOPY", + "gas": 71810, + "gasCost": 9, + "depth": 1 + }, + { + "pc": 759, + "op": "PUSH2", + "gas": 71801, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 762, + "op": "JUMP", + "gas": 71798, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 768, + "op": "JUMPDEST", + "gas": 71790, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 769, + "op": "POP", + "gas": 71789, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 770, + "op": "SWAP2", + "gas": 71787, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 771, + "op": "POP", + "gas": 71784, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 772, + "op": "SWAP2", + "gas": 71782, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 773, + "op": "POP", + "gas": 71779, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 774, + "op": "DUP2", + "gas": 71777, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 775, + "op": "PUSH0", + "gas": 71774, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 776, + "op": "DUP5", + "gas": 71772, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 777, + "op": "PUSH1", + "gas": 71769, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 779, + "op": "MLOAD", + "gas": 71766, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 780, + "op": "PUSH2", + "gas": 71763, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 783, + "op": "SWAP2", + "gas": 71760, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 784, + "op": "SWAP1", + "gas": 71757, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 785, + "op": "PUSH2", + "gas": 71754, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 788, + "op": "JUMP", + "gas": 71751, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5666, + "op": "JUMPDEST", + "gas": 71743, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5667, + "op": "PUSH0", + "gas": 71742, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5668, + "op": "PUSH2", + "gas": 71740, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5671, + "op": "DUP3", + "gas": 71737, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5672, + "op": "DUP5", + "gas": 71734, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5673, + "op": "PUSH2", + "gas": 71731, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5676, + "op": "JUMP", + "gas": 71728, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5505, + "op": "JUMPDEST", + "gas": 71720, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5506, + "op": "PUSH0", + "gas": 71719, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5507, + "op": "PUSH2", + "gas": 71717, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5510, + "op": "DUP3", + "gas": 71714, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5511, + "op": "PUSH2", + "gas": 71711, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5514, + "op": "JUMP", + "gas": 71708, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5495, + "op": "JUMPDEST", + "gas": 71700, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5496, + "op": "PUSH0", + "gas": 71699, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5497, + "op": "DUP2", + "gas": 71697, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5498, + "op": "MLOAD", + "gas": 71694, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5499, + "op": "SWAP1", + "gas": 71691, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5500, + "op": "POP", + "gas": 71688, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5501, + "op": "SWAP2", + "gas": 71686, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5502, + "op": "SWAP1", + "gas": 71683, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5503, + "op": "POP", + "gas": 71680, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5504, + "op": "JUMP", + "gas": 71678, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5515, + "op": "JUMPDEST", + "gas": 71670, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5516, + "op": "PUSH2", + "gas": 71669, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5519, + "op": "DUP2", + "gas": 71666, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5520, + "op": "DUP6", + "gas": 71663, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5521, + "op": "PUSH2", + "gas": 71660, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5524, + "op": "JUMP", + "gas": 71657, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5411, + "op": "JUMPDEST", + "gas": 71649, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5412, + "op": "PUSH0", + "gas": 71648, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5413, + "op": "DUP2", + "gas": 71646, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5414, + "op": "SWAP1", + "gas": 71643, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5415, + "op": "POP", + "gas": 71640, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5416, + "op": "SWAP3", + "gas": 71638, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5417, + "op": "SWAP2", + "gas": 71635, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5418, + "op": "POP", + "gas": 71632, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5419, + "op": "POP", + "gas": 71630, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5420, + "op": "JUMP", + "gas": 71628, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5525, + "op": "JUMPDEST", + "gas": 71620, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5526, + "op": "SWAP4", + "gas": 71619, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5527, + "op": "POP", + "gas": 71616, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5528, + "op": "PUSH2", + "gas": 71614, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5531, + "op": "DUP2", + "gas": 71611, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5532, + "op": "DUP6", + "gas": 71608, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5533, + "op": "PUSH1", + "gas": 71605, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5535, + "op": "DUP7", + "gas": 71602, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5536, + "op": "ADD", + "gas": 71599, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5537, + "op": "PUSH2", + "gas": 71596, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5540, + "op": "JUMP", + "gas": 71593, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5135, + "op": "JUMPDEST", + "gas": 71585, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5136, + "op": "DUP3", + "gas": 71584, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5137, + "op": "DUP2", + "gas": 71581, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5138, + "op": "DUP4", + "gas": 71578, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5139, + "op": "opcode 0x5e not defined", + "gas": 71575, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 5140, + "op": "PUSH0", + "gas": 71569, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5141, + "op": "DUP4", + "gas": 71567, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5142, + "op": "DUP4", + "gas": 71564, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5143, + "op": "ADD", + "gas": 71561, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5144, + "op": "MSTORE", + "gas": 71558, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 5145, + "op": "POP", + "gas": 71552, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5146, + "op": "POP", + "gas": 71550, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5147, + "op": "POP", + "gas": 71548, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5148, + "op": "JUMP", + "gas": 71546, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5541, + "op": "JUMPDEST", + "gas": 71538, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5542, + "op": "DUP1", + "gas": 71537, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5543, + "op": "DUP5", + "gas": 71534, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5544, + "op": "ADD", + "gas": 71531, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5545, + "op": "SWAP2", + "gas": 71528, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5546, + "op": "POP", + "gas": 71525, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5547, + "op": "POP", + "gas": 71523, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5548, + "op": "SWAP3", + "gas": 71521, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5549, + "op": "SWAP2", + "gas": 71518, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5550, + "op": "POP", + "gas": 71515, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5551, + "op": "POP", + "gas": 71513, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5552, + "op": "JUMP", + "gas": 71511, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5677, + "op": "JUMPDEST", + "gas": 71503, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5678, + "op": "SWAP2", + "gas": 71502, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5679, + "op": "POP", + "gas": 71499, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5680, + "op": "DUP2", + "gas": 71497, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5681, + "op": "SWAP1", + "gas": 71494, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5682, + "op": "POP", + "gas": 71491, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5683, + "op": "SWAP3", + "gas": 71489, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5684, + "op": "SWAP2", + "gas": 71486, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5685, + "op": "POP", + "gas": 71483, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5686, + "op": "POP", + "gas": 71481, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5687, + "op": "JUMP", + "gas": 71479, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 789, + "op": "JUMPDEST", + "gas": 71471, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 790, + "op": "SWAP1", + "gas": 71470, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 791, + "op": "DUP2", + "gas": 71467, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 792, + "op": "MSTORE", + "gas": 71464, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 793, + "op": "PUSH1", + "gas": 71461, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 795, + "op": "ADD", + "gas": 71458, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 796, + "op": "PUSH1", + "gas": 71455, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 798, + "op": "MLOAD", + "gas": 71452, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 799, + "op": "DUP1", + "gas": 71449, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 800, + "op": "SWAP2", + "gas": 71446, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 801, + "op": "SUB", + "gas": 71443, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 802, + "op": "SWAP1", + "gas": 71440, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 803, + "op": "SHA3", + "gas": 71437, + "gasCost": 42, + "depth": 1 + }, + { + "pc": 804, + "op": "PUSH0", + "gas": 71395, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 805, + "op": "PUSH2", + "gas": 71393, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 808, + "op": "EXP", + "gas": 71390, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 809, + "op": "DUP2", + "gas": 71380, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 810, + "op": "SLOAD", + "gas": 71377, + "gasCost": 2100, + "depth": 1 + }, + { + "pc": 811, + "op": "DUP2", + "gas": 69277, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 812, + "op": "PUSH1", + "gas": 69274, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 814, + "op": "MUL", + "gas": 69271, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 815, + "op": "NOT", + "gas": 69266, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 816, + "op": "AND", + "gas": 69263, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 817, + "op": "SWAP1", + "gas": 69260, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 818, + "op": "DUP4", + "gas": 69257, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 819, + "op": "ISZERO", + "gas": 69254, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 820, + "op": "ISZERO", + "gas": 69251, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 821, + "op": "MUL", + "gas": 69248, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 822, + "op": "OR", + "gas": 69243, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 823, + "op": "SWAP1", + "gas": 69240, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 824, + "op": "SSTORE", + "gas": 69237, + "gasCost": 20000, + "depth": 1 + }, + { + "pc": 825, + "op": "POP", + "gas": 49237, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 826, + "op": "DUP1", + "gas": 49235, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 827, + "op": "PUSH1", + "gas": 49232, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 829, + "op": "DUP5", + "gas": 49229, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 830, + "op": "PUSH1", + "gas": 49226, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 832, + "op": "MLOAD", + "gas": 49223, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 833, + "op": "PUSH2", + "gas": 49220, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 836, + "op": "SWAP2", + "gas": 49217, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 837, + "op": "SWAP1", + "gas": 49214, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 838, + "op": "PUSH2", + "gas": 49211, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 841, + "op": "JUMP", + "gas": 49208, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5666, + "op": "JUMPDEST", + "gas": 49200, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5667, + "op": "PUSH0", + "gas": 49199, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5668, + "op": "PUSH2", + "gas": 49197, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5671, + "op": "DUP3", + "gas": 49194, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5672, + "op": "DUP5", + "gas": 49191, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5673, + "op": "PUSH2", + "gas": 49188, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5676, + "op": "JUMP", + "gas": 49185, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5505, + "op": "JUMPDEST", + "gas": 49177, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5506, + "op": "PUSH0", + "gas": 49176, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5507, + "op": "PUSH2", + "gas": 49174, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5510, + "op": "DUP3", + "gas": 49171, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5511, + "op": "PUSH2", + "gas": 49168, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5514, + "op": "JUMP", + "gas": 49165, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5495, + "op": "JUMPDEST", + "gas": 49157, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5496, + "op": "PUSH0", + "gas": 49156, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5497, + "op": "DUP2", + "gas": 49154, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5498, + "op": "MLOAD", + "gas": 49151, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5499, + "op": "SWAP1", + "gas": 49148, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5500, + "op": "POP", + "gas": 49145, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5501, + "op": "SWAP2", + "gas": 49143, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5502, + "op": "SWAP1", + "gas": 49140, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5503, + "op": "POP", + "gas": 49137, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5504, + "op": "JUMP", + "gas": 49135, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5515, + "op": "JUMPDEST", + "gas": 49127, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5516, + "op": "PUSH2", + "gas": 49126, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5519, + "op": "DUP2", + "gas": 49123, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5520, + "op": "DUP6", + "gas": 49120, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5521, + "op": "PUSH2", + "gas": 49117, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5524, + "op": "JUMP", + "gas": 49114, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5411, + "op": "JUMPDEST", + "gas": 49106, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5412, + "op": "PUSH0", + "gas": 49105, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5413, + "op": "DUP2", + "gas": 49103, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5414, + "op": "SWAP1", + "gas": 49100, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5415, + "op": "POP", + "gas": 49097, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5416, + "op": "SWAP3", + "gas": 49095, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5417, + "op": "SWAP2", + "gas": 49092, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5418, + "op": "POP", + "gas": 49089, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5419, + "op": "POP", + "gas": 49087, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5420, + "op": "JUMP", + "gas": 49085, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5525, + "op": "JUMPDEST", + "gas": 49077, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5526, + "op": "SWAP4", + "gas": 49076, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5527, + "op": "POP", + "gas": 49073, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5528, + "op": "PUSH2", + "gas": 49071, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5531, + "op": "DUP2", + "gas": 49068, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5532, + "op": "DUP6", + "gas": 49065, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5533, + "op": "PUSH1", + "gas": 49062, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5535, + "op": "DUP7", + "gas": 49059, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5536, + "op": "ADD", + "gas": 49056, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5537, + "op": "PUSH2", + "gas": 49053, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5540, + "op": "JUMP", + "gas": 49050, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5135, + "op": "JUMPDEST", + "gas": 49042, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5136, + "op": "DUP3", + "gas": 49041, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5137, + "op": "DUP2", + "gas": 49038, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5138, + "op": "DUP4", + "gas": 49035, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5139, + "op": "opcode 0x5e not defined", + "gas": 49032, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 5140, + "op": "PUSH0", + "gas": 49026, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5141, + "op": "DUP4", + "gas": 49024, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5142, + "op": "DUP4", + "gas": 49021, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5143, + "op": "ADD", + "gas": 49018, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5144, + "op": "MSTORE", + "gas": 49015, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5145, + "op": "POP", + "gas": 49012, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5146, + "op": "POP", + "gas": 49010, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5147, + "op": "POP", + "gas": 49008, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5148, + "op": "JUMP", + "gas": 49006, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5541, + "op": "JUMPDEST", + "gas": 48998, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5542, + "op": "DUP1", + "gas": 48997, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5543, + "op": "DUP5", + "gas": 48994, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5544, + "op": "ADD", + "gas": 48991, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5545, + "op": "SWAP2", + "gas": 48988, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5546, + "op": "POP", + "gas": 48985, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5547, + "op": "POP", + "gas": 48983, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5548, + "op": "SWAP3", + "gas": 48981, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5549, + "op": "SWAP2", + "gas": 48978, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5550, + "op": "POP", + "gas": 48975, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5551, + "op": "POP", + "gas": 48973, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5552, + "op": "JUMP", + "gas": 48971, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5677, + "op": "JUMPDEST", + "gas": 48963, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5678, + "op": "SWAP2", + "gas": 48962, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5679, + "op": "POP", + "gas": 48959, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5680, + "op": "DUP2", + "gas": 48957, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5681, + "op": "SWAP1", + "gas": 48954, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5682, + "op": "POP", + "gas": 48951, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5683, + "op": "SWAP3", + "gas": 48949, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5684, + "op": "SWAP2", + "gas": 48946, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5685, + "op": "POP", + "gas": 48943, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5686, + "op": "POP", + "gas": 48941, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5687, + "op": "JUMP", + "gas": 48939, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 842, + "op": "JUMPDEST", + "gas": 48931, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 843, + "op": "SWAP1", + "gas": 48930, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 844, + "op": "DUP2", + "gas": 48927, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 845, + "op": "MSTORE", + "gas": 48924, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 846, + "op": "PUSH1", + "gas": 48921, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 848, + "op": "ADD", + "gas": 48918, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 849, + "op": "PUSH1", + "gas": 48915, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 851, + "op": "MLOAD", + "gas": 48912, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 852, + "op": "DUP1", + "gas": 48909, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 853, + "op": "SWAP2", + "gas": 48906, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 854, + "op": "SUB", + "gas": 48903, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 855, + "op": "SWAP1", + "gas": 48900, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 856, + "op": "SHA3", + "gas": 48897, + "gasCost": 42, + "depth": 1 + }, + { + "pc": 857, + "op": "SWAP1", + "gas": 48855, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 858, + "op": "DUP2", + "gas": 48852, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 859, + "op": "PUSH2", + "gas": 48849, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 862, + "op": "SWAP2", + "gas": 48846, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 863, + "op": "SWAP1", + "gas": 48843, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 864, + "op": "PUSH2", + "gas": 48840, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 867, + "op": "JUMP", + "gas": 48837, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6194, + "op": "JUMPDEST", + "gas": 48829, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6195, + "op": "PUSH2", + "gas": 48828, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6198, + "op": "DUP3", + "gas": 48825, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6199, + "op": "PUSH2", + "gas": 48822, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6202, + "op": "JUMP", + "gas": 48819, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5109, + "op": "JUMPDEST", + "gas": 48811, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5110, + "op": "PUSH0", + "gas": 48810, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5111, + "op": "DUP2", + "gas": 48808, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5112, + "op": "MLOAD", + "gas": 48805, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5113, + "op": "SWAP1", + "gas": 48802, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5114, + "op": "POP", + "gas": 48799, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5115, + "op": "SWAP2", + "gas": 48797, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5116, + "op": "SWAP1", + "gas": 48794, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5117, + "op": "POP", + "gas": 48791, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5118, + "op": "JUMP", + "gas": 48789, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6203, + "op": "JUMPDEST", + "gas": 48781, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6204, + "op": "PUSH8", + "gas": 48780, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6213, + "op": "DUP2", + "gas": 48777, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6214, + "op": "GT", + "gas": 48774, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6215, + "op": "ISZERO", + "gas": 48771, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6216, + "op": "PUSH2", + "gas": 48768, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6219, + "op": "JUMPI", + "gas": 48765, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6228, + "op": "JUMPDEST", + "gas": 48755, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6229, + "op": "PUSH2", + "gas": 48754, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6232, + "op": "DUP3", + "gas": 48751, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6233, + "op": "SLOAD", + "gas": 48748, + "gasCost": 2100, + "depth": 1 + }, + { + "pc": 6234, + "op": "PUSH2", + "gas": 46648, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6237, + "op": "JUMP", + "gas": 46645, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5733, + "op": "JUMPDEST", + "gas": 46637, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5734, + "op": "PUSH0", + "gas": 46636, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5735, + "op": "PUSH1", + "gas": 46634, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5737, + "op": "DUP3", + "gas": 46631, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5738, + "op": "DIV", + "gas": 46628, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 5739, + "op": "SWAP1", + "gas": 46623, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5740, + "op": "POP", + "gas": 46620, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5741, + "op": "PUSH1", + "gas": 46618, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5743, + "op": "DUP3", + "gas": 46615, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5744, + "op": "AND", + "gas": 46612, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5745, + "op": "DUP1", + "gas": 46609, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5746, + "op": "PUSH2", + "gas": 46606, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5749, + "op": "JUMPI", + "gas": 46603, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 5750, + "op": "PUSH1", + "gas": 46593, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5752, + "op": "DUP3", + "gas": 46590, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5753, + "op": "AND", + "gas": 46587, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5754, + "op": "SWAP2", + "gas": 46584, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5755, + "op": "POP", + "gas": 46581, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5756, + "op": "JUMPDEST", + "gas": 46579, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5757, + "op": "PUSH1", + "gas": 46578, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5759, + "op": "DUP3", + "gas": 46575, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5760, + "op": "LT", + "gas": 46572, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5761, + "op": "DUP2", + "gas": 46569, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5762, + "op": "SUB", + "gas": 46566, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5763, + "op": "PUSH2", + "gas": 46563, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5766, + "op": "JUMPI", + "gas": 46560, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 5775, + "op": "JUMPDEST", + "gas": 46550, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5776, + "op": "POP", + "gas": 46549, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5777, + "op": "SWAP2", + "gas": 46547, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5778, + "op": "SWAP1", + "gas": 46544, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5779, + "op": "POP", + "gas": 46541, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5780, + "op": "JUMP", + "gas": 46539, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6238, + "op": "JUMPDEST", + "gas": 46531, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6239, + "op": "PUSH2", + "gas": 46530, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6242, + "op": "DUP3", + "gas": 46527, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6243, + "op": "DUP3", + "gas": 46524, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6244, + "op": "DUP6", + "gas": 46521, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6245, + "op": "PUSH2", + "gas": 46518, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6248, + "op": "JUMP", + "gas": 46515, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6057, + "op": "JUMPDEST", + "gas": 46507, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6058, + "op": "PUSH1", + "gas": 46506, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6060, + "op": "DUP3", + "gas": 46503, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6061, + "op": "GT", + "gas": 46500, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6062, + "op": "ISZERO", + "gas": 46497, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6063, + "op": "PUSH2", + "gas": 46494, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6066, + "op": "JUMPI", + "gas": 46491, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6122, + "op": "JUMPDEST", + "gas": 46481, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6123, + "op": "POP", + "gas": 46480, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6124, + "op": "POP", + "gas": 46478, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6125, + "op": "POP", + "gas": 46476, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6126, + "op": "JUMP", + "gas": 46474, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6249, + "op": "JUMPDEST", + "gas": 46466, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6250, + "op": "PUSH0", + "gas": 46465, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6251, + "op": "PUSH1", + "gas": 46463, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6253, + "op": "SWAP1", + "gas": 46460, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6254, + "op": "POP", + "gas": 46457, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6255, + "op": "PUSH1", + "gas": 46455, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6257, + "op": "DUP4", + "gas": 46452, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6258, + "op": "GT", + "gas": 46449, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6259, + "op": "PUSH1", + "gas": 46446, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6261, + "op": "DUP2", + "gas": 46443, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6262, + "op": "EQ", + "gas": 46440, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6263, + "op": "PUSH2", + "gas": 46437, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6266, + "op": "JUMPI", + "gas": 46434, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6298, + "op": "JUMPDEST", + "gas": 46424, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6299, + "op": "PUSH1", + "gas": 46423, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6301, + "op": "NOT", + "gas": 46420, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6302, + "op": "DUP5", + "gas": 46417, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6303, + "op": "AND", + "gas": 46414, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6304, + "op": "PUSH2", + "gas": 46411, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6307, + "op": "DUP7", + "gas": 46408, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6308, + "op": "PUSH2", + "gas": 46405, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6311, + "op": "JUMP", + "gas": 46402, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5781, + "op": "JUMPDEST", + "gas": 46394, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5782, + "op": "PUSH0", + "gas": 46393, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5783, + "op": "DUP2", + "gas": 46391, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5784, + "op": "SWAP1", + "gas": 46388, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5785, + "op": "POP", + "gas": 46385, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5786, + "op": "DUP2", + "gas": 46383, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5787, + "op": "PUSH0", + "gas": 46380, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5788, + "op": "MSTORE", + "gas": 46378, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5789, + "op": "PUSH1", + "gas": 46375, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5791, + "op": "PUSH0", + "gas": 46372, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5792, + "op": "SHA3", + "gas": 46370, + "gasCost": 36, + "depth": 1 + }, + { + "pc": 5793, + "op": "SWAP1", + "gas": 46334, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5794, + "op": "POP", + "gas": 46331, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5795, + "op": "SWAP2", + "gas": 46329, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5796, + "op": "SWAP1", + "gas": 46326, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5797, + "op": "POP", + "gas": 46323, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5798, + "op": "JUMP", + "gas": 46321, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6312, + "op": "JUMPDEST", + "gas": 46313, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6313, + "op": "PUSH0", + "gas": 46312, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6314, + "op": "JUMPDEST", + "gas": 46310, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6315, + "op": "DUP3", + "gas": 46309, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6316, + "op": "DUP2", + "gas": 46306, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6317, + "op": "LT", + "gas": 46303, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6318, + "op": "ISZERO", + "gas": 46300, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6319, + "op": "PUSH2", + "gas": 46297, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6322, + "op": "JUMPI", + "gas": 46294, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6323, + "op": "DUP5", + "gas": 46284, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6324, + "op": "DUP10", + "gas": 46281, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6325, + "op": "ADD", + "gas": 46278, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6326, + "op": "MLOAD", + "gas": 46275, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6327, + "op": "DUP3", + "gas": 46272, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6328, + "op": "SSTORE", + "gas": 46269, + "gasCost": 22100, + "depth": 1 + }, + { + "pc": 6329, + "op": "PUSH1", + "gas": 24169, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6331, + "op": "DUP3", + "gas": 24166, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6332, + "op": "ADD", + "gas": 24163, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6333, + "op": "SWAP2", + "gas": 24160, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6334, + "op": "POP", + "gas": 24157, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6335, + "op": "PUSH1", + "gas": 24155, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6337, + "op": "DUP6", + "gas": 24152, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6338, + "op": "ADD", + "gas": 24149, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6339, + "op": "SWAP5", + "gas": 24146, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6340, + "op": "POP", + "gas": 24143, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6341, + "op": "PUSH1", + "gas": 24141, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6343, + "op": "DUP2", + "gas": 24138, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6344, + "op": "ADD", + "gas": 24135, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6345, + "op": "SWAP1", + "gas": 24132, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6346, + "op": "POP", + "gas": 24129, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6347, + "op": "PUSH2", + "gas": 24127, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6350, + "op": "JUMP", + "gas": 24124, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6314, + "op": "JUMPDEST", + "gas": 24116, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6315, + "op": "DUP3", + "gas": 24115, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6316, + "op": "DUP2", + "gas": 24112, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6317, + "op": "LT", + "gas": 24109, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6318, + "op": "ISZERO", + "gas": 24106, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6319, + "op": "PUSH2", + "gas": 24103, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6322, + "op": "JUMPI", + "gas": 24100, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6351, + "op": "JUMPDEST", + "gas": 24090, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6352, + "op": "DUP7", + "gas": 24089, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6353, + "op": "DUP4", + "gas": 24086, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6354, + "op": "LT", + "gas": 24083, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6355, + "op": "ISZERO", + "gas": 24080, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6356, + "op": "PUSH2", + "gas": 24077, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6359, + "op": "JUMPI", + "gas": 24074, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6380, + "op": "JUMPDEST", + "gas": 24064, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6381, + "op": "PUSH1", + "gas": 24063, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6383, + "op": "PUSH1", + "gas": 24060, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6385, + "op": "DUP9", + "gas": 24057, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6386, + "op": "MUL", + "gas": 24054, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 6387, + "op": "ADD", + "gas": 24049, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6388, + "op": "DUP9", + "gas": 24046, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6389, + "op": "SSTORE", + "gas": 24043, + "gasCost": 20000, + "depth": 1 + }, + { + "pc": 6390, + "op": "POP", + "gas": 4043, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6391, + "op": "POP", + "gas": 4041, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6392, + "op": "POP", + "gas": 4039, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6393, + "op": "JUMPDEST", + "gas": 4037, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6394, + "op": "POP", + "gas": 4036, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6395, + "op": "POP", + "gas": 4034, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6396, + "op": "POP", + "gas": 4032, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6397, + "op": "POP", + "gas": 4030, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6398, + "op": "POP", + "gas": 4028, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6399, + "op": "POP", + "gas": 4026, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6400, + "op": "JUMP", + "gas": 4024, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 868, + "op": "JUMPDEST", + "gas": 4016, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 869, + "op": "POP", + "gas": 4015, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 870, + "op": "PUSH32", + "gas": 4013, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 903, + "op": "DUP4", + "gas": 4010, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 904, + "op": "DUP4", + "gas": 4007, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 905, + "op": "DUP4", + "gas": 4004, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 906, + "op": "TIMESTAMP", + "gas": 4001, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 907, + "op": "PUSH1", + "gas": 3999, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 909, + "op": "MLOAD", + "gas": 3996, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 910, + "op": "PUSH2", + "gas": 3993, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 913, + "op": "SWAP5", + "gas": 3990, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 914, + "op": "SWAP4", + "gas": 3987, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 915, + "op": "SWAP3", + "gas": 3984, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 916, + "op": "SWAP2", + "gas": 3981, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 917, + "op": "SWAP1", + "gas": 3978, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 918, + "op": "PUSH2", + "gas": 3975, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 921, + "op": "JUMP", + "gas": 3972, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6488, + "op": "JUMPDEST", + "gas": 3964, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6489, + "op": "PUSH0", + "gas": 3963, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6490, + "op": "PUSH1", + "gas": 3961, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6492, + "op": "DUP3", + "gas": 3958, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6493, + "op": "ADD", + "gas": 3955, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6494, + "op": "SWAP1", + "gas": 3952, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6495, + "op": "POP", + "gas": 3949, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6496, + "op": "DUP2", + "gas": 3947, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6497, + "op": "DUP2", + "gas": 3944, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6498, + "op": "SUB", + "gas": 3941, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6499, + "op": "PUSH0", + "gas": 3938, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6500, + "op": "DUP4", + "gas": 3936, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6501, + "op": "ADD", + "gas": 3933, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6502, + "op": "MSTORE", + "gas": 3930, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6503, + "op": "PUSH2", + "gas": 3927, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6506, + "op": "DUP2", + "gas": 3924, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6507, + "op": "DUP8", + "gas": 3921, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6508, + "op": "PUSH2", + "gas": 3918, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6511, + "op": "JUMP", + "gas": 3915, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6417, + "op": "JUMPDEST", + "gas": 3907, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6418, + "op": "PUSH0", + "gas": 3906, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6419, + "op": "PUSH2", + "gas": 3904, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6422, + "op": "DUP3", + "gas": 3901, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6423, + "op": "PUSH2", + "gas": 3898, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6426, + "op": "JUMP", + "gas": 3895, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5495, + "op": "JUMPDEST", + "gas": 3887, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5496, + "op": "PUSH0", + "gas": 3886, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5497, + "op": "DUP2", + "gas": 3884, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5498, + "op": "MLOAD", + "gas": 3881, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5499, + "op": "SWAP1", + "gas": 3878, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5500, + "op": "POP", + "gas": 3875, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5501, + "op": "SWAP2", + "gas": 3873, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5502, + "op": "SWAP1", + "gas": 3870, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5503, + "op": "POP", + "gas": 3867, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5504, + "op": "JUMP", + "gas": 3865, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6427, + "op": "JUMPDEST", + "gas": 3857, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6428, + "op": "PUSH2", + "gas": 3856, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6431, + "op": "DUP2", + "gas": 3853, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6432, + "op": "DUP6", + "gas": 3850, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6433, + "op": "PUSH2", + "gas": 3847, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6436, + "op": "JUMP", + "gas": 3844, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6401, + "op": "JUMPDEST", + "gas": 3836, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6402, + "op": "PUSH0", + "gas": 3835, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6403, + "op": "DUP3", + "gas": 3833, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6404, + "op": "DUP3", + "gas": 3830, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6405, + "op": "MSTORE", + "gas": 3827, + "gasCost": 15, + "depth": 1 + }, + { + "pc": 6406, + "op": "PUSH1", + "gas": 3812, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6408, + "op": "DUP3", + "gas": 3809, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6409, + "op": "ADD", + "gas": 3806, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6410, + "op": "SWAP1", + "gas": 3803, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6411, + "op": "POP", + "gas": 3800, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6412, + "op": "SWAP3", + "gas": 3798, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6413, + "op": "SWAP2", + "gas": 3795, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6414, + "op": "POP", + "gas": 3792, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6415, + "op": "POP", + "gas": 3790, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6416, + "op": "JUMP", + "gas": 3788, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6437, + "op": "JUMPDEST", + "gas": 3780, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6438, + "op": "SWAP4", + "gas": 3779, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6439, + "op": "POP", + "gas": 3776, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6440, + "op": "PUSH2", + "gas": 3774, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6443, + "op": "DUP2", + "gas": 3771, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6444, + "op": "DUP6", + "gas": 3768, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6445, + "op": "PUSH1", + "gas": 3765, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6447, + "op": "DUP7", + "gas": 3762, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6448, + "op": "ADD", + "gas": 3759, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6449, + "op": "PUSH2", + "gas": 3756, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6452, + "op": "JUMP", + "gas": 3753, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5135, + "op": "JUMPDEST", + "gas": 3745, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5136, + "op": "DUP3", + "gas": 3744, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5137, + "op": "DUP2", + "gas": 3741, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5138, + "op": "DUP4", + "gas": 3738, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5139, + "op": "opcode 0x5e not defined", + "gas": 3735, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 5140, + "op": "PUSH0", + "gas": 3729, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5141, + "op": "DUP4", + "gas": 3727, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5142, + "op": "DUP4", + "gas": 3724, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5143, + "op": "ADD", + "gas": 3721, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5144, + "op": "MSTORE", + "gas": 3718, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 5145, + "op": "POP", + "gas": 3712, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5146, + "op": "POP", + "gas": 3710, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5147, + "op": "POP", + "gas": 3708, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5148, + "op": "JUMP", + "gas": 3706, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6453, + "op": "JUMPDEST", + "gas": 3698, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6454, + "op": "PUSH2", + "gas": 3697, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6457, + "op": "DUP2", + "gas": 3694, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6458, + "op": "PUSH2", + "gas": 3691, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6461, + "op": "JUMP", + "gas": 3688, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4450, + "op": "JUMPDEST", + "gas": 3680, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4451, + "op": "PUSH0", + "gas": 3679, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4452, + "op": "PUSH1", + "gas": 3677, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4454, + "op": "NOT", + "gas": 3674, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4455, + "op": "PUSH1", + "gas": 3671, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4457, + "op": "DUP4", + "gas": 3668, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4458, + "op": "ADD", + "gas": 3665, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4459, + "op": "AND", + "gas": 3662, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4460, + "op": "SWAP1", + "gas": 3659, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4461, + "op": "POP", + "gas": 3656, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4462, + "op": "SWAP2", + "gas": 3654, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4463, + "op": "SWAP1", + "gas": 3651, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4464, + "op": "POP", + "gas": 3648, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4465, + "op": "JUMP", + "gas": 3646, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6462, + "op": "JUMPDEST", + "gas": 3638, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6463, + "op": "DUP5", + "gas": 3637, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6464, + "op": "ADD", + "gas": 3634, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6465, + "op": "SWAP2", + "gas": 3631, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6466, + "op": "POP", + "gas": 3628, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6467, + "op": "POP", + "gas": 3626, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6468, + "op": "SWAP3", + "gas": 3624, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6469, + "op": "SWAP2", + "gas": 3621, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6470, + "op": "POP", + "gas": 3618, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6471, + "op": "POP", + "gas": 3616, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6472, + "op": "JUMP", + "gas": 3614, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6512, + "op": "JUMPDEST", + "gas": 3606, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6513, + "op": "SWAP1", + "gas": 3605, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6514, + "op": "POP", + "gas": 3602, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6515, + "op": "PUSH2", + "gas": 3600, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6518, + "op": "PUSH1", + "gas": 3597, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6520, + "op": "DUP4", + "gas": 3594, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6521, + "op": "ADD", + "gas": 3591, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6522, + "op": "DUP7", + "gas": 3588, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6523, + "op": "PUSH2", + "gas": 3585, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6526, + "op": "JUMP", + "gas": 3582, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4840, + "op": "JUMPDEST", + "gas": 3574, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4841, + "op": "PUSH2", + "gas": 3573, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4844, + "op": "DUP2", + "gas": 3570, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4845, + "op": "PUSH2", + "gas": 3567, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4848, + "op": "JUMP", + "gas": 3564, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4829, + "op": "JUMPDEST", + "gas": 3556, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4830, + "op": "PUSH0", + "gas": 3555, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4831, + "op": "DUP2", + "gas": 3553, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4832, + "op": "ISZERO", + "gas": 3550, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4833, + "op": "ISZERO", + "gas": 3547, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4834, + "op": "SWAP1", + "gas": 3544, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4835, + "op": "POP", + "gas": 3541, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4836, + "op": "SWAP2", + "gas": 3539, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4837, + "op": "SWAP1", + "gas": 3536, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4838, + "op": "POP", + "gas": 3533, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4839, + "op": "JUMP", + "gas": 3531, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4849, + "op": "JUMPDEST", + "gas": 3523, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4850, + "op": "DUP3", + "gas": 3522, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4851, + "op": "MSTORE", + "gas": 3519, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4852, + "op": "POP", + "gas": 3516, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4853, + "op": "POP", + "gas": 3514, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4854, + "op": "JUMP", + "gas": 3512, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6527, + "op": "JUMPDEST", + "gas": 3504, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6528, + "op": "DUP2", + "gas": 3503, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6529, + "op": "DUP2", + "gas": 3500, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6530, + "op": "SUB", + "gas": 3497, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6531, + "op": "PUSH1", + "gas": 3494, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6533, + "op": "DUP4", + "gas": 3491, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6534, + "op": "ADD", + "gas": 3488, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6535, + "op": "MSTORE", + "gas": 3485, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6536, + "op": "PUSH2", + "gas": 3482, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6539, + "op": "DUP2", + "gas": 3479, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6540, + "op": "DUP6", + "gas": 3476, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6541, + "op": "PUSH2", + "gas": 3473, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6544, + "op": "JUMP", + "gas": 3470, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5149, + "op": "JUMPDEST", + "gas": 3462, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5150, + "op": "PUSH0", + "gas": 3461, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5151, + "op": "PUSH2", + "gas": 3459, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5154, + "op": "DUP3", + "gas": 3456, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5155, + "op": "PUSH2", + "gas": 3453, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5158, + "op": "JUMP", + "gas": 3450, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5109, + "op": "JUMPDEST", + "gas": 3442, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5110, + "op": "PUSH0", + "gas": 3441, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5111, + "op": "DUP2", + "gas": 3439, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5112, + "op": "MLOAD", + "gas": 3436, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5113, + "op": "SWAP1", + "gas": 3433, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5114, + "op": "POP", + "gas": 3430, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5115, + "op": "SWAP2", + "gas": 3428, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5116, + "op": "SWAP1", + "gas": 3425, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5117, + "op": "POP", + "gas": 3422, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5118, + "op": "JUMP", + "gas": 3420, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5159, + "op": "JUMPDEST", + "gas": 3412, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5160, + "op": "PUSH2", + "gas": 3411, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5163, + "op": "DUP2", + "gas": 3408, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5164, + "op": "DUP6", + "gas": 3405, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5165, + "op": "PUSH2", + "gas": 3402, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5168, + "op": "JUMP", + "gas": 3399, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5119, + "op": "JUMPDEST", + "gas": 3391, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5120, + "op": "PUSH0", + "gas": 3390, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5121, + "op": "DUP3", + "gas": 3388, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5122, + "op": "DUP3", + "gas": 3385, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5123, + "op": "MSTORE", + "gas": 3382, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 5124, + "op": "PUSH1", + "gas": 3376, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5126, + "op": "DUP3", + "gas": 3373, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5127, + "op": "ADD", + "gas": 3370, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5128, + "op": "SWAP1", + "gas": 3367, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5129, + "op": "POP", + "gas": 3364, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5130, + "op": "SWAP3", + "gas": 3362, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5131, + "op": "SWAP2", + "gas": 3359, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5132, + "op": "POP", + "gas": 3356, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5133, + "op": "POP", + "gas": 3354, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5134, + "op": "JUMP", + "gas": 3352, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5169, + "op": "JUMPDEST", + "gas": 3344, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5170, + "op": "SWAP4", + "gas": 3343, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5171, + "op": "POP", + "gas": 3340, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5172, + "op": "PUSH2", + "gas": 3338, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5175, + "op": "DUP2", + "gas": 3335, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5176, + "op": "DUP6", + "gas": 3332, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5177, + "op": "PUSH1", + "gas": 3329, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5179, + "op": "DUP7", + "gas": 3326, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5180, + "op": "ADD", + "gas": 3323, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5181, + "op": "PUSH2", + "gas": 3320, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5184, + "op": "JUMP", + "gas": 3317, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5135, + "op": "JUMPDEST", + "gas": 3309, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5136, + "op": "DUP3", + "gas": 3308, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5137, + "op": "DUP2", + "gas": 3305, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5138, + "op": "DUP4", + "gas": 3302, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5139, + "op": "opcode 0x5e not defined", + "gas": 3299, + "gasCost": 9, + "depth": 1 + }, + { + "pc": 5140, + "op": "PUSH0", + "gas": 3290, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5141, + "op": "DUP4", + "gas": 3288, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5142, + "op": "DUP4", + "gas": 3285, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5143, + "op": "ADD", + "gas": 3282, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5144, + "op": "MSTORE", + "gas": 3279, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 5145, + "op": "POP", + "gas": 3273, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5146, + "op": "POP", + "gas": 3271, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5147, + "op": "POP", + "gas": 3269, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5148, + "op": "JUMP", + "gas": 3267, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5185, + "op": "JUMPDEST", + "gas": 3259, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5186, + "op": "PUSH2", + "gas": 3258, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5189, + "op": "DUP2", + "gas": 3255, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5190, + "op": "PUSH2", + "gas": 3252, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5193, + "op": "JUMP", + "gas": 3249, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4450, + "op": "JUMPDEST", + "gas": 3241, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4451, + "op": "PUSH0", + "gas": 3240, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4452, + "op": "PUSH1", + "gas": 3238, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4454, + "op": "NOT", + "gas": 3235, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4455, + "op": "PUSH1", + "gas": 3232, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4457, + "op": "DUP4", + "gas": 3229, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4458, + "op": "ADD", + "gas": 3226, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4459, + "op": "AND", + "gas": 3223, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4460, + "op": "SWAP1", + "gas": 3220, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4461, + "op": "POP", + "gas": 3217, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4462, + "op": "SWAP2", + "gas": 3215, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4463, + "op": "SWAP1", + "gas": 3212, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4464, + "op": "POP", + "gas": 3209, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4465, + "op": "JUMP", + "gas": 3207, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5194, + "op": "JUMPDEST", + "gas": 3199, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5195, + "op": "DUP5", + "gas": 3198, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5196, + "op": "ADD", + "gas": 3195, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5197, + "op": "SWAP2", + "gas": 3192, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5198, + "op": "POP", + "gas": 3189, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5199, + "op": "POP", + "gas": 3187, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5200, + "op": "SWAP3", + "gas": 3185, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5201, + "op": "SWAP2", + "gas": 3182, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5202, + "op": "POP", + "gas": 3179, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5203, + "op": "POP", + "gas": 3177, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5204, + "op": "JUMP", + "gas": 3175, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6545, + "op": "JUMPDEST", + "gas": 3167, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6546, + "op": "SWAP1", + "gas": 3166, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6547, + "op": "POP", + "gas": 3163, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6548, + "op": "PUSH2", + "gas": 3161, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6551, + "op": "PUSH1", + "gas": 3158, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6553, + "op": "DUP4", + "gas": 3155, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6554, + "op": "ADD", + "gas": 3152, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6555, + "op": "DUP5", + "gas": 3149, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6556, + "op": "PUSH2", + "gas": 3146, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6559, + "op": "JUMP", + "gas": 3143, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6473, + "op": "JUMPDEST", + "gas": 3135, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6474, + "op": "PUSH2", + "gas": 3134, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6477, + "op": "DUP2", + "gas": 3131, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6478, + "op": "PUSH2", + "gas": 3128, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6481, + "op": "JUMP", + "gas": 3125, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 3117, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 3116, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 3114, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 3111, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 3108, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 3106, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 3103, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 3100, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 3098, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6482, + "op": "JUMPDEST", + "gas": 3090, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6483, + "op": "DUP3", + "gas": 3089, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6484, + "op": "MSTORE", + "gas": 3086, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6485, + "op": "POP", + "gas": 3083, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6486, + "op": "POP", + "gas": 3081, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6487, + "op": "JUMP", + "gas": 3079, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6560, + "op": "JUMPDEST", + "gas": 3071, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6561, + "op": "SWAP6", + "gas": 3070, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6562, + "op": "SWAP5", + "gas": 3067, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6563, + "op": "POP", + "gas": 3064, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6564, + "op": "POP", + "gas": 3062, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6565, + "op": "POP", + "gas": 3060, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6566, + "op": "POP", + "gas": 3058, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6567, + "op": "POP", + "gas": 3056, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6568, + "op": "JUMP", + "gas": 3054, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 922, + "op": "JUMPDEST", + "gas": 3046, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 923, + "op": "PUSH1", + "gas": 3045, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 925, + "op": "MLOAD", + "gas": 3042, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 926, + "op": "DUP1", + "gas": 3039, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 927, + "op": "SWAP2", + "gas": 3036, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 928, + "op": "SUB", + "gas": 3033, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 929, + "op": "SWAP1", + "gas": 3030, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 930, + "op": "LOG1", + "gas": 3027, + "gasCost": 2798, + "depth": 1 + }, + { + "pc": 931, + "op": "DUP2", + "gas": 229, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 932, + "op": "SWAP4", + "gas": 226, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 933, + "op": "POP", + "gas": 223, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 934, + "op": "POP", + "gas": 221, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 935, + "op": "POP", + "gas": 219, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 936, + "op": "POP", + "gas": 217, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 937, + "op": "SWAP2", + "gas": 215, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 938, + "op": "SWAP1", + "gas": 212, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 939, + "op": "POP", + "gas": 209, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 940, + "op": "JUMP", + "gas": 207, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 2233, + "op": "JUMPDEST", + "gas": 199, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 2234, + "op": "SWAP1", + "gas": 198, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2235, + "op": "POP", + "gas": 195, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2236, + "op": "SWAP2", + "gas": 193, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2237, + "op": "SWAP1", + "gas": 190, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2238, + "op": "POP", + "gas": 187, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2239, + "op": "JUMP", + "gas": 185, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 426, + "op": "JUMPDEST", + "gas": 177, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 427, + "op": "PUSH1", + "gas": 176, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 429, + "op": "MLOAD", + "gas": 173, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 430, + "op": "PUSH2", + "gas": 170, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 433, + "op": "SWAP2", + "gas": 167, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 434, + "op": "SWAP1", + "gas": 164, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 435, + "op": "PUSH2", + "gas": 161, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 438, + "op": "JUMP", + "gas": 158, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4855, + "op": "JUMPDEST", + "gas": 150, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4856, + "op": "PUSH0", + "gas": 149, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4857, + "op": "PUSH1", + "gas": 147, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4859, + "op": "DUP3", + "gas": 144, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4860, + "op": "ADD", + "gas": 141, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4861, + "op": "SWAP1", + "gas": 138, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4862, + "op": "POP", + "gas": 135, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4863, + "op": "PUSH2", + "gas": 133, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4866, + "op": "PUSH0", + "gas": 130, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4867, + "op": "DUP4", + "gas": 128, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4868, + "op": "ADD", + "gas": 125, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4869, + "op": "DUP5", + "gas": 122, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4870, + "op": "PUSH2", + "gas": 119, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4873, + "op": "JUMP", + "gas": 116, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4840, + "op": "JUMPDEST", + "gas": 108, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4841, + "op": "PUSH2", + "gas": 107, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4844, + "op": "DUP2", + "gas": 104, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4845, + "op": "PUSH2", + "gas": 101, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4848, + "op": "JUMP", + "gas": 98, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4829, + "op": "JUMPDEST", + "gas": 90, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4830, + "op": "PUSH0", + "gas": 89, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4831, + "op": "DUP2", + "gas": 87, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4832, + "op": "ISZERO", + "gas": 84, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4833, + "op": "ISZERO", + "gas": 81, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4834, + "op": "SWAP1", + "gas": 78, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4835, + "op": "POP", + "gas": 75, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4836, + "op": "SWAP2", + "gas": 73, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4837, + "op": "SWAP1", + "gas": 70, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4838, + "op": "POP", + "gas": 67, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4839, + "op": "JUMP", + "gas": 65, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4849, + "op": "JUMPDEST", + "gas": 57, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4850, + "op": "DUP3", + "gas": 56, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4851, + "op": "MSTORE", + "gas": 53, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4852, + "op": "POP", + "gas": 50, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4853, + "op": "POP", + "gas": 48, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4854, + "op": "JUMP", + "gas": 46, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4874, + "op": "JUMPDEST", + "gas": 38, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4875, + "op": "SWAP3", + "gas": 37, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4876, + "op": "SWAP2", + "gas": 34, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4877, + "op": "POP", + "gas": 31, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4878, + "op": "POP", + "gas": 29, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4879, + "op": "JUMP", + "gas": 27, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 439, + "op": "JUMPDEST", + "gas": 19, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 440, + "op": "PUSH1", + "gas": 18, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 442, + "op": "MLOAD", + "gas": 15, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 443, + "op": "DUP1", + "gas": 12, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 444, + "op": "SWAP2", + "gas": 9, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 445, + "op": "SUB", + "gas": 6, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 446, + "op": "SWAP1", + "gas": 3, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 447, + "op": "RETURN", + "gas": 0, + "gasCost": 0, + "depth": 1 + } + ], + "callTrace": { + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "gas": "0x17d11", + "gasUsed": "0x17d11", + "to": "0xf78ce1e2f0de8fd15ce6ac4ddec6982413fda499", + "input": "0x637bd1640000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000468656c6f00000000000000000000000000000000000000000000000000000000", + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "calls": [ + { + "from": "0xf78ce1e2f0de8fd15ce6ac4ddec6982413fda499", + "gas": "0x11742", + "gasUsed": "0x2d0", + "to": "0x0000000000000000000000000000000000000003", + "input": "0x68656c6f", + "output": "0x000000000000000000000000158cedaee897fad9539a79146d34b587b38a76b7", + "type": "STATICCALL" + } + ], + "value": "0x0", + "type": "CALL" + } + } + ], + "withdraw_trie_root": "0xf15fe55ccda900eb1a64fa9abee8054e44b6915dae17e21aef095f4cd49d2a67", + "sequencer_set_verify_hash": "0x72fce9da9f9cca9ae7f43acbcc6060e82ef37152a13cee828b492343ec19eebc", + "startL1QueueIndex": 1321206 + } + ] +] \ No newline at end of file diff --git a/prover/testdata/morph203/morph203_1_traces.json b/prover/testdata/morph203/morph203_1_traces.json new file mode 100644 index 00000000..2fd3b25d --- /dev/null +++ b/prover/testdata/morph203/morph203_1_traces.json @@ -0,0 +1,9576 @@ +[ + [ + { + "chainID": 53077, + "version": "2.0.3-mainnet-0295a3d4", + "coinbase": { + "address": "0x716170d0687c3d31cc10debe0daa1ddd3fe3d792", + "nonce": 0, + "balance": "0x2bfc77ff00b8b156", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + "header": { + "parentHash": "0x63bb6fe159f8bed6b6549fefa5fa832f6c7855949cac72aa501eb50ae3303a21", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "miner": "0x0000000000000000000000000000000000000000", + "stateRoot": "0x2e3a128bf02f699263d560a2dea15c40daeb046e981f89576b9b7ba0fc98238f", + "transactionsRoot": "0xee6ccf2ad3829bb1970cccc9efcb4b7472de5fdadb7e24d5603f051b9e6cf1c6", + "receiptsRoot": "0xbf8743e4e21132d3c364831f16daa19d928d4a61b9b89fe6614aa4e8e29647eb", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000004000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000", + "difficulty": "0x0", + "number": "0x78369", + "gasLimit": "0x3b9aca00", + "gasUsed": "0x1d744", + "timestamp": "0x67d39d55", + "extraData": "0x", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x0000000000000000", + "nextL1MsgIndex": "0x1428f6", + "batchHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "baseFeePerGas": "0xf4240", + "withdrawalsRoot": null, + "blobGasUsed": null, + "excessBlobGas": null, + "parentBeaconBlockRoot": null, + "hash": "0xdd33ef8f0acd65a138d4b06161335ac4e557596dbd8886fca9fbeb04a250f1eb" + }, + "transactions": [ + { + "type": 2, + "nonce": 2172, + "txHash": "0xeec7175879653339d866e18077ef1c45767149573572d0b0e58ad384b2253166", + "gas": 120644, + "gasPrice": "0xf4240", + "gasTipCap": "0xf4240", + "gasFeeCap": "0xf4240", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0xf78ce1e2f0de8fd15ce6ac4ddec6982413fda499", + "chainId": "0xcf55", + "value": "0x0", + "data": "0x65207521000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000d50000000c0405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3010000000000000000000000", + "isCreate": false, + "accessList": [], + "v": "0x0", + "r": "0xd8c822a807ac57274ef5b5e5eb094a8e4d32ac6ee89d1e65f0cf25642e598553", + "s": "0x7de8a48c72083a9b291b51856f6807752ad75e22f7d65f27debd16d9420917e5" + } + ], + "storageTrace": { + "rootBefore": "0x2ae6666bcca6b4e72819d44bba819a3f37f015d6e1df579f84847e3ee7c55f3e", + "rootAfter": "0x2e3a128bf02f699263d560a2dea15c40daeb046e981f89576b9b7ba0fc98238f", + "proofs": { + "0x0000000000000000000000000000000000000009": [ + "0x091d6fc08d1b0ca1c242ea9feb4922cccacd60d303b5ee492db8f32a0568f2a8742d77f0dd9bbdc44acce00f7ab1067709208957504f8664b75b5a2fa79d88b04f", + "0x090da7e7e9bae076de85c6a3fda89a4ffbc236691d421cab3ce955f6fdd66cca9721ce6c2b4fc04e5bbc357f842c54e831f0b05dcd1f6227ab01b2c1a66727e0f8", + "0x09104f87b11816f6619611fbd4dfb6b8425a675325a61e91a29346b0adeca37af01f40d7cbd6801e32eea2e73ae37a3e6a9c612c17eacd5ee7f9e54e3064af68ed", + "0x0923887f7f2b818306eb521f1c9a28fa1180772e0603e778536d3bd047562df33521b0c8c03e0e8783c187c12a2309a02be178b53f86ad845a9a2d0f82d342a027", + "0x0921db0def816c47288e31e114f2d320d1bef10a2ce0ed76f2333bfbaf4c9665df164af8117b30ef75c3a4e008ea19aceaa6e63940ecf5e5a545aab0906e772f19", + "0x090bdf939207e635077a89f39556cd58b57a5b91f7dd98c575665e30da373293ab236ab274f709263510668e66c2e8aec6dd013ed3aa1f7c3c188942b60cbaa671", + "0x090a9b9eb0eaf92b6a5a4eaff4b1191ae18e79672e5faab8e28bc34463f1da8827087e533a51344d20f09abcff595055b7ffd063e9f2513dd6fb7d2b48743d5932", + "0x09155c6820bbd72e6d877fb66c92c324f732982dbcd484cb746afd208a49ee2ef216fd2ec563dc9c533f9e8f40d08d2c6e1c80cfacc72bff908d529eaa3aed14af", + "0x062419360621da4f6d65940dc43995755d1b17b08f311067fc2e47614ed451b0970fb518201f9a11f33d4128782669aefb52a0d29954cdcbf190c597f1b0a1a88f", + "0x04105403da6918e91208c94938cb8af9bcab94ef192f175bbd5a4759e4e46a0d700508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c621c5d486a08000000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420cae036ce53831e56043108b3ef9444d95464cfde000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5300000000000000000000000000000000000001": [ + "0x091d6fc08d1b0ca1c242ea9feb4922cccacd60d303b5ee492db8f32a0568f2a8742d77f0dd9bbdc44acce00f7ab1067709208957504f8664b75b5a2fa79d88b04f", + "0x090da7e7e9bae076de85c6a3fda89a4ffbc236691d421cab3ce955f6fdd66cca9721ce6c2b4fc04e5bbc357f842c54e831f0b05dcd1f6227ab01b2c1a66727e0f8", + "0x0915588127e13317eac2a90561a4bbce9529db0b5fcfb87d1aa7364994db6f638d007f89220807403164fd521d78dc5244d8b1e74320055a60d4f8a3755c80dee8", + "0x09128aa2ec49bb12c10c7ee13d60415e9433d9b779a2a5c7d6ab9d49dd320d434127b48395b98d9dee704b606911b11f95fc96160e498e19fbcf3ecc069e0a768e", + "0x09222c59fb203c2136a3a186f2913505e1ca71f725701fddec9401ac0c19878ada24be1a9aa08adbc8ba1e71b30f38c299058e853fbe93cee09c566afe37c96d12", + "0x092cc07548fafc69a4dc7cfa2a483453f9f9819d104ccc8452b044584316b2918a0b1550511655ecc100037fab01d02dc8afb8b117bedad7f9ff3900d0747d44a6", + "0x091e5bd0832fb5a9827c679c75db95f1a559a07972a60b9c51ec435ea0633394390febfd3ab5fff6718b8ec4122a449fb8320d7a813240d702a4fda781e0a9bdce", + "0x092b96c11dcd9903dd8dfbca4f5acaf64c98f7aa8d1908e90d22682169ff2ba88c1aba44333a24240b0ba627dceff3778abc51012b698672802aea6c8c26bbfe18", + "0x090df918b89bd13e0c0a0745ccee3ac8ba25569fa5ba386d501311f0bf98a643331a327742a33e16c8ac782d9cef4cb06d98b731e6ca13b0c5450951b020f9b0c6", + "0x0820f409300cb23fffe97841b4b70f4c160f90393f7d29ecb5d2dc25f15c89fb550000000000000000000000000000000000000000000000000000000000000000", + "0x061276876f7f3ac122c96a402a706e93a7da84ad82496958bf8cf8d2baefa8c02a20abfaf6bc20fadf9a7609c0562a0ff138977845b052cf9e5d4c52cb2adedbe3", + "0x0427cfcbd2fe87474008e199ef5bff09273803bbf38032c75a36a7726b3c88f8a205080000000000000000000000000000000000000000000000000aec000000000000000000000000000000000000000000000000000000000000000000000000000000002b2d37d04a6c2068ba19a08e79f3eeabfc6d2d1d516fcd700d4c377b23f9fc3f44107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f84205300000000000000000000000000000000000001000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x530000000000000000000000000000000000000f": [ + "0x091d6fc08d1b0ca1c242ea9feb4922cccacd60d303b5ee492db8f32a0568f2a8742d77f0dd9bbdc44acce00f7ab1067709208957504f8664b75b5a2fa79d88b04f", + "0x090da7e7e9bae076de85c6a3fda89a4ffbc236691d421cab3ce955f6fdd66cca9721ce6c2b4fc04e5bbc357f842c54e831f0b05dcd1f6227ab01b2c1a66727e0f8", + "0x09104f87b11816f6619611fbd4dfb6b8425a675325a61e91a29346b0adeca37af01f40d7cbd6801e32eea2e73ae37a3e6a9c612c17eacd5ee7f9e54e3064af68ed", + "0x0923887f7f2b818306eb521f1c9a28fa1180772e0603e778536d3bd047562df33521b0c8c03e0e8783c187c12a2309a02be178b53f86ad845a9a2d0f82d342a027", + "0x092acea573988b3a33584f55cee3da7527b7ec93c39ee431d6a00e9e1c0908c32907d5d2c7ba73004c814f367fcfa9bbed0636535570c02819442719331f977f69", + "0x090e9d499bfcd7a95f27f1232e8299d71b9e312b56a5c2f96de6ba2114ce6427600bffa1d771c4f6eb4bbdc666b4ee82f7ea04a51f7c036d38e88ce7e9f7deb0d2", + "0x092e0e76440cf40d49e6a6441452c7ff3db1c5530a007c6d11b54c655302baa6a12719c9e93c1c4ab00f37d68d1fbde1ad2c4c0f540add6fc908b56c496d140ff6", + "0x082596dc85315e1b7b634ed1b19fd101397a8aaee2a296aca23e1f154d83bf2ca81d502de1ce7abdbf1e224e458bcbde4742e517dfc7ff124fca95bc7d6916a573", + "0x0418a86f98026d1a55f6fee616f04d51be16c033651ffaafb0514287ec067d04e805080000000000000000000000000000000000000000000000000aec000000000000000000000000000000000000000000000000000000000000000000000000000000002d56fafe62ab5b6fed6b2a6cd3e6eaff4b96665a12fda3cb3fcd69f5e7bee95f44107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f8420530000000000000000000000000000000000000f000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5300000000000000000000000000000000000017": [ + "0x091d6fc08d1b0ca1c242ea9feb4922cccacd60d303b5ee492db8f32a0568f2a8742d77f0dd9bbdc44acce00f7ab1067709208957504f8664b75b5a2fa79d88b04f", + "0x090da7e7e9bae076de85c6a3fda89a4ffbc236691d421cab3ce955f6fdd66cca9721ce6c2b4fc04e5bbc357f842c54e831f0b05dcd1f6227ab01b2c1a66727e0f8", + "0x09104f87b11816f6619611fbd4dfb6b8425a675325a61e91a29346b0adeca37af01f40d7cbd6801e32eea2e73ae37a3e6a9c612c17eacd5ee7f9e54e3064af68ed", + "0x0923887f7f2b818306eb521f1c9a28fa1180772e0603e778536d3bd047562df33521b0c8c03e0e8783c187c12a2309a02be178b53f86ad845a9a2d0f82d342a027", + "0x0921db0def816c47288e31e114f2d320d1bef10a2ce0ed76f2333bfbaf4c9665df164af8117b30ef75c3a4e008ea19aceaa6e63940ecf5e5a545aab0906e772f19", + "0x09243159bed6b5236c01d76e3c7ce8656377ede3215a267875ebd69ecb83609c2f1d430d8e77abbe31d81de9fd34eb7963320d07e618379663173532df9fd64a45", + "0x0901b9f43d7930c744b2f5c270fc55ebc1dad912c53348dc7fc91c254d4f65dc731935412eb3f2d483f1fad4cda432ea52bf9a2fcc83bb4998daae1e3fcb942d70", + "0x090e532e6013b5c675cdd7dd5dbca734c748a7f04cbd659dd2ae0bc5eafa5970c91e3d73de759429994c0b1ca675ad7693042bdd444939eb4adbf7098f3863b137", + "0x091cf7b52fea8453a4ca0b91aa9982cfa67d70de187ba25db4a8f248026ca3e530001cfc254334d3a06381cc5cee1769ae6912ce781377cc01b9c6917605338915", + "0x07092aee158cd2b81331e1ce9909492eb4317b6c5bc4794d546b62069798d0b24428cd8e8880db728741786b4fa7256d94a30e266ca07390acd342670e53ccb6b9", + "0x060e3bf5a186646517ca6d50e9d232f03b095fcceb727e719819a496973c2a8cf81102b8f2eac7af07547b293c5389e362fced543befbe69dc6fa5ec89b7df96e3", + "0x041918c47a133f759975cc95c0dba82051d9b5cd65407e76ef1366a9deaa14f28005080000000000000000000000000000000000000000000000000aec00000000000000000000000000000000000000000000000000000000000000000000000000000000047815c1b6b86b3270e62056fbc5c2f5e6d06a5d3255217e122006dece0bb56544107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f84205300000000000000000000000000000000000017000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x716170D0687c3d31CC10DebE0dAa1DDD3FE3D792": [ + "0x091d6fc08d1b0ca1c242ea9feb4922cccacd60d303b5ee492db8f32a0568f2a8742d77f0dd9bbdc44acce00f7ab1067709208957504f8664b75b5a2fa79d88b04f", + "0x090da7e7e9bae076de85c6a3fda89a4ffbc236691d421cab3ce955f6fdd66cca9721ce6c2b4fc04e5bbc357f842c54e831f0b05dcd1f6227ab01b2c1a66727e0f8", + "0x09104f87b11816f6619611fbd4dfb6b8425a675325a61e91a29346b0adeca37af01f40d7cbd6801e32eea2e73ae37a3e6a9c612c17eacd5ee7f9e54e3064af68ed", + "0x0901ae383d775a5593e8a9c58ec5e32d5b37296baa0363f05956ce31e20bf28f360aafacd4fa6a4af2e76345dcd258001d8525e1f0b15de72aa184708588a2e35a", + "0x092b26192ebc81162aa68594a054c44db6465a42a82afa2a88ea3a15f1d179742e2ab45becdac9b9922102afd7064f345952b290760a3f989808dca99c2d06130d", + "0x0912f32fcd87faa8889ff2b91d786a0ef976de3b5553d5284f8cbd6e9729bd31aa2d78b77cb674d0a4807418dde4894fe02131f6b5cd6e55564ee31e6fd152366f", + "0x0929be597731cca26d8264df590bb5eb3bbcb0549c210ccce091381bea0a5ed92916c1f547c1b4befd140ad0df5148954ea9b8d316a3f30ac487b9828137d575e5", + "0x09298da2e6f54d728445d34319cf317db690b4458e1cc40328ef50785d552a54e11368c01d16ad1cc931152eed082219375b88fbc1954e7d02321f331b2cc73035", + "0x0905a84a34349628360a471a26d87e83b5cb22108b4e512f899ff26456556e9c7a23387b834374c9e0fd3988025e271787762722d7377318a033a72c1262e73f07", + "0x0700000000000000000000000000000000000000000000000000000000000000002132a384e0b749578e04b225ddc5fe7993e9ad939472707b779b39316ef5101b", + "0x0921ddfb4b9e43ab809479c10047a21a49a811c5ba8cc53280e5d7502943c0030d2ec37a3eaab5531f679ae7b47970a9db6180c2464b5007f79d01c3ba1af7abf1", + "0x0603352201e9677453b2cfc7b12ba1f3e0cf320de57c0beb28e671d437e336fbbb04f6276c48cec8cdf8fe675b19d5cb173b53fca9d0c8f4e0b2015528dc843fcf", + "0x0414b0bb4090afcdae623b69d996022ea82c221cd1a3c00c5b13acb37d750f87fc0508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002bfc76c41ecba6eb0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420716170d0687c3d31cc10debe0daa1ddd3fe3d792000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xF78ce1E2f0De8FD15cE6aC4DdeC6982413fda499": [ + "0x091d6fc08d1b0ca1c242ea9feb4922cccacd60d303b5ee492db8f32a0568f2a8742d77f0dd9bbdc44acce00f7ab1067709208957504f8664b75b5a2fa79d88b04f", + "0x090da7e7e9bae076de85c6a3fda89a4ffbc236691d421cab3ce955f6fdd66cca9721ce6c2b4fc04e5bbc357f842c54e831f0b05dcd1f6227ab01b2c1a66727e0f8", + "0x0915588127e13317eac2a90561a4bbce9529db0b5fcfb87d1aa7364994db6f638d007f89220807403164fd521d78dc5244d8b1e74320055a60d4f8a3755c80dee8", + "0x09128aa2ec49bb12c10c7ee13d60415e9433d9b779a2a5c7d6ab9d49dd320d434127b48395b98d9dee704b606911b11f95fc96160e498e19fbcf3ecc069e0a768e", + "0x09222c59fb203c2136a3a186f2913505e1ca71f725701fddec9401ac0c19878ada24be1a9aa08adbc8ba1e71b30f38c299058e853fbe93cee09c566afe37c96d12", + "0x092c5da8e3201d802213ef792f56e2215c4ec5dddeeca3994478c4dfe0a630aa962c06a687e38230484a4b6da57e9789bd2b162494b8996940dde8f76be97e18e9", + "0x092b2b83d6a3c43e9d5d74c102989fc1a6e8919c861f1f883358c726154395ab9021436af3496f9659fecbe04997c9f3f424bd376d5194fef20e1679b4d55f3ea4", + "0x0928dfb159dc353f8078c4363538a58a9fa9d7752e3fcf7d8ceddc08c11b51d15e19d66853551b5572832ff2b8fb72db53abe9fd30f56d6234918b51b1a50d3e75", + "0x0705f62a2631030f319cc83d3aed31907f893959137f58b48b7b3e8c22d877ea3716ef7145a610c21838e72d9d113e968ad41ab9c59e0a35633ddc5352d1867bd4", + "0x0802c74dd49b7efb1838742c4bd723baf03c7213fd6451541830a55b1a8a4b97f80000000000000000000000000000000000000000000000000000000000000000", + "0x08200b133820811eae273851524cd4b4286bfe2c1952baf7add3cea76fd28f55c30000000000000000000000000000000000000000000000000000000000000000", + "0x062dedb44952879016a484230de4935598f46859023d2b5c59b5839a54694766630e8e9abd7780da5da2ef86496348acf63857300969c2e704a31e7ea401be45f7", + "0x040dc14d1e73c0c578e5be438abfab5d1a47a0eef96e1d759f6997244869c1011205080000000000000000000000000000000000000000000000001dfd000000000000000100000000000000000000000000000000000000000000000000000000000000000f98ed2e0091c1dcd5e8881666d11fc23b8d3bff6db63078ff41db71965f5b6d04ebeb19827e292abcff3ed0df7e0643f284c1a3a1be79552f95e2d68f273404290a6dffbef8eab27533357244828872617f855e589938736a13aa522e946bd520f78ce1e2f0de8fd15ce6ac4ddec6982413fda499000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266": [ + "0x091d6fc08d1b0ca1c242ea9feb4922cccacd60d303b5ee492db8f32a0568f2a8742d77f0dd9bbdc44acce00f7ab1067709208957504f8664b75b5a2fa79d88b04f", + "0x090da7e7e9bae076de85c6a3fda89a4ffbc236691d421cab3ce955f6fdd66cca9721ce6c2b4fc04e5bbc357f842c54e831f0b05dcd1f6227ab01b2c1a66727e0f8", + "0x0915588127e13317eac2a90561a4bbce9529db0b5fcfb87d1aa7364994db6f638d007f89220807403164fd521d78dc5244d8b1e74320055a60d4f8a3755c80dee8", + "0x09128aa2ec49bb12c10c7ee13d60415e9433d9b779a2a5c7d6ab9d49dd320d434127b48395b98d9dee704b606911b11f95fc96160e498e19fbcf3ecc069e0a768e", + "0x09222c59fb203c2136a3a186f2913505e1ca71f725701fddec9401ac0c19878ada24be1a9aa08adbc8ba1e71b30f38c299058e853fbe93cee09c566afe37c96d12", + "0x092c5da8e3201d802213ef792f56e2215c4ec5dddeeca3994478c4dfe0a630aa962c06a687e38230484a4b6da57e9789bd2b162494b8996940dde8f76be97e18e9", + "0x092b2b83d6a3c43e9d5d74c102989fc1a6e8919c861f1f883358c726154395ab9021436af3496f9659fecbe04997c9f3f424bd376d5194fef20e1679b4d55f3ea4", + "0x091a2e42b984a6b38ac4cee46e54d20e4b5333e29262d465ec5d3f94bdf62986bf296a1e25050d195d3b4699a0da27135a9fc8e49ec8f4dfa98038b7d6ae774826", + "0x080bb10865c33ea20a22c7941fc0a096301c98873d56148c6e8fea9b6e70fc3d2409b11876e7719db807b8d2c600e5babd3239cf90972e0301a6b204796f78205d", + "0x0811f12781b367fe7f10a9080a169e9419d7e19a5e8372ec4ed7e4d100f772054d0000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000000b07218665f37f37b6d95bd589c908f68d992080a49912641ace09e8b78b85bc", + "0x062febdf23bcdd8a95c606e8e55c203c581bd01d6346d31d231a225babe5b3fa061dd09d967fa39b772f3fa838f3d9d63ab3cac97964be50bf0bbce7053209285c", + "0x040d972511ec05ac7e25d155e7d292ab9a61b2227df344cd0eabfeff6f423c64d205080000000000000000000000000000000000000000000000000000000000000000087c000000000000000000000000000000000000000000000655cea7342d120ce11d0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420f39fd6e51aad88f6f4ce6ab8827279cfffb92266000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "storageProofs": { + "0x5300000000000000000000000000000000000001": { + "0x0000000000000000000000000000000000000000000000000000000000000021": [ + "0x09185c96062cbc2b564296e9e1bce3354dbcbf9f5879fd062d5b50bb358f81517e2a2dbce5edb6723342643101ac68123f3790ae822b572ec8bbd69da035c7b935", + "0x092d047e244b411ce9155f14462cfb81958ef4b4c2a08fc3fd4189484a8b7711a40462e3566daed4615c6e51a0e598dfb9a7ed84c831bfc516151e9f5ffb8110ca", + "0x09261fe911b00d2fd329c6b0e4b6d4c3a810b95a82ff32e6946a3244614feb91d205b63b9955f3a8244688b1a6cb053a7559f79129086239b473999e85be4c4282", + "0x07251841563b13c8aa1784b2d917584c358e1607710c0e0b41e5b1c45a07ceac601daf38969872c436599f595013a03f6c004d1f072aa7c8347f6ead35212900a8", + "0x08249e00f5aae6d513fc492c019a4e4de721a60764cada3866244a95db0d4e38bf0000000000000000000000000000000000000000000000000000000000000000", + "0x0818749973fd91f5be3859e8cfa68caee44893779b104075dd793bf4c486475b5b0000000000000000000000000000000000000000000000000000000000000000", + "0x07000000000000000000000000000000000000000000000000000000000000000017d7d830e47e7f6da4ddbf680cf2eb1f9b538cec3240c26711d780f22f093f9a", + "0x0700000000000000000000000000000000000000000000000000000000000000000abb47e0d1f63a2287426a57ee22892129c848adcfadb74266fee6b726c86ede", + "0x07000000000000000000000000000000000000000000000000000000000000000021e13181b559aa6ad86c239a49008b70447de95cb59caa3242701b556ff6d030", + "0x0609a3a225fccec46d81cb0f42943e252523157488c3f7712cc9528ec8eceeee2d0736af2262ac152f39d5da51e394c65d8ab9f3223c051e5be4c43e508a8766cf", + "0x042f683d080c393f5fb2ade2190fd56e8a5e8fa26533acdea8cce25caa236027cc01010000f15fe55ccda900eb1a64fa9abee8054e44b6915dae17e21aef095f4cd49d2a67200000000000000000000000000000000000000000000000000000000000000021", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x530000000000000000000000000000000000000f": { + "0x0000000000000000000000000000000000000000000000000000000000000001": [ + "0x090a47cdf7291bf5686a20e9325d5e85cd4c10009d5a5b727819689a559d47c621305837382344bb8c16c78c482e68e414dcaf0dd956b894c85acca1ae8d3b661a", + "0x090b1b80070a297010cca4d2fb3048fe8814f318eb8a6034a339d8e843544f1d1b2930aa108d1bfc505b36919afcd36848860c81ec8b00c0787b390250bfa7e31a", + "0x090084ca152c72cefb55b42146c2ac6b95a984db669d559d50cea6b7e776e5a6b31952bdec2ac6cd00c8bebfc77863f183bd2c9d09cd1938ebb9fe5fc2e2d2c1f4", + "0x0826741766ba756a60481cdbfbf1385b2e19410e0b174723be76ccce90749c19b71721b818bb25fdc0627fbd0f0ced2d5f58f1065a3e11d06073b58139aa144311", + "0x0700000000000000000000000000000000000000000000000000000000000000002aa3eec54733e8552173f9294865bf49cf8b2c952706e74cee743186ad4cd928", + "0x080ccb96bae7a65349544b73c51e1c17e905afa52b470cd3d12f5068df70ae80380000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000001982d84b59e872b109cb1b01bc1d03406977eb16aeef0ca94449c0e4dbde6426", + "0x08148058fb1d8433119f2f078417d61bd03610293c07a22079d8add13751806be00000000000000000000000000000000000000000000000000000000000000000", + "0x080b933363c8e146ca259ddce0026a7cda36a75da17137370243f5452dad2e2bd10000000000000000000000000000000000000000000000000000000000000000", + "0x07000000000000000000000000000000000000000000000000000000000000000029d862e775a17f6a182820b3ef22a94850f73238972142e77c423a5ccda02739", + "0x0607f1a71dd97c713b6e6f0e0429b179a7f7a5d1a95605340f87f7b3b5c6571655156a0960a84fa4287f66d18b9c39ab9d403fa6b6dddd126f47758aadcb82e122", + "0x0426049ba6de63003492eb078a01a8aa4f4a0e67f28f0955c2eba9101d5d2eea50010100000000000000000000000000000000000000000000000000000000000005f5e108200000000000000000000000000000000000000000000000000000000000000001", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000002": [ + "0x090a47cdf7291bf5686a20e9325d5e85cd4c10009d5a5b727819689a559d47c621305837382344bb8c16c78c482e68e414dcaf0dd956b894c85acca1ae8d3b661a", + "0x090b1b80070a297010cca4d2fb3048fe8814f318eb8a6034a339d8e843544f1d1b2930aa108d1bfc505b36919afcd36848860c81ec8b00c0787b390250bfa7e31a", + "0x090084ca152c72cefb55b42146c2ac6b95a984db669d559d50cea6b7e776e5a6b31952bdec2ac6cd00c8bebfc77863f183bd2c9d09cd1938ebb9fe5fc2e2d2c1f4", + "0x061b12dcd1a582e1e93ccb441e0688e482eb23efa9fb802dd24b7e5a46a7fcd9e21e144bbeb8f4c147dafacf9567e13b1b15e4804a9d74df2da7619735d765c1be", + "0x04020953ad52de135367a1ba2629636216ed5174cce5629d11b5d97fe733f07dcc0101000000000000000000000000000000000000000000000000000000000000000009c4200000000000000000000000000000000000000000000000000000000000000002", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000003": [ + "0x090a47cdf7291bf5686a20e9325d5e85cd4c10009d5a5b727819689a559d47c621305837382344bb8c16c78c482e68e414dcaf0dd956b894c85acca1ae8d3b661a", + "0x0700000000000000000000000000000000000000000000000000000000000000001f63b7a392d1af6e501f653490c2436a2b6ecc4835f91bfc8983aded770a595c", + "0x070ee2ca3e190e48951aa8d5bb00d33ba76a92de69a807dfa6f2eaa9881e303f3226ee193ec0e0368b03645561b95ea6fee2df8bb5f1db80afc64364ec993655f8", + "0x0406c50541f08911ad149aa545dd3d606f86ee63c751a795c7d57f0d3f85e6bdeb01010000000000000000000000000000000000000000000000000000000000003b9aca00200000000000000000000000000000000000000000000000000000000000000003", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000006": [ + "0x090a47cdf7291bf5686a20e9325d5e85cd4c10009d5a5b727819689a559d47c621305837382344bb8c16c78c482e68e414dcaf0dd956b894c85acca1ae8d3b661a", + "0x090b1b80070a297010cca4d2fb3048fe8814f318eb8a6034a339d8e843544f1d1b2930aa108d1bfc505b36919afcd36848860c81ec8b00c0787b390250bfa7e31a", + "0x090084ca152c72cefb55b42146c2ac6b95a984db669d559d50cea6b7e776e5a6b31952bdec2ac6cd00c8bebfc77863f183bd2c9d09cd1938ebb9fe5fc2e2d2c1f4", + "0x061b12dcd1a582e1e93ccb441e0688e482eb23efa9fb802dd24b7e5a46a7fcd9e21e144bbeb8f4c147dafacf9567e13b1b15e4804a9d74df2da7619735d765c1be", + "0x04064ef33f6d7044a6aa1458b710bb24a531e379030cf6ca490d84fff1d8e79c94010100000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000006", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000007": [ + "0x090a47cdf7291bf5686a20e9325d5e85cd4c10009d5a5b727819689a559d47c621305837382344bb8c16c78c482e68e414dcaf0dd956b894c85acca1ae8d3b661a", + "0x090b1b80070a297010cca4d2fb3048fe8814f318eb8a6034a339d8e843544f1d1b2930aa108d1bfc505b36919afcd36848860c81ec8b00c0787b390250bfa7e31a", + "0x082b571cbf4c65b2bf5a694234230c0bb2e95c55920e0c050a73027dea6f5535ab0000000000000000000000000000000000000000000000000000000000000000", + "0x082119746c2afd71d1574bea80b47eab52d70db3990cd1c9f6d4df98eaed5c3ff01555b1ad85223923b16c0129d117eb56e12b2c4310ff3014c28b40684e3ea69d", + "0x040d1e80106f23933567a7c4881177b5d6c45a3f319feafe560a28df75769db9ba0101000000000000000000000000000000000000000000000000000000000b33edbfaf14200000000000000000000000000000000000000000000000000000000000000007", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000008": [ + "0x090a47cdf7291bf5686a20e9325d5e85cd4c10009d5a5b727819689a559d47c621305837382344bb8c16c78c482e68e414dcaf0dd956b894c85acca1ae8d3b661a", + "0x0700000000000000000000000000000000000000000000000000000000000000001f63b7a392d1af6e501f653490c2436a2b6ecc4835f91bfc8983aded770a595c", + "0x070ee2ca3e190e48951aa8d5bb00d33ba76a92de69a807dfa6f2eaa9881e303f3226ee193ec0e0368b03645561b95ea6fee2df8bb5f1db80afc64364ec993655f8", + "0x060e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200302bd20972a48695c1c418461cc2124f0c246ad1bb41e1d8d05cd9527784228a", + "0x0412c0c59f64422dd5b7ce259c4aa62e9bf4e2bcc4f0da068e332b9f4e502ba38f01010000000000000000000000000000000000000000000000000000000000174876e800200000000000000000000000000000000000000000000000000000000000000008", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000009": [ + "0x090a47cdf7291bf5686a20e9325d5e85cd4c10009d5a5b727819689a559d47c621305837382344bb8c16c78c482e68e414dcaf0dd956b894c85acca1ae8d3b661a", + "0x0700000000000000000000000000000000000000000000000000000000000000001f63b7a392d1af6e501f653490c2436a2b6ecc4835f91bfc8983aded770a595c", + "0x05", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x5300000000000000000000000000000000000017": { + "0x0000000000000000000000000000000000000000000000000000000000000065": [ + "0x091e6f7e3b2102387b1b88b997f51470252cf226b68be43284a52489de59a2abb0105259f0b8858b399570780c836f31751cc2566ba5935c50b2db952c1020abb0", + "0x091623ed516b763c3dd7bd75be87d3bda3bc50b9909eb6f832c706e2f973246c131bb859e26b23e5d0474d863af33c2a1163103f5881396448cd8ef9cfe18f9b92", + "0x0812bc2e9bd37f44093eb71c7af67706fd9be1a51a828a3d321b792b5490c6ad560e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200", + "0x07290cb26e75385afbd8fce76271781f49ca9f5737fe573f7a121642a43bdba61a04c601c63ad45f2c8c8c8cbe20c788ef63e574ce0e800153c8b0c855dca3c0be", + "0x0702bdcd1f95c7883b7b633e040eb8263e1fb0ab97a3fa5e590f4ba82b29ee3e5a2284968786ddc52459cd3e8be14da7533c8470c63575eaccae28bd65169074f9", + "0x07000000000000000000000000000000000000000000000000000000000000000028bcb7656960130b704e5cd2afdc5bf933752cc290e10ce8de9ff4eeff23fa71", + "0x060bf27252e269c88af00daf8e309f853351131ba9cb56aa8ffdc008546b4eefc9236d89b8a52ce6f920048f57605af94c276903d51b48d2a9549a2d4ce38af1e2", + "0x042115c9b0a0938aa1ce2e8c01581e5aa931288249a453588de70cf2c5dae26a7b0101000072fce9da9f9cca9ae7f43acbcc6060e82ef37152a13cee828b492343ec19eebc200000000000000000000000000000000000000000000000000000000000000065", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0xF78ce1E2f0De8FD15cE6aC4DdeC6982413fda499": { + "0x5e0d7e1282e184ffe8b3e85959d9b377240ad76929ea1bf70a645248a2e47043": [ + "0x0926c0c84d66a0e0131b13135e6ae801ea348c1ee60e89aec73b86e4fc5df34baa1534e5b9e352dcf3db1724551984a990f107c436bd4d80a3726946328b1db61e", + "0x06146c35e7e025806e909bff59b6f979ce70a0361f4c21927654525e61e6fe94642c5531fcb1f5d89ebf48434141bed498aa7fcbda8b8fdaf05553e80047967cc5", + "0x041881e4ad6efc3d1cf315c4dd6e133caea84c182c647660bf44502594ad2c1f3801010000000000000000000000000000000000000000000000000000000000000000004120a7f7d1323a52987879f36312c5073aaaebefb56b07868f38dc16e0fe5a6e3cea", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5e0d7e1282e184ffe8b3e85959d9b377240ad76929ea1bf70a645248a2e47044": [ + "0x0926c0c84d66a0e0131b13135e6ae801ea348c1ee60e89aec73b86e4fc5df34baa1534e5b9e352dcf3db1724551984a990f107c436bd4d80a3726946328b1db61e", + "0x081a94fa31765ffcdf181fbcf86bf15c3b189250f676f68143aaf9d587dfecdb960ff058d1013c8ee7b5a512e60ee9552e15d9781db2966fa03bf6cfbec6b70d6e", + "0x070c950c18bab1185522696011ed57fca69e01b541828d5ff534cbed1938b21ee4016ac634917fc6d3a0f6b79757daec61907b7aedc5f29eda70e92c3d3cca19a4", + "0x081613caa951fc2fafa0087eb7d5a1dfed09a02098063b3343e49c612e7d43d91b0000000000000000000000000000000000000000000000000000000000000000", + "0x060393b6637f65dba38e4cc22851199d78b393b9f21f66654a30897d2189fc455607e59ad0e17aa550b4c22f624e2c71133b519b7a5b569851816790a6c2ee462e", + "0x0416764599b883ebb0c07ee4fd75fbc009e25a6f4a634518187c7e7239cb960fd501010000000000000000000000000000000000000000000000000000000000000000000120411092aa40253bc3a57548e804d0118e38225673267c809e7a24d0ef673c1e36", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xfcc98b12550ae02fe8768b2c7e4ee02016650acc9dc59756f6a48349bed8da79": [ + "0x0926c0c84d66a0e0131b13135e6ae801ea348c1ee60e89aec73b86e4fc5df34baa1534e5b9e352dcf3db1724551984a990f107c436bd4d80a3726946328b1db61e", + "0x081a94fa31765ffcdf181fbcf86bf15c3b189250f676f68143aaf9d587dfecdb960ff058d1013c8ee7b5a512e60ee9552e15d9781db2966fa03bf6cfbec6b70d6e", + "0x040dd2f85e38f58c771c9b9036984d6312d27727ef2654d8c714a0a8360ab4cc0301010000000000000000000000000000000000000000000000000000000000000000004120c6479b83e9785430eb70698cda89562fbf6f1b9f865d224c7be856acc8ff7ae5", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xfdf805a20de3539f66c85b821fef45baff42d32f45a92a9e0b4aa2476c33ec6d": [ + "0x0926c0c84d66a0e0131b13135e6ae801ea348c1ee60e89aec73b86e4fc5df34baa1534e5b9e352dcf3db1724551984a990f107c436bd4d80a3726946328b1db61e", + "0x06146c35e7e025806e909bff59b6f979ce70a0361f4c21927654525e61e6fe94642c5531fcb1f5d89ebf48434141bed498aa7fcbda8b8fdaf05553e80047967cc5", + "0x0402ff3d98d60879a35a5db7d2391babef2157d459d0d3fe39288673e1d095e872010100000000000000000000000000000000000000000000000000000000000000000001209b9b887057e67f014dddce475a6d1228ae8479d9c0a14dc111f4e71032020c24", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + } + } + }, + "codes": [ + { + "codeSize": 0, + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "code": "0x" + }, + { + "codeSize": 7677, + "keccakCodeHash": "0x04ebeb19827e292abcff3ed0df7e0643f284c1a3a1be79552f95e2d68f273404", + "hash": "0x290a6dffbef8eab27533357244828872617f855e589938736a13aa522e946bd5", + "code": "0x608060405234801561000f575f80fd5b506004361061009c575f3560e01c8063637bd16411610064578063637bd1641461019057806365207521146101c05780638a59e100146101f05780638f527e9414610220578063dbd81bc71461023e5761009c565b80630c8f3129146100a057806321ceca81146100d0578063447a4c62146101005780635e109b571461013057806363138d4f14610160575b5f80fd5b6100ba60048036038101906100b59190611296565b61026e565b6040516100c791906112f7565b60405180910390f35b6100ea60048036038101906100e591906113ae565b6103ad565b6040516100f79190611455565b60405180910390f35b61011a600480360381019061011591906114a8565b610460565b60405161012791906112f7565b60405180910390f35b61014a600480360381019061014591906113ae565b61075f565b60405161015791906112f7565b60405180910390f35b61017a60048036038101906101759190611296565b610770565b60405161018791906112f7565b60405180910390f35b6101aa60048036038101906101a591906113ae565b6108af565b6040516101b791906112f7565b60405180910390f35b6101da60048036038101906101d59190611296565b6108c0565b6040516101e791906112f7565b60405180910390f35b61020a600480360381019061020591906114d3565b610a50565b60405161021791906112f7565b60405180910390f35b610228610d94565b6040516102359190611455565b60405180910390f35b610258600480360381019061025391906113ae565b610fbc565b60405161026591906112f7565b60405180910390f35b5f8061027a8351610ff0565b60405160200161028a91906115b1565b60405160208183030381529060405290505f80600373ffffffffffffffffffffffffffffffffffffffff16856040516102c3919061160c565b5f60405180830381855afa9150503d805f81146102fb576040519150601f19603f3d011682016040523d82523d5f602084013e610300565b606091505b5091509150815f846040516103159190611622565b90815260200160405180910390205f6101000a81548160ff0219169083151502179055508060018460405161034a9190611622565b908152602001604051809103902090816103649190611832565b507ffafe735b5fe8b90ced311e90adbc382883d7ed521d7a3d16541de0ff8d44c0018383834260405161039a9493929190611958565b60405180910390a1819350505050919050565b6001818051602081018201805184825260208301602085012081835280955050505050505f9150905080546103e190611665565b80601f016020809104026020016040519081016040528092919081815260200182805461040d90611665565b80156104585780601f1061042f57610100808354040283529160200191610458565b820191905f5260205f20905b81548152906001019060200180831161043b57829003601f168201915b505050505081565b5f8061046b83610ff0565b60405160200161047b91906119f3565b60405160208183030381529060405290505f60c08461049a9190611a41565b67ffffffffffffffff8111156104b3576104b2611172565b5b6040519080825280601f01601f1916602001820160405280156104e55781602001600182028036833780820191505090505b5090505f5b8481101561064b575f60c0826105009190611a41565b905060018261050f9190611a82565b60f81b83601f836105209190611a82565b8151811061053157610530611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060028261056c9190611a82565b60f81b836040601f8461057f9190611a82565b6105899190611a82565b8151811061059a57610599611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053506003826105d59190611a82565b60f81b8360206040601f856105ea9190611a82565b6105f49190611a82565b6105fe9190611a82565b8151811061060f5761060e611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505080806001019150506104ea565b505f80600873ffffffffffffffffffffffffffffffffffffffff1683604051610674919061160c565b5f60405180830381855afa9150503d805f81146106ac576040519150601f19603f3d011682016040523d82523d5f602084013e6106b1565b606091505b5091509150815f856040516106c69190611622565b90815260200160405180910390205f6101000a81548160ff021916908315150217905550806001856040516106fb9190611622565b908152602001604051809103902090816107159190611832565b507ffafe735b5fe8b90ced311e90adbc382883d7ed521d7a3d16541de0ff8d44c0018483834260405161074b9493929190611958565b60405180910390a181945050505050919050565b5f61076982610770565b9050919050565b5f8061077c8351610ff0565b60405160200161078c9190611b2c565b60405160208183030381529060405290505f80600273ffffffffffffffffffffffffffffffffffffffff16856040516107c5919061160c565b5f60405180830381855afa9150503d805f81146107fd576040519150601f19603f3d011682016040523d82523d5f602084013e610802565b606091505b5091509150815f846040516108179190611622565b90815260200160405180910390205f6101000a81548160ff0219169083151502179055508060018460405161084c9190611622565b908152602001604051809103902090816108669190611832565b507ffafe735b5fe8b90ced311e90adbc382883d7ed521d7a3d16541de0ff8d44c0018383834260405161089c9493929190611958565b60405180910390a1819350505050919050565b5f6108b98261026e565b9050919050565b5f60d5825114610905576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fc90611bbd565b60405180910390fd5b5f6040518060400160405280600781526020017f426c616b6532460000000000000000000000000000000000000000000000000081525090505f80600973ffffffffffffffffffffffffffffffffffffffff1685604051610966919061160c565b5f60405180830381855afa9150503d805f811461099e576040519150601f19603f3d011682016040523d82523d5f602084013e6109a3565b606091505b5091509150815f846040516109b89190611622565b90815260200160405180910390205f6101000a81548160ff021916908315150217905550806001846040516109ed9190611622565b90815260200160405180910390209081610a079190611832565b507ffafe735b5fe8b90ced311e90adbc382883d7ed521d7a3d16541de0ff8d44c00183838342604051610a3d9493929190611958565b60405180910390a1819350505050919050565b5f80610a5b85610ff0565b610a6485610ff0565b610a6d85610ff0565b604051602001610a7f93929190611c6f565b60405160208183030381529060405290505f8385876060610aa09190611a82565b610aaa9190611a82565b610ab49190611a82565b67ffffffffffffffff811115610acd57610acc611172565b5b6040519080825280601f01601f191660200182016040528015610aff5781602001600182028036833780820191505090505b5090505f865f1b90505f865f1b90505f865f1b90508260208501528160408501528060608501525f891115610b8d57600760f81b8460018b6060610b439190611a82565b610b4d9190611cc0565b81518110610b5e57610b5d611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505b5f881115610bff57600360f81b8460018a8c6060610bab9190611a82565b610bb59190611a82565b610bbf9190611cc0565b81518110610bd057610bcf611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505b5f871115610c7c57601160f81b846001898b8d6060610c1e9190611a82565b610c289190611a82565b610c329190611a82565b610c3c9190611cc0565b81518110610c4d57610c4c611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505b5f80600573ffffffffffffffffffffffffffffffffffffffff1686604051610ca4919061160c565b5f60405180830381855afa9150503d805f8114610cdc576040519150601f19603f3d011682016040523d82523d5f602084013e610ce1565b606091505b5091509150815f88604051610cf69190611622565b90815260200160405180910390205f6101000a81548160ff02191690831515021790555080600188604051610d2b9190611622565b90815260200160405180910390209081610d459190611832565b507ffafe735b5fe8b90ced311e90adbc382883d7ed521d7a3d16541de0ff8d44c00187838342604051610d7b9493929190611958565b60405180910390a1819750505050505050509392505050565b60605f60d567ffffffffffffffff811115610db257610db1611172565b5b6040519080825280601f01601f191660200182016040528015610de45781602001600182028036833780820191505090505b5090505f60f81b815f81518110610dfe57610dfd611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f60f81b81600181518110610e4457610e43611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f60f81b81600281518110610e8a57610e89611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600c60f81b81600381518110610ed157610ed0611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f600490505b60d4811015610f6d5761010081610f1c9190611d20565b60f81b828281518110610f3257610f31611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053508080600101915050610f05565b50600160f81b8160d481518110610f8757610f86611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053508091505090565b5f818051602081018201805184825260208301602085012081835280955050505050505f915054906101000a900460ff1681565b60605f8203611036576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611144565b5f8290505f5b5f821461106557808061104e90611d50565b915050600a8261105e9190611d97565b915061103c565b5f8167ffffffffffffffff8111156110805761107f611172565b5b6040519080825280601f01601f1916602001820160405280156110b25781602001600182028036833780820191505090505b5090505b5f851461113d576001826110ca9190611cc0565b9150600a856110d99190611d20565b60306110e59190611a82565b60f81b8183815181106110fb576110fa611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a856111369190611d97565b94506110b6565b8093505050505b919050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6111a882611162565b810181811067ffffffffffffffff821117156111c7576111c6611172565b5b80604052505050565b5f6111d9611149565b90506111e5828261119f565b919050565b5f67ffffffffffffffff82111561120457611203611172565b5b61120d82611162565b9050602081019050919050565b828183375f83830152505050565b5f61123a611235846111ea565b6111d0565b9050828152602081018484840111156112565761125561115e565b5b61126184828561121a565b509392505050565b5f82601f83011261127d5761127c61115a565b5b813561128d848260208601611228565b91505092915050565b5f602082840312156112ab576112aa611152565b5b5f82013567ffffffffffffffff8111156112c8576112c7611156565b5b6112d484828501611269565b91505092915050565b5f8115159050919050565b6112f1816112dd565b82525050565b5f60208201905061130a5f8301846112e8565b92915050565b5f67ffffffffffffffff82111561132a57611329611172565b5b61133382611162565b9050602081019050919050565b5f61135261134d84611310565b6111d0565b90508281526020810184848401111561136e5761136d61115e565b5b61137984828561121a565b509392505050565b5f82601f8301126113955761139461115a565b5b81356113a5848260208601611340565b91505092915050565b5f602082840312156113c3576113c2611152565b5b5f82013567ffffffffffffffff8111156113e0576113df611156565b5b6113ec84828501611381565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f611427826113f5565b61143181856113ff565b935061144181856020860161140f565b61144a81611162565b840191505092915050565b5f6020820190508181035f83015261146d818461141d565b905092915050565b5f819050919050565b61148781611475565b8114611491575f80fd5b50565b5f813590506114a28161147e565b92915050565b5f602082840312156114bd576114bc611152565b5b5f6114ca84828501611494565b91505092915050565b5f805f606084860312156114ea576114e9611152565b5b5f6114f786828701611494565b935050602061150886828701611494565b925050604061151986828701611494565b9150509250925092565b5f81905092915050565b7f524950454d443136305f000000000000000000000000000000000000000000005f82015250565b5f611561600a83611523565b915061156c8261152d565b600a82019050919050565b5f81519050919050565b5f61158b82611577565b6115958185611523565b93506115a581856020860161140f565b80840191505092915050565b5f6115bb82611555565b91506115c78284611581565b915081905092915050565b5f81905092915050565b5f6115e6826113f5565b6115f081856115d2565b935061160081856020860161140f565b80840191505092915050565b5f61161782846115dc565b915081905092915050565b5f61162d8284611581565b915081905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061167c57607f821691505b60208210810361168f5761168e611638565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026116f17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826116b6565b6116fb86836116b6565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61173661173161172c84611475565b611713565b611475565b9050919050565b5f819050919050565b61174f8361171c565b61176361175b8261173d565b8484546116c2565b825550505050565b5f90565b61177761176b565b611782818484611746565b505050565b5b818110156117a55761179a5f8261176f565b600181019050611788565b5050565b601f8211156117ea576117bb81611695565b6117c4846116a7565b810160208510156117d3578190505b6117e76117df856116a7565b830182611787565b50505b505050565b5f82821c905092915050565b5f61180a5f19846008026117ef565b1980831691505092915050565b5f61182283836117fb565b9150826002028217905092915050565b61183b826113f5565b67ffffffffffffffff81111561185457611853611172565b5b61185e8254611665565b6118698282856117a9565b5f60209050601f83116001811461189a575f8415611888578287015190505b6118928582611817565b8655506118f9565b601f1984166118a886611695565b5f5b828110156118cf578489015182556001820191506020850194506020810190506118aa565b868310156118ec57848901516118e8601f8916826117fb565b8355505b6001600288020188555050505b505050505050565b5f82825260208201905092915050565b5f61191b82611577565b6119258185611901565b935061193581856020860161140f565b61193e81611162565b840191505092915050565b61195281611475565b82525050565b5f6080820190508181035f8301526119708187611911565b905061197f60208301866112e8565b8181036040830152611991818561141d565b90506119a06060830184611949565b95945050505050565b7f50616972696e675f0000000000000000000000000000000000000000000000005f82015250565b5f6119dd600883611523565b91506119e8826119a9565b600882019050919050565b5f6119fd826119d1565b9150611a098284611581565b915081905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611a4b82611475565b9150611a5683611475565b9250828202611a6481611475565b91508282048414831517611a7b57611a7a611a14565b5b5092915050565b5f611a8c82611475565b9150611a9783611475565b9250828201905080821115611aaf57611aae611a14565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f5348413235365f000000000000000000000000000000000000000000000000005f82015250565b5f611b16600783611523565b9150611b2182611ae2565b600782019050919050565b5f611b3682611b0a565b9150611b428284611581565b915081905092915050565b7f426c616b6532662072657175697265732065786163746c7920323133206279745f8201527f657320696e707574000000000000000000000000000000000000000000000000602082015250565b5f611ba7602883611901565b9150611bb282611b4d565b604082019050919050565b5f6020820190508181035f830152611bd481611b9b565b9050919050565b7f4d6f644578705f000000000000000000000000000000000000000000000000005f82015250565b5f611c0f600783611523565b9150611c1a82611bdb565b600782019050919050565b7f5f000000000000000000000000000000000000000000000000000000000000005f82015250565b5f611c59600183611523565b9150611c6482611c25565b600182019050919050565b5f611c7982611c03565b9150611c858286611581565b9150611c9082611c4d565b9150611c9c8285611581565b9150611ca782611c4d565b9150611cb38284611581565b9150819050949350505050565b5f611cca82611475565b9150611cd583611475565b9250828203905081811115611ced57611cec611a14565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f611d2a82611475565b9150611d3583611475565b925082611d4557611d44611cf3565b5b828206905092915050565b5f611d5a82611475565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611d8c57611d8b611a14565b5b600182019050919050565b5f611da182611475565b9150611dac83611475565b925082611dbc57611dbb611cf3565b5b82820490509291505056fea264697066735822122005118c223c12b158349613416fd6342abd507776ce6306cce1e9a99fa8e7b9bb64736f6c634300081a0033" + } + ], + "txStorageTraces": [ + { + "rootBefore": "0x2ae6666bcca6b4e72819d44bba819a3f37f015d6e1df579f84847e3ee7c55f3e", + "rootAfter": "0x2e3a128bf02f699263d560a2dea15c40daeb046e981f89576b9b7ba0fc98238f", + "proofs": { + "0x0000000000000000000000000000000000000009": [ + "0x091d6fc08d1b0ca1c242ea9feb4922cccacd60d303b5ee492db8f32a0568f2a8742d77f0dd9bbdc44acce00f7ab1067709208957504f8664b75b5a2fa79d88b04f", + "0x090da7e7e9bae076de85c6a3fda89a4ffbc236691d421cab3ce955f6fdd66cca9721ce6c2b4fc04e5bbc357f842c54e831f0b05dcd1f6227ab01b2c1a66727e0f8", + "0x09104f87b11816f6619611fbd4dfb6b8425a675325a61e91a29346b0adeca37af01f40d7cbd6801e32eea2e73ae37a3e6a9c612c17eacd5ee7f9e54e3064af68ed", + "0x0923887f7f2b818306eb521f1c9a28fa1180772e0603e778536d3bd047562df33521b0c8c03e0e8783c187c12a2309a02be178b53f86ad845a9a2d0f82d342a027", + "0x0921db0def816c47288e31e114f2d320d1bef10a2ce0ed76f2333bfbaf4c9665df164af8117b30ef75c3a4e008ea19aceaa6e63940ecf5e5a545aab0906e772f19", + "0x090bdf939207e635077a89f39556cd58b57a5b91f7dd98c575665e30da373293ab236ab274f709263510668e66c2e8aec6dd013ed3aa1f7c3c188942b60cbaa671", + "0x090a9b9eb0eaf92b6a5a4eaff4b1191ae18e79672e5faab8e28bc34463f1da8827087e533a51344d20f09abcff595055b7ffd063e9f2513dd6fb7d2b48743d5932", + "0x09155c6820bbd72e6d877fb66c92c324f732982dbcd484cb746afd208a49ee2ef216fd2ec563dc9c533f9e8f40d08d2c6e1c80cfacc72bff908d529eaa3aed14af", + "0x062419360621da4f6d65940dc43995755d1b17b08f311067fc2e47614ed451b0970fb518201f9a11f33d4128782669aefb52a0d29954cdcbf190c597f1b0a1a88f", + "0x04105403da6918e91208c94938cb8af9bcab94ef192f175bbd5a4759e4e46a0d700508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c621c5d486a08000000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420cae036ce53831e56043108b3ef9444d95464cfde000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x716170D0687c3d31CC10DebE0dAa1DDD3FE3D792": [ + "0x091d6fc08d1b0ca1c242ea9feb4922cccacd60d303b5ee492db8f32a0568f2a8742d77f0dd9bbdc44acce00f7ab1067709208957504f8664b75b5a2fa79d88b04f", + "0x090da7e7e9bae076de85c6a3fda89a4ffbc236691d421cab3ce955f6fdd66cca9721ce6c2b4fc04e5bbc357f842c54e831f0b05dcd1f6227ab01b2c1a66727e0f8", + "0x09104f87b11816f6619611fbd4dfb6b8425a675325a61e91a29346b0adeca37af01f40d7cbd6801e32eea2e73ae37a3e6a9c612c17eacd5ee7f9e54e3064af68ed", + "0x0901ae383d775a5593e8a9c58ec5e32d5b37296baa0363f05956ce31e20bf28f360aafacd4fa6a4af2e76345dcd258001d8525e1f0b15de72aa184708588a2e35a", + "0x092b26192ebc81162aa68594a054c44db6465a42a82afa2a88ea3a15f1d179742e2ab45becdac9b9922102afd7064f345952b290760a3f989808dca99c2d06130d", + "0x0912f32fcd87faa8889ff2b91d786a0ef976de3b5553d5284f8cbd6e9729bd31aa2d78b77cb674d0a4807418dde4894fe02131f6b5cd6e55564ee31e6fd152366f", + "0x0929be597731cca26d8264df590bb5eb3bbcb0549c210ccce091381bea0a5ed92916c1f547c1b4befd140ad0df5148954ea9b8d316a3f30ac487b9828137d575e5", + "0x09298da2e6f54d728445d34319cf317db690b4458e1cc40328ef50785d552a54e11368c01d16ad1cc931152eed082219375b88fbc1954e7d02321f331b2cc73035", + "0x0905a84a34349628360a471a26d87e83b5cb22108b4e512f899ff26456556e9c7a23387b834374c9e0fd3988025e271787762722d7377318a033a72c1262e73f07", + "0x0700000000000000000000000000000000000000000000000000000000000000002132a384e0b749578e04b225ddc5fe7993e9ad939472707b779b39316ef5101b", + "0x0921ddfb4b9e43ab809479c10047a21a49a811c5ba8cc53280e5d7502943c0030d2ec37a3eaab5531f679ae7b47970a9db6180c2464b5007f79d01c3ba1af7abf1", + "0x0603352201e9677453b2cfc7b12ba1f3e0cf320de57c0beb28e671d437e336fbbb04f6276c48cec8cdf8fe675b19d5cb173b53fca9d0c8f4e0b2015528dc843fcf", + "0x0414b0bb4090afcdae623b69d996022ea82c221cd1a3c00c5b13acb37d750f87fc0508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002bfc76c41ecba6eb0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420716170d0687c3d31cc10debe0daa1ddd3fe3d792000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xF78ce1E2f0De8FD15cE6aC4DdeC6982413fda499": [ + "0x091d6fc08d1b0ca1c242ea9feb4922cccacd60d303b5ee492db8f32a0568f2a8742d77f0dd9bbdc44acce00f7ab1067709208957504f8664b75b5a2fa79d88b04f", + "0x090da7e7e9bae076de85c6a3fda89a4ffbc236691d421cab3ce955f6fdd66cca9721ce6c2b4fc04e5bbc357f842c54e831f0b05dcd1f6227ab01b2c1a66727e0f8", + "0x0915588127e13317eac2a90561a4bbce9529db0b5fcfb87d1aa7364994db6f638d007f89220807403164fd521d78dc5244d8b1e74320055a60d4f8a3755c80dee8", + "0x09128aa2ec49bb12c10c7ee13d60415e9433d9b779a2a5c7d6ab9d49dd320d434127b48395b98d9dee704b606911b11f95fc96160e498e19fbcf3ecc069e0a768e", + "0x09222c59fb203c2136a3a186f2913505e1ca71f725701fddec9401ac0c19878ada24be1a9aa08adbc8ba1e71b30f38c299058e853fbe93cee09c566afe37c96d12", + "0x092c5da8e3201d802213ef792f56e2215c4ec5dddeeca3994478c4dfe0a630aa962c06a687e38230484a4b6da57e9789bd2b162494b8996940dde8f76be97e18e9", + "0x092b2b83d6a3c43e9d5d74c102989fc1a6e8919c861f1f883358c726154395ab9021436af3496f9659fecbe04997c9f3f424bd376d5194fef20e1679b4d55f3ea4", + "0x0928dfb159dc353f8078c4363538a58a9fa9d7752e3fcf7d8ceddc08c11b51d15e19d66853551b5572832ff2b8fb72db53abe9fd30f56d6234918b51b1a50d3e75", + "0x0705f62a2631030f319cc83d3aed31907f893959137f58b48b7b3e8c22d877ea3716ef7145a610c21838e72d9d113e968ad41ab9c59e0a35633ddc5352d1867bd4", + "0x0802c74dd49b7efb1838742c4bd723baf03c7213fd6451541830a55b1a8a4b97f80000000000000000000000000000000000000000000000000000000000000000", + "0x08200b133820811eae273851524cd4b4286bfe2c1952baf7add3cea76fd28f55c30000000000000000000000000000000000000000000000000000000000000000", + "0x062dedb44952879016a484230de4935598f46859023d2b5c59b5839a54694766630e8e9abd7780da5da2ef86496348acf63857300969c2e704a31e7ea401be45f7", + "0x040dc14d1e73c0c578e5be438abfab5d1a47a0eef96e1d759f6997244869c1011205080000000000000000000000000000000000000000000000001dfd000000000000000100000000000000000000000000000000000000000000000000000000000000000f98ed2e0091c1dcd5e8881666d11fc23b8d3bff6db63078ff41db71965f5b6d04ebeb19827e292abcff3ed0df7e0643f284c1a3a1be79552f95e2d68f273404290a6dffbef8eab27533357244828872617f855e589938736a13aa522e946bd520f78ce1e2f0de8fd15ce6ac4ddec6982413fda499000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266": [ + "0x091d6fc08d1b0ca1c242ea9feb4922cccacd60d303b5ee492db8f32a0568f2a8742d77f0dd9bbdc44acce00f7ab1067709208957504f8664b75b5a2fa79d88b04f", + "0x090da7e7e9bae076de85c6a3fda89a4ffbc236691d421cab3ce955f6fdd66cca9721ce6c2b4fc04e5bbc357f842c54e831f0b05dcd1f6227ab01b2c1a66727e0f8", + "0x0915588127e13317eac2a90561a4bbce9529db0b5fcfb87d1aa7364994db6f638d007f89220807403164fd521d78dc5244d8b1e74320055a60d4f8a3755c80dee8", + "0x09128aa2ec49bb12c10c7ee13d60415e9433d9b779a2a5c7d6ab9d49dd320d434127b48395b98d9dee704b606911b11f95fc96160e498e19fbcf3ecc069e0a768e", + "0x09222c59fb203c2136a3a186f2913505e1ca71f725701fddec9401ac0c19878ada24be1a9aa08adbc8ba1e71b30f38c299058e853fbe93cee09c566afe37c96d12", + "0x092c5da8e3201d802213ef792f56e2215c4ec5dddeeca3994478c4dfe0a630aa962c06a687e38230484a4b6da57e9789bd2b162494b8996940dde8f76be97e18e9", + "0x092b2b83d6a3c43e9d5d74c102989fc1a6e8919c861f1f883358c726154395ab9021436af3496f9659fecbe04997c9f3f424bd376d5194fef20e1679b4d55f3ea4", + "0x091a2e42b984a6b38ac4cee46e54d20e4b5333e29262d465ec5d3f94bdf62986bf296a1e25050d195d3b4699a0da27135a9fc8e49ec8f4dfa98038b7d6ae774826", + "0x080bb10865c33ea20a22c7941fc0a096301c98873d56148c6e8fea9b6e70fc3d2409b11876e7719db807b8d2c600e5babd3239cf90972e0301a6b204796f78205d", + "0x0811f12781b367fe7f10a9080a169e9419d7e19a5e8372ec4ed7e4d100f772054d0000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000000b07218665f37f37b6d95bd589c908f68d992080a49912641ace09e8b78b85bc", + "0x062febdf23bcdd8a95c606e8e55c203c581bd01d6346d31d231a225babe5b3fa061dd09d967fa39b772f3fa838f3d9d63ab3cac97964be50bf0bbce7053209285c", + "0x040d972511ec05ac7e25d155e7d292ab9a61b2227df344cd0eabfeff6f423c64d205080000000000000000000000000000000000000000000000000000000000000000087c000000000000000000000000000000000000000000000655cea7342d120ce11d0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420f39fd6e51aad88f6f4ce6ab8827279cfffb92266000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "storageProofs": { + "0xF78ce1E2f0De8FD15cE6aC4DdeC6982413fda499": { + "0x5e0d7e1282e184ffe8b3e85959d9b377240ad76929ea1bf70a645248a2e47043": [ + "0x0926c0c84d66a0e0131b13135e6ae801ea348c1ee60e89aec73b86e4fc5df34baa1534e5b9e352dcf3db1724551984a990f107c436bd4d80a3726946328b1db61e", + "0x06146c35e7e025806e909bff59b6f979ce70a0361f4c21927654525e61e6fe94642c5531fcb1f5d89ebf48434141bed498aa7fcbda8b8fdaf05553e80047967cc5", + "0x041881e4ad6efc3d1cf315c4dd6e133caea84c182c647660bf44502594ad2c1f3801010000000000000000000000000000000000000000000000000000000000000000004120a7f7d1323a52987879f36312c5073aaaebefb56b07868f38dc16e0fe5a6e3cea", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5e0d7e1282e184ffe8b3e85959d9b377240ad76929ea1bf70a645248a2e47044": [ + "0x0926c0c84d66a0e0131b13135e6ae801ea348c1ee60e89aec73b86e4fc5df34baa1534e5b9e352dcf3db1724551984a990f107c436bd4d80a3726946328b1db61e", + "0x081a94fa31765ffcdf181fbcf86bf15c3b189250f676f68143aaf9d587dfecdb960ff058d1013c8ee7b5a512e60ee9552e15d9781db2966fa03bf6cfbec6b70d6e", + "0x070c950c18bab1185522696011ed57fca69e01b541828d5ff534cbed1938b21ee4016ac634917fc6d3a0f6b79757daec61907b7aedc5f29eda70e92c3d3cca19a4", + "0x081613caa951fc2fafa0087eb7d5a1dfed09a02098063b3343e49c612e7d43d91b0000000000000000000000000000000000000000000000000000000000000000", + "0x060393b6637f65dba38e4cc22851199d78b393b9f21f66654a30897d2189fc455607e59ad0e17aa550b4c22f624e2c71133b519b7a5b569851816790a6c2ee462e", + "0x0416764599b883ebb0c07ee4fd75fbc009e25a6f4a634518187c7e7239cb960fd501010000000000000000000000000000000000000000000000000000000000000000000120411092aa40253bc3a57548e804d0118e38225673267c809e7a24d0ef673c1e36", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xfcc98b12550ae02fe8768b2c7e4ee02016650acc9dc59756f6a48349bed8da79": [ + "0x0926c0c84d66a0e0131b13135e6ae801ea348c1ee60e89aec73b86e4fc5df34baa1534e5b9e352dcf3db1724551984a990f107c436bd4d80a3726946328b1db61e", + "0x081a94fa31765ffcdf181fbcf86bf15c3b189250f676f68143aaf9d587dfecdb960ff058d1013c8ee7b5a512e60ee9552e15d9781db2966fa03bf6cfbec6b70d6e", + "0x040dd2f85e38f58c771c9b9036984d6312d27727ef2654d8c714a0a8360ab4cc0301010000000000000000000000000000000000000000000000000000000000000000004120c6479b83e9785430eb70698cda89562fbf6f1b9f865d224c7be856acc8ff7ae5", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xfdf805a20de3539f66c85b821fef45baff42d32f45a92a9e0b4aa2476c33ec6d": [ + "0x0926c0c84d66a0e0131b13135e6ae801ea348c1ee60e89aec73b86e4fc5df34baa1534e5b9e352dcf3db1724551984a990f107c436bd4d80a3726946328b1db61e", + "0x06146c35e7e025806e909bff59b6f979ce70a0361f4c21927654525e61e6fe94642c5531fcb1f5d89ebf48434141bed498aa7fcbda8b8fdaf05553e80047967cc5", + "0x0402ff3d98d60879a35a5db7d2391babef2157d459d0d3fe39288673e1d095e872010100000000000000000000000000000000000000000000000000000000000000000001209b9b887057e67f014dddce475a6d1228ae8479d9c0a14dc111f4e71032020c24", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + } + } + } + ], + "executionResults": [ + { + "l1DataFee": "0x11ecafbb16b", + "gas": 120644, + "failed": false, + "returnValue": "0000000000000000000000000000000000000000000000000000000000000001", + "from": { + "address": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "nonce": 2172, + "balance": "0x655cea7342d120ce11d", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + "to": { + "address": "0xf78ce1e2f0de8fd15ce6ac4ddec6982413fda499", + "nonce": 1, + "balance": "0x0", + "keccakCodeHash": "0x04ebeb19827e292abcff3ed0df7e0643f284c1a3a1be79552f95e2d68f273404", + "poseidonCodeHash": "0x290a6dffbef8eab27533357244828872617f855e589938736a13aa522e946bd5", + "codeSize": 7677 + }, + "accountAfter": [ + { + "address": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "nonce": 2173, + "balance": "0x655cea732f2301fd6b2", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + { + "address": "0xf78ce1e2f0de8fd15ce6ac4ddec6982413fda499", + "nonce": 1, + "balance": "0x0", + "keccakCodeHash": "0x04ebeb19827e292abcff3ed0df7e0643f284c1a3a1be79552f95e2d68f273404", + "poseidonCodeHash": "0x290a6dffbef8eab27533357244828872617f855e589938736a13aa522e946bd5", + "codeSize": 7677 + }, + { + "address": "0x716170d0687c3d31cc10debe0daa1ddd3fe3d792", + "nonce": 0, + "balance": "0x2bfc77ff00b8b156", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + } + ], + "structLogs": [ + { + "pc": 0, + "op": "PUSH1", + "gas": 95884, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2, + "op": "PUSH1", + "gas": 95881, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4, + "op": "MSTORE", + "gas": 95878, + "gasCost": 12, + "depth": 1 + }, + { + "pc": 5, + "op": "CALLVALUE", + "gas": 95866, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6, + "op": "DUP1", + "gas": 95864, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7, + "op": "ISZERO", + "gas": 95861, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 8, + "op": "PUSH2", + "gas": 95858, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 11, + "op": "JUMPI", + "gas": 95855, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 15, + "op": "JUMPDEST", + "gas": 95845, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 16, + "op": "POP", + "gas": 95844, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 17, + "op": "PUSH1", + "gas": 95842, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 19, + "op": "CALLDATASIZE", + "gas": 95839, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 20, + "op": "LT", + "gas": 95837, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 21, + "op": "PUSH2", + "gas": 95834, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 24, + "op": "JUMPI", + "gas": 95831, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 25, + "op": "PUSH0", + "gas": 95821, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 26, + "op": "CALLDATALOAD", + "gas": 95819, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 27, + "op": "PUSH1", + "gas": 95816, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 29, + "op": "SHR", + "gas": 95813, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 30, + "op": "DUP1", + "gas": 95810, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 31, + "op": "PUSH4", + "gas": 95807, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 36, + "op": "GT", + "gas": 95804, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 37, + "op": "PUSH2", + "gas": 95801, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 40, + "op": "JUMPI", + "gas": 95798, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 41, + "op": "DUP1", + "gas": 95788, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 42, + "op": "PUSH4", + "gas": 95785, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 47, + "op": "EQ", + "gas": 95782, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 48, + "op": "PUSH2", + "gas": 95779, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 51, + "op": "JUMPI", + "gas": 95776, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 52, + "op": "DUP1", + "gas": 95766, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 53, + "op": "PUSH4", + "gas": 95763, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 58, + "op": "EQ", + "gas": 95760, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 59, + "op": "PUSH2", + "gas": 95757, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 62, + "op": "JUMPI", + "gas": 95754, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 448, + "op": "JUMPDEST", + "gas": 95744, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 449, + "op": "PUSH2", + "gas": 95743, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 452, + "op": "PUSH1", + "gas": 95740, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 454, + "op": "DUP1", + "gas": 95737, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 455, + "op": "CALLDATASIZE", + "gas": 95734, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 456, + "op": "SUB", + "gas": 95732, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 457, + "op": "DUP2", + "gas": 95729, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 458, + "op": "ADD", + "gas": 95726, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 459, + "op": "SWAP1", + "gas": 95723, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 460, + "op": "PUSH2", + "gas": 95720, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 463, + "op": "SWAP2", + "gas": 95717, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 464, + "op": "SWAP1", + "gas": 95714, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 465, + "op": "PUSH2", + "gas": 95711, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 468, + "op": "JUMP", + "gas": 95708, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4758, + "op": "JUMPDEST", + "gas": 95700, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4759, + "op": "PUSH0", + "gas": 95699, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4760, + "op": "PUSH1", + "gas": 95697, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4762, + "op": "DUP3", + "gas": 95694, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4763, + "op": "DUP5", + "gas": 95691, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4764, + "op": "SUB", + "gas": 95688, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4765, + "op": "SLT", + "gas": 95685, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4766, + "op": "ISZERO", + "gas": 95682, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4767, + "op": "PUSH2", + "gas": 95679, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4770, + "op": "JUMPI", + "gas": 95676, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4779, + "op": "JUMPDEST", + "gas": 95666, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4780, + "op": "PUSH0", + "gas": 95665, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4781, + "op": "DUP3", + "gas": 95663, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4782, + "op": "ADD", + "gas": 95660, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4783, + "op": "CALLDATALOAD", + "gas": 95657, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4784, + "op": "PUSH8", + "gas": 95654, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4793, + "op": "DUP2", + "gas": 95651, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4794, + "op": "GT", + "gas": 95648, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4795, + "op": "ISZERO", + "gas": 95645, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4796, + "op": "PUSH2", + "gas": 95642, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4799, + "op": "JUMPI", + "gas": 95639, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4808, + "op": "JUMPDEST", + "gas": 95629, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4809, + "op": "PUSH2", + "gas": 95628, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4812, + "op": "DUP5", + "gas": 95625, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4813, + "op": "DUP3", + "gas": 95622, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4814, + "op": "DUP6", + "gas": 95619, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4815, + "op": "ADD", + "gas": 95616, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4816, + "op": "PUSH2", + "gas": 95613, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4819, + "op": "JUMP", + "gas": 95610, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4713, + "op": "JUMPDEST", + "gas": 95602, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4714, + "op": "PUSH0", + "gas": 95601, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4715, + "op": "DUP3", + "gas": 95599, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4716, + "op": "PUSH1", + "gas": 95596, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4718, + "op": "DUP4", + "gas": 95593, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4719, + "op": "ADD", + "gas": 95590, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4720, + "op": "SLT", + "gas": 95587, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4721, + "op": "PUSH2", + "gas": 95584, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4724, + "op": "JUMPI", + "gas": 95581, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4733, + "op": "JUMPDEST", + "gas": 95571, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4734, + "op": "DUP2", + "gas": 95570, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4735, + "op": "CALLDATALOAD", + "gas": 95567, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4736, + "op": "PUSH2", + "gas": 95564, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4739, + "op": "DUP5", + "gas": 95561, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4740, + "op": "DUP3", + "gas": 95558, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4741, + "op": "PUSH1", + "gas": 95555, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4743, + "op": "DUP7", + "gas": 95552, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4744, + "op": "ADD", + "gas": 95549, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4745, + "op": "PUSH2", + "gas": 95546, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4748, + "op": "JUMP", + "gas": 95543, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4648, + "op": "JUMPDEST", + "gas": 95535, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4649, + "op": "PUSH0", + "gas": 95534, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4650, + "op": "PUSH2", + "gas": 95532, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4653, + "op": "PUSH2", + "gas": 95529, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4656, + "op": "DUP5", + "gas": 95526, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4657, + "op": "PUSH2", + "gas": 95523, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4660, + "op": "JUMP", + "gas": 95520, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4586, + "op": "JUMPDEST", + "gas": 95512, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4587, + "op": "PUSH0", + "gas": 95511, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4588, + "op": "PUSH8", + "gas": 95509, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4597, + "op": "DUP3", + "gas": 95506, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4598, + "op": "GT", + "gas": 95503, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4599, + "op": "ISZERO", + "gas": 95500, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4600, + "op": "PUSH2", + "gas": 95497, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4603, + "op": "JUMPI", + "gas": 95494, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4612, + "op": "JUMPDEST", + "gas": 95484, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4613, + "op": "PUSH2", + "gas": 95483, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4616, + "op": "DUP3", + "gas": 95480, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4617, + "op": "PUSH2", + "gas": 95477, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4620, + "op": "JUMP", + "gas": 95474, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4450, + "op": "JUMPDEST", + "gas": 95466, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4451, + "op": "PUSH0", + "gas": 95465, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4452, + "op": "PUSH1", + "gas": 95463, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4454, + "op": "NOT", + "gas": 95460, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4455, + "op": "PUSH1", + "gas": 95457, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4457, + "op": "DUP4", + "gas": 95454, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4458, + "op": "ADD", + "gas": 95451, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4459, + "op": "AND", + "gas": 95448, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4460, + "op": "SWAP1", + "gas": 95445, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4461, + "op": "POP", + "gas": 95442, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4462, + "op": "SWAP2", + "gas": 95440, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4463, + "op": "SWAP1", + "gas": 95437, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4464, + "op": "POP", + "gas": 95434, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4465, + "op": "JUMP", + "gas": 95432, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4621, + "op": "JUMPDEST", + "gas": 95424, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4622, + "op": "SWAP1", + "gas": 95423, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4623, + "op": "POP", + "gas": 95420, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4624, + "op": "PUSH1", + "gas": 95418, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4626, + "op": "DUP2", + "gas": 95415, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4627, + "op": "ADD", + "gas": 95412, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4628, + "op": "SWAP1", + "gas": 95409, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4629, + "op": "POP", + "gas": 95406, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4630, + "op": "SWAP2", + "gas": 95404, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4631, + "op": "SWAP1", + "gas": 95401, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4632, + "op": "POP", + "gas": 95398, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4633, + "op": "JUMP", + "gas": 95396, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4661, + "op": "JUMPDEST", + "gas": 95388, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4662, + "op": "PUSH2", + "gas": 95387, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4665, + "op": "JUMP", + "gas": 95384, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4560, + "op": "JUMPDEST", + "gas": 95376, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4561, + "op": "PUSH0", + "gas": 95375, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4562, + "op": "PUSH2", + "gas": 95373, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4565, + "op": "PUSH2", + "gas": 95370, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4568, + "op": "JUMP", + "gas": 95367, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4425, + "op": "JUMPDEST", + "gas": 95359, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4426, + "op": "PUSH0", + "gas": 95358, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4427, + "op": "PUSH1", + "gas": 95356, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4429, + "op": "MLOAD", + "gas": 95353, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4430, + "op": "SWAP1", + "gas": 95350, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4431, + "op": "POP", + "gas": 95347, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4432, + "op": "SWAP1", + "gas": 95345, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4433, + "op": "JUMP", + "gas": 95342, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4569, + "op": "JUMPDEST", + "gas": 95334, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4570, + "op": "SWAP1", + "gas": 95333, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4571, + "op": "POP", + "gas": 95330, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4572, + "op": "PUSH2", + "gas": 95328, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4575, + "op": "DUP3", + "gas": 95325, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4576, + "op": "DUP3", + "gas": 95322, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4577, + "op": "PUSH2", + "gas": 95319, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4580, + "op": "JUMP", + "gas": 95316, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4511, + "op": "JUMPDEST", + "gas": 95308, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4512, + "op": "PUSH2", + "gas": 95307, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4515, + "op": "DUP3", + "gas": 95304, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4516, + "op": "PUSH2", + "gas": 95301, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4519, + "op": "JUMP", + "gas": 95298, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4450, + "op": "JUMPDEST", + "gas": 95290, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4451, + "op": "PUSH0", + "gas": 95289, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4452, + "op": "PUSH1", + "gas": 95287, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4454, + "op": "NOT", + "gas": 95284, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4455, + "op": "PUSH1", + "gas": 95281, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4457, + "op": "DUP4", + "gas": 95278, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4458, + "op": "ADD", + "gas": 95275, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4459, + "op": "AND", + "gas": 95272, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4460, + "op": "SWAP1", + "gas": 95269, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4461, + "op": "POP", + "gas": 95266, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4462, + "op": "SWAP2", + "gas": 95264, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4463, + "op": "SWAP1", + "gas": 95261, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4464, + "op": "POP", + "gas": 95258, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4465, + "op": "JUMP", + "gas": 95256, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4520, + "op": "JUMPDEST", + "gas": 95248, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4521, + "op": "DUP2", + "gas": 95247, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4522, + "op": "ADD", + "gas": 95244, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4523, + "op": "DUP2", + "gas": 95241, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4524, + "op": "DUP2", + "gas": 95238, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4525, + "op": "LT", + "gas": 95235, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4526, + "op": "PUSH8", + "gas": 95232, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4535, + "op": "DUP3", + "gas": 95229, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4536, + "op": "GT", + "gas": 95226, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4537, + "op": "OR", + "gas": 95223, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4538, + "op": "ISZERO", + "gas": 95220, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4539, + "op": "PUSH2", + "gas": 95217, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4542, + "op": "JUMPI", + "gas": 95214, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4551, + "op": "JUMPDEST", + "gas": 95204, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4552, + "op": "DUP1", + "gas": 95203, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4553, + "op": "PUSH1", + "gas": 95200, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4555, + "op": "MSTORE", + "gas": 95197, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4556, + "op": "POP", + "gas": 95194, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4557, + "op": "POP", + "gas": 95192, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4558, + "op": "POP", + "gas": 95190, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4559, + "op": "JUMP", + "gas": 95188, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4581, + "op": "JUMPDEST", + "gas": 95180, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4582, + "op": "SWAP2", + "gas": 95179, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4583, + "op": "SWAP1", + "gas": 95176, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4584, + "op": "POP", + "gas": 95173, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4585, + "op": "JUMP", + "gas": 95171, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4666, + "op": "JUMPDEST", + "gas": 95163, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4667, + "op": "SWAP1", + "gas": 95162, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4668, + "op": "POP", + "gas": 95159, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4669, + "op": "DUP3", + "gas": 95157, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4670, + "op": "DUP2", + "gas": 95154, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4671, + "op": "MSTORE", + "gas": 95151, + "gasCost": 9, + "depth": 1 + }, + { + "pc": 4672, + "op": "PUSH1", + "gas": 95142, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4674, + "op": "DUP2", + "gas": 95139, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4675, + "op": "ADD", + "gas": 95136, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4676, + "op": "DUP5", + "gas": 95133, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4677, + "op": "DUP5", + "gas": 95130, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4678, + "op": "DUP5", + "gas": 95127, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4679, + "op": "ADD", + "gas": 95124, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4680, + "op": "GT", + "gas": 95121, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4681, + "op": "ISZERO", + "gas": 95118, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4682, + "op": "PUSH2", + "gas": 95115, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4685, + "op": "JUMPI", + "gas": 95112, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4694, + "op": "JUMPDEST", + "gas": 95102, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4695, + "op": "PUSH2", + "gas": 95101, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4698, + "op": "DUP5", + "gas": 95098, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4699, + "op": "DUP3", + "gas": 95095, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4700, + "op": "DUP6", + "gas": 95092, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4701, + "op": "PUSH2", + "gas": 95089, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4704, + "op": "JUMP", + "gas": 95086, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4634, + "op": "JUMPDEST", + "gas": 95078, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4635, + "op": "DUP3", + "gas": 95077, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4636, + "op": "DUP2", + "gas": 95074, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4637, + "op": "DUP4", + "gas": 95071, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4638, + "op": "CALLDATACOPY", + "gas": 95068, + "gasCost": 45, + "depth": 1 + }, + { + "pc": 4639, + "op": "PUSH0", + "gas": 95023, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4640, + "op": "DUP4", + "gas": 95021, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4641, + "op": "DUP4", + "gas": 95018, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4642, + "op": "ADD", + "gas": 95015, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4643, + "op": "MSTORE", + "gas": 95012, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 4644, + "op": "POP", + "gas": 95006, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4645, + "op": "POP", + "gas": 95004, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4646, + "op": "POP", + "gas": 95002, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4647, + "op": "JUMP", + "gas": 95000, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4705, + "op": "JUMPDEST", + "gas": 94992, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4706, + "op": "POP", + "gas": 94991, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4707, + "op": "SWAP4", + "gas": 94989, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4708, + "op": "SWAP3", + "gas": 94986, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4709, + "op": "POP", + "gas": 94983, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4710, + "op": "POP", + "gas": 94981, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4711, + "op": "POP", + "gas": 94979, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4712, + "op": "JUMP", + "gas": 94977, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4749, + "op": "JUMPDEST", + "gas": 94969, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4750, + "op": "SWAP2", + "gas": 94968, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4751, + "op": "POP", + "gas": 94965, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4752, + "op": "POP", + "gas": 94963, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4753, + "op": "SWAP3", + "gas": 94961, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4754, + "op": "SWAP2", + "gas": 94958, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4755, + "op": "POP", + "gas": 94955, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4756, + "op": "POP", + "gas": 94953, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4757, + "op": "JUMP", + "gas": 94951, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4820, + "op": "JUMPDEST", + "gas": 94943, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4821, + "op": "SWAP2", + "gas": 94942, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4822, + "op": "POP", + "gas": 94939, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4823, + "op": "POP", + "gas": 94937, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4824, + "op": "SWAP3", + "gas": 94935, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4825, + "op": "SWAP2", + "gas": 94932, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4826, + "op": "POP", + "gas": 94929, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4827, + "op": "POP", + "gas": 94927, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4828, + "op": "JUMP", + "gas": 94925, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 469, + "op": "JUMPDEST", + "gas": 94917, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 470, + "op": "PUSH2", + "gas": 94916, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 473, + "op": "JUMP", + "gas": 94913, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 2240, + "op": "JUMPDEST", + "gas": 94905, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 2241, + "op": "PUSH0", + "gas": 94904, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2242, + "op": "PUSH1", + "gas": 94902, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2244, + "op": "DUP3", + "gas": 94899, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2245, + "op": "MLOAD", + "gas": 94896, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2246, + "op": "EQ", + "gas": 94893, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2247, + "op": "PUSH2", + "gas": 94890, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2250, + "op": "JUMPI", + "gas": 94887, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 2309, + "op": "JUMPDEST", + "gas": 94877, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 2310, + "op": "PUSH0", + "gas": 94876, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2311, + "op": "PUSH1", + "gas": 94874, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2313, + "op": "MLOAD", + "gas": 94871, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2314, + "op": "DUP1", + "gas": 94868, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2315, + "op": "PUSH1", + "gas": 94865, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2317, + "op": "ADD", + "gas": 94862, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2318, + "op": "PUSH1", + "gas": 94859, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2320, + "op": "MSTORE", + "gas": 94856, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2321, + "op": "DUP1", + "gas": 94853, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2322, + "op": "PUSH1", + "gas": 94850, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2324, + "op": "DUP2", + "gas": 94847, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2325, + "op": "MSTORE", + "gas": 94844, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2326, + "op": "PUSH1", + "gas": 94841, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2328, + "op": "ADD", + "gas": 94838, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2329, + "op": "PUSH32", + "gas": 94835, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2362, + "op": "DUP2", + "gas": 94832, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2363, + "op": "MSTORE", + "gas": 94829, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 2364, + "op": "POP", + "gas": 94823, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2365, + "op": "SWAP1", + "gas": 94821, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2366, + "op": "POP", + "gas": 94818, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2367, + "op": "PUSH0", + "gas": 94816, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2368, + "op": "DUP1", + "gas": 94814, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2369, + "op": "PUSH1", + "gas": 94811, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2371, + "op": "PUSH20", + "gas": 94808, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2392, + "op": "AND", + "gas": 94805, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2393, + "op": "DUP6", + "gas": 94802, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2394, + "op": "PUSH1", + "gas": 94799, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2396, + "op": "MLOAD", + "gas": 94796, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2397, + "op": "PUSH2", + "gas": 94793, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2400, + "op": "SWAP2", + "gas": 94790, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2401, + "op": "SWAP1", + "gas": 94787, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2402, + "op": "PUSH2", + "gas": 94784, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2405, + "op": "JUMP", + "gas": 94781, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5644, + "op": "JUMPDEST", + "gas": 94773, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5645, + "op": "PUSH0", + "gas": 94772, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5646, + "op": "PUSH2", + "gas": 94770, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5649, + "op": "DUP3", + "gas": 94767, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5650, + "op": "DUP5", + "gas": 94764, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5651, + "op": "PUSH2", + "gas": 94761, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5654, + "op": "JUMP", + "gas": 94758, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5596, + "op": "JUMPDEST", + "gas": 94750, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5597, + "op": "PUSH0", + "gas": 94749, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5598, + "op": "PUSH2", + "gas": 94747, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5601, + "op": "DUP3", + "gas": 94744, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5602, + "op": "PUSH2", + "gas": 94741, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5605, + "op": "JUMP", + "gas": 94738, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5109, + "op": "JUMPDEST", + "gas": 94730, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5110, + "op": "PUSH0", + "gas": 94729, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5111, + "op": "DUP2", + "gas": 94727, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5112, + "op": "MLOAD", + "gas": 94724, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5113, + "op": "SWAP1", + "gas": 94721, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5114, + "op": "POP", + "gas": 94718, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5115, + "op": "SWAP2", + "gas": 94716, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5116, + "op": "SWAP1", + "gas": 94713, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5117, + "op": "POP", + "gas": 94710, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5118, + "op": "JUMP", + "gas": 94708, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5606, + "op": "JUMPDEST", + "gas": 94700, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5607, + "op": "PUSH2", + "gas": 94699, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5610, + "op": "DUP2", + "gas": 94696, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5611, + "op": "DUP6", + "gas": 94693, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5612, + "op": "PUSH2", + "gas": 94690, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5615, + "op": "JUMP", + "gas": 94687, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5586, + "op": "JUMPDEST", + "gas": 94679, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5587, + "op": "PUSH0", + "gas": 94678, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5588, + "op": "DUP2", + "gas": 94676, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5589, + "op": "SWAP1", + "gas": 94673, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5590, + "op": "POP", + "gas": 94670, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5591, + "op": "SWAP3", + "gas": 94668, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5592, + "op": "SWAP2", + "gas": 94665, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5593, + "op": "POP", + "gas": 94662, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5594, + "op": "POP", + "gas": 94660, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5595, + "op": "JUMP", + "gas": 94658, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5616, + "op": "JUMPDEST", + "gas": 94650, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5617, + "op": "SWAP4", + "gas": 94649, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5618, + "op": "POP", + "gas": 94646, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5619, + "op": "PUSH2", + "gas": 94644, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5622, + "op": "DUP2", + "gas": 94641, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5623, + "op": "DUP6", + "gas": 94638, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5624, + "op": "PUSH1", + "gas": 94635, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5626, + "op": "DUP7", + "gas": 94632, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5627, + "op": "ADD", + "gas": 94629, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5628, + "op": "PUSH2", + "gas": 94626, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5631, + "op": "JUMP", + "gas": 94623, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5135, + "op": "JUMPDEST", + "gas": 94615, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5136, + "op": "DUP3", + "gas": 94614, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5137, + "op": "DUP2", + "gas": 94611, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5138, + "op": "DUP4", + "gas": 94608, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5139, + "op": "opcode 0x5e not defined", + "gas": 94605, + "gasCost": 45, + "depth": 1 + }, + { + "pc": 5140, + "op": "PUSH0", + "gas": 94560, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5141, + "op": "DUP4", + "gas": 94558, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5142, + "op": "DUP4", + "gas": 94555, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5143, + "op": "ADD", + "gas": 94552, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5144, + "op": "MSTORE", + "gas": 94549, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 5145, + "op": "POP", + "gas": 94543, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5146, + "op": "POP", + "gas": 94541, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5147, + "op": "POP", + "gas": 94539, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5148, + "op": "JUMP", + "gas": 94537, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5632, + "op": "JUMPDEST", + "gas": 94529, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5633, + "op": "DUP1", + "gas": 94528, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5634, + "op": "DUP5", + "gas": 94525, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5635, + "op": "ADD", + "gas": 94522, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5636, + "op": "SWAP2", + "gas": 94519, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5637, + "op": "POP", + "gas": 94516, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5638, + "op": "POP", + "gas": 94514, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5639, + "op": "SWAP3", + "gas": 94512, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5640, + "op": "SWAP2", + "gas": 94509, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5641, + "op": "POP", + "gas": 94506, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5642, + "op": "POP", + "gas": 94504, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5643, + "op": "JUMP", + "gas": 94502, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5655, + "op": "JUMPDEST", + "gas": 94494, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5656, + "op": "SWAP2", + "gas": 94493, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5657, + "op": "POP", + "gas": 94490, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5658, + "op": "DUP2", + "gas": 94488, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5659, + "op": "SWAP1", + "gas": 94485, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5660, + "op": "POP", + "gas": 94482, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5661, + "op": "SWAP3", + "gas": 94480, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5662, + "op": "SWAP2", + "gas": 94477, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5663, + "op": "POP", + "gas": 94474, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5664, + "op": "POP", + "gas": 94472, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5665, + "op": "JUMP", + "gas": 94470, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 2406, + "op": "JUMPDEST", + "gas": 94462, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 2407, + "op": "PUSH0", + "gas": 94461, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2408, + "op": "PUSH1", + "gas": 94459, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2410, + "op": "MLOAD", + "gas": 94456, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2411, + "op": "DUP1", + "gas": 94453, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2412, + "op": "DUP4", + "gas": 94450, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2413, + "op": "SUB", + "gas": 94447, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2414, + "op": "DUP2", + "gas": 94444, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2415, + "op": "DUP6", + "gas": 94441, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2416, + "op": "GAS", + "gas": 94438, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2417, + "op": "STATICCALL", + "gas": 94436, + "gasCost": 92962, + "depth": 1 + }, + { + "pc": 2418, + "op": "SWAP2", + "gas": 94324, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2419, + "op": "POP", + "gas": 94321, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2420, + "op": "POP", + "gas": 94319, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2421, + "op": "RETURNDATASIZE", + "gas": 94317, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2422, + "op": "DUP1", + "gas": 94315, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2423, + "op": "PUSH0", + "gas": 94312, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2424, + "op": "DUP2", + "gas": 94310, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2425, + "op": "EQ", + "gas": 94307, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2426, + "op": "PUSH2", + "gas": 94304, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2429, + "op": "JUMPI", + "gas": 94301, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 2430, + "op": "PUSH1", + "gas": 94291, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2432, + "op": "MLOAD", + "gas": 94288, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2433, + "op": "SWAP2", + "gas": 94285, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2434, + "op": "POP", + "gas": 94282, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2435, + "op": "PUSH1", + "gas": 94280, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2437, + "op": "NOT", + "gas": 94277, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2438, + "op": "PUSH1", + "gas": 94274, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2440, + "op": "RETURNDATASIZE", + "gas": 94271, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2441, + "op": "ADD", + "gas": 94269, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2442, + "op": "AND", + "gas": 94266, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2443, + "op": "DUP3", + "gas": 94263, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2444, + "op": "ADD", + "gas": 94260, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2445, + "op": "PUSH1", + "gas": 94257, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2447, + "op": "MSTORE", + "gas": 94254, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2448, + "op": "RETURNDATASIZE", + "gas": 94251, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2449, + "op": "DUP3", + "gas": 94249, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2450, + "op": "MSTORE", + "gas": 94246, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2451, + "op": "RETURNDATASIZE", + "gas": 94243, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2452, + "op": "PUSH0", + "gas": 94241, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2453, + "op": "PUSH1", + "gas": 94239, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2455, + "op": "DUP5", + "gas": 94236, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2456, + "op": "ADD", + "gas": 94233, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2457, + "op": "RETURNDATACOPY", + "gas": 94230, + "gasCost": 9, + "depth": 1 + }, + { + "pc": 2458, + "op": "PUSH2", + "gas": 94221, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2461, + "op": "JUMP", + "gas": 94218, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 2467, + "op": "JUMPDEST", + "gas": 94210, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 2468, + "op": "POP", + "gas": 94209, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2469, + "op": "SWAP2", + "gas": 94207, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2470, + "op": "POP", + "gas": 94204, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2471, + "op": "SWAP2", + "gas": 94202, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2472, + "op": "POP", + "gas": 94199, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2473, + "op": "DUP2", + "gas": 94197, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2474, + "op": "PUSH0", + "gas": 94194, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2475, + "op": "DUP5", + "gas": 94192, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2476, + "op": "PUSH1", + "gas": 94189, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2478, + "op": "MLOAD", + "gas": 94186, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2479, + "op": "PUSH2", + "gas": 94183, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2482, + "op": "SWAP2", + "gas": 94180, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2483, + "op": "SWAP1", + "gas": 94177, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2484, + "op": "PUSH2", + "gas": 94174, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2487, + "op": "JUMP", + "gas": 94171, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5666, + "op": "JUMPDEST", + "gas": 94163, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5667, + "op": "PUSH0", + "gas": 94162, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5668, + "op": "PUSH2", + "gas": 94160, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5671, + "op": "DUP3", + "gas": 94157, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5672, + "op": "DUP5", + "gas": 94154, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5673, + "op": "PUSH2", + "gas": 94151, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5676, + "op": "JUMP", + "gas": 94148, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5505, + "op": "JUMPDEST", + "gas": 94140, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5506, + "op": "PUSH0", + "gas": 94139, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5507, + "op": "PUSH2", + "gas": 94137, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5510, + "op": "DUP3", + "gas": 94134, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5511, + "op": "PUSH2", + "gas": 94131, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5514, + "op": "JUMP", + "gas": 94128, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5495, + "op": "JUMPDEST", + "gas": 94120, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5496, + "op": "PUSH0", + "gas": 94119, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5497, + "op": "DUP2", + "gas": 94117, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5498, + "op": "MLOAD", + "gas": 94114, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5499, + "op": "SWAP1", + "gas": 94111, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5500, + "op": "POP", + "gas": 94108, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5501, + "op": "SWAP2", + "gas": 94106, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5502, + "op": "SWAP1", + "gas": 94103, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5503, + "op": "POP", + "gas": 94100, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5504, + "op": "JUMP", + "gas": 94098, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5515, + "op": "JUMPDEST", + "gas": 94090, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5516, + "op": "PUSH2", + "gas": 94089, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5519, + "op": "DUP2", + "gas": 94086, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5520, + "op": "DUP6", + "gas": 94083, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5521, + "op": "PUSH2", + "gas": 94080, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5524, + "op": "JUMP", + "gas": 94077, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5411, + "op": "JUMPDEST", + "gas": 94069, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5412, + "op": "PUSH0", + "gas": 94068, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5413, + "op": "DUP2", + "gas": 94066, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5414, + "op": "SWAP1", + "gas": 94063, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5415, + "op": "POP", + "gas": 94060, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5416, + "op": "SWAP3", + "gas": 94058, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5417, + "op": "SWAP2", + "gas": 94055, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5418, + "op": "POP", + "gas": 94052, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5419, + "op": "POP", + "gas": 94050, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5420, + "op": "JUMP", + "gas": 94048, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5525, + "op": "JUMPDEST", + "gas": 94040, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5526, + "op": "SWAP4", + "gas": 94039, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5527, + "op": "POP", + "gas": 94036, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5528, + "op": "PUSH2", + "gas": 94034, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5531, + "op": "DUP2", + "gas": 94031, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5532, + "op": "DUP6", + "gas": 94028, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5533, + "op": "PUSH1", + "gas": 94025, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5535, + "op": "DUP7", + "gas": 94022, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5536, + "op": "ADD", + "gas": 94019, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5537, + "op": "PUSH2", + "gas": 94016, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5540, + "op": "JUMP", + "gas": 94013, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5135, + "op": "JUMPDEST", + "gas": 94005, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5136, + "op": "DUP3", + "gas": 94004, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5137, + "op": "DUP2", + "gas": 94001, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5138, + "op": "DUP4", + "gas": 93998, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5139, + "op": "opcode 0x5e not defined", + "gas": 93995, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 5140, + "op": "PUSH0", + "gas": 93989, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5141, + "op": "DUP4", + "gas": 93987, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5142, + "op": "DUP4", + "gas": 93984, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5143, + "op": "ADD", + "gas": 93981, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5144, + "op": "MSTORE", + "gas": 93978, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5145, + "op": "POP", + "gas": 93975, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5146, + "op": "POP", + "gas": 93973, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5147, + "op": "POP", + "gas": 93971, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5148, + "op": "JUMP", + "gas": 93969, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5541, + "op": "JUMPDEST", + "gas": 93961, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5542, + "op": "DUP1", + "gas": 93960, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5543, + "op": "DUP5", + "gas": 93957, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5544, + "op": "ADD", + "gas": 93954, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5545, + "op": "SWAP2", + "gas": 93951, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5546, + "op": "POP", + "gas": 93948, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5547, + "op": "POP", + "gas": 93946, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5548, + "op": "SWAP3", + "gas": 93944, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5549, + "op": "SWAP2", + "gas": 93941, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5550, + "op": "POP", + "gas": 93938, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5551, + "op": "POP", + "gas": 93936, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5552, + "op": "JUMP", + "gas": 93934, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5677, + "op": "JUMPDEST", + "gas": 93926, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5678, + "op": "SWAP2", + "gas": 93925, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5679, + "op": "POP", + "gas": 93922, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5680, + "op": "DUP2", + "gas": 93920, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5681, + "op": "SWAP1", + "gas": 93917, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5682, + "op": "POP", + "gas": 93914, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5683, + "op": "SWAP3", + "gas": 93912, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5684, + "op": "SWAP2", + "gas": 93909, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5685, + "op": "POP", + "gas": 93906, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5686, + "op": "POP", + "gas": 93904, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5687, + "op": "JUMP", + "gas": 93902, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 2488, + "op": "JUMPDEST", + "gas": 93894, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 2489, + "op": "SWAP1", + "gas": 93893, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2490, + "op": "DUP2", + "gas": 93890, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2491, + "op": "MSTORE", + "gas": 93887, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2492, + "op": "PUSH1", + "gas": 93884, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2494, + "op": "ADD", + "gas": 93881, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2495, + "op": "PUSH1", + "gas": 93878, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2497, + "op": "MLOAD", + "gas": 93875, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2498, + "op": "DUP1", + "gas": 93872, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2499, + "op": "SWAP2", + "gas": 93869, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2500, + "op": "SUB", + "gas": 93866, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2501, + "op": "SWAP1", + "gas": 93863, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2502, + "op": "SHA3", + "gas": 93860, + "gasCost": 42, + "depth": 1 + }, + { + "pc": 2503, + "op": "PUSH0", + "gas": 93818, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2504, + "op": "PUSH2", + "gas": 93816, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2507, + "op": "EXP", + "gas": 93813, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 2508, + "op": "DUP2", + "gas": 93803, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2509, + "op": "SLOAD", + "gas": 93800, + "gasCost": 2100, + "depth": 1 + }, + { + "pc": 2510, + "op": "DUP2", + "gas": 91700, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2511, + "op": "PUSH1", + "gas": 91697, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2513, + "op": "MUL", + "gas": 91694, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 2514, + "op": "NOT", + "gas": 91689, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2515, + "op": "AND", + "gas": 91686, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2516, + "op": "SWAP1", + "gas": 91683, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2517, + "op": "DUP4", + "gas": 91680, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2518, + "op": "ISZERO", + "gas": 91677, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2519, + "op": "ISZERO", + "gas": 91674, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2520, + "op": "MUL", + "gas": 91671, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 2521, + "op": "OR", + "gas": 91666, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2522, + "op": "SWAP1", + "gas": 91663, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2523, + "op": "SSTORE", + "gas": 91660, + "gasCost": 20000, + "depth": 1 + }, + { + "pc": 2524, + "op": "POP", + "gas": 71660, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2525, + "op": "DUP1", + "gas": 71658, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2526, + "op": "PUSH1", + "gas": 71655, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2528, + "op": "DUP5", + "gas": 71652, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2529, + "op": "PUSH1", + "gas": 71649, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2531, + "op": "MLOAD", + "gas": 71646, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2532, + "op": "PUSH2", + "gas": 71643, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2535, + "op": "SWAP2", + "gas": 71640, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2536, + "op": "SWAP1", + "gas": 71637, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2537, + "op": "PUSH2", + "gas": 71634, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2540, + "op": "JUMP", + "gas": 71631, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5666, + "op": "JUMPDEST", + "gas": 71623, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5667, + "op": "PUSH0", + "gas": 71622, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5668, + "op": "PUSH2", + "gas": 71620, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5671, + "op": "DUP3", + "gas": 71617, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5672, + "op": "DUP5", + "gas": 71614, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5673, + "op": "PUSH2", + "gas": 71611, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5676, + "op": "JUMP", + "gas": 71608, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5505, + "op": "JUMPDEST", + "gas": 71600, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5506, + "op": "PUSH0", + "gas": 71599, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5507, + "op": "PUSH2", + "gas": 71597, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5510, + "op": "DUP3", + "gas": 71594, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5511, + "op": "PUSH2", + "gas": 71591, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5514, + "op": "JUMP", + "gas": 71588, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5495, + "op": "JUMPDEST", + "gas": 71580, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5496, + "op": "PUSH0", + "gas": 71579, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5497, + "op": "DUP2", + "gas": 71577, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5498, + "op": "MLOAD", + "gas": 71574, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5499, + "op": "SWAP1", + "gas": 71571, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5500, + "op": "POP", + "gas": 71568, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5501, + "op": "SWAP2", + "gas": 71566, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5502, + "op": "SWAP1", + "gas": 71563, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5503, + "op": "POP", + "gas": 71560, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5504, + "op": "JUMP", + "gas": 71558, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5515, + "op": "JUMPDEST", + "gas": 71550, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5516, + "op": "PUSH2", + "gas": 71549, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5519, + "op": "DUP2", + "gas": 71546, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5520, + "op": "DUP6", + "gas": 71543, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5521, + "op": "PUSH2", + "gas": 71540, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5524, + "op": "JUMP", + "gas": 71537, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5411, + "op": "JUMPDEST", + "gas": 71529, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5412, + "op": "PUSH0", + "gas": 71528, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5413, + "op": "DUP2", + "gas": 71526, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5414, + "op": "SWAP1", + "gas": 71523, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5415, + "op": "POP", + "gas": 71520, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5416, + "op": "SWAP3", + "gas": 71518, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5417, + "op": "SWAP2", + "gas": 71515, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5418, + "op": "POP", + "gas": 71512, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5419, + "op": "POP", + "gas": 71510, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5420, + "op": "JUMP", + "gas": 71508, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5525, + "op": "JUMPDEST", + "gas": 71500, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5526, + "op": "SWAP4", + "gas": 71499, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5527, + "op": "POP", + "gas": 71496, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5528, + "op": "PUSH2", + "gas": 71494, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5531, + "op": "DUP2", + "gas": 71491, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5532, + "op": "DUP6", + "gas": 71488, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5533, + "op": "PUSH1", + "gas": 71485, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5535, + "op": "DUP7", + "gas": 71482, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5536, + "op": "ADD", + "gas": 71479, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5537, + "op": "PUSH2", + "gas": 71476, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5540, + "op": "JUMP", + "gas": 71473, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5135, + "op": "JUMPDEST", + "gas": 71465, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5136, + "op": "DUP3", + "gas": 71464, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5137, + "op": "DUP2", + "gas": 71461, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5138, + "op": "DUP4", + "gas": 71458, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5139, + "op": "opcode 0x5e not defined", + "gas": 71455, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 5140, + "op": "PUSH0", + "gas": 71449, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5141, + "op": "DUP4", + "gas": 71447, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5142, + "op": "DUP4", + "gas": 71444, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5143, + "op": "ADD", + "gas": 71441, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5144, + "op": "MSTORE", + "gas": 71438, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5145, + "op": "POP", + "gas": 71435, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5146, + "op": "POP", + "gas": 71433, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5147, + "op": "POP", + "gas": 71431, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5148, + "op": "JUMP", + "gas": 71429, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5541, + "op": "JUMPDEST", + "gas": 71421, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5542, + "op": "DUP1", + "gas": 71420, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5543, + "op": "DUP5", + "gas": 71417, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5544, + "op": "ADD", + "gas": 71414, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5545, + "op": "SWAP2", + "gas": 71411, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5546, + "op": "POP", + "gas": 71408, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5547, + "op": "POP", + "gas": 71406, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5548, + "op": "SWAP3", + "gas": 71404, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5549, + "op": "SWAP2", + "gas": 71401, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5550, + "op": "POP", + "gas": 71398, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5551, + "op": "POP", + "gas": 71396, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5552, + "op": "JUMP", + "gas": 71394, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5677, + "op": "JUMPDEST", + "gas": 71386, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5678, + "op": "SWAP2", + "gas": 71385, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5679, + "op": "POP", + "gas": 71382, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5680, + "op": "DUP2", + "gas": 71380, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5681, + "op": "SWAP1", + "gas": 71377, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5682, + "op": "POP", + "gas": 71374, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5683, + "op": "SWAP3", + "gas": 71372, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5684, + "op": "SWAP2", + "gas": 71369, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5685, + "op": "POP", + "gas": 71366, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5686, + "op": "POP", + "gas": 71364, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5687, + "op": "JUMP", + "gas": 71362, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 2541, + "op": "JUMPDEST", + "gas": 71354, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 2542, + "op": "SWAP1", + "gas": 71353, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2543, + "op": "DUP2", + "gas": 71350, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2544, + "op": "MSTORE", + "gas": 71347, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2545, + "op": "PUSH1", + "gas": 71344, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2547, + "op": "ADD", + "gas": 71341, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2548, + "op": "PUSH1", + "gas": 71338, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2550, + "op": "MLOAD", + "gas": 71335, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2551, + "op": "DUP1", + "gas": 71332, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2552, + "op": "SWAP2", + "gas": 71329, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2553, + "op": "SUB", + "gas": 71326, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2554, + "op": "SWAP1", + "gas": 71323, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2555, + "op": "SHA3", + "gas": 71320, + "gasCost": 42, + "depth": 1 + }, + { + "pc": 2556, + "op": "SWAP1", + "gas": 71278, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2557, + "op": "DUP2", + "gas": 71275, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2558, + "op": "PUSH2", + "gas": 71272, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2561, + "op": "SWAP2", + "gas": 71269, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2562, + "op": "SWAP1", + "gas": 71266, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2563, + "op": "PUSH2", + "gas": 71263, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2566, + "op": "JUMP", + "gas": 71260, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6194, + "op": "JUMPDEST", + "gas": 71252, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6195, + "op": "PUSH2", + "gas": 71251, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6198, + "op": "DUP3", + "gas": 71248, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6199, + "op": "PUSH2", + "gas": 71245, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6202, + "op": "JUMP", + "gas": 71242, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5109, + "op": "JUMPDEST", + "gas": 71234, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5110, + "op": "PUSH0", + "gas": 71233, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5111, + "op": "DUP2", + "gas": 71231, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5112, + "op": "MLOAD", + "gas": 71228, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5113, + "op": "SWAP1", + "gas": 71225, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5114, + "op": "POP", + "gas": 71222, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5115, + "op": "SWAP2", + "gas": 71220, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5116, + "op": "SWAP1", + "gas": 71217, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5117, + "op": "POP", + "gas": 71214, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5118, + "op": "JUMP", + "gas": 71212, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6203, + "op": "JUMPDEST", + "gas": 71204, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6204, + "op": "PUSH8", + "gas": 71203, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6213, + "op": "DUP2", + "gas": 71200, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6214, + "op": "GT", + "gas": 71197, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6215, + "op": "ISZERO", + "gas": 71194, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6216, + "op": "PUSH2", + "gas": 71191, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6219, + "op": "JUMPI", + "gas": 71188, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6228, + "op": "JUMPDEST", + "gas": 71178, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6229, + "op": "PUSH2", + "gas": 71177, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6232, + "op": "DUP3", + "gas": 71174, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6233, + "op": "SLOAD", + "gas": 71171, + "gasCost": 2100, + "depth": 1 + }, + { + "pc": 6234, + "op": "PUSH2", + "gas": 69071, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6237, + "op": "JUMP", + "gas": 69068, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5733, + "op": "JUMPDEST", + "gas": 69060, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5734, + "op": "PUSH0", + "gas": 69059, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5735, + "op": "PUSH1", + "gas": 69057, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5737, + "op": "DUP3", + "gas": 69054, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5738, + "op": "DIV", + "gas": 69051, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 5739, + "op": "SWAP1", + "gas": 69046, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5740, + "op": "POP", + "gas": 69043, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5741, + "op": "PUSH1", + "gas": 69041, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5743, + "op": "DUP3", + "gas": 69038, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5744, + "op": "AND", + "gas": 69035, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5745, + "op": "DUP1", + "gas": 69032, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5746, + "op": "PUSH2", + "gas": 69029, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5749, + "op": "JUMPI", + "gas": 69026, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 5750, + "op": "PUSH1", + "gas": 69016, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5752, + "op": "DUP3", + "gas": 69013, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5753, + "op": "AND", + "gas": 69010, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5754, + "op": "SWAP2", + "gas": 69007, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5755, + "op": "POP", + "gas": 69004, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5756, + "op": "JUMPDEST", + "gas": 69002, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5757, + "op": "PUSH1", + "gas": 69001, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5759, + "op": "DUP3", + "gas": 68998, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5760, + "op": "LT", + "gas": 68995, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5761, + "op": "DUP2", + "gas": 68992, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5762, + "op": "SUB", + "gas": 68989, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5763, + "op": "PUSH2", + "gas": 68986, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5766, + "op": "JUMPI", + "gas": 68983, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 5775, + "op": "JUMPDEST", + "gas": 68973, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5776, + "op": "POP", + "gas": 68972, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5777, + "op": "SWAP2", + "gas": 68970, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5778, + "op": "SWAP1", + "gas": 68967, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5779, + "op": "POP", + "gas": 68964, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5780, + "op": "JUMP", + "gas": 68962, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6238, + "op": "JUMPDEST", + "gas": 68954, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6239, + "op": "PUSH2", + "gas": 68953, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6242, + "op": "DUP3", + "gas": 68950, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6243, + "op": "DUP3", + "gas": 68947, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6244, + "op": "DUP6", + "gas": 68944, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6245, + "op": "PUSH2", + "gas": 68941, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6248, + "op": "JUMP", + "gas": 68938, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6057, + "op": "JUMPDEST", + "gas": 68930, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6058, + "op": "PUSH1", + "gas": 68929, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6060, + "op": "DUP3", + "gas": 68926, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6061, + "op": "GT", + "gas": 68923, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6062, + "op": "ISZERO", + "gas": 68920, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6063, + "op": "PUSH2", + "gas": 68917, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6066, + "op": "JUMPI", + "gas": 68914, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6122, + "op": "JUMPDEST", + "gas": 68904, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6123, + "op": "POP", + "gas": 68903, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6124, + "op": "POP", + "gas": 68901, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6125, + "op": "POP", + "gas": 68899, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6126, + "op": "JUMP", + "gas": 68897, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6249, + "op": "JUMPDEST", + "gas": 68889, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6250, + "op": "PUSH0", + "gas": 68888, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6251, + "op": "PUSH1", + "gas": 68886, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6253, + "op": "SWAP1", + "gas": 68883, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6254, + "op": "POP", + "gas": 68880, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6255, + "op": "PUSH1", + "gas": 68878, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6257, + "op": "DUP4", + "gas": 68875, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6258, + "op": "GT", + "gas": 68872, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6259, + "op": "PUSH1", + "gas": 68869, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6261, + "op": "DUP2", + "gas": 68866, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6262, + "op": "EQ", + "gas": 68863, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6263, + "op": "PUSH2", + "gas": 68860, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6266, + "op": "JUMPI", + "gas": 68857, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6298, + "op": "JUMPDEST", + "gas": 68847, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6299, + "op": "PUSH1", + "gas": 68846, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6301, + "op": "NOT", + "gas": 68843, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6302, + "op": "DUP5", + "gas": 68840, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6303, + "op": "AND", + "gas": 68837, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6304, + "op": "PUSH2", + "gas": 68834, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6307, + "op": "DUP7", + "gas": 68831, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6308, + "op": "PUSH2", + "gas": 68828, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6311, + "op": "JUMP", + "gas": 68825, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5781, + "op": "JUMPDEST", + "gas": 68817, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5782, + "op": "PUSH0", + "gas": 68816, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5783, + "op": "DUP2", + "gas": 68814, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5784, + "op": "SWAP1", + "gas": 68811, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5785, + "op": "POP", + "gas": 68808, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5786, + "op": "DUP2", + "gas": 68806, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5787, + "op": "PUSH0", + "gas": 68803, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5788, + "op": "MSTORE", + "gas": 68801, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5789, + "op": "PUSH1", + "gas": 68798, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5791, + "op": "PUSH0", + "gas": 68795, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5792, + "op": "SHA3", + "gas": 68793, + "gasCost": 36, + "depth": 1 + }, + { + "pc": 5793, + "op": "SWAP1", + "gas": 68757, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5794, + "op": "POP", + "gas": 68754, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5795, + "op": "SWAP2", + "gas": 68752, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5796, + "op": "SWAP1", + "gas": 68749, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5797, + "op": "POP", + "gas": 68746, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5798, + "op": "JUMP", + "gas": 68744, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6312, + "op": "JUMPDEST", + "gas": 68736, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6313, + "op": "PUSH0", + "gas": 68735, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6314, + "op": "JUMPDEST", + "gas": 68733, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6315, + "op": "DUP3", + "gas": 68732, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6316, + "op": "DUP2", + "gas": 68729, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6317, + "op": "LT", + "gas": 68726, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6318, + "op": "ISZERO", + "gas": 68723, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6319, + "op": "PUSH2", + "gas": 68720, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6322, + "op": "JUMPI", + "gas": 68717, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6323, + "op": "DUP5", + "gas": 68707, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6324, + "op": "DUP10", + "gas": 68704, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6325, + "op": "ADD", + "gas": 68701, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6326, + "op": "MLOAD", + "gas": 68698, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6327, + "op": "DUP3", + "gas": 68695, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6328, + "op": "SSTORE", + "gas": 68692, + "gasCost": 22100, + "depth": 1 + }, + { + "pc": 6329, + "op": "PUSH1", + "gas": 46592, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6331, + "op": "DUP3", + "gas": 46589, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6332, + "op": "ADD", + "gas": 46586, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6333, + "op": "SWAP2", + "gas": 46583, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6334, + "op": "POP", + "gas": 46580, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6335, + "op": "PUSH1", + "gas": 46578, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6337, + "op": "DUP6", + "gas": 46575, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6338, + "op": "ADD", + "gas": 46572, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6339, + "op": "SWAP5", + "gas": 46569, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6340, + "op": "POP", + "gas": 46566, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6341, + "op": "PUSH1", + "gas": 46564, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6343, + "op": "DUP2", + "gas": 46561, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6344, + "op": "ADD", + "gas": 46558, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6345, + "op": "SWAP1", + "gas": 46555, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6346, + "op": "POP", + "gas": 46552, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6347, + "op": "PUSH2", + "gas": 46550, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6350, + "op": "JUMP", + "gas": 46547, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6314, + "op": "JUMPDEST", + "gas": 46539, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6315, + "op": "DUP3", + "gas": 46538, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6316, + "op": "DUP2", + "gas": 46535, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6317, + "op": "LT", + "gas": 46532, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6318, + "op": "ISZERO", + "gas": 46529, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6319, + "op": "PUSH2", + "gas": 46526, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6322, + "op": "JUMPI", + "gas": 46523, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6323, + "op": "DUP5", + "gas": 46513, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6324, + "op": "DUP10", + "gas": 46510, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6325, + "op": "ADD", + "gas": 46507, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6326, + "op": "MLOAD", + "gas": 46504, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6327, + "op": "DUP3", + "gas": 46501, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6328, + "op": "SSTORE", + "gas": 46498, + "gasCost": 22100, + "depth": 1 + }, + { + "pc": 6329, + "op": "PUSH1", + "gas": 24398, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6331, + "op": "DUP3", + "gas": 24395, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6332, + "op": "ADD", + "gas": 24392, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6333, + "op": "SWAP2", + "gas": 24389, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6334, + "op": "POP", + "gas": 24386, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6335, + "op": "PUSH1", + "gas": 24384, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6337, + "op": "DUP6", + "gas": 24381, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6338, + "op": "ADD", + "gas": 24378, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6339, + "op": "SWAP5", + "gas": 24375, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6340, + "op": "POP", + "gas": 24372, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6341, + "op": "PUSH1", + "gas": 24370, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6343, + "op": "DUP2", + "gas": 24367, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6344, + "op": "ADD", + "gas": 24364, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6345, + "op": "SWAP1", + "gas": 24361, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6346, + "op": "POP", + "gas": 24358, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6347, + "op": "PUSH2", + "gas": 24356, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6350, + "op": "JUMP", + "gas": 24353, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6314, + "op": "JUMPDEST", + "gas": 24345, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6315, + "op": "DUP3", + "gas": 24344, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6316, + "op": "DUP2", + "gas": 24341, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6317, + "op": "LT", + "gas": 24338, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6318, + "op": "ISZERO", + "gas": 24335, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6319, + "op": "PUSH2", + "gas": 24332, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6322, + "op": "JUMPI", + "gas": 24329, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6351, + "op": "JUMPDEST", + "gas": 24319, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6352, + "op": "DUP7", + "gas": 24318, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6353, + "op": "DUP4", + "gas": 24315, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6354, + "op": "LT", + "gas": 24312, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6355, + "op": "ISZERO", + "gas": 24309, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6356, + "op": "PUSH2", + "gas": 24306, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6359, + "op": "JUMPI", + "gas": 24303, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6380, + "op": "JUMPDEST", + "gas": 24293, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6381, + "op": "PUSH1", + "gas": 24292, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6383, + "op": "PUSH1", + "gas": 24289, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6385, + "op": "DUP9", + "gas": 24286, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6386, + "op": "MUL", + "gas": 24283, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 6387, + "op": "ADD", + "gas": 24278, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6388, + "op": "DUP9", + "gas": 24275, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6389, + "op": "SSTORE", + "gas": 24272, + "gasCost": 20000, + "depth": 1 + }, + { + "pc": 6390, + "op": "POP", + "gas": 4272, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6391, + "op": "POP", + "gas": 4270, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6392, + "op": "POP", + "gas": 4268, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6393, + "op": "JUMPDEST", + "gas": 4266, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6394, + "op": "POP", + "gas": 4265, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6395, + "op": "POP", + "gas": 4263, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6396, + "op": "POP", + "gas": 4261, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6397, + "op": "POP", + "gas": 4259, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6398, + "op": "POP", + "gas": 4257, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6399, + "op": "POP", + "gas": 4255, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6400, + "op": "JUMP", + "gas": 4253, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 2567, + "op": "JUMPDEST", + "gas": 4245, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 2568, + "op": "POP", + "gas": 4244, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2569, + "op": "PUSH32", + "gas": 4242, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2602, + "op": "DUP4", + "gas": 4239, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2603, + "op": "DUP4", + "gas": 4236, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2604, + "op": "DUP4", + "gas": 4233, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2605, + "op": "TIMESTAMP", + "gas": 4230, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2606, + "op": "PUSH1", + "gas": 4228, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2608, + "op": "MLOAD", + "gas": 4225, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2609, + "op": "PUSH2", + "gas": 4222, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2612, + "op": "SWAP5", + "gas": 4219, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2613, + "op": "SWAP4", + "gas": 4216, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2614, + "op": "SWAP3", + "gas": 4213, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2615, + "op": "SWAP2", + "gas": 4210, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2616, + "op": "SWAP1", + "gas": 4207, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2617, + "op": "PUSH2", + "gas": 4204, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2620, + "op": "JUMP", + "gas": 4201, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6488, + "op": "JUMPDEST", + "gas": 4193, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6489, + "op": "PUSH0", + "gas": 4192, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6490, + "op": "PUSH1", + "gas": 4190, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6492, + "op": "DUP3", + "gas": 4187, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6493, + "op": "ADD", + "gas": 4184, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6494, + "op": "SWAP1", + "gas": 4181, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6495, + "op": "POP", + "gas": 4178, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6496, + "op": "DUP2", + "gas": 4176, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6497, + "op": "DUP2", + "gas": 4173, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6498, + "op": "SUB", + "gas": 4170, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6499, + "op": "PUSH0", + "gas": 4167, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6500, + "op": "DUP4", + "gas": 4165, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6501, + "op": "ADD", + "gas": 4162, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6502, + "op": "MSTORE", + "gas": 4159, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6503, + "op": "PUSH2", + "gas": 4156, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6506, + "op": "DUP2", + "gas": 4153, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6507, + "op": "DUP8", + "gas": 4150, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6508, + "op": "PUSH2", + "gas": 4147, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6511, + "op": "JUMP", + "gas": 4144, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6417, + "op": "JUMPDEST", + "gas": 4136, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6418, + "op": "PUSH0", + "gas": 4135, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6419, + "op": "PUSH2", + "gas": 4133, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6422, + "op": "DUP3", + "gas": 4130, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6423, + "op": "PUSH2", + "gas": 4127, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6426, + "op": "JUMP", + "gas": 4124, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5495, + "op": "JUMPDEST", + "gas": 4116, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5496, + "op": "PUSH0", + "gas": 4115, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5497, + "op": "DUP2", + "gas": 4113, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5498, + "op": "MLOAD", + "gas": 4110, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5499, + "op": "SWAP1", + "gas": 4107, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5500, + "op": "POP", + "gas": 4104, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5501, + "op": "SWAP2", + "gas": 4102, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5502, + "op": "SWAP1", + "gas": 4099, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5503, + "op": "POP", + "gas": 4096, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5504, + "op": "JUMP", + "gas": 4094, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6427, + "op": "JUMPDEST", + "gas": 4086, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6428, + "op": "PUSH2", + "gas": 4085, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6431, + "op": "DUP2", + "gas": 4082, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6432, + "op": "DUP6", + "gas": 4079, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6433, + "op": "PUSH2", + "gas": 4076, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6436, + "op": "JUMP", + "gas": 4073, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6401, + "op": "JUMPDEST", + "gas": 4065, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6402, + "op": "PUSH0", + "gas": 4064, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6403, + "op": "DUP3", + "gas": 4062, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6404, + "op": "DUP3", + "gas": 4059, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6405, + "op": "MSTORE", + "gas": 4056, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6406, + "op": "PUSH1", + "gas": 4053, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6408, + "op": "DUP3", + "gas": 4050, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6409, + "op": "ADD", + "gas": 4047, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6410, + "op": "SWAP1", + "gas": 4044, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6411, + "op": "POP", + "gas": 4041, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6412, + "op": "SWAP3", + "gas": 4039, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6413, + "op": "SWAP2", + "gas": 4036, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6414, + "op": "POP", + "gas": 4033, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6415, + "op": "POP", + "gas": 4031, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6416, + "op": "JUMP", + "gas": 4029, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6437, + "op": "JUMPDEST", + "gas": 4021, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6438, + "op": "SWAP4", + "gas": 4020, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6439, + "op": "POP", + "gas": 4017, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6440, + "op": "PUSH2", + "gas": 4015, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6443, + "op": "DUP2", + "gas": 4012, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6444, + "op": "DUP6", + "gas": 4009, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6445, + "op": "PUSH1", + "gas": 4006, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6447, + "op": "DUP7", + "gas": 4003, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6448, + "op": "ADD", + "gas": 4000, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6449, + "op": "PUSH2", + "gas": 3997, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6452, + "op": "JUMP", + "gas": 3994, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5135, + "op": "JUMPDEST", + "gas": 3986, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5136, + "op": "DUP3", + "gas": 3985, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5137, + "op": "DUP2", + "gas": 3982, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5138, + "op": "DUP4", + "gas": 3979, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5139, + "op": "opcode 0x5e not defined", + "gas": 3976, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 5140, + "op": "PUSH0", + "gas": 3966, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5141, + "op": "DUP4", + "gas": 3964, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5142, + "op": "DUP4", + "gas": 3961, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5143, + "op": "ADD", + "gas": 3958, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5144, + "op": "MSTORE", + "gas": 3955, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 5145, + "op": "POP", + "gas": 3949, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5146, + "op": "POP", + "gas": 3947, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5147, + "op": "POP", + "gas": 3945, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5148, + "op": "JUMP", + "gas": 3943, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6453, + "op": "JUMPDEST", + "gas": 3935, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6454, + "op": "PUSH2", + "gas": 3934, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6457, + "op": "DUP2", + "gas": 3931, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6458, + "op": "PUSH2", + "gas": 3928, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6461, + "op": "JUMP", + "gas": 3925, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4450, + "op": "JUMPDEST", + "gas": 3917, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4451, + "op": "PUSH0", + "gas": 3916, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4452, + "op": "PUSH1", + "gas": 3914, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4454, + "op": "NOT", + "gas": 3911, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4455, + "op": "PUSH1", + "gas": 3908, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4457, + "op": "DUP4", + "gas": 3905, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4458, + "op": "ADD", + "gas": 3902, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4459, + "op": "AND", + "gas": 3899, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4460, + "op": "SWAP1", + "gas": 3896, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4461, + "op": "POP", + "gas": 3893, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4462, + "op": "SWAP2", + "gas": 3891, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4463, + "op": "SWAP1", + "gas": 3888, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4464, + "op": "POP", + "gas": 3885, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4465, + "op": "JUMP", + "gas": 3883, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6462, + "op": "JUMPDEST", + "gas": 3875, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6463, + "op": "DUP5", + "gas": 3874, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6464, + "op": "ADD", + "gas": 3871, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6465, + "op": "SWAP2", + "gas": 3868, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6466, + "op": "POP", + "gas": 3865, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6467, + "op": "POP", + "gas": 3863, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6468, + "op": "SWAP3", + "gas": 3861, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6469, + "op": "SWAP2", + "gas": 3858, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6470, + "op": "POP", + "gas": 3855, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6471, + "op": "POP", + "gas": 3853, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6472, + "op": "JUMP", + "gas": 3851, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6512, + "op": "JUMPDEST", + "gas": 3843, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6513, + "op": "SWAP1", + "gas": 3842, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6514, + "op": "POP", + "gas": 3839, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6515, + "op": "PUSH2", + "gas": 3837, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6518, + "op": "PUSH1", + "gas": 3834, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6520, + "op": "DUP4", + "gas": 3831, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6521, + "op": "ADD", + "gas": 3828, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6522, + "op": "DUP7", + "gas": 3825, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6523, + "op": "PUSH2", + "gas": 3822, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6526, + "op": "JUMP", + "gas": 3819, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4840, + "op": "JUMPDEST", + "gas": 3811, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4841, + "op": "PUSH2", + "gas": 3810, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4844, + "op": "DUP2", + "gas": 3807, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4845, + "op": "PUSH2", + "gas": 3804, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4848, + "op": "JUMP", + "gas": 3801, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4829, + "op": "JUMPDEST", + "gas": 3793, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4830, + "op": "PUSH0", + "gas": 3792, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4831, + "op": "DUP2", + "gas": 3790, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4832, + "op": "ISZERO", + "gas": 3787, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4833, + "op": "ISZERO", + "gas": 3784, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4834, + "op": "SWAP1", + "gas": 3781, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4835, + "op": "POP", + "gas": 3778, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4836, + "op": "SWAP2", + "gas": 3776, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4837, + "op": "SWAP1", + "gas": 3773, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4838, + "op": "POP", + "gas": 3770, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4839, + "op": "JUMP", + "gas": 3768, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4849, + "op": "JUMPDEST", + "gas": 3760, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4850, + "op": "DUP3", + "gas": 3759, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4851, + "op": "MSTORE", + "gas": 3756, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4852, + "op": "POP", + "gas": 3753, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4853, + "op": "POP", + "gas": 3751, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4854, + "op": "JUMP", + "gas": 3749, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6527, + "op": "JUMPDEST", + "gas": 3741, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6528, + "op": "DUP2", + "gas": 3740, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6529, + "op": "DUP2", + "gas": 3737, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6530, + "op": "SUB", + "gas": 3734, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6531, + "op": "PUSH1", + "gas": 3731, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6533, + "op": "DUP4", + "gas": 3728, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6534, + "op": "ADD", + "gas": 3725, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6535, + "op": "MSTORE", + "gas": 3722, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6536, + "op": "PUSH2", + "gas": 3719, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6539, + "op": "DUP2", + "gas": 3716, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6540, + "op": "DUP6", + "gas": 3713, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6541, + "op": "PUSH2", + "gas": 3710, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6544, + "op": "JUMP", + "gas": 3707, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5149, + "op": "JUMPDEST", + "gas": 3699, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5150, + "op": "PUSH0", + "gas": 3698, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5151, + "op": "PUSH2", + "gas": 3696, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5154, + "op": "DUP3", + "gas": 3693, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5155, + "op": "PUSH2", + "gas": 3690, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5158, + "op": "JUMP", + "gas": 3687, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5109, + "op": "JUMPDEST", + "gas": 3679, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5110, + "op": "PUSH0", + "gas": 3678, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5111, + "op": "DUP2", + "gas": 3676, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5112, + "op": "MLOAD", + "gas": 3673, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5113, + "op": "SWAP1", + "gas": 3670, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5114, + "op": "POP", + "gas": 3667, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5115, + "op": "SWAP2", + "gas": 3665, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5116, + "op": "SWAP1", + "gas": 3662, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5117, + "op": "POP", + "gas": 3659, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5118, + "op": "JUMP", + "gas": 3657, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5159, + "op": "JUMPDEST", + "gas": 3649, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5160, + "op": "PUSH2", + "gas": 3648, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5163, + "op": "DUP2", + "gas": 3645, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5164, + "op": "DUP6", + "gas": 3642, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5165, + "op": "PUSH2", + "gas": 3639, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5168, + "op": "JUMP", + "gas": 3636, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5119, + "op": "JUMPDEST", + "gas": 3628, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5120, + "op": "PUSH0", + "gas": 3627, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5121, + "op": "DUP3", + "gas": 3625, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5122, + "op": "DUP3", + "gas": 3622, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5123, + "op": "MSTORE", + "gas": 3619, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5124, + "op": "PUSH1", + "gas": 3616, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5126, + "op": "DUP3", + "gas": 3613, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5127, + "op": "ADD", + "gas": 3610, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5128, + "op": "SWAP1", + "gas": 3607, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5129, + "op": "POP", + "gas": 3604, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5130, + "op": "SWAP3", + "gas": 3602, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5131, + "op": "SWAP2", + "gas": 3599, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5132, + "op": "POP", + "gas": 3596, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5133, + "op": "POP", + "gas": 3594, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5134, + "op": "JUMP", + "gas": 3592, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5169, + "op": "JUMPDEST", + "gas": 3584, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5170, + "op": "SWAP4", + "gas": 3583, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5171, + "op": "POP", + "gas": 3580, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5172, + "op": "PUSH2", + "gas": 3578, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5175, + "op": "DUP2", + "gas": 3575, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5176, + "op": "DUP6", + "gas": 3572, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5177, + "op": "PUSH1", + "gas": 3569, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5179, + "op": "DUP7", + "gas": 3566, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5180, + "op": "ADD", + "gas": 3563, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5181, + "op": "PUSH2", + "gas": 3560, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5184, + "op": "JUMP", + "gas": 3557, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5135, + "op": "JUMPDEST", + "gas": 3549, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5136, + "op": "DUP3", + "gas": 3548, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5137, + "op": "DUP2", + "gas": 3545, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5138, + "op": "DUP4", + "gas": 3542, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5139, + "op": "opcode 0x5e not defined", + "gas": 3539, + "gasCost": 15, + "depth": 1 + }, + { + "pc": 5140, + "op": "PUSH0", + "gas": 3524, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5141, + "op": "DUP4", + "gas": 3522, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5142, + "op": "DUP4", + "gas": 3519, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5143, + "op": "ADD", + "gas": 3516, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5144, + "op": "MSTORE", + "gas": 3513, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 5145, + "op": "POP", + "gas": 3507, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5146, + "op": "POP", + "gas": 3505, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5147, + "op": "POP", + "gas": 3503, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5148, + "op": "JUMP", + "gas": 3501, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5185, + "op": "JUMPDEST", + "gas": 3493, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5186, + "op": "PUSH2", + "gas": 3492, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5189, + "op": "DUP2", + "gas": 3489, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5190, + "op": "PUSH2", + "gas": 3486, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5193, + "op": "JUMP", + "gas": 3483, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4450, + "op": "JUMPDEST", + "gas": 3475, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4451, + "op": "PUSH0", + "gas": 3474, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4452, + "op": "PUSH1", + "gas": 3472, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4454, + "op": "NOT", + "gas": 3469, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4455, + "op": "PUSH1", + "gas": 3466, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4457, + "op": "DUP4", + "gas": 3463, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4458, + "op": "ADD", + "gas": 3460, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4459, + "op": "AND", + "gas": 3457, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4460, + "op": "SWAP1", + "gas": 3454, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4461, + "op": "POP", + "gas": 3451, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4462, + "op": "SWAP2", + "gas": 3449, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4463, + "op": "SWAP1", + "gas": 3446, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4464, + "op": "POP", + "gas": 3443, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4465, + "op": "JUMP", + "gas": 3441, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5194, + "op": "JUMPDEST", + "gas": 3433, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5195, + "op": "DUP5", + "gas": 3432, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5196, + "op": "ADD", + "gas": 3429, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5197, + "op": "SWAP2", + "gas": 3426, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5198, + "op": "POP", + "gas": 3423, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5199, + "op": "POP", + "gas": 3421, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5200, + "op": "SWAP3", + "gas": 3419, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5201, + "op": "SWAP2", + "gas": 3416, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5202, + "op": "POP", + "gas": 3413, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5203, + "op": "POP", + "gas": 3411, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5204, + "op": "JUMP", + "gas": 3409, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6545, + "op": "JUMPDEST", + "gas": 3401, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6546, + "op": "SWAP1", + "gas": 3400, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6547, + "op": "POP", + "gas": 3397, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6548, + "op": "PUSH2", + "gas": 3395, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6551, + "op": "PUSH1", + "gas": 3392, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6553, + "op": "DUP4", + "gas": 3389, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6554, + "op": "ADD", + "gas": 3386, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6555, + "op": "DUP5", + "gas": 3383, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6556, + "op": "PUSH2", + "gas": 3380, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6559, + "op": "JUMP", + "gas": 3377, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6473, + "op": "JUMPDEST", + "gas": 3369, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6474, + "op": "PUSH2", + "gas": 3368, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6477, + "op": "DUP2", + "gas": 3365, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6478, + "op": "PUSH2", + "gas": 3362, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6481, + "op": "JUMP", + "gas": 3359, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 3351, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 3350, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 3348, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 3345, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 3342, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 3340, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 3337, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 3334, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 3332, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6482, + "op": "JUMPDEST", + "gas": 3324, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6483, + "op": "DUP3", + "gas": 3323, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6484, + "op": "MSTORE", + "gas": 3320, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6485, + "op": "POP", + "gas": 3317, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6486, + "op": "POP", + "gas": 3315, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6487, + "op": "JUMP", + "gas": 3313, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6560, + "op": "JUMPDEST", + "gas": 3305, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6561, + "op": "SWAP6", + "gas": 3304, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6562, + "op": "SWAP5", + "gas": 3301, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6563, + "op": "POP", + "gas": 3298, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6564, + "op": "POP", + "gas": 3296, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6565, + "op": "POP", + "gas": 3294, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6566, + "op": "POP", + "gas": 3292, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6567, + "op": "POP", + "gas": 3290, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6568, + "op": "JUMP", + "gas": 3288, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 2621, + "op": "JUMPDEST", + "gas": 3280, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 2622, + "op": "PUSH1", + "gas": 3279, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2624, + "op": "MLOAD", + "gas": 3276, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2625, + "op": "DUP1", + "gas": 3273, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2626, + "op": "SWAP2", + "gas": 3270, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2627, + "op": "SUB", + "gas": 3267, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2628, + "op": "SWAP1", + "gas": 3264, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2629, + "op": "LOG1", + "gas": 3261, + "gasCost": 3054, + "depth": 1 + }, + { + "pc": 2630, + "op": "DUP2", + "gas": 207, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2631, + "op": "SWAP4", + "gas": 204, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2632, + "op": "POP", + "gas": 201, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2633, + "op": "POP", + "gas": 199, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2634, + "op": "POP", + "gas": 197, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2635, + "op": "POP", + "gas": 195, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2636, + "op": "SWAP2", + "gas": 193, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2637, + "op": "SWAP1", + "gas": 190, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2638, + "op": "POP", + "gas": 187, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2639, + "op": "JUMP", + "gas": 185, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 474, + "op": "JUMPDEST", + "gas": 177, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 475, + "op": "PUSH1", + "gas": 176, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 477, + "op": "MLOAD", + "gas": 173, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 478, + "op": "PUSH2", + "gas": 170, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 481, + "op": "SWAP2", + "gas": 167, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 482, + "op": "SWAP1", + "gas": 164, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 483, + "op": "PUSH2", + "gas": 161, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 486, + "op": "JUMP", + "gas": 158, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4855, + "op": "JUMPDEST", + "gas": 150, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4856, + "op": "PUSH0", + "gas": 149, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4857, + "op": "PUSH1", + "gas": 147, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4859, + "op": "DUP3", + "gas": 144, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4860, + "op": "ADD", + "gas": 141, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4861, + "op": "SWAP1", + "gas": 138, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4862, + "op": "POP", + "gas": 135, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4863, + "op": "PUSH2", + "gas": 133, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4866, + "op": "PUSH0", + "gas": 130, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4867, + "op": "DUP4", + "gas": 128, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4868, + "op": "ADD", + "gas": 125, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4869, + "op": "DUP5", + "gas": 122, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4870, + "op": "PUSH2", + "gas": 119, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4873, + "op": "JUMP", + "gas": 116, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4840, + "op": "JUMPDEST", + "gas": 108, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4841, + "op": "PUSH2", + "gas": 107, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4844, + "op": "DUP2", + "gas": 104, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4845, + "op": "PUSH2", + "gas": 101, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4848, + "op": "JUMP", + "gas": 98, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4829, + "op": "JUMPDEST", + "gas": 90, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4830, + "op": "PUSH0", + "gas": 89, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4831, + "op": "DUP2", + "gas": 87, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4832, + "op": "ISZERO", + "gas": 84, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4833, + "op": "ISZERO", + "gas": 81, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4834, + "op": "SWAP1", + "gas": 78, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4835, + "op": "POP", + "gas": 75, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4836, + "op": "SWAP2", + "gas": 73, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4837, + "op": "SWAP1", + "gas": 70, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4838, + "op": "POP", + "gas": 67, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4839, + "op": "JUMP", + "gas": 65, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4849, + "op": "JUMPDEST", + "gas": 57, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4850, + "op": "DUP3", + "gas": 56, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4851, + "op": "MSTORE", + "gas": 53, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4852, + "op": "POP", + "gas": 50, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4853, + "op": "POP", + "gas": 48, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4854, + "op": "JUMP", + "gas": 46, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4874, + "op": "JUMPDEST", + "gas": 38, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4875, + "op": "SWAP3", + "gas": 37, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4876, + "op": "SWAP2", + "gas": 34, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4877, + "op": "POP", + "gas": 31, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4878, + "op": "POP", + "gas": 29, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4879, + "op": "JUMP", + "gas": 27, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 487, + "op": "JUMPDEST", + "gas": 19, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 488, + "op": "PUSH1", + "gas": 18, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 490, + "op": "MLOAD", + "gas": 15, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 491, + "op": "DUP1", + "gas": 12, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 492, + "op": "SWAP2", + "gas": 9, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 493, + "op": "SUB", + "gas": 6, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 494, + "op": "SWAP1", + "gas": 3, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 495, + "op": "RETURN", + "gas": 0, + "gasCost": 0, + "depth": 1 + } + ], + "callTrace": { + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "gas": "0x1d744", + "gasUsed": "0x1d744", + "to": "0xf78ce1e2f0de8fd15ce6ac4ddec6982413fda499", + "input": "0x65207521000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000d50000000c0405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d3010000000000000000000000", + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "calls": [ + { + "from": "0xf78ce1e2f0de8fd15ce6ac4ddec6982413fda499", + "gas": "0x16abe", + "gasUsed": "0xc", + "to": "0x0000000000000000000000000000000000000009", + "input": "0x0000000c0405060708090a0b0c0d0e0f101112131415161718191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f303132333435363738393a3b3c3d3e3f404142434445464748494a4b4c4d4e4f505152535455565758595a5b5c5d5e5f606162636465666768696a6b6c6d6e6f707172737475767778797a7b7c7d7e7f808182838485868788898a8b8c8d8e8f909192939495969798999a9b9c9d9e9fa0a1a2a3a4a5a6a7a8a9aaabacadaeafb0b1b2b3b4b5b6b7b8b9babbbcbdbebfc0c1c2c3c4c5c6c7c8c9cacbcccdcecfd0d1d2d301", + "output": "0x8d375849032957ad25d0f248e26a1bcf131913acc77570f1497082f8eff4db38a76e2d7f70cfcea3ad3c7a1a6f6c359c9c30269c55871b99e36ad0fa92d38ea4", + "type": "STATICCALL" + } + ], + "value": "0x0", + "type": "CALL" + } + } + ], + "withdraw_trie_root": "0xf15fe55ccda900eb1a64fa9abee8054e44b6915dae17e21aef095f4cd49d2a67", + "sequencer_set_verify_hash": "0x72fce9da9f9cca9ae7f43acbcc6060e82ef37152a13cee828b492343ec19eebc", + "startL1QueueIndex": 1321206 + } + ] +] \ No newline at end of file diff --git a/prover/testdata/morph203/morph203_2_traces.json b/prover/testdata/morph203/morph203_2_traces.json new file mode 100644 index 00000000..2defeb83 --- /dev/null +++ b/prover/testdata/morph203/morph203_2_traces.json @@ -0,0 +1,36264 @@ +[ + [ + { + "chainID": 53077, + "version": "2.0.3-mainnet-0295a3d4", + "coinbase": { + "address": "0x716170d0687c3d31cc10debe0daa1ddd3fe3d792", + "nonce": 0, + "balance": "0x2bfc76c41ecba6eb", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + "header": { + "parentHash": "0xa257a57e5627954ea6c30fbdea3e3e123f0a583117bc6b7b266d7bb50688c789", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "miner": "0x0000000000000000000000000000000000000000", + "stateRoot": "0x2ae6666bcca6b4e72819d44bba819a3f37f015d6e1df579f84847e3ee7c55f3e", + "transactionsRoot": "0xdc66dec828b8a3647eff0dd9bac69e1d49fd6b82e873bede14cf4746139d1d39", + "receiptsRoot": "0x8600a9c894480cc315dd955b184f88519b896d965047d9c57df37ca7d504f65d", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000004000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000080000000000000000000", + "difficulty": "0x0", + "number": "0x7835e", + "gasLimit": "0x3b9aca00", + "gasUsed": "0xba75", + "timestamp": "0x67d39d1d", + "extraData": "0x", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x0000000000000000", + "nextL1MsgIndex": "0x1428f6", + "batchHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "baseFeePerGas": "0xf4240", + "withdrawalsRoot": null, + "blobGasUsed": null, + "excessBlobGas": null, + "parentBeaconBlockRoot": null, + "hash": "0xe79a40e93102c99e9ebbc1039287ea22cb961d206ca0e6a24e37b48db5a1b382" + }, + "transactions": [ + { + "type": 2, + "nonce": 2171, + "txHash": "0x611368a80e09e1757c3a0a83ff0fd4d1ee8d334d2b057a6dcde3818104ece991", + "gas": 47733, + "gasPrice": "0xf4240", + "gasTipCap": "0xf4240", + "gasFeeCap": "0xf4240", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0xf78ce1e2f0de8fd15ce6ac4ddec6982413fda499", + "chainId": "0xcf55", + "value": "0x0", + "data": "0x8a59e100000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020", + "isCreate": false, + "accessList": [], + "v": "0x1", + "r": "0x38791437aaf398221dc1805ae0c1b0732b9b5c3e71bc12fc89478ff124b9c5b8", + "s": "0x23b651a5322d6a5b3bcc2bbff1182aa654c012d7db07c670a3d4d6d38ef3fa0c" + } + ], + "storageTrace": { + "rootBefore": "0x06282a9b276c3b80d658aca386f03e479d9379af169e73801488632461d86525", + "rootAfter": "0x2ae6666bcca6b4e72819d44bba819a3f37f015d6e1df579f84847e3ee7c55f3e", + "proofs": { + "0x0000000000000000000000000000000000000005": [ + "0x09209e47729632e77eb87f7bea15e93472850854dfbe20e4341f8a848ffe6684692d77f0dd9bbdc44acce00f7ab1067709208957504f8664b75b5a2fa79d88b04f", + "0x090f0a1e82586324cee880dbc126f90c3c5668c9d8f53a255a673729bf067b350f19d49b6ebd9183d49d7c9a3fa1e06880604566637b7f5f6c9f86cfef0bf52362", + "0x0913cda6990546bcfe657e6f672956af068da6968bb4b975b80be9ac7aeef1b5d4007f89220807403164fd521d78dc5244d8b1e74320055a60d4f8a3755c80dee8", + "0x09166895fcb5d82b47166f169982c40ac0c1bee1419414f177d98f4512a9c1c33c27b48395b98d9dee704b606911b11f95fc96160e498e19fbcf3ecc069e0a768e", + "0x09222c59fb203c2136a3a186f2913505e1ca71f725701fddec9401ac0c19878ada1c7272d5697c434772d0bd6d9049ae4ba2620b4b42c63ae354808d2424fea4d7", + "0x0927d8ff4b09dc5ad7a414888c9ee68196a82828caa585707a5e972df330b5bb052c06a687e38230484a4b6da57e9789bd2b162494b8996940dde8f76be97e18e9", + "0x09190cfd6ea7912a16ed2ad99711340a70adffb2bd8842804138ec723c9fe438e418d5d391b7f2efb7557005c87fef37214582276122cbd0af1070133de664cb3e", + "0x091694b71fe07c993ef52852b27e094f9d56011b834f924e927dcc3f5aa51e7209084d4051e708b7919b98df81b7696968b7a28fbda77437d1b1a12e7c14fb177e", + "0x070afaf06e78a0a851d39eaa8e78f751ef8c68e516fc3a49ec7718a27c79854e740ade78eb779a9b20cf13f1b3a14efcbbee188e0633ffe39b6200c71bea481e9e", + "0x070569a1a2a826ec12c94f8ab0b6e5df82c8e67e8656ab6cd3d4ec9e83378723f23063ca84d841dd2c50e7964a3bb0c59dddda1e6b48b01bc3f7c383fcbb78f47a", + "0x042460a40650996bacb71ac4198e8557b70b24b601a028ba8c0a51f90c530655f20508000000000000000000000000000000000000000000000000000000000000000000270000000000000000000000000000000000000000000000008c5a8729c8d2c5160000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420af826c8406ad443d3bd24bfa680ba5c8c434e727000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5300000000000000000000000000000000000001": [ + "0x09209e47729632e77eb87f7bea15e93472850854dfbe20e4341f8a848ffe6684692d77f0dd9bbdc44acce00f7ab1067709208957504f8664b75b5a2fa79d88b04f", + "0x090f0a1e82586324cee880dbc126f90c3c5668c9d8f53a255a673729bf067b350f19d49b6ebd9183d49d7c9a3fa1e06880604566637b7f5f6c9f86cfef0bf52362", + "0x0913cda6990546bcfe657e6f672956af068da6968bb4b975b80be9ac7aeef1b5d4007f89220807403164fd521d78dc5244d8b1e74320055a60d4f8a3755c80dee8", + "0x09166895fcb5d82b47166f169982c40ac0c1bee1419414f177d98f4512a9c1c33c27b48395b98d9dee704b606911b11f95fc96160e498e19fbcf3ecc069e0a768e", + "0x09222c59fb203c2136a3a186f2913505e1ca71f725701fddec9401ac0c19878ada1c7272d5697c434772d0bd6d9049ae4ba2620b4b42c63ae354808d2424fea4d7", + "0x092cc07548fafc69a4dc7cfa2a483453f9f9819d104ccc8452b044584316b2918a0b1550511655ecc100037fab01d02dc8afb8b117bedad7f9ff3900d0747d44a6", + "0x091e5bd0832fb5a9827c679c75db95f1a559a07972a60b9c51ec435ea0633394390febfd3ab5fff6718b8ec4122a449fb8320d7a813240d702a4fda781e0a9bdce", + "0x092b96c11dcd9903dd8dfbca4f5acaf64c98f7aa8d1908e90d22682169ff2ba88c1aba44333a24240b0ba627dceff3778abc51012b698672802aea6c8c26bbfe18", + "0x090df918b89bd13e0c0a0745ccee3ac8ba25569fa5ba386d501311f0bf98a643331a327742a33e16c8ac782d9cef4cb06d98b731e6ca13b0c5450951b020f9b0c6", + "0x0820f409300cb23fffe97841b4b70f4c160f90393f7d29ecb5d2dc25f15c89fb550000000000000000000000000000000000000000000000000000000000000000", + "0x061276876f7f3ac122c96a402a706e93a7da84ad82496958bf8cf8d2baefa8c02a20abfaf6bc20fadf9a7609c0562a0ff138977845b052cf9e5d4c52cb2adedbe3", + "0x0427cfcbd2fe87474008e199ef5bff09273803bbf38032c75a36a7726b3c88f8a205080000000000000000000000000000000000000000000000000aec000000000000000000000000000000000000000000000000000000000000000000000000000000002b2d37d04a6c2068ba19a08e79f3eeabfc6d2d1d516fcd700d4c377b23f9fc3f44107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f84205300000000000000000000000000000000000001000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x530000000000000000000000000000000000000f": [ + "0x09209e47729632e77eb87f7bea15e93472850854dfbe20e4341f8a848ffe6684692d77f0dd9bbdc44acce00f7ab1067709208957504f8664b75b5a2fa79d88b04f", + "0x090f0a1e82586324cee880dbc126f90c3c5668c9d8f53a255a673729bf067b350f19d49b6ebd9183d49d7c9a3fa1e06880604566637b7f5f6c9f86cfef0bf52362", + "0x09104f87b11816f6619611fbd4dfb6b8425a675325a61e91a29346b0adeca37af01ad581a1042b4922b02ce33d3b31138e15619e8d8e8313634b1ca65ce05c09c5", + "0x0923887f7f2b818306eb521f1c9a28fa1180772e0603e778536d3bd047562df33521b0c8c03e0e8783c187c12a2309a02be178b53f86ad845a9a2d0f82d342a027", + "0x092acea573988b3a33584f55cee3da7527b7ec93c39ee431d6a00e9e1c0908c32907d5d2c7ba73004c814f367fcfa9bbed0636535570c02819442719331f977f69", + "0x090e9d499bfcd7a95f27f1232e8299d71b9e312b56a5c2f96de6ba2114ce6427600bffa1d771c4f6eb4bbdc666b4ee82f7ea04a51f7c036d38e88ce7e9f7deb0d2", + "0x092e0e76440cf40d49e6a6441452c7ff3db1c5530a007c6d11b54c655302baa6a12719c9e93c1c4ab00f37d68d1fbde1ad2c4c0f540add6fc908b56c496d140ff6", + "0x082596dc85315e1b7b634ed1b19fd101397a8aaee2a296aca23e1f154d83bf2ca81d502de1ce7abdbf1e224e458bcbde4742e517dfc7ff124fca95bc7d6916a573", + "0x0418a86f98026d1a55f6fee616f04d51be16c033651ffaafb0514287ec067d04e805080000000000000000000000000000000000000000000000000aec000000000000000000000000000000000000000000000000000000000000000000000000000000002d56fafe62ab5b6fed6b2a6cd3e6eaff4b96665a12fda3cb3fcd69f5e7bee95f44107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f8420530000000000000000000000000000000000000f000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5300000000000000000000000000000000000017": [ + "0x09209e47729632e77eb87f7bea15e93472850854dfbe20e4341f8a848ffe6684692d77f0dd9bbdc44acce00f7ab1067709208957504f8664b75b5a2fa79d88b04f", + "0x090f0a1e82586324cee880dbc126f90c3c5668c9d8f53a255a673729bf067b350f19d49b6ebd9183d49d7c9a3fa1e06880604566637b7f5f6c9f86cfef0bf52362", + "0x09104f87b11816f6619611fbd4dfb6b8425a675325a61e91a29346b0adeca37af01ad581a1042b4922b02ce33d3b31138e15619e8d8e8313634b1ca65ce05c09c5", + "0x0923887f7f2b818306eb521f1c9a28fa1180772e0603e778536d3bd047562df33521b0c8c03e0e8783c187c12a2309a02be178b53f86ad845a9a2d0f82d342a027", + "0x0921db0def816c47288e31e114f2d320d1bef10a2ce0ed76f2333bfbaf4c9665df164af8117b30ef75c3a4e008ea19aceaa6e63940ecf5e5a545aab0906e772f19", + "0x09243159bed6b5236c01d76e3c7ce8656377ede3215a267875ebd69ecb83609c2f1d430d8e77abbe31d81de9fd34eb7963320d07e618379663173532df9fd64a45", + "0x0901b9f43d7930c744b2f5c270fc55ebc1dad912c53348dc7fc91c254d4f65dc731935412eb3f2d483f1fad4cda432ea52bf9a2fcc83bb4998daae1e3fcb942d70", + "0x090e532e6013b5c675cdd7dd5dbca734c748a7f04cbd659dd2ae0bc5eafa5970c91e3d73de759429994c0b1ca675ad7693042bdd444939eb4adbf7098f3863b137", + "0x091cf7b52fea8453a4ca0b91aa9982cfa67d70de187ba25db4a8f248026ca3e530001cfc254334d3a06381cc5cee1769ae6912ce781377cc01b9c6917605338915", + "0x07092aee158cd2b81331e1ce9909492eb4317b6c5bc4794d546b62069798d0b24428cd8e8880db728741786b4fa7256d94a30e266ca07390acd342670e53ccb6b9", + "0x060e3bf5a186646517ca6d50e9d232f03b095fcceb727e719819a496973c2a8cf81102b8f2eac7af07547b293c5389e362fced543befbe69dc6fa5ec89b7df96e3", + "0x041918c47a133f759975cc95c0dba82051d9b5cd65407e76ef1366a9deaa14f28005080000000000000000000000000000000000000000000000000aec00000000000000000000000000000000000000000000000000000000000000000000000000000000047815c1b6b86b3270e62056fbc5c2f5e6d06a5d3255217e122006dece0bb56544107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f84205300000000000000000000000000000000000017000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x716170D0687c3d31CC10DebE0dAa1DDD3FE3D792": [ + "0x09209e47729632e77eb87f7bea15e93472850854dfbe20e4341f8a848ffe6684692d77f0dd9bbdc44acce00f7ab1067709208957504f8664b75b5a2fa79d88b04f", + "0x090f0a1e82586324cee880dbc126f90c3c5668c9d8f53a255a673729bf067b350f19d49b6ebd9183d49d7c9a3fa1e06880604566637b7f5f6c9f86cfef0bf52362", + "0x09104f87b11816f6619611fbd4dfb6b8425a675325a61e91a29346b0adeca37af01ad581a1042b4922b02ce33d3b31138e15619e8d8e8313634b1ca65ce05c09c5", + "0x0901ae383d775a5593e8a9c58ec5e32d5b37296baa0363f05956ce31e20bf28f36268112f883b403649460fcc83503df9145f323a6488d8b711971175dce2cc736", + "0x092b26192ebc81162aa68594a054c44db6465a42a82afa2a88ea3a15f1d179742e262e14e3f0056e19b107589193778727daeb0d5d9c8b10a29357f63c6c7dfea7", + "0x0912f32fcd87faa8889ff2b91d786a0ef976de3b5553d5284f8cbd6e9729bd31aa149da17138d45d82642ef2f19d7e322443edf8f1f7f1d24a5fe1f91245f34b8c", + "0x0929be597731cca26d8264df590bb5eb3bbcb0549c210ccce091381bea0a5ed92903528d5a66b9dd442a2cfcbc4535e8d308cb95fabc4e76cd70524c9c6962bd97", + "0x09298da2e6f54d728445d34319cf317db690b4458e1cc40328ef50785d552a54e130284800c267d4af686a299278325b4273d027f79aca6ad797ebabd5344140af", + "0x0905a84a34349628360a471a26d87e83b5cb22108b4e512f899ff26456556e9c7a018ddb987c4cb90005742aad2a4b732d585e30955c5e0fc624d61833ade15789", + "0x0700000000000000000000000000000000000000000000000000000000000000000501fdd23acb18cb7f4ec083ea002049715d1ad9c18a034d34699ff16dd72ffb", + "0x0921ddfb4b9e43ab809479c10047a21a49a811c5ba8cc53280e5d7502943c0030d148fb17132574588883c9d57685157548d43848b8cf77a66e280936067de4cd8", + "0x062a1195cd1a7a66ccecf8f43d6f564b78a7ae943e8caa7c4f363558f4c8833d5104f6276c48cec8cdf8fe675b19d5cb173b53fca9d0c8f4e0b2015528dc843fcf", + "0x0414b0bb4090afcdae623b69d996022ea82c221cd1a3c00c5b13acb37d750f87fc0508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002bfc759a36b47a6c0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420716170d0687c3d31cc10debe0daa1ddd3fe3d792000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xF78ce1E2f0De8FD15cE6aC4DdeC6982413fda499": [ + "0x09209e47729632e77eb87f7bea15e93472850854dfbe20e4341f8a848ffe6684692d77f0dd9bbdc44acce00f7ab1067709208957504f8664b75b5a2fa79d88b04f", + "0x090f0a1e82586324cee880dbc126f90c3c5668c9d8f53a255a673729bf067b350f19d49b6ebd9183d49d7c9a3fa1e06880604566637b7f5f6c9f86cfef0bf52362", + "0x0913cda6990546bcfe657e6f672956af068da6968bb4b975b80be9ac7aeef1b5d4007f89220807403164fd521d78dc5244d8b1e74320055a60d4f8a3755c80dee8", + "0x09166895fcb5d82b47166f169982c40ac0c1bee1419414f177d98f4512a9c1c33c27b48395b98d9dee704b606911b11f95fc96160e498e19fbcf3ecc069e0a768e", + "0x09222c59fb203c2136a3a186f2913505e1ca71f725701fddec9401ac0c19878ada1c7272d5697c434772d0bd6d9049ae4ba2620b4b42c63ae354808d2424fea4d7", + "0x0927d8ff4b09dc5ad7a414888c9ee68196a82828caa585707a5e972df330b5bb052c06a687e38230484a4b6da57e9789bd2b162494b8996940dde8f76be97e18e9", + "0x092b2b83d6a3c43e9d5d74c102989fc1a6e8919c861f1f883358c726154395ab9018795bec0c9981dbbc5a6a61955f73bc49e9d9786d3b23f217eb2b98650857a0", + "0x0928dfb159dc353f8078c4363538a58a9fa9d7752e3fcf7d8ceddc08c11b51d15e19d66853551b5572832ff2b8fb72db53abe9fd30f56d6234918b51b1a50d3e75", + "0x0705f62a2631030f319cc83d3aed31907f893959137f58b48b7b3e8c22d877ea3716ef7145a610c21838e72d9d113e968ad41ab9c59e0a35633ddc5352d1867bd4", + "0x0802c74dd49b7efb1838742c4bd723baf03c7213fd6451541830a55b1a8a4b97f80000000000000000000000000000000000000000000000000000000000000000", + "0x08200b133820811eae273851524cd4b4286bfe2c1952baf7add3cea76fd28f55c30000000000000000000000000000000000000000000000000000000000000000", + "0x062dedb44952879016a484230de4935598f46859023d2b5c59b5839a54694766630e8e9abd7780da5da2ef86496348acf63857300969c2e704a31e7ea401be45f7", + "0x040dc14d1e73c0c578e5be438abfab5d1a47a0eef96e1d759f6997244869c1011205080000000000000000000000000000000000000000000000001dfd000000000000000100000000000000000000000000000000000000000000000000000000000000000f98ed2e0091c1dcd5e8881666d11fc23b8d3bff6db63078ff41db71965f5b6d04ebeb19827e292abcff3ed0df7e0643f284c1a3a1be79552f95e2d68f273404290a6dffbef8eab27533357244828872617f855e589938736a13aa522e946bd520f78ce1e2f0de8fd15ce6ac4ddec6982413fda499000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266": [ + "0x09209e47729632e77eb87f7bea15e93472850854dfbe20e4341f8a848ffe6684692d77f0dd9bbdc44acce00f7ab1067709208957504f8664b75b5a2fa79d88b04f", + "0x090f0a1e82586324cee880dbc126f90c3c5668c9d8f53a255a673729bf067b350f19d49b6ebd9183d49d7c9a3fa1e06880604566637b7f5f6c9f86cfef0bf52362", + "0x0913cda6990546bcfe657e6f672956af068da6968bb4b975b80be9ac7aeef1b5d4007f89220807403164fd521d78dc5244d8b1e74320055a60d4f8a3755c80dee8", + "0x09166895fcb5d82b47166f169982c40ac0c1bee1419414f177d98f4512a9c1c33c27b48395b98d9dee704b606911b11f95fc96160e498e19fbcf3ecc069e0a768e", + "0x09222c59fb203c2136a3a186f2913505e1ca71f725701fddec9401ac0c19878ada1c7272d5697c434772d0bd6d9049ae4ba2620b4b42c63ae354808d2424fea4d7", + "0x0927d8ff4b09dc5ad7a414888c9ee68196a82828caa585707a5e972df330b5bb052c06a687e38230484a4b6da57e9789bd2b162494b8996940dde8f76be97e18e9", + "0x092b2b83d6a3c43e9d5d74c102989fc1a6e8919c861f1f883358c726154395ab9018795bec0c9981dbbc5a6a61955f73bc49e9d9786d3b23f217eb2b98650857a0", + "0x091a2e42b984a6b38ac4cee46e54d20e4b5333e29262d465ec5d3f94bdf62986bf2a484c3cc96118da404c4bdacd6e54885004bf1e0f2e843a0906bd7746eb28fe", + "0x08072450f3306a3ade52423c5f81c5d642059471e88bf34e216db9a85674fcca4709b11876e7719db807b8d2c600e5babd3239cf90972e0301a6b204796f78205d", + "0x081b6f545a56732a0020ec7d063ae5badc0ef623d3c193d216617f7e00c54a23f90000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000000abf9d55edf227f5c49532981f6e65d4f16006060d37ddad2c2e431f1abef30b", + "0x0600899d662ee64d410fa88a307586eac52cc30391b62752fd997423c122cf0c181dd09d967fa39b772f3fa838f3d9d63ab3cac97964be50bf0bbce7053209285c", + "0x040d972511ec05ac7e25d155e7d292ab9a61b2227df344cd0eabfeff6f423c64d205080000000000000000000000000000000000000000000000000000000000000000087b000000000000000000000000000000000000000000000655cea73556fa240d9c0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420f39fd6e51aad88f6f4ce6ab8827279cfffb92266000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "storageProofs": { + "0x5300000000000000000000000000000000000001": { + "0x0000000000000000000000000000000000000000000000000000000000000021": [ + "0x09185c96062cbc2b564296e9e1bce3354dbcbf9f5879fd062d5b50bb358f81517e2a2dbce5edb6723342643101ac68123f3790ae822b572ec8bbd69da035c7b935", + "0x092d047e244b411ce9155f14462cfb81958ef4b4c2a08fc3fd4189484a8b7711a40462e3566daed4615c6e51a0e598dfb9a7ed84c831bfc516151e9f5ffb8110ca", + "0x09261fe911b00d2fd329c6b0e4b6d4c3a810b95a82ff32e6946a3244614feb91d205b63b9955f3a8244688b1a6cb053a7559f79129086239b473999e85be4c4282", + "0x07251841563b13c8aa1784b2d917584c358e1607710c0e0b41e5b1c45a07ceac601daf38969872c436599f595013a03f6c004d1f072aa7c8347f6ead35212900a8", + "0x08249e00f5aae6d513fc492c019a4e4de721a60764cada3866244a95db0d4e38bf0000000000000000000000000000000000000000000000000000000000000000", + "0x0818749973fd91f5be3859e8cfa68caee44893779b104075dd793bf4c486475b5b0000000000000000000000000000000000000000000000000000000000000000", + "0x07000000000000000000000000000000000000000000000000000000000000000017d7d830e47e7f6da4ddbf680cf2eb1f9b538cec3240c26711d780f22f093f9a", + "0x0700000000000000000000000000000000000000000000000000000000000000000abb47e0d1f63a2287426a57ee22892129c848adcfadb74266fee6b726c86ede", + "0x07000000000000000000000000000000000000000000000000000000000000000021e13181b559aa6ad86c239a49008b70447de95cb59caa3242701b556ff6d030", + "0x0609a3a225fccec46d81cb0f42943e252523157488c3f7712cc9528ec8eceeee2d0736af2262ac152f39d5da51e394c65d8ab9f3223c051e5be4c43e508a8766cf", + "0x042f683d080c393f5fb2ade2190fd56e8a5e8fa26533acdea8cce25caa236027cc01010000f15fe55ccda900eb1a64fa9abee8054e44b6915dae17e21aef095f4cd49d2a67200000000000000000000000000000000000000000000000000000000000000021", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x530000000000000000000000000000000000000f": { + "0x0000000000000000000000000000000000000000000000000000000000000001": [ + "0x090a47cdf7291bf5686a20e9325d5e85cd4c10009d5a5b727819689a559d47c621305837382344bb8c16c78c482e68e414dcaf0dd956b894c85acca1ae8d3b661a", + "0x090b1b80070a297010cca4d2fb3048fe8814f318eb8a6034a339d8e843544f1d1b2930aa108d1bfc505b36919afcd36848860c81ec8b00c0787b390250bfa7e31a", + "0x090084ca152c72cefb55b42146c2ac6b95a984db669d559d50cea6b7e776e5a6b31952bdec2ac6cd00c8bebfc77863f183bd2c9d09cd1938ebb9fe5fc2e2d2c1f4", + "0x0826741766ba756a60481cdbfbf1385b2e19410e0b174723be76ccce90749c19b71721b818bb25fdc0627fbd0f0ced2d5f58f1065a3e11d06073b58139aa144311", + "0x0700000000000000000000000000000000000000000000000000000000000000002aa3eec54733e8552173f9294865bf49cf8b2c952706e74cee743186ad4cd928", + "0x080ccb96bae7a65349544b73c51e1c17e905afa52b470cd3d12f5068df70ae80380000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000001982d84b59e872b109cb1b01bc1d03406977eb16aeef0ca94449c0e4dbde6426", + "0x08148058fb1d8433119f2f078417d61bd03610293c07a22079d8add13751806be00000000000000000000000000000000000000000000000000000000000000000", + "0x080b933363c8e146ca259ddce0026a7cda36a75da17137370243f5452dad2e2bd10000000000000000000000000000000000000000000000000000000000000000", + "0x07000000000000000000000000000000000000000000000000000000000000000029d862e775a17f6a182820b3ef22a94850f73238972142e77c423a5ccda02739", + "0x0607f1a71dd97c713b6e6f0e0429b179a7f7a5d1a95605340f87f7b3b5c6571655156a0960a84fa4287f66d18b9c39ab9d403fa6b6dddd126f47758aadcb82e122", + "0x0426049ba6de63003492eb078a01a8aa4f4a0e67f28f0955c2eba9101d5d2eea50010100000000000000000000000000000000000000000000000000000000000005f5e108200000000000000000000000000000000000000000000000000000000000000001", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000002": [ + "0x090a47cdf7291bf5686a20e9325d5e85cd4c10009d5a5b727819689a559d47c621305837382344bb8c16c78c482e68e414dcaf0dd956b894c85acca1ae8d3b661a", + "0x090b1b80070a297010cca4d2fb3048fe8814f318eb8a6034a339d8e843544f1d1b2930aa108d1bfc505b36919afcd36848860c81ec8b00c0787b390250bfa7e31a", + "0x090084ca152c72cefb55b42146c2ac6b95a984db669d559d50cea6b7e776e5a6b31952bdec2ac6cd00c8bebfc77863f183bd2c9d09cd1938ebb9fe5fc2e2d2c1f4", + "0x061b12dcd1a582e1e93ccb441e0688e482eb23efa9fb802dd24b7e5a46a7fcd9e21e144bbeb8f4c147dafacf9567e13b1b15e4804a9d74df2da7619735d765c1be", + "0x04020953ad52de135367a1ba2629636216ed5174cce5629d11b5d97fe733f07dcc0101000000000000000000000000000000000000000000000000000000000000000009c4200000000000000000000000000000000000000000000000000000000000000002", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000003": [ + "0x090a47cdf7291bf5686a20e9325d5e85cd4c10009d5a5b727819689a559d47c621305837382344bb8c16c78c482e68e414dcaf0dd956b894c85acca1ae8d3b661a", + "0x0700000000000000000000000000000000000000000000000000000000000000001f63b7a392d1af6e501f653490c2436a2b6ecc4835f91bfc8983aded770a595c", + "0x070ee2ca3e190e48951aa8d5bb00d33ba76a92de69a807dfa6f2eaa9881e303f3226ee193ec0e0368b03645561b95ea6fee2df8bb5f1db80afc64364ec993655f8", + "0x0406c50541f08911ad149aa545dd3d606f86ee63c751a795c7d57f0d3f85e6bdeb01010000000000000000000000000000000000000000000000000000000000003b9aca00200000000000000000000000000000000000000000000000000000000000000003", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000006": [ + "0x090a47cdf7291bf5686a20e9325d5e85cd4c10009d5a5b727819689a559d47c621305837382344bb8c16c78c482e68e414dcaf0dd956b894c85acca1ae8d3b661a", + "0x090b1b80070a297010cca4d2fb3048fe8814f318eb8a6034a339d8e843544f1d1b2930aa108d1bfc505b36919afcd36848860c81ec8b00c0787b390250bfa7e31a", + "0x090084ca152c72cefb55b42146c2ac6b95a984db669d559d50cea6b7e776e5a6b31952bdec2ac6cd00c8bebfc77863f183bd2c9d09cd1938ebb9fe5fc2e2d2c1f4", + "0x061b12dcd1a582e1e93ccb441e0688e482eb23efa9fb802dd24b7e5a46a7fcd9e21e144bbeb8f4c147dafacf9567e13b1b15e4804a9d74df2da7619735d765c1be", + "0x04064ef33f6d7044a6aa1458b710bb24a531e379030cf6ca490d84fff1d8e79c94010100000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000006", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000007": [ + "0x090a47cdf7291bf5686a20e9325d5e85cd4c10009d5a5b727819689a559d47c621305837382344bb8c16c78c482e68e414dcaf0dd956b894c85acca1ae8d3b661a", + "0x090b1b80070a297010cca4d2fb3048fe8814f318eb8a6034a339d8e843544f1d1b2930aa108d1bfc505b36919afcd36848860c81ec8b00c0787b390250bfa7e31a", + "0x082b571cbf4c65b2bf5a694234230c0bb2e95c55920e0c050a73027dea6f5535ab0000000000000000000000000000000000000000000000000000000000000000", + "0x082119746c2afd71d1574bea80b47eab52d70db3990cd1c9f6d4df98eaed5c3ff01555b1ad85223923b16c0129d117eb56e12b2c4310ff3014c28b40684e3ea69d", + "0x040d1e80106f23933567a7c4881177b5d6c45a3f319feafe560a28df75769db9ba0101000000000000000000000000000000000000000000000000000000000b33edbfaf14200000000000000000000000000000000000000000000000000000000000000007", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000008": [ + "0x090a47cdf7291bf5686a20e9325d5e85cd4c10009d5a5b727819689a559d47c621305837382344bb8c16c78c482e68e414dcaf0dd956b894c85acca1ae8d3b661a", + "0x0700000000000000000000000000000000000000000000000000000000000000001f63b7a392d1af6e501f653490c2436a2b6ecc4835f91bfc8983aded770a595c", + "0x070ee2ca3e190e48951aa8d5bb00d33ba76a92de69a807dfa6f2eaa9881e303f3226ee193ec0e0368b03645561b95ea6fee2df8bb5f1db80afc64364ec993655f8", + "0x060e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200302bd20972a48695c1c418461cc2124f0c246ad1bb41e1d8d05cd9527784228a", + "0x0412c0c59f64422dd5b7ce259c4aa62e9bf4e2bcc4f0da068e332b9f4e502ba38f01010000000000000000000000000000000000000000000000000000000000174876e800200000000000000000000000000000000000000000000000000000000000000008", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000009": [ + "0x090a47cdf7291bf5686a20e9325d5e85cd4c10009d5a5b727819689a559d47c621305837382344bb8c16c78c482e68e414dcaf0dd956b894c85acca1ae8d3b661a", + "0x0700000000000000000000000000000000000000000000000000000000000000001f63b7a392d1af6e501f653490c2436a2b6ecc4835f91bfc8983aded770a595c", + "0x05", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x5300000000000000000000000000000000000017": { + "0x0000000000000000000000000000000000000000000000000000000000000065": [ + "0x091e6f7e3b2102387b1b88b997f51470252cf226b68be43284a52489de59a2abb0105259f0b8858b399570780c836f31751cc2566ba5935c50b2db952c1020abb0", + "0x091623ed516b763c3dd7bd75be87d3bda3bc50b9909eb6f832c706e2f973246c131bb859e26b23e5d0474d863af33c2a1163103f5881396448cd8ef9cfe18f9b92", + "0x0812bc2e9bd37f44093eb71c7af67706fd9be1a51a828a3d321b792b5490c6ad560e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200", + "0x07290cb26e75385afbd8fce76271781f49ca9f5737fe573f7a121642a43bdba61a04c601c63ad45f2c8c8c8cbe20c788ef63e574ce0e800153c8b0c855dca3c0be", + "0x0702bdcd1f95c7883b7b633e040eb8263e1fb0ab97a3fa5e590f4ba82b29ee3e5a2284968786ddc52459cd3e8be14da7533c8470c63575eaccae28bd65169074f9", + "0x07000000000000000000000000000000000000000000000000000000000000000028bcb7656960130b704e5cd2afdc5bf933752cc290e10ce8de9ff4eeff23fa71", + "0x060bf27252e269c88af00daf8e309f853351131ba9cb56aa8ffdc008546b4eefc9236d89b8a52ce6f920048f57605af94c276903d51b48d2a9549a2d4ce38af1e2", + "0x042115c9b0a0938aa1ce2e8c01581e5aa931288249a453588de70cf2c5dae26a7b0101000072fce9da9f9cca9ae7f43acbcc6060e82ef37152a13cee828b492343ec19eebc200000000000000000000000000000000000000000000000000000000000000065", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0xF78ce1E2f0De8FD15cE6aC4DdeC6982413fda499": { + "0x9b9b887057e67f014dddce475a6d1228ae8479d9c0a14dc111f4e71032020c24": [ + "0x0926c0c84d66a0e0131b13135e6ae801ea348c1ee60e89aec73b86e4fc5df34baa1534e5b9e352dcf3db1724551984a990f107c436bd4d80a3726946328b1db61e", + "0x06146c35e7e025806e909bff59b6f979ce70a0361f4c21927654525e61e6fe94642c5531fcb1f5d89ebf48434141bed498aa7fcbda8b8fdaf05553e80047967cc5", + "0x0402ff3d98d60879a35a5db7d2391babef2157d459d0d3fe39288673e1d095e872010100000000000000000000000000000000000000000000000000000000000000000001209b9b887057e67f014dddce475a6d1228ae8479d9c0a14dc111f4e71032020c24", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xa4aae6489168c8521ffa6667018748a8c49347b927c24ead8028d9a8d58f66af": [ + "0x0926c0c84d66a0e0131b13135e6ae801ea348c1ee60e89aec73b86e4fc5df34baa1534e5b9e352dcf3db1724551984a990f107c436bd4d80a3726946328b1db61e", + "0x081a94fa31765ffcdf181fbcf86bf15c3b189250f676f68143aaf9d587dfecdb960ff058d1013c8ee7b5a512e60ee9552e15d9781db2966fa03bf6cfbec6b70d6e", + "0x070c950c18bab1185522696011ed57fca69e01b541828d5ff534cbed1938b21ee4016ac634917fc6d3a0f6b79757daec61907b7aedc5f29eda70e92c3d3cca19a4", + "0x081613caa951fc2fafa0087eb7d5a1dfed09a02098063b3343e49c612e7d43d91b0000000000000000000000000000000000000000000000000000000000000000", + "0x060393b6637f65dba38e4cc22851199d78b393b9f21f66654a30897d2189fc455607e59ad0e17aa550b4c22f624e2c71133b519b7a5b569851816790a6c2ee462e", + "0x041e8c398d459c37919cfeed406cdf7ae1f710c7cfc105ed6a51d296d7efed716501010000000000000000000000000000000000000000000000000000000000000000000320a4aae6489168c8521ffa6667018748a8c49347b927c24ead8028d9a8d58f66af", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xc6479b83e9785430eb70698cda89562fbf6f1b9f865d224c7be856acc8ff7ae5": [ + "0x0926c0c84d66a0e0131b13135e6ae801ea348c1ee60e89aec73b86e4fc5df34baa1534e5b9e352dcf3db1724551984a990f107c436bd4d80a3726946328b1db61e", + "0x081a94fa31765ffcdf181fbcf86bf15c3b189250f676f68143aaf9d587dfecdb960ff058d1013c8ee7b5a512e60ee9552e15d9781db2966fa03bf6cfbec6b70d6e", + "0x040dd2f85e38f58c771c9b9036984d6312d27727ef2654d8c714a0a8360ab4cc0301010000000000000000000000000000000000000000000000000000000000000000004120c6479b83e9785430eb70698cda89562fbf6f1b9f865d224c7be856acc8ff7ae5", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + } + } + }, + "codes": [ + { + "codeSize": 0, + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "code": "0x" + }, + { + "codeSize": 7677, + "keccakCodeHash": "0x04ebeb19827e292abcff3ed0df7e0643f284c1a3a1be79552f95e2d68f273404", + "hash": "0x290a6dffbef8eab27533357244828872617f855e589938736a13aa522e946bd5", + "code": "0x608060405234801561000f575f80fd5b506004361061009c575f3560e01c8063637bd16411610064578063637bd1641461019057806365207521146101c05780638a59e100146101f05780638f527e9414610220578063dbd81bc71461023e5761009c565b80630c8f3129146100a057806321ceca81146100d0578063447a4c62146101005780635e109b571461013057806363138d4f14610160575b5f80fd5b6100ba60048036038101906100b59190611296565b61026e565b6040516100c791906112f7565b60405180910390f35b6100ea60048036038101906100e591906113ae565b6103ad565b6040516100f79190611455565b60405180910390f35b61011a600480360381019061011591906114a8565b610460565b60405161012791906112f7565b60405180910390f35b61014a600480360381019061014591906113ae565b61075f565b60405161015791906112f7565b60405180910390f35b61017a60048036038101906101759190611296565b610770565b60405161018791906112f7565b60405180910390f35b6101aa60048036038101906101a591906113ae565b6108af565b6040516101b791906112f7565b60405180910390f35b6101da60048036038101906101d59190611296565b6108c0565b6040516101e791906112f7565b60405180910390f35b61020a600480360381019061020591906114d3565b610a50565b60405161021791906112f7565b60405180910390f35b610228610d94565b6040516102359190611455565b60405180910390f35b610258600480360381019061025391906113ae565b610fbc565b60405161026591906112f7565b60405180910390f35b5f8061027a8351610ff0565b60405160200161028a91906115b1565b60405160208183030381529060405290505f80600373ffffffffffffffffffffffffffffffffffffffff16856040516102c3919061160c565b5f60405180830381855afa9150503d805f81146102fb576040519150601f19603f3d011682016040523d82523d5f602084013e610300565b606091505b5091509150815f846040516103159190611622565b90815260200160405180910390205f6101000a81548160ff0219169083151502179055508060018460405161034a9190611622565b908152602001604051809103902090816103649190611832565b507ffafe735b5fe8b90ced311e90adbc382883d7ed521d7a3d16541de0ff8d44c0018383834260405161039a9493929190611958565b60405180910390a1819350505050919050565b6001818051602081018201805184825260208301602085012081835280955050505050505f9150905080546103e190611665565b80601f016020809104026020016040519081016040528092919081815260200182805461040d90611665565b80156104585780601f1061042f57610100808354040283529160200191610458565b820191905f5260205f20905b81548152906001019060200180831161043b57829003601f168201915b505050505081565b5f8061046b83610ff0565b60405160200161047b91906119f3565b60405160208183030381529060405290505f60c08461049a9190611a41565b67ffffffffffffffff8111156104b3576104b2611172565b5b6040519080825280601f01601f1916602001820160405280156104e55781602001600182028036833780820191505090505b5090505f5b8481101561064b575f60c0826105009190611a41565b905060018261050f9190611a82565b60f81b83601f836105209190611a82565b8151811061053157610530611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a90535060028261056c9190611a82565b60f81b836040601f8461057f9190611a82565b6105899190611a82565b8151811061059a57610599611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053506003826105d59190611a82565b60f81b8360206040601f856105ea9190611a82565b6105f49190611a82565b6105fe9190611a82565b8151811061060f5761060e611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505080806001019150506104ea565b505f80600873ffffffffffffffffffffffffffffffffffffffff1683604051610674919061160c565b5f60405180830381855afa9150503d805f81146106ac576040519150601f19603f3d011682016040523d82523d5f602084013e6106b1565b606091505b5091509150815f856040516106c69190611622565b90815260200160405180910390205f6101000a81548160ff021916908315150217905550806001856040516106fb9190611622565b908152602001604051809103902090816107159190611832565b507ffafe735b5fe8b90ced311e90adbc382883d7ed521d7a3d16541de0ff8d44c0018483834260405161074b9493929190611958565b60405180910390a181945050505050919050565b5f61076982610770565b9050919050565b5f8061077c8351610ff0565b60405160200161078c9190611b2c565b60405160208183030381529060405290505f80600273ffffffffffffffffffffffffffffffffffffffff16856040516107c5919061160c565b5f60405180830381855afa9150503d805f81146107fd576040519150601f19603f3d011682016040523d82523d5f602084013e610802565b606091505b5091509150815f846040516108179190611622565b90815260200160405180910390205f6101000a81548160ff0219169083151502179055508060018460405161084c9190611622565b908152602001604051809103902090816108669190611832565b507ffafe735b5fe8b90ced311e90adbc382883d7ed521d7a3d16541de0ff8d44c0018383834260405161089c9493929190611958565b60405180910390a1819350505050919050565b5f6108b98261026e565b9050919050565b5f60d5825114610905576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108fc90611bbd565b60405180910390fd5b5f6040518060400160405280600781526020017f426c616b6532460000000000000000000000000000000000000000000000000081525090505f80600973ffffffffffffffffffffffffffffffffffffffff1685604051610966919061160c565b5f60405180830381855afa9150503d805f811461099e576040519150601f19603f3d011682016040523d82523d5f602084013e6109a3565b606091505b5091509150815f846040516109b89190611622565b90815260200160405180910390205f6101000a81548160ff021916908315150217905550806001846040516109ed9190611622565b90815260200160405180910390209081610a079190611832565b507ffafe735b5fe8b90ced311e90adbc382883d7ed521d7a3d16541de0ff8d44c00183838342604051610a3d9493929190611958565b60405180910390a1819350505050919050565b5f80610a5b85610ff0565b610a6485610ff0565b610a6d85610ff0565b604051602001610a7f93929190611c6f565b60405160208183030381529060405290505f8385876060610aa09190611a82565b610aaa9190611a82565b610ab49190611a82565b67ffffffffffffffff811115610acd57610acc611172565b5b6040519080825280601f01601f191660200182016040528015610aff5781602001600182028036833780820191505090505b5090505f865f1b90505f865f1b90505f865f1b90508260208501528160408501528060608501525f891115610b8d57600760f81b8460018b6060610b439190611a82565b610b4d9190611cc0565b81518110610b5e57610b5d611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505b5f881115610bff57600360f81b8460018a8c6060610bab9190611a82565b610bb59190611a82565b610bbf9190611cc0565b81518110610bd057610bcf611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505b5f871115610c7c57601160f81b846001898b8d6060610c1e9190611a82565b610c289190611a82565b610c329190611a82565b610c3c9190611cc0565b81518110610c4d57610c4c611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505b5f80600573ffffffffffffffffffffffffffffffffffffffff1686604051610ca4919061160c565b5f60405180830381855afa9150503d805f8114610cdc576040519150601f19603f3d011682016040523d82523d5f602084013e610ce1565b606091505b5091509150815f88604051610cf69190611622565b90815260200160405180910390205f6101000a81548160ff02191690831515021790555080600188604051610d2b9190611622565b90815260200160405180910390209081610d459190611832565b507ffafe735b5fe8b90ced311e90adbc382883d7ed521d7a3d16541de0ff8d44c00187838342604051610d7b9493929190611958565b60405180910390a1819750505050505050509392505050565b60605f60d567ffffffffffffffff811115610db257610db1611172565b5b6040519080825280601f01601f191660200182016040528015610de45781602001600182028036833780820191505090505b5090505f60f81b815f81518110610dfe57610dfd611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f60f81b81600181518110610e4457610e43611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f60f81b81600281518110610e8a57610e89611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600c60f81b81600381518110610ed157610ed0611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f600490505b60d4811015610f6d5761010081610f1c9190611d20565b60f81b828281518110610f3257610f31611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053508080600101915050610f05565b50600160f81b8160d481518110610f8757610f86611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053508091505090565b5f818051602081018201805184825260208301602085012081835280955050505050505f915054906101000a900460ff1681565b60605f8203611036576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611144565b5f8290505f5b5f821461106557808061104e90611d50565b915050600a8261105e9190611d97565b915061103c565b5f8167ffffffffffffffff8111156110805761107f611172565b5b6040519080825280601f01601f1916602001820160405280156110b25781602001600182028036833780820191505090505b5090505b5f851461113d576001826110ca9190611cc0565b9150600a856110d99190611d20565b60306110e59190611a82565b60f81b8183815181106110fb576110fa611ab5565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a856111369190611d97565b94506110b6565b8093505050505b919050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b6111a882611162565b810181811067ffffffffffffffff821117156111c7576111c6611172565b5b80604052505050565b5f6111d9611149565b90506111e5828261119f565b919050565b5f67ffffffffffffffff82111561120457611203611172565b5b61120d82611162565b9050602081019050919050565b828183375f83830152505050565b5f61123a611235846111ea565b6111d0565b9050828152602081018484840111156112565761125561115e565b5b61126184828561121a565b509392505050565b5f82601f83011261127d5761127c61115a565b5b813561128d848260208601611228565b91505092915050565b5f602082840312156112ab576112aa611152565b5b5f82013567ffffffffffffffff8111156112c8576112c7611156565b5b6112d484828501611269565b91505092915050565b5f8115159050919050565b6112f1816112dd565b82525050565b5f60208201905061130a5f8301846112e8565b92915050565b5f67ffffffffffffffff82111561132a57611329611172565b5b61133382611162565b9050602081019050919050565b5f61135261134d84611310565b6111d0565b90508281526020810184848401111561136e5761136d61115e565b5b61137984828561121a565b509392505050565b5f82601f8301126113955761139461115a565b5b81356113a5848260208601611340565b91505092915050565b5f602082840312156113c3576113c2611152565b5b5f82013567ffffffffffffffff8111156113e0576113df611156565b5b6113ec84828501611381565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f611427826113f5565b61143181856113ff565b935061144181856020860161140f565b61144a81611162565b840191505092915050565b5f6020820190508181035f83015261146d818461141d565b905092915050565b5f819050919050565b61148781611475565b8114611491575f80fd5b50565b5f813590506114a28161147e565b92915050565b5f602082840312156114bd576114bc611152565b5b5f6114ca84828501611494565b91505092915050565b5f805f606084860312156114ea576114e9611152565b5b5f6114f786828701611494565b935050602061150886828701611494565b925050604061151986828701611494565b9150509250925092565b5f81905092915050565b7f524950454d443136305f000000000000000000000000000000000000000000005f82015250565b5f611561600a83611523565b915061156c8261152d565b600a82019050919050565b5f81519050919050565b5f61158b82611577565b6115958185611523565b93506115a581856020860161140f565b80840191505092915050565b5f6115bb82611555565b91506115c78284611581565b915081905092915050565b5f81905092915050565b5f6115e6826113f5565b6115f081856115d2565b935061160081856020860161140f565b80840191505092915050565b5f61161782846115dc565b915081905092915050565b5f61162d8284611581565b915081905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061167c57607f821691505b60208210810361168f5761168e611638565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026116f17fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826116b6565b6116fb86836116b6565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61173661173161172c84611475565b611713565b611475565b9050919050565b5f819050919050565b61174f8361171c565b61176361175b8261173d565b8484546116c2565b825550505050565b5f90565b61177761176b565b611782818484611746565b505050565b5b818110156117a55761179a5f8261176f565b600181019050611788565b5050565b601f8211156117ea576117bb81611695565b6117c4846116a7565b810160208510156117d3578190505b6117e76117df856116a7565b830182611787565b50505b505050565b5f82821c905092915050565b5f61180a5f19846008026117ef565b1980831691505092915050565b5f61182283836117fb565b9150826002028217905092915050565b61183b826113f5565b67ffffffffffffffff81111561185457611853611172565b5b61185e8254611665565b6118698282856117a9565b5f60209050601f83116001811461189a575f8415611888578287015190505b6118928582611817565b8655506118f9565b601f1984166118a886611695565b5f5b828110156118cf578489015182556001820191506020850194506020810190506118aa565b868310156118ec57848901516118e8601f8916826117fb565b8355505b6001600288020188555050505b505050505050565b5f82825260208201905092915050565b5f61191b82611577565b6119258185611901565b935061193581856020860161140f565b61193e81611162565b840191505092915050565b61195281611475565b82525050565b5f6080820190508181035f8301526119708187611911565b905061197f60208301866112e8565b8181036040830152611991818561141d565b90506119a06060830184611949565b95945050505050565b7f50616972696e675f0000000000000000000000000000000000000000000000005f82015250565b5f6119dd600883611523565b91506119e8826119a9565b600882019050919050565b5f6119fd826119d1565b9150611a098284611581565b915081905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611a4b82611475565b9150611a5683611475565b9250828202611a6481611475565b91508282048414831517611a7b57611a7a611a14565b5b5092915050565b5f611a8c82611475565b9150611a9783611475565b9250828201905080821115611aaf57611aae611a14565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f5348413235365f000000000000000000000000000000000000000000000000005f82015250565b5f611b16600783611523565b9150611b2182611ae2565b600782019050919050565b5f611b3682611b0a565b9150611b428284611581565b915081905092915050565b7f426c616b6532662072657175697265732065786163746c7920323133206279745f8201527f657320696e707574000000000000000000000000000000000000000000000000602082015250565b5f611ba7602883611901565b9150611bb282611b4d565b604082019050919050565b5f6020820190508181035f830152611bd481611b9b565b9050919050565b7f4d6f644578705f000000000000000000000000000000000000000000000000005f82015250565b5f611c0f600783611523565b9150611c1a82611bdb565b600782019050919050565b7f5f000000000000000000000000000000000000000000000000000000000000005f82015250565b5f611c59600183611523565b9150611c6482611c25565b600182019050919050565b5f611c7982611c03565b9150611c858286611581565b9150611c9082611c4d565b9150611c9c8285611581565b9150611ca782611c4d565b9150611cb38284611581565b9150819050949350505050565b5f611cca82611475565b9150611cd583611475565b9250828203905081811115611ced57611cec611a14565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f611d2a82611475565b9150611d3583611475565b925082611d4557611d44611cf3565b5b828206905092915050565b5f611d5a82611475565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611d8c57611d8b611a14565b5b600182019050919050565b5f611da182611475565b9150611dac83611475565b925082611dbc57611dbb611cf3565b5b82820490509291505056fea264697066735822122005118c223c12b158349613416fd6342abd507776ce6306cce1e9a99fa8e7b9bb64736f6c634300081a0033" + } + ], + "txStorageTraces": [ + { + "rootBefore": "0x06282a9b276c3b80d658aca386f03e479d9379af169e73801488632461d86525", + "rootAfter": "0x2ae6666bcca6b4e72819d44bba819a3f37f015d6e1df579f84847e3ee7c55f3e", + "proofs": { + "0x0000000000000000000000000000000000000005": [ + "0x09209e47729632e77eb87f7bea15e93472850854dfbe20e4341f8a848ffe6684692d77f0dd9bbdc44acce00f7ab1067709208957504f8664b75b5a2fa79d88b04f", + "0x090f0a1e82586324cee880dbc126f90c3c5668c9d8f53a255a673729bf067b350f19d49b6ebd9183d49d7c9a3fa1e06880604566637b7f5f6c9f86cfef0bf52362", + "0x0913cda6990546bcfe657e6f672956af068da6968bb4b975b80be9ac7aeef1b5d4007f89220807403164fd521d78dc5244d8b1e74320055a60d4f8a3755c80dee8", + "0x09166895fcb5d82b47166f169982c40ac0c1bee1419414f177d98f4512a9c1c33c27b48395b98d9dee704b606911b11f95fc96160e498e19fbcf3ecc069e0a768e", + "0x09222c59fb203c2136a3a186f2913505e1ca71f725701fddec9401ac0c19878ada1c7272d5697c434772d0bd6d9049ae4ba2620b4b42c63ae354808d2424fea4d7", + "0x0927d8ff4b09dc5ad7a414888c9ee68196a82828caa585707a5e972df330b5bb052c06a687e38230484a4b6da57e9789bd2b162494b8996940dde8f76be97e18e9", + "0x09190cfd6ea7912a16ed2ad99711340a70adffb2bd8842804138ec723c9fe438e418d5d391b7f2efb7557005c87fef37214582276122cbd0af1070133de664cb3e", + "0x091694b71fe07c993ef52852b27e094f9d56011b834f924e927dcc3f5aa51e7209084d4051e708b7919b98df81b7696968b7a28fbda77437d1b1a12e7c14fb177e", + "0x070afaf06e78a0a851d39eaa8e78f751ef8c68e516fc3a49ec7718a27c79854e740ade78eb779a9b20cf13f1b3a14efcbbee188e0633ffe39b6200c71bea481e9e", + "0x070569a1a2a826ec12c94f8ab0b6e5df82c8e67e8656ab6cd3d4ec9e83378723f23063ca84d841dd2c50e7964a3bb0c59dddda1e6b48b01bc3f7c383fcbb78f47a", + "0x042460a40650996bacb71ac4198e8557b70b24b601a028ba8c0a51f90c530655f20508000000000000000000000000000000000000000000000000000000000000000000270000000000000000000000000000000000000000000000008c5a8729c8d2c5160000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420af826c8406ad443d3bd24bfa680ba5c8c434e727000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x716170D0687c3d31CC10DebE0dAa1DDD3FE3D792": [ + "0x09209e47729632e77eb87f7bea15e93472850854dfbe20e4341f8a848ffe6684692d77f0dd9bbdc44acce00f7ab1067709208957504f8664b75b5a2fa79d88b04f", + "0x090f0a1e82586324cee880dbc126f90c3c5668c9d8f53a255a673729bf067b350f19d49b6ebd9183d49d7c9a3fa1e06880604566637b7f5f6c9f86cfef0bf52362", + "0x09104f87b11816f6619611fbd4dfb6b8425a675325a61e91a29346b0adeca37af01ad581a1042b4922b02ce33d3b31138e15619e8d8e8313634b1ca65ce05c09c5", + "0x0901ae383d775a5593e8a9c58ec5e32d5b37296baa0363f05956ce31e20bf28f36268112f883b403649460fcc83503df9145f323a6488d8b711971175dce2cc736", + "0x092b26192ebc81162aa68594a054c44db6465a42a82afa2a88ea3a15f1d179742e262e14e3f0056e19b107589193778727daeb0d5d9c8b10a29357f63c6c7dfea7", + "0x0912f32fcd87faa8889ff2b91d786a0ef976de3b5553d5284f8cbd6e9729bd31aa149da17138d45d82642ef2f19d7e322443edf8f1f7f1d24a5fe1f91245f34b8c", + "0x0929be597731cca26d8264df590bb5eb3bbcb0549c210ccce091381bea0a5ed92903528d5a66b9dd442a2cfcbc4535e8d308cb95fabc4e76cd70524c9c6962bd97", + "0x09298da2e6f54d728445d34319cf317db690b4458e1cc40328ef50785d552a54e130284800c267d4af686a299278325b4273d027f79aca6ad797ebabd5344140af", + "0x0905a84a34349628360a471a26d87e83b5cb22108b4e512f899ff26456556e9c7a018ddb987c4cb90005742aad2a4b732d585e30955c5e0fc624d61833ade15789", + "0x0700000000000000000000000000000000000000000000000000000000000000000501fdd23acb18cb7f4ec083ea002049715d1ad9c18a034d34699ff16dd72ffb", + "0x0921ddfb4b9e43ab809479c10047a21a49a811c5ba8cc53280e5d7502943c0030d148fb17132574588883c9d57685157548d43848b8cf77a66e280936067de4cd8", + "0x062a1195cd1a7a66ccecf8f43d6f564b78a7ae943e8caa7c4f363558f4c8833d5104f6276c48cec8cdf8fe675b19d5cb173b53fca9d0c8f4e0b2015528dc843fcf", + "0x0414b0bb4090afcdae623b69d996022ea82c221cd1a3c00c5b13acb37d750f87fc0508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002bfc759a36b47a6c0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420716170d0687c3d31cc10debe0daa1ddd3fe3d792000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xF78ce1E2f0De8FD15cE6aC4DdeC6982413fda499": [ + "0x09209e47729632e77eb87f7bea15e93472850854dfbe20e4341f8a848ffe6684692d77f0dd9bbdc44acce00f7ab1067709208957504f8664b75b5a2fa79d88b04f", + "0x090f0a1e82586324cee880dbc126f90c3c5668c9d8f53a255a673729bf067b350f19d49b6ebd9183d49d7c9a3fa1e06880604566637b7f5f6c9f86cfef0bf52362", + "0x0913cda6990546bcfe657e6f672956af068da6968bb4b975b80be9ac7aeef1b5d4007f89220807403164fd521d78dc5244d8b1e74320055a60d4f8a3755c80dee8", + "0x09166895fcb5d82b47166f169982c40ac0c1bee1419414f177d98f4512a9c1c33c27b48395b98d9dee704b606911b11f95fc96160e498e19fbcf3ecc069e0a768e", + "0x09222c59fb203c2136a3a186f2913505e1ca71f725701fddec9401ac0c19878ada1c7272d5697c434772d0bd6d9049ae4ba2620b4b42c63ae354808d2424fea4d7", + "0x0927d8ff4b09dc5ad7a414888c9ee68196a82828caa585707a5e972df330b5bb052c06a687e38230484a4b6da57e9789bd2b162494b8996940dde8f76be97e18e9", + "0x092b2b83d6a3c43e9d5d74c102989fc1a6e8919c861f1f883358c726154395ab9018795bec0c9981dbbc5a6a61955f73bc49e9d9786d3b23f217eb2b98650857a0", + "0x0928dfb159dc353f8078c4363538a58a9fa9d7752e3fcf7d8ceddc08c11b51d15e19d66853551b5572832ff2b8fb72db53abe9fd30f56d6234918b51b1a50d3e75", + "0x0705f62a2631030f319cc83d3aed31907f893959137f58b48b7b3e8c22d877ea3716ef7145a610c21838e72d9d113e968ad41ab9c59e0a35633ddc5352d1867bd4", + "0x0802c74dd49b7efb1838742c4bd723baf03c7213fd6451541830a55b1a8a4b97f80000000000000000000000000000000000000000000000000000000000000000", + "0x08200b133820811eae273851524cd4b4286bfe2c1952baf7add3cea76fd28f55c30000000000000000000000000000000000000000000000000000000000000000", + "0x062dedb44952879016a484230de4935598f46859023d2b5c59b5839a54694766630e8e9abd7780da5da2ef86496348acf63857300969c2e704a31e7ea401be45f7", + "0x040dc14d1e73c0c578e5be438abfab5d1a47a0eef96e1d759f6997244869c1011205080000000000000000000000000000000000000000000000001dfd000000000000000100000000000000000000000000000000000000000000000000000000000000000f98ed2e0091c1dcd5e8881666d11fc23b8d3bff6db63078ff41db71965f5b6d04ebeb19827e292abcff3ed0df7e0643f284c1a3a1be79552f95e2d68f273404290a6dffbef8eab27533357244828872617f855e589938736a13aa522e946bd520f78ce1e2f0de8fd15ce6ac4ddec6982413fda499000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266": [ + "0x09209e47729632e77eb87f7bea15e93472850854dfbe20e4341f8a848ffe6684692d77f0dd9bbdc44acce00f7ab1067709208957504f8664b75b5a2fa79d88b04f", + "0x090f0a1e82586324cee880dbc126f90c3c5668c9d8f53a255a673729bf067b350f19d49b6ebd9183d49d7c9a3fa1e06880604566637b7f5f6c9f86cfef0bf52362", + "0x0913cda6990546bcfe657e6f672956af068da6968bb4b975b80be9ac7aeef1b5d4007f89220807403164fd521d78dc5244d8b1e74320055a60d4f8a3755c80dee8", + "0x09166895fcb5d82b47166f169982c40ac0c1bee1419414f177d98f4512a9c1c33c27b48395b98d9dee704b606911b11f95fc96160e498e19fbcf3ecc069e0a768e", + "0x09222c59fb203c2136a3a186f2913505e1ca71f725701fddec9401ac0c19878ada1c7272d5697c434772d0bd6d9049ae4ba2620b4b42c63ae354808d2424fea4d7", + "0x0927d8ff4b09dc5ad7a414888c9ee68196a82828caa585707a5e972df330b5bb052c06a687e38230484a4b6da57e9789bd2b162494b8996940dde8f76be97e18e9", + "0x092b2b83d6a3c43e9d5d74c102989fc1a6e8919c861f1f883358c726154395ab9018795bec0c9981dbbc5a6a61955f73bc49e9d9786d3b23f217eb2b98650857a0", + "0x091a2e42b984a6b38ac4cee46e54d20e4b5333e29262d465ec5d3f94bdf62986bf2a484c3cc96118da404c4bdacd6e54885004bf1e0f2e843a0906bd7746eb28fe", + "0x08072450f3306a3ade52423c5f81c5d642059471e88bf34e216db9a85674fcca4709b11876e7719db807b8d2c600e5babd3239cf90972e0301a6b204796f78205d", + "0x081b6f545a56732a0020ec7d063ae5badc0ef623d3c193d216617f7e00c54a23f90000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000000abf9d55edf227f5c49532981f6e65d4f16006060d37ddad2c2e431f1abef30b", + "0x0600899d662ee64d410fa88a307586eac52cc30391b62752fd997423c122cf0c181dd09d967fa39b772f3fa838f3d9d63ab3cac97964be50bf0bbce7053209285c", + "0x040d972511ec05ac7e25d155e7d292ab9a61b2227df344cd0eabfeff6f423c64d205080000000000000000000000000000000000000000000000000000000000000000087b000000000000000000000000000000000000000000000655cea73556fa240d9c0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420f39fd6e51aad88f6f4ce6ab8827279cfffb92266000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "storageProofs": { + "0xF78ce1E2f0De8FD15cE6aC4DdeC6982413fda499": { + "0x9b9b887057e67f014dddce475a6d1228ae8479d9c0a14dc111f4e71032020c24": [ + "0x0926c0c84d66a0e0131b13135e6ae801ea348c1ee60e89aec73b86e4fc5df34baa1534e5b9e352dcf3db1724551984a990f107c436bd4d80a3726946328b1db61e", + "0x06146c35e7e025806e909bff59b6f979ce70a0361f4c21927654525e61e6fe94642c5531fcb1f5d89ebf48434141bed498aa7fcbda8b8fdaf05553e80047967cc5", + "0x0402ff3d98d60879a35a5db7d2391babef2157d459d0d3fe39288673e1d095e872010100000000000000000000000000000000000000000000000000000000000000000001209b9b887057e67f014dddce475a6d1228ae8479d9c0a14dc111f4e71032020c24", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xa4aae6489168c8521ffa6667018748a8c49347b927c24ead8028d9a8d58f66af": [ + "0x0926c0c84d66a0e0131b13135e6ae801ea348c1ee60e89aec73b86e4fc5df34baa1534e5b9e352dcf3db1724551984a990f107c436bd4d80a3726946328b1db61e", + "0x081a94fa31765ffcdf181fbcf86bf15c3b189250f676f68143aaf9d587dfecdb960ff058d1013c8ee7b5a512e60ee9552e15d9781db2966fa03bf6cfbec6b70d6e", + "0x070c950c18bab1185522696011ed57fca69e01b541828d5ff534cbed1938b21ee4016ac634917fc6d3a0f6b79757daec61907b7aedc5f29eda70e92c3d3cca19a4", + "0x081613caa951fc2fafa0087eb7d5a1dfed09a02098063b3343e49c612e7d43d91b0000000000000000000000000000000000000000000000000000000000000000", + "0x060393b6637f65dba38e4cc22851199d78b393b9f21f66654a30897d2189fc455607e59ad0e17aa550b4c22f624e2c71133b519b7a5b569851816790a6c2ee462e", + "0x041e8c398d459c37919cfeed406cdf7ae1f710c7cfc105ed6a51d296d7efed716501010000000000000000000000000000000000000000000000000000000000000000000320a4aae6489168c8521ffa6667018748a8c49347b927c24ead8028d9a8d58f66af", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xc6479b83e9785430eb70698cda89562fbf6f1b9f865d224c7be856acc8ff7ae5": [ + "0x0926c0c84d66a0e0131b13135e6ae801ea348c1ee60e89aec73b86e4fc5df34baa1534e5b9e352dcf3db1724551984a990f107c436bd4d80a3726946328b1db61e", + "0x081a94fa31765ffcdf181fbcf86bf15c3b189250f676f68143aaf9d587dfecdb960ff058d1013c8ee7b5a512e60ee9552e15d9781db2966fa03bf6cfbec6b70d6e", + "0x040dd2f85e38f58c771c9b9036984d6312d27727ef2654d8c714a0a8360ab4cc0301010000000000000000000000000000000000000000000000000000000000000000004120c6479b83e9785430eb70698cda89562fbf6f1b9f865d224c7be856acc8ff7ae5", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + } + } + } + ], + "executionResults": [ + { + "l1DataFee": "0x11ecafb653f", + "gas": 47733, + "failed": false, + "returnValue": "0000000000000000000000000000000000000000000000000000000000000001", + "from": { + "address": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "nonce": 2171, + "balance": "0x655cea73556fa240d9c", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + "to": { + "address": "0xf78ce1e2f0de8fd15ce6ac4ddec6982413fda499", + "nonce": 1, + "balance": "0x0", + "keccakCodeHash": "0x04ebeb19827e292abcff3ed0df7e0643f284c1a3a1be79552f95e2d68f273404", + "poseidonCodeHash": "0x290a6dffbef8eab27533357244828872617f855e589938736a13aa522e946bd5", + "codeSize": 7677 + }, + "accountAfter": [ + { + "address": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "nonce": 2172, + "balance": "0x655cea7342d120ce11d", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + { + "address": "0xf78ce1e2f0de8fd15ce6ac4ddec6982413fda499", + "nonce": 1, + "balance": "0x0", + "keccakCodeHash": "0x04ebeb19827e292abcff3ed0df7e0643f284c1a3a1be79552f95e2d68f273404", + "poseidonCodeHash": "0x290a6dffbef8eab27533357244828872617f855e589938736a13aa522e946bd5", + "codeSize": 7677 + }, + { + "address": "0x716170d0687c3d31cc10debe0daa1ddd3fe3d792", + "nonce": 0, + "balance": "0x2bfc76c41ecba6eb", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + } + ], + "structLogs": [ + { + "pc": 0, + "op": "PUSH1", + "gas": 26261, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2, + "op": "PUSH1", + "gas": 26258, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4, + "op": "MSTORE", + "gas": 26255, + "gasCost": 12, + "depth": 1 + }, + { + "pc": 5, + "op": "CALLVALUE", + "gas": 26243, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6, + "op": "DUP1", + "gas": 26241, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7, + "op": "ISZERO", + "gas": 26238, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 8, + "op": "PUSH2", + "gas": 26235, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 11, + "op": "JUMPI", + "gas": 26232, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 15, + "op": "JUMPDEST", + "gas": 26222, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 16, + "op": "POP", + "gas": 26221, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 17, + "op": "PUSH1", + "gas": 26219, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 19, + "op": "CALLDATASIZE", + "gas": 26216, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 20, + "op": "LT", + "gas": 26214, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 21, + "op": "PUSH2", + "gas": 26211, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 24, + "op": "JUMPI", + "gas": 26208, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 25, + "op": "PUSH0", + "gas": 26198, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 26, + "op": "CALLDATALOAD", + "gas": 26196, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 27, + "op": "PUSH1", + "gas": 26193, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 29, + "op": "SHR", + "gas": 26190, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 30, + "op": "DUP1", + "gas": 26187, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 31, + "op": "PUSH4", + "gas": 26184, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 36, + "op": "GT", + "gas": 26181, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 37, + "op": "PUSH2", + "gas": 26178, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 40, + "op": "JUMPI", + "gas": 26175, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 41, + "op": "DUP1", + "gas": 26165, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 42, + "op": "PUSH4", + "gas": 26162, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 47, + "op": "EQ", + "gas": 26159, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 48, + "op": "PUSH2", + "gas": 26156, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 51, + "op": "JUMPI", + "gas": 26153, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 52, + "op": "DUP1", + "gas": 26143, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 53, + "op": "PUSH4", + "gas": 26140, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 58, + "op": "EQ", + "gas": 26137, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 59, + "op": "PUSH2", + "gas": 26134, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 62, + "op": "JUMPI", + "gas": 26131, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 63, + "op": "DUP1", + "gas": 26121, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 64, + "op": "PUSH4", + "gas": 26118, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 69, + "op": "EQ", + "gas": 26115, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 70, + "op": "PUSH2", + "gas": 26112, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 73, + "op": "JUMPI", + "gas": 26109, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 496, + "op": "JUMPDEST", + "gas": 26099, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 497, + "op": "PUSH2", + "gas": 26098, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 500, + "op": "PUSH1", + "gas": 26095, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 502, + "op": "DUP1", + "gas": 26092, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 503, + "op": "CALLDATASIZE", + "gas": 26089, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 504, + "op": "SUB", + "gas": 26087, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 505, + "op": "DUP2", + "gas": 26084, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 506, + "op": "ADD", + "gas": 26081, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 507, + "op": "SWAP1", + "gas": 26078, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 508, + "op": "PUSH2", + "gas": 26075, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 511, + "op": "SWAP2", + "gas": 26072, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 512, + "op": "SWAP1", + "gas": 26069, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 513, + "op": "PUSH2", + "gas": 26066, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 516, + "op": "JUMP", + "gas": 26063, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5331, + "op": "JUMPDEST", + "gas": 26055, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5332, + "op": "PUSH0", + "gas": 26054, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5333, + "op": "DUP1", + "gas": 26052, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5334, + "op": "PUSH0", + "gas": 26049, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5335, + "op": "PUSH1", + "gas": 26047, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5337, + "op": "DUP5", + "gas": 26044, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5338, + "op": "DUP7", + "gas": 26041, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5339, + "op": "SUB", + "gas": 26038, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5340, + "op": "SLT", + "gas": 26035, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5341, + "op": "ISZERO", + "gas": 26032, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5342, + "op": "PUSH2", + "gas": 26029, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5345, + "op": "JUMPI", + "gas": 26026, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 5354, + "op": "JUMPDEST", + "gas": 26016, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5355, + "op": "PUSH0", + "gas": 26015, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5356, + "op": "PUSH2", + "gas": 26013, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5359, + "op": "DUP7", + "gas": 26010, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5360, + "op": "DUP3", + "gas": 26007, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5361, + "op": "DUP8", + "gas": 26004, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5362, + "op": "ADD", + "gas": 26001, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5363, + "op": "PUSH2", + "gas": 25998, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5366, + "op": "JUMP", + "gas": 25995, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5268, + "op": "JUMPDEST", + "gas": 25987, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5269, + "op": "PUSH0", + "gas": 25986, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5270, + "op": "DUP2", + "gas": 25984, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5271, + "op": "CALLDATALOAD", + "gas": 25981, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5272, + "op": "SWAP1", + "gas": 25978, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5273, + "op": "POP", + "gas": 25975, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5274, + "op": "PUSH2", + "gas": 25973, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5277, + "op": "DUP2", + "gas": 25970, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5278, + "op": "PUSH2", + "gas": 25967, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5281, + "op": "JUMP", + "gas": 25964, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5246, + "op": "JUMPDEST", + "gas": 25956, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5247, + "op": "PUSH2", + "gas": 25955, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5250, + "op": "DUP2", + "gas": 25952, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5251, + "op": "PUSH2", + "gas": 25949, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5254, + "op": "JUMP", + "gas": 25946, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 25938, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 25937, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 25935, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 25932, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 25929, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 25927, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 25924, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 25921, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 25919, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5255, + "op": "JUMPDEST", + "gas": 25911, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5256, + "op": "DUP2", + "gas": 25910, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5257, + "op": "EQ", + "gas": 25907, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5258, + "op": "PUSH2", + "gas": 25904, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5261, + "op": "JUMPI", + "gas": 25901, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 5265, + "op": "JUMPDEST", + "gas": 25891, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5266, + "op": "POP", + "gas": 25890, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5267, + "op": "JUMP", + "gas": 25888, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5282, + "op": "JUMPDEST", + "gas": 25880, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5283, + "op": "SWAP3", + "gas": 25879, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5284, + "op": "SWAP2", + "gas": 25876, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5285, + "op": "POP", + "gas": 25873, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5286, + "op": "POP", + "gas": 25871, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5287, + "op": "JUMP", + "gas": 25869, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5367, + "op": "JUMPDEST", + "gas": 25861, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5368, + "op": "SWAP4", + "gas": 25860, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5369, + "op": "POP", + "gas": 25857, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5370, + "op": "POP", + "gas": 25855, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5371, + "op": "PUSH1", + "gas": 25853, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5373, + "op": "PUSH2", + "gas": 25850, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5376, + "op": "DUP7", + "gas": 25847, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5377, + "op": "DUP3", + "gas": 25844, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5378, + "op": "DUP8", + "gas": 25841, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5379, + "op": "ADD", + "gas": 25838, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5380, + "op": "PUSH2", + "gas": 25835, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5383, + "op": "JUMP", + "gas": 25832, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5268, + "op": "JUMPDEST", + "gas": 25824, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5269, + "op": "PUSH0", + "gas": 25823, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5270, + "op": "DUP2", + "gas": 25821, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5271, + "op": "CALLDATALOAD", + "gas": 25818, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5272, + "op": "SWAP1", + "gas": 25815, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5273, + "op": "POP", + "gas": 25812, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5274, + "op": "PUSH2", + "gas": 25810, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5277, + "op": "DUP2", + "gas": 25807, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5278, + "op": "PUSH2", + "gas": 25804, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5281, + "op": "JUMP", + "gas": 25801, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5246, + "op": "JUMPDEST", + "gas": 25793, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5247, + "op": "PUSH2", + "gas": 25792, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5250, + "op": "DUP2", + "gas": 25789, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5251, + "op": "PUSH2", + "gas": 25786, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5254, + "op": "JUMP", + "gas": 25783, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 25775, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 25774, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 25772, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 25769, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 25766, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 25764, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 25761, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 25758, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 25756, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5255, + "op": "JUMPDEST", + "gas": 25748, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5256, + "op": "DUP2", + "gas": 25747, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5257, + "op": "EQ", + "gas": 25744, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5258, + "op": "PUSH2", + "gas": 25741, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5261, + "op": "JUMPI", + "gas": 25738, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 5265, + "op": "JUMPDEST", + "gas": 25728, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5266, + "op": "POP", + "gas": 25727, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5267, + "op": "JUMP", + "gas": 25725, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5282, + "op": "JUMPDEST", + "gas": 25717, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5283, + "op": "SWAP3", + "gas": 25716, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5284, + "op": "SWAP2", + "gas": 25713, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5285, + "op": "POP", + "gas": 25710, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5286, + "op": "POP", + "gas": 25708, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5287, + "op": "JUMP", + "gas": 25706, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5384, + "op": "JUMPDEST", + "gas": 25698, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5385, + "op": "SWAP3", + "gas": 25697, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5386, + "op": "POP", + "gas": 25694, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5387, + "op": "POP", + "gas": 25692, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5388, + "op": "PUSH1", + "gas": 25690, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5390, + "op": "PUSH2", + "gas": 25687, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5393, + "op": "DUP7", + "gas": 25684, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5394, + "op": "DUP3", + "gas": 25681, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5395, + "op": "DUP8", + "gas": 25678, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5396, + "op": "ADD", + "gas": 25675, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5397, + "op": "PUSH2", + "gas": 25672, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5400, + "op": "JUMP", + "gas": 25669, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5268, + "op": "JUMPDEST", + "gas": 25661, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5269, + "op": "PUSH0", + "gas": 25660, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5270, + "op": "DUP2", + "gas": 25658, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5271, + "op": "CALLDATALOAD", + "gas": 25655, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5272, + "op": "SWAP1", + "gas": 25652, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5273, + "op": "POP", + "gas": 25649, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5274, + "op": "PUSH2", + "gas": 25647, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5277, + "op": "DUP2", + "gas": 25644, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5278, + "op": "PUSH2", + "gas": 25641, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5281, + "op": "JUMP", + "gas": 25638, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5246, + "op": "JUMPDEST", + "gas": 25630, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5247, + "op": "PUSH2", + "gas": 25629, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5250, + "op": "DUP2", + "gas": 25626, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5251, + "op": "PUSH2", + "gas": 25623, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5254, + "op": "JUMP", + "gas": 25620, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 25612, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 25611, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 25609, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 25606, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 25603, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 25601, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 25598, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 25595, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 25593, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5255, + "op": "JUMPDEST", + "gas": 25585, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5256, + "op": "DUP2", + "gas": 25584, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5257, + "op": "EQ", + "gas": 25581, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5258, + "op": "PUSH2", + "gas": 25578, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5261, + "op": "JUMPI", + "gas": 25575, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 5265, + "op": "JUMPDEST", + "gas": 25565, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5266, + "op": "POP", + "gas": 25564, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5267, + "op": "JUMP", + "gas": 25562, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5282, + "op": "JUMPDEST", + "gas": 25554, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5283, + "op": "SWAP3", + "gas": 25553, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5284, + "op": "SWAP2", + "gas": 25550, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5285, + "op": "POP", + "gas": 25547, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5286, + "op": "POP", + "gas": 25545, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5287, + "op": "JUMP", + "gas": 25543, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5401, + "op": "JUMPDEST", + "gas": 25535, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5402, + "op": "SWAP2", + "gas": 25534, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5403, + "op": "POP", + "gas": 25531, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5404, + "op": "POP", + "gas": 25529, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5405, + "op": "SWAP3", + "gas": 25527, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5406, + "op": "POP", + "gas": 25524, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5407, + "op": "SWAP3", + "gas": 25522, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5408, + "op": "POP", + "gas": 25519, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5409, + "op": "SWAP3", + "gas": 25517, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5410, + "op": "JUMP", + "gas": 25514, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 517, + "op": "JUMPDEST", + "gas": 25506, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 518, + "op": "PUSH2", + "gas": 25505, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 521, + "op": "JUMP", + "gas": 25502, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 2640, + "op": "JUMPDEST", + "gas": 25494, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 2641, + "op": "PUSH0", + "gas": 25493, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2642, + "op": "DUP1", + "gas": 25491, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2643, + "op": "PUSH2", + "gas": 25488, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2646, + "op": "DUP6", + "gas": 25485, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2647, + "op": "PUSH2", + "gas": 25482, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2650, + "op": "JUMP", + "gas": 25479, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4080, + "op": "JUMPDEST", + "gas": 25471, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4081, + "op": "PUSH1", + "gas": 25470, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4083, + "op": "PUSH0", + "gas": 25467, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4084, + "op": "DUP3", + "gas": 25465, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4085, + "op": "SUB", + "gas": 25462, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4086, + "op": "PUSH2", + "gas": 25459, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4089, + "op": "JUMPI", + "gas": 25456, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4150, + "op": "JUMPDEST", + "gas": 25446, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4151, + "op": "PUSH0", + "gas": 25445, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4152, + "op": "DUP3", + "gas": 25443, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4153, + "op": "SWAP1", + "gas": 25440, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4154, + "op": "POP", + "gas": 25437, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4155, + "op": "PUSH0", + "gas": 25435, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4156, + "op": "JUMPDEST", + "gas": 25433, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4157, + "op": "PUSH0", + "gas": 25432, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4158, + "op": "DUP3", + "gas": 25430, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4159, + "op": "EQ", + "gas": 25427, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4160, + "op": "PUSH2", + "gas": 25424, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4163, + "op": "JUMPI", + "gas": 25421, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4164, + "op": "DUP1", + "gas": 25411, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4165, + "op": "DUP1", + "gas": 25408, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4166, + "op": "PUSH2", + "gas": 25405, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4169, + "op": "SWAP1", + "gas": 25402, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4170, + "op": "PUSH2", + "gas": 25399, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4173, + "op": "JUMP", + "gas": 25396, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7504, + "op": "JUMPDEST", + "gas": 25388, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7505, + "op": "PUSH0", + "gas": 25387, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7506, + "op": "PUSH2", + "gas": 25385, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7509, + "op": "DUP3", + "gas": 25382, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7510, + "op": "PUSH2", + "gas": 25379, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7513, + "op": "JUMP", + "gas": 25376, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 25368, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 25367, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 25365, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 25362, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 25359, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 25357, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 25354, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 25351, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 25349, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7514, + "op": "JUMPDEST", + "gas": 25341, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7515, + "op": "SWAP2", + "gas": 25340, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7516, + "op": "POP", + "gas": 25337, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7517, + "op": "PUSH32", + "gas": 25335, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7550, + "op": "DUP3", + "gas": 25332, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7551, + "op": "SUB", + "gas": 25329, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7552, + "op": "PUSH2", + "gas": 25326, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7555, + "op": "JUMPI", + "gas": 25323, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7564, + "op": "JUMPDEST", + "gas": 25313, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7565, + "op": "PUSH1", + "gas": 25312, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7567, + "op": "DUP3", + "gas": 25309, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7568, + "op": "ADD", + "gas": 25306, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7569, + "op": "SWAP1", + "gas": 25303, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7570, + "op": "POP", + "gas": 25300, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7571, + "op": "SWAP2", + "gas": 25298, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7572, + "op": "SWAP1", + "gas": 25295, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7573, + "op": "POP", + "gas": 25292, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7574, + "op": "JUMP", + "gas": 25290, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4174, + "op": "JUMPDEST", + "gas": 25282, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4175, + "op": "SWAP2", + "gas": 25281, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4176, + "op": "POP", + "gas": 25278, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4177, + "op": "POP", + "gas": 25276, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4178, + "op": "PUSH1", + "gas": 25274, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4180, + "op": "DUP3", + "gas": 25271, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4181, + "op": "PUSH2", + "gas": 25268, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4184, + "op": "SWAP2", + "gas": 25265, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4185, + "op": "SWAP1", + "gas": 25262, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4186, + "op": "PUSH2", + "gas": 25259, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4189, + "op": "JUMP", + "gas": 25256, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7575, + "op": "JUMPDEST", + "gas": 25248, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7576, + "op": "PUSH0", + "gas": 25247, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7577, + "op": "PUSH2", + "gas": 25245, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7580, + "op": "DUP3", + "gas": 25242, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7581, + "op": "PUSH2", + "gas": 25239, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7584, + "op": "JUMP", + "gas": 25236, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 25228, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 25227, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 25225, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 25222, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 25219, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 25217, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 25214, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 25211, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 25209, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7585, + "op": "JUMPDEST", + "gas": 25201, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7586, + "op": "SWAP2", + "gas": 25200, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7587, + "op": "POP", + "gas": 25197, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7588, + "op": "PUSH2", + "gas": 25195, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7591, + "op": "DUP4", + "gas": 25192, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7592, + "op": "PUSH2", + "gas": 25189, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7595, + "op": "JUMP", + "gas": 25186, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 25178, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 25177, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 25175, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 25172, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 25169, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 25167, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 25164, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 25161, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 25159, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7596, + "op": "JUMPDEST", + "gas": 25151, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7597, + "op": "SWAP3", + "gas": 25150, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7598, + "op": "POP", + "gas": 25147, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7599, + "op": "DUP3", + "gas": 25145, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7600, + "op": "PUSH2", + "gas": 25142, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7603, + "op": "JUMPI", + "gas": 25139, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7612, + "op": "JUMPDEST", + "gas": 25129, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7613, + "op": "DUP3", + "gas": 25128, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7614, + "op": "DUP3", + "gas": 25125, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7615, + "op": "DIV", + "gas": 25122, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 7616, + "op": "SWAP1", + "gas": 25117, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7617, + "op": "POP", + "gas": 25114, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7618, + "op": "SWAP3", + "gas": 25112, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7619, + "op": "SWAP2", + "gas": 25109, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7620, + "op": "POP", + "gas": 25106, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7621, + "op": "POP", + "gas": 25104, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7622, + "op": "JUMP", + "gas": 25102, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4190, + "op": "JUMPDEST", + "gas": 25094, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4191, + "op": "SWAP2", + "gas": 25093, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4192, + "op": "POP", + "gas": 25090, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4193, + "op": "PUSH2", + "gas": 25088, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4196, + "op": "JUMP", + "gas": 25085, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4156, + "op": "JUMPDEST", + "gas": 25077, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4157, + "op": "PUSH0", + "gas": 25076, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4158, + "op": "DUP3", + "gas": 25074, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4159, + "op": "EQ", + "gas": 25071, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4160, + "op": "PUSH2", + "gas": 25068, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4163, + "op": "JUMPI", + "gas": 25065, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4164, + "op": "DUP1", + "gas": 25055, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4165, + "op": "DUP1", + "gas": 25052, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4166, + "op": "PUSH2", + "gas": 25049, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4169, + "op": "SWAP1", + "gas": 25046, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4170, + "op": "PUSH2", + "gas": 25043, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4173, + "op": "JUMP", + "gas": 25040, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7504, + "op": "JUMPDEST", + "gas": 25032, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7505, + "op": "PUSH0", + "gas": 25031, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7506, + "op": "PUSH2", + "gas": 25029, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7509, + "op": "DUP3", + "gas": 25026, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7510, + "op": "PUSH2", + "gas": 25023, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7513, + "op": "JUMP", + "gas": 25020, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 25012, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 25011, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 25009, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 25006, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 25003, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 25001, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 24998, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 24995, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 24993, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7514, + "op": "JUMPDEST", + "gas": 24985, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7515, + "op": "SWAP2", + "gas": 24984, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7516, + "op": "POP", + "gas": 24981, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7517, + "op": "PUSH32", + "gas": 24979, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7550, + "op": "DUP3", + "gas": 24976, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7551, + "op": "SUB", + "gas": 24973, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7552, + "op": "PUSH2", + "gas": 24970, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7555, + "op": "JUMPI", + "gas": 24967, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7564, + "op": "JUMPDEST", + "gas": 24957, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7565, + "op": "PUSH1", + "gas": 24956, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7567, + "op": "DUP3", + "gas": 24953, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7568, + "op": "ADD", + "gas": 24950, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7569, + "op": "SWAP1", + "gas": 24947, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7570, + "op": "POP", + "gas": 24944, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7571, + "op": "SWAP2", + "gas": 24942, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7572, + "op": "SWAP1", + "gas": 24939, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7573, + "op": "POP", + "gas": 24936, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7574, + "op": "JUMP", + "gas": 24934, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4174, + "op": "JUMPDEST", + "gas": 24926, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4175, + "op": "SWAP2", + "gas": 24925, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4176, + "op": "POP", + "gas": 24922, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4177, + "op": "POP", + "gas": 24920, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4178, + "op": "PUSH1", + "gas": 24918, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4180, + "op": "DUP3", + "gas": 24915, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4181, + "op": "PUSH2", + "gas": 24912, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4184, + "op": "SWAP2", + "gas": 24909, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4185, + "op": "SWAP1", + "gas": 24906, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4186, + "op": "PUSH2", + "gas": 24903, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4189, + "op": "JUMP", + "gas": 24900, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7575, + "op": "JUMPDEST", + "gas": 24892, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7576, + "op": "PUSH0", + "gas": 24891, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7577, + "op": "PUSH2", + "gas": 24889, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7580, + "op": "DUP3", + "gas": 24886, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7581, + "op": "PUSH2", + "gas": 24883, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7584, + "op": "JUMP", + "gas": 24880, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 24872, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 24871, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 24869, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 24866, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 24863, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 24861, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 24858, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 24855, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 24853, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7585, + "op": "JUMPDEST", + "gas": 24845, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7586, + "op": "SWAP2", + "gas": 24844, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7587, + "op": "POP", + "gas": 24841, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7588, + "op": "PUSH2", + "gas": 24839, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7591, + "op": "DUP4", + "gas": 24836, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7592, + "op": "PUSH2", + "gas": 24833, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7595, + "op": "JUMP", + "gas": 24830, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 24822, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 24821, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 24819, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 24816, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 24813, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 24811, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 24808, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 24805, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 24803, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7596, + "op": "JUMPDEST", + "gas": 24795, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7597, + "op": "SWAP3", + "gas": 24794, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7598, + "op": "POP", + "gas": 24791, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7599, + "op": "DUP3", + "gas": 24789, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7600, + "op": "PUSH2", + "gas": 24786, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7603, + "op": "JUMPI", + "gas": 24783, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7612, + "op": "JUMPDEST", + "gas": 24773, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7613, + "op": "DUP3", + "gas": 24772, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7614, + "op": "DUP3", + "gas": 24769, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7615, + "op": "DIV", + "gas": 24766, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 7616, + "op": "SWAP1", + "gas": 24761, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7617, + "op": "POP", + "gas": 24758, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7618, + "op": "SWAP3", + "gas": 24756, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7619, + "op": "SWAP2", + "gas": 24753, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7620, + "op": "POP", + "gas": 24750, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7621, + "op": "POP", + "gas": 24748, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7622, + "op": "JUMP", + "gas": 24746, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4190, + "op": "JUMPDEST", + "gas": 24738, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4191, + "op": "SWAP2", + "gas": 24737, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4192, + "op": "POP", + "gas": 24734, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4193, + "op": "PUSH2", + "gas": 24732, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4196, + "op": "JUMP", + "gas": 24729, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4156, + "op": "JUMPDEST", + "gas": 24721, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4157, + "op": "PUSH0", + "gas": 24720, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4158, + "op": "DUP3", + "gas": 24718, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4159, + "op": "EQ", + "gas": 24715, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4160, + "op": "PUSH2", + "gas": 24712, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4163, + "op": "JUMPI", + "gas": 24709, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4197, + "op": "JUMPDEST", + "gas": 24699, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4198, + "op": "PUSH0", + "gas": 24698, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4199, + "op": "DUP2", + "gas": 24696, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4200, + "op": "PUSH8", + "gas": 24693, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4209, + "op": "DUP2", + "gas": 24690, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4210, + "op": "GT", + "gas": 24687, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4211, + "op": "ISZERO", + "gas": 24684, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4212, + "op": "PUSH2", + "gas": 24681, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4215, + "op": "JUMPI", + "gas": 24678, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4224, + "op": "JUMPDEST", + "gas": 24668, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4225, + "op": "PUSH1", + "gas": 24667, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4227, + "op": "MLOAD", + "gas": 24664, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4228, + "op": "SWAP1", + "gas": 24661, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4229, + "op": "DUP1", + "gas": 24658, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4230, + "op": "DUP3", + "gas": 24655, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4231, + "op": "MSTORE", + "gas": 24652, + "gasCost": 9, + "depth": 1 + }, + { + "pc": 4232, + "op": "DUP1", + "gas": 24643, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4233, + "op": "PUSH1", + "gas": 24640, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4235, + "op": "ADD", + "gas": 24637, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4236, + "op": "PUSH1", + "gas": 24634, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4238, + "op": "NOT", + "gas": 24631, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4239, + "op": "AND", + "gas": 24628, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4240, + "op": "PUSH1", + "gas": 24625, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4242, + "op": "ADD", + "gas": 24622, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4243, + "op": "DUP3", + "gas": 24619, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4244, + "op": "ADD", + "gas": 24616, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4245, + "op": "PUSH1", + "gas": 24613, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4247, + "op": "MSTORE", + "gas": 24610, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4248, + "op": "DUP1", + "gas": 24607, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4249, + "op": "ISZERO", + "gas": 24604, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4250, + "op": "PUSH2", + "gas": 24601, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4253, + "op": "JUMPI", + "gas": 24598, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4254, + "op": "DUP2", + "gas": 24588, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4255, + "op": "PUSH1", + "gas": 24585, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4257, + "op": "ADD", + "gas": 24582, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4258, + "op": "PUSH1", + "gas": 24579, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4260, + "op": "DUP3", + "gas": 24576, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4261, + "op": "MUL", + "gas": 24573, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 4262, + "op": "DUP1", + "gas": 24568, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4263, + "op": "CALLDATASIZE", + "gas": 24565, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4264, + "op": "DUP4", + "gas": 24563, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4265, + "op": "CALLDATACOPY", + "gas": 24560, + "gasCost": 9, + "depth": 1 + }, + { + "pc": 4266, + "op": "DUP1", + "gas": 24551, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4267, + "op": "DUP3", + "gas": 24548, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4268, + "op": "ADD", + "gas": 24545, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4269, + "op": "SWAP2", + "gas": 24542, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4270, + "op": "POP", + "gas": 24539, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4271, + "op": "POP", + "gas": 24537, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4272, + "op": "SWAP1", + "gas": 24535, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4273, + "op": "POP", + "gas": 24532, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4274, + "op": "JUMPDEST", + "gas": 24530, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4275, + "op": "POP", + "gas": 24529, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4276, + "op": "SWAP1", + "gas": 24527, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4277, + "op": "POP", + "gas": 24524, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4278, + "op": "JUMPDEST", + "gas": 24522, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4279, + "op": "PUSH0", + "gas": 24521, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4280, + "op": "DUP6", + "gas": 24519, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4281, + "op": "EQ", + "gas": 24516, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4282, + "op": "PUSH2", + "gas": 24513, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4285, + "op": "JUMPI", + "gas": 24510, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4286, + "op": "PUSH1", + "gas": 24500, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4288, + "op": "DUP3", + "gas": 24497, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4289, + "op": "PUSH2", + "gas": 24494, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4292, + "op": "SWAP2", + "gas": 24491, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4293, + "op": "SWAP1", + "gas": 24488, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4294, + "op": "PUSH2", + "gas": 24485, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4297, + "op": "JUMP", + "gas": 24482, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7360, + "op": "JUMPDEST", + "gas": 24474, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7361, + "op": "PUSH0", + "gas": 24473, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7362, + "op": "PUSH2", + "gas": 24471, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7365, + "op": "DUP3", + "gas": 24468, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7366, + "op": "PUSH2", + "gas": 24465, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7369, + "op": "JUMP", + "gas": 24462, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 24454, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 24453, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 24451, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 24448, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 24445, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 24443, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 24440, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 24437, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 24435, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7370, + "op": "JUMPDEST", + "gas": 24427, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7371, + "op": "SWAP2", + "gas": 24426, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7372, + "op": "POP", + "gas": 24423, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7373, + "op": "PUSH2", + "gas": 24421, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7376, + "op": "DUP4", + "gas": 24418, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7377, + "op": "PUSH2", + "gas": 24415, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7380, + "op": "JUMP", + "gas": 24412, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 24404, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 24403, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 24401, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 24398, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 24395, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 24393, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 24390, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 24387, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 24385, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7381, + "op": "JUMPDEST", + "gas": 24377, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7382, + "op": "SWAP3", + "gas": 24376, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7383, + "op": "POP", + "gas": 24373, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7384, + "op": "DUP3", + "gas": 24371, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7385, + "op": "DUP3", + "gas": 24368, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7386, + "op": "SUB", + "gas": 24365, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7387, + "op": "SWAP1", + "gas": 24362, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7388, + "op": "POP", + "gas": 24359, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7389, + "op": "DUP2", + "gas": 24357, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7390, + "op": "DUP2", + "gas": 24354, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7391, + "op": "GT", + "gas": 24351, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7392, + "op": "ISZERO", + "gas": 24348, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7393, + "op": "PUSH2", + "gas": 24345, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7396, + "op": "JUMPI", + "gas": 24342, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7405, + "op": "JUMPDEST", + "gas": 24332, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7406, + "op": "SWAP3", + "gas": 24331, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7407, + "op": "SWAP2", + "gas": 24328, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7408, + "op": "POP", + "gas": 24325, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7409, + "op": "POP", + "gas": 24323, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7410, + "op": "JUMP", + "gas": 24321, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4298, + "op": "JUMPDEST", + "gas": 24313, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4299, + "op": "SWAP2", + "gas": 24312, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4300, + "op": "POP", + "gas": 24309, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4301, + "op": "PUSH1", + "gas": 24307, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4303, + "op": "DUP6", + "gas": 24304, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4304, + "op": "PUSH2", + "gas": 24301, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4307, + "op": "SWAP2", + "gas": 24298, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4308, + "op": "SWAP1", + "gas": 24295, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4309, + "op": "PUSH2", + "gas": 24292, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4312, + "op": "JUMP", + "gas": 24289, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7456, + "op": "JUMPDEST", + "gas": 24281, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7457, + "op": "PUSH0", + "gas": 24280, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7458, + "op": "PUSH2", + "gas": 24278, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7461, + "op": "DUP3", + "gas": 24275, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7462, + "op": "PUSH2", + "gas": 24272, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7465, + "op": "JUMP", + "gas": 24269, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 24261, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 24260, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 24258, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 24255, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 24252, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 24250, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 24247, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 24244, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 24242, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7466, + "op": "JUMPDEST", + "gas": 24234, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7467, + "op": "SWAP2", + "gas": 24233, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7468, + "op": "POP", + "gas": 24230, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7469, + "op": "PUSH2", + "gas": 24228, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7472, + "op": "DUP4", + "gas": 24225, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7473, + "op": "PUSH2", + "gas": 24222, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7476, + "op": "JUMP", + "gas": 24219, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 24211, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 24210, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 24208, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 24205, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 24202, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 24200, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 24197, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 24194, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 24192, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7477, + "op": "JUMPDEST", + "gas": 24184, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7478, + "op": "SWAP3", + "gas": 24183, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7479, + "op": "POP", + "gas": 24180, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7480, + "op": "DUP3", + "gas": 24178, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7481, + "op": "PUSH2", + "gas": 24175, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7484, + "op": "JUMPI", + "gas": 24172, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7493, + "op": "JUMPDEST", + "gas": 24162, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7494, + "op": "DUP3", + "gas": 24161, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7495, + "op": "DUP3", + "gas": 24158, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7496, + "op": "MOD", + "gas": 24155, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 7497, + "op": "SWAP1", + "gas": 24150, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7498, + "op": "POP", + "gas": 24147, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7499, + "op": "SWAP3", + "gas": 24145, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7500, + "op": "SWAP2", + "gas": 24142, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7501, + "op": "POP", + "gas": 24139, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7502, + "op": "POP", + "gas": 24137, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7503, + "op": "JUMP", + "gas": 24135, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4313, + "op": "JUMPDEST", + "gas": 24127, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4314, + "op": "PUSH1", + "gas": 24126, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4316, + "op": "PUSH2", + "gas": 24123, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4319, + "op": "SWAP2", + "gas": 24120, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4320, + "op": "SWAP1", + "gas": 24117, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4321, + "op": "PUSH2", + "gas": 24114, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4324, + "op": "JUMP", + "gas": 24111, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6786, + "op": "JUMPDEST", + "gas": 24103, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6787, + "op": "PUSH0", + "gas": 24102, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6788, + "op": "PUSH2", + "gas": 24100, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6791, + "op": "DUP3", + "gas": 24097, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6792, + "op": "PUSH2", + "gas": 24094, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6795, + "op": "JUMP", + "gas": 24091, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 24083, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 24082, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 24080, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 24077, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 24074, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 24072, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 24069, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 24066, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 24064, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6796, + "op": "JUMPDEST", + "gas": 24056, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6797, + "op": "SWAP2", + "gas": 24055, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6798, + "op": "POP", + "gas": 24052, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6799, + "op": "PUSH2", + "gas": 24050, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6802, + "op": "DUP4", + "gas": 24047, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6803, + "op": "PUSH2", + "gas": 24044, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6806, + "op": "JUMP", + "gas": 24041, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 24033, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 24032, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 24030, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 24027, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 24024, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 24022, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 24019, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 24016, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 24014, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6807, + "op": "JUMPDEST", + "gas": 24006, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6808, + "op": "SWAP3", + "gas": 24005, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6809, + "op": "POP", + "gas": 24002, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6810, + "op": "DUP3", + "gas": 24000, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6811, + "op": "DUP3", + "gas": 23997, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6812, + "op": "ADD", + "gas": 23994, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6813, + "op": "SWAP1", + "gas": 23991, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6814, + "op": "POP", + "gas": 23988, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6815, + "op": "DUP1", + "gas": 23986, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6816, + "op": "DUP3", + "gas": 23983, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6817, + "op": "GT", + "gas": 23980, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6818, + "op": "ISZERO", + "gas": 23977, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6819, + "op": "PUSH2", + "gas": 23974, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6822, + "op": "JUMPI", + "gas": 23971, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6831, + "op": "JUMPDEST", + "gas": 23961, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6832, + "op": "SWAP3", + "gas": 23960, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6833, + "op": "SWAP2", + "gas": 23957, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6834, + "op": "POP", + "gas": 23954, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6835, + "op": "POP", + "gas": 23952, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6836, + "op": "JUMP", + "gas": 23950, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4325, + "op": "JUMPDEST", + "gas": 23942, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4326, + "op": "PUSH1", + "gas": 23941, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4328, + "op": "SHL", + "gas": 23938, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4329, + "op": "DUP2", + "gas": 23935, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4330, + "op": "DUP4", + "gas": 23932, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4331, + "op": "DUP2", + "gas": 23929, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4332, + "op": "MLOAD", + "gas": 23926, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4333, + "op": "DUP2", + "gas": 23923, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4334, + "op": "LT", + "gas": 23920, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4335, + "op": "PUSH2", + "gas": 23917, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4338, + "op": "JUMPI", + "gas": 23914, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4347, + "op": "JUMPDEST", + "gas": 23904, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4348, + "op": "PUSH1", + "gas": 23903, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4350, + "op": "ADD", + "gas": 23900, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4351, + "op": "ADD", + "gas": 23897, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4352, + "op": "SWAP1", + "gas": 23894, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4353, + "op": "PUSH31", + "gas": 23891, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4385, + "op": "NOT", + "gas": 23888, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4386, + "op": "AND", + "gas": 23885, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4387, + "op": "SWAP1", + "gas": 23882, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4388, + "op": "DUP2", + "gas": 23879, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4389, + "op": "PUSH0", + "gas": 23876, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4390, + "op": "BYTE", + "gas": 23874, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4391, + "op": "SWAP1", + "gas": 23871, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4392, + "op": "MSTORE8", + "gas": 23868, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4393, + "op": "POP", + "gas": 23865, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4394, + "op": "PUSH1", + "gas": 23863, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4396, + "op": "DUP6", + "gas": 23860, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4397, + "op": "PUSH2", + "gas": 23857, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4400, + "op": "SWAP2", + "gas": 23854, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4401, + "op": "SWAP1", + "gas": 23851, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4402, + "op": "PUSH2", + "gas": 23848, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4405, + "op": "JUMP", + "gas": 23845, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7575, + "op": "JUMPDEST", + "gas": 23837, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7576, + "op": "PUSH0", + "gas": 23836, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7577, + "op": "PUSH2", + "gas": 23834, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7580, + "op": "DUP3", + "gas": 23831, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7581, + "op": "PUSH2", + "gas": 23828, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7584, + "op": "JUMP", + "gas": 23825, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 23817, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 23816, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 23814, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 23811, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 23808, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 23806, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 23803, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 23800, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 23798, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7585, + "op": "JUMPDEST", + "gas": 23790, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7586, + "op": "SWAP2", + "gas": 23789, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7587, + "op": "POP", + "gas": 23786, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7588, + "op": "PUSH2", + "gas": 23784, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7591, + "op": "DUP4", + "gas": 23781, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7592, + "op": "PUSH2", + "gas": 23778, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7595, + "op": "JUMP", + "gas": 23775, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 23767, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 23766, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 23764, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 23761, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 23758, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 23756, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 23753, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 23750, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 23748, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7596, + "op": "JUMPDEST", + "gas": 23740, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7597, + "op": "SWAP3", + "gas": 23739, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7598, + "op": "POP", + "gas": 23736, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7599, + "op": "DUP3", + "gas": 23734, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7600, + "op": "PUSH2", + "gas": 23731, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7603, + "op": "JUMPI", + "gas": 23728, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7612, + "op": "JUMPDEST", + "gas": 23718, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7613, + "op": "DUP3", + "gas": 23717, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7614, + "op": "DUP3", + "gas": 23714, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7615, + "op": "DIV", + "gas": 23711, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 7616, + "op": "SWAP1", + "gas": 23706, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7617, + "op": "POP", + "gas": 23703, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7618, + "op": "SWAP3", + "gas": 23701, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7619, + "op": "SWAP2", + "gas": 23698, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7620, + "op": "POP", + "gas": 23695, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7621, + "op": "POP", + "gas": 23693, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7622, + "op": "JUMP", + "gas": 23691, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4406, + "op": "JUMPDEST", + "gas": 23683, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4407, + "op": "SWAP5", + "gas": 23682, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4408, + "op": "POP", + "gas": 23679, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4409, + "op": "PUSH2", + "gas": 23677, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4412, + "op": "JUMP", + "gas": 23674, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4278, + "op": "JUMPDEST", + "gas": 23666, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4279, + "op": "PUSH0", + "gas": 23665, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4280, + "op": "DUP6", + "gas": 23663, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4281, + "op": "EQ", + "gas": 23660, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4282, + "op": "PUSH2", + "gas": 23657, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4285, + "op": "JUMPI", + "gas": 23654, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4286, + "op": "PUSH1", + "gas": 23644, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4288, + "op": "DUP3", + "gas": 23641, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4289, + "op": "PUSH2", + "gas": 23638, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4292, + "op": "SWAP2", + "gas": 23635, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4293, + "op": "SWAP1", + "gas": 23632, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4294, + "op": "PUSH2", + "gas": 23629, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4297, + "op": "JUMP", + "gas": 23626, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7360, + "op": "JUMPDEST", + "gas": 23618, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7361, + "op": "PUSH0", + "gas": 23617, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7362, + "op": "PUSH2", + "gas": 23615, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7365, + "op": "DUP3", + "gas": 23612, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7366, + "op": "PUSH2", + "gas": 23609, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7369, + "op": "JUMP", + "gas": 23606, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 23598, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 23597, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 23595, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 23592, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 23589, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 23587, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 23584, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 23581, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 23579, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7370, + "op": "JUMPDEST", + "gas": 23571, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7371, + "op": "SWAP2", + "gas": 23570, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7372, + "op": "POP", + "gas": 23567, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7373, + "op": "PUSH2", + "gas": 23565, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7376, + "op": "DUP4", + "gas": 23562, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7377, + "op": "PUSH2", + "gas": 23559, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7380, + "op": "JUMP", + "gas": 23556, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 23548, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 23547, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 23545, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 23542, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 23539, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 23537, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 23534, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 23531, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 23529, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7381, + "op": "JUMPDEST", + "gas": 23521, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7382, + "op": "SWAP3", + "gas": 23520, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7383, + "op": "POP", + "gas": 23517, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7384, + "op": "DUP3", + "gas": 23515, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7385, + "op": "DUP3", + "gas": 23512, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7386, + "op": "SUB", + "gas": 23509, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7387, + "op": "SWAP1", + "gas": 23506, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7388, + "op": "POP", + "gas": 23503, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7389, + "op": "DUP2", + "gas": 23501, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7390, + "op": "DUP2", + "gas": 23498, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7391, + "op": "GT", + "gas": 23495, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7392, + "op": "ISZERO", + "gas": 23492, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7393, + "op": "PUSH2", + "gas": 23489, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7396, + "op": "JUMPI", + "gas": 23486, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7405, + "op": "JUMPDEST", + "gas": 23476, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7406, + "op": "SWAP3", + "gas": 23475, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7407, + "op": "SWAP2", + "gas": 23472, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7408, + "op": "POP", + "gas": 23469, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7409, + "op": "POP", + "gas": 23467, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7410, + "op": "JUMP", + "gas": 23465, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4298, + "op": "JUMPDEST", + "gas": 23457, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4299, + "op": "SWAP2", + "gas": 23456, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4300, + "op": "POP", + "gas": 23453, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4301, + "op": "PUSH1", + "gas": 23451, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4303, + "op": "DUP6", + "gas": 23448, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4304, + "op": "PUSH2", + "gas": 23445, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4307, + "op": "SWAP2", + "gas": 23442, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4308, + "op": "SWAP1", + "gas": 23439, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4309, + "op": "PUSH2", + "gas": 23436, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4312, + "op": "JUMP", + "gas": 23433, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7456, + "op": "JUMPDEST", + "gas": 23425, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7457, + "op": "PUSH0", + "gas": 23424, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7458, + "op": "PUSH2", + "gas": 23422, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7461, + "op": "DUP3", + "gas": 23419, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7462, + "op": "PUSH2", + "gas": 23416, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7465, + "op": "JUMP", + "gas": 23413, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 23405, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 23404, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 23402, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 23399, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 23396, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 23394, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 23391, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 23388, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 23386, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7466, + "op": "JUMPDEST", + "gas": 23378, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7467, + "op": "SWAP2", + "gas": 23377, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7468, + "op": "POP", + "gas": 23374, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7469, + "op": "PUSH2", + "gas": 23372, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7472, + "op": "DUP4", + "gas": 23369, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7473, + "op": "PUSH2", + "gas": 23366, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7476, + "op": "JUMP", + "gas": 23363, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 23355, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 23354, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 23352, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 23349, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 23346, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 23344, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 23341, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 23338, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 23336, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7477, + "op": "JUMPDEST", + "gas": 23328, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7478, + "op": "SWAP3", + "gas": 23327, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7479, + "op": "POP", + "gas": 23324, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7480, + "op": "DUP3", + "gas": 23322, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7481, + "op": "PUSH2", + "gas": 23319, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7484, + "op": "JUMPI", + "gas": 23316, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7493, + "op": "JUMPDEST", + "gas": 23306, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7494, + "op": "DUP3", + "gas": 23305, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7495, + "op": "DUP3", + "gas": 23302, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7496, + "op": "MOD", + "gas": 23299, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 7497, + "op": "SWAP1", + "gas": 23294, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7498, + "op": "POP", + "gas": 23291, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7499, + "op": "SWAP3", + "gas": 23289, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7500, + "op": "SWAP2", + "gas": 23286, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7501, + "op": "POP", + "gas": 23283, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7502, + "op": "POP", + "gas": 23281, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7503, + "op": "JUMP", + "gas": 23279, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4313, + "op": "JUMPDEST", + "gas": 23271, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4314, + "op": "PUSH1", + "gas": 23270, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4316, + "op": "PUSH2", + "gas": 23267, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4319, + "op": "SWAP2", + "gas": 23264, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4320, + "op": "SWAP1", + "gas": 23261, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4321, + "op": "PUSH2", + "gas": 23258, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4324, + "op": "JUMP", + "gas": 23255, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6786, + "op": "JUMPDEST", + "gas": 23247, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6787, + "op": "PUSH0", + "gas": 23246, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6788, + "op": "PUSH2", + "gas": 23244, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6791, + "op": "DUP3", + "gas": 23241, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6792, + "op": "PUSH2", + "gas": 23238, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6795, + "op": "JUMP", + "gas": 23235, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 23227, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 23226, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 23224, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 23221, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 23218, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 23216, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 23213, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 23210, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 23208, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6796, + "op": "JUMPDEST", + "gas": 23200, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6797, + "op": "SWAP2", + "gas": 23199, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6798, + "op": "POP", + "gas": 23196, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6799, + "op": "PUSH2", + "gas": 23194, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6802, + "op": "DUP4", + "gas": 23191, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6803, + "op": "PUSH2", + "gas": 23188, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6806, + "op": "JUMP", + "gas": 23185, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 23177, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 23176, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 23174, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 23171, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 23168, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 23166, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 23163, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 23160, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 23158, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6807, + "op": "JUMPDEST", + "gas": 23150, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6808, + "op": "SWAP3", + "gas": 23149, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6809, + "op": "POP", + "gas": 23146, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6810, + "op": "DUP3", + "gas": 23144, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6811, + "op": "DUP3", + "gas": 23141, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6812, + "op": "ADD", + "gas": 23138, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6813, + "op": "SWAP1", + "gas": 23135, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6814, + "op": "POP", + "gas": 23132, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6815, + "op": "DUP1", + "gas": 23130, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6816, + "op": "DUP3", + "gas": 23127, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6817, + "op": "GT", + "gas": 23124, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6818, + "op": "ISZERO", + "gas": 23121, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6819, + "op": "PUSH2", + "gas": 23118, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6822, + "op": "JUMPI", + "gas": 23115, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6831, + "op": "JUMPDEST", + "gas": 23105, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6832, + "op": "SWAP3", + "gas": 23104, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6833, + "op": "SWAP2", + "gas": 23101, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6834, + "op": "POP", + "gas": 23098, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6835, + "op": "POP", + "gas": 23096, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6836, + "op": "JUMP", + "gas": 23094, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4325, + "op": "JUMPDEST", + "gas": 23086, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4326, + "op": "PUSH1", + "gas": 23085, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4328, + "op": "SHL", + "gas": 23082, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4329, + "op": "DUP2", + "gas": 23079, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4330, + "op": "DUP4", + "gas": 23076, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4331, + "op": "DUP2", + "gas": 23073, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4332, + "op": "MLOAD", + "gas": 23070, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4333, + "op": "DUP2", + "gas": 23067, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4334, + "op": "LT", + "gas": 23064, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4335, + "op": "PUSH2", + "gas": 23061, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4338, + "op": "JUMPI", + "gas": 23058, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4347, + "op": "JUMPDEST", + "gas": 23048, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4348, + "op": "PUSH1", + "gas": 23047, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4350, + "op": "ADD", + "gas": 23044, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4351, + "op": "ADD", + "gas": 23041, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4352, + "op": "SWAP1", + "gas": 23038, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4353, + "op": "PUSH31", + "gas": 23035, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4385, + "op": "NOT", + "gas": 23032, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4386, + "op": "AND", + "gas": 23029, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4387, + "op": "SWAP1", + "gas": 23026, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4388, + "op": "DUP2", + "gas": 23023, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4389, + "op": "PUSH0", + "gas": 23020, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4390, + "op": "BYTE", + "gas": 23018, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4391, + "op": "SWAP1", + "gas": 23015, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4392, + "op": "MSTORE8", + "gas": 23012, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4393, + "op": "POP", + "gas": 23009, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4394, + "op": "PUSH1", + "gas": 23007, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4396, + "op": "DUP6", + "gas": 23004, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4397, + "op": "PUSH2", + "gas": 23001, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4400, + "op": "SWAP2", + "gas": 22998, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4401, + "op": "SWAP1", + "gas": 22995, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4402, + "op": "PUSH2", + "gas": 22992, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4405, + "op": "JUMP", + "gas": 22989, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7575, + "op": "JUMPDEST", + "gas": 22981, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7576, + "op": "PUSH0", + "gas": 22980, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7577, + "op": "PUSH2", + "gas": 22978, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7580, + "op": "DUP3", + "gas": 22975, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7581, + "op": "PUSH2", + "gas": 22972, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7584, + "op": "JUMP", + "gas": 22969, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 22961, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 22960, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 22958, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 22955, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 22952, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 22950, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 22947, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 22944, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 22942, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7585, + "op": "JUMPDEST", + "gas": 22934, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7586, + "op": "SWAP2", + "gas": 22933, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7587, + "op": "POP", + "gas": 22930, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7588, + "op": "PUSH2", + "gas": 22928, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7591, + "op": "DUP4", + "gas": 22925, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7592, + "op": "PUSH2", + "gas": 22922, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7595, + "op": "JUMP", + "gas": 22919, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 22911, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 22910, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 22908, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 22905, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 22902, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 22900, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 22897, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 22894, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 22892, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7596, + "op": "JUMPDEST", + "gas": 22884, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7597, + "op": "SWAP3", + "gas": 22883, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7598, + "op": "POP", + "gas": 22880, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7599, + "op": "DUP3", + "gas": 22878, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7600, + "op": "PUSH2", + "gas": 22875, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7603, + "op": "JUMPI", + "gas": 22872, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7612, + "op": "JUMPDEST", + "gas": 22862, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7613, + "op": "DUP3", + "gas": 22861, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7614, + "op": "DUP3", + "gas": 22858, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7615, + "op": "DIV", + "gas": 22855, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 7616, + "op": "SWAP1", + "gas": 22850, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7617, + "op": "POP", + "gas": 22847, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7618, + "op": "SWAP3", + "gas": 22845, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7619, + "op": "SWAP2", + "gas": 22842, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7620, + "op": "POP", + "gas": 22839, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7621, + "op": "POP", + "gas": 22837, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7622, + "op": "JUMP", + "gas": 22835, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4406, + "op": "JUMPDEST", + "gas": 22827, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4407, + "op": "SWAP5", + "gas": 22826, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4408, + "op": "POP", + "gas": 22823, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4409, + "op": "PUSH2", + "gas": 22821, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4412, + "op": "JUMP", + "gas": 22818, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4278, + "op": "JUMPDEST", + "gas": 22810, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4279, + "op": "PUSH0", + "gas": 22809, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4280, + "op": "DUP6", + "gas": 22807, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4281, + "op": "EQ", + "gas": 22804, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4282, + "op": "PUSH2", + "gas": 22801, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4285, + "op": "JUMPI", + "gas": 22798, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4413, + "op": "JUMPDEST", + "gas": 22788, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4414, + "op": "DUP1", + "gas": 22787, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4415, + "op": "SWAP4", + "gas": 22784, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4416, + "op": "POP", + "gas": 22781, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4417, + "op": "POP", + "gas": 22779, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4418, + "op": "POP", + "gas": 22777, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4419, + "op": "POP", + "gas": 22775, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4420, + "op": "JUMPDEST", + "gas": 22773, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4421, + "op": "SWAP2", + "gas": 22772, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4422, + "op": "SWAP1", + "gas": 22769, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4423, + "op": "POP", + "gas": 22766, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4424, + "op": "JUMP", + "gas": 22764, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 2651, + "op": "JUMPDEST", + "gas": 22756, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 2652, + "op": "PUSH2", + "gas": 22755, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2655, + "op": "DUP6", + "gas": 22752, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2656, + "op": "PUSH2", + "gas": 22749, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2659, + "op": "JUMP", + "gas": 22746, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4080, + "op": "JUMPDEST", + "gas": 22738, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4081, + "op": "PUSH1", + "gas": 22737, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4083, + "op": "PUSH0", + "gas": 22734, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4084, + "op": "DUP3", + "gas": 22732, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4085, + "op": "SUB", + "gas": 22729, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4086, + "op": "PUSH2", + "gas": 22726, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4089, + "op": "JUMPI", + "gas": 22723, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4150, + "op": "JUMPDEST", + "gas": 22713, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4151, + "op": "PUSH0", + "gas": 22712, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4152, + "op": "DUP3", + "gas": 22710, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4153, + "op": "SWAP1", + "gas": 22707, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4154, + "op": "POP", + "gas": 22704, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4155, + "op": "PUSH0", + "gas": 22702, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4156, + "op": "JUMPDEST", + "gas": 22700, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4157, + "op": "PUSH0", + "gas": 22699, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4158, + "op": "DUP3", + "gas": 22697, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4159, + "op": "EQ", + "gas": 22694, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4160, + "op": "PUSH2", + "gas": 22691, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4163, + "op": "JUMPI", + "gas": 22688, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4164, + "op": "DUP1", + "gas": 22678, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4165, + "op": "DUP1", + "gas": 22675, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4166, + "op": "PUSH2", + "gas": 22672, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4169, + "op": "SWAP1", + "gas": 22669, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4170, + "op": "PUSH2", + "gas": 22666, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4173, + "op": "JUMP", + "gas": 22663, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7504, + "op": "JUMPDEST", + "gas": 22655, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7505, + "op": "PUSH0", + "gas": 22654, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7506, + "op": "PUSH2", + "gas": 22652, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7509, + "op": "DUP3", + "gas": 22649, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7510, + "op": "PUSH2", + "gas": 22646, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7513, + "op": "JUMP", + "gas": 22643, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 22635, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 22634, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 22632, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 22629, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 22626, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 22624, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 22621, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 22618, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 22616, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7514, + "op": "JUMPDEST", + "gas": 22608, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7515, + "op": "SWAP2", + "gas": 22607, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7516, + "op": "POP", + "gas": 22604, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7517, + "op": "PUSH32", + "gas": 22602, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7550, + "op": "DUP3", + "gas": 22599, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7551, + "op": "SUB", + "gas": 22596, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7552, + "op": "PUSH2", + "gas": 22593, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7555, + "op": "JUMPI", + "gas": 22590, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7564, + "op": "JUMPDEST", + "gas": 22580, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7565, + "op": "PUSH1", + "gas": 22579, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7567, + "op": "DUP3", + "gas": 22576, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7568, + "op": "ADD", + "gas": 22573, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7569, + "op": "SWAP1", + "gas": 22570, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7570, + "op": "POP", + "gas": 22567, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7571, + "op": "SWAP2", + "gas": 22565, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7572, + "op": "SWAP1", + "gas": 22562, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7573, + "op": "POP", + "gas": 22559, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7574, + "op": "JUMP", + "gas": 22557, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4174, + "op": "JUMPDEST", + "gas": 22549, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4175, + "op": "SWAP2", + "gas": 22548, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4176, + "op": "POP", + "gas": 22545, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4177, + "op": "POP", + "gas": 22543, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4178, + "op": "PUSH1", + "gas": 22541, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4180, + "op": "DUP3", + "gas": 22538, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4181, + "op": "PUSH2", + "gas": 22535, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4184, + "op": "SWAP2", + "gas": 22532, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4185, + "op": "SWAP1", + "gas": 22529, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4186, + "op": "PUSH2", + "gas": 22526, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4189, + "op": "JUMP", + "gas": 22523, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7575, + "op": "JUMPDEST", + "gas": 22515, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7576, + "op": "PUSH0", + "gas": 22514, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7577, + "op": "PUSH2", + "gas": 22512, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7580, + "op": "DUP3", + "gas": 22509, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7581, + "op": "PUSH2", + "gas": 22506, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7584, + "op": "JUMP", + "gas": 22503, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 22495, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 22494, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 22492, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 22489, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 22486, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 22484, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 22481, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 22478, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 22476, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7585, + "op": "JUMPDEST", + "gas": 22468, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7586, + "op": "SWAP2", + "gas": 22467, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7587, + "op": "POP", + "gas": 22464, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7588, + "op": "PUSH2", + "gas": 22462, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7591, + "op": "DUP4", + "gas": 22459, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7592, + "op": "PUSH2", + "gas": 22456, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7595, + "op": "JUMP", + "gas": 22453, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 22445, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 22444, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 22442, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 22439, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 22436, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 22434, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 22431, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 22428, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 22426, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7596, + "op": "JUMPDEST", + "gas": 22418, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7597, + "op": "SWAP3", + "gas": 22417, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7598, + "op": "POP", + "gas": 22414, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7599, + "op": "DUP3", + "gas": 22412, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7600, + "op": "PUSH2", + "gas": 22409, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7603, + "op": "JUMPI", + "gas": 22406, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7612, + "op": "JUMPDEST", + "gas": 22396, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7613, + "op": "DUP3", + "gas": 22395, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7614, + "op": "DUP3", + "gas": 22392, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7615, + "op": "DIV", + "gas": 22389, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 7616, + "op": "SWAP1", + "gas": 22384, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7617, + "op": "POP", + "gas": 22381, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7618, + "op": "SWAP3", + "gas": 22379, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7619, + "op": "SWAP2", + "gas": 22376, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7620, + "op": "POP", + "gas": 22373, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7621, + "op": "POP", + "gas": 22371, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7622, + "op": "JUMP", + "gas": 22369, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4190, + "op": "JUMPDEST", + "gas": 22361, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4191, + "op": "SWAP2", + "gas": 22360, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4192, + "op": "POP", + "gas": 22357, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4193, + "op": "PUSH2", + "gas": 22355, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4196, + "op": "JUMP", + "gas": 22352, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4156, + "op": "JUMPDEST", + "gas": 22344, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4157, + "op": "PUSH0", + "gas": 22343, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4158, + "op": "DUP3", + "gas": 22341, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4159, + "op": "EQ", + "gas": 22338, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4160, + "op": "PUSH2", + "gas": 22335, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4163, + "op": "JUMPI", + "gas": 22332, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4164, + "op": "DUP1", + "gas": 22322, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4165, + "op": "DUP1", + "gas": 22319, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4166, + "op": "PUSH2", + "gas": 22316, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4169, + "op": "SWAP1", + "gas": 22313, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4170, + "op": "PUSH2", + "gas": 22310, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4173, + "op": "JUMP", + "gas": 22307, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7504, + "op": "JUMPDEST", + "gas": 22299, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7505, + "op": "PUSH0", + "gas": 22298, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7506, + "op": "PUSH2", + "gas": 22296, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7509, + "op": "DUP3", + "gas": 22293, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7510, + "op": "PUSH2", + "gas": 22290, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7513, + "op": "JUMP", + "gas": 22287, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 22279, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 22278, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 22276, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 22273, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 22270, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 22268, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 22265, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 22262, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 22260, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7514, + "op": "JUMPDEST", + "gas": 22252, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7515, + "op": "SWAP2", + "gas": 22251, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7516, + "op": "POP", + "gas": 22248, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7517, + "op": "PUSH32", + "gas": 22246, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7550, + "op": "DUP3", + "gas": 22243, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7551, + "op": "SUB", + "gas": 22240, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7552, + "op": "PUSH2", + "gas": 22237, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7555, + "op": "JUMPI", + "gas": 22234, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7564, + "op": "JUMPDEST", + "gas": 22224, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7565, + "op": "PUSH1", + "gas": 22223, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7567, + "op": "DUP3", + "gas": 22220, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7568, + "op": "ADD", + "gas": 22217, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7569, + "op": "SWAP1", + "gas": 22214, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7570, + "op": "POP", + "gas": 22211, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7571, + "op": "SWAP2", + "gas": 22209, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7572, + "op": "SWAP1", + "gas": 22206, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7573, + "op": "POP", + "gas": 22203, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7574, + "op": "JUMP", + "gas": 22201, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4174, + "op": "JUMPDEST", + "gas": 22193, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4175, + "op": "SWAP2", + "gas": 22192, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4176, + "op": "POP", + "gas": 22189, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4177, + "op": "POP", + "gas": 22187, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4178, + "op": "PUSH1", + "gas": 22185, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4180, + "op": "DUP3", + "gas": 22182, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4181, + "op": "PUSH2", + "gas": 22179, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4184, + "op": "SWAP2", + "gas": 22176, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4185, + "op": "SWAP1", + "gas": 22173, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4186, + "op": "PUSH2", + "gas": 22170, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4189, + "op": "JUMP", + "gas": 22167, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7575, + "op": "JUMPDEST", + "gas": 22159, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7576, + "op": "PUSH0", + "gas": 22158, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7577, + "op": "PUSH2", + "gas": 22156, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7580, + "op": "DUP3", + "gas": 22153, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7581, + "op": "PUSH2", + "gas": 22150, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7584, + "op": "JUMP", + "gas": 22147, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 22139, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 22138, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 22136, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 22133, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 22130, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 22128, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 22125, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 22122, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 22120, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7585, + "op": "JUMPDEST", + "gas": 22112, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7586, + "op": "SWAP2", + "gas": 22111, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7587, + "op": "POP", + "gas": 22108, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7588, + "op": "PUSH2", + "gas": 22106, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7591, + "op": "DUP4", + "gas": 22103, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7592, + "op": "PUSH2", + "gas": 22100, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7595, + "op": "JUMP", + "gas": 22097, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 22089, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 22088, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 22086, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 22083, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 22080, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 22078, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 22075, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 22072, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 22070, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7596, + "op": "JUMPDEST", + "gas": 22062, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7597, + "op": "SWAP3", + "gas": 22061, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7598, + "op": "POP", + "gas": 22058, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7599, + "op": "DUP3", + "gas": 22056, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7600, + "op": "PUSH2", + "gas": 22053, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7603, + "op": "JUMPI", + "gas": 22050, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7612, + "op": "JUMPDEST", + "gas": 22040, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7613, + "op": "DUP3", + "gas": 22039, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7614, + "op": "DUP3", + "gas": 22036, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7615, + "op": "DIV", + "gas": 22033, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 7616, + "op": "SWAP1", + "gas": 22028, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7617, + "op": "POP", + "gas": 22025, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7618, + "op": "SWAP3", + "gas": 22023, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7619, + "op": "SWAP2", + "gas": 22020, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7620, + "op": "POP", + "gas": 22017, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7621, + "op": "POP", + "gas": 22015, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7622, + "op": "JUMP", + "gas": 22013, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4190, + "op": "JUMPDEST", + "gas": 22005, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4191, + "op": "SWAP2", + "gas": 22004, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4192, + "op": "POP", + "gas": 22001, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4193, + "op": "PUSH2", + "gas": 21999, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4196, + "op": "JUMP", + "gas": 21996, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4156, + "op": "JUMPDEST", + "gas": 21988, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4157, + "op": "PUSH0", + "gas": 21987, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4158, + "op": "DUP3", + "gas": 21985, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4159, + "op": "EQ", + "gas": 21982, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4160, + "op": "PUSH2", + "gas": 21979, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4163, + "op": "JUMPI", + "gas": 21976, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4197, + "op": "JUMPDEST", + "gas": 21966, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4198, + "op": "PUSH0", + "gas": 21965, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4199, + "op": "DUP2", + "gas": 21963, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4200, + "op": "PUSH8", + "gas": 21960, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4209, + "op": "DUP2", + "gas": 21957, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4210, + "op": "GT", + "gas": 21954, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4211, + "op": "ISZERO", + "gas": 21951, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4212, + "op": "PUSH2", + "gas": 21948, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4215, + "op": "JUMPI", + "gas": 21945, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4224, + "op": "JUMPDEST", + "gas": 21935, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4225, + "op": "PUSH1", + "gas": 21934, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4227, + "op": "MLOAD", + "gas": 21931, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4228, + "op": "SWAP1", + "gas": 21928, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4229, + "op": "DUP1", + "gas": 21925, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4230, + "op": "DUP3", + "gas": 21922, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4231, + "op": "MSTORE", + "gas": 21919, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 4232, + "op": "DUP1", + "gas": 21913, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4233, + "op": "PUSH1", + "gas": 21910, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4235, + "op": "ADD", + "gas": 21907, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4236, + "op": "PUSH1", + "gas": 21904, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4238, + "op": "NOT", + "gas": 21901, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4239, + "op": "AND", + "gas": 21898, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4240, + "op": "PUSH1", + "gas": 21895, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4242, + "op": "ADD", + "gas": 21892, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4243, + "op": "DUP3", + "gas": 21889, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4244, + "op": "ADD", + "gas": 21886, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4245, + "op": "PUSH1", + "gas": 21883, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4247, + "op": "MSTORE", + "gas": 21880, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4248, + "op": "DUP1", + "gas": 21877, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4249, + "op": "ISZERO", + "gas": 21874, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4250, + "op": "PUSH2", + "gas": 21871, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4253, + "op": "JUMPI", + "gas": 21868, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4254, + "op": "DUP2", + "gas": 21858, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4255, + "op": "PUSH1", + "gas": 21855, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4257, + "op": "ADD", + "gas": 21852, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4258, + "op": "PUSH1", + "gas": 21849, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4260, + "op": "DUP3", + "gas": 21846, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4261, + "op": "MUL", + "gas": 21843, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 4262, + "op": "DUP1", + "gas": 21838, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4263, + "op": "CALLDATASIZE", + "gas": 21835, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4264, + "op": "DUP4", + "gas": 21833, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4265, + "op": "CALLDATACOPY", + "gas": 21830, + "gasCost": 9, + "depth": 1 + }, + { + "pc": 4266, + "op": "DUP1", + "gas": 21821, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4267, + "op": "DUP3", + "gas": 21818, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4268, + "op": "ADD", + "gas": 21815, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4269, + "op": "SWAP2", + "gas": 21812, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4270, + "op": "POP", + "gas": 21809, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4271, + "op": "POP", + "gas": 21807, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4272, + "op": "SWAP1", + "gas": 21805, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4273, + "op": "POP", + "gas": 21802, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4274, + "op": "JUMPDEST", + "gas": 21800, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4275, + "op": "POP", + "gas": 21799, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4276, + "op": "SWAP1", + "gas": 21797, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4277, + "op": "POP", + "gas": 21794, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4278, + "op": "JUMPDEST", + "gas": 21792, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4279, + "op": "PUSH0", + "gas": 21791, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4280, + "op": "DUP6", + "gas": 21789, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4281, + "op": "EQ", + "gas": 21786, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4282, + "op": "PUSH2", + "gas": 21783, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4285, + "op": "JUMPI", + "gas": 21780, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4286, + "op": "PUSH1", + "gas": 21770, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4288, + "op": "DUP3", + "gas": 21767, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4289, + "op": "PUSH2", + "gas": 21764, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4292, + "op": "SWAP2", + "gas": 21761, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4293, + "op": "SWAP1", + "gas": 21758, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4294, + "op": "PUSH2", + "gas": 21755, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4297, + "op": "JUMP", + "gas": 21752, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7360, + "op": "JUMPDEST", + "gas": 21744, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7361, + "op": "PUSH0", + "gas": 21743, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7362, + "op": "PUSH2", + "gas": 21741, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7365, + "op": "DUP3", + "gas": 21738, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7366, + "op": "PUSH2", + "gas": 21735, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7369, + "op": "JUMP", + "gas": 21732, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 21724, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 21723, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 21721, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 21718, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 21715, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 21713, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 21710, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 21707, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 21705, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7370, + "op": "JUMPDEST", + "gas": 21697, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7371, + "op": "SWAP2", + "gas": 21696, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7372, + "op": "POP", + "gas": 21693, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7373, + "op": "PUSH2", + "gas": 21691, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7376, + "op": "DUP4", + "gas": 21688, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7377, + "op": "PUSH2", + "gas": 21685, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7380, + "op": "JUMP", + "gas": 21682, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 21674, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 21673, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 21671, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 21668, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 21665, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 21663, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 21660, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 21657, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 21655, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7381, + "op": "JUMPDEST", + "gas": 21647, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7382, + "op": "SWAP3", + "gas": 21646, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7383, + "op": "POP", + "gas": 21643, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7384, + "op": "DUP3", + "gas": 21641, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7385, + "op": "DUP3", + "gas": 21638, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7386, + "op": "SUB", + "gas": 21635, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7387, + "op": "SWAP1", + "gas": 21632, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7388, + "op": "POP", + "gas": 21629, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7389, + "op": "DUP2", + "gas": 21627, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7390, + "op": "DUP2", + "gas": 21624, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7391, + "op": "GT", + "gas": 21621, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7392, + "op": "ISZERO", + "gas": 21618, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7393, + "op": "PUSH2", + "gas": 21615, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7396, + "op": "JUMPI", + "gas": 21612, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7405, + "op": "JUMPDEST", + "gas": 21602, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7406, + "op": "SWAP3", + "gas": 21601, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7407, + "op": "SWAP2", + "gas": 21598, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7408, + "op": "POP", + "gas": 21595, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7409, + "op": "POP", + "gas": 21593, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7410, + "op": "JUMP", + "gas": 21591, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4298, + "op": "JUMPDEST", + "gas": 21583, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4299, + "op": "SWAP2", + "gas": 21582, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4300, + "op": "POP", + "gas": 21579, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4301, + "op": "PUSH1", + "gas": 21577, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4303, + "op": "DUP6", + "gas": 21574, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4304, + "op": "PUSH2", + "gas": 21571, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4307, + "op": "SWAP2", + "gas": 21568, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4308, + "op": "SWAP1", + "gas": 21565, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4309, + "op": "PUSH2", + "gas": 21562, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4312, + "op": "JUMP", + "gas": 21559, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7456, + "op": "JUMPDEST", + "gas": 21551, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7457, + "op": "PUSH0", + "gas": 21550, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7458, + "op": "PUSH2", + "gas": 21548, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7461, + "op": "DUP3", + "gas": 21545, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7462, + "op": "PUSH2", + "gas": 21542, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7465, + "op": "JUMP", + "gas": 21539, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 21531, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 21530, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 21528, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 21525, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 21522, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 21520, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 21517, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 21514, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 21512, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7466, + "op": "JUMPDEST", + "gas": 21504, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7467, + "op": "SWAP2", + "gas": 21503, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7468, + "op": "POP", + "gas": 21500, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7469, + "op": "PUSH2", + "gas": 21498, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7472, + "op": "DUP4", + "gas": 21495, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7473, + "op": "PUSH2", + "gas": 21492, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7476, + "op": "JUMP", + "gas": 21489, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 21481, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 21480, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 21478, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 21475, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 21472, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 21470, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 21467, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 21464, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 21462, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7477, + "op": "JUMPDEST", + "gas": 21454, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7478, + "op": "SWAP3", + "gas": 21453, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7479, + "op": "POP", + "gas": 21450, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7480, + "op": "DUP3", + "gas": 21448, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7481, + "op": "PUSH2", + "gas": 21445, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7484, + "op": "JUMPI", + "gas": 21442, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7493, + "op": "JUMPDEST", + "gas": 21432, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7494, + "op": "DUP3", + "gas": 21431, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7495, + "op": "DUP3", + "gas": 21428, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7496, + "op": "MOD", + "gas": 21425, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 7497, + "op": "SWAP1", + "gas": 21420, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7498, + "op": "POP", + "gas": 21417, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7499, + "op": "SWAP3", + "gas": 21415, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7500, + "op": "SWAP2", + "gas": 21412, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7501, + "op": "POP", + "gas": 21409, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7502, + "op": "POP", + "gas": 21407, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7503, + "op": "JUMP", + "gas": 21405, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4313, + "op": "JUMPDEST", + "gas": 21397, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4314, + "op": "PUSH1", + "gas": 21396, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4316, + "op": "PUSH2", + "gas": 21393, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4319, + "op": "SWAP2", + "gas": 21390, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4320, + "op": "SWAP1", + "gas": 21387, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4321, + "op": "PUSH2", + "gas": 21384, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4324, + "op": "JUMP", + "gas": 21381, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6786, + "op": "JUMPDEST", + "gas": 21373, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6787, + "op": "PUSH0", + "gas": 21372, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6788, + "op": "PUSH2", + "gas": 21370, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6791, + "op": "DUP3", + "gas": 21367, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6792, + "op": "PUSH2", + "gas": 21364, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6795, + "op": "JUMP", + "gas": 21361, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 21353, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 21352, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 21350, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 21347, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 21344, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 21342, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 21339, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 21336, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 21334, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6796, + "op": "JUMPDEST", + "gas": 21326, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6797, + "op": "SWAP2", + "gas": 21325, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6798, + "op": "POP", + "gas": 21322, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6799, + "op": "PUSH2", + "gas": 21320, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6802, + "op": "DUP4", + "gas": 21317, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6803, + "op": "PUSH2", + "gas": 21314, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6806, + "op": "JUMP", + "gas": 21311, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 21303, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 21302, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 21300, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 21297, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 21294, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 21292, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 21289, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 21286, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 21284, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6807, + "op": "JUMPDEST", + "gas": 21276, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6808, + "op": "SWAP3", + "gas": 21275, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6809, + "op": "POP", + "gas": 21272, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6810, + "op": "DUP3", + "gas": 21270, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6811, + "op": "DUP3", + "gas": 21267, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6812, + "op": "ADD", + "gas": 21264, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6813, + "op": "SWAP1", + "gas": 21261, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6814, + "op": "POP", + "gas": 21258, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6815, + "op": "DUP1", + "gas": 21256, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6816, + "op": "DUP3", + "gas": 21253, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6817, + "op": "GT", + "gas": 21250, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6818, + "op": "ISZERO", + "gas": 21247, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6819, + "op": "PUSH2", + "gas": 21244, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6822, + "op": "JUMPI", + "gas": 21241, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6831, + "op": "JUMPDEST", + "gas": 21231, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6832, + "op": "SWAP3", + "gas": 21230, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6833, + "op": "SWAP2", + "gas": 21227, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6834, + "op": "POP", + "gas": 21224, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6835, + "op": "POP", + "gas": 21222, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6836, + "op": "JUMP", + "gas": 21220, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4325, + "op": "JUMPDEST", + "gas": 21212, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4326, + "op": "PUSH1", + "gas": 21211, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4328, + "op": "SHL", + "gas": 21208, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4329, + "op": "DUP2", + "gas": 21205, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4330, + "op": "DUP4", + "gas": 21202, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4331, + "op": "DUP2", + "gas": 21199, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4332, + "op": "MLOAD", + "gas": 21196, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4333, + "op": "DUP2", + "gas": 21193, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4334, + "op": "LT", + "gas": 21190, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4335, + "op": "PUSH2", + "gas": 21187, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4338, + "op": "JUMPI", + "gas": 21184, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4347, + "op": "JUMPDEST", + "gas": 21174, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4348, + "op": "PUSH1", + "gas": 21173, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4350, + "op": "ADD", + "gas": 21170, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4351, + "op": "ADD", + "gas": 21167, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4352, + "op": "SWAP1", + "gas": 21164, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4353, + "op": "PUSH31", + "gas": 21161, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4385, + "op": "NOT", + "gas": 21158, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4386, + "op": "AND", + "gas": 21155, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4387, + "op": "SWAP1", + "gas": 21152, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4388, + "op": "DUP2", + "gas": 21149, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4389, + "op": "PUSH0", + "gas": 21146, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4390, + "op": "BYTE", + "gas": 21144, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4391, + "op": "SWAP1", + "gas": 21141, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4392, + "op": "MSTORE8", + "gas": 21138, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4393, + "op": "POP", + "gas": 21135, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4394, + "op": "PUSH1", + "gas": 21133, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4396, + "op": "DUP6", + "gas": 21130, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4397, + "op": "PUSH2", + "gas": 21127, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4400, + "op": "SWAP2", + "gas": 21124, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4401, + "op": "SWAP1", + "gas": 21121, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4402, + "op": "PUSH2", + "gas": 21118, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4405, + "op": "JUMP", + "gas": 21115, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7575, + "op": "JUMPDEST", + "gas": 21107, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7576, + "op": "PUSH0", + "gas": 21106, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7577, + "op": "PUSH2", + "gas": 21104, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7580, + "op": "DUP3", + "gas": 21101, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7581, + "op": "PUSH2", + "gas": 21098, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7584, + "op": "JUMP", + "gas": 21095, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 21087, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 21086, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 21084, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 21081, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 21078, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 21076, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 21073, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 21070, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 21068, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7585, + "op": "JUMPDEST", + "gas": 21060, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7586, + "op": "SWAP2", + "gas": 21059, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7587, + "op": "POP", + "gas": 21056, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7588, + "op": "PUSH2", + "gas": 21054, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7591, + "op": "DUP4", + "gas": 21051, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7592, + "op": "PUSH2", + "gas": 21048, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7595, + "op": "JUMP", + "gas": 21045, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 21037, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 21036, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 21034, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 21031, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 21028, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 21026, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 21023, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 21020, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 21018, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7596, + "op": "JUMPDEST", + "gas": 21010, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7597, + "op": "SWAP3", + "gas": 21009, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7598, + "op": "POP", + "gas": 21006, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7599, + "op": "DUP3", + "gas": 21004, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7600, + "op": "PUSH2", + "gas": 21001, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7603, + "op": "JUMPI", + "gas": 20998, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7612, + "op": "JUMPDEST", + "gas": 20988, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7613, + "op": "DUP3", + "gas": 20987, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7614, + "op": "DUP3", + "gas": 20984, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7615, + "op": "DIV", + "gas": 20981, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 7616, + "op": "SWAP1", + "gas": 20976, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7617, + "op": "POP", + "gas": 20973, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7618, + "op": "SWAP3", + "gas": 20971, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7619, + "op": "SWAP2", + "gas": 20968, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7620, + "op": "POP", + "gas": 20965, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7621, + "op": "POP", + "gas": 20963, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7622, + "op": "JUMP", + "gas": 20961, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4406, + "op": "JUMPDEST", + "gas": 20953, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4407, + "op": "SWAP5", + "gas": 20952, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4408, + "op": "POP", + "gas": 20949, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4409, + "op": "PUSH2", + "gas": 20947, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4412, + "op": "JUMP", + "gas": 20944, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4278, + "op": "JUMPDEST", + "gas": 20936, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4279, + "op": "PUSH0", + "gas": 20935, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4280, + "op": "DUP6", + "gas": 20933, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4281, + "op": "EQ", + "gas": 20930, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4282, + "op": "PUSH2", + "gas": 20927, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4285, + "op": "JUMPI", + "gas": 20924, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4286, + "op": "PUSH1", + "gas": 20914, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4288, + "op": "DUP3", + "gas": 20911, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4289, + "op": "PUSH2", + "gas": 20908, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4292, + "op": "SWAP2", + "gas": 20905, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4293, + "op": "SWAP1", + "gas": 20902, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4294, + "op": "PUSH2", + "gas": 20899, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4297, + "op": "JUMP", + "gas": 20896, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7360, + "op": "JUMPDEST", + "gas": 20888, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7361, + "op": "PUSH0", + "gas": 20887, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7362, + "op": "PUSH2", + "gas": 20885, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7365, + "op": "DUP3", + "gas": 20882, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7366, + "op": "PUSH2", + "gas": 20879, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7369, + "op": "JUMP", + "gas": 20876, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 20868, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 20867, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 20865, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 20862, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 20859, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 20857, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 20854, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 20851, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 20849, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7370, + "op": "JUMPDEST", + "gas": 20841, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7371, + "op": "SWAP2", + "gas": 20840, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7372, + "op": "POP", + "gas": 20837, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7373, + "op": "PUSH2", + "gas": 20835, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7376, + "op": "DUP4", + "gas": 20832, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7377, + "op": "PUSH2", + "gas": 20829, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7380, + "op": "JUMP", + "gas": 20826, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 20818, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 20817, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 20815, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 20812, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 20809, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 20807, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 20804, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 20801, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 20799, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7381, + "op": "JUMPDEST", + "gas": 20791, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7382, + "op": "SWAP3", + "gas": 20790, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7383, + "op": "POP", + "gas": 20787, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7384, + "op": "DUP3", + "gas": 20785, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7385, + "op": "DUP3", + "gas": 20782, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7386, + "op": "SUB", + "gas": 20779, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7387, + "op": "SWAP1", + "gas": 20776, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7388, + "op": "POP", + "gas": 20773, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7389, + "op": "DUP2", + "gas": 20771, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7390, + "op": "DUP2", + "gas": 20768, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7391, + "op": "GT", + "gas": 20765, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7392, + "op": "ISZERO", + "gas": 20762, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7393, + "op": "PUSH2", + "gas": 20759, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7396, + "op": "JUMPI", + "gas": 20756, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7405, + "op": "JUMPDEST", + "gas": 20746, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7406, + "op": "SWAP3", + "gas": 20745, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7407, + "op": "SWAP2", + "gas": 20742, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7408, + "op": "POP", + "gas": 20739, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7409, + "op": "POP", + "gas": 20737, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7410, + "op": "JUMP", + "gas": 20735, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4298, + "op": "JUMPDEST", + "gas": 20727, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4299, + "op": "SWAP2", + "gas": 20726, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4300, + "op": "POP", + "gas": 20723, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4301, + "op": "PUSH1", + "gas": 20721, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4303, + "op": "DUP6", + "gas": 20718, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4304, + "op": "PUSH2", + "gas": 20715, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4307, + "op": "SWAP2", + "gas": 20712, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4308, + "op": "SWAP1", + "gas": 20709, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4309, + "op": "PUSH2", + "gas": 20706, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4312, + "op": "JUMP", + "gas": 20703, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7456, + "op": "JUMPDEST", + "gas": 20695, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7457, + "op": "PUSH0", + "gas": 20694, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7458, + "op": "PUSH2", + "gas": 20692, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7461, + "op": "DUP3", + "gas": 20689, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7462, + "op": "PUSH2", + "gas": 20686, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7465, + "op": "JUMP", + "gas": 20683, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 20675, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 20674, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 20672, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 20669, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 20666, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 20664, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 20661, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 20658, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 20656, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7466, + "op": "JUMPDEST", + "gas": 20648, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7467, + "op": "SWAP2", + "gas": 20647, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7468, + "op": "POP", + "gas": 20644, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7469, + "op": "PUSH2", + "gas": 20642, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7472, + "op": "DUP4", + "gas": 20639, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7473, + "op": "PUSH2", + "gas": 20636, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7476, + "op": "JUMP", + "gas": 20633, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 20625, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 20624, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 20622, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 20619, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 20616, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 20614, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 20611, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 20608, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 20606, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7477, + "op": "JUMPDEST", + "gas": 20598, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7478, + "op": "SWAP3", + "gas": 20597, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7479, + "op": "POP", + "gas": 20594, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7480, + "op": "DUP3", + "gas": 20592, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7481, + "op": "PUSH2", + "gas": 20589, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7484, + "op": "JUMPI", + "gas": 20586, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7493, + "op": "JUMPDEST", + "gas": 20576, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7494, + "op": "DUP3", + "gas": 20575, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7495, + "op": "DUP3", + "gas": 20572, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7496, + "op": "MOD", + "gas": 20569, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 7497, + "op": "SWAP1", + "gas": 20564, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7498, + "op": "POP", + "gas": 20561, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7499, + "op": "SWAP3", + "gas": 20559, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7500, + "op": "SWAP2", + "gas": 20556, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7501, + "op": "POP", + "gas": 20553, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7502, + "op": "POP", + "gas": 20551, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7503, + "op": "JUMP", + "gas": 20549, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4313, + "op": "JUMPDEST", + "gas": 20541, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4314, + "op": "PUSH1", + "gas": 20540, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4316, + "op": "PUSH2", + "gas": 20537, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4319, + "op": "SWAP2", + "gas": 20534, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4320, + "op": "SWAP1", + "gas": 20531, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4321, + "op": "PUSH2", + "gas": 20528, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4324, + "op": "JUMP", + "gas": 20525, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6786, + "op": "JUMPDEST", + "gas": 20517, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6787, + "op": "PUSH0", + "gas": 20516, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6788, + "op": "PUSH2", + "gas": 20514, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6791, + "op": "DUP3", + "gas": 20511, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6792, + "op": "PUSH2", + "gas": 20508, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6795, + "op": "JUMP", + "gas": 20505, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 20497, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 20496, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 20494, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 20491, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 20488, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 20486, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 20483, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 20480, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 20478, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6796, + "op": "JUMPDEST", + "gas": 20470, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6797, + "op": "SWAP2", + "gas": 20469, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6798, + "op": "POP", + "gas": 20466, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6799, + "op": "PUSH2", + "gas": 20464, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6802, + "op": "DUP4", + "gas": 20461, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6803, + "op": "PUSH2", + "gas": 20458, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6806, + "op": "JUMP", + "gas": 20455, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 20447, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 20446, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 20444, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 20441, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 20438, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 20436, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 20433, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 20430, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 20428, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6807, + "op": "JUMPDEST", + "gas": 20420, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6808, + "op": "SWAP3", + "gas": 20419, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6809, + "op": "POP", + "gas": 20416, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6810, + "op": "DUP3", + "gas": 20414, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6811, + "op": "DUP3", + "gas": 20411, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6812, + "op": "ADD", + "gas": 20408, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6813, + "op": "SWAP1", + "gas": 20405, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6814, + "op": "POP", + "gas": 20402, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6815, + "op": "DUP1", + "gas": 20400, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6816, + "op": "DUP3", + "gas": 20397, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6817, + "op": "GT", + "gas": 20394, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6818, + "op": "ISZERO", + "gas": 20391, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6819, + "op": "PUSH2", + "gas": 20388, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6822, + "op": "JUMPI", + "gas": 20385, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6831, + "op": "JUMPDEST", + "gas": 20375, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6832, + "op": "SWAP3", + "gas": 20374, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6833, + "op": "SWAP2", + "gas": 20371, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6834, + "op": "POP", + "gas": 20368, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6835, + "op": "POP", + "gas": 20366, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6836, + "op": "JUMP", + "gas": 20364, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4325, + "op": "JUMPDEST", + "gas": 20356, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4326, + "op": "PUSH1", + "gas": 20355, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4328, + "op": "SHL", + "gas": 20352, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4329, + "op": "DUP2", + "gas": 20349, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4330, + "op": "DUP4", + "gas": 20346, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4331, + "op": "DUP2", + "gas": 20343, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4332, + "op": "MLOAD", + "gas": 20340, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4333, + "op": "DUP2", + "gas": 20337, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4334, + "op": "LT", + "gas": 20334, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4335, + "op": "PUSH2", + "gas": 20331, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4338, + "op": "JUMPI", + "gas": 20328, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4347, + "op": "JUMPDEST", + "gas": 20318, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4348, + "op": "PUSH1", + "gas": 20317, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4350, + "op": "ADD", + "gas": 20314, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4351, + "op": "ADD", + "gas": 20311, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4352, + "op": "SWAP1", + "gas": 20308, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4353, + "op": "PUSH31", + "gas": 20305, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4385, + "op": "NOT", + "gas": 20302, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4386, + "op": "AND", + "gas": 20299, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4387, + "op": "SWAP1", + "gas": 20296, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4388, + "op": "DUP2", + "gas": 20293, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4389, + "op": "PUSH0", + "gas": 20290, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4390, + "op": "BYTE", + "gas": 20288, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4391, + "op": "SWAP1", + "gas": 20285, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4392, + "op": "MSTORE8", + "gas": 20282, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4393, + "op": "POP", + "gas": 20279, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4394, + "op": "PUSH1", + "gas": 20277, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4396, + "op": "DUP6", + "gas": 20274, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4397, + "op": "PUSH2", + "gas": 20271, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4400, + "op": "SWAP2", + "gas": 20268, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4401, + "op": "SWAP1", + "gas": 20265, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4402, + "op": "PUSH2", + "gas": 20262, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4405, + "op": "JUMP", + "gas": 20259, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7575, + "op": "JUMPDEST", + "gas": 20251, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7576, + "op": "PUSH0", + "gas": 20250, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7577, + "op": "PUSH2", + "gas": 20248, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7580, + "op": "DUP3", + "gas": 20245, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7581, + "op": "PUSH2", + "gas": 20242, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7584, + "op": "JUMP", + "gas": 20239, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 20231, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 20230, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 20228, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 20225, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 20222, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 20220, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 20217, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 20214, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 20212, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7585, + "op": "JUMPDEST", + "gas": 20204, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7586, + "op": "SWAP2", + "gas": 20203, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7587, + "op": "POP", + "gas": 20200, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7588, + "op": "PUSH2", + "gas": 20198, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7591, + "op": "DUP4", + "gas": 20195, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7592, + "op": "PUSH2", + "gas": 20192, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7595, + "op": "JUMP", + "gas": 20189, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 20181, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 20180, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 20178, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 20175, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 20172, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 20170, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 20167, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 20164, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 20162, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7596, + "op": "JUMPDEST", + "gas": 20154, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7597, + "op": "SWAP3", + "gas": 20153, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7598, + "op": "POP", + "gas": 20150, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7599, + "op": "DUP3", + "gas": 20148, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7600, + "op": "PUSH2", + "gas": 20145, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7603, + "op": "JUMPI", + "gas": 20142, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7612, + "op": "JUMPDEST", + "gas": 20132, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7613, + "op": "DUP3", + "gas": 20131, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7614, + "op": "DUP3", + "gas": 20128, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7615, + "op": "DIV", + "gas": 20125, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 7616, + "op": "SWAP1", + "gas": 20120, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7617, + "op": "POP", + "gas": 20117, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7618, + "op": "SWAP3", + "gas": 20115, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7619, + "op": "SWAP2", + "gas": 20112, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7620, + "op": "POP", + "gas": 20109, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7621, + "op": "POP", + "gas": 20107, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7622, + "op": "JUMP", + "gas": 20105, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4406, + "op": "JUMPDEST", + "gas": 20097, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4407, + "op": "SWAP5", + "gas": 20096, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4408, + "op": "POP", + "gas": 20093, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4409, + "op": "PUSH2", + "gas": 20091, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4412, + "op": "JUMP", + "gas": 20088, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4278, + "op": "JUMPDEST", + "gas": 20080, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4279, + "op": "PUSH0", + "gas": 20079, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4280, + "op": "DUP6", + "gas": 20077, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4281, + "op": "EQ", + "gas": 20074, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4282, + "op": "PUSH2", + "gas": 20071, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4285, + "op": "JUMPI", + "gas": 20068, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4413, + "op": "JUMPDEST", + "gas": 20058, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4414, + "op": "DUP1", + "gas": 20057, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4415, + "op": "SWAP4", + "gas": 20054, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4416, + "op": "POP", + "gas": 20051, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4417, + "op": "POP", + "gas": 20049, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4418, + "op": "POP", + "gas": 20047, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4419, + "op": "POP", + "gas": 20045, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4420, + "op": "JUMPDEST", + "gas": 20043, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4421, + "op": "SWAP2", + "gas": 20042, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4422, + "op": "SWAP1", + "gas": 20039, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4423, + "op": "POP", + "gas": 20036, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4424, + "op": "JUMP", + "gas": 20034, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 2660, + "op": "JUMPDEST", + "gas": 20026, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 2661, + "op": "PUSH2", + "gas": 20025, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2664, + "op": "DUP6", + "gas": 20022, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2665, + "op": "PUSH2", + "gas": 20019, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2668, + "op": "JUMP", + "gas": 20016, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4080, + "op": "JUMPDEST", + "gas": 20008, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4081, + "op": "PUSH1", + "gas": 20007, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4083, + "op": "PUSH0", + "gas": 20004, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4084, + "op": "DUP3", + "gas": 20002, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4085, + "op": "SUB", + "gas": 19999, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4086, + "op": "PUSH2", + "gas": 19996, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4089, + "op": "JUMPI", + "gas": 19993, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4150, + "op": "JUMPDEST", + "gas": 19983, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4151, + "op": "PUSH0", + "gas": 19982, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4152, + "op": "DUP3", + "gas": 19980, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4153, + "op": "SWAP1", + "gas": 19977, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4154, + "op": "POP", + "gas": 19974, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4155, + "op": "PUSH0", + "gas": 19972, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4156, + "op": "JUMPDEST", + "gas": 19970, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4157, + "op": "PUSH0", + "gas": 19969, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4158, + "op": "DUP3", + "gas": 19967, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4159, + "op": "EQ", + "gas": 19964, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4160, + "op": "PUSH2", + "gas": 19961, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4163, + "op": "JUMPI", + "gas": 19958, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4164, + "op": "DUP1", + "gas": 19948, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4165, + "op": "DUP1", + "gas": 19945, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4166, + "op": "PUSH2", + "gas": 19942, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4169, + "op": "SWAP1", + "gas": 19939, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4170, + "op": "PUSH2", + "gas": 19936, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4173, + "op": "JUMP", + "gas": 19933, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7504, + "op": "JUMPDEST", + "gas": 19925, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7505, + "op": "PUSH0", + "gas": 19924, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7506, + "op": "PUSH2", + "gas": 19922, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7509, + "op": "DUP3", + "gas": 19919, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7510, + "op": "PUSH2", + "gas": 19916, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7513, + "op": "JUMP", + "gas": 19913, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 19905, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 19904, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 19902, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 19899, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 19896, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 19894, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 19891, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 19888, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 19886, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7514, + "op": "JUMPDEST", + "gas": 19878, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7515, + "op": "SWAP2", + "gas": 19877, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7516, + "op": "POP", + "gas": 19874, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7517, + "op": "PUSH32", + "gas": 19872, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7550, + "op": "DUP3", + "gas": 19869, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7551, + "op": "SUB", + "gas": 19866, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7552, + "op": "PUSH2", + "gas": 19863, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7555, + "op": "JUMPI", + "gas": 19860, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7564, + "op": "JUMPDEST", + "gas": 19850, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7565, + "op": "PUSH1", + "gas": 19849, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7567, + "op": "DUP3", + "gas": 19846, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7568, + "op": "ADD", + "gas": 19843, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7569, + "op": "SWAP1", + "gas": 19840, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7570, + "op": "POP", + "gas": 19837, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7571, + "op": "SWAP2", + "gas": 19835, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7572, + "op": "SWAP1", + "gas": 19832, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7573, + "op": "POP", + "gas": 19829, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7574, + "op": "JUMP", + "gas": 19827, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4174, + "op": "JUMPDEST", + "gas": 19819, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4175, + "op": "SWAP2", + "gas": 19818, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4176, + "op": "POP", + "gas": 19815, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4177, + "op": "POP", + "gas": 19813, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4178, + "op": "PUSH1", + "gas": 19811, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4180, + "op": "DUP3", + "gas": 19808, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4181, + "op": "PUSH2", + "gas": 19805, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4184, + "op": "SWAP2", + "gas": 19802, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4185, + "op": "SWAP1", + "gas": 19799, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4186, + "op": "PUSH2", + "gas": 19796, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4189, + "op": "JUMP", + "gas": 19793, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7575, + "op": "JUMPDEST", + "gas": 19785, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7576, + "op": "PUSH0", + "gas": 19784, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7577, + "op": "PUSH2", + "gas": 19782, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7580, + "op": "DUP3", + "gas": 19779, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7581, + "op": "PUSH2", + "gas": 19776, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7584, + "op": "JUMP", + "gas": 19773, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 19765, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 19764, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 19762, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 19759, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 19756, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 19754, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 19751, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 19748, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 19746, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7585, + "op": "JUMPDEST", + "gas": 19738, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7586, + "op": "SWAP2", + "gas": 19737, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7587, + "op": "POP", + "gas": 19734, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7588, + "op": "PUSH2", + "gas": 19732, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7591, + "op": "DUP4", + "gas": 19729, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7592, + "op": "PUSH2", + "gas": 19726, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7595, + "op": "JUMP", + "gas": 19723, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 19715, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 19714, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 19712, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 19709, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 19706, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 19704, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 19701, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 19698, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 19696, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7596, + "op": "JUMPDEST", + "gas": 19688, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7597, + "op": "SWAP3", + "gas": 19687, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7598, + "op": "POP", + "gas": 19684, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7599, + "op": "DUP3", + "gas": 19682, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7600, + "op": "PUSH2", + "gas": 19679, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7603, + "op": "JUMPI", + "gas": 19676, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7612, + "op": "JUMPDEST", + "gas": 19666, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7613, + "op": "DUP3", + "gas": 19665, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7614, + "op": "DUP3", + "gas": 19662, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7615, + "op": "DIV", + "gas": 19659, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 7616, + "op": "SWAP1", + "gas": 19654, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7617, + "op": "POP", + "gas": 19651, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7618, + "op": "SWAP3", + "gas": 19649, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7619, + "op": "SWAP2", + "gas": 19646, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7620, + "op": "POP", + "gas": 19643, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7621, + "op": "POP", + "gas": 19641, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7622, + "op": "JUMP", + "gas": 19639, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4190, + "op": "JUMPDEST", + "gas": 19631, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4191, + "op": "SWAP2", + "gas": 19630, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4192, + "op": "POP", + "gas": 19627, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4193, + "op": "PUSH2", + "gas": 19625, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4196, + "op": "JUMP", + "gas": 19622, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4156, + "op": "JUMPDEST", + "gas": 19614, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4157, + "op": "PUSH0", + "gas": 19613, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4158, + "op": "DUP3", + "gas": 19611, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4159, + "op": "EQ", + "gas": 19608, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4160, + "op": "PUSH2", + "gas": 19605, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4163, + "op": "JUMPI", + "gas": 19602, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4164, + "op": "DUP1", + "gas": 19592, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4165, + "op": "DUP1", + "gas": 19589, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4166, + "op": "PUSH2", + "gas": 19586, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4169, + "op": "SWAP1", + "gas": 19583, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4170, + "op": "PUSH2", + "gas": 19580, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4173, + "op": "JUMP", + "gas": 19577, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7504, + "op": "JUMPDEST", + "gas": 19569, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7505, + "op": "PUSH0", + "gas": 19568, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7506, + "op": "PUSH2", + "gas": 19566, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7509, + "op": "DUP3", + "gas": 19563, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7510, + "op": "PUSH2", + "gas": 19560, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7513, + "op": "JUMP", + "gas": 19557, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 19549, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 19548, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 19546, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 19543, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 19540, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 19538, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 19535, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 19532, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 19530, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7514, + "op": "JUMPDEST", + "gas": 19522, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7515, + "op": "SWAP2", + "gas": 19521, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7516, + "op": "POP", + "gas": 19518, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7517, + "op": "PUSH32", + "gas": 19516, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7550, + "op": "DUP3", + "gas": 19513, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7551, + "op": "SUB", + "gas": 19510, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7552, + "op": "PUSH2", + "gas": 19507, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7555, + "op": "JUMPI", + "gas": 19504, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7564, + "op": "JUMPDEST", + "gas": 19494, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7565, + "op": "PUSH1", + "gas": 19493, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7567, + "op": "DUP3", + "gas": 19490, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7568, + "op": "ADD", + "gas": 19487, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7569, + "op": "SWAP1", + "gas": 19484, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7570, + "op": "POP", + "gas": 19481, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7571, + "op": "SWAP2", + "gas": 19479, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7572, + "op": "SWAP1", + "gas": 19476, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7573, + "op": "POP", + "gas": 19473, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7574, + "op": "JUMP", + "gas": 19471, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4174, + "op": "JUMPDEST", + "gas": 19463, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4175, + "op": "SWAP2", + "gas": 19462, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4176, + "op": "POP", + "gas": 19459, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4177, + "op": "POP", + "gas": 19457, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4178, + "op": "PUSH1", + "gas": 19455, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4180, + "op": "DUP3", + "gas": 19452, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4181, + "op": "PUSH2", + "gas": 19449, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4184, + "op": "SWAP2", + "gas": 19446, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4185, + "op": "SWAP1", + "gas": 19443, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4186, + "op": "PUSH2", + "gas": 19440, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4189, + "op": "JUMP", + "gas": 19437, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7575, + "op": "JUMPDEST", + "gas": 19429, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7576, + "op": "PUSH0", + "gas": 19428, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7577, + "op": "PUSH2", + "gas": 19426, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7580, + "op": "DUP3", + "gas": 19423, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7581, + "op": "PUSH2", + "gas": 19420, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7584, + "op": "JUMP", + "gas": 19417, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 19409, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 19408, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 19406, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 19403, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 19400, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 19398, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 19395, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 19392, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 19390, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7585, + "op": "JUMPDEST", + "gas": 19382, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7586, + "op": "SWAP2", + "gas": 19381, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7587, + "op": "POP", + "gas": 19378, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7588, + "op": "PUSH2", + "gas": 19376, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7591, + "op": "DUP4", + "gas": 19373, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7592, + "op": "PUSH2", + "gas": 19370, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7595, + "op": "JUMP", + "gas": 19367, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 19359, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 19358, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 19356, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 19353, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 19350, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 19348, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 19345, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 19342, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 19340, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7596, + "op": "JUMPDEST", + "gas": 19332, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7597, + "op": "SWAP3", + "gas": 19331, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7598, + "op": "POP", + "gas": 19328, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7599, + "op": "DUP3", + "gas": 19326, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7600, + "op": "PUSH2", + "gas": 19323, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7603, + "op": "JUMPI", + "gas": 19320, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7612, + "op": "JUMPDEST", + "gas": 19310, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7613, + "op": "DUP3", + "gas": 19309, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7614, + "op": "DUP3", + "gas": 19306, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7615, + "op": "DIV", + "gas": 19303, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 7616, + "op": "SWAP1", + "gas": 19298, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7617, + "op": "POP", + "gas": 19295, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7618, + "op": "SWAP3", + "gas": 19293, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7619, + "op": "SWAP2", + "gas": 19290, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7620, + "op": "POP", + "gas": 19287, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7621, + "op": "POP", + "gas": 19285, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7622, + "op": "JUMP", + "gas": 19283, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4190, + "op": "JUMPDEST", + "gas": 19275, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4191, + "op": "SWAP2", + "gas": 19274, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4192, + "op": "POP", + "gas": 19271, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4193, + "op": "PUSH2", + "gas": 19269, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4196, + "op": "JUMP", + "gas": 19266, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4156, + "op": "JUMPDEST", + "gas": 19258, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4157, + "op": "PUSH0", + "gas": 19257, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4158, + "op": "DUP3", + "gas": 19255, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4159, + "op": "EQ", + "gas": 19252, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4160, + "op": "PUSH2", + "gas": 19249, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4163, + "op": "JUMPI", + "gas": 19246, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4197, + "op": "JUMPDEST", + "gas": 19236, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4198, + "op": "PUSH0", + "gas": 19235, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4199, + "op": "DUP2", + "gas": 19233, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4200, + "op": "PUSH8", + "gas": 19230, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4209, + "op": "DUP2", + "gas": 19227, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4210, + "op": "GT", + "gas": 19224, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4211, + "op": "ISZERO", + "gas": 19221, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4212, + "op": "PUSH2", + "gas": 19218, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4215, + "op": "JUMPI", + "gas": 19215, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4224, + "op": "JUMPDEST", + "gas": 19205, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4225, + "op": "PUSH1", + "gas": 19204, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4227, + "op": "MLOAD", + "gas": 19201, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4228, + "op": "SWAP1", + "gas": 19198, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4229, + "op": "DUP1", + "gas": 19195, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4230, + "op": "DUP3", + "gas": 19192, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4231, + "op": "MSTORE", + "gas": 19189, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 4232, + "op": "DUP1", + "gas": 19183, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4233, + "op": "PUSH1", + "gas": 19180, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4235, + "op": "ADD", + "gas": 19177, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4236, + "op": "PUSH1", + "gas": 19174, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4238, + "op": "NOT", + "gas": 19171, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4239, + "op": "AND", + "gas": 19168, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4240, + "op": "PUSH1", + "gas": 19165, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4242, + "op": "ADD", + "gas": 19162, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4243, + "op": "DUP3", + "gas": 19159, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4244, + "op": "ADD", + "gas": 19156, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4245, + "op": "PUSH1", + "gas": 19153, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4247, + "op": "MSTORE", + "gas": 19150, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4248, + "op": "DUP1", + "gas": 19147, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4249, + "op": "ISZERO", + "gas": 19144, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4250, + "op": "PUSH2", + "gas": 19141, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4253, + "op": "JUMPI", + "gas": 19138, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4254, + "op": "DUP2", + "gas": 19128, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4255, + "op": "PUSH1", + "gas": 19125, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4257, + "op": "ADD", + "gas": 19122, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4258, + "op": "PUSH1", + "gas": 19119, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4260, + "op": "DUP3", + "gas": 19116, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4261, + "op": "MUL", + "gas": 19113, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 4262, + "op": "DUP1", + "gas": 19108, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4263, + "op": "CALLDATASIZE", + "gas": 19105, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4264, + "op": "DUP4", + "gas": 19103, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4265, + "op": "CALLDATACOPY", + "gas": 19100, + "gasCost": 9, + "depth": 1 + }, + { + "pc": 4266, + "op": "DUP1", + "gas": 19091, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4267, + "op": "DUP3", + "gas": 19088, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4268, + "op": "ADD", + "gas": 19085, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4269, + "op": "SWAP2", + "gas": 19082, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4270, + "op": "POP", + "gas": 19079, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4271, + "op": "POP", + "gas": 19077, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4272, + "op": "SWAP1", + "gas": 19075, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4273, + "op": "POP", + "gas": 19072, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4274, + "op": "JUMPDEST", + "gas": 19070, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4275, + "op": "POP", + "gas": 19069, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4276, + "op": "SWAP1", + "gas": 19067, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4277, + "op": "POP", + "gas": 19064, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4278, + "op": "JUMPDEST", + "gas": 19062, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4279, + "op": "PUSH0", + "gas": 19061, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4280, + "op": "DUP6", + "gas": 19059, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4281, + "op": "EQ", + "gas": 19056, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4282, + "op": "PUSH2", + "gas": 19053, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4285, + "op": "JUMPI", + "gas": 19050, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4286, + "op": "PUSH1", + "gas": 19040, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4288, + "op": "DUP3", + "gas": 19037, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4289, + "op": "PUSH2", + "gas": 19034, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4292, + "op": "SWAP2", + "gas": 19031, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4293, + "op": "SWAP1", + "gas": 19028, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4294, + "op": "PUSH2", + "gas": 19025, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4297, + "op": "JUMP", + "gas": 19022, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7360, + "op": "JUMPDEST", + "gas": 19014, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7361, + "op": "PUSH0", + "gas": 19013, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7362, + "op": "PUSH2", + "gas": 19011, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7365, + "op": "DUP3", + "gas": 19008, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7366, + "op": "PUSH2", + "gas": 19005, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7369, + "op": "JUMP", + "gas": 19002, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 18994, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 18993, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 18991, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 18988, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 18985, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 18983, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 18980, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 18977, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 18975, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7370, + "op": "JUMPDEST", + "gas": 18967, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7371, + "op": "SWAP2", + "gas": 18966, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7372, + "op": "POP", + "gas": 18963, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7373, + "op": "PUSH2", + "gas": 18961, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7376, + "op": "DUP4", + "gas": 18958, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7377, + "op": "PUSH2", + "gas": 18955, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7380, + "op": "JUMP", + "gas": 18952, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 18944, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 18943, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 18941, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 18938, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 18935, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 18933, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 18930, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 18927, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 18925, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7381, + "op": "JUMPDEST", + "gas": 18917, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7382, + "op": "SWAP3", + "gas": 18916, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7383, + "op": "POP", + "gas": 18913, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7384, + "op": "DUP3", + "gas": 18911, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7385, + "op": "DUP3", + "gas": 18908, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7386, + "op": "SUB", + "gas": 18905, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7387, + "op": "SWAP1", + "gas": 18902, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7388, + "op": "POP", + "gas": 18899, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7389, + "op": "DUP2", + "gas": 18897, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7390, + "op": "DUP2", + "gas": 18894, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7391, + "op": "GT", + "gas": 18891, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7392, + "op": "ISZERO", + "gas": 18888, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7393, + "op": "PUSH2", + "gas": 18885, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7396, + "op": "JUMPI", + "gas": 18882, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7405, + "op": "JUMPDEST", + "gas": 18872, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7406, + "op": "SWAP3", + "gas": 18871, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7407, + "op": "SWAP2", + "gas": 18868, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7408, + "op": "POP", + "gas": 18865, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7409, + "op": "POP", + "gas": 18863, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7410, + "op": "JUMP", + "gas": 18861, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4298, + "op": "JUMPDEST", + "gas": 18853, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4299, + "op": "SWAP2", + "gas": 18852, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4300, + "op": "POP", + "gas": 18849, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4301, + "op": "PUSH1", + "gas": 18847, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4303, + "op": "DUP6", + "gas": 18844, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4304, + "op": "PUSH2", + "gas": 18841, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4307, + "op": "SWAP2", + "gas": 18838, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4308, + "op": "SWAP1", + "gas": 18835, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4309, + "op": "PUSH2", + "gas": 18832, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4312, + "op": "JUMP", + "gas": 18829, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7456, + "op": "JUMPDEST", + "gas": 18821, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7457, + "op": "PUSH0", + "gas": 18820, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7458, + "op": "PUSH2", + "gas": 18818, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7461, + "op": "DUP3", + "gas": 18815, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7462, + "op": "PUSH2", + "gas": 18812, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7465, + "op": "JUMP", + "gas": 18809, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 18801, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 18800, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 18798, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 18795, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 18792, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 18790, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 18787, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 18784, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 18782, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7466, + "op": "JUMPDEST", + "gas": 18774, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7467, + "op": "SWAP2", + "gas": 18773, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7468, + "op": "POP", + "gas": 18770, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7469, + "op": "PUSH2", + "gas": 18768, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7472, + "op": "DUP4", + "gas": 18765, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7473, + "op": "PUSH2", + "gas": 18762, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7476, + "op": "JUMP", + "gas": 18759, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 18751, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 18750, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 18748, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 18745, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 18742, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 18740, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 18737, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 18734, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 18732, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7477, + "op": "JUMPDEST", + "gas": 18724, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7478, + "op": "SWAP3", + "gas": 18723, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7479, + "op": "POP", + "gas": 18720, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7480, + "op": "DUP3", + "gas": 18718, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7481, + "op": "PUSH2", + "gas": 18715, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7484, + "op": "JUMPI", + "gas": 18712, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7493, + "op": "JUMPDEST", + "gas": 18702, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7494, + "op": "DUP3", + "gas": 18701, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7495, + "op": "DUP3", + "gas": 18698, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7496, + "op": "MOD", + "gas": 18695, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 7497, + "op": "SWAP1", + "gas": 18690, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7498, + "op": "POP", + "gas": 18687, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7499, + "op": "SWAP3", + "gas": 18685, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7500, + "op": "SWAP2", + "gas": 18682, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7501, + "op": "POP", + "gas": 18679, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7502, + "op": "POP", + "gas": 18677, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7503, + "op": "JUMP", + "gas": 18675, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4313, + "op": "JUMPDEST", + "gas": 18667, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4314, + "op": "PUSH1", + "gas": 18666, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4316, + "op": "PUSH2", + "gas": 18663, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4319, + "op": "SWAP2", + "gas": 18660, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4320, + "op": "SWAP1", + "gas": 18657, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4321, + "op": "PUSH2", + "gas": 18654, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4324, + "op": "JUMP", + "gas": 18651, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6786, + "op": "JUMPDEST", + "gas": 18643, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6787, + "op": "PUSH0", + "gas": 18642, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6788, + "op": "PUSH2", + "gas": 18640, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6791, + "op": "DUP3", + "gas": 18637, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6792, + "op": "PUSH2", + "gas": 18634, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6795, + "op": "JUMP", + "gas": 18631, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 18623, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 18622, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 18620, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 18617, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 18614, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 18612, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 18609, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 18606, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 18604, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6796, + "op": "JUMPDEST", + "gas": 18596, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6797, + "op": "SWAP2", + "gas": 18595, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6798, + "op": "POP", + "gas": 18592, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6799, + "op": "PUSH2", + "gas": 18590, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6802, + "op": "DUP4", + "gas": 18587, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6803, + "op": "PUSH2", + "gas": 18584, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6806, + "op": "JUMP", + "gas": 18581, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 18573, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 18572, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 18570, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 18567, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 18564, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 18562, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 18559, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 18556, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 18554, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6807, + "op": "JUMPDEST", + "gas": 18546, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6808, + "op": "SWAP3", + "gas": 18545, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6809, + "op": "POP", + "gas": 18542, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6810, + "op": "DUP3", + "gas": 18540, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6811, + "op": "DUP3", + "gas": 18537, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6812, + "op": "ADD", + "gas": 18534, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6813, + "op": "SWAP1", + "gas": 18531, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6814, + "op": "POP", + "gas": 18528, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6815, + "op": "DUP1", + "gas": 18526, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6816, + "op": "DUP3", + "gas": 18523, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6817, + "op": "GT", + "gas": 18520, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6818, + "op": "ISZERO", + "gas": 18517, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6819, + "op": "PUSH2", + "gas": 18514, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6822, + "op": "JUMPI", + "gas": 18511, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6831, + "op": "JUMPDEST", + "gas": 18501, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6832, + "op": "SWAP3", + "gas": 18500, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6833, + "op": "SWAP2", + "gas": 18497, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6834, + "op": "POP", + "gas": 18494, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6835, + "op": "POP", + "gas": 18492, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6836, + "op": "JUMP", + "gas": 18490, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4325, + "op": "JUMPDEST", + "gas": 18482, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4326, + "op": "PUSH1", + "gas": 18481, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4328, + "op": "SHL", + "gas": 18478, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4329, + "op": "DUP2", + "gas": 18475, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4330, + "op": "DUP4", + "gas": 18472, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4331, + "op": "DUP2", + "gas": 18469, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4332, + "op": "MLOAD", + "gas": 18466, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4333, + "op": "DUP2", + "gas": 18463, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4334, + "op": "LT", + "gas": 18460, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4335, + "op": "PUSH2", + "gas": 18457, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4338, + "op": "JUMPI", + "gas": 18454, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4347, + "op": "JUMPDEST", + "gas": 18444, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4348, + "op": "PUSH1", + "gas": 18443, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4350, + "op": "ADD", + "gas": 18440, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4351, + "op": "ADD", + "gas": 18437, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4352, + "op": "SWAP1", + "gas": 18434, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4353, + "op": "PUSH31", + "gas": 18431, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4385, + "op": "NOT", + "gas": 18428, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4386, + "op": "AND", + "gas": 18425, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4387, + "op": "SWAP1", + "gas": 18422, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4388, + "op": "DUP2", + "gas": 18419, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4389, + "op": "PUSH0", + "gas": 18416, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4390, + "op": "BYTE", + "gas": 18414, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4391, + "op": "SWAP1", + "gas": 18411, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4392, + "op": "MSTORE8", + "gas": 18408, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4393, + "op": "POP", + "gas": 18405, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4394, + "op": "PUSH1", + "gas": 18403, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4396, + "op": "DUP6", + "gas": 18400, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4397, + "op": "PUSH2", + "gas": 18397, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4400, + "op": "SWAP2", + "gas": 18394, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4401, + "op": "SWAP1", + "gas": 18391, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4402, + "op": "PUSH2", + "gas": 18388, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4405, + "op": "JUMP", + "gas": 18385, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7575, + "op": "JUMPDEST", + "gas": 18377, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7576, + "op": "PUSH0", + "gas": 18376, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7577, + "op": "PUSH2", + "gas": 18374, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7580, + "op": "DUP3", + "gas": 18371, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7581, + "op": "PUSH2", + "gas": 18368, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7584, + "op": "JUMP", + "gas": 18365, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 18357, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 18356, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 18354, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 18351, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 18348, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 18346, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 18343, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 18340, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 18338, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7585, + "op": "JUMPDEST", + "gas": 18330, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7586, + "op": "SWAP2", + "gas": 18329, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7587, + "op": "POP", + "gas": 18326, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7588, + "op": "PUSH2", + "gas": 18324, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7591, + "op": "DUP4", + "gas": 18321, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7592, + "op": "PUSH2", + "gas": 18318, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7595, + "op": "JUMP", + "gas": 18315, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 18307, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 18306, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 18304, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 18301, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 18298, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 18296, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 18293, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 18290, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 18288, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7596, + "op": "JUMPDEST", + "gas": 18280, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7597, + "op": "SWAP3", + "gas": 18279, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7598, + "op": "POP", + "gas": 18276, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7599, + "op": "DUP3", + "gas": 18274, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7600, + "op": "PUSH2", + "gas": 18271, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7603, + "op": "JUMPI", + "gas": 18268, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7612, + "op": "JUMPDEST", + "gas": 18258, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7613, + "op": "DUP3", + "gas": 18257, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7614, + "op": "DUP3", + "gas": 18254, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7615, + "op": "DIV", + "gas": 18251, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 7616, + "op": "SWAP1", + "gas": 18246, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7617, + "op": "POP", + "gas": 18243, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7618, + "op": "SWAP3", + "gas": 18241, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7619, + "op": "SWAP2", + "gas": 18238, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7620, + "op": "POP", + "gas": 18235, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7621, + "op": "POP", + "gas": 18233, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7622, + "op": "JUMP", + "gas": 18231, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4406, + "op": "JUMPDEST", + "gas": 18223, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4407, + "op": "SWAP5", + "gas": 18222, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4408, + "op": "POP", + "gas": 18219, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4409, + "op": "PUSH2", + "gas": 18217, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4412, + "op": "JUMP", + "gas": 18214, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4278, + "op": "JUMPDEST", + "gas": 18206, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4279, + "op": "PUSH0", + "gas": 18205, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4280, + "op": "DUP6", + "gas": 18203, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4281, + "op": "EQ", + "gas": 18200, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4282, + "op": "PUSH2", + "gas": 18197, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4285, + "op": "JUMPI", + "gas": 18194, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4286, + "op": "PUSH1", + "gas": 18184, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4288, + "op": "DUP3", + "gas": 18181, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4289, + "op": "PUSH2", + "gas": 18178, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4292, + "op": "SWAP2", + "gas": 18175, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4293, + "op": "SWAP1", + "gas": 18172, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4294, + "op": "PUSH2", + "gas": 18169, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4297, + "op": "JUMP", + "gas": 18166, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7360, + "op": "JUMPDEST", + "gas": 18158, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7361, + "op": "PUSH0", + "gas": 18157, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7362, + "op": "PUSH2", + "gas": 18155, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7365, + "op": "DUP3", + "gas": 18152, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7366, + "op": "PUSH2", + "gas": 18149, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7369, + "op": "JUMP", + "gas": 18146, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 18138, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 18137, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 18135, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 18132, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 18129, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 18127, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 18124, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 18121, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 18119, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7370, + "op": "JUMPDEST", + "gas": 18111, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7371, + "op": "SWAP2", + "gas": 18110, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7372, + "op": "POP", + "gas": 18107, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7373, + "op": "PUSH2", + "gas": 18105, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7376, + "op": "DUP4", + "gas": 18102, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7377, + "op": "PUSH2", + "gas": 18099, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7380, + "op": "JUMP", + "gas": 18096, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 18088, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 18087, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 18085, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 18082, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 18079, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 18077, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 18074, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 18071, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 18069, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7381, + "op": "JUMPDEST", + "gas": 18061, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7382, + "op": "SWAP3", + "gas": 18060, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7383, + "op": "POP", + "gas": 18057, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7384, + "op": "DUP3", + "gas": 18055, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7385, + "op": "DUP3", + "gas": 18052, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7386, + "op": "SUB", + "gas": 18049, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7387, + "op": "SWAP1", + "gas": 18046, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7388, + "op": "POP", + "gas": 18043, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7389, + "op": "DUP2", + "gas": 18041, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7390, + "op": "DUP2", + "gas": 18038, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7391, + "op": "GT", + "gas": 18035, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7392, + "op": "ISZERO", + "gas": 18032, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7393, + "op": "PUSH2", + "gas": 18029, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7396, + "op": "JUMPI", + "gas": 18026, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7405, + "op": "JUMPDEST", + "gas": 18016, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7406, + "op": "SWAP3", + "gas": 18015, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7407, + "op": "SWAP2", + "gas": 18012, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7408, + "op": "POP", + "gas": 18009, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7409, + "op": "POP", + "gas": 18007, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7410, + "op": "JUMP", + "gas": 18005, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4298, + "op": "JUMPDEST", + "gas": 17997, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4299, + "op": "SWAP2", + "gas": 17996, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4300, + "op": "POP", + "gas": 17993, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4301, + "op": "PUSH1", + "gas": 17991, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4303, + "op": "DUP6", + "gas": 17988, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4304, + "op": "PUSH2", + "gas": 17985, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4307, + "op": "SWAP2", + "gas": 17982, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4308, + "op": "SWAP1", + "gas": 17979, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4309, + "op": "PUSH2", + "gas": 17976, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4312, + "op": "JUMP", + "gas": 17973, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7456, + "op": "JUMPDEST", + "gas": 17965, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7457, + "op": "PUSH0", + "gas": 17964, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7458, + "op": "PUSH2", + "gas": 17962, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7461, + "op": "DUP3", + "gas": 17959, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7462, + "op": "PUSH2", + "gas": 17956, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7465, + "op": "JUMP", + "gas": 17953, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 17945, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 17944, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 17942, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 17939, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 17936, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 17934, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 17931, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 17928, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 17926, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7466, + "op": "JUMPDEST", + "gas": 17918, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7467, + "op": "SWAP2", + "gas": 17917, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7468, + "op": "POP", + "gas": 17914, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7469, + "op": "PUSH2", + "gas": 17912, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7472, + "op": "DUP4", + "gas": 17909, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7473, + "op": "PUSH2", + "gas": 17906, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7476, + "op": "JUMP", + "gas": 17903, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 17895, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 17894, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 17892, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 17889, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 17886, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 17884, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 17881, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 17878, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 17876, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7477, + "op": "JUMPDEST", + "gas": 17868, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7478, + "op": "SWAP3", + "gas": 17867, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7479, + "op": "POP", + "gas": 17864, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7480, + "op": "DUP3", + "gas": 17862, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7481, + "op": "PUSH2", + "gas": 17859, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7484, + "op": "JUMPI", + "gas": 17856, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7493, + "op": "JUMPDEST", + "gas": 17846, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7494, + "op": "DUP3", + "gas": 17845, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7495, + "op": "DUP3", + "gas": 17842, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7496, + "op": "MOD", + "gas": 17839, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 7497, + "op": "SWAP1", + "gas": 17834, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7498, + "op": "POP", + "gas": 17831, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7499, + "op": "SWAP3", + "gas": 17829, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7500, + "op": "SWAP2", + "gas": 17826, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7501, + "op": "POP", + "gas": 17823, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7502, + "op": "POP", + "gas": 17821, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7503, + "op": "JUMP", + "gas": 17819, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4313, + "op": "JUMPDEST", + "gas": 17811, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4314, + "op": "PUSH1", + "gas": 17810, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4316, + "op": "PUSH2", + "gas": 17807, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4319, + "op": "SWAP2", + "gas": 17804, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4320, + "op": "SWAP1", + "gas": 17801, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4321, + "op": "PUSH2", + "gas": 17798, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4324, + "op": "JUMP", + "gas": 17795, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6786, + "op": "JUMPDEST", + "gas": 17787, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6787, + "op": "PUSH0", + "gas": 17786, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6788, + "op": "PUSH2", + "gas": 17784, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6791, + "op": "DUP3", + "gas": 17781, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6792, + "op": "PUSH2", + "gas": 17778, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6795, + "op": "JUMP", + "gas": 17775, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 17767, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 17766, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 17764, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 17761, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 17758, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 17756, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 17753, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 17750, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 17748, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6796, + "op": "JUMPDEST", + "gas": 17740, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6797, + "op": "SWAP2", + "gas": 17739, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6798, + "op": "POP", + "gas": 17736, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6799, + "op": "PUSH2", + "gas": 17734, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6802, + "op": "DUP4", + "gas": 17731, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6803, + "op": "PUSH2", + "gas": 17728, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6806, + "op": "JUMP", + "gas": 17725, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 17717, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 17716, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 17714, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 17711, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 17708, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 17706, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 17703, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 17700, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 17698, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6807, + "op": "JUMPDEST", + "gas": 17690, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6808, + "op": "SWAP3", + "gas": 17689, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6809, + "op": "POP", + "gas": 17686, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6810, + "op": "DUP3", + "gas": 17684, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6811, + "op": "DUP3", + "gas": 17681, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6812, + "op": "ADD", + "gas": 17678, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6813, + "op": "SWAP1", + "gas": 17675, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6814, + "op": "POP", + "gas": 17672, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6815, + "op": "DUP1", + "gas": 17670, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6816, + "op": "DUP3", + "gas": 17667, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6817, + "op": "GT", + "gas": 17664, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6818, + "op": "ISZERO", + "gas": 17661, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6819, + "op": "PUSH2", + "gas": 17658, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6822, + "op": "JUMPI", + "gas": 17655, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6831, + "op": "JUMPDEST", + "gas": 17645, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6832, + "op": "SWAP3", + "gas": 17644, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6833, + "op": "SWAP2", + "gas": 17641, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6834, + "op": "POP", + "gas": 17638, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6835, + "op": "POP", + "gas": 17636, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6836, + "op": "JUMP", + "gas": 17634, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4325, + "op": "JUMPDEST", + "gas": 17626, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4326, + "op": "PUSH1", + "gas": 17625, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4328, + "op": "SHL", + "gas": 17622, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4329, + "op": "DUP2", + "gas": 17619, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4330, + "op": "DUP4", + "gas": 17616, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4331, + "op": "DUP2", + "gas": 17613, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4332, + "op": "MLOAD", + "gas": 17610, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4333, + "op": "DUP2", + "gas": 17607, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4334, + "op": "LT", + "gas": 17604, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4335, + "op": "PUSH2", + "gas": 17601, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4338, + "op": "JUMPI", + "gas": 17598, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4347, + "op": "JUMPDEST", + "gas": 17588, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4348, + "op": "PUSH1", + "gas": 17587, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4350, + "op": "ADD", + "gas": 17584, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4351, + "op": "ADD", + "gas": 17581, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4352, + "op": "SWAP1", + "gas": 17578, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4353, + "op": "PUSH31", + "gas": 17575, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4385, + "op": "NOT", + "gas": 17572, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4386, + "op": "AND", + "gas": 17569, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4387, + "op": "SWAP1", + "gas": 17566, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4388, + "op": "DUP2", + "gas": 17563, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4389, + "op": "PUSH0", + "gas": 17560, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4390, + "op": "BYTE", + "gas": 17558, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4391, + "op": "SWAP1", + "gas": 17555, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4392, + "op": "MSTORE8", + "gas": 17552, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4393, + "op": "POP", + "gas": 17549, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4394, + "op": "PUSH1", + "gas": 17547, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4396, + "op": "DUP6", + "gas": 17544, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4397, + "op": "PUSH2", + "gas": 17541, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4400, + "op": "SWAP2", + "gas": 17538, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4401, + "op": "SWAP1", + "gas": 17535, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4402, + "op": "PUSH2", + "gas": 17532, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4405, + "op": "JUMP", + "gas": 17529, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7575, + "op": "JUMPDEST", + "gas": 17521, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7576, + "op": "PUSH0", + "gas": 17520, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7577, + "op": "PUSH2", + "gas": 17518, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7580, + "op": "DUP3", + "gas": 17515, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7581, + "op": "PUSH2", + "gas": 17512, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7584, + "op": "JUMP", + "gas": 17509, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 17501, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 17500, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 17498, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 17495, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 17492, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 17490, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 17487, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 17484, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 17482, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7585, + "op": "JUMPDEST", + "gas": 17474, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7586, + "op": "SWAP2", + "gas": 17473, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7587, + "op": "POP", + "gas": 17470, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7588, + "op": "PUSH2", + "gas": 17468, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7591, + "op": "DUP4", + "gas": 17465, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7592, + "op": "PUSH2", + "gas": 17462, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7595, + "op": "JUMP", + "gas": 17459, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 17451, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 17450, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 17448, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 17445, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 17442, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 17440, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 17437, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 17434, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 17432, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7596, + "op": "JUMPDEST", + "gas": 17424, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7597, + "op": "SWAP3", + "gas": 17423, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7598, + "op": "POP", + "gas": 17420, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7599, + "op": "DUP3", + "gas": 17418, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7600, + "op": "PUSH2", + "gas": 17415, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7603, + "op": "JUMPI", + "gas": 17412, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7612, + "op": "JUMPDEST", + "gas": 17402, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7613, + "op": "DUP3", + "gas": 17401, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7614, + "op": "DUP3", + "gas": 17398, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7615, + "op": "DIV", + "gas": 17395, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 7616, + "op": "SWAP1", + "gas": 17390, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7617, + "op": "POP", + "gas": 17387, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7618, + "op": "SWAP3", + "gas": 17385, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7619, + "op": "SWAP2", + "gas": 17382, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7620, + "op": "POP", + "gas": 17379, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7621, + "op": "POP", + "gas": 17377, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7622, + "op": "JUMP", + "gas": 17375, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4406, + "op": "JUMPDEST", + "gas": 17367, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4407, + "op": "SWAP5", + "gas": 17366, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4408, + "op": "POP", + "gas": 17363, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4409, + "op": "PUSH2", + "gas": 17361, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4412, + "op": "JUMP", + "gas": 17358, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4278, + "op": "JUMPDEST", + "gas": 17350, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4279, + "op": "PUSH0", + "gas": 17349, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4280, + "op": "DUP6", + "gas": 17347, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4281, + "op": "EQ", + "gas": 17344, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4282, + "op": "PUSH2", + "gas": 17341, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4285, + "op": "JUMPI", + "gas": 17338, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4413, + "op": "JUMPDEST", + "gas": 17328, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4414, + "op": "DUP1", + "gas": 17327, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4415, + "op": "SWAP4", + "gas": 17324, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4416, + "op": "POP", + "gas": 17321, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4417, + "op": "POP", + "gas": 17319, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4418, + "op": "POP", + "gas": 17317, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4419, + "op": "POP", + "gas": 17315, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4420, + "op": "JUMPDEST", + "gas": 17313, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4421, + "op": "SWAP2", + "gas": 17312, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4422, + "op": "SWAP1", + "gas": 17309, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4423, + "op": "POP", + "gas": 17306, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4424, + "op": "JUMP", + "gas": 17304, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 2669, + "op": "JUMPDEST", + "gas": 17296, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 2670, + "op": "PUSH1", + "gas": 17295, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2672, + "op": "MLOAD", + "gas": 17292, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2673, + "op": "PUSH1", + "gas": 17289, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2675, + "op": "ADD", + "gas": 17286, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2676, + "op": "PUSH2", + "gas": 17283, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2679, + "op": "SWAP4", + "gas": 17280, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2680, + "op": "SWAP3", + "gas": 17277, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2681, + "op": "SWAP2", + "gas": 17274, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2682, + "op": "SWAP1", + "gas": 17271, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2683, + "op": "PUSH2", + "gas": 17268, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2686, + "op": "JUMP", + "gas": 17265, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7279, + "op": "JUMPDEST", + "gas": 17257, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7280, + "op": "PUSH0", + "gas": 17256, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7281, + "op": "PUSH2", + "gas": 17254, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7284, + "op": "DUP3", + "gas": 17251, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7285, + "op": "PUSH2", + "gas": 17248, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7288, + "op": "JUMP", + "gas": 17245, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7171, + "op": "JUMPDEST", + "gas": 17237, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7172, + "op": "PUSH0", + "gas": 17236, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7173, + "op": "PUSH2", + "gas": 17234, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7176, + "op": "PUSH1", + "gas": 17231, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7178, + "op": "DUP4", + "gas": 17228, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7179, + "op": "PUSH2", + "gas": 17225, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7182, + "op": "JUMP", + "gas": 17222, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5411, + "op": "JUMPDEST", + "gas": 17214, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5412, + "op": "PUSH0", + "gas": 17213, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5413, + "op": "DUP2", + "gas": 17211, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5414, + "op": "SWAP1", + "gas": 17208, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5415, + "op": "POP", + "gas": 17205, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5416, + "op": "SWAP3", + "gas": 17203, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5417, + "op": "SWAP2", + "gas": 17200, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5418, + "op": "POP", + "gas": 17197, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5419, + "op": "POP", + "gas": 17195, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5420, + "op": "JUMP", + "gas": 17193, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7183, + "op": "JUMPDEST", + "gas": 17185, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7184, + "op": "SWAP2", + "gas": 17184, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7185, + "op": "POP", + "gas": 17181, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7186, + "op": "PUSH2", + "gas": 17179, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7189, + "op": "DUP3", + "gas": 17176, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7190, + "op": "PUSH2", + "gas": 17173, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7193, + "op": "JUMP", + "gas": 17170, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7131, + "op": "JUMPDEST", + "gas": 17162, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7132, + "op": "PUSH32", + "gas": 17161, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7165, + "op": "PUSH0", + "gas": 17158, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7166, + "op": "DUP3", + "gas": 17156, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7167, + "op": "ADD", + "gas": 17153, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7168, + "op": "MSTORE", + "gas": 17150, + "gasCost": 9, + "depth": 1 + }, + { + "pc": 7169, + "op": "POP", + "gas": 17141, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7170, + "op": "JUMP", + "gas": 17139, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7194, + "op": "JUMPDEST", + "gas": 17131, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7195, + "op": "PUSH1", + "gas": 17130, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7197, + "op": "DUP3", + "gas": 17127, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7198, + "op": "ADD", + "gas": 17124, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7199, + "op": "SWAP1", + "gas": 17121, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7200, + "op": "POP", + "gas": 17118, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7201, + "op": "SWAP2", + "gas": 17116, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7202, + "op": "SWAP1", + "gas": 17113, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7203, + "op": "POP", + "gas": 17110, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7204, + "op": "JUMP", + "gas": 17108, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7289, + "op": "JUMPDEST", + "gas": 17100, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7290, + "op": "SWAP2", + "gas": 17099, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7291, + "op": "POP", + "gas": 17096, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7292, + "op": "PUSH2", + "gas": 17094, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7295, + "op": "DUP3", + "gas": 17091, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7296, + "op": "DUP7", + "gas": 17088, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7297, + "op": "PUSH2", + "gas": 17085, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7300, + "op": "JUMP", + "gas": 17082, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5505, + "op": "JUMPDEST", + "gas": 17074, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5506, + "op": "PUSH0", + "gas": 17073, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5507, + "op": "PUSH2", + "gas": 17071, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5510, + "op": "DUP3", + "gas": 17068, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5511, + "op": "PUSH2", + "gas": 17065, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5514, + "op": "JUMP", + "gas": 17062, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5495, + "op": "JUMPDEST", + "gas": 17054, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5496, + "op": "PUSH0", + "gas": 17053, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5497, + "op": "DUP2", + "gas": 17051, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5498, + "op": "MLOAD", + "gas": 17048, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5499, + "op": "SWAP1", + "gas": 17045, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5500, + "op": "POP", + "gas": 17042, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5501, + "op": "SWAP2", + "gas": 17040, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5502, + "op": "SWAP1", + "gas": 17037, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5503, + "op": "POP", + "gas": 17034, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5504, + "op": "JUMP", + "gas": 17032, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5515, + "op": "JUMPDEST", + "gas": 17024, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5516, + "op": "PUSH2", + "gas": 17023, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5519, + "op": "DUP2", + "gas": 17020, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5520, + "op": "DUP6", + "gas": 17017, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5521, + "op": "PUSH2", + "gas": 17014, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5524, + "op": "JUMP", + "gas": 17011, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5411, + "op": "JUMPDEST", + "gas": 17003, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5412, + "op": "PUSH0", + "gas": 17002, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5413, + "op": "DUP2", + "gas": 17000, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5414, + "op": "SWAP1", + "gas": 16997, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5415, + "op": "POP", + "gas": 16994, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5416, + "op": "SWAP3", + "gas": 16992, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5417, + "op": "SWAP2", + "gas": 16989, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5418, + "op": "POP", + "gas": 16986, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5419, + "op": "POP", + "gas": 16984, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5420, + "op": "JUMP", + "gas": 16982, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5525, + "op": "JUMPDEST", + "gas": 16974, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5526, + "op": "SWAP4", + "gas": 16973, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5527, + "op": "POP", + "gas": 16970, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5528, + "op": "PUSH2", + "gas": 16968, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5531, + "op": "DUP2", + "gas": 16965, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5532, + "op": "DUP6", + "gas": 16962, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5533, + "op": "PUSH1", + "gas": 16959, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5535, + "op": "DUP7", + "gas": 16956, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5536, + "op": "ADD", + "gas": 16953, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5537, + "op": "PUSH2", + "gas": 16950, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5540, + "op": "JUMP", + "gas": 16947, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5135, + "op": "JUMPDEST", + "gas": 16939, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5136, + "op": "DUP3", + "gas": 16938, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5137, + "op": "DUP2", + "gas": 16935, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5138, + "op": "DUP4", + "gas": 16932, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5139, + "op": "opcode 0x5e not defined", + "gas": 16929, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 5140, + "op": "PUSH0", + "gas": 16923, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5141, + "op": "DUP4", + "gas": 16921, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5142, + "op": "DUP4", + "gas": 16918, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5143, + "op": "ADD", + "gas": 16915, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5144, + "op": "MSTORE", + "gas": 16912, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 5145, + "op": "POP", + "gas": 16906, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5146, + "op": "POP", + "gas": 16904, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5147, + "op": "POP", + "gas": 16902, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5148, + "op": "JUMP", + "gas": 16900, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5541, + "op": "JUMPDEST", + "gas": 16892, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5542, + "op": "DUP1", + "gas": 16891, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5543, + "op": "DUP5", + "gas": 16888, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5544, + "op": "ADD", + "gas": 16885, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5545, + "op": "SWAP2", + "gas": 16882, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5546, + "op": "POP", + "gas": 16879, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5547, + "op": "POP", + "gas": 16877, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5548, + "op": "SWAP3", + "gas": 16875, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5549, + "op": "SWAP2", + "gas": 16872, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5550, + "op": "POP", + "gas": 16869, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5551, + "op": "POP", + "gas": 16867, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5552, + "op": "JUMP", + "gas": 16865, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7301, + "op": "JUMPDEST", + "gas": 16857, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7302, + "op": "SWAP2", + "gas": 16856, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7303, + "op": "POP", + "gas": 16853, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7304, + "op": "PUSH2", + "gas": 16851, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7307, + "op": "DUP3", + "gas": 16848, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7308, + "op": "PUSH2", + "gas": 16845, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7311, + "op": "JUMP", + "gas": 16842, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7245, + "op": "JUMPDEST", + "gas": 16834, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7246, + "op": "PUSH0", + "gas": 16833, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7247, + "op": "PUSH2", + "gas": 16831, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7250, + "op": "PUSH1", + "gas": 16828, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7252, + "op": "DUP4", + "gas": 16825, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7253, + "op": "PUSH2", + "gas": 16822, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7256, + "op": "JUMP", + "gas": 16819, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5411, + "op": "JUMPDEST", + "gas": 16811, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5412, + "op": "PUSH0", + "gas": 16810, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5413, + "op": "DUP2", + "gas": 16808, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5414, + "op": "SWAP1", + "gas": 16805, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5415, + "op": "POP", + "gas": 16802, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5416, + "op": "SWAP3", + "gas": 16800, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5417, + "op": "SWAP2", + "gas": 16797, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5418, + "op": "POP", + "gas": 16794, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5419, + "op": "POP", + "gas": 16792, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5420, + "op": "JUMP", + "gas": 16790, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7257, + "op": "JUMPDEST", + "gas": 16782, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7258, + "op": "SWAP2", + "gas": 16781, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7259, + "op": "POP", + "gas": 16778, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7260, + "op": "PUSH2", + "gas": 16776, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7263, + "op": "DUP3", + "gas": 16773, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7264, + "op": "PUSH2", + "gas": 16770, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7267, + "op": "JUMP", + "gas": 16767, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7205, + "op": "JUMPDEST", + "gas": 16759, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7206, + "op": "PUSH32", + "gas": 16758, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7239, + "op": "PUSH0", + "gas": 16755, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7240, + "op": "DUP3", + "gas": 16753, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7241, + "op": "ADD", + "gas": 16750, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7242, + "op": "MSTORE", + "gas": 16747, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7243, + "op": "POP", + "gas": 16744, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7244, + "op": "JUMP", + "gas": 16742, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7268, + "op": "JUMPDEST", + "gas": 16734, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7269, + "op": "PUSH1", + "gas": 16733, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7271, + "op": "DUP3", + "gas": 16730, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7272, + "op": "ADD", + "gas": 16727, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7273, + "op": "SWAP1", + "gas": 16724, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7274, + "op": "POP", + "gas": 16721, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7275, + "op": "SWAP2", + "gas": 16719, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7276, + "op": "SWAP1", + "gas": 16716, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7277, + "op": "POP", + "gas": 16713, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7278, + "op": "JUMP", + "gas": 16711, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7312, + "op": "JUMPDEST", + "gas": 16703, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7313, + "op": "SWAP2", + "gas": 16702, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7314, + "op": "POP", + "gas": 16699, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7315, + "op": "PUSH2", + "gas": 16697, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7318, + "op": "DUP3", + "gas": 16694, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7319, + "op": "DUP6", + "gas": 16691, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7320, + "op": "PUSH2", + "gas": 16688, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7323, + "op": "JUMP", + "gas": 16685, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5505, + "op": "JUMPDEST", + "gas": 16677, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5506, + "op": "PUSH0", + "gas": 16676, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5507, + "op": "PUSH2", + "gas": 16674, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5510, + "op": "DUP3", + "gas": 16671, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5511, + "op": "PUSH2", + "gas": 16668, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5514, + "op": "JUMP", + "gas": 16665, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5495, + "op": "JUMPDEST", + "gas": 16657, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5496, + "op": "PUSH0", + "gas": 16656, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5497, + "op": "DUP2", + "gas": 16654, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5498, + "op": "MLOAD", + "gas": 16651, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5499, + "op": "SWAP1", + "gas": 16648, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5500, + "op": "POP", + "gas": 16645, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5501, + "op": "SWAP2", + "gas": 16643, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5502, + "op": "SWAP1", + "gas": 16640, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5503, + "op": "POP", + "gas": 16637, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5504, + "op": "JUMP", + "gas": 16635, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5515, + "op": "JUMPDEST", + "gas": 16627, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5516, + "op": "PUSH2", + "gas": 16626, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5519, + "op": "DUP2", + "gas": 16623, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5520, + "op": "DUP6", + "gas": 16620, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5521, + "op": "PUSH2", + "gas": 16617, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5524, + "op": "JUMP", + "gas": 16614, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5411, + "op": "JUMPDEST", + "gas": 16606, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5412, + "op": "PUSH0", + "gas": 16605, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5413, + "op": "DUP2", + "gas": 16603, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5414, + "op": "SWAP1", + "gas": 16600, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5415, + "op": "POP", + "gas": 16597, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5416, + "op": "SWAP3", + "gas": 16595, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5417, + "op": "SWAP2", + "gas": 16592, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5418, + "op": "POP", + "gas": 16589, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5419, + "op": "POP", + "gas": 16587, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5420, + "op": "JUMP", + "gas": 16585, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5525, + "op": "JUMPDEST", + "gas": 16577, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5526, + "op": "SWAP4", + "gas": 16576, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5527, + "op": "POP", + "gas": 16573, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5528, + "op": "PUSH2", + "gas": 16571, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5531, + "op": "DUP2", + "gas": 16568, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5532, + "op": "DUP6", + "gas": 16565, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5533, + "op": "PUSH1", + "gas": 16562, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5535, + "op": "DUP7", + "gas": 16559, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5536, + "op": "ADD", + "gas": 16556, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5537, + "op": "PUSH2", + "gas": 16553, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5540, + "op": "JUMP", + "gas": 16550, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5135, + "op": "JUMPDEST", + "gas": 16542, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5136, + "op": "DUP3", + "gas": 16541, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5137, + "op": "DUP2", + "gas": 16538, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5138, + "op": "DUP4", + "gas": 16535, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5139, + "op": "opcode 0x5e not defined", + "gas": 16532, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 5140, + "op": "PUSH0", + "gas": 16526, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5141, + "op": "DUP4", + "gas": 16524, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5142, + "op": "DUP4", + "gas": 16521, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5143, + "op": "ADD", + "gas": 16518, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5144, + "op": "MSTORE", + "gas": 16515, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5145, + "op": "POP", + "gas": 16512, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5146, + "op": "POP", + "gas": 16510, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5147, + "op": "POP", + "gas": 16508, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5148, + "op": "JUMP", + "gas": 16506, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5541, + "op": "JUMPDEST", + "gas": 16498, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5542, + "op": "DUP1", + "gas": 16497, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5543, + "op": "DUP5", + "gas": 16494, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5544, + "op": "ADD", + "gas": 16491, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5545, + "op": "SWAP2", + "gas": 16488, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5546, + "op": "POP", + "gas": 16485, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5547, + "op": "POP", + "gas": 16483, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5548, + "op": "SWAP3", + "gas": 16481, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5549, + "op": "SWAP2", + "gas": 16478, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5550, + "op": "POP", + "gas": 16475, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5551, + "op": "POP", + "gas": 16473, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5552, + "op": "JUMP", + "gas": 16471, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7324, + "op": "JUMPDEST", + "gas": 16463, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7325, + "op": "SWAP2", + "gas": 16462, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7326, + "op": "POP", + "gas": 16459, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7327, + "op": "PUSH2", + "gas": 16457, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7330, + "op": "DUP3", + "gas": 16454, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7331, + "op": "PUSH2", + "gas": 16451, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7334, + "op": "JUMP", + "gas": 16448, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7245, + "op": "JUMPDEST", + "gas": 16440, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7246, + "op": "PUSH0", + "gas": 16439, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7247, + "op": "PUSH2", + "gas": 16437, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7250, + "op": "PUSH1", + "gas": 16434, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7252, + "op": "DUP4", + "gas": 16431, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7253, + "op": "PUSH2", + "gas": 16428, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7256, + "op": "JUMP", + "gas": 16425, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5411, + "op": "JUMPDEST", + "gas": 16417, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5412, + "op": "PUSH0", + "gas": 16416, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5413, + "op": "DUP2", + "gas": 16414, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5414, + "op": "SWAP1", + "gas": 16411, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5415, + "op": "POP", + "gas": 16408, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5416, + "op": "SWAP3", + "gas": 16406, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5417, + "op": "SWAP2", + "gas": 16403, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5418, + "op": "POP", + "gas": 16400, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5419, + "op": "POP", + "gas": 16398, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5420, + "op": "JUMP", + "gas": 16396, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7257, + "op": "JUMPDEST", + "gas": 16388, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7258, + "op": "SWAP2", + "gas": 16387, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7259, + "op": "POP", + "gas": 16384, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7260, + "op": "PUSH2", + "gas": 16382, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7263, + "op": "DUP3", + "gas": 16379, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7264, + "op": "PUSH2", + "gas": 16376, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7267, + "op": "JUMP", + "gas": 16373, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7205, + "op": "JUMPDEST", + "gas": 16365, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7206, + "op": "PUSH32", + "gas": 16364, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7239, + "op": "PUSH0", + "gas": 16361, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7240, + "op": "DUP3", + "gas": 16359, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7241, + "op": "ADD", + "gas": 16356, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7242, + "op": "MSTORE", + "gas": 16353, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7243, + "op": "POP", + "gas": 16350, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7244, + "op": "JUMP", + "gas": 16348, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7268, + "op": "JUMPDEST", + "gas": 16340, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7269, + "op": "PUSH1", + "gas": 16339, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7271, + "op": "DUP3", + "gas": 16336, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7272, + "op": "ADD", + "gas": 16333, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7273, + "op": "SWAP1", + "gas": 16330, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7274, + "op": "POP", + "gas": 16327, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7275, + "op": "SWAP2", + "gas": 16325, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7276, + "op": "SWAP1", + "gas": 16322, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7277, + "op": "POP", + "gas": 16319, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7278, + "op": "JUMP", + "gas": 16317, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7335, + "op": "JUMPDEST", + "gas": 16309, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7336, + "op": "SWAP2", + "gas": 16308, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7337, + "op": "POP", + "gas": 16305, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7338, + "op": "PUSH2", + "gas": 16303, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7341, + "op": "DUP3", + "gas": 16300, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7342, + "op": "DUP5", + "gas": 16297, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7343, + "op": "PUSH2", + "gas": 16294, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7346, + "op": "JUMP", + "gas": 16291, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5505, + "op": "JUMPDEST", + "gas": 16283, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5506, + "op": "PUSH0", + "gas": 16282, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5507, + "op": "PUSH2", + "gas": 16280, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5510, + "op": "DUP3", + "gas": 16277, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5511, + "op": "PUSH2", + "gas": 16274, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5514, + "op": "JUMP", + "gas": 16271, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5495, + "op": "JUMPDEST", + "gas": 16263, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5496, + "op": "PUSH0", + "gas": 16262, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5497, + "op": "DUP2", + "gas": 16260, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5498, + "op": "MLOAD", + "gas": 16257, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5499, + "op": "SWAP1", + "gas": 16254, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5500, + "op": "POP", + "gas": 16251, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5501, + "op": "SWAP2", + "gas": 16249, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5502, + "op": "SWAP1", + "gas": 16246, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5503, + "op": "POP", + "gas": 16243, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5504, + "op": "JUMP", + "gas": 16241, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5515, + "op": "JUMPDEST", + "gas": 16233, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5516, + "op": "PUSH2", + "gas": 16232, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5519, + "op": "DUP2", + "gas": 16229, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5520, + "op": "DUP6", + "gas": 16226, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5521, + "op": "PUSH2", + "gas": 16223, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5524, + "op": "JUMP", + "gas": 16220, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5411, + "op": "JUMPDEST", + "gas": 16212, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5412, + "op": "PUSH0", + "gas": 16211, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5413, + "op": "DUP2", + "gas": 16209, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5414, + "op": "SWAP1", + "gas": 16206, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5415, + "op": "POP", + "gas": 16203, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5416, + "op": "SWAP3", + "gas": 16201, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5417, + "op": "SWAP2", + "gas": 16198, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5418, + "op": "POP", + "gas": 16195, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5419, + "op": "POP", + "gas": 16193, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5420, + "op": "JUMP", + "gas": 16191, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5525, + "op": "JUMPDEST", + "gas": 16183, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5526, + "op": "SWAP4", + "gas": 16182, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5527, + "op": "POP", + "gas": 16179, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5528, + "op": "PUSH2", + "gas": 16177, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5531, + "op": "DUP2", + "gas": 16174, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5532, + "op": "DUP6", + "gas": 16171, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5533, + "op": "PUSH1", + "gas": 16168, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5535, + "op": "DUP7", + "gas": 16165, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5536, + "op": "ADD", + "gas": 16162, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5537, + "op": "PUSH2", + "gas": 16159, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5540, + "op": "JUMP", + "gas": 16156, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5135, + "op": "JUMPDEST", + "gas": 16148, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5136, + "op": "DUP3", + "gas": 16147, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5137, + "op": "DUP2", + "gas": 16144, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5138, + "op": "DUP4", + "gas": 16141, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5139, + "op": "opcode 0x5e not defined", + "gas": 16138, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 5140, + "op": "PUSH0", + "gas": 16132, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5141, + "op": "DUP4", + "gas": 16130, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5142, + "op": "DUP4", + "gas": 16127, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5143, + "op": "ADD", + "gas": 16124, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5144, + "op": "MSTORE", + "gas": 16121, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5145, + "op": "POP", + "gas": 16118, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5146, + "op": "POP", + "gas": 16116, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5147, + "op": "POP", + "gas": 16114, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5148, + "op": "JUMP", + "gas": 16112, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5541, + "op": "JUMPDEST", + "gas": 16104, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5542, + "op": "DUP1", + "gas": 16103, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5543, + "op": "DUP5", + "gas": 16100, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5544, + "op": "ADD", + "gas": 16097, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5545, + "op": "SWAP2", + "gas": 16094, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5546, + "op": "POP", + "gas": 16091, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5547, + "op": "POP", + "gas": 16089, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5548, + "op": "SWAP3", + "gas": 16087, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5549, + "op": "SWAP2", + "gas": 16084, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5550, + "op": "POP", + "gas": 16081, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5551, + "op": "POP", + "gas": 16079, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5552, + "op": "JUMP", + "gas": 16077, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7347, + "op": "JUMPDEST", + "gas": 16069, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7348, + "op": "SWAP2", + "gas": 16068, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7349, + "op": "POP", + "gas": 16065, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7350, + "op": "DUP2", + "gas": 16063, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7351, + "op": "SWAP1", + "gas": 16060, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7352, + "op": "POP", + "gas": 16057, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7353, + "op": "SWAP5", + "gas": 16055, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7354, + "op": "SWAP4", + "gas": 16052, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7355, + "op": "POP", + "gas": 16049, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7356, + "op": "POP", + "gas": 16047, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7357, + "op": "POP", + "gas": 16045, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7358, + "op": "POP", + "gas": 16043, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7359, + "op": "JUMP", + "gas": 16041, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 2687, + "op": "JUMPDEST", + "gas": 16033, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 2688, + "op": "PUSH1", + "gas": 16032, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2690, + "op": "MLOAD", + "gas": 16029, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2691, + "op": "PUSH1", + "gas": 16026, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2693, + "op": "DUP2", + "gas": 16023, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2694, + "op": "DUP4", + "gas": 16020, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2695, + "op": "SUB", + "gas": 16017, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2696, + "op": "SUB", + "gas": 16014, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2697, + "op": "DUP2", + "gas": 16011, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2698, + "op": "MSTORE", + "gas": 16008, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2699, + "op": "SWAP1", + "gas": 16005, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2700, + "op": "PUSH1", + "gas": 16002, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2702, + "op": "MSTORE", + "gas": 15999, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2703, + "op": "SWAP1", + "gas": 15996, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2704, + "op": "POP", + "gas": 15993, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2705, + "op": "PUSH0", + "gas": 15991, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2706, + "op": "DUP4", + "gas": 15989, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2707, + "op": "DUP6", + "gas": 15986, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2708, + "op": "DUP8", + "gas": 15983, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2709, + "op": "PUSH1", + "gas": 15980, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2711, + "op": "PUSH2", + "gas": 15977, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2714, + "op": "SWAP2", + "gas": 15974, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2715, + "op": "SWAP1", + "gas": 15971, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2716, + "op": "PUSH2", + "gas": 15968, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2719, + "op": "JUMP", + "gas": 15965, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6786, + "op": "JUMPDEST", + "gas": 15957, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6787, + "op": "PUSH0", + "gas": 15956, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6788, + "op": "PUSH2", + "gas": 15954, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6791, + "op": "DUP3", + "gas": 15951, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6792, + "op": "PUSH2", + "gas": 15948, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6795, + "op": "JUMP", + "gas": 15945, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 15937, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 15936, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 15934, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 15931, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 15928, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 15926, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 15923, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 15920, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 15918, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6796, + "op": "JUMPDEST", + "gas": 15910, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6797, + "op": "SWAP2", + "gas": 15909, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6798, + "op": "POP", + "gas": 15906, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6799, + "op": "PUSH2", + "gas": 15904, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6802, + "op": "DUP4", + "gas": 15901, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6803, + "op": "PUSH2", + "gas": 15898, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6806, + "op": "JUMP", + "gas": 15895, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 15887, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 15886, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 15884, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 15881, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 15878, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 15876, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 15873, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 15870, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 15868, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6807, + "op": "JUMPDEST", + "gas": 15860, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6808, + "op": "SWAP3", + "gas": 15859, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6809, + "op": "POP", + "gas": 15856, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6810, + "op": "DUP3", + "gas": 15854, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6811, + "op": "DUP3", + "gas": 15851, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6812, + "op": "ADD", + "gas": 15848, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6813, + "op": "SWAP1", + "gas": 15845, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6814, + "op": "POP", + "gas": 15842, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6815, + "op": "DUP1", + "gas": 15840, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6816, + "op": "DUP3", + "gas": 15837, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6817, + "op": "GT", + "gas": 15834, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6818, + "op": "ISZERO", + "gas": 15831, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6819, + "op": "PUSH2", + "gas": 15828, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6822, + "op": "JUMPI", + "gas": 15825, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6831, + "op": "JUMPDEST", + "gas": 15815, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6832, + "op": "SWAP3", + "gas": 15814, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6833, + "op": "SWAP2", + "gas": 15811, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6834, + "op": "POP", + "gas": 15808, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6835, + "op": "POP", + "gas": 15806, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6836, + "op": "JUMP", + "gas": 15804, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 2720, + "op": "JUMPDEST", + "gas": 15796, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 2721, + "op": "PUSH2", + "gas": 15795, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2724, + "op": "SWAP2", + "gas": 15792, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2725, + "op": "SWAP1", + "gas": 15789, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2726, + "op": "PUSH2", + "gas": 15786, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2729, + "op": "JUMP", + "gas": 15783, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6786, + "op": "JUMPDEST", + "gas": 15775, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6787, + "op": "PUSH0", + "gas": 15774, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6788, + "op": "PUSH2", + "gas": 15772, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6791, + "op": "DUP3", + "gas": 15769, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6792, + "op": "PUSH2", + "gas": 15766, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6795, + "op": "JUMP", + "gas": 15763, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 15755, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 15754, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 15752, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 15749, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 15746, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 15744, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 15741, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 15738, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 15736, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6796, + "op": "JUMPDEST", + "gas": 15728, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6797, + "op": "SWAP2", + "gas": 15727, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6798, + "op": "POP", + "gas": 15724, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6799, + "op": "PUSH2", + "gas": 15722, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6802, + "op": "DUP4", + "gas": 15719, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6803, + "op": "PUSH2", + "gas": 15716, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6806, + "op": "JUMP", + "gas": 15713, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 15705, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 15704, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 15702, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 15699, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 15696, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 15694, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 15691, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 15688, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 15686, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6807, + "op": "JUMPDEST", + "gas": 15678, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6808, + "op": "SWAP3", + "gas": 15677, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6809, + "op": "POP", + "gas": 15674, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6810, + "op": "DUP3", + "gas": 15672, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6811, + "op": "DUP3", + "gas": 15669, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6812, + "op": "ADD", + "gas": 15666, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6813, + "op": "SWAP1", + "gas": 15663, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6814, + "op": "POP", + "gas": 15660, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6815, + "op": "DUP1", + "gas": 15658, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6816, + "op": "DUP3", + "gas": 15655, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6817, + "op": "GT", + "gas": 15652, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6818, + "op": "ISZERO", + "gas": 15649, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6819, + "op": "PUSH2", + "gas": 15646, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6822, + "op": "JUMPI", + "gas": 15643, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6831, + "op": "JUMPDEST", + "gas": 15633, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6832, + "op": "SWAP3", + "gas": 15632, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6833, + "op": "SWAP2", + "gas": 15629, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6834, + "op": "POP", + "gas": 15626, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6835, + "op": "POP", + "gas": 15624, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6836, + "op": "JUMP", + "gas": 15622, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 2730, + "op": "JUMPDEST", + "gas": 15614, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 2731, + "op": "PUSH2", + "gas": 15613, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2734, + "op": "SWAP2", + "gas": 15610, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2735, + "op": "SWAP1", + "gas": 15607, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2736, + "op": "PUSH2", + "gas": 15604, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2739, + "op": "JUMP", + "gas": 15601, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6786, + "op": "JUMPDEST", + "gas": 15593, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6787, + "op": "PUSH0", + "gas": 15592, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6788, + "op": "PUSH2", + "gas": 15590, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6791, + "op": "DUP3", + "gas": 15587, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6792, + "op": "PUSH2", + "gas": 15584, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6795, + "op": "JUMP", + "gas": 15581, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 15573, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 15572, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 15570, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 15567, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 15564, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 15562, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 15559, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 15556, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 15554, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6796, + "op": "JUMPDEST", + "gas": 15546, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6797, + "op": "SWAP2", + "gas": 15545, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6798, + "op": "POP", + "gas": 15542, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6799, + "op": "PUSH2", + "gas": 15540, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6802, + "op": "DUP4", + "gas": 15537, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6803, + "op": "PUSH2", + "gas": 15534, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6806, + "op": "JUMP", + "gas": 15531, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 15523, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 15522, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 15520, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 15517, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 15514, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 15512, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 15509, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 15506, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 15504, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6807, + "op": "JUMPDEST", + "gas": 15496, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6808, + "op": "SWAP3", + "gas": 15495, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6809, + "op": "POP", + "gas": 15492, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6810, + "op": "DUP3", + "gas": 15490, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6811, + "op": "DUP3", + "gas": 15487, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6812, + "op": "ADD", + "gas": 15484, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6813, + "op": "SWAP1", + "gas": 15481, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6814, + "op": "POP", + "gas": 15478, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6815, + "op": "DUP1", + "gas": 15476, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6816, + "op": "DUP3", + "gas": 15473, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6817, + "op": "GT", + "gas": 15470, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6818, + "op": "ISZERO", + "gas": 15467, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6819, + "op": "PUSH2", + "gas": 15464, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6822, + "op": "JUMPI", + "gas": 15461, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6831, + "op": "JUMPDEST", + "gas": 15451, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6832, + "op": "SWAP3", + "gas": 15450, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6833, + "op": "SWAP2", + "gas": 15447, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6834, + "op": "POP", + "gas": 15444, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6835, + "op": "POP", + "gas": 15442, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6836, + "op": "JUMP", + "gas": 15440, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 2740, + "op": "JUMPDEST", + "gas": 15432, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 2741, + "op": "PUSH8", + "gas": 15431, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2750, + "op": "DUP2", + "gas": 15428, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2751, + "op": "GT", + "gas": 15425, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2752, + "op": "ISZERO", + "gas": 15422, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2753, + "op": "PUSH2", + "gas": 15419, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2756, + "op": "JUMPI", + "gas": 15416, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 2765, + "op": "JUMPDEST", + "gas": 15406, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 2766, + "op": "PUSH1", + "gas": 15405, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2768, + "op": "MLOAD", + "gas": 15402, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2769, + "op": "SWAP1", + "gas": 15399, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2770, + "op": "DUP1", + "gas": 15396, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2771, + "op": "DUP3", + "gas": 15393, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2772, + "op": "MSTORE", + "gas": 15390, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2773, + "op": "DUP1", + "gas": 15387, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2774, + "op": "PUSH1", + "gas": 15384, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2776, + "op": "ADD", + "gas": 15381, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2777, + "op": "PUSH1", + "gas": 15378, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2779, + "op": "NOT", + "gas": 15375, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2780, + "op": "AND", + "gas": 15372, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2781, + "op": "PUSH1", + "gas": 15369, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2783, + "op": "ADD", + "gas": 15366, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2784, + "op": "DUP3", + "gas": 15363, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2785, + "op": "ADD", + "gas": 15360, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2786, + "op": "PUSH1", + "gas": 15357, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2788, + "op": "MSTORE", + "gas": 15354, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2789, + "op": "DUP1", + "gas": 15351, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2790, + "op": "ISZERO", + "gas": 15348, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2791, + "op": "PUSH2", + "gas": 15345, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2794, + "op": "JUMPI", + "gas": 15342, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 2795, + "op": "DUP2", + "gas": 15332, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2796, + "op": "PUSH1", + "gas": 15329, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2798, + "op": "ADD", + "gas": 15326, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2799, + "op": "PUSH1", + "gas": 15323, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2801, + "op": "DUP3", + "gas": 15320, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2802, + "op": "MUL", + "gas": 15317, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 2803, + "op": "DUP1", + "gas": 15312, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2804, + "op": "CALLDATASIZE", + "gas": 15309, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2805, + "op": "DUP4", + "gas": 15307, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2806, + "op": "CALLDATACOPY", + "gas": 15304, + "gasCost": 42, + "depth": 1 + }, + { + "pc": 2807, + "op": "DUP1", + "gas": 15262, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2808, + "op": "DUP3", + "gas": 15259, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2809, + "op": "ADD", + "gas": 15256, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2810, + "op": "SWAP2", + "gas": 15253, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2811, + "op": "POP", + "gas": 15250, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2812, + "op": "POP", + "gas": 15248, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2813, + "op": "SWAP1", + "gas": 15246, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2814, + "op": "POP", + "gas": 15243, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2815, + "op": "JUMPDEST", + "gas": 15241, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 2816, + "op": "POP", + "gas": 15240, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2817, + "op": "SWAP1", + "gas": 15238, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2818, + "op": "POP", + "gas": 15235, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2819, + "op": "PUSH0", + "gas": 15233, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2820, + "op": "DUP7", + "gas": 15231, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2821, + "op": "PUSH0", + "gas": 15228, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2822, + "op": "SHL", + "gas": 15226, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2823, + "op": "SWAP1", + "gas": 15223, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2824, + "op": "POP", + "gas": 15220, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2825, + "op": "PUSH0", + "gas": 15218, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2826, + "op": "DUP7", + "gas": 15216, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2827, + "op": "PUSH0", + "gas": 15213, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2828, + "op": "SHL", + "gas": 15211, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2829, + "op": "SWAP1", + "gas": 15208, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2830, + "op": "POP", + "gas": 15205, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2831, + "op": "PUSH0", + "gas": 15203, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2832, + "op": "DUP7", + "gas": 15201, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2833, + "op": "PUSH0", + "gas": 15198, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2834, + "op": "SHL", + "gas": 15196, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2835, + "op": "SWAP1", + "gas": 15193, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2836, + "op": "POP", + "gas": 15190, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2837, + "op": "DUP3", + "gas": 15188, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2838, + "op": "PUSH1", + "gas": 15185, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2840, + "op": "DUP6", + "gas": 15182, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2841, + "op": "ADD", + "gas": 15179, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2842, + "op": "MSTORE", + "gas": 15176, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2843, + "op": "DUP2", + "gas": 15173, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2844, + "op": "PUSH1", + "gas": 15170, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2846, + "op": "DUP6", + "gas": 15167, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2847, + "op": "ADD", + "gas": 15164, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2848, + "op": "MSTORE", + "gas": 15161, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2849, + "op": "DUP1", + "gas": 15158, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2850, + "op": "PUSH1", + "gas": 15155, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2852, + "op": "DUP6", + "gas": 15152, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2853, + "op": "ADD", + "gas": 15149, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2854, + "op": "MSTORE", + "gas": 15146, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2855, + "op": "PUSH0", + "gas": 15143, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2856, + "op": "DUP10", + "gas": 15141, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2857, + "op": "GT", + "gas": 15138, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2858, + "op": "ISZERO", + "gas": 15135, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2859, + "op": "PUSH2", + "gas": 15132, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2862, + "op": "JUMPI", + "gas": 15129, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 2863, + "op": "PUSH1", + "gas": 15119, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2865, + "op": "PUSH1", + "gas": 15116, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2867, + "op": "SHL", + "gas": 15113, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2868, + "op": "DUP5", + "gas": 15110, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2869, + "op": "PUSH1", + "gas": 15107, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2871, + "op": "DUP12", + "gas": 15104, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2872, + "op": "PUSH1", + "gas": 15101, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2874, + "op": "PUSH2", + "gas": 15098, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2877, + "op": "SWAP2", + "gas": 15095, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2878, + "op": "SWAP1", + "gas": 15092, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2879, + "op": "PUSH2", + "gas": 15089, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2882, + "op": "JUMP", + "gas": 15086, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6786, + "op": "JUMPDEST", + "gas": 15078, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6787, + "op": "PUSH0", + "gas": 15077, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6788, + "op": "PUSH2", + "gas": 15075, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6791, + "op": "DUP3", + "gas": 15072, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6792, + "op": "PUSH2", + "gas": 15069, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6795, + "op": "JUMP", + "gas": 15066, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 15058, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 15057, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 15055, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 15052, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 15049, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 15047, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 15044, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 15041, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 15039, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6796, + "op": "JUMPDEST", + "gas": 15031, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6797, + "op": "SWAP2", + "gas": 15030, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6798, + "op": "POP", + "gas": 15027, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6799, + "op": "PUSH2", + "gas": 15025, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6802, + "op": "DUP4", + "gas": 15022, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6803, + "op": "PUSH2", + "gas": 15019, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6806, + "op": "JUMP", + "gas": 15016, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 15008, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 15007, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 15005, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 15002, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 14999, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 14997, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 14994, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 14991, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 14989, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6807, + "op": "JUMPDEST", + "gas": 14981, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6808, + "op": "SWAP3", + "gas": 14980, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6809, + "op": "POP", + "gas": 14977, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6810, + "op": "DUP3", + "gas": 14975, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6811, + "op": "DUP3", + "gas": 14972, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6812, + "op": "ADD", + "gas": 14969, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6813, + "op": "SWAP1", + "gas": 14966, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6814, + "op": "POP", + "gas": 14963, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6815, + "op": "DUP1", + "gas": 14961, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6816, + "op": "DUP3", + "gas": 14958, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6817, + "op": "GT", + "gas": 14955, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6818, + "op": "ISZERO", + "gas": 14952, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6819, + "op": "PUSH2", + "gas": 14949, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6822, + "op": "JUMPI", + "gas": 14946, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6831, + "op": "JUMPDEST", + "gas": 14936, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6832, + "op": "SWAP3", + "gas": 14935, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6833, + "op": "SWAP2", + "gas": 14932, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6834, + "op": "POP", + "gas": 14929, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6835, + "op": "POP", + "gas": 14927, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6836, + "op": "JUMP", + "gas": 14925, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 2883, + "op": "JUMPDEST", + "gas": 14917, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 2884, + "op": "PUSH2", + "gas": 14916, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2887, + "op": "SWAP2", + "gas": 14913, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2888, + "op": "SWAP1", + "gas": 14910, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2889, + "op": "PUSH2", + "gas": 14907, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2892, + "op": "JUMP", + "gas": 14904, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7360, + "op": "JUMPDEST", + "gas": 14896, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7361, + "op": "PUSH0", + "gas": 14895, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7362, + "op": "PUSH2", + "gas": 14893, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7365, + "op": "DUP3", + "gas": 14890, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7366, + "op": "PUSH2", + "gas": 14887, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7369, + "op": "JUMP", + "gas": 14884, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 14876, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 14875, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 14873, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 14870, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 14867, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 14865, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 14862, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 14859, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 14857, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7370, + "op": "JUMPDEST", + "gas": 14849, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7371, + "op": "SWAP2", + "gas": 14848, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7372, + "op": "POP", + "gas": 14845, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7373, + "op": "PUSH2", + "gas": 14843, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7376, + "op": "DUP4", + "gas": 14840, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7377, + "op": "PUSH2", + "gas": 14837, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7380, + "op": "JUMP", + "gas": 14834, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 14826, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 14825, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 14823, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 14820, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 14817, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 14815, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 14812, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 14809, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 14807, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7381, + "op": "JUMPDEST", + "gas": 14799, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7382, + "op": "SWAP3", + "gas": 14798, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7383, + "op": "POP", + "gas": 14795, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7384, + "op": "DUP3", + "gas": 14793, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7385, + "op": "DUP3", + "gas": 14790, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7386, + "op": "SUB", + "gas": 14787, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7387, + "op": "SWAP1", + "gas": 14784, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7388, + "op": "POP", + "gas": 14781, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7389, + "op": "DUP2", + "gas": 14779, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7390, + "op": "DUP2", + "gas": 14776, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7391, + "op": "GT", + "gas": 14773, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7392, + "op": "ISZERO", + "gas": 14770, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7393, + "op": "PUSH2", + "gas": 14767, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7396, + "op": "JUMPI", + "gas": 14764, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7405, + "op": "JUMPDEST", + "gas": 14754, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7406, + "op": "SWAP3", + "gas": 14753, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7407, + "op": "SWAP2", + "gas": 14750, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7408, + "op": "POP", + "gas": 14747, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7409, + "op": "POP", + "gas": 14745, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7410, + "op": "JUMP", + "gas": 14743, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 2893, + "op": "JUMPDEST", + "gas": 14735, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 2894, + "op": "DUP2", + "gas": 14734, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2895, + "op": "MLOAD", + "gas": 14731, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2896, + "op": "DUP2", + "gas": 14728, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2897, + "op": "LT", + "gas": 14725, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2898, + "op": "PUSH2", + "gas": 14722, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2901, + "op": "JUMPI", + "gas": 14719, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 2910, + "op": "JUMPDEST", + "gas": 14709, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 2911, + "op": "PUSH1", + "gas": 14708, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2913, + "op": "ADD", + "gas": 14705, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2914, + "op": "ADD", + "gas": 14702, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2915, + "op": "SWAP1", + "gas": 14699, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2916, + "op": "PUSH31", + "gas": 14696, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2948, + "op": "NOT", + "gas": 14693, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2949, + "op": "AND", + "gas": 14690, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2950, + "op": "SWAP1", + "gas": 14687, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2951, + "op": "DUP2", + "gas": 14684, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2952, + "op": "PUSH0", + "gas": 14681, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2953, + "op": "BYTE", + "gas": 14679, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2954, + "op": "SWAP1", + "gas": 14676, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2955, + "op": "MSTORE8", + "gas": 14673, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2956, + "op": "POP", + "gas": 14670, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2957, + "op": "JUMPDEST", + "gas": 14668, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 2958, + "op": "PUSH0", + "gas": 14667, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2959, + "op": "DUP9", + "gas": 14665, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2960, + "op": "GT", + "gas": 14662, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2961, + "op": "ISZERO", + "gas": 14659, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2962, + "op": "PUSH2", + "gas": 14656, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2965, + "op": "JUMPI", + "gas": 14653, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 2966, + "op": "PUSH1", + "gas": 14643, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2968, + "op": "PUSH1", + "gas": 14640, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2970, + "op": "SHL", + "gas": 14637, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2971, + "op": "DUP5", + "gas": 14634, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2972, + "op": "PUSH1", + "gas": 14631, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2974, + "op": "DUP11", + "gas": 14628, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2975, + "op": "DUP13", + "gas": 14625, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2976, + "op": "PUSH1", + "gas": 14622, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2978, + "op": "PUSH2", + "gas": 14619, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2981, + "op": "SWAP2", + "gas": 14616, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2982, + "op": "SWAP1", + "gas": 14613, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2983, + "op": "PUSH2", + "gas": 14610, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2986, + "op": "JUMP", + "gas": 14607, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6786, + "op": "JUMPDEST", + "gas": 14599, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6787, + "op": "PUSH0", + "gas": 14598, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6788, + "op": "PUSH2", + "gas": 14596, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6791, + "op": "DUP3", + "gas": 14593, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6792, + "op": "PUSH2", + "gas": 14590, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6795, + "op": "JUMP", + "gas": 14587, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 14579, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 14578, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 14576, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 14573, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 14570, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 14568, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 14565, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 14562, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 14560, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6796, + "op": "JUMPDEST", + "gas": 14552, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6797, + "op": "SWAP2", + "gas": 14551, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6798, + "op": "POP", + "gas": 14548, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6799, + "op": "PUSH2", + "gas": 14546, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6802, + "op": "DUP4", + "gas": 14543, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6803, + "op": "PUSH2", + "gas": 14540, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6806, + "op": "JUMP", + "gas": 14537, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 14529, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 14528, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 14526, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 14523, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 14520, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 14518, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 14515, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 14512, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 14510, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6807, + "op": "JUMPDEST", + "gas": 14502, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6808, + "op": "SWAP3", + "gas": 14501, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6809, + "op": "POP", + "gas": 14498, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6810, + "op": "DUP3", + "gas": 14496, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6811, + "op": "DUP3", + "gas": 14493, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6812, + "op": "ADD", + "gas": 14490, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6813, + "op": "SWAP1", + "gas": 14487, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6814, + "op": "POP", + "gas": 14484, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6815, + "op": "DUP1", + "gas": 14482, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6816, + "op": "DUP3", + "gas": 14479, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6817, + "op": "GT", + "gas": 14476, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6818, + "op": "ISZERO", + "gas": 14473, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6819, + "op": "PUSH2", + "gas": 14470, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6822, + "op": "JUMPI", + "gas": 14467, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6831, + "op": "JUMPDEST", + "gas": 14457, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6832, + "op": "SWAP3", + "gas": 14456, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6833, + "op": "SWAP2", + "gas": 14453, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6834, + "op": "POP", + "gas": 14450, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6835, + "op": "POP", + "gas": 14448, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6836, + "op": "JUMP", + "gas": 14446, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 2987, + "op": "JUMPDEST", + "gas": 14438, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 2988, + "op": "PUSH2", + "gas": 14437, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2991, + "op": "SWAP2", + "gas": 14434, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2992, + "op": "SWAP1", + "gas": 14431, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2993, + "op": "PUSH2", + "gas": 14428, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2996, + "op": "JUMP", + "gas": 14425, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6786, + "op": "JUMPDEST", + "gas": 14417, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6787, + "op": "PUSH0", + "gas": 14416, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6788, + "op": "PUSH2", + "gas": 14414, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6791, + "op": "DUP3", + "gas": 14411, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6792, + "op": "PUSH2", + "gas": 14408, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6795, + "op": "JUMP", + "gas": 14405, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 14397, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 14396, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 14394, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 14391, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 14388, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 14386, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 14383, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 14380, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 14378, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6796, + "op": "JUMPDEST", + "gas": 14370, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6797, + "op": "SWAP2", + "gas": 14369, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6798, + "op": "POP", + "gas": 14366, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6799, + "op": "PUSH2", + "gas": 14364, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6802, + "op": "DUP4", + "gas": 14361, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6803, + "op": "PUSH2", + "gas": 14358, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6806, + "op": "JUMP", + "gas": 14355, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 14347, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 14346, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 14344, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 14341, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 14338, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 14336, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 14333, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 14330, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 14328, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6807, + "op": "JUMPDEST", + "gas": 14320, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6808, + "op": "SWAP3", + "gas": 14319, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6809, + "op": "POP", + "gas": 14316, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6810, + "op": "DUP3", + "gas": 14314, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6811, + "op": "DUP3", + "gas": 14311, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6812, + "op": "ADD", + "gas": 14308, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6813, + "op": "SWAP1", + "gas": 14305, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6814, + "op": "POP", + "gas": 14302, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6815, + "op": "DUP1", + "gas": 14300, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6816, + "op": "DUP3", + "gas": 14297, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6817, + "op": "GT", + "gas": 14294, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6818, + "op": "ISZERO", + "gas": 14291, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6819, + "op": "PUSH2", + "gas": 14288, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6822, + "op": "JUMPI", + "gas": 14285, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6831, + "op": "JUMPDEST", + "gas": 14275, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6832, + "op": "SWAP3", + "gas": 14274, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6833, + "op": "SWAP2", + "gas": 14271, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6834, + "op": "POP", + "gas": 14268, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6835, + "op": "POP", + "gas": 14266, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6836, + "op": "JUMP", + "gas": 14264, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 2997, + "op": "JUMPDEST", + "gas": 14256, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 2998, + "op": "PUSH2", + "gas": 14255, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3001, + "op": "SWAP2", + "gas": 14252, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3002, + "op": "SWAP1", + "gas": 14249, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3003, + "op": "PUSH2", + "gas": 14246, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3006, + "op": "JUMP", + "gas": 14243, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7360, + "op": "JUMPDEST", + "gas": 14235, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7361, + "op": "PUSH0", + "gas": 14234, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7362, + "op": "PUSH2", + "gas": 14232, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7365, + "op": "DUP3", + "gas": 14229, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7366, + "op": "PUSH2", + "gas": 14226, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7369, + "op": "JUMP", + "gas": 14223, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 14215, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 14214, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 14212, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 14209, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 14206, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 14204, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 14201, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 14198, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 14196, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7370, + "op": "JUMPDEST", + "gas": 14188, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7371, + "op": "SWAP2", + "gas": 14187, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7372, + "op": "POP", + "gas": 14184, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7373, + "op": "PUSH2", + "gas": 14182, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7376, + "op": "DUP4", + "gas": 14179, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7377, + "op": "PUSH2", + "gas": 14176, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7380, + "op": "JUMP", + "gas": 14173, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 14165, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 14164, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 14162, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 14159, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 14156, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 14154, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 14151, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 14148, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 14146, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7381, + "op": "JUMPDEST", + "gas": 14138, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7382, + "op": "SWAP3", + "gas": 14137, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7383, + "op": "POP", + "gas": 14134, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7384, + "op": "DUP3", + "gas": 14132, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7385, + "op": "DUP3", + "gas": 14129, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7386, + "op": "SUB", + "gas": 14126, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7387, + "op": "SWAP1", + "gas": 14123, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7388, + "op": "POP", + "gas": 14120, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7389, + "op": "DUP2", + "gas": 14118, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7390, + "op": "DUP2", + "gas": 14115, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7391, + "op": "GT", + "gas": 14112, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7392, + "op": "ISZERO", + "gas": 14109, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7393, + "op": "PUSH2", + "gas": 14106, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7396, + "op": "JUMPI", + "gas": 14103, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7405, + "op": "JUMPDEST", + "gas": 14093, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7406, + "op": "SWAP3", + "gas": 14092, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7407, + "op": "SWAP2", + "gas": 14089, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7408, + "op": "POP", + "gas": 14086, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7409, + "op": "POP", + "gas": 14084, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7410, + "op": "JUMP", + "gas": 14082, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 3007, + "op": "JUMPDEST", + "gas": 14074, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 3008, + "op": "DUP2", + "gas": 14073, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3009, + "op": "MLOAD", + "gas": 14070, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3010, + "op": "DUP2", + "gas": 14067, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3011, + "op": "LT", + "gas": 14064, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3012, + "op": "PUSH2", + "gas": 14061, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3015, + "op": "JUMPI", + "gas": 14058, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 3024, + "op": "JUMPDEST", + "gas": 14048, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 3025, + "op": "PUSH1", + "gas": 14047, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3027, + "op": "ADD", + "gas": 14044, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3028, + "op": "ADD", + "gas": 14041, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3029, + "op": "SWAP1", + "gas": 14038, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3030, + "op": "PUSH31", + "gas": 14035, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3062, + "op": "NOT", + "gas": 14032, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3063, + "op": "AND", + "gas": 14029, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3064, + "op": "SWAP1", + "gas": 14026, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3065, + "op": "DUP2", + "gas": 14023, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3066, + "op": "PUSH0", + "gas": 14020, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3067, + "op": "BYTE", + "gas": 14018, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3068, + "op": "SWAP1", + "gas": 14015, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3069, + "op": "MSTORE8", + "gas": 14012, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3070, + "op": "POP", + "gas": 14009, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3071, + "op": "JUMPDEST", + "gas": 14007, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 3072, + "op": "PUSH0", + "gas": 14006, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3073, + "op": "DUP8", + "gas": 14004, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3074, + "op": "GT", + "gas": 14001, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3075, + "op": "ISZERO", + "gas": 13998, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3076, + "op": "PUSH2", + "gas": 13995, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3079, + "op": "JUMPI", + "gas": 13992, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 3080, + "op": "PUSH1", + "gas": 13982, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3082, + "op": "PUSH1", + "gas": 13979, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3084, + "op": "SHL", + "gas": 13976, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3085, + "op": "DUP5", + "gas": 13973, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3086, + "op": "PUSH1", + "gas": 13970, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3088, + "op": "DUP10", + "gas": 13967, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3089, + "op": "DUP12", + "gas": 13964, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3090, + "op": "DUP14", + "gas": 13961, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3091, + "op": "PUSH1", + "gas": 13958, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3093, + "op": "PUSH2", + "gas": 13955, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3096, + "op": "SWAP2", + "gas": 13952, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3097, + "op": "SWAP1", + "gas": 13949, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3098, + "op": "PUSH2", + "gas": 13946, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3101, + "op": "JUMP", + "gas": 13943, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6786, + "op": "JUMPDEST", + "gas": 13935, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6787, + "op": "PUSH0", + "gas": 13934, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6788, + "op": "PUSH2", + "gas": 13932, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6791, + "op": "DUP3", + "gas": 13929, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6792, + "op": "PUSH2", + "gas": 13926, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6795, + "op": "JUMP", + "gas": 13923, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 13915, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 13914, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 13912, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 13909, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 13906, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 13904, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 13901, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 13898, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 13896, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6796, + "op": "JUMPDEST", + "gas": 13888, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6797, + "op": "SWAP2", + "gas": 13887, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6798, + "op": "POP", + "gas": 13884, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6799, + "op": "PUSH2", + "gas": 13882, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6802, + "op": "DUP4", + "gas": 13879, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6803, + "op": "PUSH2", + "gas": 13876, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6806, + "op": "JUMP", + "gas": 13873, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 13865, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 13864, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 13862, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 13859, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 13856, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 13854, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 13851, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 13848, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 13846, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6807, + "op": "JUMPDEST", + "gas": 13838, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6808, + "op": "SWAP3", + "gas": 13837, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6809, + "op": "POP", + "gas": 13834, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6810, + "op": "DUP3", + "gas": 13832, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6811, + "op": "DUP3", + "gas": 13829, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6812, + "op": "ADD", + "gas": 13826, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6813, + "op": "SWAP1", + "gas": 13823, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6814, + "op": "POP", + "gas": 13820, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6815, + "op": "DUP1", + "gas": 13818, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6816, + "op": "DUP3", + "gas": 13815, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6817, + "op": "GT", + "gas": 13812, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6818, + "op": "ISZERO", + "gas": 13809, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6819, + "op": "PUSH2", + "gas": 13806, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6822, + "op": "JUMPI", + "gas": 13803, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6831, + "op": "JUMPDEST", + "gas": 13793, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6832, + "op": "SWAP3", + "gas": 13792, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6833, + "op": "SWAP2", + "gas": 13789, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6834, + "op": "POP", + "gas": 13786, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6835, + "op": "POP", + "gas": 13784, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6836, + "op": "JUMP", + "gas": 13782, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 3102, + "op": "JUMPDEST", + "gas": 13774, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 3103, + "op": "PUSH2", + "gas": 13773, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3106, + "op": "SWAP2", + "gas": 13770, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3107, + "op": "SWAP1", + "gas": 13767, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3108, + "op": "PUSH2", + "gas": 13764, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3111, + "op": "JUMP", + "gas": 13761, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6786, + "op": "JUMPDEST", + "gas": 13753, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6787, + "op": "PUSH0", + "gas": 13752, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6788, + "op": "PUSH2", + "gas": 13750, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6791, + "op": "DUP3", + "gas": 13747, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6792, + "op": "PUSH2", + "gas": 13744, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6795, + "op": "JUMP", + "gas": 13741, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 13733, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 13732, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 13730, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 13727, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 13724, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 13722, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 13719, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 13716, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 13714, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6796, + "op": "JUMPDEST", + "gas": 13706, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6797, + "op": "SWAP2", + "gas": 13705, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6798, + "op": "POP", + "gas": 13702, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6799, + "op": "PUSH2", + "gas": 13700, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6802, + "op": "DUP4", + "gas": 13697, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6803, + "op": "PUSH2", + "gas": 13694, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6806, + "op": "JUMP", + "gas": 13691, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 13683, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 13682, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 13680, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 13677, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 13674, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 13672, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 13669, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 13666, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 13664, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6807, + "op": "JUMPDEST", + "gas": 13656, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6808, + "op": "SWAP3", + "gas": 13655, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6809, + "op": "POP", + "gas": 13652, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6810, + "op": "DUP3", + "gas": 13650, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6811, + "op": "DUP3", + "gas": 13647, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6812, + "op": "ADD", + "gas": 13644, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6813, + "op": "SWAP1", + "gas": 13641, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6814, + "op": "POP", + "gas": 13638, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6815, + "op": "DUP1", + "gas": 13636, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6816, + "op": "DUP3", + "gas": 13633, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6817, + "op": "GT", + "gas": 13630, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6818, + "op": "ISZERO", + "gas": 13627, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6819, + "op": "PUSH2", + "gas": 13624, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6822, + "op": "JUMPI", + "gas": 13621, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6831, + "op": "JUMPDEST", + "gas": 13611, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6832, + "op": "SWAP3", + "gas": 13610, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6833, + "op": "SWAP2", + "gas": 13607, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6834, + "op": "POP", + "gas": 13604, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6835, + "op": "POP", + "gas": 13602, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6836, + "op": "JUMP", + "gas": 13600, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 3112, + "op": "JUMPDEST", + "gas": 13592, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 3113, + "op": "PUSH2", + "gas": 13591, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3116, + "op": "SWAP2", + "gas": 13588, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3117, + "op": "SWAP1", + "gas": 13585, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3118, + "op": "PUSH2", + "gas": 13582, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3121, + "op": "JUMP", + "gas": 13579, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6786, + "op": "JUMPDEST", + "gas": 13571, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6787, + "op": "PUSH0", + "gas": 13570, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6788, + "op": "PUSH2", + "gas": 13568, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6791, + "op": "DUP3", + "gas": 13565, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6792, + "op": "PUSH2", + "gas": 13562, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6795, + "op": "JUMP", + "gas": 13559, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 13551, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 13550, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 13548, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 13545, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 13542, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 13540, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 13537, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 13534, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 13532, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6796, + "op": "JUMPDEST", + "gas": 13524, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6797, + "op": "SWAP2", + "gas": 13523, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6798, + "op": "POP", + "gas": 13520, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6799, + "op": "PUSH2", + "gas": 13518, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6802, + "op": "DUP4", + "gas": 13515, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6803, + "op": "PUSH2", + "gas": 13512, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6806, + "op": "JUMP", + "gas": 13509, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 13501, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 13500, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 13498, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 13495, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 13492, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 13490, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 13487, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 13484, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 13482, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6807, + "op": "JUMPDEST", + "gas": 13474, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6808, + "op": "SWAP3", + "gas": 13473, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6809, + "op": "POP", + "gas": 13470, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6810, + "op": "DUP3", + "gas": 13468, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6811, + "op": "DUP3", + "gas": 13465, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6812, + "op": "ADD", + "gas": 13462, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6813, + "op": "SWAP1", + "gas": 13459, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6814, + "op": "POP", + "gas": 13456, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6815, + "op": "DUP1", + "gas": 13454, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6816, + "op": "DUP3", + "gas": 13451, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6817, + "op": "GT", + "gas": 13448, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6818, + "op": "ISZERO", + "gas": 13445, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6819, + "op": "PUSH2", + "gas": 13442, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6822, + "op": "JUMPI", + "gas": 13439, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6831, + "op": "JUMPDEST", + "gas": 13429, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6832, + "op": "SWAP3", + "gas": 13428, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6833, + "op": "SWAP2", + "gas": 13425, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6834, + "op": "POP", + "gas": 13422, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6835, + "op": "POP", + "gas": 13420, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6836, + "op": "JUMP", + "gas": 13418, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 3122, + "op": "JUMPDEST", + "gas": 13410, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 3123, + "op": "PUSH2", + "gas": 13409, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3126, + "op": "SWAP2", + "gas": 13406, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3127, + "op": "SWAP1", + "gas": 13403, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3128, + "op": "PUSH2", + "gas": 13400, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3131, + "op": "JUMP", + "gas": 13397, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7360, + "op": "JUMPDEST", + "gas": 13389, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7361, + "op": "PUSH0", + "gas": 13388, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7362, + "op": "PUSH2", + "gas": 13386, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7365, + "op": "DUP3", + "gas": 13383, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7366, + "op": "PUSH2", + "gas": 13380, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7369, + "op": "JUMP", + "gas": 13377, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 13369, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 13368, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 13366, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 13363, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 13360, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 13358, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 13355, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 13352, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 13350, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7370, + "op": "JUMPDEST", + "gas": 13342, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7371, + "op": "SWAP2", + "gas": 13341, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7372, + "op": "POP", + "gas": 13338, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7373, + "op": "PUSH2", + "gas": 13336, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7376, + "op": "DUP4", + "gas": 13333, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7377, + "op": "PUSH2", + "gas": 13330, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7380, + "op": "JUMP", + "gas": 13327, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 13319, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 13318, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 13316, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 13313, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 13310, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 13308, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 13305, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 13302, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 13300, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7381, + "op": "JUMPDEST", + "gas": 13292, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7382, + "op": "SWAP3", + "gas": 13291, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7383, + "op": "POP", + "gas": 13288, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7384, + "op": "DUP3", + "gas": 13286, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7385, + "op": "DUP3", + "gas": 13283, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7386, + "op": "SUB", + "gas": 13280, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7387, + "op": "SWAP1", + "gas": 13277, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7388, + "op": "POP", + "gas": 13274, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7389, + "op": "DUP2", + "gas": 13272, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7390, + "op": "DUP2", + "gas": 13269, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7391, + "op": "GT", + "gas": 13266, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7392, + "op": "ISZERO", + "gas": 13263, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7393, + "op": "PUSH2", + "gas": 13260, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7396, + "op": "JUMPI", + "gas": 13257, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7405, + "op": "JUMPDEST", + "gas": 13247, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7406, + "op": "SWAP3", + "gas": 13246, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7407, + "op": "SWAP2", + "gas": 13243, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7408, + "op": "POP", + "gas": 13240, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7409, + "op": "POP", + "gas": 13238, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7410, + "op": "JUMP", + "gas": 13236, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 3132, + "op": "JUMPDEST", + "gas": 13228, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 3133, + "op": "DUP2", + "gas": 13227, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3134, + "op": "MLOAD", + "gas": 13224, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3135, + "op": "DUP2", + "gas": 13221, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3136, + "op": "LT", + "gas": 13218, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3137, + "op": "PUSH2", + "gas": 13215, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3140, + "op": "JUMPI", + "gas": 13212, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 3149, + "op": "JUMPDEST", + "gas": 13202, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 3150, + "op": "PUSH1", + "gas": 13201, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3152, + "op": "ADD", + "gas": 13198, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3153, + "op": "ADD", + "gas": 13195, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3154, + "op": "SWAP1", + "gas": 13192, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3155, + "op": "PUSH31", + "gas": 13189, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3187, + "op": "NOT", + "gas": 13186, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3188, + "op": "AND", + "gas": 13183, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3189, + "op": "SWAP1", + "gas": 13180, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3190, + "op": "DUP2", + "gas": 13177, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3191, + "op": "PUSH0", + "gas": 13174, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3192, + "op": "BYTE", + "gas": 13172, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3193, + "op": "SWAP1", + "gas": 13169, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3194, + "op": "MSTORE8", + "gas": 13166, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3195, + "op": "POP", + "gas": 13163, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3196, + "op": "JUMPDEST", + "gas": 13161, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 3197, + "op": "PUSH0", + "gas": 13160, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3198, + "op": "DUP1", + "gas": 13158, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3199, + "op": "PUSH1", + "gas": 13155, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3201, + "op": "PUSH20", + "gas": 13152, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3222, + "op": "AND", + "gas": 13149, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3223, + "op": "DUP7", + "gas": 13146, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3224, + "op": "PUSH1", + "gas": 13143, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3226, + "op": "MLOAD", + "gas": 13140, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3227, + "op": "PUSH2", + "gas": 13137, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3230, + "op": "SWAP2", + "gas": 13134, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3231, + "op": "SWAP1", + "gas": 13131, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3232, + "op": "PUSH2", + "gas": 13128, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3235, + "op": "JUMP", + "gas": 13125, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5644, + "op": "JUMPDEST", + "gas": 13117, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5645, + "op": "PUSH0", + "gas": 13116, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5646, + "op": "PUSH2", + "gas": 13114, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5649, + "op": "DUP3", + "gas": 13111, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5650, + "op": "DUP5", + "gas": 13108, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5651, + "op": "PUSH2", + "gas": 13105, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5654, + "op": "JUMP", + "gas": 13102, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5596, + "op": "JUMPDEST", + "gas": 13094, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5597, + "op": "PUSH0", + "gas": 13093, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5598, + "op": "PUSH2", + "gas": 13091, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5601, + "op": "DUP3", + "gas": 13088, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5602, + "op": "PUSH2", + "gas": 13085, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5605, + "op": "JUMP", + "gas": 13082, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5109, + "op": "JUMPDEST", + "gas": 13074, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5110, + "op": "PUSH0", + "gas": 13073, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5111, + "op": "DUP2", + "gas": 13071, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5112, + "op": "MLOAD", + "gas": 13068, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5113, + "op": "SWAP1", + "gas": 13065, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5114, + "op": "POP", + "gas": 13062, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5115, + "op": "SWAP2", + "gas": 13060, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5116, + "op": "SWAP1", + "gas": 13057, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5117, + "op": "POP", + "gas": 13054, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5118, + "op": "JUMP", + "gas": 13052, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5606, + "op": "JUMPDEST", + "gas": 13044, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5607, + "op": "PUSH2", + "gas": 13043, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5610, + "op": "DUP2", + "gas": 13040, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5611, + "op": "DUP6", + "gas": 13037, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5612, + "op": "PUSH2", + "gas": 13034, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5615, + "op": "JUMP", + "gas": 13031, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5586, + "op": "JUMPDEST", + "gas": 13023, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5587, + "op": "PUSH0", + "gas": 13022, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5588, + "op": "DUP2", + "gas": 13020, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5589, + "op": "SWAP1", + "gas": 13017, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5590, + "op": "POP", + "gas": 13014, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5591, + "op": "SWAP3", + "gas": 13012, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5592, + "op": "SWAP2", + "gas": 13009, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5593, + "op": "POP", + "gas": 13006, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5594, + "op": "POP", + "gas": 13004, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5595, + "op": "JUMP", + "gas": 13002, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5616, + "op": "JUMPDEST", + "gas": 12994, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5617, + "op": "SWAP4", + "gas": 12993, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5618, + "op": "POP", + "gas": 12990, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5619, + "op": "PUSH2", + "gas": 12988, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5622, + "op": "DUP2", + "gas": 12985, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5623, + "op": "DUP6", + "gas": 12982, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5624, + "op": "PUSH1", + "gas": 12979, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5626, + "op": "DUP7", + "gas": 12976, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5627, + "op": "ADD", + "gas": 12973, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5628, + "op": "PUSH2", + "gas": 12970, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5631, + "op": "JUMP", + "gas": 12967, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5135, + "op": "JUMPDEST", + "gas": 12959, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5136, + "op": "DUP3", + "gas": 12958, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5137, + "op": "DUP2", + "gas": 12955, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5138, + "op": "DUP4", + "gas": 12952, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5139, + "op": "opcode 0x5e not defined", + "gas": 12949, + "gasCost": 46, + "depth": 1 + }, + { + "pc": 5140, + "op": "PUSH0", + "gas": 12903, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5141, + "op": "DUP4", + "gas": 12901, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5142, + "op": "DUP4", + "gas": 12898, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5143, + "op": "ADD", + "gas": 12895, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5144, + "op": "MSTORE", + "gas": 12892, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 5145, + "op": "POP", + "gas": 12886, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5146, + "op": "POP", + "gas": 12884, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5147, + "op": "POP", + "gas": 12882, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5148, + "op": "JUMP", + "gas": 12880, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5632, + "op": "JUMPDEST", + "gas": 12872, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5633, + "op": "DUP1", + "gas": 12871, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5634, + "op": "DUP5", + "gas": 12868, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5635, + "op": "ADD", + "gas": 12865, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5636, + "op": "SWAP2", + "gas": 12862, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5637, + "op": "POP", + "gas": 12859, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5638, + "op": "POP", + "gas": 12857, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5639, + "op": "SWAP3", + "gas": 12855, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5640, + "op": "SWAP2", + "gas": 12852, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5641, + "op": "POP", + "gas": 12849, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5642, + "op": "POP", + "gas": 12847, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5643, + "op": "JUMP", + "gas": 12845, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5655, + "op": "JUMPDEST", + "gas": 12837, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5656, + "op": "SWAP2", + "gas": 12836, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5657, + "op": "POP", + "gas": 12833, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5658, + "op": "DUP2", + "gas": 12831, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5659, + "op": "SWAP1", + "gas": 12828, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5660, + "op": "POP", + "gas": 12825, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5661, + "op": "SWAP3", + "gas": 12823, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5662, + "op": "SWAP2", + "gas": 12820, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5663, + "op": "POP", + "gas": 12817, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5664, + "op": "POP", + "gas": 12815, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5665, + "op": "JUMP", + "gas": 12813, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 3236, + "op": "JUMPDEST", + "gas": 12805, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 3237, + "op": "PUSH0", + "gas": 12804, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3238, + "op": "PUSH1", + "gas": 12802, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3240, + "op": "MLOAD", + "gas": 12799, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3241, + "op": "DUP1", + "gas": 12796, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3242, + "op": "DUP4", + "gas": 12793, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3243, + "op": "SUB", + "gas": 12790, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3244, + "op": "DUP2", + "gas": 12787, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3245, + "op": "DUP6", + "gas": 12784, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3246, + "op": "GAS", + "gas": 12781, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3247, + "op": "STATICCALL", + "gas": 12779, + "gasCost": 12581, + "depth": 1 + }, + { + "pc": 3248, + "op": "SWAP2", + "gas": 12479, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3249, + "op": "POP", + "gas": 12476, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3250, + "op": "POP", + "gas": 12474, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3251, + "op": "RETURNDATASIZE", + "gas": 12472, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3252, + "op": "DUP1", + "gas": 12470, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3253, + "op": "PUSH0", + "gas": 12467, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3254, + "op": "DUP2", + "gas": 12465, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3255, + "op": "EQ", + "gas": 12462, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3256, + "op": "PUSH2", + "gas": 12459, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3259, + "op": "JUMPI", + "gas": 12456, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 3260, + "op": "PUSH1", + "gas": 12446, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3262, + "op": "MLOAD", + "gas": 12443, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3263, + "op": "SWAP2", + "gas": 12440, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3264, + "op": "POP", + "gas": 12437, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3265, + "op": "PUSH1", + "gas": 12435, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3267, + "op": "NOT", + "gas": 12432, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3268, + "op": "PUSH1", + "gas": 12429, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3270, + "op": "RETURNDATASIZE", + "gas": 12426, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3271, + "op": "ADD", + "gas": 12424, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3272, + "op": "AND", + "gas": 12421, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3273, + "op": "DUP3", + "gas": 12418, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3274, + "op": "ADD", + "gas": 12415, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3275, + "op": "PUSH1", + "gas": 12412, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3277, + "op": "MSTORE", + "gas": 12409, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3278, + "op": "RETURNDATASIZE", + "gas": 12406, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3279, + "op": "DUP3", + "gas": 12404, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3280, + "op": "MSTORE", + "gas": 12401, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3281, + "op": "RETURNDATASIZE", + "gas": 12398, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3282, + "op": "PUSH0", + "gas": 12396, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3283, + "op": "PUSH1", + "gas": 12394, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3285, + "op": "DUP5", + "gas": 12391, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3286, + "op": "ADD", + "gas": 12388, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3287, + "op": "RETURNDATACOPY", + "gas": 12385, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 3288, + "op": "PUSH2", + "gas": 12379, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3291, + "op": "JUMP", + "gas": 12376, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 3297, + "op": "JUMPDEST", + "gas": 12368, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 3298, + "op": "POP", + "gas": 12367, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3299, + "op": "SWAP2", + "gas": 12365, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3300, + "op": "POP", + "gas": 12362, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3301, + "op": "SWAP2", + "gas": 12360, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3302, + "op": "POP", + "gas": 12357, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3303, + "op": "DUP2", + "gas": 12355, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3304, + "op": "PUSH0", + "gas": 12352, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3305, + "op": "DUP9", + "gas": 12350, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3306, + "op": "PUSH1", + "gas": 12347, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3308, + "op": "MLOAD", + "gas": 12344, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3309, + "op": "PUSH2", + "gas": 12341, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3312, + "op": "SWAP2", + "gas": 12338, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3313, + "op": "SWAP1", + "gas": 12335, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3314, + "op": "PUSH2", + "gas": 12332, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3317, + "op": "JUMP", + "gas": 12329, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5666, + "op": "JUMPDEST", + "gas": 12321, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5667, + "op": "PUSH0", + "gas": 12320, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5668, + "op": "PUSH2", + "gas": 12318, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5671, + "op": "DUP3", + "gas": 12315, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5672, + "op": "DUP5", + "gas": 12312, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5673, + "op": "PUSH2", + "gas": 12309, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5676, + "op": "JUMP", + "gas": 12306, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5505, + "op": "JUMPDEST", + "gas": 12298, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5506, + "op": "PUSH0", + "gas": 12297, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5507, + "op": "PUSH2", + "gas": 12295, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5510, + "op": "DUP3", + "gas": 12292, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5511, + "op": "PUSH2", + "gas": 12289, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5514, + "op": "JUMP", + "gas": 12286, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5495, + "op": "JUMPDEST", + "gas": 12278, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5496, + "op": "PUSH0", + "gas": 12277, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5497, + "op": "DUP2", + "gas": 12275, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5498, + "op": "MLOAD", + "gas": 12272, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5499, + "op": "SWAP1", + "gas": 12269, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5500, + "op": "POP", + "gas": 12266, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5501, + "op": "SWAP2", + "gas": 12264, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5502, + "op": "SWAP1", + "gas": 12261, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5503, + "op": "POP", + "gas": 12258, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5504, + "op": "JUMP", + "gas": 12256, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5515, + "op": "JUMPDEST", + "gas": 12248, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5516, + "op": "PUSH2", + "gas": 12247, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5519, + "op": "DUP2", + "gas": 12244, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5520, + "op": "DUP6", + "gas": 12241, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5521, + "op": "PUSH2", + "gas": 12238, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5524, + "op": "JUMP", + "gas": 12235, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5411, + "op": "JUMPDEST", + "gas": 12227, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5412, + "op": "PUSH0", + "gas": 12226, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5413, + "op": "DUP2", + "gas": 12224, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5414, + "op": "SWAP1", + "gas": 12221, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5415, + "op": "POP", + "gas": 12218, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5416, + "op": "SWAP3", + "gas": 12216, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5417, + "op": "SWAP2", + "gas": 12213, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5418, + "op": "POP", + "gas": 12210, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5419, + "op": "POP", + "gas": 12208, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5420, + "op": "JUMP", + "gas": 12206, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5525, + "op": "JUMPDEST", + "gas": 12198, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5526, + "op": "SWAP4", + "gas": 12197, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5527, + "op": "POP", + "gas": 12194, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5528, + "op": "PUSH2", + "gas": 12192, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5531, + "op": "DUP2", + "gas": 12189, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5532, + "op": "DUP6", + "gas": 12186, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5533, + "op": "PUSH1", + "gas": 12183, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5535, + "op": "DUP7", + "gas": 12180, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5536, + "op": "ADD", + "gas": 12177, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5537, + "op": "PUSH2", + "gas": 12174, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5540, + "op": "JUMP", + "gas": 12171, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5135, + "op": "JUMPDEST", + "gas": 12163, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5136, + "op": "DUP3", + "gas": 12162, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5137, + "op": "DUP2", + "gas": 12159, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5138, + "op": "DUP4", + "gas": 12156, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5139, + "op": "opcode 0x5e not defined", + "gas": 12153, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 5140, + "op": "PUSH0", + "gas": 12147, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5141, + "op": "DUP4", + "gas": 12145, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5142, + "op": "DUP4", + "gas": 12142, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5143, + "op": "ADD", + "gas": 12139, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5144, + "op": "MSTORE", + "gas": 12136, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5145, + "op": "POP", + "gas": 12133, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5146, + "op": "POP", + "gas": 12131, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5147, + "op": "POP", + "gas": 12129, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5148, + "op": "JUMP", + "gas": 12127, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5541, + "op": "JUMPDEST", + "gas": 12119, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5542, + "op": "DUP1", + "gas": 12118, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5543, + "op": "DUP5", + "gas": 12115, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5544, + "op": "ADD", + "gas": 12112, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5545, + "op": "SWAP2", + "gas": 12109, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5546, + "op": "POP", + "gas": 12106, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5547, + "op": "POP", + "gas": 12104, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5548, + "op": "SWAP3", + "gas": 12102, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5549, + "op": "SWAP2", + "gas": 12099, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5550, + "op": "POP", + "gas": 12096, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5551, + "op": "POP", + "gas": 12094, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5552, + "op": "JUMP", + "gas": 12092, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5677, + "op": "JUMPDEST", + "gas": 12084, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5678, + "op": "SWAP2", + "gas": 12083, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5679, + "op": "POP", + "gas": 12080, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5680, + "op": "DUP2", + "gas": 12078, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5681, + "op": "SWAP1", + "gas": 12075, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5682, + "op": "POP", + "gas": 12072, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5683, + "op": "SWAP3", + "gas": 12070, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5684, + "op": "SWAP2", + "gas": 12067, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5685, + "op": "POP", + "gas": 12064, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5686, + "op": "POP", + "gas": 12062, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5687, + "op": "JUMP", + "gas": 12060, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 3318, + "op": "JUMPDEST", + "gas": 12052, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 3319, + "op": "SWAP1", + "gas": 12051, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3320, + "op": "DUP2", + "gas": 12048, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3321, + "op": "MSTORE", + "gas": 12045, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3322, + "op": "PUSH1", + "gas": 12042, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3324, + "op": "ADD", + "gas": 12039, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3325, + "op": "PUSH1", + "gas": 12036, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3327, + "op": "MLOAD", + "gas": 12033, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3328, + "op": "DUP1", + "gas": 12030, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3329, + "op": "SWAP2", + "gas": 12027, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3330, + "op": "SUB", + "gas": 12024, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3331, + "op": "SWAP1", + "gas": 12021, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3332, + "op": "SHA3", + "gas": 12018, + "gasCost": 42, + "depth": 1 + }, + { + "pc": 3333, + "op": "PUSH0", + "gas": 11976, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3334, + "op": "PUSH2", + "gas": 11974, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3337, + "op": "EXP", + "gas": 11971, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 3338, + "op": "DUP2", + "gas": 11961, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3339, + "op": "SLOAD", + "gas": 11958, + "gasCost": 2100, + "depth": 1 + }, + { + "pc": 3340, + "op": "DUP2", + "gas": 9858, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3341, + "op": "PUSH1", + "gas": 9855, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3343, + "op": "MUL", + "gas": 9852, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 3344, + "op": "NOT", + "gas": 9847, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3345, + "op": "AND", + "gas": 9844, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3346, + "op": "SWAP1", + "gas": 9841, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3347, + "op": "DUP4", + "gas": 9838, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3348, + "op": "ISZERO", + "gas": 9835, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3349, + "op": "ISZERO", + "gas": 9832, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3350, + "op": "MUL", + "gas": 9829, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 3351, + "op": "OR", + "gas": 9824, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3352, + "op": "SWAP1", + "gas": 9821, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3353, + "op": "SSTORE", + "gas": 9818, + "gasCost": 100, + "depth": 1 + }, + { + "pc": 3354, + "op": "POP", + "gas": 9718, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3355, + "op": "DUP1", + "gas": 9716, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3356, + "op": "PUSH1", + "gas": 9713, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3358, + "op": "DUP9", + "gas": 9710, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3359, + "op": "PUSH1", + "gas": 9707, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3361, + "op": "MLOAD", + "gas": 9704, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3362, + "op": "PUSH2", + "gas": 9701, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3365, + "op": "SWAP2", + "gas": 9698, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3366, + "op": "SWAP1", + "gas": 9695, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3367, + "op": "PUSH2", + "gas": 9692, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3370, + "op": "JUMP", + "gas": 9689, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5666, + "op": "JUMPDEST", + "gas": 9681, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5667, + "op": "PUSH0", + "gas": 9680, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5668, + "op": "PUSH2", + "gas": 9678, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5671, + "op": "DUP3", + "gas": 9675, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5672, + "op": "DUP5", + "gas": 9672, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5673, + "op": "PUSH2", + "gas": 9669, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5676, + "op": "JUMP", + "gas": 9666, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5505, + "op": "JUMPDEST", + "gas": 9658, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5506, + "op": "PUSH0", + "gas": 9657, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5507, + "op": "PUSH2", + "gas": 9655, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5510, + "op": "DUP3", + "gas": 9652, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5511, + "op": "PUSH2", + "gas": 9649, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5514, + "op": "JUMP", + "gas": 9646, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5495, + "op": "JUMPDEST", + "gas": 9638, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5496, + "op": "PUSH0", + "gas": 9637, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5497, + "op": "DUP2", + "gas": 9635, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5498, + "op": "MLOAD", + "gas": 9632, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5499, + "op": "SWAP1", + "gas": 9629, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5500, + "op": "POP", + "gas": 9626, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5501, + "op": "SWAP2", + "gas": 9624, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5502, + "op": "SWAP1", + "gas": 9621, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5503, + "op": "POP", + "gas": 9618, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5504, + "op": "JUMP", + "gas": 9616, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5515, + "op": "JUMPDEST", + "gas": 9608, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5516, + "op": "PUSH2", + "gas": 9607, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5519, + "op": "DUP2", + "gas": 9604, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5520, + "op": "DUP6", + "gas": 9601, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5521, + "op": "PUSH2", + "gas": 9598, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5524, + "op": "JUMP", + "gas": 9595, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5411, + "op": "JUMPDEST", + "gas": 9587, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5412, + "op": "PUSH0", + "gas": 9586, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5413, + "op": "DUP2", + "gas": 9584, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5414, + "op": "SWAP1", + "gas": 9581, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5415, + "op": "POP", + "gas": 9578, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5416, + "op": "SWAP3", + "gas": 9576, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5417, + "op": "SWAP2", + "gas": 9573, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5418, + "op": "POP", + "gas": 9570, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5419, + "op": "POP", + "gas": 9568, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5420, + "op": "JUMP", + "gas": 9566, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5525, + "op": "JUMPDEST", + "gas": 9558, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5526, + "op": "SWAP4", + "gas": 9557, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5527, + "op": "POP", + "gas": 9554, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5528, + "op": "PUSH2", + "gas": 9552, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5531, + "op": "DUP2", + "gas": 9549, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5532, + "op": "DUP6", + "gas": 9546, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5533, + "op": "PUSH1", + "gas": 9543, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5535, + "op": "DUP7", + "gas": 9540, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5536, + "op": "ADD", + "gas": 9537, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5537, + "op": "PUSH2", + "gas": 9534, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5540, + "op": "JUMP", + "gas": 9531, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5135, + "op": "JUMPDEST", + "gas": 9523, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5136, + "op": "DUP3", + "gas": 9522, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5137, + "op": "DUP2", + "gas": 9519, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5138, + "op": "DUP4", + "gas": 9516, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5139, + "op": "opcode 0x5e not defined", + "gas": 9513, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 5140, + "op": "PUSH0", + "gas": 9507, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5141, + "op": "DUP4", + "gas": 9505, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5142, + "op": "DUP4", + "gas": 9502, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5143, + "op": "ADD", + "gas": 9499, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5144, + "op": "MSTORE", + "gas": 9496, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5145, + "op": "POP", + "gas": 9493, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5146, + "op": "POP", + "gas": 9491, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5147, + "op": "POP", + "gas": 9489, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5148, + "op": "JUMP", + "gas": 9487, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5541, + "op": "JUMPDEST", + "gas": 9479, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5542, + "op": "DUP1", + "gas": 9478, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5543, + "op": "DUP5", + "gas": 9475, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5544, + "op": "ADD", + "gas": 9472, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5545, + "op": "SWAP2", + "gas": 9469, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5546, + "op": "POP", + "gas": 9466, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5547, + "op": "POP", + "gas": 9464, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5548, + "op": "SWAP3", + "gas": 9462, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5549, + "op": "SWAP2", + "gas": 9459, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5550, + "op": "POP", + "gas": 9456, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5551, + "op": "POP", + "gas": 9454, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5552, + "op": "JUMP", + "gas": 9452, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5677, + "op": "JUMPDEST", + "gas": 9444, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5678, + "op": "SWAP2", + "gas": 9443, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5679, + "op": "POP", + "gas": 9440, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5680, + "op": "DUP2", + "gas": 9438, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5681, + "op": "SWAP1", + "gas": 9435, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5682, + "op": "POP", + "gas": 9432, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5683, + "op": "SWAP3", + "gas": 9430, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5684, + "op": "SWAP2", + "gas": 9427, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5685, + "op": "POP", + "gas": 9424, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5686, + "op": "POP", + "gas": 9422, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5687, + "op": "JUMP", + "gas": 9420, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 3371, + "op": "JUMPDEST", + "gas": 9412, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 3372, + "op": "SWAP1", + "gas": 9411, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3373, + "op": "DUP2", + "gas": 9408, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3374, + "op": "MSTORE", + "gas": 9405, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3375, + "op": "PUSH1", + "gas": 9402, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3377, + "op": "ADD", + "gas": 9399, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3378, + "op": "PUSH1", + "gas": 9396, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3380, + "op": "MLOAD", + "gas": 9393, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3381, + "op": "DUP1", + "gas": 9390, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3382, + "op": "SWAP2", + "gas": 9387, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3383, + "op": "SUB", + "gas": 9384, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3384, + "op": "SWAP1", + "gas": 9381, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3385, + "op": "SHA3", + "gas": 9378, + "gasCost": 42, + "depth": 1 + }, + { + "pc": 3386, + "op": "SWAP1", + "gas": 9336, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3387, + "op": "DUP2", + "gas": 9333, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3388, + "op": "PUSH2", + "gas": 9330, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3391, + "op": "SWAP2", + "gas": 9327, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3392, + "op": "SWAP1", + "gas": 9324, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3393, + "op": "PUSH2", + "gas": 9321, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3396, + "op": "JUMP", + "gas": 9318, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6194, + "op": "JUMPDEST", + "gas": 9310, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6195, + "op": "PUSH2", + "gas": 9309, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6198, + "op": "DUP3", + "gas": 9306, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6199, + "op": "PUSH2", + "gas": 9303, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6202, + "op": "JUMP", + "gas": 9300, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5109, + "op": "JUMPDEST", + "gas": 9292, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5110, + "op": "PUSH0", + "gas": 9291, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5111, + "op": "DUP2", + "gas": 9289, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5112, + "op": "MLOAD", + "gas": 9286, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5113, + "op": "SWAP1", + "gas": 9283, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5114, + "op": "POP", + "gas": 9280, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5115, + "op": "SWAP2", + "gas": 9278, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5116, + "op": "SWAP1", + "gas": 9275, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5117, + "op": "POP", + "gas": 9272, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5118, + "op": "JUMP", + "gas": 9270, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6203, + "op": "JUMPDEST", + "gas": 9262, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6204, + "op": "PUSH8", + "gas": 9261, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6213, + "op": "DUP2", + "gas": 9258, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6214, + "op": "GT", + "gas": 9255, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6215, + "op": "ISZERO", + "gas": 9252, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6216, + "op": "PUSH2", + "gas": 9249, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6219, + "op": "JUMPI", + "gas": 9246, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6228, + "op": "JUMPDEST", + "gas": 9236, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6229, + "op": "PUSH2", + "gas": 9235, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6232, + "op": "DUP3", + "gas": 9232, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6233, + "op": "SLOAD", + "gas": 9229, + "gasCost": 2100, + "depth": 1 + }, + { + "pc": 6234, + "op": "PUSH2", + "gas": 7129, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6237, + "op": "JUMP", + "gas": 7126, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5733, + "op": "JUMPDEST", + "gas": 7118, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5734, + "op": "PUSH0", + "gas": 7117, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5735, + "op": "PUSH1", + "gas": 7115, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5737, + "op": "DUP3", + "gas": 7112, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5738, + "op": "DIV", + "gas": 7109, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 5739, + "op": "SWAP1", + "gas": 7104, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5740, + "op": "POP", + "gas": 7101, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5741, + "op": "PUSH1", + "gas": 7099, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5743, + "op": "DUP3", + "gas": 7096, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5744, + "op": "AND", + "gas": 7093, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5745, + "op": "DUP1", + "gas": 7090, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5746, + "op": "PUSH2", + "gas": 7087, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5749, + "op": "JUMPI", + "gas": 7084, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 5756, + "op": "JUMPDEST", + "gas": 7074, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5757, + "op": "PUSH1", + "gas": 7073, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5759, + "op": "DUP3", + "gas": 7070, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5760, + "op": "LT", + "gas": 7067, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5761, + "op": "DUP2", + "gas": 7064, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5762, + "op": "SUB", + "gas": 7061, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5763, + "op": "PUSH2", + "gas": 7058, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5766, + "op": "JUMPI", + "gas": 7055, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 5775, + "op": "JUMPDEST", + "gas": 7045, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5776, + "op": "POP", + "gas": 7044, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5777, + "op": "SWAP2", + "gas": 7042, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5778, + "op": "SWAP1", + "gas": 7039, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5779, + "op": "POP", + "gas": 7036, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5780, + "op": "JUMP", + "gas": 7034, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6238, + "op": "JUMPDEST", + "gas": 7026, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6239, + "op": "PUSH2", + "gas": 7025, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6242, + "op": "DUP3", + "gas": 7022, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6243, + "op": "DUP3", + "gas": 7019, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6244, + "op": "DUP6", + "gas": 7016, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6245, + "op": "PUSH2", + "gas": 7013, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6248, + "op": "JUMP", + "gas": 7010, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6057, + "op": "JUMPDEST", + "gas": 7002, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6058, + "op": "PUSH1", + "gas": 7001, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6060, + "op": "DUP3", + "gas": 6998, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6061, + "op": "GT", + "gas": 6995, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6062, + "op": "ISZERO", + "gas": 6992, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6063, + "op": "PUSH2", + "gas": 6989, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6066, + "op": "JUMPI", + "gas": 6986, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6067, + "op": "PUSH2", + "gas": 6976, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6070, + "op": "DUP2", + "gas": 6973, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6071, + "op": "PUSH2", + "gas": 6970, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6074, + "op": "JUMP", + "gas": 6967, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5781, + "op": "JUMPDEST", + "gas": 6959, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5782, + "op": "PUSH0", + "gas": 6958, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5783, + "op": "DUP2", + "gas": 6956, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5784, + "op": "SWAP1", + "gas": 6953, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5785, + "op": "POP", + "gas": 6950, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5786, + "op": "DUP2", + "gas": 6948, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5787, + "op": "PUSH0", + "gas": 6945, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5788, + "op": "MSTORE", + "gas": 6943, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5789, + "op": "PUSH1", + "gas": 6940, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5791, + "op": "PUSH0", + "gas": 6937, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5792, + "op": "SHA3", + "gas": 6935, + "gasCost": 36, + "depth": 1 + }, + { + "pc": 5793, + "op": "SWAP1", + "gas": 6899, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5794, + "op": "POP", + "gas": 6896, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5795, + "op": "SWAP2", + "gas": 6894, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5796, + "op": "SWAP1", + "gas": 6891, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5797, + "op": "POP", + "gas": 6888, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5798, + "op": "JUMP", + "gas": 6886, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6075, + "op": "JUMPDEST", + "gas": 6878, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6076, + "op": "PUSH2", + "gas": 6877, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6079, + "op": "DUP5", + "gas": 6874, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6080, + "op": "PUSH2", + "gas": 6871, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6083, + "op": "JUMP", + "gas": 6868, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5799, + "op": "JUMPDEST", + "gas": 6860, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5800, + "op": "PUSH0", + "gas": 6859, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5801, + "op": "PUSH1", + "gas": 6857, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5803, + "op": "PUSH1", + "gas": 6854, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5805, + "op": "DUP4", + "gas": 6851, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5806, + "op": "ADD", + "gas": 6848, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5807, + "op": "DIV", + "gas": 6845, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 5808, + "op": "SWAP1", + "gas": 6840, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5809, + "op": "POP", + "gas": 6837, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5810, + "op": "SWAP2", + "gas": 6835, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5811, + "op": "SWAP1", + "gas": 6832, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5812, + "op": "POP", + "gas": 6829, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5813, + "op": "JUMP", + "gas": 6827, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6084, + "op": "JUMPDEST", + "gas": 6819, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6085, + "op": "DUP2", + "gas": 6818, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6086, + "op": "ADD", + "gas": 6815, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6087, + "op": "PUSH1", + "gas": 6812, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6089, + "op": "DUP6", + "gas": 6809, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6090, + "op": "LT", + "gas": 6806, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6091, + "op": "ISZERO", + "gas": 6803, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6092, + "op": "PUSH2", + "gas": 6800, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6095, + "op": "JUMPI", + "gas": 6797, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6099, + "op": "JUMPDEST", + "gas": 6787, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6100, + "op": "PUSH2", + "gas": 6786, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6103, + "op": "PUSH2", + "gas": 6783, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6106, + "op": "DUP6", + "gas": 6780, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6107, + "op": "PUSH2", + "gas": 6777, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6110, + "op": "JUMP", + "gas": 6774, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5799, + "op": "JUMPDEST", + "gas": 6766, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5800, + "op": "PUSH0", + "gas": 6765, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5801, + "op": "PUSH1", + "gas": 6763, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5803, + "op": "PUSH1", + "gas": 6760, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5805, + "op": "DUP4", + "gas": 6757, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5806, + "op": "ADD", + "gas": 6754, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5807, + "op": "DIV", + "gas": 6751, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 5808, + "op": "SWAP1", + "gas": 6746, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5809, + "op": "POP", + "gas": 6743, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5810, + "op": "SWAP2", + "gas": 6741, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5811, + "op": "SWAP1", + "gas": 6738, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5812, + "op": "POP", + "gas": 6735, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5813, + "op": "JUMP", + "gas": 6733, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6111, + "op": "JUMPDEST", + "gas": 6725, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6112, + "op": "DUP4", + "gas": 6724, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6113, + "op": "ADD", + "gas": 6721, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6114, + "op": "DUP3", + "gas": 6718, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6115, + "op": "PUSH2", + "gas": 6715, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6118, + "op": "JUMP", + "gas": 6712, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6023, + "op": "JUMPDEST", + "gas": 6704, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6024, + "op": "JUMPDEST", + "gas": 6703, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6025, + "op": "DUP2", + "gas": 6702, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6026, + "op": "DUP2", + "gas": 6699, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6027, + "op": "LT", + "gas": 6696, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6028, + "op": "ISZERO", + "gas": 6693, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6029, + "op": "PUSH2", + "gas": 6690, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6032, + "op": "JUMPI", + "gas": 6687, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6053, + "op": "JUMPDEST", + "gas": 6677, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6054, + "op": "POP", + "gas": 6676, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6055, + "op": "POP", + "gas": 6674, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6056, + "op": "JUMP", + "gas": 6672, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6119, + "op": "JUMPDEST", + "gas": 6664, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6120, + "op": "POP", + "gas": 6663, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6121, + "op": "POP", + "gas": 6661, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6122, + "op": "JUMPDEST", + "gas": 6659, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6123, + "op": "POP", + "gas": 6658, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6124, + "op": "POP", + "gas": 6656, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6125, + "op": "POP", + "gas": 6654, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6126, + "op": "JUMP", + "gas": 6652, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6249, + "op": "JUMPDEST", + "gas": 6644, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6250, + "op": "PUSH0", + "gas": 6643, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6251, + "op": "PUSH1", + "gas": 6641, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6253, + "op": "SWAP1", + "gas": 6638, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6254, + "op": "POP", + "gas": 6635, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6255, + "op": "PUSH1", + "gas": 6633, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6257, + "op": "DUP4", + "gas": 6630, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6258, + "op": "GT", + "gas": 6627, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6259, + "op": "PUSH1", + "gas": 6624, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6261, + "op": "DUP2", + "gas": 6621, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6262, + "op": "EQ", + "gas": 6618, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6263, + "op": "PUSH2", + "gas": 6615, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6266, + "op": "JUMPI", + "gas": 6612, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6298, + "op": "JUMPDEST", + "gas": 6602, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6299, + "op": "PUSH1", + "gas": 6601, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6301, + "op": "NOT", + "gas": 6598, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6302, + "op": "DUP5", + "gas": 6595, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6303, + "op": "AND", + "gas": 6592, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6304, + "op": "PUSH2", + "gas": 6589, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6307, + "op": "DUP7", + "gas": 6586, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6308, + "op": "PUSH2", + "gas": 6583, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6311, + "op": "JUMP", + "gas": 6580, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5781, + "op": "JUMPDEST", + "gas": 6572, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5782, + "op": "PUSH0", + "gas": 6571, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5783, + "op": "DUP2", + "gas": 6569, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5784, + "op": "SWAP1", + "gas": 6566, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5785, + "op": "POP", + "gas": 6563, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5786, + "op": "DUP2", + "gas": 6561, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5787, + "op": "PUSH0", + "gas": 6558, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5788, + "op": "MSTORE", + "gas": 6556, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5789, + "op": "PUSH1", + "gas": 6553, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5791, + "op": "PUSH0", + "gas": 6550, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5792, + "op": "SHA3", + "gas": 6548, + "gasCost": 36, + "depth": 1 + }, + { + "pc": 5793, + "op": "SWAP1", + "gas": 6512, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5794, + "op": "POP", + "gas": 6509, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5795, + "op": "SWAP2", + "gas": 6507, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5796, + "op": "SWAP1", + "gas": 6504, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5797, + "op": "POP", + "gas": 6501, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5798, + "op": "JUMP", + "gas": 6499, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6312, + "op": "JUMPDEST", + "gas": 6491, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6313, + "op": "PUSH0", + "gas": 6490, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6314, + "op": "JUMPDEST", + "gas": 6488, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6315, + "op": "DUP3", + "gas": 6487, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6316, + "op": "DUP2", + "gas": 6484, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6317, + "op": "LT", + "gas": 6481, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6318, + "op": "ISZERO", + "gas": 6478, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6319, + "op": "PUSH2", + "gas": 6475, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6322, + "op": "JUMPI", + "gas": 6472, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6323, + "op": "DUP5", + "gas": 6462, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6324, + "op": "DUP10", + "gas": 6459, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6325, + "op": "ADD", + "gas": 6456, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6326, + "op": "MLOAD", + "gas": 6453, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6327, + "op": "DUP3", + "gas": 6450, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6328, + "op": "SSTORE", + "gas": 6447, + "gasCost": 2200, + "depth": 1 + }, + { + "pc": 6329, + "op": "PUSH1", + "gas": 4247, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6331, + "op": "DUP3", + "gas": 4244, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6332, + "op": "ADD", + "gas": 4241, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6333, + "op": "SWAP2", + "gas": 4238, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6334, + "op": "POP", + "gas": 4235, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6335, + "op": "PUSH1", + "gas": 4233, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6337, + "op": "DUP6", + "gas": 4230, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6338, + "op": "ADD", + "gas": 4227, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6339, + "op": "SWAP5", + "gas": 4224, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6340, + "op": "POP", + "gas": 4221, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6341, + "op": "PUSH1", + "gas": 4219, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6343, + "op": "DUP2", + "gas": 4216, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6344, + "op": "ADD", + "gas": 4213, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6345, + "op": "SWAP1", + "gas": 4210, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6346, + "op": "POP", + "gas": 4207, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6347, + "op": "PUSH2", + "gas": 4205, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6350, + "op": "JUMP", + "gas": 4202, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6314, + "op": "JUMPDEST", + "gas": 4194, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6315, + "op": "DUP3", + "gas": 4193, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6316, + "op": "DUP2", + "gas": 4190, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6317, + "op": "LT", + "gas": 4187, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6318, + "op": "ISZERO", + "gas": 4184, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6319, + "op": "PUSH2", + "gas": 4181, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6322, + "op": "JUMPI", + "gas": 4178, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6351, + "op": "JUMPDEST", + "gas": 4168, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6352, + "op": "DUP7", + "gas": 4167, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6353, + "op": "DUP4", + "gas": 4164, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6354, + "op": "LT", + "gas": 4161, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6355, + "op": "ISZERO", + "gas": 4158, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6356, + "op": "PUSH2", + "gas": 4155, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6359, + "op": "JUMPI", + "gas": 4152, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6380, + "op": "JUMPDEST", + "gas": 4142, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6381, + "op": "PUSH1", + "gas": 4141, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6383, + "op": "PUSH1", + "gas": 4138, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6385, + "op": "DUP9", + "gas": 4135, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6386, + "op": "MUL", + "gas": 4132, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 6387, + "op": "ADD", + "gas": 4127, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6388, + "op": "DUP9", + "gas": 4124, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6389, + "op": "SSTORE", + "gas": 4121, + "gasCost": 100, + "depth": 1 + }, + { + "pc": 6390, + "op": "POP", + "gas": 4021, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6391, + "op": "POP", + "gas": 4019, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6392, + "op": "POP", + "gas": 4017, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6393, + "op": "JUMPDEST", + "gas": 4015, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6394, + "op": "POP", + "gas": 4014, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6395, + "op": "POP", + "gas": 4012, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6396, + "op": "POP", + "gas": 4010, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6397, + "op": "POP", + "gas": 4008, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6398, + "op": "POP", + "gas": 4006, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6399, + "op": "POP", + "gas": 4004, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6400, + "op": "JUMP", + "gas": 4002, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 3397, + "op": "JUMPDEST", + "gas": 3994, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 3398, + "op": "POP", + "gas": 3993, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3399, + "op": "PUSH32", + "gas": 3991, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3432, + "op": "DUP8", + "gas": 3988, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3433, + "op": "DUP4", + "gas": 3985, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3434, + "op": "DUP4", + "gas": 3982, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3435, + "op": "TIMESTAMP", + "gas": 3979, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3436, + "op": "PUSH1", + "gas": 3977, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3438, + "op": "MLOAD", + "gas": 3974, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3439, + "op": "PUSH2", + "gas": 3971, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3442, + "op": "SWAP5", + "gas": 3968, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3443, + "op": "SWAP4", + "gas": 3965, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3444, + "op": "SWAP3", + "gas": 3962, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3445, + "op": "SWAP2", + "gas": 3959, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3446, + "op": "SWAP1", + "gas": 3956, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3447, + "op": "PUSH2", + "gas": 3953, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3450, + "op": "JUMP", + "gas": 3950, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6488, + "op": "JUMPDEST", + "gas": 3942, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6489, + "op": "PUSH0", + "gas": 3941, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6490, + "op": "PUSH1", + "gas": 3939, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6492, + "op": "DUP3", + "gas": 3936, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6493, + "op": "ADD", + "gas": 3933, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6494, + "op": "SWAP1", + "gas": 3930, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6495, + "op": "POP", + "gas": 3927, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6496, + "op": "DUP2", + "gas": 3925, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6497, + "op": "DUP2", + "gas": 3922, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6498, + "op": "SUB", + "gas": 3919, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6499, + "op": "PUSH0", + "gas": 3916, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6500, + "op": "DUP4", + "gas": 3914, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6501, + "op": "ADD", + "gas": 3911, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6502, + "op": "MSTORE", + "gas": 3908, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6503, + "op": "PUSH2", + "gas": 3905, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6506, + "op": "DUP2", + "gas": 3902, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6507, + "op": "DUP8", + "gas": 3899, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6508, + "op": "PUSH2", + "gas": 3896, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6511, + "op": "JUMP", + "gas": 3893, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6417, + "op": "JUMPDEST", + "gas": 3885, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6418, + "op": "PUSH0", + "gas": 3884, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6419, + "op": "PUSH2", + "gas": 3882, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6422, + "op": "DUP3", + "gas": 3879, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6423, + "op": "PUSH2", + "gas": 3876, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6426, + "op": "JUMP", + "gas": 3873, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5495, + "op": "JUMPDEST", + "gas": 3865, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5496, + "op": "PUSH0", + "gas": 3864, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5497, + "op": "DUP2", + "gas": 3862, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5498, + "op": "MLOAD", + "gas": 3859, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5499, + "op": "SWAP1", + "gas": 3856, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5500, + "op": "POP", + "gas": 3853, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5501, + "op": "SWAP2", + "gas": 3851, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5502, + "op": "SWAP1", + "gas": 3848, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5503, + "op": "POP", + "gas": 3845, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5504, + "op": "JUMP", + "gas": 3843, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6427, + "op": "JUMPDEST", + "gas": 3835, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6428, + "op": "PUSH2", + "gas": 3834, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6431, + "op": "DUP2", + "gas": 3831, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6432, + "op": "DUP6", + "gas": 3828, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6433, + "op": "PUSH2", + "gas": 3825, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6436, + "op": "JUMP", + "gas": 3822, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6401, + "op": "JUMPDEST", + "gas": 3814, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6402, + "op": "PUSH0", + "gas": 3813, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6403, + "op": "DUP3", + "gas": 3811, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6404, + "op": "DUP3", + "gas": 3808, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6405, + "op": "MSTORE", + "gas": 3805, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6406, + "op": "PUSH1", + "gas": 3802, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6408, + "op": "DUP3", + "gas": 3799, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6409, + "op": "ADD", + "gas": 3796, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6410, + "op": "SWAP1", + "gas": 3793, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6411, + "op": "POP", + "gas": 3790, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6412, + "op": "SWAP3", + "gas": 3788, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6413, + "op": "SWAP2", + "gas": 3785, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6414, + "op": "POP", + "gas": 3782, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6415, + "op": "POP", + "gas": 3780, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6416, + "op": "JUMP", + "gas": 3778, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6437, + "op": "JUMPDEST", + "gas": 3770, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6438, + "op": "SWAP4", + "gas": 3769, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6439, + "op": "POP", + "gas": 3766, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6440, + "op": "PUSH2", + "gas": 3764, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6443, + "op": "DUP2", + "gas": 3761, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6444, + "op": "DUP6", + "gas": 3758, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6445, + "op": "PUSH1", + "gas": 3755, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6447, + "op": "DUP7", + "gas": 3752, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6448, + "op": "ADD", + "gas": 3749, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6449, + "op": "PUSH2", + "gas": 3746, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6452, + "op": "JUMP", + "gas": 3743, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5135, + "op": "JUMPDEST", + "gas": 3735, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5136, + "op": "DUP3", + "gas": 3734, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5137, + "op": "DUP2", + "gas": 3731, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5138, + "op": "DUP4", + "gas": 3728, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5139, + "op": "opcode 0x5e not defined", + "gas": 3725, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 5140, + "op": "PUSH0", + "gas": 3719, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5141, + "op": "DUP4", + "gas": 3717, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5142, + "op": "DUP4", + "gas": 3714, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5143, + "op": "ADD", + "gas": 3711, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5144, + "op": "MSTORE", + "gas": 3708, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 5145, + "op": "POP", + "gas": 3702, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5146, + "op": "POP", + "gas": 3700, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5147, + "op": "POP", + "gas": 3698, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5148, + "op": "JUMP", + "gas": 3696, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6453, + "op": "JUMPDEST", + "gas": 3688, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6454, + "op": "PUSH2", + "gas": 3687, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6457, + "op": "DUP2", + "gas": 3684, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6458, + "op": "PUSH2", + "gas": 3681, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6461, + "op": "JUMP", + "gas": 3678, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4450, + "op": "JUMPDEST", + "gas": 3670, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4451, + "op": "PUSH0", + "gas": 3669, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4452, + "op": "PUSH1", + "gas": 3667, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4454, + "op": "NOT", + "gas": 3664, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4455, + "op": "PUSH1", + "gas": 3661, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4457, + "op": "DUP4", + "gas": 3658, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4458, + "op": "ADD", + "gas": 3655, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4459, + "op": "AND", + "gas": 3652, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4460, + "op": "SWAP1", + "gas": 3649, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4461, + "op": "POP", + "gas": 3646, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4462, + "op": "SWAP2", + "gas": 3644, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4463, + "op": "SWAP1", + "gas": 3641, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4464, + "op": "POP", + "gas": 3638, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4465, + "op": "JUMP", + "gas": 3636, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6462, + "op": "JUMPDEST", + "gas": 3628, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6463, + "op": "DUP5", + "gas": 3627, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6464, + "op": "ADD", + "gas": 3624, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6465, + "op": "SWAP2", + "gas": 3621, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6466, + "op": "POP", + "gas": 3618, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6467, + "op": "POP", + "gas": 3616, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6468, + "op": "SWAP3", + "gas": 3614, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6469, + "op": "SWAP2", + "gas": 3611, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6470, + "op": "POP", + "gas": 3608, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6471, + "op": "POP", + "gas": 3606, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6472, + "op": "JUMP", + "gas": 3604, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6512, + "op": "JUMPDEST", + "gas": 3596, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6513, + "op": "SWAP1", + "gas": 3595, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6514, + "op": "POP", + "gas": 3592, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6515, + "op": "PUSH2", + "gas": 3590, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6518, + "op": "PUSH1", + "gas": 3587, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6520, + "op": "DUP4", + "gas": 3584, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6521, + "op": "ADD", + "gas": 3581, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6522, + "op": "DUP7", + "gas": 3578, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6523, + "op": "PUSH2", + "gas": 3575, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6526, + "op": "JUMP", + "gas": 3572, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4840, + "op": "JUMPDEST", + "gas": 3564, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4841, + "op": "PUSH2", + "gas": 3563, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4844, + "op": "DUP2", + "gas": 3560, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4845, + "op": "PUSH2", + "gas": 3557, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4848, + "op": "JUMP", + "gas": 3554, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4829, + "op": "JUMPDEST", + "gas": 3546, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4830, + "op": "PUSH0", + "gas": 3545, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4831, + "op": "DUP2", + "gas": 3543, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4832, + "op": "ISZERO", + "gas": 3540, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4833, + "op": "ISZERO", + "gas": 3537, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4834, + "op": "SWAP1", + "gas": 3534, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4835, + "op": "POP", + "gas": 3531, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4836, + "op": "SWAP2", + "gas": 3529, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4837, + "op": "SWAP1", + "gas": 3526, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4838, + "op": "POP", + "gas": 3523, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4839, + "op": "JUMP", + "gas": 3521, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4849, + "op": "JUMPDEST", + "gas": 3513, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4850, + "op": "DUP3", + "gas": 3512, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4851, + "op": "MSTORE", + "gas": 3509, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4852, + "op": "POP", + "gas": 3506, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4853, + "op": "POP", + "gas": 3504, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4854, + "op": "JUMP", + "gas": 3502, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6527, + "op": "JUMPDEST", + "gas": 3494, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6528, + "op": "DUP2", + "gas": 3493, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6529, + "op": "DUP2", + "gas": 3490, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6530, + "op": "SUB", + "gas": 3487, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6531, + "op": "PUSH1", + "gas": 3484, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6533, + "op": "DUP4", + "gas": 3481, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6534, + "op": "ADD", + "gas": 3478, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6535, + "op": "MSTORE", + "gas": 3475, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6536, + "op": "PUSH2", + "gas": 3472, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6539, + "op": "DUP2", + "gas": 3469, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6540, + "op": "DUP6", + "gas": 3466, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6541, + "op": "PUSH2", + "gas": 3463, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6544, + "op": "JUMP", + "gas": 3460, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5149, + "op": "JUMPDEST", + "gas": 3452, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5150, + "op": "PUSH0", + "gas": 3451, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5151, + "op": "PUSH2", + "gas": 3449, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5154, + "op": "DUP3", + "gas": 3446, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5155, + "op": "PUSH2", + "gas": 3443, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5158, + "op": "JUMP", + "gas": 3440, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5109, + "op": "JUMPDEST", + "gas": 3432, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5110, + "op": "PUSH0", + "gas": 3431, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5111, + "op": "DUP2", + "gas": 3429, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5112, + "op": "MLOAD", + "gas": 3426, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5113, + "op": "SWAP1", + "gas": 3423, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5114, + "op": "POP", + "gas": 3420, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5115, + "op": "SWAP2", + "gas": 3418, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5116, + "op": "SWAP1", + "gas": 3415, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5117, + "op": "POP", + "gas": 3412, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5118, + "op": "JUMP", + "gas": 3410, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5159, + "op": "JUMPDEST", + "gas": 3402, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5160, + "op": "PUSH2", + "gas": 3401, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5163, + "op": "DUP2", + "gas": 3398, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5164, + "op": "DUP6", + "gas": 3395, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5165, + "op": "PUSH2", + "gas": 3392, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5168, + "op": "JUMP", + "gas": 3389, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5119, + "op": "JUMPDEST", + "gas": 3381, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5120, + "op": "PUSH0", + "gas": 3380, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5121, + "op": "DUP3", + "gas": 3378, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5122, + "op": "DUP3", + "gas": 3375, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5123, + "op": "MSTORE", + "gas": 3372, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 5124, + "op": "PUSH1", + "gas": 3366, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5126, + "op": "DUP3", + "gas": 3363, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5127, + "op": "ADD", + "gas": 3360, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5128, + "op": "SWAP1", + "gas": 3357, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5129, + "op": "POP", + "gas": 3354, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5130, + "op": "SWAP3", + "gas": 3352, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5131, + "op": "SWAP2", + "gas": 3349, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5132, + "op": "POP", + "gas": 3346, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5133, + "op": "POP", + "gas": 3344, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5134, + "op": "JUMP", + "gas": 3342, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5169, + "op": "JUMPDEST", + "gas": 3334, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5170, + "op": "SWAP4", + "gas": 3333, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5171, + "op": "POP", + "gas": 3330, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5172, + "op": "PUSH2", + "gas": 3328, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5175, + "op": "DUP2", + "gas": 3325, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5176, + "op": "DUP6", + "gas": 3322, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5177, + "op": "PUSH1", + "gas": 3319, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5179, + "op": "DUP7", + "gas": 3316, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5180, + "op": "ADD", + "gas": 3313, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5181, + "op": "PUSH2", + "gas": 3310, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5184, + "op": "JUMP", + "gas": 3307, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5135, + "op": "JUMPDEST", + "gas": 3299, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5136, + "op": "DUP3", + "gas": 3298, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5137, + "op": "DUP2", + "gas": 3295, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5138, + "op": "DUP4", + "gas": 3292, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5139, + "op": "opcode 0x5e not defined", + "gas": 3289, + "gasCost": 9, + "depth": 1 + }, + { + "pc": 5140, + "op": "PUSH0", + "gas": 3280, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5141, + "op": "DUP4", + "gas": 3278, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5142, + "op": "DUP4", + "gas": 3275, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5143, + "op": "ADD", + "gas": 3272, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5144, + "op": "MSTORE", + "gas": 3269, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 5145, + "op": "POP", + "gas": 3263, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5146, + "op": "POP", + "gas": 3261, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5147, + "op": "POP", + "gas": 3259, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5148, + "op": "JUMP", + "gas": 3257, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5185, + "op": "JUMPDEST", + "gas": 3249, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5186, + "op": "PUSH2", + "gas": 3248, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5189, + "op": "DUP2", + "gas": 3245, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5190, + "op": "PUSH2", + "gas": 3242, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5193, + "op": "JUMP", + "gas": 3239, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4450, + "op": "JUMPDEST", + "gas": 3231, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4451, + "op": "PUSH0", + "gas": 3230, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4452, + "op": "PUSH1", + "gas": 3228, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4454, + "op": "NOT", + "gas": 3225, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4455, + "op": "PUSH1", + "gas": 3222, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4457, + "op": "DUP4", + "gas": 3219, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4458, + "op": "ADD", + "gas": 3216, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4459, + "op": "AND", + "gas": 3213, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4460, + "op": "SWAP1", + "gas": 3210, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4461, + "op": "POP", + "gas": 3207, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4462, + "op": "SWAP2", + "gas": 3205, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4463, + "op": "SWAP1", + "gas": 3202, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4464, + "op": "POP", + "gas": 3199, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4465, + "op": "JUMP", + "gas": 3197, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5194, + "op": "JUMPDEST", + "gas": 3189, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5195, + "op": "DUP5", + "gas": 3188, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5196, + "op": "ADD", + "gas": 3185, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5197, + "op": "SWAP2", + "gas": 3182, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5198, + "op": "POP", + "gas": 3179, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5199, + "op": "POP", + "gas": 3177, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5200, + "op": "SWAP3", + "gas": 3175, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5201, + "op": "SWAP2", + "gas": 3172, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5202, + "op": "POP", + "gas": 3169, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5203, + "op": "POP", + "gas": 3167, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5204, + "op": "JUMP", + "gas": 3165, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6545, + "op": "JUMPDEST", + "gas": 3157, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6546, + "op": "SWAP1", + "gas": 3156, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6547, + "op": "POP", + "gas": 3153, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6548, + "op": "PUSH2", + "gas": 3151, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6551, + "op": "PUSH1", + "gas": 3148, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6553, + "op": "DUP4", + "gas": 3145, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6554, + "op": "ADD", + "gas": 3142, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6555, + "op": "DUP5", + "gas": 3139, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6556, + "op": "PUSH2", + "gas": 3136, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6559, + "op": "JUMP", + "gas": 3133, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6473, + "op": "JUMPDEST", + "gas": 3125, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6474, + "op": "PUSH2", + "gas": 3124, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6477, + "op": "DUP2", + "gas": 3121, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6478, + "op": "PUSH2", + "gas": 3118, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6481, + "op": "JUMP", + "gas": 3115, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5237, + "op": "JUMPDEST", + "gas": 3107, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5238, + "op": "PUSH0", + "gas": 3106, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5239, + "op": "DUP2", + "gas": 3104, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5240, + "op": "SWAP1", + "gas": 3101, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5241, + "op": "POP", + "gas": 3098, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5242, + "op": "SWAP2", + "gas": 3096, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5243, + "op": "SWAP1", + "gas": 3093, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "POP", + "gas": 3090, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5245, + "op": "JUMP", + "gas": 3088, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6482, + "op": "JUMPDEST", + "gas": 3080, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6483, + "op": "DUP3", + "gas": 3079, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6484, + "op": "MSTORE", + "gas": 3076, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6485, + "op": "POP", + "gas": 3073, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6486, + "op": "POP", + "gas": 3071, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6487, + "op": "JUMP", + "gas": 3069, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6560, + "op": "JUMPDEST", + "gas": 3061, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6561, + "op": "SWAP6", + "gas": 3060, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6562, + "op": "SWAP5", + "gas": 3057, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6563, + "op": "POP", + "gas": 3054, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6564, + "op": "POP", + "gas": 3052, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6565, + "op": "POP", + "gas": 3050, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6566, + "op": "POP", + "gas": 3048, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6567, + "op": "POP", + "gas": 3046, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6568, + "op": "JUMP", + "gas": 3044, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 3451, + "op": "JUMPDEST", + "gas": 3036, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 3452, + "op": "PUSH1", + "gas": 3035, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3454, + "op": "MLOAD", + "gas": 3032, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3455, + "op": "DUP1", + "gas": 3029, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3456, + "op": "SWAP2", + "gas": 3026, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3457, + "op": "SUB", + "gas": 3023, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3458, + "op": "SWAP1", + "gas": 3020, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3459, + "op": "LOG1", + "gas": 3017, + "gasCost": 2798, + "depth": 1 + }, + { + "pc": 3460, + "op": "DUP2", + "gas": 219, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3461, + "op": "SWAP8", + "gas": 216, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3462, + "op": "POP", + "gas": 213, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3463, + "op": "POP", + "gas": 211, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3464, + "op": "POP", + "gas": 209, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3465, + "op": "POP", + "gas": 207, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3466, + "op": "POP", + "gas": 205, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3467, + "op": "POP", + "gas": 203, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3468, + "op": "POP", + "gas": 201, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3469, + "op": "POP", + "gas": 199, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3470, + "op": "SWAP4", + "gas": 197, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3471, + "op": "SWAP3", + "gas": 194, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3472, + "op": "POP", + "gas": 191, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3473, + "op": "POP", + "gas": 189, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3474, + "op": "POP", + "gas": 187, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3475, + "op": "JUMP", + "gas": 185, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 522, + "op": "JUMPDEST", + "gas": 177, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 523, + "op": "PUSH1", + "gas": 176, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 525, + "op": "MLOAD", + "gas": 173, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 526, + "op": "PUSH2", + "gas": 170, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 529, + "op": "SWAP2", + "gas": 167, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 530, + "op": "SWAP1", + "gas": 164, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 531, + "op": "PUSH2", + "gas": 161, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 534, + "op": "JUMP", + "gas": 158, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4855, + "op": "JUMPDEST", + "gas": 150, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4856, + "op": "PUSH0", + "gas": 149, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4857, + "op": "PUSH1", + "gas": 147, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4859, + "op": "DUP3", + "gas": 144, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4860, + "op": "ADD", + "gas": 141, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4861, + "op": "SWAP1", + "gas": 138, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4862, + "op": "POP", + "gas": 135, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4863, + "op": "PUSH2", + "gas": 133, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4866, + "op": "PUSH0", + "gas": 130, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4867, + "op": "DUP4", + "gas": 128, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4868, + "op": "ADD", + "gas": 125, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4869, + "op": "DUP5", + "gas": 122, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4870, + "op": "PUSH2", + "gas": 119, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4873, + "op": "JUMP", + "gas": 116, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4840, + "op": "JUMPDEST", + "gas": 108, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4841, + "op": "PUSH2", + "gas": 107, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4844, + "op": "DUP2", + "gas": 104, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4845, + "op": "PUSH2", + "gas": 101, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4848, + "op": "JUMP", + "gas": 98, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4829, + "op": "JUMPDEST", + "gas": 90, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4830, + "op": "PUSH0", + "gas": 89, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4831, + "op": "DUP2", + "gas": 87, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4832, + "op": "ISZERO", + "gas": 84, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4833, + "op": "ISZERO", + "gas": 81, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4834, + "op": "SWAP1", + "gas": 78, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4835, + "op": "POP", + "gas": 75, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4836, + "op": "SWAP2", + "gas": 73, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4837, + "op": "SWAP1", + "gas": 70, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4838, + "op": "POP", + "gas": 67, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4839, + "op": "JUMP", + "gas": 65, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4849, + "op": "JUMPDEST", + "gas": 57, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4850, + "op": "DUP3", + "gas": 56, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4851, + "op": "MSTORE", + "gas": 53, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4852, + "op": "POP", + "gas": 50, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4853, + "op": "POP", + "gas": 48, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4854, + "op": "JUMP", + "gas": 46, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4874, + "op": "JUMPDEST", + "gas": 38, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4875, + "op": "SWAP3", + "gas": 37, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4876, + "op": "SWAP2", + "gas": 34, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4877, + "op": "POP", + "gas": 31, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4878, + "op": "POP", + "gas": 29, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4879, + "op": "JUMP", + "gas": 27, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 535, + "op": "JUMPDEST", + "gas": 19, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 536, + "op": "PUSH1", + "gas": 18, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 538, + "op": "MLOAD", + "gas": 15, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 539, + "op": "DUP1", + "gas": 12, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 540, + "op": "SWAP2", + "gas": 9, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 541, + "op": "SUB", + "gas": 6, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 542, + "op": "SWAP1", + "gas": 3, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 543, + "op": "RETURN", + "gas": 0, + "gasCost": 0, + "depth": 1 + } + ], + "callTrace": { + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "gas": "0xba75", + "gasUsed": "0xba75", + "to": "0xf78ce1e2f0de8fd15ce6ac4ddec6982413fda499", + "input": "0x8a59e100000000000000000000000000000000000000000000000000000000000000002100000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000020", + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "calls": [ + { + "from": "0xf78ce1e2f0de8fd15ce6ac4ddec6982413fda499", + "gas": "0x30c1", + "gasUsed": "0xc8", + "to": "0x0000000000000000000000000000000000000005", + "input": "0x00000000000000000000000000000000000000000000000000000000000000210000000000000000000000000000000000000000000000000000000000000020000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000011", + "output": "0x0000000000000000000000000000000000000000000000000000000000000003", + "type": "STATICCALL" + } + ], + "value": "0x0", + "type": "CALL" + } + } + ], + "withdraw_trie_root": "0xf15fe55ccda900eb1a64fa9abee8054e44b6915dae17e21aef095f4cd49d2a67", + "sequencer_set_verify_hash": "0x72fce9da9f9cca9ae7f43acbcc6060e82ef37152a13cee828b492343ec19eebc", + "startL1QueueIndex": 1321206 + } + ] +] \ No newline at end of file diff --git a/prover/testdata/morph203/morph203_3_traces.json b/prover/testdata/morph203/morph203_3_traces.json new file mode 100644 index 00000000..3e84074f --- /dev/null +++ b/prover/testdata/morph203/morph203_3_traces.json @@ -0,0 +1,24984 @@ +[ + [ + { + "chainID": 53077, + "version": "2.0.3-mainnet-0295a3d4", + "coinbase": { + "address": "0x716170d0687c3d31cc10debe0daa1ddd3fe3d792", + "nonce": 0, + "balance": "0x2bfc813daa62ae09", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + "header": { + "parentHash": "0x225d58132f00c70dd2bc7aaaa91122de0b10820190d4937547f4f8b91b042a6c", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "miner": "0x0000000000000000000000000000000000000000", + "stateRoot": "0x04823040a3e712336ffe896207761f576d20e610ba0be3d555d35f8f621371a9", + "transactionsRoot": "0x0e0cd055fd966f4abbd9a859e38ee4b0e23fdce85a904c69356ae93d383a34b1", + "receiptsRoot": "0x2810f4b342f877d6d7db62981c8ecd5b3f7b610e4f1d1f620261d33cc07c516c", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000020000000000000000000000200000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "difficulty": "0x0", + "number": "0x78465", + "gasLimit": "0x3b9aca00", + "gasUsed": "0x48953", + "timestamp": "0x67d3a2a2", + "extraData": "0x", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x0000000000000000", + "nextL1MsgIndex": "0x1428f6", + "batchHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "baseFeePerGas": "0xf4240", + "withdrawalsRoot": null, + "blobGasUsed": null, + "excessBlobGas": null, + "parentBeaconBlockRoot": null, + "hash": "0x920143590d6668dc66479cd08d01da78dee552955da0382837988b2cf951680b" + }, + "transactions": [ + { + "type": 2, + "nonce": 2177, + "txHash": "0xdeee3c58ad6f08be549f1f3205632e2764450135a1712a0d15624d0ac8cd7681", + "gas": 297299, + "gasPrice": "0xf4240", + "gasTipCap": "0xf4240", + "gasFeeCap": "0xf4240", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0x34118801d76b7082ab065e23496c692d002eaf24", + "chainId": "0xcf55", + "value": "0x0", + "data": "0x447a4c620000000000000000000000000000000000000000000000000000000000000005", + "isCreate": false, + "accessList": [], + "v": "0x1", + "r": "0xa2e66dd106655b99c017d80b6160364e68cf221f0f237ce5ec9c592016101eda", + "s": "0x23ecd835cfd6fa4829a18e5ddd59caf4d9c1b27560cea96e57605ab8c1acbb75" + } + ], + "storageTrace": { + "rootBefore": "0x0e7084285b13c9490d2b3bb3ca33b55526cd57a3d0998784889f452c1fe1e22a", + "rootAfter": "0x04823040a3e712336ffe896207761f576d20e610ba0be3d555d35f8f621371a9", + "proofs": { + "0x0000000000000000000000000000000000000008": [ + "0x091f5e15067db50963fe45217487e31ba7119b3e7e4ec01ca77b01a01772aa34a3019875ca6665598fafe0e1e8b598234d8fac1f97fd4ddd8934d1bce4adbab45f", + "0x090fcb4258d687ba6776a04b1faa3767d41c69c74830126d2353bed13ee423576e2e990ee1c3d90fd3c1fed57f29e85c481b2cf181ffae6c8efa1c719e3a094de4", + "0x09104f87b11816f6619611fbd4dfb6b8425a675325a61e91a29346b0adeca37af02cbd18db2840579d4fed4d451ef3c0dbec0b84acc5ddf83767e049d9a1d62d18", + "0x09223fbfb373b9ecc308c26ec76c19ad952f8d14a85aafd061d34b687d6e7beb610675adef0fbaddcc36c1ea1b79c6bd6a1868851064bf21564e3edb0fcd0783f6", + "0x092b26192ebc81162aa68594a054c44db6465a42a82afa2a88ea3a15f1d179742e0dffb83769fbf984f87ebba2f08f7ab258b82feca5b20ec8adbeaeb19fe3cd78", + "0x0912f32fcd87faa8889ff2b91d786a0ef976de3b5553d5284f8cbd6e9729bd31aa27a8c206ffeba79382d9afcf35f6f653363d70b97ff3ed66aa4a453b543683d6", + "0x0929be597731cca26d8264df590bb5eb3bbcb0549c210ccce091381bea0a5ed9290b2216e48429411f311a9ffc3597586b6984fb58471fc388a1acc99973ef23a4", + "0x090d2daa9e849fc9f1502dd600db166a22950699a54acc4934067f31edb218aa9b301616bf99787b6c731e05949ec9a4de696ec97062003a0ac6524b488aabb293", + "0x082587ccb3b386ae3d8a09547620c34823d3c7f0c672db89b2233ff37210d939bf1b2e1269fe7aa8bc2a40fd5b42046d724ff1869865a76442376b0a84a153873e", + "0x0723df95a3519b71802038e5f1f2704df7a7dc28f9d638be9234a0edc6a2e845f20446cc7bbda1a337f86b559004a173dfef3753eba6ef8e7a1b055a4aeb76092d", + "0x070e239a09355ecbb05370ac258622b0c6ed88daa6d2374a91842c1337a7a71be1022482d4c4ea6734399bbc2249d7c5e073de0572f25f599755129169ebd0778c", + "0x0425eeb63dcae6b3d3508a3a8f5b3d3e021ad8c1e210b73179c9116c082f70dabc0508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c621c5d486a08000000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420763dd93930d25a4753f9ecc56626614aeda98e63000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x34118801d76B7082aB065e23496c692d002eAf24": [ + "0x091f5e15067db50963fe45217487e31ba7119b3e7e4ec01ca77b01a01772aa34a3019875ca6665598fafe0e1e8b598234d8fac1f97fd4ddd8934d1bce4adbab45f", + "0x090fcb4258d687ba6776a04b1faa3767d41c69c74830126d2353bed13ee423576e2e990ee1c3d90fd3c1fed57f29e85c481b2cf181ffae6c8efa1c719e3a094de4", + "0x09104f87b11816f6619611fbd4dfb6b8425a675325a61e91a29346b0adeca37af02cbd18db2840579d4fed4d451ef3c0dbec0b84acc5ddf83767e049d9a1d62d18", + "0x09223fbfb373b9ecc308c26ec76c19ad952f8d14a85aafd061d34b687d6e7beb610675adef0fbaddcc36c1ea1b79c6bd6a1868851064bf21564e3edb0fcd0783f6", + "0x0908e3422b238eb49aa42cbec56a3d2384fb532f80a792059fa6b7114d0e091fc9172b3f8173877733a08cb2cfec3ad805e8009844c4e6bc9265d275c58524b4b0", + "0x090d38f216b8304845b81b08ba9c4f2ecbf6e681042b8ea41e5ff4e7dec490274810f52d1ae7e4bc77bc3cd9a02c9e581550def1bfb2e181e5c825910c3f03f4a6", + "0x091c5154681f6bcf86f9c653cacf0de32e215576176d2f514436a3a75534d321d72f9eb03e2ed7de3331a5879a71a2c8c338fff8c7673c5a1a3c8b44912300bf20", + "0x090897cb100d4f830610ebaa2e8e8811cd5953ad870a777e4696b7f93a437e9236026292cf7673cb3a6f86e695cd872bbc08aa3f4c2b848a48392120c4cf7f71f2", + "0x091d216137f369490b0cd2856488f4504777e4e3b80c5468be68bcc80ed422092c01b060708a06882daa24cdf034a6c5427b9dc80635a27107c192c9b8cf5db4b0", + "0x0623206f13da658e025824f2cff48aee17f2c0d14584273c324710a677cb6f468c2ed47f6805d38a315248cdf24a151ecd4168b7c6d0e01fb2d2932753aa06de27", + "0x041a43febf8ef3453b660638f994f2cd6e72e187b24929ab027143b1cff6dd1bf405080000000000000000000000000000000000000000000000001de200000000000000010000000000000000000000000000000000000000000000000000000000000000152f2d03d3cd603c7c5870016b0bf9b4e1a9398df431f71b62a80c39ef8f4953cac509e682b399f3ee95737f35f4da572121f83a12f3edb76b976789f91151d02de2a02dd2d9eb0adab021a6c9b3ec7f43a8d624de5807d4ead158a3abdaec402034118801d76b7082ab065e23496c692d002eaf24000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5300000000000000000000000000000000000001": [ + "0x091f5e15067db50963fe45217487e31ba7119b3e7e4ec01ca77b01a01772aa34a3019875ca6665598fafe0e1e8b598234d8fac1f97fd4ddd8934d1bce4adbab45f", + "0x090fcb4258d687ba6776a04b1faa3767d41c69c74830126d2353bed13ee423576e2e990ee1c3d90fd3c1fed57f29e85c481b2cf181ffae6c8efa1c719e3a094de4", + "0x090b98b6ce6b18775c6f6db6c1230872616e3d7ea7900f9ff3dc07e96227480d5c007f89220807403164fd521d78dc5244d8b1e74320055a60d4f8a3755c80dee8", + "0x091df47e5df57362e0696b8661792a034fec43fb89769b9940dadb6d38fe2e094a27b48395b98d9dee704b606911b11f95fc96160e498e19fbcf3ecc069e0a768e", + "0x09222c59fb203c2136a3a186f2913505e1ca71f725701fddec9401ac0c19878ada055e263bd357de13dc17a63a7c609290ac76ee1caff199e0b845090f998b3b1f", + "0x092cc07548fafc69a4dc7cfa2a483453f9f9819d104ccc8452b044584316b2918a0b1550511655ecc100037fab01d02dc8afb8b117bedad7f9ff3900d0747d44a6", + "0x091e5bd0832fb5a9827c679c75db95f1a559a07972a60b9c51ec435ea0633394390febfd3ab5fff6718b8ec4122a449fb8320d7a813240d702a4fda781e0a9bdce", + "0x092b96c11dcd9903dd8dfbca4f5acaf64c98f7aa8d1908e90d22682169ff2ba88c1aba44333a24240b0ba627dceff3778abc51012b698672802aea6c8c26bbfe18", + "0x090df918b89bd13e0c0a0745ccee3ac8ba25569fa5ba386d501311f0bf98a643331a327742a33e16c8ac782d9cef4cb06d98b731e6ca13b0c5450951b020f9b0c6", + "0x0820f409300cb23fffe97841b4b70f4c160f90393f7d29ecb5d2dc25f15c89fb550000000000000000000000000000000000000000000000000000000000000000", + "0x061276876f7f3ac122c96a402a706e93a7da84ad82496958bf8cf8d2baefa8c02a20abfaf6bc20fadf9a7609c0562a0ff138977845b052cf9e5d4c52cb2adedbe3", + "0x0427cfcbd2fe87474008e199ef5bff09273803bbf38032c75a36a7726b3c88f8a205080000000000000000000000000000000000000000000000000aec000000000000000000000000000000000000000000000000000000000000000000000000000000002b2d37d04a6c2068ba19a08e79f3eeabfc6d2d1d516fcd700d4c377b23f9fc3f44107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f84205300000000000000000000000000000000000001000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x530000000000000000000000000000000000000f": [ + "0x091f5e15067db50963fe45217487e31ba7119b3e7e4ec01ca77b01a01772aa34a3019875ca6665598fafe0e1e8b598234d8fac1f97fd4ddd8934d1bce4adbab45f", + "0x090fcb4258d687ba6776a04b1faa3767d41c69c74830126d2353bed13ee423576e2e990ee1c3d90fd3c1fed57f29e85c481b2cf181ffae6c8efa1c719e3a094de4", + "0x09104f87b11816f6619611fbd4dfb6b8425a675325a61e91a29346b0adeca37af02cbd18db2840579d4fed4d451ef3c0dbec0b84acc5ddf83767e049d9a1d62d18", + "0x0923887f7f2b818306eb521f1c9a28fa1180772e0603e778536d3bd047562df33521b0c8c03e0e8783c187c12a2309a02be178b53f86ad845a9a2d0f82d342a027", + "0x092acea573988b3a33584f55cee3da7527b7ec93c39ee431d6a00e9e1c0908c32907d5d2c7ba73004c814f367fcfa9bbed0636535570c02819442719331f977f69", + "0x090e9d499bfcd7a95f27f1232e8299d71b9e312b56a5c2f96de6ba2114ce6427600bffa1d771c4f6eb4bbdc666b4ee82f7ea04a51f7c036d38e88ce7e9f7deb0d2", + "0x092e0e76440cf40d49e6a6441452c7ff3db1c5530a007c6d11b54c655302baa6a12719c9e93c1c4ab00f37d68d1fbde1ad2c4c0f540add6fc908b56c496d140ff6", + "0x082596dc85315e1b7b634ed1b19fd101397a8aaee2a296aca23e1f154d83bf2ca81d502de1ce7abdbf1e224e458bcbde4742e517dfc7ff124fca95bc7d6916a573", + "0x0418a86f98026d1a55f6fee616f04d51be16c033651ffaafb0514287ec067d04e805080000000000000000000000000000000000000000000000000aec000000000000000000000000000000000000000000000000000000000000000000000000000000002d56fafe62ab5b6fed6b2a6cd3e6eaff4b96665a12fda3cb3fcd69f5e7bee95f44107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f8420530000000000000000000000000000000000000f000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5300000000000000000000000000000000000017": [ + "0x091f5e15067db50963fe45217487e31ba7119b3e7e4ec01ca77b01a01772aa34a3019875ca6665598fafe0e1e8b598234d8fac1f97fd4ddd8934d1bce4adbab45f", + "0x090fcb4258d687ba6776a04b1faa3767d41c69c74830126d2353bed13ee423576e2e990ee1c3d90fd3c1fed57f29e85c481b2cf181ffae6c8efa1c719e3a094de4", + "0x09104f87b11816f6619611fbd4dfb6b8425a675325a61e91a29346b0adeca37af02cbd18db2840579d4fed4d451ef3c0dbec0b84acc5ddf83767e049d9a1d62d18", + "0x0923887f7f2b818306eb521f1c9a28fa1180772e0603e778536d3bd047562df33521b0c8c03e0e8783c187c12a2309a02be178b53f86ad845a9a2d0f82d342a027", + "0x0921db0def816c47288e31e114f2d320d1bef10a2ce0ed76f2333bfbaf4c9665df164af8117b30ef75c3a4e008ea19aceaa6e63940ecf5e5a545aab0906e772f19", + "0x09243159bed6b5236c01d76e3c7ce8656377ede3215a267875ebd69ecb83609c2f1d430d8e77abbe31d81de9fd34eb7963320d07e618379663173532df9fd64a45", + "0x0901b9f43d7930c744b2f5c270fc55ebc1dad912c53348dc7fc91c254d4f65dc731935412eb3f2d483f1fad4cda432ea52bf9a2fcc83bb4998daae1e3fcb942d70", + "0x090e532e6013b5c675cdd7dd5dbca734c748a7f04cbd659dd2ae0bc5eafa5970c91e3d73de759429994c0b1ca675ad7693042bdd444939eb4adbf7098f3863b137", + "0x091cf7b52fea8453a4ca0b91aa9982cfa67d70de187ba25db4a8f248026ca3e530001cfc254334d3a06381cc5cee1769ae6912ce781377cc01b9c6917605338915", + "0x07092aee158cd2b81331e1ce9909492eb4317b6c5bc4794d546b62069798d0b24428cd8e8880db728741786b4fa7256d94a30e266ca07390acd342670e53ccb6b9", + "0x060e3bf5a186646517ca6d50e9d232f03b095fcceb727e719819a496973c2a8cf81102b8f2eac7af07547b293c5389e362fced543befbe69dc6fa5ec89b7df96e3", + "0x041918c47a133f759975cc95c0dba82051d9b5cd65407e76ef1366a9deaa14f28005080000000000000000000000000000000000000000000000000aec00000000000000000000000000000000000000000000000000000000000000000000000000000000047815c1b6b86b3270e62056fbc5c2f5e6d06a5d3255217e122006dece0bb56544107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f84205300000000000000000000000000000000000017000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x716170D0687c3d31CC10DebE0dAa1DDD3FE3D792": [ + "0x091f5e15067db50963fe45217487e31ba7119b3e7e4ec01ca77b01a01772aa34a3019875ca6665598fafe0e1e8b598234d8fac1f97fd4ddd8934d1bce4adbab45f", + "0x090fcb4258d687ba6776a04b1faa3767d41c69c74830126d2353bed13ee423576e2e990ee1c3d90fd3c1fed57f29e85c481b2cf181ffae6c8efa1c719e3a094de4", + "0x09104f87b11816f6619611fbd4dfb6b8425a675325a61e91a29346b0adeca37af02cbd18db2840579d4fed4d451ef3c0dbec0b84acc5ddf83767e049d9a1d62d18", + "0x09223fbfb373b9ecc308c26ec76c19ad952f8d14a85aafd061d34b687d6e7beb610675adef0fbaddcc36c1ea1b79c6bd6a1868851064bf21564e3edb0fcd0783f6", + "0x092b26192ebc81162aa68594a054c44db6465a42a82afa2a88ea3a15f1d179742e0dffb83769fbf984f87ebba2f08f7ab258b82feca5b20ec8adbeaeb19fe3cd78", + "0x0912f32fcd87faa8889ff2b91d786a0ef976de3b5553d5284f8cbd6e9729bd31aa27a8c206ffeba79382d9afcf35f6f653363d70b97ff3ed66aa4a453b543683d6", + "0x0929be597731cca26d8264df590bb5eb3bbcb0549c210ccce091381bea0a5ed9290b2216e48429411f311a9ffc3597586b6984fb58471fc388a1acc99973ef23a4", + "0x09298da2e6f54d728445d34319cf317db690b4458e1cc40328ef50785d552a54e106b8432a61fadc5e4f053d82e4e1c7799c60e8b54d37a7d9328db06fcb337779", + "0x0905a84a34349628360a471a26d87e83b5cb22108b4e512f899ff26456556e9c7a23ced6ba99188272a1d2d94f65b9d8249b4c039b71efa39820f1f88a9e5f810c", + "0x0700000000000000000000000000000000000000000000000000000000000000002df5dcb185b147a2f8998ef63a69f5426b673a2eda295af573cacc5684a2e807", + "0x0921ddfb4b9e43ab809479c10047a21a49a811c5ba8cc53280e5d7502943c0030d2860edce8b8995f93140520f1bf3f5bdcb4a0ecf7ce87f7bc62c4c0e45d0c496", + "0x061cb8a30e843acaa90b69163814c5ce39a689acb3e7e90f2f9598c6c5488380a604f6276c48cec8cdf8fe675b19d5cb173b53fca9d0c8f4e0b2015528dc843fcf", + "0x0414b0bb4090afcdae623b69d996022ea82c221cd1a3c00c5b13acb37d750f87fc0508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002bfc7fd9a700a70a0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420716170d0687c3d31cc10debe0daa1ddd3fe3d792000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266": [ + "0x091f5e15067db50963fe45217487e31ba7119b3e7e4ec01ca77b01a01772aa34a3019875ca6665598fafe0e1e8b598234d8fac1f97fd4ddd8934d1bce4adbab45f", + "0x090fcb4258d687ba6776a04b1faa3767d41c69c74830126d2353bed13ee423576e2e990ee1c3d90fd3c1fed57f29e85c481b2cf181ffae6c8efa1c719e3a094de4", + "0x090b98b6ce6b18775c6f6db6c1230872616e3d7ea7900f9ff3dc07e96227480d5c007f89220807403164fd521d78dc5244d8b1e74320055a60d4f8a3755c80dee8", + "0x091df47e5df57362e0696b8661792a034fec43fb89769b9940dadb6d38fe2e094a27b48395b98d9dee704b606911b11f95fc96160e498e19fbcf3ecc069e0a768e", + "0x09222c59fb203c2136a3a186f2913505e1ca71f725701fddec9401ac0c19878ada055e263bd357de13dc17a63a7c609290ac76ee1caff199e0b845090f998b3b1f", + "0x092643e673bc192c083bdc2fec99dfd68685c58fb87209f180fca7993ca1c371d32c06a687e38230484a4b6da57e9789bd2b162494b8996940dde8f76be97e18e9", + "0x092aaff786ca7d6da23f3f4e93d3f89328064847693400a97f9f6d5b23ae039c85170187874586c44395c6a35c282650a92d51e74e7d8dc1898f1c5d1aa791409b", + "0x091a2e42b984a6b38ac4cee46e54d20e4b5333e29262d465ec5d3f94bdf62986bf16d346ce301af1d474d62ecd1247b704a154ac82d35ccdd5eebbb203e6434972", + "0x080157a6aa04211703467dd2bea94c79e79aef2a40cf56ad4329275bc56303902d09b11876e7719db807b8d2c600e5babd3239cf90972e0301a6b204796f78205d", + "0x0808d72df8be292e0a5e8036284383881aa22ce6ccf660764a76a03beae8edca820000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000000d960e81d1411112305f98fd794e05f8983e41dce2f403ae11b70be33a51f8c5", + "0x062ee089a51411cf33ef580c2b8ca32193447dc25e2a656bf729754911934a5e341dd09d967fa39b772f3fa838f3d9d63ab3cac97964be50bf0bbce7053209285c", + "0x040d972511ec05ac7e25d155e7d292ab9a61b2227df344cd0eabfeff6f423c64d2050800000000000000000000000000000000000000000000000000000000000000000881000000000000000000000000000000000000000000000655cea72b1789d7e0fe0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420f39fd6e51aad88f6f4ce6ab8827279cfffb92266000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "storageProofs": { + "0x34118801d76B7082aB065e23496c692d002eAf24": { + "0x400f72c890a78502e5c91f3ffd3358a502f8e987d009981e4bd2ba5706d7ebc7": [ + "0x070000000000000000000000000000000000000000000000000000000000000000189a0145a6a16c0c6cc50ae66b824c9cb1a9db406cb9be12cc7bef15e6081bcf", + "0x05", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x68795f998feb42b267415960b9a66858a99e16eab9acc45070862e86161f6d11": [ + "0x070000000000000000000000000000000000000000000000000000000000000000189a0145a6a16c0c6cc50ae66b824c9cb1a9db406cb9be12cc7bef15e6081bcf", + "0x0606444dedf3a910b30703d950eec0c2a47b64cb2a3a6e2feaca98953fb2432388186c0f16d4b0bf87c8113785af47f0ab16620fdb85c84d0059c9d48ab90e8d9a", + "0x041e671cc39994cafd19dd444d6d5e6e08d3c67f90e148d09c8757f989a693a39301010000000000000000000000000000000000000000000000000000000000000000004120b1be342fb132d6b195c0de2630c7585d0323a5d6b626b58b0fa6effee45a748a", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x726491fe49c034223dd47e414dc3ae3fde76bd4a313de2fd4ab5133ad7410a35": [ + "0x070000000000000000000000000000000000000000000000000000000000000000189a0145a6a16c0c6cc50ae66b824c9cb1a9db406cb9be12cc7bef15e6081bcf", + "0x0606444dedf3a910b30703d950eec0c2a47b64cb2a3a6e2feaca98953fb2432388186c0f16d4b0bf87c8113785af47f0ab16620fdb85c84d0059c9d48ab90e8d9a", + "0x041e671cc39994cafd19dd444d6d5e6e08d3c67f90e148d09c8757f989a693a39301010000000000000000000000000000000000000000000000000000000000000000004120b1be342fb132d6b195c0de2630c7585d0323a5d6b626b58b0fa6effee45a748a", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x5300000000000000000000000000000000000001": { + "0x0000000000000000000000000000000000000000000000000000000000000021": [ + "0x09185c96062cbc2b564296e9e1bce3354dbcbf9f5879fd062d5b50bb358f81517e2a2dbce5edb6723342643101ac68123f3790ae822b572ec8bbd69da035c7b935", + "0x092d047e244b411ce9155f14462cfb81958ef4b4c2a08fc3fd4189484a8b7711a40462e3566daed4615c6e51a0e598dfb9a7ed84c831bfc516151e9f5ffb8110ca", + "0x09261fe911b00d2fd329c6b0e4b6d4c3a810b95a82ff32e6946a3244614feb91d205b63b9955f3a8244688b1a6cb053a7559f79129086239b473999e85be4c4282", + "0x07251841563b13c8aa1784b2d917584c358e1607710c0e0b41e5b1c45a07ceac601daf38969872c436599f595013a03f6c004d1f072aa7c8347f6ead35212900a8", + "0x08249e00f5aae6d513fc492c019a4e4de721a60764cada3866244a95db0d4e38bf0000000000000000000000000000000000000000000000000000000000000000", + "0x0818749973fd91f5be3859e8cfa68caee44893779b104075dd793bf4c486475b5b0000000000000000000000000000000000000000000000000000000000000000", + "0x07000000000000000000000000000000000000000000000000000000000000000017d7d830e47e7f6da4ddbf680cf2eb1f9b538cec3240c26711d780f22f093f9a", + "0x0700000000000000000000000000000000000000000000000000000000000000000abb47e0d1f63a2287426a57ee22892129c848adcfadb74266fee6b726c86ede", + "0x07000000000000000000000000000000000000000000000000000000000000000021e13181b559aa6ad86c239a49008b70447de95cb59caa3242701b556ff6d030", + "0x0609a3a225fccec46d81cb0f42943e252523157488c3f7712cc9528ec8eceeee2d0736af2262ac152f39d5da51e394c65d8ab9f3223c051e5be4c43e508a8766cf", + "0x042f683d080c393f5fb2ade2190fd56e8a5e8fa26533acdea8cce25caa236027cc01010000f15fe55ccda900eb1a64fa9abee8054e44b6915dae17e21aef095f4cd49d2a67200000000000000000000000000000000000000000000000000000000000000021", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x530000000000000000000000000000000000000f": { + "0x0000000000000000000000000000000000000000000000000000000000000001": [ + "0x090a47cdf7291bf5686a20e9325d5e85cd4c10009d5a5b727819689a559d47c621305837382344bb8c16c78c482e68e414dcaf0dd956b894c85acca1ae8d3b661a", + "0x090b1b80070a297010cca4d2fb3048fe8814f318eb8a6034a339d8e843544f1d1b2930aa108d1bfc505b36919afcd36848860c81ec8b00c0787b390250bfa7e31a", + "0x090084ca152c72cefb55b42146c2ac6b95a984db669d559d50cea6b7e776e5a6b31952bdec2ac6cd00c8bebfc77863f183bd2c9d09cd1938ebb9fe5fc2e2d2c1f4", + "0x0826741766ba756a60481cdbfbf1385b2e19410e0b174723be76ccce90749c19b71721b818bb25fdc0627fbd0f0ced2d5f58f1065a3e11d06073b58139aa144311", + "0x0700000000000000000000000000000000000000000000000000000000000000002aa3eec54733e8552173f9294865bf49cf8b2c952706e74cee743186ad4cd928", + "0x080ccb96bae7a65349544b73c51e1c17e905afa52b470cd3d12f5068df70ae80380000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000001982d84b59e872b109cb1b01bc1d03406977eb16aeef0ca94449c0e4dbde6426", + "0x08148058fb1d8433119f2f078417d61bd03610293c07a22079d8add13751806be00000000000000000000000000000000000000000000000000000000000000000", + "0x080b933363c8e146ca259ddce0026a7cda36a75da17137370243f5452dad2e2bd10000000000000000000000000000000000000000000000000000000000000000", + "0x07000000000000000000000000000000000000000000000000000000000000000029d862e775a17f6a182820b3ef22a94850f73238972142e77c423a5ccda02739", + "0x0607f1a71dd97c713b6e6f0e0429b179a7f7a5d1a95605340f87f7b3b5c6571655156a0960a84fa4287f66d18b9c39ab9d403fa6b6dddd126f47758aadcb82e122", + "0x0426049ba6de63003492eb078a01a8aa4f4a0e67f28f0955c2eba9101d5d2eea50010100000000000000000000000000000000000000000000000000000000000005f5e108200000000000000000000000000000000000000000000000000000000000000001", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000002": [ + "0x090a47cdf7291bf5686a20e9325d5e85cd4c10009d5a5b727819689a559d47c621305837382344bb8c16c78c482e68e414dcaf0dd956b894c85acca1ae8d3b661a", + "0x090b1b80070a297010cca4d2fb3048fe8814f318eb8a6034a339d8e843544f1d1b2930aa108d1bfc505b36919afcd36848860c81ec8b00c0787b390250bfa7e31a", + "0x090084ca152c72cefb55b42146c2ac6b95a984db669d559d50cea6b7e776e5a6b31952bdec2ac6cd00c8bebfc77863f183bd2c9d09cd1938ebb9fe5fc2e2d2c1f4", + "0x061b12dcd1a582e1e93ccb441e0688e482eb23efa9fb802dd24b7e5a46a7fcd9e21e144bbeb8f4c147dafacf9567e13b1b15e4804a9d74df2da7619735d765c1be", + "0x04020953ad52de135367a1ba2629636216ed5174cce5629d11b5d97fe733f07dcc0101000000000000000000000000000000000000000000000000000000000000000009c4200000000000000000000000000000000000000000000000000000000000000002", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000003": [ + "0x090a47cdf7291bf5686a20e9325d5e85cd4c10009d5a5b727819689a559d47c621305837382344bb8c16c78c482e68e414dcaf0dd956b894c85acca1ae8d3b661a", + "0x0700000000000000000000000000000000000000000000000000000000000000001f63b7a392d1af6e501f653490c2436a2b6ecc4835f91bfc8983aded770a595c", + "0x070ee2ca3e190e48951aa8d5bb00d33ba76a92de69a807dfa6f2eaa9881e303f3226ee193ec0e0368b03645561b95ea6fee2df8bb5f1db80afc64364ec993655f8", + "0x0406c50541f08911ad149aa545dd3d606f86ee63c751a795c7d57f0d3f85e6bdeb01010000000000000000000000000000000000000000000000000000000000003b9aca00200000000000000000000000000000000000000000000000000000000000000003", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000006": [ + "0x090a47cdf7291bf5686a20e9325d5e85cd4c10009d5a5b727819689a559d47c621305837382344bb8c16c78c482e68e414dcaf0dd956b894c85acca1ae8d3b661a", + "0x090b1b80070a297010cca4d2fb3048fe8814f318eb8a6034a339d8e843544f1d1b2930aa108d1bfc505b36919afcd36848860c81ec8b00c0787b390250bfa7e31a", + "0x090084ca152c72cefb55b42146c2ac6b95a984db669d559d50cea6b7e776e5a6b31952bdec2ac6cd00c8bebfc77863f183bd2c9d09cd1938ebb9fe5fc2e2d2c1f4", + "0x061b12dcd1a582e1e93ccb441e0688e482eb23efa9fb802dd24b7e5a46a7fcd9e21e144bbeb8f4c147dafacf9567e13b1b15e4804a9d74df2da7619735d765c1be", + "0x04064ef33f6d7044a6aa1458b710bb24a531e379030cf6ca490d84fff1d8e79c94010100000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000006", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000007": [ + "0x090a47cdf7291bf5686a20e9325d5e85cd4c10009d5a5b727819689a559d47c621305837382344bb8c16c78c482e68e414dcaf0dd956b894c85acca1ae8d3b661a", + "0x090b1b80070a297010cca4d2fb3048fe8814f318eb8a6034a339d8e843544f1d1b2930aa108d1bfc505b36919afcd36848860c81ec8b00c0787b390250bfa7e31a", + "0x082b571cbf4c65b2bf5a694234230c0bb2e95c55920e0c050a73027dea6f5535ab0000000000000000000000000000000000000000000000000000000000000000", + "0x082119746c2afd71d1574bea80b47eab52d70db3990cd1c9f6d4df98eaed5c3ff01555b1ad85223923b16c0129d117eb56e12b2c4310ff3014c28b40684e3ea69d", + "0x040d1e80106f23933567a7c4881177b5d6c45a3f319feafe560a28df75769db9ba0101000000000000000000000000000000000000000000000000000000000b33edbfaf14200000000000000000000000000000000000000000000000000000000000000007", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000008": [ + "0x090a47cdf7291bf5686a20e9325d5e85cd4c10009d5a5b727819689a559d47c621305837382344bb8c16c78c482e68e414dcaf0dd956b894c85acca1ae8d3b661a", + "0x0700000000000000000000000000000000000000000000000000000000000000001f63b7a392d1af6e501f653490c2436a2b6ecc4835f91bfc8983aded770a595c", + "0x070ee2ca3e190e48951aa8d5bb00d33ba76a92de69a807dfa6f2eaa9881e303f3226ee193ec0e0368b03645561b95ea6fee2df8bb5f1db80afc64364ec993655f8", + "0x060e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200302bd20972a48695c1c418461cc2124f0c246ad1bb41e1d8d05cd9527784228a", + "0x0412c0c59f64422dd5b7ce259c4aa62e9bf4e2bcc4f0da068e332b9f4e502ba38f01010000000000000000000000000000000000000000000000000000000000174876e800200000000000000000000000000000000000000000000000000000000000000008", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000009": [ + "0x090a47cdf7291bf5686a20e9325d5e85cd4c10009d5a5b727819689a559d47c621305837382344bb8c16c78c482e68e414dcaf0dd956b894c85acca1ae8d3b661a", + "0x0700000000000000000000000000000000000000000000000000000000000000001f63b7a392d1af6e501f653490c2436a2b6ecc4835f91bfc8983aded770a595c", + "0x05", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x5300000000000000000000000000000000000017": { + "0x0000000000000000000000000000000000000000000000000000000000000065": [ + "0x091e6f7e3b2102387b1b88b997f51470252cf226b68be43284a52489de59a2abb0105259f0b8858b399570780c836f31751cc2566ba5935c50b2db952c1020abb0", + "0x091623ed516b763c3dd7bd75be87d3bda3bc50b9909eb6f832c706e2f973246c131bb859e26b23e5d0474d863af33c2a1163103f5881396448cd8ef9cfe18f9b92", + "0x0812bc2e9bd37f44093eb71c7af67706fd9be1a51a828a3d321b792b5490c6ad560e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200", + "0x07290cb26e75385afbd8fce76271781f49ca9f5737fe573f7a121642a43bdba61a04c601c63ad45f2c8c8c8cbe20c788ef63e574ce0e800153c8b0c855dca3c0be", + "0x0702bdcd1f95c7883b7b633e040eb8263e1fb0ab97a3fa5e590f4ba82b29ee3e5a2284968786ddc52459cd3e8be14da7533c8470c63575eaccae28bd65169074f9", + "0x07000000000000000000000000000000000000000000000000000000000000000028bcb7656960130b704e5cd2afdc5bf933752cc290e10ce8de9ff4eeff23fa71", + "0x060bf27252e269c88af00daf8e309f853351131ba9cb56aa8ffdc008546b4eefc9236d89b8a52ce6f920048f57605af94c276903d51b48d2a9549a2d4ce38af1e2", + "0x042115c9b0a0938aa1ce2e8c01581e5aa931288249a453588de70cf2c5dae26a7b0101000072fce9da9f9cca9ae7f43acbcc6060e82ef37152a13cee828b492343ec19eebc200000000000000000000000000000000000000000000000000000000000000065", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + } + } + }, + "codes": [ + { + "codeSize": 0, + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "code": "0x" + }, + { + "codeSize": 7650, + "keccakCodeHash": "0xcac509e682b399f3ee95737f35f4da572121f83a12f3edb76b976789f91151d0", + "hash": "0x2de2a02dd2d9eb0adab021a6c9b3ec7f43a8d624de5807d4ead158a3abdaec40", + "code": "0x608060405234801561000f575f80fd5b506004361061009c575f3560e01c8063637bd16411610064578063637bd1641461019057806365207521146101c05780638a59e100146101f05780638f527e9414610220578063dbd81bc71461023e5761009c565b80630c8f3129146100a057806321ceca81146100d0578063447a4c62146101005780635e109b571461013057806363138d4f14610160575b5f80fd5b6100ba60048036038101906100b5919061127b565b61026e565b6040516100c791906112dc565b60405180910390f35b6100ea60048036038101906100e59190611393565b6103ad565b6040516100f7919061143a565b60405180910390f35b61011a6004803603810190610115919061148d565b610460565b60405161012791906112dc565b60405180910390f35b61014a60048036038101906101459190611393565b610744565b60405161015791906112dc565b60405180910390f35b61017a6004803603810190610175919061127b565b610755565b60405161018791906112dc565b60405180910390f35b6101aa60048036038101906101a59190611393565b610894565b6040516101b791906112dc565b60405180910390f35b6101da60048036038101906101d5919061127b565b6108a5565b6040516101e791906112dc565b60405180910390f35b61020a600480360381019061020591906114b8565b610a35565b60405161021791906112dc565b60405180910390f35b610228610d79565b604051610235919061143a565b60405180910390f35b61025860048036038101906102539190611393565b610fa1565b60405161026591906112dc565b60405180910390f35b5f8061027a8351610fd5565b60405160200161028a9190611596565b60405160208183030381529060405290505f80600373ffffffffffffffffffffffffffffffffffffffff16856040516102c391906115f1565b5f60405180830381855afa9150503d805f81146102fb576040519150601f19603f3d011682016040523d82523d5f602084013e610300565b606091505b5091509150815f846040516103159190611607565b90815260200160405180910390205f6101000a81548160ff0219169083151502179055508060018460405161034a9190611607565b908152602001604051809103902090816103649190611817565b507ffafe735b5fe8b90ced311e90adbc382883d7ed521d7a3d16541de0ff8d44c0018383834260405161039a949392919061193d565b60405180910390a1819350505050919050565b6001818051602081018201805184825260208301602085012081835280955050505050505f9150905080546103e19061164a565b80601f016020809104026020016040519081016040528092919081815260200182805461040d9061164a565b80156104585780601f1061042f57610100808354040283529160200191610458565b820191905f5260205f20905b81548152906001019060200180831161043b57829003601f168201915b505050505081565b5f8061046b83610fd5565b60405160200161047b91906119d8565b60405160208183030381529060405290505f60c08461049a9190611a26565b67ffffffffffffffff8111156104b3576104b2611157565b5b6040519080825280601f01601f1916602001820160405280156104e55781602001600182028036833780820191505090505b5090505f604051806040016040528060018152602001600281525090505f60405180608001604052807f198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c281526020017f1800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed81526020017f090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b81526020017f12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa81525090505f5b86811015610629575f60c0826105be9190611a26565b90505f5b60028110156105eb576020810285015160208202830160208801015280806001019150506105c2565b505f5b600481101561061a576020810284015160208202604084010160208801015280806001019150506105ee565b505080806001019150506105a8565b505f80600873ffffffffffffffffffffffffffffffffffffffff16620f42408660405161065691906115f1565b5f604051808303818686fa925050503d805f811461068f576040519150601f19603f3d011682016040523d82523d5f602084013e610694565b606091505b5091509150815f876040516106a99190611607565b90815260200160405180910390205f6101000a81548160ff021916908315150217905550806001876040516106de9190611607565b908152602001604051809103902090816106f89190611817565b507ffafe735b5fe8b90ced311e90adbc382883d7ed521d7a3d16541de0ff8d44c0018683834260405161072e949392919061193d565b60405180910390a1819650505050505050919050565b5f61074e82610755565b9050919050565b5f806107618351610fd5565b6040516020016107719190611ab1565b60405160208183030381529060405290505f80600273ffffffffffffffffffffffffffffffffffffffff16856040516107aa91906115f1565b5f60405180830381855afa9150503d805f81146107e2576040519150601f19603f3d011682016040523d82523d5f602084013e6107e7565b606091505b5091509150815f846040516107fc9190611607565b90815260200160405180910390205f6101000a81548160ff021916908315150217905550806001846040516108319190611607565b9081526020016040518091039020908161084b9190611817565b507ffafe735b5fe8b90ced311e90adbc382883d7ed521d7a3d16541de0ff8d44c00183838342604051610881949392919061193d565b60405180910390a1819350505050919050565b5f61089e8261026e565b9050919050565b5f60d58251146108ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e190611b42565b60405180910390fd5b5f6040518060400160405280600781526020017f426c616b6532460000000000000000000000000000000000000000000000000081525090505f80600973ffffffffffffffffffffffffffffffffffffffff168560405161094b91906115f1565b5f60405180830381855afa9150503d805f8114610983576040519150601f19603f3d011682016040523d82523d5f602084013e610988565b606091505b5091509150815f8460405161099d9190611607565b90815260200160405180910390205f6101000a81548160ff021916908315150217905550806001846040516109d29190611607565b908152602001604051809103902090816109ec9190611817565b507ffafe735b5fe8b90ced311e90adbc382883d7ed521d7a3d16541de0ff8d44c00183838342604051610a22949392919061193d565b60405180910390a1819350505050919050565b5f80610a4085610fd5565b610a4985610fd5565b610a5285610fd5565b604051602001610a6493929190611bf4565b60405160208183030381529060405290505f8385876060610a859190611c45565b610a8f9190611c45565b610a999190611c45565b67ffffffffffffffff811115610ab257610ab1611157565b5b6040519080825280601f01601f191660200182016040528015610ae45781602001600182028036833780820191505090505b5090505f865f1b90505f865f1b90505f865f1b90508260208501528160408501528060608501525f891115610b7257600760f81b8460018b6060610b289190611c45565b610b329190611c78565b81518110610b4357610b42611cab565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505b5f881115610be457600360f81b8460018a8c6060610b909190611c45565b610b9a9190611c45565b610ba49190611c78565b81518110610bb557610bb4611cab565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505b5f871115610c6157601160f81b846001898b8d6060610c039190611c45565b610c0d9190611c45565b610c179190611c45565b610c219190611c78565b81518110610c3257610c31611cab565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505b5f80600573ffffffffffffffffffffffffffffffffffffffff1686604051610c8991906115f1565b5f60405180830381855afa9150503d805f8114610cc1576040519150601f19603f3d011682016040523d82523d5f602084013e610cc6565b606091505b5091509150815f88604051610cdb9190611607565b90815260200160405180910390205f6101000a81548160ff02191690831515021790555080600188604051610d109190611607565b90815260200160405180910390209081610d2a9190611817565b507ffafe735b5fe8b90ced311e90adbc382883d7ed521d7a3d16541de0ff8d44c00187838342604051610d60949392919061193d565b60405180910390a1819750505050505050509392505050565b60605f60d567ffffffffffffffff811115610d9757610d96611157565b5b6040519080825280601f01601f191660200182016040528015610dc95781602001600182028036833780820191505090505b5090505f60f81b815f81518110610de357610de2611cab565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f60f81b81600181518110610e2957610e28611cab565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f60f81b81600281518110610e6f57610e6e611cab565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600c60f81b81600381518110610eb657610eb5611cab565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053505f600490505b60d4811015610f525761010081610f019190611d05565b60f81b828281518110610f1757610f16611cab565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053508080600101915050610eea565b50600160f81b8160d481518110610f6c57610f6b611cab565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a9053508091505090565b5f818051602081018201805184825260208301602085012081835280955050505050505f915054906101000a900460ff1681565b60605f820361101b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611129565b5f8290505f5b5f821461104a57808061103390611d35565b915050600a826110439190611d7c565b9150611021565b5f8167ffffffffffffffff81111561106557611064611157565b5b6040519080825280601f01601f1916602001820160405280156110975781602001600182028036833780820191505090505b5090505b5f8514611122576001826110af9190611c78565b9150600a856110be9190611d05565b60306110ca9190611c45565b60f81b8183815181106110e0576110df611cab565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff191690815f1a905350600a8561111b9190611d7c565b945061109b565b8093505050505b919050565b5f604051905090565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f601f19601f8301169050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b61118d82611147565b810181811067ffffffffffffffff821117156111ac576111ab611157565b5b80604052505050565b5f6111be61112e565b90506111ca8282611184565b919050565b5f67ffffffffffffffff8211156111e9576111e8611157565b5b6111f282611147565b9050602081019050919050565b828183375f83830152505050565b5f61121f61121a846111cf565b6111b5565b90508281526020810184848401111561123b5761123a611143565b5b6112468482856111ff565b509392505050565b5f82601f8301126112625761126161113f565b5b813561127284826020860161120d565b91505092915050565b5f602082840312156112905761128f611137565b5b5f82013567ffffffffffffffff8111156112ad576112ac61113b565b5b6112b98482850161124e565b91505092915050565b5f8115159050919050565b6112d6816112c2565b82525050565b5f6020820190506112ef5f8301846112cd565b92915050565b5f67ffffffffffffffff82111561130f5761130e611157565b5b61131882611147565b9050602081019050919050565b5f611337611332846112f5565b6111b5565b90508281526020810184848401111561135357611352611143565b5b61135e8482856111ff565b509392505050565b5f82601f83011261137a5761137961113f565b5b813561138a848260208601611325565b91505092915050565b5f602082840312156113a8576113a7611137565b5b5f82013567ffffffffffffffff8111156113c5576113c461113b565b5b6113d184828501611366565b91505092915050565b5f81519050919050565b5f82825260208201905092915050565b8281835e5f83830152505050565b5f61140c826113da565b61141681856113e4565b93506114268185602086016113f4565b61142f81611147565b840191505092915050565b5f6020820190508181035f8301526114528184611402565b905092915050565b5f819050919050565b61146c8161145a565b8114611476575f80fd5b50565b5f8135905061148781611463565b92915050565b5f602082840312156114a2576114a1611137565b5b5f6114af84828501611479565b91505092915050565b5f805f606084860312156114cf576114ce611137565b5b5f6114dc86828701611479565b93505060206114ed86828701611479565b92505060406114fe86828701611479565b9150509250925092565b5f81905092915050565b7f524950454d443136305f000000000000000000000000000000000000000000005f82015250565b5f611546600a83611508565b915061155182611512565b600a82019050919050565b5f81519050919050565b5f6115708261155c565b61157a8185611508565b935061158a8185602086016113f4565b80840191505092915050565b5f6115a08261153a565b91506115ac8284611566565b915081905092915050565b5f81905092915050565b5f6115cb826113da565b6115d581856115b7565b93506115e58185602086016113f4565b80840191505092915050565b5f6115fc82846115c1565b915081905092915050565b5f6116128284611566565b915081905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f600282049050600182168061166157607f821691505b6020821081036116745761167361161d565b5b50919050565b5f819050815f5260205f209050919050565b5f6020601f8301049050919050565b5f82821b905092915050565b5f600883026116d67fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8261169b565b6116e0868361169b565b95508019841693508086168417925050509392505050565b5f819050919050565b5f61171b6117166117118461145a565b6116f8565b61145a565b9050919050565b5f819050919050565b61173483611701565b61174861174082611722565b8484546116a7565b825550505050565b5f90565b61175c611750565b61176781848461172b565b505050565b5b8181101561178a5761177f5f82611754565b60018101905061176d565b5050565b601f8211156117cf576117a08161167a565b6117a98461168c565b810160208510156117b8578190505b6117cc6117c48561168c565b83018261176c565b50505b505050565b5f82821c905092915050565b5f6117ef5f19846008026117d4565b1980831691505092915050565b5f61180783836117e0565b9150826002028217905092915050565b611820826113da565b67ffffffffffffffff81111561183957611838611157565b5b611843825461164a565b61184e82828561178e565b5f60209050601f83116001811461187f575f841561186d578287015190505b61187785826117fc565b8655506118de565b601f19841661188d8661167a565b5f5b828110156118b45784890151825560018201915060208501945060208101905061188f565b868310156118d157848901516118cd601f8916826117e0565b8355505b6001600288020188555050505b505050505050565b5f82825260208201905092915050565b5f6119008261155c565b61190a81856118e6565b935061191a8185602086016113f4565b61192381611147565b840191505092915050565b6119378161145a565b82525050565b5f6080820190508181035f83015261195581876118f6565b905061196460208301866112cd565b81810360408301526119768185611402565b9050611985606083018461192e565b95945050505050565b7f50616972696e675f0000000000000000000000000000000000000000000000005f82015250565b5f6119c2600883611508565b91506119cd8261198e565b600882019050919050565b5f6119e2826119b6565b91506119ee8284611566565b915081905092915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f611a308261145a565b9150611a3b8361145a565b9250828202611a498161145a565b91508282048414831517611a6057611a5f6119f9565b5b5092915050565b7f5348413235365f000000000000000000000000000000000000000000000000005f82015250565b5f611a9b600783611508565b9150611aa682611a67565b600782019050919050565b5f611abb82611a8f565b9150611ac78284611566565b915081905092915050565b7f426c616b6532662072657175697265732065786163746c7920323133206279745f8201527f657320696e707574000000000000000000000000000000000000000000000000602082015250565b5f611b2c6028836118e6565b9150611b3782611ad2565b604082019050919050565b5f6020820190508181035f830152611b5981611b20565b9050919050565b7f4d6f644578705f000000000000000000000000000000000000000000000000005f82015250565b5f611b94600783611508565b9150611b9f82611b60565b600782019050919050565b7f5f000000000000000000000000000000000000000000000000000000000000005f82015250565b5f611bde600183611508565b9150611be982611baa565b600182019050919050565b5f611bfe82611b88565b9150611c0a8286611566565b9150611c1582611bd2565b9150611c218285611566565b9150611c2c82611bd2565b9150611c388284611566565b9150819050949350505050565b5f611c4f8261145a565b9150611c5a8361145a565b9250828201905080821115611c7257611c716119f9565b5b92915050565b5f611c828261145a565b9150611c8d8361145a565b9250828203905081811115611ca557611ca46119f9565b5b92915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f611d0f8261145a565b9150611d1a8361145a565b925082611d2a57611d29611cd8565b5b828206905092915050565b5f611d3f8261145a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611d7157611d706119f9565b5b600182019050919050565b5f611d868261145a565b9150611d918361145a565b925082611da157611da0611cd8565b5b82820490509291505056fea2646970667358221220a76e17a53aa00f68d67da7a762cdae27808d58de0f1cc9c1c13b0f525c25f70364736f6c634300081a0033" + } + ], + "txStorageTraces": [ + { + "rootBefore": "0x0e7084285b13c9490d2b3bb3ca33b55526cd57a3d0998784889f452c1fe1e22a", + "rootAfter": "0x04823040a3e712336ffe896207761f576d20e610ba0be3d555d35f8f621371a9", + "proofs": { + "0x0000000000000000000000000000000000000008": [ + "0x091f5e15067db50963fe45217487e31ba7119b3e7e4ec01ca77b01a01772aa34a3019875ca6665598fafe0e1e8b598234d8fac1f97fd4ddd8934d1bce4adbab45f", + "0x090fcb4258d687ba6776a04b1faa3767d41c69c74830126d2353bed13ee423576e2e990ee1c3d90fd3c1fed57f29e85c481b2cf181ffae6c8efa1c719e3a094de4", + "0x09104f87b11816f6619611fbd4dfb6b8425a675325a61e91a29346b0adeca37af02cbd18db2840579d4fed4d451ef3c0dbec0b84acc5ddf83767e049d9a1d62d18", + "0x09223fbfb373b9ecc308c26ec76c19ad952f8d14a85aafd061d34b687d6e7beb610675adef0fbaddcc36c1ea1b79c6bd6a1868851064bf21564e3edb0fcd0783f6", + "0x092b26192ebc81162aa68594a054c44db6465a42a82afa2a88ea3a15f1d179742e0dffb83769fbf984f87ebba2f08f7ab258b82feca5b20ec8adbeaeb19fe3cd78", + "0x0912f32fcd87faa8889ff2b91d786a0ef976de3b5553d5284f8cbd6e9729bd31aa27a8c206ffeba79382d9afcf35f6f653363d70b97ff3ed66aa4a453b543683d6", + "0x0929be597731cca26d8264df590bb5eb3bbcb0549c210ccce091381bea0a5ed9290b2216e48429411f311a9ffc3597586b6984fb58471fc388a1acc99973ef23a4", + "0x090d2daa9e849fc9f1502dd600db166a22950699a54acc4934067f31edb218aa9b301616bf99787b6c731e05949ec9a4de696ec97062003a0ac6524b488aabb293", + "0x082587ccb3b386ae3d8a09547620c34823d3c7f0c672db89b2233ff37210d939bf1b2e1269fe7aa8bc2a40fd5b42046d724ff1869865a76442376b0a84a153873e", + "0x0723df95a3519b71802038e5f1f2704df7a7dc28f9d638be9234a0edc6a2e845f20446cc7bbda1a337f86b559004a173dfef3753eba6ef8e7a1b055a4aeb76092d", + "0x070e239a09355ecbb05370ac258622b0c6ed88daa6d2374a91842c1337a7a71be1022482d4c4ea6734399bbc2249d7c5e073de0572f25f599755129169ebd0778c", + "0x0425eeb63dcae6b3d3508a3a8f5b3d3e021ad8c1e210b73179c9116c082f70dabc0508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008c621c5d486a08000000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420763dd93930d25a4753f9ecc56626614aeda98e63000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x34118801d76B7082aB065e23496c692d002eAf24": [ + "0x091f5e15067db50963fe45217487e31ba7119b3e7e4ec01ca77b01a01772aa34a3019875ca6665598fafe0e1e8b598234d8fac1f97fd4ddd8934d1bce4adbab45f", + "0x090fcb4258d687ba6776a04b1faa3767d41c69c74830126d2353bed13ee423576e2e990ee1c3d90fd3c1fed57f29e85c481b2cf181ffae6c8efa1c719e3a094de4", + "0x09104f87b11816f6619611fbd4dfb6b8425a675325a61e91a29346b0adeca37af02cbd18db2840579d4fed4d451ef3c0dbec0b84acc5ddf83767e049d9a1d62d18", + "0x09223fbfb373b9ecc308c26ec76c19ad952f8d14a85aafd061d34b687d6e7beb610675adef0fbaddcc36c1ea1b79c6bd6a1868851064bf21564e3edb0fcd0783f6", + "0x0908e3422b238eb49aa42cbec56a3d2384fb532f80a792059fa6b7114d0e091fc9172b3f8173877733a08cb2cfec3ad805e8009844c4e6bc9265d275c58524b4b0", + "0x090d38f216b8304845b81b08ba9c4f2ecbf6e681042b8ea41e5ff4e7dec490274810f52d1ae7e4bc77bc3cd9a02c9e581550def1bfb2e181e5c825910c3f03f4a6", + "0x091c5154681f6bcf86f9c653cacf0de32e215576176d2f514436a3a75534d321d72f9eb03e2ed7de3331a5879a71a2c8c338fff8c7673c5a1a3c8b44912300bf20", + "0x090897cb100d4f830610ebaa2e8e8811cd5953ad870a777e4696b7f93a437e9236026292cf7673cb3a6f86e695cd872bbc08aa3f4c2b848a48392120c4cf7f71f2", + "0x091d216137f369490b0cd2856488f4504777e4e3b80c5468be68bcc80ed422092c01b060708a06882daa24cdf034a6c5427b9dc80635a27107c192c9b8cf5db4b0", + "0x0623206f13da658e025824f2cff48aee17f2c0d14584273c324710a677cb6f468c2ed47f6805d38a315248cdf24a151ecd4168b7c6d0e01fb2d2932753aa06de27", + "0x041a43febf8ef3453b660638f994f2cd6e72e187b24929ab027143b1cff6dd1bf405080000000000000000000000000000000000000000000000001de200000000000000010000000000000000000000000000000000000000000000000000000000000000152f2d03d3cd603c7c5870016b0bf9b4e1a9398df431f71b62a80c39ef8f4953cac509e682b399f3ee95737f35f4da572121f83a12f3edb76b976789f91151d02de2a02dd2d9eb0adab021a6c9b3ec7f43a8d624de5807d4ead158a3abdaec402034118801d76b7082ab065e23496c692d002eaf24000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x716170D0687c3d31CC10DebE0dAa1DDD3FE3D792": [ + "0x091f5e15067db50963fe45217487e31ba7119b3e7e4ec01ca77b01a01772aa34a3019875ca6665598fafe0e1e8b598234d8fac1f97fd4ddd8934d1bce4adbab45f", + "0x090fcb4258d687ba6776a04b1faa3767d41c69c74830126d2353bed13ee423576e2e990ee1c3d90fd3c1fed57f29e85c481b2cf181ffae6c8efa1c719e3a094de4", + "0x09104f87b11816f6619611fbd4dfb6b8425a675325a61e91a29346b0adeca37af02cbd18db2840579d4fed4d451ef3c0dbec0b84acc5ddf83767e049d9a1d62d18", + "0x09223fbfb373b9ecc308c26ec76c19ad952f8d14a85aafd061d34b687d6e7beb610675adef0fbaddcc36c1ea1b79c6bd6a1868851064bf21564e3edb0fcd0783f6", + "0x092b26192ebc81162aa68594a054c44db6465a42a82afa2a88ea3a15f1d179742e0dffb83769fbf984f87ebba2f08f7ab258b82feca5b20ec8adbeaeb19fe3cd78", + "0x0912f32fcd87faa8889ff2b91d786a0ef976de3b5553d5284f8cbd6e9729bd31aa27a8c206ffeba79382d9afcf35f6f653363d70b97ff3ed66aa4a453b543683d6", + "0x0929be597731cca26d8264df590bb5eb3bbcb0549c210ccce091381bea0a5ed9290b2216e48429411f311a9ffc3597586b6984fb58471fc388a1acc99973ef23a4", + "0x09298da2e6f54d728445d34319cf317db690b4458e1cc40328ef50785d552a54e106b8432a61fadc5e4f053d82e4e1c7799c60e8b54d37a7d9328db06fcb337779", + "0x0905a84a34349628360a471a26d87e83b5cb22108b4e512f899ff26456556e9c7a23ced6ba99188272a1d2d94f65b9d8249b4c039b71efa39820f1f88a9e5f810c", + "0x0700000000000000000000000000000000000000000000000000000000000000002df5dcb185b147a2f8998ef63a69f5426b673a2eda295af573cacc5684a2e807", + "0x0921ddfb4b9e43ab809479c10047a21a49a811c5ba8cc53280e5d7502943c0030d2860edce8b8995f93140520f1bf3f5bdcb4a0ecf7ce87f7bc62c4c0e45d0c496", + "0x061cb8a30e843acaa90b69163814c5ce39a689acb3e7e90f2f9598c6c5488380a604f6276c48cec8cdf8fe675b19d5cb173b53fca9d0c8f4e0b2015528dc843fcf", + "0x0414b0bb4090afcdae623b69d996022ea82c221cd1a3c00c5b13acb37d750f87fc0508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002bfc7fd9a700a70a0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420716170d0687c3d31cc10debe0daa1ddd3fe3d792000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266": [ + "0x091f5e15067db50963fe45217487e31ba7119b3e7e4ec01ca77b01a01772aa34a3019875ca6665598fafe0e1e8b598234d8fac1f97fd4ddd8934d1bce4adbab45f", + "0x090fcb4258d687ba6776a04b1faa3767d41c69c74830126d2353bed13ee423576e2e990ee1c3d90fd3c1fed57f29e85c481b2cf181ffae6c8efa1c719e3a094de4", + "0x090b98b6ce6b18775c6f6db6c1230872616e3d7ea7900f9ff3dc07e96227480d5c007f89220807403164fd521d78dc5244d8b1e74320055a60d4f8a3755c80dee8", + "0x091df47e5df57362e0696b8661792a034fec43fb89769b9940dadb6d38fe2e094a27b48395b98d9dee704b606911b11f95fc96160e498e19fbcf3ecc069e0a768e", + "0x09222c59fb203c2136a3a186f2913505e1ca71f725701fddec9401ac0c19878ada055e263bd357de13dc17a63a7c609290ac76ee1caff199e0b845090f998b3b1f", + "0x092643e673bc192c083bdc2fec99dfd68685c58fb87209f180fca7993ca1c371d32c06a687e38230484a4b6da57e9789bd2b162494b8996940dde8f76be97e18e9", + "0x092aaff786ca7d6da23f3f4e93d3f89328064847693400a97f9f6d5b23ae039c85170187874586c44395c6a35c282650a92d51e74e7d8dc1898f1c5d1aa791409b", + "0x091a2e42b984a6b38ac4cee46e54d20e4b5333e29262d465ec5d3f94bdf62986bf16d346ce301af1d474d62ecd1247b704a154ac82d35ccdd5eebbb203e6434972", + "0x080157a6aa04211703467dd2bea94c79e79aef2a40cf56ad4329275bc56303902d09b11876e7719db807b8d2c600e5babd3239cf90972e0301a6b204796f78205d", + "0x0808d72df8be292e0a5e8036284383881aa22ce6ccf660764a76a03beae8edca820000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000000d960e81d1411112305f98fd794e05f8983e41dce2f403ae11b70be33a51f8c5", + "0x062ee089a51411cf33ef580c2b8ca32193447dc25e2a656bf729754911934a5e341dd09d967fa39b772f3fa838f3d9d63ab3cac97964be50bf0bbce7053209285c", + "0x040d972511ec05ac7e25d155e7d292ab9a61b2227df344cd0eabfeff6f423c64d2050800000000000000000000000000000000000000000000000000000000000000000881000000000000000000000000000000000000000000000655cea72b1789d7e0fe0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420f39fd6e51aad88f6f4ce6ab8827279cfffb92266000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "storageProofs": { + "0x34118801d76B7082aB065e23496c692d002eAf24": { + "0x400f72c890a78502e5c91f3ffd3358a502f8e987d009981e4bd2ba5706d7ebc7": [ + "0x070000000000000000000000000000000000000000000000000000000000000000189a0145a6a16c0c6cc50ae66b824c9cb1a9db406cb9be12cc7bef15e6081bcf", + "0x05", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x68795f998feb42b267415960b9a66858a99e16eab9acc45070862e86161f6d11": [ + "0x070000000000000000000000000000000000000000000000000000000000000000189a0145a6a16c0c6cc50ae66b824c9cb1a9db406cb9be12cc7bef15e6081bcf", + "0x0606444dedf3a910b30703d950eec0c2a47b64cb2a3a6e2feaca98953fb2432388186c0f16d4b0bf87c8113785af47f0ab16620fdb85c84d0059c9d48ab90e8d9a", + "0x041e671cc39994cafd19dd444d6d5e6e08d3c67f90e148d09c8757f989a693a39301010000000000000000000000000000000000000000000000000000000000000000004120b1be342fb132d6b195c0de2630c7585d0323a5d6b626b58b0fa6effee45a748a", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x726491fe49c034223dd47e414dc3ae3fde76bd4a313de2fd4ab5133ad7410a35": [ + "0x070000000000000000000000000000000000000000000000000000000000000000189a0145a6a16c0c6cc50ae66b824c9cb1a9db406cb9be12cc7bef15e6081bcf", + "0x0606444dedf3a910b30703d950eec0c2a47b64cb2a3a6e2feaca98953fb2432388186c0f16d4b0bf87c8113785af47f0ab16620fdb85c84d0059c9d48ab90e8d9a", + "0x041e671cc39994cafd19dd444d6d5e6e08d3c67f90e148d09c8757f989a693a39301010000000000000000000000000000000000000000000000000000000000000000004120b1be342fb132d6b195c0de2630c7585d0323a5d6b626b58b0fa6effee45a748a", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + } + } + } + ], + "executionResults": [ + { + "l1DataFee": "0x11ecafb4c3f", + "gas": 297299, + "failed": false, + "returnValue": "0000000000000000000000000000000000000000000000000000000000000001", + "from": { + "address": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "nonce": 2177, + "balance": "0x655cea72b1789d7e0fe", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + "to": { + "address": "0x34118801d76b7082ab065e23496c692d002eaf24", + "nonce": 1, + "balance": "0x0", + "keccakCodeHash": "0xcac509e682b399f3ee95737f35f4da572121f83a12f3edb76b976789f91151d0", + "poseidonCodeHash": "0x2de2a02dd2d9eb0adab021a6c9b3ec7f43a8d624de5807d4ead158a3abdaec40", + "codeSize": 7650 + }, + "accountAfter": [ + { + "address": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "nonce": 2178, + "balance": "0x655cea729b38675d9ff", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + { + "address": "0x34118801d76b7082ab065e23496c692d002eaf24", + "nonce": 1, + "balance": "0x0", + "keccakCodeHash": "0xcac509e682b399f3ee95737f35f4da572121f83a12f3edb76b976789f91151d0", + "poseidonCodeHash": "0x2de2a02dd2d9eb0adab021a6c9b3ec7f43a8d624de5807d4ead158a3abdaec40", + "codeSize": 7650 + }, + { + "address": "0x716170d0687c3d31cc10debe0daa1ddd3fe3d792", + "nonce": 0, + "balance": "0x2bfc813daa62ae09", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + } + ], + "structLogs": [ + { + "pc": 0, + "op": "PUSH1", + "gas": 276095, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2, + "op": "PUSH1", + "gas": 276092, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4, + "op": "MSTORE", + "gas": 276089, + "gasCost": 12, + "depth": 1 + }, + { + "pc": 5, + "op": "CALLVALUE", + "gas": 276077, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6, + "op": "DUP1", + "gas": 276075, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7, + "op": "ISZERO", + "gas": 276072, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 8, + "op": "PUSH2", + "gas": 276069, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 11, + "op": "JUMPI", + "gas": 276066, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 15, + "op": "JUMPDEST", + "gas": 276056, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 16, + "op": "POP", + "gas": 276055, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 17, + "op": "PUSH1", + "gas": 276053, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 19, + "op": "CALLDATASIZE", + "gas": 276050, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 20, + "op": "LT", + "gas": 276048, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 21, + "op": "PUSH2", + "gas": 276045, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 24, + "op": "JUMPI", + "gas": 276042, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 25, + "op": "PUSH0", + "gas": 276032, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 26, + "op": "CALLDATALOAD", + "gas": 276030, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 27, + "op": "PUSH1", + "gas": 276027, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 29, + "op": "SHR", + "gas": 276024, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 30, + "op": "DUP1", + "gas": 276021, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 31, + "op": "PUSH4", + "gas": 276018, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 36, + "op": "GT", + "gas": 276015, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 37, + "op": "PUSH2", + "gas": 276012, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 40, + "op": "JUMPI", + "gas": 276009, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 100, + "op": "JUMPDEST", + "gas": 275999, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 101, + "op": "DUP1", + "gas": 275998, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 102, + "op": "PUSH4", + "gas": 275995, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 107, + "op": "EQ", + "gas": 275992, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 108, + "op": "PUSH2", + "gas": 275989, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 111, + "op": "JUMPI", + "gas": 275986, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 112, + "op": "DUP1", + "gas": 275976, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 113, + "op": "PUSH4", + "gas": 275973, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 118, + "op": "EQ", + "gas": 275970, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 119, + "op": "PUSH2", + "gas": 275967, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 122, + "op": "JUMPI", + "gas": 275964, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 123, + "op": "DUP1", + "gas": 275954, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 124, + "op": "PUSH4", + "gas": 275951, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 129, + "op": "EQ", + "gas": 275948, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 130, + "op": "PUSH2", + "gas": 275945, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 133, + "op": "JUMPI", + "gas": 275942, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 256, + "op": "JUMPDEST", + "gas": 275932, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 257, + "op": "PUSH2", + "gas": 275931, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 260, + "op": "PUSH1", + "gas": 275928, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 262, + "op": "DUP1", + "gas": 275925, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 263, + "op": "CALLDATASIZE", + "gas": 275922, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 264, + "op": "SUB", + "gas": 275920, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 265, + "op": "DUP2", + "gas": 275917, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 266, + "op": "ADD", + "gas": 275914, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 267, + "op": "SWAP1", + "gas": 275911, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 268, + "op": "PUSH2", + "gas": 275908, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 271, + "op": "SWAP2", + "gas": 275905, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 272, + "op": "SWAP1", + "gas": 275902, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 273, + "op": "PUSH2", + "gas": 275899, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 276, + "op": "JUMP", + "gas": 275896, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5261, + "op": "JUMPDEST", + "gas": 275888, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5262, + "op": "PUSH0", + "gas": 275887, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5263, + "op": "PUSH1", + "gas": 275885, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5265, + "op": "DUP3", + "gas": 275882, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5266, + "op": "DUP5", + "gas": 275879, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5267, + "op": "SUB", + "gas": 275876, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5268, + "op": "SLT", + "gas": 275873, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5269, + "op": "ISZERO", + "gas": 275870, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5270, + "op": "PUSH2", + "gas": 275867, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5273, + "op": "JUMPI", + "gas": 275864, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 5282, + "op": "JUMPDEST", + "gas": 275854, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5283, + "op": "PUSH0", + "gas": 275853, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5284, + "op": "PUSH2", + "gas": 275851, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5287, + "op": "DUP5", + "gas": 275848, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5288, + "op": "DUP3", + "gas": 275845, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5289, + "op": "DUP6", + "gas": 275842, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5290, + "op": "ADD", + "gas": 275839, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5291, + "op": "PUSH2", + "gas": 275836, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5294, + "op": "JUMP", + "gas": 275833, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5241, + "op": "JUMPDEST", + "gas": 275825, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5242, + "op": "PUSH0", + "gas": 275824, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5243, + "op": "DUP2", + "gas": 275822, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5244, + "op": "CALLDATALOAD", + "gas": 275819, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5245, + "op": "SWAP1", + "gas": 275816, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5246, + "op": "POP", + "gas": 275813, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5247, + "op": "PUSH2", + "gas": 275811, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5250, + "op": "DUP2", + "gas": 275808, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5251, + "op": "PUSH2", + "gas": 275805, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5254, + "op": "JUMP", + "gas": 275802, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5219, + "op": "JUMPDEST", + "gas": 275794, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5220, + "op": "PUSH2", + "gas": 275793, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5223, + "op": "DUP2", + "gas": 275790, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5224, + "op": "PUSH2", + "gas": 275787, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5227, + "op": "JUMP", + "gas": 275784, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5210, + "op": "JUMPDEST", + "gas": 275776, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5211, + "op": "PUSH0", + "gas": 275775, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5212, + "op": "DUP2", + "gas": 275773, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5213, + "op": "SWAP1", + "gas": 275770, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5214, + "op": "POP", + "gas": 275767, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5215, + "op": "SWAP2", + "gas": 275765, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5216, + "op": "SWAP1", + "gas": 275762, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5217, + "op": "POP", + "gas": 275759, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5218, + "op": "JUMP", + "gas": 275757, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5228, + "op": "JUMPDEST", + "gas": 275749, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5229, + "op": "DUP2", + "gas": 275748, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5230, + "op": "EQ", + "gas": 275745, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5231, + "op": "PUSH2", + "gas": 275742, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5234, + "op": "JUMPI", + "gas": 275739, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 5238, + "op": "JUMPDEST", + "gas": 275729, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5239, + "op": "POP", + "gas": 275728, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5240, + "op": "JUMP", + "gas": 275726, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5255, + "op": "JUMPDEST", + "gas": 275718, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5256, + "op": "SWAP3", + "gas": 275717, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5257, + "op": "SWAP2", + "gas": 275714, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5258, + "op": "POP", + "gas": 275711, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5259, + "op": "POP", + "gas": 275709, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5260, + "op": "JUMP", + "gas": 275707, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5295, + "op": "JUMPDEST", + "gas": 275699, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5296, + "op": "SWAP2", + "gas": 275698, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5297, + "op": "POP", + "gas": 275695, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5298, + "op": "POP", + "gas": 275693, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5299, + "op": "SWAP3", + "gas": 275691, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5300, + "op": "SWAP2", + "gas": 275688, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5301, + "op": "POP", + "gas": 275685, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5302, + "op": "POP", + "gas": 275683, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5303, + "op": "JUMP", + "gas": 275681, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 277, + "op": "JUMPDEST", + "gas": 275673, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 278, + "op": "PUSH2", + "gas": 275672, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 281, + "op": "JUMP", + "gas": 275669, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1120, + "op": "JUMPDEST", + "gas": 275661, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1121, + "op": "PUSH0", + "gas": 275660, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1122, + "op": "DUP1", + "gas": 275658, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1123, + "op": "PUSH2", + "gas": 275655, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1126, + "op": "DUP4", + "gas": 275652, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1127, + "op": "PUSH2", + "gas": 275649, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1130, + "op": "JUMP", + "gas": 275646, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4053, + "op": "JUMPDEST", + "gas": 275638, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4054, + "op": "PUSH1", + "gas": 275637, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4056, + "op": "PUSH0", + "gas": 275634, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4057, + "op": "DUP3", + "gas": 275632, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4058, + "op": "SUB", + "gas": 275629, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4059, + "op": "PUSH2", + "gas": 275626, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4062, + "op": "JUMPI", + "gas": 275623, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4123, + "op": "JUMPDEST", + "gas": 275613, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4124, + "op": "PUSH0", + "gas": 275612, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4125, + "op": "DUP3", + "gas": 275610, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4126, + "op": "SWAP1", + "gas": 275607, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4127, + "op": "POP", + "gas": 275604, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4128, + "op": "PUSH0", + "gas": 275602, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4129, + "op": "JUMPDEST", + "gas": 275600, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4130, + "op": "PUSH0", + "gas": 275599, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4131, + "op": "DUP3", + "gas": 275597, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4132, + "op": "EQ", + "gas": 275594, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4133, + "op": "PUSH2", + "gas": 275591, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4136, + "op": "JUMPI", + "gas": 275588, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4137, + "op": "DUP1", + "gas": 275578, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4138, + "op": "DUP1", + "gas": 275575, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4139, + "op": "PUSH2", + "gas": 275572, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4142, + "op": "SWAP1", + "gas": 275569, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4143, + "op": "PUSH2", + "gas": 275566, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4146, + "op": "JUMP", + "gas": 275563, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7477, + "op": "JUMPDEST", + "gas": 275555, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7478, + "op": "PUSH0", + "gas": 275554, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7479, + "op": "PUSH2", + "gas": 275552, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7482, + "op": "DUP3", + "gas": 275549, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7483, + "op": "PUSH2", + "gas": 275546, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7486, + "op": "JUMP", + "gas": 275543, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5210, + "op": "JUMPDEST", + "gas": 275535, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5211, + "op": "PUSH0", + "gas": 275534, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5212, + "op": "DUP2", + "gas": 275532, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5213, + "op": "SWAP1", + "gas": 275529, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5214, + "op": "POP", + "gas": 275526, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5215, + "op": "SWAP2", + "gas": 275524, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5216, + "op": "SWAP1", + "gas": 275521, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5217, + "op": "POP", + "gas": 275518, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5218, + "op": "JUMP", + "gas": 275516, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7487, + "op": "JUMPDEST", + "gas": 275508, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7488, + "op": "SWAP2", + "gas": 275507, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7489, + "op": "POP", + "gas": 275504, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7490, + "op": "PUSH32", + "gas": 275502, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7523, + "op": "DUP3", + "gas": 275499, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7524, + "op": "SUB", + "gas": 275496, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7525, + "op": "PUSH2", + "gas": 275493, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7528, + "op": "JUMPI", + "gas": 275490, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7537, + "op": "JUMPDEST", + "gas": 275480, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7538, + "op": "PUSH1", + "gas": 275479, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7540, + "op": "DUP3", + "gas": 275476, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7541, + "op": "ADD", + "gas": 275473, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7542, + "op": "SWAP1", + "gas": 275470, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7543, + "op": "POP", + "gas": 275467, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7544, + "op": "SWAP2", + "gas": 275465, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7545, + "op": "SWAP1", + "gas": 275462, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7546, + "op": "POP", + "gas": 275459, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7547, + "op": "JUMP", + "gas": 275457, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4147, + "op": "JUMPDEST", + "gas": 275449, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4148, + "op": "SWAP2", + "gas": 275448, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4149, + "op": "POP", + "gas": 275445, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4150, + "op": "POP", + "gas": 275443, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4151, + "op": "PUSH1", + "gas": 275441, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4153, + "op": "DUP3", + "gas": 275438, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4154, + "op": "PUSH2", + "gas": 275435, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4157, + "op": "SWAP2", + "gas": 275432, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4158, + "op": "SWAP1", + "gas": 275429, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4159, + "op": "PUSH2", + "gas": 275426, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4162, + "op": "JUMP", + "gas": 275423, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7548, + "op": "JUMPDEST", + "gas": 275415, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7549, + "op": "PUSH0", + "gas": 275414, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7550, + "op": "PUSH2", + "gas": 275412, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7553, + "op": "DUP3", + "gas": 275409, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7554, + "op": "PUSH2", + "gas": 275406, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7557, + "op": "JUMP", + "gas": 275403, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5210, + "op": "JUMPDEST", + "gas": 275395, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5211, + "op": "PUSH0", + "gas": 275394, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5212, + "op": "DUP2", + "gas": 275392, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5213, + "op": "SWAP1", + "gas": 275389, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5214, + "op": "POP", + "gas": 275386, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5215, + "op": "SWAP2", + "gas": 275384, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5216, + "op": "SWAP1", + "gas": 275381, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5217, + "op": "POP", + "gas": 275378, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5218, + "op": "JUMP", + "gas": 275376, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7558, + "op": "JUMPDEST", + "gas": 275368, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7559, + "op": "SWAP2", + "gas": 275367, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7560, + "op": "POP", + "gas": 275364, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7561, + "op": "PUSH2", + "gas": 275362, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7564, + "op": "DUP4", + "gas": 275359, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7565, + "op": "PUSH2", + "gas": 275356, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7568, + "op": "JUMP", + "gas": 275353, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5210, + "op": "JUMPDEST", + "gas": 275345, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5211, + "op": "PUSH0", + "gas": 275344, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5212, + "op": "DUP2", + "gas": 275342, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5213, + "op": "SWAP1", + "gas": 275339, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5214, + "op": "POP", + "gas": 275336, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5215, + "op": "SWAP2", + "gas": 275334, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5216, + "op": "SWAP1", + "gas": 275331, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5217, + "op": "POP", + "gas": 275328, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5218, + "op": "JUMP", + "gas": 275326, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7569, + "op": "JUMPDEST", + "gas": 275318, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7570, + "op": "SWAP3", + "gas": 275317, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7571, + "op": "POP", + "gas": 275314, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7572, + "op": "DUP3", + "gas": 275312, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7573, + "op": "PUSH2", + "gas": 275309, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7576, + "op": "JUMPI", + "gas": 275306, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7585, + "op": "JUMPDEST", + "gas": 275296, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7586, + "op": "DUP3", + "gas": 275295, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7587, + "op": "DUP3", + "gas": 275292, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7588, + "op": "DIV", + "gas": 275289, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 7589, + "op": "SWAP1", + "gas": 275284, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7590, + "op": "POP", + "gas": 275281, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7591, + "op": "SWAP3", + "gas": 275279, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7592, + "op": "SWAP2", + "gas": 275276, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7593, + "op": "POP", + "gas": 275273, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7594, + "op": "POP", + "gas": 275271, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7595, + "op": "JUMP", + "gas": 275269, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4163, + "op": "JUMPDEST", + "gas": 275261, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4164, + "op": "SWAP2", + "gas": 275260, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4165, + "op": "POP", + "gas": 275257, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4166, + "op": "PUSH2", + "gas": 275255, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4169, + "op": "JUMP", + "gas": 275252, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4129, + "op": "JUMPDEST", + "gas": 275244, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4130, + "op": "PUSH0", + "gas": 275243, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4131, + "op": "DUP3", + "gas": 275241, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4132, + "op": "EQ", + "gas": 275238, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4133, + "op": "PUSH2", + "gas": 275235, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4136, + "op": "JUMPI", + "gas": 275232, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4170, + "op": "JUMPDEST", + "gas": 275222, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4171, + "op": "PUSH0", + "gas": 275221, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4172, + "op": "DUP2", + "gas": 275219, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4173, + "op": "PUSH8", + "gas": 275216, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4182, + "op": "DUP2", + "gas": 275213, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4183, + "op": "GT", + "gas": 275210, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4184, + "op": "ISZERO", + "gas": 275207, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4185, + "op": "PUSH2", + "gas": 275204, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4188, + "op": "JUMPI", + "gas": 275201, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4197, + "op": "JUMPDEST", + "gas": 275191, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4198, + "op": "PUSH1", + "gas": 275190, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4200, + "op": "MLOAD", + "gas": 275187, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4201, + "op": "SWAP1", + "gas": 275184, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4202, + "op": "DUP1", + "gas": 275181, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4203, + "op": "DUP3", + "gas": 275178, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4204, + "op": "MSTORE", + "gas": 275175, + "gasCost": 9, + "depth": 1 + }, + { + "pc": 4205, + "op": "DUP1", + "gas": 275166, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4206, + "op": "PUSH1", + "gas": 275163, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4208, + "op": "ADD", + "gas": 275160, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4209, + "op": "PUSH1", + "gas": 275157, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4211, + "op": "NOT", + "gas": 275154, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4212, + "op": "AND", + "gas": 275151, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4213, + "op": "PUSH1", + "gas": 275148, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4215, + "op": "ADD", + "gas": 275145, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4216, + "op": "DUP3", + "gas": 275142, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4217, + "op": "ADD", + "gas": 275139, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4218, + "op": "PUSH1", + "gas": 275136, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4220, + "op": "MSTORE", + "gas": 275133, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4221, + "op": "DUP1", + "gas": 275130, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4222, + "op": "ISZERO", + "gas": 275127, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4223, + "op": "PUSH2", + "gas": 275124, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4226, + "op": "JUMPI", + "gas": 275121, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4227, + "op": "DUP2", + "gas": 275111, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4228, + "op": "PUSH1", + "gas": 275108, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4230, + "op": "ADD", + "gas": 275105, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4231, + "op": "PUSH1", + "gas": 275102, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4233, + "op": "DUP3", + "gas": 275099, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4234, + "op": "MUL", + "gas": 275096, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 4235, + "op": "DUP1", + "gas": 275091, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4236, + "op": "CALLDATASIZE", + "gas": 275088, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4237, + "op": "DUP4", + "gas": 275086, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4238, + "op": "CALLDATACOPY", + "gas": 275083, + "gasCost": 9, + "depth": 1 + }, + { + "pc": 4239, + "op": "DUP1", + "gas": 275074, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4240, + "op": "DUP3", + "gas": 275071, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4241, + "op": "ADD", + "gas": 275068, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4242, + "op": "SWAP2", + "gas": 275065, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4243, + "op": "POP", + "gas": 275062, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4244, + "op": "POP", + "gas": 275060, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4245, + "op": "SWAP1", + "gas": 275058, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4246, + "op": "POP", + "gas": 275055, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4247, + "op": "JUMPDEST", + "gas": 275053, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4248, + "op": "POP", + "gas": 275052, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4249, + "op": "SWAP1", + "gas": 275050, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4250, + "op": "POP", + "gas": 275047, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4251, + "op": "JUMPDEST", + "gas": 275045, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4252, + "op": "PUSH0", + "gas": 275044, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4253, + "op": "DUP6", + "gas": 275042, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4254, + "op": "EQ", + "gas": 275039, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4255, + "op": "PUSH2", + "gas": 275036, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4258, + "op": "JUMPI", + "gas": 275033, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4259, + "op": "PUSH1", + "gas": 275023, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4261, + "op": "DUP3", + "gas": 275020, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4262, + "op": "PUSH2", + "gas": 275017, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4265, + "op": "SWAP2", + "gas": 275014, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4266, + "op": "SWAP1", + "gas": 275011, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4267, + "op": "PUSH2", + "gas": 275008, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4270, + "op": "JUMP", + "gas": 275005, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7288, + "op": "JUMPDEST", + "gas": 274997, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7289, + "op": "PUSH0", + "gas": 274996, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7290, + "op": "PUSH2", + "gas": 274994, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7293, + "op": "DUP3", + "gas": 274991, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7294, + "op": "PUSH2", + "gas": 274988, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7297, + "op": "JUMP", + "gas": 274985, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5210, + "op": "JUMPDEST", + "gas": 274977, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5211, + "op": "PUSH0", + "gas": 274976, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5212, + "op": "DUP2", + "gas": 274974, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5213, + "op": "SWAP1", + "gas": 274971, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5214, + "op": "POP", + "gas": 274968, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5215, + "op": "SWAP2", + "gas": 274966, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5216, + "op": "SWAP1", + "gas": 274963, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5217, + "op": "POP", + "gas": 274960, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5218, + "op": "JUMP", + "gas": 274958, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7298, + "op": "JUMPDEST", + "gas": 274950, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7299, + "op": "SWAP2", + "gas": 274949, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7300, + "op": "POP", + "gas": 274946, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7301, + "op": "PUSH2", + "gas": 274944, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7304, + "op": "DUP4", + "gas": 274941, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7305, + "op": "PUSH2", + "gas": 274938, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7308, + "op": "JUMP", + "gas": 274935, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5210, + "op": "JUMPDEST", + "gas": 274927, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5211, + "op": "PUSH0", + "gas": 274926, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5212, + "op": "DUP2", + "gas": 274924, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5213, + "op": "SWAP1", + "gas": 274921, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5214, + "op": "POP", + "gas": 274918, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5215, + "op": "SWAP2", + "gas": 274916, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5216, + "op": "SWAP1", + "gas": 274913, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5217, + "op": "POP", + "gas": 274910, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5218, + "op": "JUMP", + "gas": 274908, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7309, + "op": "JUMPDEST", + "gas": 274900, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7310, + "op": "SWAP3", + "gas": 274899, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7311, + "op": "POP", + "gas": 274896, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7312, + "op": "DUP3", + "gas": 274894, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7313, + "op": "DUP3", + "gas": 274891, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7314, + "op": "SUB", + "gas": 274888, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7315, + "op": "SWAP1", + "gas": 274885, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7316, + "op": "POP", + "gas": 274882, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7317, + "op": "DUP2", + "gas": 274880, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7318, + "op": "DUP2", + "gas": 274877, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7319, + "op": "GT", + "gas": 274874, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7320, + "op": "ISZERO", + "gas": 274871, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7321, + "op": "PUSH2", + "gas": 274868, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7324, + "op": "JUMPI", + "gas": 274865, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7333, + "op": "JUMPDEST", + "gas": 274855, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7334, + "op": "SWAP3", + "gas": 274854, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7335, + "op": "SWAP2", + "gas": 274851, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7336, + "op": "POP", + "gas": 274848, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7337, + "op": "POP", + "gas": 274846, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7338, + "op": "JUMP", + "gas": 274844, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4271, + "op": "JUMPDEST", + "gas": 274836, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4272, + "op": "SWAP2", + "gas": 274835, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4273, + "op": "POP", + "gas": 274832, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4274, + "op": "PUSH1", + "gas": 274830, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4276, + "op": "DUP6", + "gas": 274827, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4277, + "op": "PUSH2", + "gas": 274824, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4280, + "op": "SWAP2", + "gas": 274821, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4281, + "op": "SWAP1", + "gas": 274818, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4282, + "op": "PUSH2", + "gas": 274815, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4285, + "op": "JUMP", + "gas": 274812, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7429, + "op": "JUMPDEST", + "gas": 274804, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7430, + "op": "PUSH0", + "gas": 274803, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7431, + "op": "PUSH2", + "gas": 274801, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7434, + "op": "DUP3", + "gas": 274798, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7435, + "op": "PUSH2", + "gas": 274795, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7438, + "op": "JUMP", + "gas": 274792, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5210, + "op": "JUMPDEST", + "gas": 274784, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5211, + "op": "PUSH0", + "gas": 274783, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5212, + "op": "DUP2", + "gas": 274781, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5213, + "op": "SWAP1", + "gas": 274778, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5214, + "op": "POP", + "gas": 274775, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5215, + "op": "SWAP2", + "gas": 274773, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5216, + "op": "SWAP1", + "gas": 274770, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5217, + "op": "POP", + "gas": 274767, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5218, + "op": "JUMP", + "gas": 274765, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7439, + "op": "JUMPDEST", + "gas": 274757, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7440, + "op": "SWAP2", + "gas": 274756, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7441, + "op": "POP", + "gas": 274753, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7442, + "op": "PUSH2", + "gas": 274751, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7445, + "op": "DUP4", + "gas": 274748, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7446, + "op": "PUSH2", + "gas": 274745, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7449, + "op": "JUMP", + "gas": 274742, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5210, + "op": "JUMPDEST", + "gas": 274734, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5211, + "op": "PUSH0", + "gas": 274733, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5212, + "op": "DUP2", + "gas": 274731, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5213, + "op": "SWAP1", + "gas": 274728, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5214, + "op": "POP", + "gas": 274725, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5215, + "op": "SWAP2", + "gas": 274723, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5216, + "op": "SWAP1", + "gas": 274720, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5217, + "op": "POP", + "gas": 274717, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5218, + "op": "JUMP", + "gas": 274715, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7450, + "op": "JUMPDEST", + "gas": 274707, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7451, + "op": "SWAP3", + "gas": 274706, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7452, + "op": "POP", + "gas": 274703, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7453, + "op": "DUP3", + "gas": 274701, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7454, + "op": "PUSH2", + "gas": 274698, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7457, + "op": "JUMPI", + "gas": 274695, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7466, + "op": "JUMPDEST", + "gas": 274685, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7467, + "op": "DUP3", + "gas": 274684, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7468, + "op": "DUP3", + "gas": 274681, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7469, + "op": "MOD", + "gas": 274678, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 7470, + "op": "SWAP1", + "gas": 274673, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7471, + "op": "POP", + "gas": 274670, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7472, + "op": "SWAP3", + "gas": 274668, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7473, + "op": "SWAP2", + "gas": 274665, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7474, + "op": "POP", + "gas": 274662, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7475, + "op": "POP", + "gas": 274660, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7476, + "op": "JUMP", + "gas": 274658, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4286, + "op": "JUMPDEST", + "gas": 274650, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4287, + "op": "PUSH1", + "gas": 274649, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4289, + "op": "PUSH2", + "gas": 274646, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4292, + "op": "SWAP2", + "gas": 274643, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4293, + "op": "SWAP1", + "gas": 274640, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4294, + "op": "PUSH2", + "gas": 274637, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4297, + "op": "JUMP", + "gas": 274634, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7237, + "op": "JUMPDEST", + "gas": 274626, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7238, + "op": "PUSH0", + "gas": 274625, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7239, + "op": "PUSH2", + "gas": 274623, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7242, + "op": "DUP3", + "gas": 274620, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7243, + "op": "PUSH2", + "gas": 274617, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7246, + "op": "JUMP", + "gas": 274614, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5210, + "op": "JUMPDEST", + "gas": 274606, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5211, + "op": "PUSH0", + "gas": 274605, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5212, + "op": "DUP2", + "gas": 274603, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5213, + "op": "SWAP1", + "gas": 274600, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5214, + "op": "POP", + "gas": 274597, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5215, + "op": "SWAP2", + "gas": 274595, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5216, + "op": "SWAP1", + "gas": 274592, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5217, + "op": "POP", + "gas": 274589, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5218, + "op": "JUMP", + "gas": 274587, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7247, + "op": "JUMPDEST", + "gas": 274579, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7248, + "op": "SWAP2", + "gas": 274578, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7249, + "op": "POP", + "gas": 274575, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7250, + "op": "PUSH2", + "gas": 274573, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7253, + "op": "DUP4", + "gas": 274570, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7254, + "op": "PUSH2", + "gas": 274567, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7257, + "op": "JUMP", + "gas": 274564, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5210, + "op": "JUMPDEST", + "gas": 274556, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5211, + "op": "PUSH0", + "gas": 274555, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5212, + "op": "DUP2", + "gas": 274553, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5213, + "op": "SWAP1", + "gas": 274550, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5214, + "op": "POP", + "gas": 274547, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5215, + "op": "SWAP2", + "gas": 274545, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5216, + "op": "SWAP1", + "gas": 274542, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5217, + "op": "POP", + "gas": 274539, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5218, + "op": "JUMP", + "gas": 274537, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7258, + "op": "JUMPDEST", + "gas": 274529, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7259, + "op": "SWAP3", + "gas": 274528, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7260, + "op": "POP", + "gas": 274525, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7261, + "op": "DUP3", + "gas": 274523, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7262, + "op": "DUP3", + "gas": 274520, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7263, + "op": "ADD", + "gas": 274517, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7264, + "op": "SWAP1", + "gas": 274514, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7265, + "op": "POP", + "gas": 274511, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7266, + "op": "DUP1", + "gas": 274509, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7267, + "op": "DUP3", + "gas": 274506, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7268, + "op": "GT", + "gas": 274503, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7269, + "op": "ISZERO", + "gas": 274500, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7270, + "op": "PUSH2", + "gas": 274497, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7273, + "op": "JUMPI", + "gas": 274494, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7282, + "op": "JUMPDEST", + "gas": 274484, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7283, + "op": "SWAP3", + "gas": 274483, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7284, + "op": "SWAP2", + "gas": 274480, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7285, + "op": "POP", + "gas": 274477, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7286, + "op": "POP", + "gas": 274475, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7287, + "op": "JUMP", + "gas": 274473, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4298, + "op": "JUMPDEST", + "gas": 274465, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4299, + "op": "PUSH1", + "gas": 274464, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4301, + "op": "SHL", + "gas": 274461, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4302, + "op": "DUP2", + "gas": 274458, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4303, + "op": "DUP4", + "gas": 274455, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4304, + "op": "DUP2", + "gas": 274452, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4305, + "op": "MLOAD", + "gas": 274449, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4306, + "op": "DUP2", + "gas": 274446, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4307, + "op": "LT", + "gas": 274443, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4308, + "op": "PUSH2", + "gas": 274440, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4311, + "op": "JUMPI", + "gas": 274437, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4320, + "op": "JUMPDEST", + "gas": 274427, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4321, + "op": "PUSH1", + "gas": 274426, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4323, + "op": "ADD", + "gas": 274423, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4324, + "op": "ADD", + "gas": 274420, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4325, + "op": "SWAP1", + "gas": 274417, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4326, + "op": "PUSH31", + "gas": 274414, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4358, + "op": "NOT", + "gas": 274411, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4359, + "op": "AND", + "gas": 274408, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4360, + "op": "SWAP1", + "gas": 274405, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4361, + "op": "DUP2", + "gas": 274402, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4362, + "op": "PUSH0", + "gas": 274399, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4363, + "op": "BYTE", + "gas": 274397, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4364, + "op": "SWAP1", + "gas": 274394, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4365, + "op": "MSTORE8", + "gas": 274391, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4366, + "op": "POP", + "gas": 274388, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4367, + "op": "PUSH1", + "gas": 274386, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4369, + "op": "DUP6", + "gas": 274383, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4370, + "op": "PUSH2", + "gas": 274380, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4373, + "op": "SWAP2", + "gas": 274377, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4374, + "op": "SWAP1", + "gas": 274374, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4375, + "op": "PUSH2", + "gas": 274371, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4378, + "op": "JUMP", + "gas": 274368, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7548, + "op": "JUMPDEST", + "gas": 274360, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7549, + "op": "PUSH0", + "gas": 274359, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7550, + "op": "PUSH2", + "gas": 274357, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7553, + "op": "DUP3", + "gas": 274354, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7554, + "op": "PUSH2", + "gas": 274351, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7557, + "op": "JUMP", + "gas": 274348, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5210, + "op": "JUMPDEST", + "gas": 274340, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5211, + "op": "PUSH0", + "gas": 274339, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5212, + "op": "DUP2", + "gas": 274337, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5213, + "op": "SWAP1", + "gas": 274334, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5214, + "op": "POP", + "gas": 274331, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5215, + "op": "SWAP2", + "gas": 274329, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5216, + "op": "SWAP1", + "gas": 274326, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5217, + "op": "POP", + "gas": 274323, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5218, + "op": "JUMP", + "gas": 274321, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7558, + "op": "JUMPDEST", + "gas": 274313, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7559, + "op": "SWAP2", + "gas": 274312, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7560, + "op": "POP", + "gas": 274309, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7561, + "op": "PUSH2", + "gas": 274307, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7564, + "op": "DUP4", + "gas": 274304, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7565, + "op": "PUSH2", + "gas": 274301, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7568, + "op": "JUMP", + "gas": 274298, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5210, + "op": "JUMPDEST", + "gas": 274290, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5211, + "op": "PUSH0", + "gas": 274289, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5212, + "op": "DUP2", + "gas": 274287, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5213, + "op": "SWAP1", + "gas": 274284, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5214, + "op": "POP", + "gas": 274281, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5215, + "op": "SWAP2", + "gas": 274279, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5216, + "op": "SWAP1", + "gas": 274276, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5217, + "op": "POP", + "gas": 274273, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5218, + "op": "JUMP", + "gas": 274271, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 7569, + "op": "JUMPDEST", + "gas": 274263, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7570, + "op": "SWAP3", + "gas": 274262, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7571, + "op": "POP", + "gas": 274259, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7572, + "op": "DUP3", + "gas": 274257, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7573, + "op": "PUSH2", + "gas": 274254, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7576, + "op": "JUMPI", + "gas": 274251, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 7585, + "op": "JUMPDEST", + "gas": 274241, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 7586, + "op": "DUP3", + "gas": 274240, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7587, + "op": "DUP3", + "gas": 274237, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7588, + "op": "DIV", + "gas": 274234, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 7589, + "op": "SWAP1", + "gas": 274229, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7590, + "op": "POP", + "gas": 274226, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7591, + "op": "SWAP3", + "gas": 274224, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7592, + "op": "SWAP2", + "gas": 274221, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7593, + "op": "POP", + "gas": 274218, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7594, + "op": "POP", + "gas": 274216, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 7595, + "op": "JUMP", + "gas": 274214, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4379, + "op": "JUMPDEST", + "gas": 274206, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4380, + "op": "SWAP5", + "gas": 274205, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4381, + "op": "POP", + "gas": 274202, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4382, + "op": "PUSH2", + "gas": 274200, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4385, + "op": "JUMP", + "gas": 274197, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4251, + "op": "JUMPDEST", + "gas": 274189, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4252, + "op": "PUSH0", + "gas": 274188, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4253, + "op": "DUP6", + "gas": 274186, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4254, + "op": "EQ", + "gas": 274183, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4255, + "op": "PUSH2", + "gas": 274180, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4258, + "op": "JUMPI", + "gas": 274177, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 4386, + "op": "JUMPDEST", + "gas": 274167, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4387, + "op": "DUP1", + "gas": 274166, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4388, + "op": "SWAP4", + "gas": 274163, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4389, + "op": "POP", + "gas": 274160, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4390, + "op": "POP", + "gas": 274158, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4391, + "op": "POP", + "gas": 274156, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4392, + "op": "POP", + "gas": 274154, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4393, + "op": "JUMPDEST", + "gas": 274152, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4394, + "op": "SWAP2", + "gas": 274151, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4395, + "op": "SWAP1", + "gas": 274148, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4396, + "op": "POP", + "gas": 274145, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4397, + "op": "JUMP", + "gas": 274143, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1131, + "op": "JUMPDEST", + "gas": 274135, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1132, + "op": "PUSH1", + "gas": 274134, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1134, + "op": "MLOAD", + "gas": 274131, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1135, + "op": "PUSH1", + "gas": 274128, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1137, + "op": "ADD", + "gas": 274125, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1138, + "op": "PUSH2", + "gas": 274122, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1141, + "op": "SWAP2", + "gas": 274119, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1142, + "op": "SWAP1", + "gas": 274116, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1143, + "op": "PUSH2", + "gas": 274113, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1146, + "op": "JUMP", + "gas": 274110, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6616, + "op": "JUMPDEST", + "gas": 274102, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6617, + "op": "PUSH0", + "gas": 274101, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6618, + "op": "PUSH2", + "gas": 274099, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6621, + "op": "DUP3", + "gas": 274096, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6622, + "op": "PUSH2", + "gas": 274093, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6625, + "op": "JUMP", + "gas": 274090, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6582, + "op": "JUMPDEST", + "gas": 274082, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6583, + "op": "PUSH0", + "gas": 274081, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6584, + "op": "PUSH2", + "gas": 274079, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6587, + "op": "PUSH1", + "gas": 274076, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6589, + "op": "DUP4", + "gas": 274073, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6590, + "op": "PUSH2", + "gas": 274070, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6593, + "op": "JUMP", + "gas": 274067, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5384, + "op": "JUMPDEST", + "gas": 274059, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5385, + "op": "PUSH0", + "gas": 274058, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5386, + "op": "DUP2", + "gas": 274056, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5387, + "op": "SWAP1", + "gas": 274053, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5388, + "op": "POP", + "gas": 274050, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5389, + "op": "SWAP3", + "gas": 274048, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5390, + "op": "SWAP2", + "gas": 274045, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5391, + "op": "POP", + "gas": 274042, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5392, + "op": "POP", + "gas": 274040, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5393, + "op": "JUMP", + "gas": 274038, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6594, + "op": "JUMPDEST", + "gas": 274030, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6595, + "op": "SWAP2", + "gas": 274029, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6596, + "op": "POP", + "gas": 274026, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6597, + "op": "PUSH2", + "gas": 274024, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6600, + "op": "DUP3", + "gas": 274021, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6601, + "op": "PUSH2", + "gas": 274018, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6604, + "op": "JUMP", + "gas": 274015, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6542, + "op": "JUMPDEST", + "gas": 274007, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6543, + "op": "PUSH32", + "gas": 274006, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6576, + "op": "PUSH0", + "gas": 274003, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6577, + "op": "DUP3", + "gas": 274001, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6578, + "op": "ADD", + "gas": 273998, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6579, + "op": "MSTORE", + "gas": 273995, + "gasCost": 9, + "depth": 1 + }, + { + "pc": 6580, + "op": "POP", + "gas": 273986, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6581, + "op": "JUMP", + "gas": 273984, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6605, + "op": "JUMPDEST", + "gas": 273976, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6606, + "op": "PUSH1", + "gas": 273975, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6608, + "op": "DUP3", + "gas": 273972, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6609, + "op": "ADD", + "gas": 273969, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6610, + "op": "SWAP1", + "gas": 273966, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6611, + "op": "POP", + "gas": 273963, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6612, + "op": "SWAP2", + "gas": 273961, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6613, + "op": "SWAP1", + "gas": 273958, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6614, + "op": "POP", + "gas": 273955, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6615, + "op": "JUMP", + "gas": 273953, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6626, + "op": "JUMPDEST", + "gas": 273945, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6627, + "op": "SWAP2", + "gas": 273944, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6628, + "op": "POP", + "gas": 273941, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6629, + "op": "PUSH2", + "gas": 273939, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6632, + "op": "DUP3", + "gas": 273936, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6633, + "op": "DUP5", + "gas": 273933, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6634, + "op": "PUSH2", + "gas": 273930, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6637, + "op": "JUMP", + "gas": 273927, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5478, + "op": "JUMPDEST", + "gas": 273919, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5479, + "op": "PUSH0", + "gas": 273918, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5480, + "op": "PUSH2", + "gas": 273916, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5483, + "op": "DUP3", + "gas": 273913, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5484, + "op": "PUSH2", + "gas": 273910, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5487, + "op": "JUMP", + "gas": 273907, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5468, + "op": "JUMPDEST", + "gas": 273899, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5469, + "op": "PUSH0", + "gas": 273898, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5470, + "op": "DUP2", + "gas": 273896, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5471, + "op": "MLOAD", + "gas": 273893, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5472, + "op": "SWAP1", + "gas": 273890, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5473, + "op": "POP", + "gas": 273887, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5474, + "op": "SWAP2", + "gas": 273885, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5475, + "op": "SWAP1", + "gas": 273882, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5476, + "op": "POP", + "gas": 273879, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5477, + "op": "JUMP", + "gas": 273877, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5488, + "op": "JUMPDEST", + "gas": 273869, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5489, + "op": "PUSH2", + "gas": 273868, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5492, + "op": "DUP2", + "gas": 273865, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5493, + "op": "DUP6", + "gas": 273862, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5494, + "op": "PUSH2", + "gas": 273859, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5497, + "op": "JUMP", + "gas": 273856, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5384, + "op": "JUMPDEST", + "gas": 273848, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5385, + "op": "PUSH0", + "gas": 273847, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5386, + "op": "DUP2", + "gas": 273845, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5387, + "op": "SWAP1", + "gas": 273842, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5388, + "op": "POP", + "gas": 273839, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5389, + "op": "SWAP3", + "gas": 273837, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5390, + "op": "SWAP2", + "gas": 273834, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5391, + "op": "POP", + "gas": 273831, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5392, + "op": "POP", + "gas": 273829, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5393, + "op": "JUMP", + "gas": 273827, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5498, + "op": "JUMPDEST", + "gas": 273819, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5499, + "op": "SWAP4", + "gas": 273818, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5500, + "op": "POP", + "gas": 273815, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5501, + "op": "PUSH2", + "gas": 273813, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5504, + "op": "DUP2", + "gas": 273810, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5505, + "op": "DUP6", + "gas": 273807, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5506, + "op": "PUSH1", + "gas": 273804, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5508, + "op": "DUP7", + "gas": 273801, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5509, + "op": "ADD", + "gas": 273798, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5510, + "op": "PUSH2", + "gas": 273795, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5513, + "op": "JUMP", + "gas": 273792, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5108, + "op": "JUMPDEST", + "gas": 273784, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5109, + "op": "DUP3", + "gas": 273783, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5110, + "op": "DUP2", + "gas": 273780, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5111, + "op": "DUP4", + "gas": 273777, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5112, + "op": "opcode 0x5e not defined", + "gas": 273774, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 5113, + "op": "PUSH0", + "gas": 273768, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5114, + "op": "DUP4", + "gas": 273766, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5115, + "op": "DUP4", + "gas": 273763, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5116, + "op": "ADD", + "gas": 273760, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5117, + "op": "MSTORE", + "gas": 273757, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 5118, + "op": "POP", + "gas": 273751, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5119, + "op": "POP", + "gas": 273749, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5120, + "op": "POP", + "gas": 273747, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5121, + "op": "JUMP", + "gas": 273745, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5514, + "op": "JUMPDEST", + "gas": 273737, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5515, + "op": "DUP1", + "gas": 273736, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5516, + "op": "DUP5", + "gas": 273733, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5517, + "op": "ADD", + "gas": 273730, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5518, + "op": "SWAP2", + "gas": 273727, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5519, + "op": "POP", + "gas": 273724, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5520, + "op": "POP", + "gas": 273722, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5521, + "op": "SWAP3", + "gas": 273720, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5522, + "op": "SWAP2", + "gas": 273717, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5523, + "op": "POP", + "gas": 273714, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5524, + "op": "POP", + "gas": 273712, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5525, + "op": "JUMP", + "gas": 273710, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6638, + "op": "JUMPDEST", + "gas": 273702, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6639, + "op": "SWAP2", + "gas": 273701, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6640, + "op": "POP", + "gas": 273698, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6641, + "op": "DUP2", + "gas": 273696, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6642, + "op": "SWAP1", + "gas": 273693, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6643, + "op": "POP", + "gas": 273690, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6644, + "op": "SWAP3", + "gas": 273688, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6645, + "op": "SWAP2", + "gas": 273685, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6646, + "op": "POP", + "gas": 273682, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6647, + "op": "POP", + "gas": 273680, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6648, + "op": "JUMP", + "gas": 273678, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1147, + "op": "JUMPDEST", + "gas": 273670, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1148, + "op": "PUSH1", + "gas": 273669, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1150, + "op": "MLOAD", + "gas": 273666, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1151, + "op": "PUSH1", + "gas": 273663, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1153, + "op": "DUP2", + "gas": 273660, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1154, + "op": "DUP4", + "gas": 273657, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1155, + "op": "SUB", + "gas": 273654, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1156, + "op": "SUB", + "gas": 273651, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1157, + "op": "DUP2", + "gas": 273648, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1158, + "op": "MSTORE", + "gas": 273645, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1159, + "op": "SWAP1", + "gas": 273642, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1160, + "op": "PUSH1", + "gas": 273639, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1162, + "op": "MSTORE", + "gas": 273636, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1163, + "op": "SWAP1", + "gas": 273633, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1164, + "op": "POP", + "gas": 273630, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1165, + "op": "PUSH0", + "gas": 273628, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1166, + "op": "PUSH1", + "gas": 273626, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1168, + "op": "DUP5", + "gas": 273623, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1169, + "op": "PUSH2", + "gas": 273620, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1172, + "op": "SWAP2", + "gas": 273617, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1173, + "op": "SWAP1", + "gas": 273614, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1174, + "op": "PUSH2", + "gas": 273611, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1177, + "op": "JUMP", + "gas": 273608, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6694, + "op": "JUMPDEST", + "gas": 273600, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6695, + "op": "PUSH0", + "gas": 273599, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6696, + "op": "PUSH2", + "gas": 273597, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6699, + "op": "DUP3", + "gas": 273594, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6700, + "op": "PUSH2", + "gas": 273591, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6703, + "op": "JUMP", + "gas": 273588, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5210, + "op": "JUMPDEST", + "gas": 273580, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5211, + "op": "PUSH0", + "gas": 273579, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5212, + "op": "DUP2", + "gas": 273577, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5213, + "op": "SWAP1", + "gas": 273574, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5214, + "op": "POP", + "gas": 273571, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5215, + "op": "SWAP2", + "gas": 273569, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5216, + "op": "SWAP1", + "gas": 273566, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5217, + "op": "POP", + "gas": 273563, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5218, + "op": "JUMP", + "gas": 273561, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6704, + "op": "JUMPDEST", + "gas": 273553, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6705, + "op": "SWAP2", + "gas": 273552, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6706, + "op": "POP", + "gas": 273549, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6707, + "op": "PUSH2", + "gas": 273547, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6710, + "op": "DUP4", + "gas": 273544, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6711, + "op": "PUSH2", + "gas": 273541, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6714, + "op": "JUMP", + "gas": 273538, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5210, + "op": "JUMPDEST", + "gas": 273530, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5211, + "op": "PUSH0", + "gas": 273529, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5212, + "op": "DUP2", + "gas": 273527, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5213, + "op": "SWAP1", + "gas": 273524, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5214, + "op": "POP", + "gas": 273521, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5215, + "op": "SWAP2", + "gas": 273519, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5216, + "op": "SWAP1", + "gas": 273516, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5217, + "op": "POP", + "gas": 273513, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5218, + "op": "JUMP", + "gas": 273511, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6715, + "op": "JUMPDEST", + "gas": 273503, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6716, + "op": "SWAP3", + "gas": 273502, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6717, + "op": "POP", + "gas": 273499, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6718, + "op": "DUP3", + "gas": 273497, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6719, + "op": "DUP3", + "gas": 273494, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6720, + "op": "MUL", + "gas": 273491, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 6721, + "op": "PUSH2", + "gas": 273486, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6724, + "op": "DUP2", + "gas": 273483, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6725, + "op": "PUSH2", + "gas": 273480, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6728, + "op": "JUMP", + "gas": 273477, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5210, + "op": "JUMPDEST", + "gas": 273469, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5211, + "op": "PUSH0", + "gas": 273468, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5212, + "op": "DUP2", + "gas": 273466, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5213, + "op": "SWAP1", + "gas": 273463, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5214, + "op": "POP", + "gas": 273460, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5215, + "op": "SWAP2", + "gas": 273458, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5216, + "op": "SWAP1", + "gas": 273455, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5217, + "op": "POP", + "gas": 273452, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5218, + "op": "JUMP", + "gas": 273450, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6729, + "op": "JUMPDEST", + "gas": 273442, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6730, + "op": "SWAP2", + "gas": 273441, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6731, + "op": "POP", + "gas": 273438, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6732, + "op": "DUP3", + "gas": 273436, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6733, + "op": "DUP3", + "gas": 273433, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6734, + "op": "DIV", + "gas": 273430, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 6735, + "op": "DUP5", + "gas": 273425, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6736, + "op": "EQ", + "gas": 273422, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6737, + "op": "DUP4", + "gas": 273419, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6738, + "op": "ISZERO", + "gas": 273416, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6739, + "op": "OR", + "gas": 273413, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6740, + "op": "PUSH2", + "gas": 273410, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6743, + "op": "JUMPI", + "gas": 273407, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6752, + "op": "JUMPDEST", + "gas": 273397, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6753, + "op": "POP", + "gas": 273396, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6754, + "op": "SWAP3", + "gas": 273394, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6755, + "op": "SWAP2", + "gas": 273391, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6756, + "op": "POP", + "gas": 273388, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6757, + "op": "POP", + "gas": 273386, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6758, + "op": "JUMP", + "gas": 273384, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1178, + "op": "JUMPDEST", + "gas": 273376, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1179, + "op": "PUSH8", + "gas": 273375, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1188, + "op": "DUP2", + "gas": 273372, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1189, + "op": "GT", + "gas": 273369, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1190, + "op": "ISZERO", + "gas": 273366, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1191, + "op": "PUSH2", + "gas": 273363, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1194, + "op": "JUMPI", + "gas": 273360, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1203, + "op": "JUMPDEST", + "gas": 273350, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1204, + "op": "PUSH1", + "gas": 273349, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1206, + "op": "MLOAD", + "gas": 273346, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1207, + "op": "SWAP1", + "gas": 273343, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1208, + "op": "DUP1", + "gas": 273340, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1209, + "op": "DUP3", + "gas": 273337, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1210, + "op": "MSTORE", + "gas": 273334, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1211, + "op": "DUP1", + "gas": 273331, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1212, + "op": "PUSH1", + "gas": 273328, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1214, + "op": "ADD", + "gas": 273325, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1215, + "op": "PUSH1", + "gas": 273322, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1217, + "op": "NOT", + "gas": 273319, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1218, + "op": "AND", + "gas": 273316, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1219, + "op": "PUSH1", + "gas": 273313, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1221, + "op": "ADD", + "gas": 273310, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1222, + "op": "DUP3", + "gas": 273307, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1223, + "op": "ADD", + "gas": 273304, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1224, + "op": "PUSH1", + "gas": 273301, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1226, + "op": "MSTORE", + "gas": 273298, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1227, + "op": "DUP1", + "gas": 273295, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1228, + "op": "ISZERO", + "gas": 273292, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1229, + "op": "PUSH2", + "gas": 273289, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1232, + "op": "JUMPI", + "gas": 273286, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1233, + "op": "DUP2", + "gas": 273276, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1234, + "op": "PUSH1", + "gas": 273273, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1236, + "op": "ADD", + "gas": 273270, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1237, + "op": "PUSH1", + "gas": 273267, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1239, + "op": "DUP3", + "gas": 273264, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1240, + "op": "MUL", + "gas": 273261, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1241, + "op": "DUP1", + "gas": 273256, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1242, + "op": "CALLDATASIZE", + "gas": 273253, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1243, + "op": "DUP4", + "gas": 273251, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1244, + "op": "CALLDATACOPY", + "gas": 273248, + "gasCost": 185, + "depth": 1 + }, + { + "pc": 1245, + "op": "DUP1", + "gas": 273063, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1246, + "op": "DUP3", + "gas": 273060, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1247, + "op": "ADD", + "gas": 273057, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1248, + "op": "SWAP2", + "gas": 273054, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1249, + "op": "POP", + "gas": 273051, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1250, + "op": "POP", + "gas": 273049, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1251, + "op": "SWAP1", + "gas": 273047, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1252, + "op": "POP", + "gas": 273044, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1253, + "op": "JUMPDEST", + "gas": 273042, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1254, + "op": "POP", + "gas": 273041, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1255, + "op": "SWAP1", + "gas": 273039, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1256, + "op": "POP", + "gas": 273036, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1257, + "op": "PUSH0", + "gas": 273034, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1258, + "op": "PUSH1", + "gas": 273032, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1260, + "op": "MLOAD", + "gas": 273029, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1261, + "op": "DUP1", + "gas": 273026, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1262, + "op": "PUSH1", + "gas": 273023, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1264, + "op": "ADD", + "gas": 273020, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1265, + "op": "PUSH1", + "gas": 273017, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1267, + "op": "MSTORE", + "gas": 273014, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1268, + "op": "DUP1", + "gas": 273011, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1269, + "op": "PUSH1", + "gas": 273008, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1271, + "op": "DUP2", + "gas": 273005, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1272, + "op": "MSTORE", + "gas": 273002, + "gasCost": 7, + "depth": 1 + }, + { + "pc": 1273, + "op": "PUSH1", + "gas": 272995, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1275, + "op": "ADD", + "gas": 272992, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1276, + "op": "PUSH1", + "gas": 272989, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1278, + "op": "DUP2", + "gas": 272986, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1279, + "op": "MSTORE", + "gas": 272983, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 1280, + "op": "POP", + "gas": 272977, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1281, + "op": "SWAP1", + "gas": 272975, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1282, + "op": "POP", + "gas": 272972, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1283, + "op": "PUSH0", + "gas": 272970, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1284, + "op": "PUSH1", + "gas": 272968, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1286, + "op": "MLOAD", + "gas": 272965, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1287, + "op": "DUP1", + "gas": 272962, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1288, + "op": "PUSH1", + "gas": 272959, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1290, + "op": "ADD", + "gas": 272956, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1291, + "op": "PUSH1", + "gas": 272953, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1293, + "op": "MSTORE", + "gas": 272950, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1294, + "op": "DUP1", + "gas": 272947, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1295, + "op": "PUSH32", + "gas": 272944, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1328, + "op": "DUP2", + "gas": 272941, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1329, + "op": "MSTORE", + "gas": 272938, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 1330, + "op": "PUSH1", + "gas": 272932, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1332, + "op": "ADD", + "gas": 272929, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1333, + "op": "PUSH32", + "gas": 272926, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1366, + "op": "DUP2", + "gas": 272923, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1367, + "op": "MSTORE", + "gas": 272920, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 1368, + "op": "PUSH1", + "gas": 272914, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1370, + "op": "ADD", + "gas": 272911, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1371, + "op": "PUSH32", + "gas": 272908, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1404, + "op": "DUP2", + "gas": 272905, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1405, + "op": "MSTORE", + "gas": 272902, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 1406, + "op": "PUSH1", + "gas": 272896, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1408, + "op": "ADD", + "gas": 272893, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1409, + "op": "PUSH32", + "gas": 272890, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1442, + "op": "DUP2", + "gas": 272887, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1443, + "op": "MSTORE", + "gas": 272884, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 1444, + "op": "POP", + "gas": 272878, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1445, + "op": "SWAP1", + "gas": 272876, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1446, + "op": "POP", + "gas": 272873, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1447, + "op": "PUSH0", + "gas": 272871, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1448, + "op": "JUMPDEST", + "gas": 272869, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1449, + "op": "DUP7", + "gas": 272868, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1450, + "op": "DUP2", + "gas": 272865, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1451, + "op": "LT", + "gas": 272862, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1452, + "op": "ISZERO", + "gas": 272859, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1453, + "op": "PUSH2", + "gas": 272856, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1456, + "op": "JUMPI", + "gas": 272853, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1457, + "op": "PUSH0", + "gas": 272843, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1458, + "op": "PUSH1", + "gas": 272841, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1460, + "op": "DUP3", + "gas": 272838, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1461, + "op": "PUSH2", + "gas": 272835, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1464, + "op": "SWAP2", + "gas": 272832, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1465, + "op": "SWAP1", + "gas": 272829, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1466, + "op": "PUSH2", + "gas": 272826, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1469, + "op": "JUMP", + "gas": 272823, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6694, + "op": "JUMPDEST", + "gas": 272815, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6695, + "op": "PUSH0", + "gas": 272814, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6696, + "op": "PUSH2", + "gas": 272812, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6699, + "op": "DUP3", + "gas": 272809, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6700, + "op": "PUSH2", + "gas": 272806, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6703, + "op": "JUMP", + "gas": 272803, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5210, + "op": "JUMPDEST", + "gas": 272795, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5211, + "op": "PUSH0", + "gas": 272794, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5212, + "op": "DUP2", + "gas": 272792, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5213, + "op": "SWAP1", + "gas": 272789, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5214, + "op": "POP", + "gas": 272786, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5215, + "op": "SWAP2", + "gas": 272784, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5216, + "op": "SWAP1", + "gas": 272781, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5217, + "op": "POP", + "gas": 272778, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5218, + "op": "JUMP", + "gas": 272776, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6704, + "op": "JUMPDEST", + "gas": 272768, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6705, + "op": "SWAP2", + "gas": 272767, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6706, + "op": "POP", + "gas": 272764, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6707, + "op": "PUSH2", + "gas": 272762, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6710, + "op": "DUP4", + "gas": 272759, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6711, + "op": "PUSH2", + "gas": 272756, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6714, + "op": "JUMP", + "gas": 272753, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5210, + "op": "JUMPDEST", + "gas": 272745, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5211, + "op": "PUSH0", + "gas": 272744, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5212, + "op": "DUP2", + "gas": 272742, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5213, + "op": "SWAP1", + "gas": 272739, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5214, + "op": "POP", + "gas": 272736, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5215, + "op": "SWAP2", + "gas": 272734, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5216, + "op": "SWAP1", + "gas": 272731, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5217, + "op": "POP", + "gas": 272728, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5218, + "op": "JUMP", + "gas": 272726, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6715, + "op": "JUMPDEST", + "gas": 272718, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6716, + "op": "SWAP3", + "gas": 272717, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6717, + "op": "POP", + "gas": 272714, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6718, + "op": "DUP3", + "gas": 272712, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6719, + "op": "DUP3", + "gas": 272709, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6720, + "op": "MUL", + "gas": 272706, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 6721, + "op": "PUSH2", + "gas": 272701, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6724, + "op": "DUP2", + "gas": 272698, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6725, + "op": "PUSH2", + "gas": 272695, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6728, + "op": "JUMP", + "gas": 272692, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5210, + "op": "JUMPDEST", + "gas": 272684, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5211, + "op": "PUSH0", + "gas": 272683, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5212, + "op": "DUP2", + "gas": 272681, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5213, + "op": "SWAP1", + "gas": 272678, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5214, + "op": "POP", + "gas": 272675, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5215, + "op": "SWAP2", + "gas": 272673, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5216, + "op": "SWAP1", + "gas": 272670, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5217, + "op": "POP", + "gas": 272667, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5218, + "op": "JUMP", + "gas": 272665, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6729, + "op": "JUMPDEST", + "gas": 272657, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6730, + "op": "SWAP2", + "gas": 272656, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6731, + "op": "POP", + "gas": 272653, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6732, + "op": "DUP3", + "gas": 272651, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6733, + "op": "DUP3", + "gas": 272648, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6734, + "op": "DIV", + "gas": 272645, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 6735, + "op": "DUP5", + "gas": 272640, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6736, + "op": "EQ", + "gas": 272637, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6737, + "op": "DUP4", + "gas": 272634, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6738, + "op": "ISZERO", + "gas": 272631, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6739, + "op": "OR", + "gas": 272628, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6740, + "op": "PUSH2", + "gas": 272625, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6743, + "op": "JUMPI", + "gas": 272622, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6752, + "op": "JUMPDEST", + "gas": 272612, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6753, + "op": "POP", + "gas": 272611, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6754, + "op": "SWAP3", + "gas": 272609, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6755, + "op": "SWAP2", + "gas": 272606, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6756, + "op": "POP", + "gas": 272603, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6757, + "op": "POP", + "gas": 272601, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6758, + "op": "JUMP", + "gas": 272599, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1470, + "op": "JUMPDEST", + "gas": 272591, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1471, + "op": "SWAP1", + "gas": 272590, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1472, + "op": "POP", + "gas": 272587, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1473, + "op": "PUSH0", + "gas": 272585, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1474, + "op": "JUMPDEST", + "gas": 272583, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1475, + "op": "PUSH1", + "gas": 272582, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1477, + "op": "DUP2", + "gas": 272579, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1478, + "op": "LT", + "gas": 272576, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1479, + "op": "ISZERO", + "gas": 272573, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1480, + "op": "PUSH2", + "gas": 272570, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1483, + "op": "JUMPI", + "gas": 272567, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1484, + "op": "PUSH1", + "gas": 272557, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1486, + "op": "DUP2", + "gas": 272554, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1487, + "op": "MUL", + "gas": 272551, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1488, + "op": "DUP6", + "gas": 272546, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1489, + "op": "ADD", + "gas": 272543, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1490, + "op": "MLOAD", + "gas": 272540, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1491, + "op": "PUSH1", + "gas": 272537, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1493, + "op": "DUP3", + "gas": 272534, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1494, + "op": "MUL", + "gas": 272531, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1495, + "op": "DUP4", + "gas": 272526, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1496, + "op": "ADD", + "gas": 272523, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1497, + "op": "PUSH1", + "gas": 272520, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1499, + "op": "DUP9", + "gas": 272517, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1500, + "op": "ADD", + "gas": 272514, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1501, + "op": "ADD", + "gas": 272511, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1502, + "op": "MSTORE", + "gas": 272508, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1503, + "op": "DUP1", + "gas": 272505, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1504, + "op": "DUP1", + "gas": 272502, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1505, + "op": "PUSH1", + "gas": 272499, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1507, + "op": "ADD", + "gas": 272496, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1508, + "op": "SWAP2", + "gas": 272493, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1509, + "op": "POP", + "gas": 272490, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1510, + "op": "POP", + "gas": 272488, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1511, + "op": "PUSH2", + "gas": 272486, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1514, + "op": "JUMP", + "gas": 272483, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1474, + "op": "JUMPDEST", + "gas": 272475, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1475, + "op": "PUSH1", + "gas": 272474, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1477, + "op": "DUP2", + "gas": 272471, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1478, + "op": "LT", + "gas": 272468, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1479, + "op": "ISZERO", + "gas": 272465, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1480, + "op": "PUSH2", + "gas": 272462, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1483, + "op": "JUMPI", + "gas": 272459, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1484, + "op": "PUSH1", + "gas": 272449, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1486, + "op": "DUP2", + "gas": 272446, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1487, + "op": "MUL", + "gas": 272443, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1488, + "op": "DUP6", + "gas": 272438, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1489, + "op": "ADD", + "gas": 272435, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1490, + "op": "MLOAD", + "gas": 272432, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1491, + "op": "PUSH1", + "gas": 272429, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1493, + "op": "DUP3", + "gas": 272426, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1494, + "op": "MUL", + "gas": 272423, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1495, + "op": "DUP4", + "gas": 272418, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1496, + "op": "ADD", + "gas": 272415, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1497, + "op": "PUSH1", + "gas": 272412, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1499, + "op": "DUP9", + "gas": 272409, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1500, + "op": "ADD", + "gas": 272406, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1501, + "op": "ADD", + "gas": 272403, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1502, + "op": "MSTORE", + "gas": 272400, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1503, + "op": "DUP1", + "gas": 272397, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1504, + "op": "DUP1", + "gas": 272394, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1505, + "op": "PUSH1", + "gas": 272391, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1507, + "op": "ADD", + "gas": 272388, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1508, + "op": "SWAP2", + "gas": 272385, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1509, + "op": "POP", + "gas": 272382, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1510, + "op": "POP", + "gas": 272380, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1511, + "op": "PUSH2", + "gas": 272378, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1514, + "op": "JUMP", + "gas": 272375, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1474, + "op": "JUMPDEST", + "gas": 272367, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1475, + "op": "PUSH1", + "gas": 272366, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1477, + "op": "DUP2", + "gas": 272363, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1478, + "op": "LT", + "gas": 272360, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1479, + "op": "ISZERO", + "gas": 272357, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1480, + "op": "PUSH2", + "gas": 272354, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1483, + "op": "JUMPI", + "gas": 272351, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1515, + "op": "JUMPDEST", + "gas": 272341, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1516, + "op": "POP", + "gas": 272340, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1517, + "op": "PUSH0", + "gas": 272338, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1518, + "op": "JUMPDEST", + "gas": 272336, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1519, + "op": "PUSH1", + "gas": 272335, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1521, + "op": "DUP2", + "gas": 272332, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1522, + "op": "LT", + "gas": 272329, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1523, + "op": "ISZERO", + "gas": 272326, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1524, + "op": "PUSH2", + "gas": 272323, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1527, + "op": "JUMPI", + "gas": 272320, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1528, + "op": "PUSH1", + "gas": 272310, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1530, + "op": "DUP2", + "gas": 272307, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1531, + "op": "MUL", + "gas": 272304, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1532, + "op": "DUP5", + "gas": 272299, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1533, + "op": "ADD", + "gas": 272296, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1534, + "op": "MLOAD", + "gas": 272293, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1535, + "op": "PUSH1", + "gas": 272290, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1537, + "op": "DUP3", + "gas": 272287, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1538, + "op": "MUL", + "gas": 272284, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1539, + "op": "PUSH1", + "gas": 272279, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1541, + "op": "DUP5", + "gas": 272276, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1542, + "op": "ADD", + "gas": 272273, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1543, + "op": "ADD", + "gas": 272270, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1544, + "op": "PUSH1", + "gas": 272267, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1546, + "op": "DUP9", + "gas": 272264, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1547, + "op": "ADD", + "gas": 272261, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1548, + "op": "ADD", + "gas": 272258, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1549, + "op": "MSTORE", + "gas": 272255, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1550, + "op": "DUP1", + "gas": 272252, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1551, + "op": "DUP1", + "gas": 272249, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1552, + "op": "PUSH1", + "gas": 272246, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1554, + "op": "ADD", + "gas": 272243, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1555, + "op": "SWAP2", + "gas": 272240, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1556, + "op": "POP", + "gas": 272237, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1557, + "op": "POP", + "gas": 272235, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1558, + "op": "PUSH2", + "gas": 272233, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1561, + "op": "JUMP", + "gas": 272230, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1518, + "op": "JUMPDEST", + "gas": 272222, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1519, + "op": "PUSH1", + "gas": 272221, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1521, + "op": "DUP2", + "gas": 272218, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1522, + "op": "LT", + "gas": 272215, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1523, + "op": "ISZERO", + "gas": 272212, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1524, + "op": "PUSH2", + "gas": 272209, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1527, + "op": "JUMPI", + "gas": 272206, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1528, + "op": "PUSH1", + "gas": 272196, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1530, + "op": "DUP2", + "gas": 272193, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1531, + "op": "MUL", + "gas": 272190, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1532, + "op": "DUP5", + "gas": 272185, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1533, + "op": "ADD", + "gas": 272182, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1534, + "op": "MLOAD", + "gas": 272179, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1535, + "op": "PUSH1", + "gas": 272176, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1537, + "op": "DUP3", + "gas": 272173, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1538, + "op": "MUL", + "gas": 272170, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1539, + "op": "PUSH1", + "gas": 272165, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1541, + "op": "DUP5", + "gas": 272162, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1542, + "op": "ADD", + "gas": 272159, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1543, + "op": "ADD", + "gas": 272156, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1544, + "op": "PUSH1", + "gas": 272153, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1546, + "op": "DUP9", + "gas": 272150, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1547, + "op": "ADD", + "gas": 272147, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1548, + "op": "ADD", + "gas": 272144, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1549, + "op": "MSTORE", + "gas": 272141, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1550, + "op": "DUP1", + "gas": 272138, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1551, + "op": "DUP1", + "gas": 272135, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1552, + "op": "PUSH1", + "gas": 272132, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1554, + "op": "ADD", + "gas": 272129, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1555, + "op": "SWAP2", + "gas": 272126, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1556, + "op": "POP", + "gas": 272123, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1557, + "op": "POP", + "gas": 272121, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1558, + "op": "PUSH2", + "gas": 272119, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1561, + "op": "JUMP", + "gas": 272116, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1518, + "op": "JUMPDEST", + "gas": 272108, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1519, + "op": "PUSH1", + "gas": 272107, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1521, + "op": "DUP2", + "gas": 272104, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1522, + "op": "LT", + "gas": 272101, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1523, + "op": "ISZERO", + "gas": 272098, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1524, + "op": "PUSH2", + "gas": 272095, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1527, + "op": "JUMPI", + "gas": 272092, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1528, + "op": "PUSH1", + "gas": 272082, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1530, + "op": "DUP2", + "gas": 272079, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1531, + "op": "MUL", + "gas": 272076, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1532, + "op": "DUP5", + "gas": 272071, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1533, + "op": "ADD", + "gas": 272068, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1534, + "op": "MLOAD", + "gas": 272065, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1535, + "op": "PUSH1", + "gas": 272062, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1537, + "op": "DUP3", + "gas": 272059, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1538, + "op": "MUL", + "gas": 272056, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1539, + "op": "PUSH1", + "gas": 272051, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1541, + "op": "DUP5", + "gas": 272048, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1542, + "op": "ADD", + "gas": 272045, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1543, + "op": "ADD", + "gas": 272042, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1544, + "op": "PUSH1", + "gas": 272039, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1546, + "op": "DUP9", + "gas": 272036, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1547, + "op": "ADD", + "gas": 272033, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1548, + "op": "ADD", + "gas": 272030, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1549, + "op": "MSTORE", + "gas": 272027, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1550, + "op": "DUP1", + "gas": 272024, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1551, + "op": "DUP1", + "gas": 272021, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1552, + "op": "PUSH1", + "gas": 272018, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1554, + "op": "ADD", + "gas": 272015, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1555, + "op": "SWAP2", + "gas": 272012, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1556, + "op": "POP", + "gas": 272009, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1557, + "op": "POP", + "gas": 272007, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1558, + "op": "PUSH2", + "gas": 272005, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1561, + "op": "JUMP", + "gas": 272002, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1518, + "op": "JUMPDEST", + "gas": 271994, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1519, + "op": "PUSH1", + "gas": 271993, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1521, + "op": "DUP2", + "gas": 271990, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1522, + "op": "LT", + "gas": 271987, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1523, + "op": "ISZERO", + "gas": 271984, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1524, + "op": "PUSH2", + "gas": 271981, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1527, + "op": "JUMPI", + "gas": 271978, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1528, + "op": "PUSH1", + "gas": 271968, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1530, + "op": "DUP2", + "gas": 271965, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1531, + "op": "MUL", + "gas": 271962, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1532, + "op": "DUP5", + "gas": 271957, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1533, + "op": "ADD", + "gas": 271954, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1534, + "op": "MLOAD", + "gas": 271951, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1535, + "op": "PUSH1", + "gas": 271948, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1537, + "op": "DUP3", + "gas": 271945, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1538, + "op": "MUL", + "gas": 271942, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1539, + "op": "PUSH1", + "gas": 271937, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1541, + "op": "DUP5", + "gas": 271934, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1542, + "op": "ADD", + "gas": 271931, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1543, + "op": "ADD", + "gas": 271928, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1544, + "op": "PUSH1", + "gas": 271925, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1546, + "op": "DUP9", + "gas": 271922, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1547, + "op": "ADD", + "gas": 271919, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1548, + "op": "ADD", + "gas": 271916, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1549, + "op": "MSTORE", + "gas": 271913, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1550, + "op": "DUP1", + "gas": 271910, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1551, + "op": "DUP1", + "gas": 271907, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1552, + "op": "PUSH1", + "gas": 271904, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1554, + "op": "ADD", + "gas": 271901, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1555, + "op": "SWAP2", + "gas": 271898, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1556, + "op": "POP", + "gas": 271895, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1557, + "op": "POP", + "gas": 271893, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1558, + "op": "PUSH2", + "gas": 271891, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1561, + "op": "JUMP", + "gas": 271888, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1518, + "op": "JUMPDEST", + "gas": 271880, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1519, + "op": "PUSH1", + "gas": 271879, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1521, + "op": "DUP2", + "gas": 271876, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1522, + "op": "LT", + "gas": 271873, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1523, + "op": "ISZERO", + "gas": 271870, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1524, + "op": "PUSH2", + "gas": 271867, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1527, + "op": "JUMPI", + "gas": 271864, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1562, + "op": "JUMPDEST", + "gas": 271854, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1563, + "op": "POP", + "gas": 271853, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1564, + "op": "POP", + "gas": 271851, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1565, + "op": "DUP1", + "gas": 271849, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1566, + "op": "DUP1", + "gas": 271846, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1567, + "op": "PUSH1", + "gas": 271843, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1569, + "op": "ADD", + "gas": 271840, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1570, + "op": "SWAP2", + "gas": 271837, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1571, + "op": "POP", + "gas": 271834, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1572, + "op": "POP", + "gas": 271832, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1573, + "op": "PUSH2", + "gas": 271830, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1576, + "op": "JUMP", + "gas": 271827, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1448, + "op": "JUMPDEST", + "gas": 271819, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1449, + "op": "DUP7", + "gas": 271818, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1450, + "op": "DUP2", + "gas": 271815, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1451, + "op": "LT", + "gas": 271812, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1452, + "op": "ISZERO", + "gas": 271809, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1453, + "op": "PUSH2", + "gas": 271806, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1456, + "op": "JUMPI", + "gas": 271803, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1457, + "op": "PUSH0", + "gas": 271793, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1458, + "op": "PUSH1", + "gas": 271791, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1460, + "op": "DUP3", + "gas": 271788, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1461, + "op": "PUSH2", + "gas": 271785, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1464, + "op": "SWAP2", + "gas": 271782, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1465, + "op": "SWAP1", + "gas": 271779, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1466, + "op": "PUSH2", + "gas": 271776, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1469, + "op": "JUMP", + "gas": 271773, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6694, + "op": "JUMPDEST", + "gas": 271765, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6695, + "op": "PUSH0", + "gas": 271764, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6696, + "op": "PUSH2", + "gas": 271762, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6699, + "op": "DUP3", + "gas": 271759, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6700, + "op": "PUSH2", + "gas": 271756, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6703, + "op": "JUMP", + "gas": 271753, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5210, + "op": "JUMPDEST", + "gas": 271745, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5211, + "op": "PUSH0", + "gas": 271744, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5212, + "op": "DUP2", + "gas": 271742, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5213, + "op": "SWAP1", + "gas": 271739, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5214, + "op": "POP", + "gas": 271736, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5215, + "op": "SWAP2", + "gas": 271734, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5216, + "op": "SWAP1", + "gas": 271731, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5217, + "op": "POP", + "gas": 271728, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5218, + "op": "JUMP", + "gas": 271726, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6704, + "op": "JUMPDEST", + "gas": 271718, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6705, + "op": "SWAP2", + "gas": 271717, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6706, + "op": "POP", + "gas": 271714, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6707, + "op": "PUSH2", + "gas": 271712, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6710, + "op": "DUP4", + "gas": 271709, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6711, + "op": "PUSH2", + "gas": 271706, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6714, + "op": "JUMP", + "gas": 271703, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5210, + "op": "JUMPDEST", + "gas": 271695, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5211, + "op": "PUSH0", + "gas": 271694, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5212, + "op": "DUP2", + "gas": 271692, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5213, + "op": "SWAP1", + "gas": 271689, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5214, + "op": "POP", + "gas": 271686, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5215, + "op": "SWAP2", + "gas": 271684, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5216, + "op": "SWAP1", + "gas": 271681, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5217, + "op": "POP", + "gas": 271678, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5218, + "op": "JUMP", + "gas": 271676, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6715, + "op": "JUMPDEST", + "gas": 271668, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6716, + "op": "SWAP3", + "gas": 271667, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6717, + "op": "POP", + "gas": 271664, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6718, + "op": "DUP3", + "gas": 271662, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6719, + "op": "DUP3", + "gas": 271659, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6720, + "op": "MUL", + "gas": 271656, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 6721, + "op": "PUSH2", + "gas": 271651, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6724, + "op": "DUP2", + "gas": 271648, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6725, + "op": "PUSH2", + "gas": 271645, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6728, + "op": "JUMP", + "gas": 271642, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5210, + "op": "JUMPDEST", + "gas": 271634, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5211, + "op": "PUSH0", + "gas": 271633, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5212, + "op": "DUP2", + "gas": 271631, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5213, + "op": "SWAP1", + "gas": 271628, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5214, + "op": "POP", + "gas": 271625, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5215, + "op": "SWAP2", + "gas": 271623, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5216, + "op": "SWAP1", + "gas": 271620, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5217, + "op": "POP", + "gas": 271617, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5218, + "op": "JUMP", + "gas": 271615, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6729, + "op": "JUMPDEST", + "gas": 271607, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6730, + "op": "SWAP2", + "gas": 271606, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6731, + "op": "POP", + "gas": 271603, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6732, + "op": "DUP3", + "gas": 271601, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6733, + "op": "DUP3", + "gas": 271598, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6734, + "op": "DIV", + "gas": 271595, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 6735, + "op": "DUP5", + "gas": 271590, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6736, + "op": "EQ", + "gas": 271587, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6737, + "op": "DUP4", + "gas": 271584, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6738, + "op": "ISZERO", + "gas": 271581, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6739, + "op": "OR", + "gas": 271578, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6740, + "op": "PUSH2", + "gas": 271575, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6743, + "op": "JUMPI", + "gas": 271572, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6752, + "op": "JUMPDEST", + "gas": 271562, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6753, + "op": "POP", + "gas": 271561, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6754, + "op": "SWAP3", + "gas": 271559, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6755, + "op": "SWAP2", + "gas": 271556, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6756, + "op": "POP", + "gas": 271553, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6757, + "op": "POP", + "gas": 271551, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6758, + "op": "JUMP", + "gas": 271549, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1470, + "op": "JUMPDEST", + "gas": 271541, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1471, + "op": "SWAP1", + "gas": 271540, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1472, + "op": "POP", + "gas": 271537, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1473, + "op": "PUSH0", + "gas": 271535, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1474, + "op": "JUMPDEST", + "gas": 271533, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1475, + "op": "PUSH1", + "gas": 271532, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1477, + "op": "DUP2", + "gas": 271529, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1478, + "op": "LT", + "gas": 271526, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1479, + "op": "ISZERO", + "gas": 271523, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1480, + "op": "PUSH2", + "gas": 271520, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1483, + "op": "JUMPI", + "gas": 271517, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1484, + "op": "PUSH1", + "gas": 271507, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1486, + "op": "DUP2", + "gas": 271504, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1487, + "op": "MUL", + "gas": 271501, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1488, + "op": "DUP6", + "gas": 271496, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1489, + "op": "ADD", + "gas": 271493, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1490, + "op": "MLOAD", + "gas": 271490, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1491, + "op": "PUSH1", + "gas": 271487, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1493, + "op": "DUP3", + "gas": 271484, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1494, + "op": "MUL", + "gas": 271481, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1495, + "op": "DUP4", + "gas": 271476, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1496, + "op": "ADD", + "gas": 271473, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1497, + "op": "PUSH1", + "gas": 271470, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1499, + "op": "DUP9", + "gas": 271467, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1500, + "op": "ADD", + "gas": 271464, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1501, + "op": "ADD", + "gas": 271461, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1502, + "op": "MSTORE", + "gas": 271458, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1503, + "op": "DUP1", + "gas": 271455, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1504, + "op": "DUP1", + "gas": 271452, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1505, + "op": "PUSH1", + "gas": 271449, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1507, + "op": "ADD", + "gas": 271446, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1508, + "op": "SWAP2", + "gas": 271443, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1509, + "op": "POP", + "gas": 271440, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1510, + "op": "POP", + "gas": 271438, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1511, + "op": "PUSH2", + "gas": 271436, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1514, + "op": "JUMP", + "gas": 271433, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1474, + "op": "JUMPDEST", + "gas": 271425, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1475, + "op": "PUSH1", + "gas": 271424, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1477, + "op": "DUP2", + "gas": 271421, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1478, + "op": "LT", + "gas": 271418, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1479, + "op": "ISZERO", + "gas": 271415, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1480, + "op": "PUSH2", + "gas": 271412, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1483, + "op": "JUMPI", + "gas": 271409, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1484, + "op": "PUSH1", + "gas": 271399, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1486, + "op": "DUP2", + "gas": 271396, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1487, + "op": "MUL", + "gas": 271393, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1488, + "op": "DUP6", + "gas": 271388, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1489, + "op": "ADD", + "gas": 271385, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1490, + "op": "MLOAD", + "gas": 271382, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1491, + "op": "PUSH1", + "gas": 271379, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1493, + "op": "DUP3", + "gas": 271376, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1494, + "op": "MUL", + "gas": 271373, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1495, + "op": "DUP4", + "gas": 271368, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1496, + "op": "ADD", + "gas": 271365, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1497, + "op": "PUSH1", + "gas": 271362, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1499, + "op": "DUP9", + "gas": 271359, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1500, + "op": "ADD", + "gas": 271356, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1501, + "op": "ADD", + "gas": 271353, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1502, + "op": "MSTORE", + "gas": 271350, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1503, + "op": "DUP1", + "gas": 271347, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1504, + "op": "DUP1", + "gas": 271344, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1505, + "op": "PUSH1", + "gas": 271341, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1507, + "op": "ADD", + "gas": 271338, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1508, + "op": "SWAP2", + "gas": 271335, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1509, + "op": "POP", + "gas": 271332, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1510, + "op": "POP", + "gas": 271330, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1511, + "op": "PUSH2", + "gas": 271328, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1514, + "op": "JUMP", + "gas": 271325, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1474, + "op": "JUMPDEST", + "gas": 271317, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1475, + "op": "PUSH1", + "gas": 271316, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1477, + "op": "DUP2", + "gas": 271313, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1478, + "op": "LT", + "gas": 271310, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1479, + "op": "ISZERO", + "gas": 271307, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1480, + "op": "PUSH2", + "gas": 271304, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1483, + "op": "JUMPI", + "gas": 271301, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1515, + "op": "JUMPDEST", + "gas": 271291, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1516, + "op": "POP", + "gas": 271290, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1517, + "op": "PUSH0", + "gas": 271288, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1518, + "op": "JUMPDEST", + "gas": 271286, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1519, + "op": "PUSH1", + "gas": 271285, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1521, + "op": "DUP2", + "gas": 271282, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1522, + "op": "LT", + "gas": 271279, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1523, + "op": "ISZERO", + "gas": 271276, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1524, + "op": "PUSH2", + "gas": 271273, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1527, + "op": "JUMPI", + "gas": 271270, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1528, + "op": "PUSH1", + "gas": 271260, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1530, + "op": "DUP2", + "gas": 271257, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1531, + "op": "MUL", + "gas": 271254, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1532, + "op": "DUP5", + "gas": 271249, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1533, + "op": "ADD", + "gas": 271246, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1534, + "op": "MLOAD", + "gas": 271243, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1535, + "op": "PUSH1", + "gas": 271240, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1537, + "op": "DUP3", + "gas": 271237, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1538, + "op": "MUL", + "gas": 271234, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1539, + "op": "PUSH1", + "gas": 271229, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1541, + "op": "DUP5", + "gas": 271226, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1542, + "op": "ADD", + "gas": 271223, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1543, + "op": "ADD", + "gas": 271220, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1544, + "op": "PUSH1", + "gas": 271217, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1546, + "op": "DUP9", + "gas": 271214, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1547, + "op": "ADD", + "gas": 271211, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1548, + "op": "ADD", + "gas": 271208, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1549, + "op": "MSTORE", + "gas": 271205, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1550, + "op": "DUP1", + "gas": 271202, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1551, + "op": "DUP1", + "gas": 271199, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1552, + "op": "PUSH1", + "gas": 271196, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1554, + "op": "ADD", + "gas": 271193, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1555, + "op": "SWAP2", + "gas": 271190, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1556, + "op": "POP", + "gas": 271187, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1557, + "op": "POP", + "gas": 271185, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1558, + "op": "PUSH2", + "gas": 271183, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1561, + "op": "JUMP", + "gas": 271180, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1518, + "op": "JUMPDEST", + "gas": 271172, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1519, + "op": "PUSH1", + "gas": 271171, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1521, + "op": "DUP2", + "gas": 271168, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1522, + "op": "LT", + "gas": 271165, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1523, + "op": "ISZERO", + "gas": 271162, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1524, + "op": "PUSH2", + "gas": 271159, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1527, + "op": "JUMPI", + "gas": 271156, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1528, + "op": "PUSH1", + "gas": 271146, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1530, + "op": "DUP2", + "gas": 271143, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1531, + "op": "MUL", + "gas": 271140, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1532, + "op": "DUP5", + "gas": 271135, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1533, + "op": "ADD", + "gas": 271132, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1534, + "op": "MLOAD", + "gas": 271129, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1535, + "op": "PUSH1", + "gas": 271126, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1537, + "op": "DUP3", + "gas": 271123, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1538, + "op": "MUL", + "gas": 271120, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1539, + "op": "PUSH1", + "gas": 271115, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1541, + "op": "DUP5", + "gas": 271112, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1542, + "op": "ADD", + "gas": 271109, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1543, + "op": "ADD", + "gas": 271106, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1544, + "op": "PUSH1", + "gas": 271103, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1546, + "op": "DUP9", + "gas": 271100, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1547, + "op": "ADD", + "gas": 271097, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1548, + "op": "ADD", + "gas": 271094, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1549, + "op": "MSTORE", + "gas": 271091, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1550, + "op": "DUP1", + "gas": 271088, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1551, + "op": "DUP1", + "gas": 271085, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1552, + "op": "PUSH1", + "gas": 271082, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1554, + "op": "ADD", + "gas": 271079, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1555, + "op": "SWAP2", + "gas": 271076, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1556, + "op": "POP", + "gas": 271073, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1557, + "op": "POP", + "gas": 271071, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1558, + "op": "PUSH2", + "gas": 271069, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1561, + "op": "JUMP", + "gas": 271066, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1518, + "op": "JUMPDEST", + "gas": 271058, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1519, + "op": "PUSH1", + "gas": 271057, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1521, + "op": "DUP2", + "gas": 271054, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1522, + "op": "LT", + "gas": 271051, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1523, + "op": "ISZERO", + "gas": 271048, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1524, + "op": "PUSH2", + "gas": 271045, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1527, + "op": "JUMPI", + "gas": 271042, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1528, + "op": "PUSH1", + "gas": 271032, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1530, + "op": "DUP2", + "gas": 271029, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1531, + "op": "MUL", + "gas": 271026, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1532, + "op": "DUP5", + "gas": 271021, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1533, + "op": "ADD", + "gas": 271018, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1534, + "op": "MLOAD", + "gas": 271015, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1535, + "op": "PUSH1", + "gas": 271012, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1537, + "op": "DUP3", + "gas": 271009, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1538, + "op": "MUL", + "gas": 271006, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1539, + "op": "PUSH1", + "gas": 271001, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1541, + "op": "DUP5", + "gas": 270998, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1542, + "op": "ADD", + "gas": 270995, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1543, + "op": "ADD", + "gas": 270992, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1544, + "op": "PUSH1", + "gas": 270989, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1546, + "op": "DUP9", + "gas": 270986, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1547, + "op": "ADD", + "gas": 270983, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1548, + "op": "ADD", + "gas": 270980, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1549, + "op": "MSTORE", + "gas": 270977, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1550, + "op": "DUP1", + "gas": 270974, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1551, + "op": "DUP1", + "gas": 270971, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1552, + "op": "PUSH1", + "gas": 270968, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1554, + "op": "ADD", + "gas": 270965, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1555, + "op": "SWAP2", + "gas": 270962, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1556, + "op": "POP", + "gas": 270959, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1557, + "op": "POP", + "gas": 270957, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1558, + "op": "PUSH2", + "gas": 270955, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1561, + "op": "JUMP", + "gas": 270952, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1518, + "op": "JUMPDEST", + "gas": 270944, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1519, + "op": "PUSH1", + "gas": 270943, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1521, + "op": "DUP2", + "gas": 270940, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1522, + "op": "LT", + "gas": 270937, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1523, + "op": "ISZERO", + "gas": 270934, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1524, + "op": "PUSH2", + "gas": 270931, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1527, + "op": "JUMPI", + "gas": 270928, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1528, + "op": "PUSH1", + "gas": 270918, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1530, + "op": "DUP2", + "gas": 270915, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1531, + "op": "MUL", + "gas": 270912, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1532, + "op": "DUP5", + "gas": 270907, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1533, + "op": "ADD", + "gas": 270904, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1534, + "op": "MLOAD", + "gas": 270901, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1535, + "op": "PUSH1", + "gas": 270898, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1537, + "op": "DUP3", + "gas": 270895, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1538, + "op": "MUL", + "gas": 270892, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1539, + "op": "PUSH1", + "gas": 270887, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1541, + "op": "DUP5", + "gas": 270884, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1542, + "op": "ADD", + "gas": 270881, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1543, + "op": "ADD", + "gas": 270878, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1544, + "op": "PUSH1", + "gas": 270875, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1546, + "op": "DUP9", + "gas": 270872, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1547, + "op": "ADD", + "gas": 270869, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1548, + "op": "ADD", + "gas": 270866, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1549, + "op": "MSTORE", + "gas": 270863, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1550, + "op": "DUP1", + "gas": 270860, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1551, + "op": "DUP1", + "gas": 270857, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1552, + "op": "PUSH1", + "gas": 270854, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1554, + "op": "ADD", + "gas": 270851, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1555, + "op": "SWAP2", + "gas": 270848, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1556, + "op": "POP", + "gas": 270845, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1557, + "op": "POP", + "gas": 270843, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1558, + "op": "PUSH2", + "gas": 270841, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1561, + "op": "JUMP", + "gas": 270838, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1518, + "op": "JUMPDEST", + "gas": 270830, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1519, + "op": "PUSH1", + "gas": 270829, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1521, + "op": "DUP2", + "gas": 270826, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1522, + "op": "LT", + "gas": 270823, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1523, + "op": "ISZERO", + "gas": 270820, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1524, + "op": "PUSH2", + "gas": 270817, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1527, + "op": "JUMPI", + "gas": 270814, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1562, + "op": "JUMPDEST", + "gas": 270804, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1563, + "op": "POP", + "gas": 270803, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1564, + "op": "POP", + "gas": 270801, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1565, + "op": "DUP1", + "gas": 270799, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1566, + "op": "DUP1", + "gas": 270796, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1567, + "op": "PUSH1", + "gas": 270793, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1569, + "op": "ADD", + "gas": 270790, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1570, + "op": "SWAP2", + "gas": 270787, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1571, + "op": "POP", + "gas": 270784, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1572, + "op": "POP", + "gas": 270782, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1573, + "op": "PUSH2", + "gas": 270780, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1576, + "op": "JUMP", + "gas": 270777, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1448, + "op": "JUMPDEST", + "gas": 270769, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1449, + "op": "DUP7", + "gas": 270768, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1450, + "op": "DUP2", + "gas": 270765, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1451, + "op": "LT", + "gas": 270762, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1452, + "op": "ISZERO", + "gas": 270759, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1453, + "op": "PUSH2", + "gas": 270756, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1456, + "op": "JUMPI", + "gas": 270753, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1457, + "op": "PUSH0", + "gas": 270743, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1458, + "op": "PUSH1", + "gas": 270741, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1460, + "op": "DUP3", + "gas": 270738, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1461, + "op": "PUSH2", + "gas": 270735, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1464, + "op": "SWAP2", + "gas": 270732, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1465, + "op": "SWAP1", + "gas": 270729, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1466, + "op": "PUSH2", + "gas": 270726, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1469, + "op": "JUMP", + "gas": 270723, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6694, + "op": "JUMPDEST", + "gas": 270715, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6695, + "op": "PUSH0", + "gas": 270714, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6696, + "op": "PUSH2", + "gas": 270712, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6699, + "op": "DUP3", + "gas": 270709, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6700, + "op": "PUSH2", + "gas": 270706, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6703, + "op": "JUMP", + "gas": 270703, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5210, + "op": "JUMPDEST", + "gas": 270695, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5211, + "op": "PUSH0", + "gas": 270694, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5212, + "op": "DUP2", + "gas": 270692, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5213, + "op": "SWAP1", + "gas": 270689, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5214, + "op": "POP", + "gas": 270686, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5215, + "op": "SWAP2", + "gas": 270684, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5216, + "op": "SWAP1", + "gas": 270681, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5217, + "op": "POP", + "gas": 270678, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5218, + "op": "JUMP", + "gas": 270676, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6704, + "op": "JUMPDEST", + "gas": 270668, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6705, + "op": "SWAP2", + "gas": 270667, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6706, + "op": "POP", + "gas": 270664, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6707, + "op": "PUSH2", + "gas": 270662, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6710, + "op": "DUP4", + "gas": 270659, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6711, + "op": "PUSH2", + "gas": 270656, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6714, + "op": "JUMP", + "gas": 270653, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5210, + "op": "JUMPDEST", + "gas": 270645, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5211, + "op": "PUSH0", + "gas": 270644, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5212, + "op": "DUP2", + "gas": 270642, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5213, + "op": "SWAP1", + "gas": 270639, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5214, + "op": "POP", + "gas": 270636, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5215, + "op": "SWAP2", + "gas": 270634, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5216, + "op": "SWAP1", + "gas": 270631, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5217, + "op": "POP", + "gas": 270628, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5218, + "op": "JUMP", + "gas": 270626, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6715, + "op": "JUMPDEST", + "gas": 270618, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6716, + "op": "SWAP3", + "gas": 270617, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6717, + "op": "POP", + "gas": 270614, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6718, + "op": "DUP3", + "gas": 270612, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6719, + "op": "DUP3", + "gas": 270609, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6720, + "op": "MUL", + "gas": 270606, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 6721, + "op": "PUSH2", + "gas": 270601, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6724, + "op": "DUP2", + "gas": 270598, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6725, + "op": "PUSH2", + "gas": 270595, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6728, + "op": "JUMP", + "gas": 270592, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5210, + "op": "JUMPDEST", + "gas": 270584, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5211, + "op": "PUSH0", + "gas": 270583, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5212, + "op": "DUP2", + "gas": 270581, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5213, + "op": "SWAP1", + "gas": 270578, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5214, + "op": "POP", + "gas": 270575, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5215, + "op": "SWAP2", + "gas": 270573, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5216, + "op": "SWAP1", + "gas": 270570, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5217, + "op": "POP", + "gas": 270567, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5218, + "op": "JUMP", + "gas": 270565, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6729, + "op": "JUMPDEST", + "gas": 270557, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6730, + "op": "SWAP2", + "gas": 270556, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6731, + "op": "POP", + "gas": 270553, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6732, + "op": "DUP3", + "gas": 270551, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6733, + "op": "DUP3", + "gas": 270548, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6734, + "op": "DIV", + "gas": 270545, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 6735, + "op": "DUP5", + "gas": 270540, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6736, + "op": "EQ", + "gas": 270537, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6737, + "op": "DUP4", + "gas": 270534, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6738, + "op": "ISZERO", + "gas": 270531, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6739, + "op": "OR", + "gas": 270528, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6740, + "op": "PUSH2", + "gas": 270525, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6743, + "op": "JUMPI", + "gas": 270522, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6752, + "op": "JUMPDEST", + "gas": 270512, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6753, + "op": "POP", + "gas": 270511, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6754, + "op": "SWAP3", + "gas": 270509, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6755, + "op": "SWAP2", + "gas": 270506, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6756, + "op": "POP", + "gas": 270503, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6757, + "op": "POP", + "gas": 270501, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6758, + "op": "JUMP", + "gas": 270499, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1470, + "op": "JUMPDEST", + "gas": 270491, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1471, + "op": "SWAP1", + "gas": 270490, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1472, + "op": "POP", + "gas": 270487, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1473, + "op": "PUSH0", + "gas": 270485, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1474, + "op": "JUMPDEST", + "gas": 270483, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1475, + "op": "PUSH1", + "gas": 270482, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1477, + "op": "DUP2", + "gas": 270479, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1478, + "op": "LT", + "gas": 270476, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1479, + "op": "ISZERO", + "gas": 270473, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1480, + "op": "PUSH2", + "gas": 270470, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1483, + "op": "JUMPI", + "gas": 270467, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1484, + "op": "PUSH1", + "gas": 270457, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1486, + "op": "DUP2", + "gas": 270454, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1487, + "op": "MUL", + "gas": 270451, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1488, + "op": "DUP6", + "gas": 270446, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1489, + "op": "ADD", + "gas": 270443, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1490, + "op": "MLOAD", + "gas": 270440, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1491, + "op": "PUSH1", + "gas": 270437, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1493, + "op": "DUP3", + "gas": 270434, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1494, + "op": "MUL", + "gas": 270431, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1495, + "op": "DUP4", + "gas": 270426, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1496, + "op": "ADD", + "gas": 270423, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1497, + "op": "PUSH1", + "gas": 270420, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1499, + "op": "DUP9", + "gas": 270417, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1500, + "op": "ADD", + "gas": 270414, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1501, + "op": "ADD", + "gas": 270411, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1502, + "op": "MSTORE", + "gas": 270408, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1503, + "op": "DUP1", + "gas": 270405, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1504, + "op": "DUP1", + "gas": 270402, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1505, + "op": "PUSH1", + "gas": 270399, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1507, + "op": "ADD", + "gas": 270396, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1508, + "op": "SWAP2", + "gas": 270393, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1509, + "op": "POP", + "gas": 270390, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1510, + "op": "POP", + "gas": 270388, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1511, + "op": "PUSH2", + "gas": 270386, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1514, + "op": "JUMP", + "gas": 270383, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1474, + "op": "JUMPDEST", + "gas": 270375, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1475, + "op": "PUSH1", + "gas": 270374, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1477, + "op": "DUP2", + "gas": 270371, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1478, + "op": "LT", + "gas": 270368, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1479, + "op": "ISZERO", + "gas": 270365, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1480, + "op": "PUSH2", + "gas": 270362, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1483, + "op": "JUMPI", + "gas": 270359, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1484, + "op": "PUSH1", + "gas": 270349, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1486, + "op": "DUP2", + "gas": 270346, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1487, + "op": "MUL", + "gas": 270343, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1488, + "op": "DUP6", + "gas": 270338, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1489, + "op": "ADD", + "gas": 270335, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1490, + "op": "MLOAD", + "gas": 270332, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1491, + "op": "PUSH1", + "gas": 270329, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1493, + "op": "DUP3", + "gas": 270326, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1494, + "op": "MUL", + "gas": 270323, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1495, + "op": "DUP4", + "gas": 270318, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1496, + "op": "ADD", + "gas": 270315, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1497, + "op": "PUSH1", + "gas": 270312, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1499, + "op": "DUP9", + "gas": 270309, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1500, + "op": "ADD", + "gas": 270306, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1501, + "op": "ADD", + "gas": 270303, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1502, + "op": "MSTORE", + "gas": 270300, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1503, + "op": "DUP1", + "gas": 270297, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1504, + "op": "DUP1", + "gas": 270294, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1505, + "op": "PUSH1", + "gas": 270291, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1507, + "op": "ADD", + "gas": 270288, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1508, + "op": "SWAP2", + "gas": 270285, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1509, + "op": "POP", + "gas": 270282, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1510, + "op": "POP", + "gas": 270280, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1511, + "op": "PUSH2", + "gas": 270278, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1514, + "op": "JUMP", + "gas": 270275, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1474, + "op": "JUMPDEST", + "gas": 270267, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1475, + "op": "PUSH1", + "gas": 270266, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1477, + "op": "DUP2", + "gas": 270263, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1478, + "op": "LT", + "gas": 270260, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1479, + "op": "ISZERO", + "gas": 270257, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1480, + "op": "PUSH2", + "gas": 270254, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1483, + "op": "JUMPI", + "gas": 270251, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1515, + "op": "JUMPDEST", + "gas": 270241, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1516, + "op": "POP", + "gas": 270240, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1517, + "op": "PUSH0", + "gas": 270238, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1518, + "op": "JUMPDEST", + "gas": 270236, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1519, + "op": "PUSH1", + "gas": 270235, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1521, + "op": "DUP2", + "gas": 270232, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1522, + "op": "LT", + "gas": 270229, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1523, + "op": "ISZERO", + "gas": 270226, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1524, + "op": "PUSH2", + "gas": 270223, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1527, + "op": "JUMPI", + "gas": 270220, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1528, + "op": "PUSH1", + "gas": 270210, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1530, + "op": "DUP2", + "gas": 270207, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1531, + "op": "MUL", + "gas": 270204, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1532, + "op": "DUP5", + "gas": 270199, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1533, + "op": "ADD", + "gas": 270196, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1534, + "op": "MLOAD", + "gas": 270193, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1535, + "op": "PUSH1", + "gas": 270190, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1537, + "op": "DUP3", + "gas": 270187, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1538, + "op": "MUL", + "gas": 270184, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1539, + "op": "PUSH1", + "gas": 270179, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1541, + "op": "DUP5", + "gas": 270176, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1542, + "op": "ADD", + "gas": 270173, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1543, + "op": "ADD", + "gas": 270170, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1544, + "op": "PUSH1", + "gas": 270167, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1546, + "op": "DUP9", + "gas": 270164, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1547, + "op": "ADD", + "gas": 270161, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1548, + "op": "ADD", + "gas": 270158, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1549, + "op": "MSTORE", + "gas": 270155, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1550, + "op": "DUP1", + "gas": 270152, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1551, + "op": "DUP1", + "gas": 270149, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1552, + "op": "PUSH1", + "gas": 270146, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1554, + "op": "ADD", + "gas": 270143, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1555, + "op": "SWAP2", + "gas": 270140, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1556, + "op": "POP", + "gas": 270137, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1557, + "op": "POP", + "gas": 270135, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1558, + "op": "PUSH2", + "gas": 270133, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1561, + "op": "JUMP", + "gas": 270130, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1518, + "op": "JUMPDEST", + "gas": 270122, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1519, + "op": "PUSH1", + "gas": 270121, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1521, + "op": "DUP2", + "gas": 270118, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1522, + "op": "LT", + "gas": 270115, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1523, + "op": "ISZERO", + "gas": 270112, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1524, + "op": "PUSH2", + "gas": 270109, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1527, + "op": "JUMPI", + "gas": 270106, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1528, + "op": "PUSH1", + "gas": 270096, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1530, + "op": "DUP2", + "gas": 270093, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1531, + "op": "MUL", + "gas": 270090, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1532, + "op": "DUP5", + "gas": 270085, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1533, + "op": "ADD", + "gas": 270082, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1534, + "op": "MLOAD", + "gas": 270079, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1535, + "op": "PUSH1", + "gas": 270076, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1537, + "op": "DUP3", + "gas": 270073, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1538, + "op": "MUL", + "gas": 270070, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1539, + "op": "PUSH1", + "gas": 270065, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1541, + "op": "DUP5", + "gas": 270062, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1542, + "op": "ADD", + "gas": 270059, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1543, + "op": "ADD", + "gas": 270056, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1544, + "op": "PUSH1", + "gas": 270053, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1546, + "op": "DUP9", + "gas": 270050, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1547, + "op": "ADD", + "gas": 270047, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1548, + "op": "ADD", + "gas": 270044, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1549, + "op": "MSTORE", + "gas": 270041, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1550, + "op": "DUP1", + "gas": 270038, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1551, + "op": "DUP1", + "gas": 270035, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1552, + "op": "PUSH1", + "gas": 270032, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1554, + "op": "ADD", + "gas": 270029, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1555, + "op": "SWAP2", + "gas": 270026, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1556, + "op": "POP", + "gas": 270023, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1557, + "op": "POP", + "gas": 270021, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1558, + "op": "PUSH2", + "gas": 270019, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1561, + "op": "JUMP", + "gas": 270016, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1518, + "op": "JUMPDEST", + "gas": 270008, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1519, + "op": "PUSH1", + "gas": 270007, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1521, + "op": "DUP2", + "gas": 270004, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1522, + "op": "LT", + "gas": 270001, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1523, + "op": "ISZERO", + "gas": 269998, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1524, + "op": "PUSH2", + "gas": 269995, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1527, + "op": "JUMPI", + "gas": 269992, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1528, + "op": "PUSH1", + "gas": 269982, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1530, + "op": "DUP2", + "gas": 269979, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1531, + "op": "MUL", + "gas": 269976, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1532, + "op": "DUP5", + "gas": 269971, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1533, + "op": "ADD", + "gas": 269968, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1534, + "op": "MLOAD", + "gas": 269965, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1535, + "op": "PUSH1", + "gas": 269962, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1537, + "op": "DUP3", + "gas": 269959, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1538, + "op": "MUL", + "gas": 269956, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1539, + "op": "PUSH1", + "gas": 269951, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1541, + "op": "DUP5", + "gas": 269948, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1542, + "op": "ADD", + "gas": 269945, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1543, + "op": "ADD", + "gas": 269942, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1544, + "op": "PUSH1", + "gas": 269939, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1546, + "op": "DUP9", + "gas": 269936, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1547, + "op": "ADD", + "gas": 269933, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1548, + "op": "ADD", + "gas": 269930, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1549, + "op": "MSTORE", + "gas": 269927, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1550, + "op": "DUP1", + "gas": 269924, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1551, + "op": "DUP1", + "gas": 269921, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1552, + "op": "PUSH1", + "gas": 269918, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1554, + "op": "ADD", + "gas": 269915, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1555, + "op": "SWAP2", + "gas": 269912, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1556, + "op": "POP", + "gas": 269909, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1557, + "op": "POP", + "gas": 269907, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1558, + "op": "PUSH2", + "gas": 269905, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1561, + "op": "JUMP", + "gas": 269902, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1518, + "op": "JUMPDEST", + "gas": 269894, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1519, + "op": "PUSH1", + "gas": 269893, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1521, + "op": "DUP2", + "gas": 269890, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1522, + "op": "LT", + "gas": 269887, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1523, + "op": "ISZERO", + "gas": 269884, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1524, + "op": "PUSH2", + "gas": 269881, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1527, + "op": "JUMPI", + "gas": 269878, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1528, + "op": "PUSH1", + "gas": 269868, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1530, + "op": "DUP2", + "gas": 269865, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1531, + "op": "MUL", + "gas": 269862, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1532, + "op": "DUP5", + "gas": 269857, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1533, + "op": "ADD", + "gas": 269854, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1534, + "op": "MLOAD", + "gas": 269851, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1535, + "op": "PUSH1", + "gas": 269848, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1537, + "op": "DUP3", + "gas": 269845, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1538, + "op": "MUL", + "gas": 269842, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1539, + "op": "PUSH1", + "gas": 269837, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1541, + "op": "DUP5", + "gas": 269834, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1542, + "op": "ADD", + "gas": 269831, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1543, + "op": "ADD", + "gas": 269828, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1544, + "op": "PUSH1", + "gas": 269825, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1546, + "op": "DUP9", + "gas": 269822, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1547, + "op": "ADD", + "gas": 269819, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1548, + "op": "ADD", + "gas": 269816, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1549, + "op": "MSTORE", + "gas": 269813, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1550, + "op": "DUP1", + "gas": 269810, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1551, + "op": "DUP1", + "gas": 269807, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1552, + "op": "PUSH1", + "gas": 269804, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1554, + "op": "ADD", + "gas": 269801, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1555, + "op": "SWAP2", + "gas": 269798, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1556, + "op": "POP", + "gas": 269795, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1557, + "op": "POP", + "gas": 269793, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1558, + "op": "PUSH2", + "gas": 269791, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1561, + "op": "JUMP", + "gas": 269788, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1518, + "op": "JUMPDEST", + "gas": 269780, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1519, + "op": "PUSH1", + "gas": 269779, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1521, + "op": "DUP2", + "gas": 269776, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1522, + "op": "LT", + "gas": 269773, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1523, + "op": "ISZERO", + "gas": 269770, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1524, + "op": "PUSH2", + "gas": 269767, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1527, + "op": "JUMPI", + "gas": 269764, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1562, + "op": "JUMPDEST", + "gas": 269754, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1563, + "op": "POP", + "gas": 269753, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1564, + "op": "POP", + "gas": 269751, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1565, + "op": "DUP1", + "gas": 269749, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1566, + "op": "DUP1", + "gas": 269746, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1567, + "op": "PUSH1", + "gas": 269743, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1569, + "op": "ADD", + "gas": 269740, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1570, + "op": "SWAP2", + "gas": 269737, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1571, + "op": "POP", + "gas": 269734, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1572, + "op": "POP", + "gas": 269732, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1573, + "op": "PUSH2", + "gas": 269730, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1576, + "op": "JUMP", + "gas": 269727, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1448, + "op": "JUMPDEST", + "gas": 269719, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1449, + "op": "DUP7", + "gas": 269718, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1450, + "op": "DUP2", + "gas": 269715, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1451, + "op": "LT", + "gas": 269712, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1452, + "op": "ISZERO", + "gas": 269709, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1453, + "op": "PUSH2", + "gas": 269706, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1456, + "op": "JUMPI", + "gas": 269703, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1457, + "op": "PUSH0", + "gas": 269693, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1458, + "op": "PUSH1", + "gas": 269691, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1460, + "op": "DUP3", + "gas": 269688, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1461, + "op": "PUSH2", + "gas": 269685, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1464, + "op": "SWAP2", + "gas": 269682, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1465, + "op": "SWAP1", + "gas": 269679, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1466, + "op": "PUSH2", + "gas": 269676, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1469, + "op": "JUMP", + "gas": 269673, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6694, + "op": "JUMPDEST", + "gas": 269665, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6695, + "op": "PUSH0", + "gas": 269664, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6696, + "op": "PUSH2", + "gas": 269662, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6699, + "op": "DUP3", + "gas": 269659, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6700, + "op": "PUSH2", + "gas": 269656, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6703, + "op": "JUMP", + "gas": 269653, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5210, + "op": "JUMPDEST", + "gas": 269645, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5211, + "op": "PUSH0", + "gas": 269644, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5212, + "op": "DUP2", + "gas": 269642, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5213, + "op": "SWAP1", + "gas": 269639, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5214, + "op": "POP", + "gas": 269636, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5215, + "op": "SWAP2", + "gas": 269634, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5216, + "op": "SWAP1", + "gas": 269631, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5217, + "op": "POP", + "gas": 269628, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5218, + "op": "JUMP", + "gas": 269626, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6704, + "op": "JUMPDEST", + "gas": 269618, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6705, + "op": "SWAP2", + "gas": 269617, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6706, + "op": "POP", + "gas": 269614, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6707, + "op": "PUSH2", + "gas": 269612, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6710, + "op": "DUP4", + "gas": 269609, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6711, + "op": "PUSH2", + "gas": 269606, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6714, + "op": "JUMP", + "gas": 269603, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5210, + "op": "JUMPDEST", + "gas": 269595, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5211, + "op": "PUSH0", + "gas": 269594, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5212, + "op": "DUP2", + "gas": 269592, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5213, + "op": "SWAP1", + "gas": 269589, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5214, + "op": "POP", + "gas": 269586, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5215, + "op": "SWAP2", + "gas": 269584, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5216, + "op": "SWAP1", + "gas": 269581, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5217, + "op": "POP", + "gas": 269578, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5218, + "op": "JUMP", + "gas": 269576, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6715, + "op": "JUMPDEST", + "gas": 269568, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6716, + "op": "SWAP3", + "gas": 269567, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6717, + "op": "POP", + "gas": 269564, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6718, + "op": "DUP3", + "gas": 269562, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6719, + "op": "DUP3", + "gas": 269559, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6720, + "op": "MUL", + "gas": 269556, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 6721, + "op": "PUSH2", + "gas": 269551, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6724, + "op": "DUP2", + "gas": 269548, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6725, + "op": "PUSH2", + "gas": 269545, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6728, + "op": "JUMP", + "gas": 269542, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5210, + "op": "JUMPDEST", + "gas": 269534, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5211, + "op": "PUSH0", + "gas": 269533, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5212, + "op": "DUP2", + "gas": 269531, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5213, + "op": "SWAP1", + "gas": 269528, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5214, + "op": "POP", + "gas": 269525, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5215, + "op": "SWAP2", + "gas": 269523, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5216, + "op": "SWAP1", + "gas": 269520, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5217, + "op": "POP", + "gas": 269517, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5218, + "op": "JUMP", + "gas": 269515, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6729, + "op": "JUMPDEST", + "gas": 269507, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6730, + "op": "SWAP2", + "gas": 269506, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6731, + "op": "POP", + "gas": 269503, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6732, + "op": "DUP3", + "gas": 269501, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6733, + "op": "DUP3", + "gas": 269498, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6734, + "op": "DIV", + "gas": 269495, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 6735, + "op": "DUP5", + "gas": 269490, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6736, + "op": "EQ", + "gas": 269487, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6737, + "op": "DUP4", + "gas": 269484, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6738, + "op": "ISZERO", + "gas": 269481, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6739, + "op": "OR", + "gas": 269478, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6740, + "op": "PUSH2", + "gas": 269475, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6743, + "op": "JUMPI", + "gas": 269472, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6752, + "op": "JUMPDEST", + "gas": 269462, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6753, + "op": "POP", + "gas": 269461, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6754, + "op": "SWAP3", + "gas": 269459, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6755, + "op": "SWAP2", + "gas": 269456, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6756, + "op": "POP", + "gas": 269453, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6757, + "op": "POP", + "gas": 269451, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6758, + "op": "JUMP", + "gas": 269449, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1470, + "op": "JUMPDEST", + "gas": 269441, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1471, + "op": "SWAP1", + "gas": 269440, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1472, + "op": "POP", + "gas": 269437, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1473, + "op": "PUSH0", + "gas": 269435, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1474, + "op": "JUMPDEST", + "gas": 269433, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1475, + "op": "PUSH1", + "gas": 269432, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1477, + "op": "DUP2", + "gas": 269429, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1478, + "op": "LT", + "gas": 269426, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1479, + "op": "ISZERO", + "gas": 269423, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1480, + "op": "PUSH2", + "gas": 269420, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1483, + "op": "JUMPI", + "gas": 269417, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1484, + "op": "PUSH1", + "gas": 269407, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1486, + "op": "DUP2", + "gas": 269404, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1487, + "op": "MUL", + "gas": 269401, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1488, + "op": "DUP6", + "gas": 269396, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1489, + "op": "ADD", + "gas": 269393, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1490, + "op": "MLOAD", + "gas": 269390, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1491, + "op": "PUSH1", + "gas": 269387, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1493, + "op": "DUP3", + "gas": 269384, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1494, + "op": "MUL", + "gas": 269381, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1495, + "op": "DUP4", + "gas": 269376, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1496, + "op": "ADD", + "gas": 269373, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1497, + "op": "PUSH1", + "gas": 269370, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1499, + "op": "DUP9", + "gas": 269367, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1500, + "op": "ADD", + "gas": 269364, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1501, + "op": "ADD", + "gas": 269361, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1502, + "op": "MSTORE", + "gas": 269358, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1503, + "op": "DUP1", + "gas": 269355, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1504, + "op": "DUP1", + "gas": 269352, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1505, + "op": "PUSH1", + "gas": 269349, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1507, + "op": "ADD", + "gas": 269346, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1508, + "op": "SWAP2", + "gas": 269343, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1509, + "op": "POP", + "gas": 269340, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1510, + "op": "POP", + "gas": 269338, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1511, + "op": "PUSH2", + "gas": 269336, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1514, + "op": "JUMP", + "gas": 269333, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1474, + "op": "JUMPDEST", + "gas": 269325, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1475, + "op": "PUSH1", + "gas": 269324, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1477, + "op": "DUP2", + "gas": 269321, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1478, + "op": "LT", + "gas": 269318, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1479, + "op": "ISZERO", + "gas": 269315, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1480, + "op": "PUSH2", + "gas": 269312, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1483, + "op": "JUMPI", + "gas": 269309, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1484, + "op": "PUSH1", + "gas": 269299, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1486, + "op": "DUP2", + "gas": 269296, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1487, + "op": "MUL", + "gas": 269293, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1488, + "op": "DUP6", + "gas": 269288, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1489, + "op": "ADD", + "gas": 269285, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1490, + "op": "MLOAD", + "gas": 269282, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1491, + "op": "PUSH1", + "gas": 269279, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1493, + "op": "DUP3", + "gas": 269276, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1494, + "op": "MUL", + "gas": 269273, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1495, + "op": "DUP4", + "gas": 269268, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1496, + "op": "ADD", + "gas": 269265, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1497, + "op": "PUSH1", + "gas": 269262, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1499, + "op": "DUP9", + "gas": 269259, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1500, + "op": "ADD", + "gas": 269256, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1501, + "op": "ADD", + "gas": 269253, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1502, + "op": "MSTORE", + "gas": 269250, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1503, + "op": "DUP1", + "gas": 269247, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1504, + "op": "DUP1", + "gas": 269244, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1505, + "op": "PUSH1", + "gas": 269241, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1507, + "op": "ADD", + "gas": 269238, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1508, + "op": "SWAP2", + "gas": 269235, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1509, + "op": "POP", + "gas": 269232, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1510, + "op": "POP", + "gas": 269230, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1511, + "op": "PUSH2", + "gas": 269228, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1514, + "op": "JUMP", + "gas": 269225, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1474, + "op": "JUMPDEST", + "gas": 269217, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1475, + "op": "PUSH1", + "gas": 269216, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1477, + "op": "DUP2", + "gas": 269213, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1478, + "op": "LT", + "gas": 269210, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1479, + "op": "ISZERO", + "gas": 269207, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1480, + "op": "PUSH2", + "gas": 269204, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1483, + "op": "JUMPI", + "gas": 269201, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1515, + "op": "JUMPDEST", + "gas": 269191, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1516, + "op": "POP", + "gas": 269190, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1517, + "op": "PUSH0", + "gas": 269188, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1518, + "op": "JUMPDEST", + "gas": 269186, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1519, + "op": "PUSH1", + "gas": 269185, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1521, + "op": "DUP2", + "gas": 269182, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1522, + "op": "LT", + "gas": 269179, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1523, + "op": "ISZERO", + "gas": 269176, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1524, + "op": "PUSH2", + "gas": 269173, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1527, + "op": "JUMPI", + "gas": 269170, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1528, + "op": "PUSH1", + "gas": 269160, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1530, + "op": "DUP2", + "gas": 269157, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1531, + "op": "MUL", + "gas": 269154, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1532, + "op": "DUP5", + "gas": 269149, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1533, + "op": "ADD", + "gas": 269146, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1534, + "op": "MLOAD", + "gas": 269143, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1535, + "op": "PUSH1", + "gas": 269140, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1537, + "op": "DUP3", + "gas": 269137, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1538, + "op": "MUL", + "gas": 269134, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1539, + "op": "PUSH1", + "gas": 269129, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1541, + "op": "DUP5", + "gas": 269126, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1542, + "op": "ADD", + "gas": 269123, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1543, + "op": "ADD", + "gas": 269120, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1544, + "op": "PUSH1", + "gas": 269117, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1546, + "op": "DUP9", + "gas": 269114, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1547, + "op": "ADD", + "gas": 269111, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1548, + "op": "ADD", + "gas": 269108, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1549, + "op": "MSTORE", + "gas": 269105, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1550, + "op": "DUP1", + "gas": 269102, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1551, + "op": "DUP1", + "gas": 269099, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1552, + "op": "PUSH1", + "gas": 269096, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1554, + "op": "ADD", + "gas": 269093, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1555, + "op": "SWAP2", + "gas": 269090, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1556, + "op": "POP", + "gas": 269087, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1557, + "op": "POP", + "gas": 269085, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1558, + "op": "PUSH2", + "gas": 269083, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1561, + "op": "JUMP", + "gas": 269080, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1518, + "op": "JUMPDEST", + "gas": 269072, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1519, + "op": "PUSH1", + "gas": 269071, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1521, + "op": "DUP2", + "gas": 269068, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1522, + "op": "LT", + "gas": 269065, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1523, + "op": "ISZERO", + "gas": 269062, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1524, + "op": "PUSH2", + "gas": 269059, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1527, + "op": "JUMPI", + "gas": 269056, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1528, + "op": "PUSH1", + "gas": 269046, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1530, + "op": "DUP2", + "gas": 269043, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1531, + "op": "MUL", + "gas": 269040, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1532, + "op": "DUP5", + "gas": 269035, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1533, + "op": "ADD", + "gas": 269032, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1534, + "op": "MLOAD", + "gas": 269029, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1535, + "op": "PUSH1", + "gas": 269026, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1537, + "op": "DUP3", + "gas": 269023, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1538, + "op": "MUL", + "gas": 269020, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1539, + "op": "PUSH1", + "gas": 269015, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1541, + "op": "DUP5", + "gas": 269012, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1542, + "op": "ADD", + "gas": 269009, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1543, + "op": "ADD", + "gas": 269006, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1544, + "op": "PUSH1", + "gas": 269003, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1546, + "op": "DUP9", + "gas": 269000, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1547, + "op": "ADD", + "gas": 268997, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1548, + "op": "ADD", + "gas": 268994, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1549, + "op": "MSTORE", + "gas": 268991, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1550, + "op": "DUP1", + "gas": 268988, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1551, + "op": "DUP1", + "gas": 268985, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1552, + "op": "PUSH1", + "gas": 268982, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1554, + "op": "ADD", + "gas": 268979, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1555, + "op": "SWAP2", + "gas": 268976, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1556, + "op": "POP", + "gas": 268973, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1557, + "op": "POP", + "gas": 268971, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1558, + "op": "PUSH2", + "gas": 268969, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1561, + "op": "JUMP", + "gas": 268966, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1518, + "op": "JUMPDEST", + "gas": 268958, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1519, + "op": "PUSH1", + "gas": 268957, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1521, + "op": "DUP2", + "gas": 268954, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1522, + "op": "LT", + "gas": 268951, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1523, + "op": "ISZERO", + "gas": 268948, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1524, + "op": "PUSH2", + "gas": 268945, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1527, + "op": "JUMPI", + "gas": 268942, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1528, + "op": "PUSH1", + "gas": 268932, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1530, + "op": "DUP2", + "gas": 268929, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1531, + "op": "MUL", + "gas": 268926, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1532, + "op": "DUP5", + "gas": 268921, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1533, + "op": "ADD", + "gas": 268918, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1534, + "op": "MLOAD", + "gas": 268915, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1535, + "op": "PUSH1", + "gas": 268912, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1537, + "op": "DUP3", + "gas": 268909, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1538, + "op": "MUL", + "gas": 268906, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1539, + "op": "PUSH1", + "gas": 268901, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1541, + "op": "DUP5", + "gas": 268898, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1542, + "op": "ADD", + "gas": 268895, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1543, + "op": "ADD", + "gas": 268892, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1544, + "op": "PUSH1", + "gas": 268889, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1546, + "op": "DUP9", + "gas": 268886, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1547, + "op": "ADD", + "gas": 268883, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1548, + "op": "ADD", + "gas": 268880, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1549, + "op": "MSTORE", + "gas": 268877, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1550, + "op": "DUP1", + "gas": 268874, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1551, + "op": "DUP1", + "gas": 268871, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1552, + "op": "PUSH1", + "gas": 268868, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1554, + "op": "ADD", + "gas": 268865, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1555, + "op": "SWAP2", + "gas": 268862, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1556, + "op": "POP", + "gas": 268859, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1557, + "op": "POP", + "gas": 268857, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1558, + "op": "PUSH2", + "gas": 268855, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1561, + "op": "JUMP", + "gas": 268852, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1518, + "op": "JUMPDEST", + "gas": 268844, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1519, + "op": "PUSH1", + "gas": 268843, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1521, + "op": "DUP2", + "gas": 268840, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1522, + "op": "LT", + "gas": 268837, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1523, + "op": "ISZERO", + "gas": 268834, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1524, + "op": "PUSH2", + "gas": 268831, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1527, + "op": "JUMPI", + "gas": 268828, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1528, + "op": "PUSH1", + "gas": 268818, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1530, + "op": "DUP2", + "gas": 268815, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1531, + "op": "MUL", + "gas": 268812, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1532, + "op": "DUP5", + "gas": 268807, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1533, + "op": "ADD", + "gas": 268804, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1534, + "op": "MLOAD", + "gas": 268801, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1535, + "op": "PUSH1", + "gas": 268798, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1537, + "op": "DUP3", + "gas": 268795, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1538, + "op": "MUL", + "gas": 268792, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1539, + "op": "PUSH1", + "gas": 268787, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1541, + "op": "DUP5", + "gas": 268784, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1542, + "op": "ADD", + "gas": 268781, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1543, + "op": "ADD", + "gas": 268778, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1544, + "op": "PUSH1", + "gas": 268775, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1546, + "op": "DUP9", + "gas": 268772, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1547, + "op": "ADD", + "gas": 268769, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1548, + "op": "ADD", + "gas": 268766, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1549, + "op": "MSTORE", + "gas": 268763, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1550, + "op": "DUP1", + "gas": 268760, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1551, + "op": "DUP1", + "gas": 268757, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1552, + "op": "PUSH1", + "gas": 268754, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1554, + "op": "ADD", + "gas": 268751, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1555, + "op": "SWAP2", + "gas": 268748, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1556, + "op": "POP", + "gas": 268745, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1557, + "op": "POP", + "gas": 268743, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1558, + "op": "PUSH2", + "gas": 268741, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1561, + "op": "JUMP", + "gas": 268738, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1518, + "op": "JUMPDEST", + "gas": 268730, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1519, + "op": "PUSH1", + "gas": 268729, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1521, + "op": "DUP2", + "gas": 268726, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1522, + "op": "LT", + "gas": 268723, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1523, + "op": "ISZERO", + "gas": 268720, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1524, + "op": "PUSH2", + "gas": 268717, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1527, + "op": "JUMPI", + "gas": 268714, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1562, + "op": "JUMPDEST", + "gas": 268704, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1563, + "op": "POP", + "gas": 268703, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1564, + "op": "POP", + "gas": 268701, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1565, + "op": "DUP1", + "gas": 268699, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1566, + "op": "DUP1", + "gas": 268696, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1567, + "op": "PUSH1", + "gas": 268693, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1569, + "op": "ADD", + "gas": 268690, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1570, + "op": "SWAP2", + "gas": 268687, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1571, + "op": "POP", + "gas": 268684, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1572, + "op": "POP", + "gas": 268682, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1573, + "op": "PUSH2", + "gas": 268680, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1576, + "op": "JUMP", + "gas": 268677, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1448, + "op": "JUMPDEST", + "gas": 268669, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1449, + "op": "DUP7", + "gas": 268668, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1450, + "op": "DUP2", + "gas": 268665, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1451, + "op": "LT", + "gas": 268662, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1452, + "op": "ISZERO", + "gas": 268659, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1453, + "op": "PUSH2", + "gas": 268656, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1456, + "op": "JUMPI", + "gas": 268653, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1457, + "op": "PUSH0", + "gas": 268643, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1458, + "op": "PUSH1", + "gas": 268641, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1460, + "op": "DUP3", + "gas": 268638, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1461, + "op": "PUSH2", + "gas": 268635, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1464, + "op": "SWAP2", + "gas": 268632, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1465, + "op": "SWAP1", + "gas": 268629, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1466, + "op": "PUSH2", + "gas": 268626, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1469, + "op": "JUMP", + "gas": 268623, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6694, + "op": "JUMPDEST", + "gas": 268615, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6695, + "op": "PUSH0", + "gas": 268614, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6696, + "op": "PUSH2", + "gas": 268612, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6699, + "op": "DUP3", + "gas": 268609, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6700, + "op": "PUSH2", + "gas": 268606, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6703, + "op": "JUMP", + "gas": 268603, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5210, + "op": "JUMPDEST", + "gas": 268595, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5211, + "op": "PUSH0", + "gas": 268594, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5212, + "op": "DUP2", + "gas": 268592, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5213, + "op": "SWAP1", + "gas": 268589, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5214, + "op": "POP", + "gas": 268586, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5215, + "op": "SWAP2", + "gas": 268584, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5216, + "op": "SWAP1", + "gas": 268581, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5217, + "op": "POP", + "gas": 268578, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5218, + "op": "JUMP", + "gas": 268576, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6704, + "op": "JUMPDEST", + "gas": 268568, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6705, + "op": "SWAP2", + "gas": 268567, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6706, + "op": "POP", + "gas": 268564, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6707, + "op": "PUSH2", + "gas": 268562, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6710, + "op": "DUP4", + "gas": 268559, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6711, + "op": "PUSH2", + "gas": 268556, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6714, + "op": "JUMP", + "gas": 268553, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5210, + "op": "JUMPDEST", + "gas": 268545, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5211, + "op": "PUSH0", + "gas": 268544, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5212, + "op": "DUP2", + "gas": 268542, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5213, + "op": "SWAP1", + "gas": 268539, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5214, + "op": "POP", + "gas": 268536, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5215, + "op": "SWAP2", + "gas": 268534, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5216, + "op": "SWAP1", + "gas": 268531, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5217, + "op": "POP", + "gas": 268528, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5218, + "op": "JUMP", + "gas": 268526, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6715, + "op": "JUMPDEST", + "gas": 268518, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6716, + "op": "SWAP3", + "gas": 268517, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6717, + "op": "POP", + "gas": 268514, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6718, + "op": "DUP3", + "gas": 268512, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6719, + "op": "DUP3", + "gas": 268509, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6720, + "op": "MUL", + "gas": 268506, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 6721, + "op": "PUSH2", + "gas": 268501, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6724, + "op": "DUP2", + "gas": 268498, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6725, + "op": "PUSH2", + "gas": 268495, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6728, + "op": "JUMP", + "gas": 268492, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5210, + "op": "JUMPDEST", + "gas": 268484, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5211, + "op": "PUSH0", + "gas": 268483, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5212, + "op": "DUP2", + "gas": 268481, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5213, + "op": "SWAP1", + "gas": 268478, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5214, + "op": "POP", + "gas": 268475, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5215, + "op": "SWAP2", + "gas": 268473, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5216, + "op": "SWAP1", + "gas": 268470, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5217, + "op": "POP", + "gas": 268467, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5218, + "op": "JUMP", + "gas": 268465, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6729, + "op": "JUMPDEST", + "gas": 268457, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6730, + "op": "SWAP2", + "gas": 268456, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6731, + "op": "POP", + "gas": 268453, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6732, + "op": "DUP3", + "gas": 268451, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6733, + "op": "DUP3", + "gas": 268448, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6734, + "op": "DIV", + "gas": 268445, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 6735, + "op": "DUP5", + "gas": 268440, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6736, + "op": "EQ", + "gas": 268437, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6737, + "op": "DUP4", + "gas": 268434, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6738, + "op": "ISZERO", + "gas": 268431, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6739, + "op": "OR", + "gas": 268428, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6740, + "op": "PUSH2", + "gas": 268425, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6743, + "op": "JUMPI", + "gas": 268422, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6752, + "op": "JUMPDEST", + "gas": 268412, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6753, + "op": "POP", + "gas": 268411, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6754, + "op": "SWAP3", + "gas": 268409, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6755, + "op": "SWAP2", + "gas": 268406, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6756, + "op": "POP", + "gas": 268403, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6757, + "op": "POP", + "gas": 268401, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6758, + "op": "JUMP", + "gas": 268399, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1470, + "op": "JUMPDEST", + "gas": 268391, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1471, + "op": "SWAP1", + "gas": 268390, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1472, + "op": "POP", + "gas": 268387, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1473, + "op": "PUSH0", + "gas": 268385, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1474, + "op": "JUMPDEST", + "gas": 268383, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1475, + "op": "PUSH1", + "gas": 268382, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1477, + "op": "DUP2", + "gas": 268379, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1478, + "op": "LT", + "gas": 268376, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1479, + "op": "ISZERO", + "gas": 268373, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1480, + "op": "PUSH2", + "gas": 268370, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1483, + "op": "JUMPI", + "gas": 268367, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1484, + "op": "PUSH1", + "gas": 268357, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1486, + "op": "DUP2", + "gas": 268354, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1487, + "op": "MUL", + "gas": 268351, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1488, + "op": "DUP6", + "gas": 268346, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1489, + "op": "ADD", + "gas": 268343, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1490, + "op": "MLOAD", + "gas": 268340, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1491, + "op": "PUSH1", + "gas": 268337, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1493, + "op": "DUP3", + "gas": 268334, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1494, + "op": "MUL", + "gas": 268331, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1495, + "op": "DUP4", + "gas": 268326, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1496, + "op": "ADD", + "gas": 268323, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1497, + "op": "PUSH1", + "gas": 268320, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1499, + "op": "DUP9", + "gas": 268317, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1500, + "op": "ADD", + "gas": 268314, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1501, + "op": "ADD", + "gas": 268311, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1502, + "op": "MSTORE", + "gas": 268308, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1503, + "op": "DUP1", + "gas": 268305, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1504, + "op": "DUP1", + "gas": 268302, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1505, + "op": "PUSH1", + "gas": 268299, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1507, + "op": "ADD", + "gas": 268296, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1508, + "op": "SWAP2", + "gas": 268293, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1509, + "op": "POP", + "gas": 268290, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1510, + "op": "POP", + "gas": 268288, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1511, + "op": "PUSH2", + "gas": 268286, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1514, + "op": "JUMP", + "gas": 268283, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1474, + "op": "JUMPDEST", + "gas": 268275, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1475, + "op": "PUSH1", + "gas": 268274, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1477, + "op": "DUP2", + "gas": 268271, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1478, + "op": "LT", + "gas": 268268, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1479, + "op": "ISZERO", + "gas": 268265, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1480, + "op": "PUSH2", + "gas": 268262, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1483, + "op": "JUMPI", + "gas": 268259, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1484, + "op": "PUSH1", + "gas": 268249, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1486, + "op": "DUP2", + "gas": 268246, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1487, + "op": "MUL", + "gas": 268243, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1488, + "op": "DUP6", + "gas": 268238, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1489, + "op": "ADD", + "gas": 268235, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1490, + "op": "MLOAD", + "gas": 268232, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1491, + "op": "PUSH1", + "gas": 268229, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1493, + "op": "DUP3", + "gas": 268226, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1494, + "op": "MUL", + "gas": 268223, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1495, + "op": "DUP4", + "gas": 268218, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1496, + "op": "ADD", + "gas": 268215, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1497, + "op": "PUSH1", + "gas": 268212, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1499, + "op": "DUP9", + "gas": 268209, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1500, + "op": "ADD", + "gas": 268206, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1501, + "op": "ADD", + "gas": 268203, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1502, + "op": "MSTORE", + "gas": 268200, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1503, + "op": "DUP1", + "gas": 268197, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1504, + "op": "DUP1", + "gas": 268194, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1505, + "op": "PUSH1", + "gas": 268191, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1507, + "op": "ADD", + "gas": 268188, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1508, + "op": "SWAP2", + "gas": 268185, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1509, + "op": "POP", + "gas": 268182, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1510, + "op": "POP", + "gas": 268180, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1511, + "op": "PUSH2", + "gas": 268178, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1514, + "op": "JUMP", + "gas": 268175, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1474, + "op": "JUMPDEST", + "gas": 268167, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1475, + "op": "PUSH1", + "gas": 268166, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1477, + "op": "DUP2", + "gas": 268163, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1478, + "op": "LT", + "gas": 268160, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1479, + "op": "ISZERO", + "gas": 268157, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1480, + "op": "PUSH2", + "gas": 268154, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1483, + "op": "JUMPI", + "gas": 268151, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1515, + "op": "JUMPDEST", + "gas": 268141, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1516, + "op": "POP", + "gas": 268140, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1517, + "op": "PUSH0", + "gas": 268138, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1518, + "op": "JUMPDEST", + "gas": 268136, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1519, + "op": "PUSH1", + "gas": 268135, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1521, + "op": "DUP2", + "gas": 268132, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1522, + "op": "LT", + "gas": 268129, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1523, + "op": "ISZERO", + "gas": 268126, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1524, + "op": "PUSH2", + "gas": 268123, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1527, + "op": "JUMPI", + "gas": 268120, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1528, + "op": "PUSH1", + "gas": 268110, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1530, + "op": "DUP2", + "gas": 268107, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1531, + "op": "MUL", + "gas": 268104, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1532, + "op": "DUP5", + "gas": 268099, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1533, + "op": "ADD", + "gas": 268096, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1534, + "op": "MLOAD", + "gas": 268093, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1535, + "op": "PUSH1", + "gas": 268090, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1537, + "op": "DUP3", + "gas": 268087, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1538, + "op": "MUL", + "gas": 268084, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1539, + "op": "PUSH1", + "gas": 268079, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1541, + "op": "DUP5", + "gas": 268076, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1542, + "op": "ADD", + "gas": 268073, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1543, + "op": "ADD", + "gas": 268070, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1544, + "op": "PUSH1", + "gas": 268067, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1546, + "op": "DUP9", + "gas": 268064, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1547, + "op": "ADD", + "gas": 268061, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1548, + "op": "ADD", + "gas": 268058, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1549, + "op": "MSTORE", + "gas": 268055, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1550, + "op": "DUP1", + "gas": 268052, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1551, + "op": "DUP1", + "gas": 268049, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1552, + "op": "PUSH1", + "gas": 268046, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1554, + "op": "ADD", + "gas": 268043, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1555, + "op": "SWAP2", + "gas": 268040, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1556, + "op": "POP", + "gas": 268037, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1557, + "op": "POP", + "gas": 268035, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1558, + "op": "PUSH2", + "gas": 268033, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1561, + "op": "JUMP", + "gas": 268030, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1518, + "op": "JUMPDEST", + "gas": 268022, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1519, + "op": "PUSH1", + "gas": 268021, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1521, + "op": "DUP2", + "gas": 268018, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1522, + "op": "LT", + "gas": 268015, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1523, + "op": "ISZERO", + "gas": 268012, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1524, + "op": "PUSH2", + "gas": 268009, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1527, + "op": "JUMPI", + "gas": 268006, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1528, + "op": "PUSH1", + "gas": 267996, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1530, + "op": "DUP2", + "gas": 267993, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1531, + "op": "MUL", + "gas": 267990, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1532, + "op": "DUP5", + "gas": 267985, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1533, + "op": "ADD", + "gas": 267982, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1534, + "op": "MLOAD", + "gas": 267979, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1535, + "op": "PUSH1", + "gas": 267976, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1537, + "op": "DUP3", + "gas": 267973, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1538, + "op": "MUL", + "gas": 267970, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1539, + "op": "PUSH1", + "gas": 267965, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1541, + "op": "DUP5", + "gas": 267962, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1542, + "op": "ADD", + "gas": 267959, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1543, + "op": "ADD", + "gas": 267956, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1544, + "op": "PUSH1", + "gas": 267953, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1546, + "op": "DUP9", + "gas": 267950, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1547, + "op": "ADD", + "gas": 267947, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1548, + "op": "ADD", + "gas": 267944, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1549, + "op": "MSTORE", + "gas": 267941, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1550, + "op": "DUP1", + "gas": 267938, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1551, + "op": "DUP1", + "gas": 267935, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1552, + "op": "PUSH1", + "gas": 267932, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1554, + "op": "ADD", + "gas": 267929, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1555, + "op": "SWAP2", + "gas": 267926, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1556, + "op": "POP", + "gas": 267923, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1557, + "op": "POP", + "gas": 267921, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1558, + "op": "PUSH2", + "gas": 267919, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1561, + "op": "JUMP", + "gas": 267916, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1518, + "op": "JUMPDEST", + "gas": 267908, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1519, + "op": "PUSH1", + "gas": 267907, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1521, + "op": "DUP2", + "gas": 267904, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1522, + "op": "LT", + "gas": 267901, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1523, + "op": "ISZERO", + "gas": 267898, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1524, + "op": "PUSH2", + "gas": 267895, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1527, + "op": "JUMPI", + "gas": 267892, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1528, + "op": "PUSH1", + "gas": 267882, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1530, + "op": "DUP2", + "gas": 267879, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1531, + "op": "MUL", + "gas": 267876, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1532, + "op": "DUP5", + "gas": 267871, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1533, + "op": "ADD", + "gas": 267868, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1534, + "op": "MLOAD", + "gas": 267865, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1535, + "op": "PUSH1", + "gas": 267862, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1537, + "op": "DUP3", + "gas": 267859, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1538, + "op": "MUL", + "gas": 267856, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1539, + "op": "PUSH1", + "gas": 267851, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1541, + "op": "DUP5", + "gas": 267848, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1542, + "op": "ADD", + "gas": 267845, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1543, + "op": "ADD", + "gas": 267842, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1544, + "op": "PUSH1", + "gas": 267839, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1546, + "op": "DUP9", + "gas": 267836, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1547, + "op": "ADD", + "gas": 267833, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1548, + "op": "ADD", + "gas": 267830, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1549, + "op": "MSTORE", + "gas": 267827, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1550, + "op": "DUP1", + "gas": 267824, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1551, + "op": "DUP1", + "gas": 267821, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1552, + "op": "PUSH1", + "gas": 267818, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1554, + "op": "ADD", + "gas": 267815, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1555, + "op": "SWAP2", + "gas": 267812, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1556, + "op": "POP", + "gas": 267809, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1557, + "op": "POP", + "gas": 267807, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1558, + "op": "PUSH2", + "gas": 267805, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1561, + "op": "JUMP", + "gas": 267802, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1518, + "op": "JUMPDEST", + "gas": 267794, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1519, + "op": "PUSH1", + "gas": 267793, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1521, + "op": "DUP2", + "gas": 267790, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1522, + "op": "LT", + "gas": 267787, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1523, + "op": "ISZERO", + "gas": 267784, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1524, + "op": "PUSH2", + "gas": 267781, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1527, + "op": "JUMPI", + "gas": 267778, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1528, + "op": "PUSH1", + "gas": 267768, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1530, + "op": "DUP2", + "gas": 267765, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1531, + "op": "MUL", + "gas": 267762, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1532, + "op": "DUP5", + "gas": 267757, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1533, + "op": "ADD", + "gas": 267754, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1534, + "op": "MLOAD", + "gas": 267751, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1535, + "op": "PUSH1", + "gas": 267748, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1537, + "op": "DUP3", + "gas": 267745, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1538, + "op": "MUL", + "gas": 267742, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1539, + "op": "PUSH1", + "gas": 267737, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1541, + "op": "DUP5", + "gas": 267734, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1542, + "op": "ADD", + "gas": 267731, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1543, + "op": "ADD", + "gas": 267728, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1544, + "op": "PUSH1", + "gas": 267725, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1546, + "op": "DUP9", + "gas": 267722, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1547, + "op": "ADD", + "gas": 267719, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1548, + "op": "ADD", + "gas": 267716, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1549, + "op": "MSTORE", + "gas": 267713, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1550, + "op": "DUP1", + "gas": 267710, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1551, + "op": "DUP1", + "gas": 267707, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1552, + "op": "PUSH1", + "gas": 267704, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1554, + "op": "ADD", + "gas": 267701, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1555, + "op": "SWAP2", + "gas": 267698, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1556, + "op": "POP", + "gas": 267695, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1557, + "op": "POP", + "gas": 267693, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1558, + "op": "PUSH2", + "gas": 267691, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1561, + "op": "JUMP", + "gas": 267688, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1518, + "op": "JUMPDEST", + "gas": 267680, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1519, + "op": "PUSH1", + "gas": 267679, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1521, + "op": "DUP2", + "gas": 267676, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1522, + "op": "LT", + "gas": 267673, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1523, + "op": "ISZERO", + "gas": 267670, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1524, + "op": "PUSH2", + "gas": 267667, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1527, + "op": "JUMPI", + "gas": 267664, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1562, + "op": "JUMPDEST", + "gas": 267654, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1563, + "op": "POP", + "gas": 267653, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1564, + "op": "POP", + "gas": 267651, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1565, + "op": "DUP1", + "gas": 267649, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1566, + "op": "DUP1", + "gas": 267646, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1567, + "op": "PUSH1", + "gas": 267643, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1569, + "op": "ADD", + "gas": 267640, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1570, + "op": "SWAP2", + "gas": 267637, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1571, + "op": "POP", + "gas": 267634, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1572, + "op": "POP", + "gas": 267632, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1573, + "op": "PUSH2", + "gas": 267630, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1576, + "op": "JUMP", + "gas": 267627, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1448, + "op": "JUMPDEST", + "gas": 267619, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1449, + "op": "DUP7", + "gas": 267618, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1450, + "op": "DUP2", + "gas": 267615, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1451, + "op": "LT", + "gas": 267612, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1452, + "op": "ISZERO", + "gas": 267609, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1453, + "op": "PUSH2", + "gas": 267606, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1456, + "op": "JUMPI", + "gas": 267603, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1577, + "op": "JUMPDEST", + "gas": 267593, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1578, + "op": "POP", + "gas": 267592, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1579, + "op": "PUSH0", + "gas": 267590, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1580, + "op": "DUP1", + "gas": 267588, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1581, + "op": "PUSH1", + "gas": 267585, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1583, + "op": "PUSH20", + "gas": 267582, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1604, + "op": "AND", + "gas": 267579, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1605, + "op": "PUSH3", + "gas": 267576, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1609, + "op": "DUP7", + "gas": 267573, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1610, + "op": "PUSH1", + "gas": 267570, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1612, + "op": "MLOAD", + "gas": 267567, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1613, + "op": "PUSH2", + "gas": 267564, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1616, + "op": "SWAP2", + "gas": 267561, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1617, + "op": "SWAP1", + "gas": 267558, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1618, + "op": "PUSH2", + "gas": 267555, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1621, + "op": "JUMP", + "gas": 267552, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5617, + "op": "JUMPDEST", + "gas": 267544, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5618, + "op": "PUSH0", + "gas": 267543, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5619, + "op": "PUSH2", + "gas": 267541, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5622, + "op": "DUP3", + "gas": 267538, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5623, + "op": "DUP5", + "gas": 267535, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5624, + "op": "PUSH2", + "gas": 267532, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5627, + "op": "JUMP", + "gas": 267529, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5569, + "op": "JUMPDEST", + "gas": 267521, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5570, + "op": "PUSH0", + "gas": 267520, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5571, + "op": "PUSH2", + "gas": 267518, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5574, + "op": "DUP3", + "gas": 267515, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5575, + "op": "PUSH2", + "gas": 267512, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5578, + "op": "JUMP", + "gas": 267509, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5082, + "op": "JUMPDEST", + "gas": 267501, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5083, + "op": "PUSH0", + "gas": 267500, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5084, + "op": "DUP2", + "gas": 267498, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5085, + "op": "MLOAD", + "gas": 267495, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5086, + "op": "SWAP1", + "gas": 267492, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5087, + "op": "POP", + "gas": 267489, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5088, + "op": "SWAP2", + "gas": 267487, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5089, + "op": "SWAP1", + "gas": 267484, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5090, + "op": "POP", + "gas": 267481, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5091, + "op": "JUMP", + "gas": 267479, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5579, + "op": "JUMPDEST", + "gas": 267471, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5580, + "op": "PUSH2", + "gas": 267470, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5583, + "op": "DUP2", + "gas": 267467, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5584, + "op": "DUP6", + "gas": 267464, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5585, + "op": "PUSH2", + "gas": 267461, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5588, + "op": "JUMP", + "gas": 267458, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5559, + "op": "JUMPDEST", + "gas": 267450, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5560, + "op": "PUSH0", + "gas": 267449, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5561, + "op": "DUP2", + "gas": 267447, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5562, + "op": "SWAP1", + "gas": 267444, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5563, + "op": "POP", + "gas": 267441, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5564, + "op": "SWAP3", + "gas": 267439, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5565, + "op": "SWAP2", + "gas": 267436, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5566, + "op": "POP", + "gas": 267433, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5567, + "op": "POP", + "gas": 267431, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5568, + "op": "JUMP", + "gas": 267429, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5589, + "op": "JUMPDEST", + "gas": 267421, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5590, + "op": "SWAP4", + "gas": 267420, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5591, + "op": "POP", + "gas": 267417, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5592, + "op": "PUSH2", + "gas": 267415, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5595, + "op": "DUP2", + "gas": 267412, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5596, + "op": "DUP6", + "gas": 267409, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5597, + "op": "PUSH1", + "gas": 267406, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5599, + "op": "DUP7", + "gas": 267403, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5600, + "op": "ADD", + "gas": 267400, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5601, + "op": "PUSH2", + "gas": 267397, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5604, + "op": "JUMP", + "gas": 267394, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5108, + "op": "JUMPDEST", + "gas": 267386, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5109, + "op": "DUP3", + "gas": 267385, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5110, + "op": "DUP2", + "gas": 267382, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5111, + "op": "DUP4", + "gas": 267379, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5112, + "op": "opcode 0x5e not defined", + "gas": 267376, + "gasCost": 190, + "depth": 1 + }, + { + "pc": 5113, + "op": "PUSH0", + "gas": 267186, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5114, + "op": "DUP4", + "gas": 267184, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5115, + "op": "DUP4", + "gas": 267181, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5116, + "op": "ADD", + "gas": 267178, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5117, + "op": "MSTORE", + "gas": 267175, + "gasCost": 7, + "depth": 1 + }, + { + "pc": 5118, + "op": "POP", + "gas": 267168, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5119, + "op": "POP", + "gas": 267166, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5120, + "op": "POP", + "gas": 267164, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5121, + "op": "JUMP", + "gas": 267162, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5605, + "op": "JUMPDEST", + "gas": 267154, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5606, + "op": "DUP1", + "gas": 267153, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5607, + "op": "DUP5", + "gas": 267150, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5608, + "op": "ADD", + "gas": 267147, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5609, + "op": "SWAP2", + "gas": 267144, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5610, + "op": "POP", + "gas": 267141, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5611, + "op": "POP", + "gas": 267139, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5612, + "op": "SWAP3", + "gas": 267137, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5613, + "op": "SWAP2", + "gas": 267134, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5614, + "op": "POP", + "gas": 267131, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5615, + "op": "POP", + "gas": 267129, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5616, + "op": "JUMP", + "gas": 267127, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5628, + "op": "JUMPDEST", + "gas": 267119, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5629, + "op": "SWAP2", + "gas": 267118, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5630, + "op": "POP", + "gas": 267115, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5631, + "op": "DUP2", + "gas": 267113, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5632, + "op": "SWAP1", + "gas": 267110, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5633, + "op": "POP", + "gas": 267107, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5634, + "op": "SWAP3", + "gas": 267105, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5635, + "op": "SWAP2", + "gas": 267102, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5636, + "op": "POP", + "gas": 267099, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5637, + "op": "POP", + "gas": 267097, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5638, + "op": "JUMP", + "gas": 267095, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1622, + "op": "JUMPDEST", + "gas": 267087, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1623, + "op": "PUSH0", + "gas": 267086, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1624, + "op": "PUSH1", + "gas": 267084, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1626, + "op": "MLOAD", + "gas": 267081, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1627, + "op": "DUP1", + "gas": 267078, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1628, + "op": "DUP4", + "gas": 267075, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1629, + "op": "SUB", + "gas": 267072, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1630, + "op": "DUP2", + "gas": 267069, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1631, + "op": "DUP7", + "gas": 267066, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1632, + "op": "DUP7", + "gas": 267063, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1633, + "op": "STATICCALL", + "gas": 267060, + "gasCost": 262889, + "depth": 1 + }, + { + "pc": 1634, + "op": "SWAP3", + "gas": 51960, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1635, + "op": "POP", + "gas": 51957, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1636, + "op": "POP", + "gas": 51955, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1637, + "op": "POP", + "gas": 51953, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1638, + "op": "RETURNDATASIZE", + "gas": 51951, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1639, + "op": "DUP1", + "gas": 51949, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1640, + "op": "PUSH0", + "gas": 51946, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1641, + "op": "DUP2", + "gas": 51944, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1642, + "op": "EQ", + "gas": 51941, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1643, + "op": "PUSH2", + "gas": 51938, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1646, + "op": "JUMPI", + "gas": 51935, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1647, + "op": "PUSH1", + "gas": 51925, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1649, + "op": "MLOAD", + "gas": 51922, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1650, + "op": "SWAP2", + "gas": 51919, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1651, + "op": "POP", + "gas": 51916, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1652, + "op": "PUSH1", + "gas": 51914, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1654, + "op": "NOT", + "gas": 51911, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1655, + "op": "PUSH1", + "gas": 51908, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1657, + "op": "RETURNDATASIZE", + "gas": 51905, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1658, + "op": "ADD", + "gas": 51903, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1659, + "op": "AND", + "gas": 51900, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1660, + "op": "DUP3", + "gas": 51897, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1661, + "op": "ADD", + "gas": 51894, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1662, + "op": "PUSH1", + "gas": 51891, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1664, + "op": "MSTORE", + "gas": 51888, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1665, + "op": "RETURNDATASIZE", + "gas": 51885, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1666, + "op": "DUP3", + "gas": 51883, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1667, + "op": "MSTORE", + "gas": 51880, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1668, + "op": "RETURNDATASIZE", + "gas": 51877, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1669, + "op": "PUSH0", + "gas": 51875, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1670, + "op": "PUSH1", + "gas": 51873, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1672, + "op": "DUP5", + "gas": 51870, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1673, + "op": "ADD", + "gas": 51867, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1674, + "op": "RETURNDATACOPY", + "gas": 51864, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 1675, + "op": "PUSH2", + "gas": 51858, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1678, + "op": "JUMP", + "gas": 51855, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1684, + "op": "JUMPDEST", + "gas": 51847, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1685, + "op": "POP", + "gas": 51846, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1686, + "op": "SWAP2", + "gas": 51844, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1687, + "op": "POP", + "gas": 51841, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1688, + "op": "SWAP2", + "gas": 51839, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1689, + "op": "POP", + "gas": 51836, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1690, + "op": "DUP2", + "gas": 51834, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1691, + "op": "PUSH0", + "gas": 51831, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1692, + "op": "DUP8", + "gas": 51829, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1693, + "op": "PUSH1", + "gas": 51826, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1695, + "op": "MLOAD", + "gas": 51823, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1696, + "op": "PUSH2", + "gas": 51820, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1699, + "op": "SWAP2", + "gas": 51817, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1700, + "op": "SWAP1", + "gas": 51814, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1701, + "op": "PUSH2", + "gas": 51811, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1704, + "op": "JUMP", + "gas": 51808, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5639, + "op": "JUMPDEST", + "gas": 51800, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5640, + "op": "PUSH0", + "gas": 51799, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5641, + "op": "PUSH2", + "gas": 51797, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5644, + "op": "DUP3", + "gas": 51794, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5645, + "op": "DUP5", + "gas": 51791, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5646, + "op": "PUSH2", + "gas": 51788, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5649, + "op": "JUMP", + "gas": 51785, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5478, + "op": "JUMPDEST", + "gas": 51777, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5479, + "op": "PUSH0", + "gas": 51776, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5480, + "op": "PUSH2", + "gas": 51774, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5483, + "op": "DUP3", + "gas": 51771, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5484, + "op": "PUSH2", + "gas": 51768, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5487, + "op": "JUMP", + "gas": 51765, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5468, + "op": "JUMPDEST", + "gas": 51757, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5469, + "op": "PUSH0", + "gas": 51756, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5470, + "op": "DUP2", + "gas": 51754, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5471, + "op": "MLOAD", + "gas": 51751, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5472, + "op": "SWAP1", + "gas": 51748, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5473, + "op": "POP", + "gas": 51745, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5474, + "op": "SWAP2", + "gas": 51743, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5475, + "op": "SWAP1", + "gas": 51740, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5476, + "op": "POP", + "gas": 51737, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5477, + "op": "JUMP", + "gas": 51735, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5488, + "op": "JUMPDEST", + "gas": 51727, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5489, + "op": "PUSH2", + "gas": 51726, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5492, + "op": "DUP2", + "gas": 51723, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5493, + "op": "DUP6", + "gas": 51720, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5494, + "op": "PUSH2", + "gas": 51717, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5497, + "op": "JUMP", + "gas": 51714, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5384, + "op": "JUMPDEST", + "gas": 51706, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5385, + "op": "PUSH0", + "gas": 51705, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5386, + "op": "DUP2", + "gas": 51703, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5387, + "op": "SWAP1", + "gas": 51700, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5388, + "op": "POP", + "gas": 51697, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5389, + "op": "SWAP3", + "gas": 51695, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5390, + "op": "SWAP2", + "gas": 51692, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5391, + "op": "POP", + "gas": 51689, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5392, + "op": "POP", + "gas": 51687, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5393, + "op": "JUMP", + "gas": 51685, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5498, + "op": "JUMPDEST", + "gas": 51677, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5499, + "op": "SWAP4", + "gas": 51676, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5500, + "op": "POP", + "gas": 51673, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5501, + "op": "PUSH2", + "gas": 51671, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5504, + "op": "DUP2", + "gas": 51668, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5505, + "op": "DUP6", + "gas": 51665, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5506, + "op": "PUSH1", + "gas": 51662, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5508, + "op": "DUP7", + "gas": 51659, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5509, + "op": "ADD", + "gas": 51656, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5510, + "op": "PUSH2", + "gas": 51653, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5513, + "op": "JUMP", + "gas": 51650, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5108, + "op": "JUMPDEST", + "gas": 51642, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5109, + "op": "DUP3", + "gas": 51641, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5110, + "op": "DUP2", + "gas": 51638, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5111, + "op": "DUP4", + "gas": 51635, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5112, + "op": "opcode 0x5e not defined", + "gas": 51632, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 5113, + "op": "PUSH0", + "gas": 51626, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5114, + "op": "DUP4", + "gas": 51624, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5115, + "op": "DUP4", + "gas": 51621, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5116, + "op": "ADD", + "gas": 51618, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5117, + "op": "MSTORE", + "gas": 51615, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5118, + "op": "POP", + "gas": 51612, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5119, + "op": "POP", + "gas": 51610, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5120, + "op": "POP", + "gas": 51608, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5121, + "op": "JUMP", + "gas": 51606, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5514, + "op": "JUMPDEST", + "gas": 51598, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5515, + "op": "DUP1", + "gas": 51597, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5516, + "op": "DUP5", + "gas": 51594, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5517, + "op": "ADD", + "gas": 51591, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5518, + "op": "SWAP2", + "gas": 51588, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5519, + "op": "POP", + "gas": 51585, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5520, + "op": "POP", + "gas": 51583, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5521, + "op": "SWAP3", + "gas": 51581, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5522, + "op": "SWAP2", + "gas": 51578, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5523, + "op": "POP", + "gas": 51575, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5524, + "op": "POP", + "gas": 51573, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5525, + "op": "JUMP", + "gas": 51571, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5650, + "op": "JUMPDEST", + "gas": 51563, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5651, + "op": "SWAP2", + "gas": 51562, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5652, + "op": "POP", + "gas": 51559, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5653, + "op": "DUP2", + "gas": 51557, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5654, + "op": "SWAP1", + "gas": 51554, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5655, + "op": "POP", + "gas": 51551, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5656, + "op": "SWAP3", + "gas": 51549, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5657, + "op": "SWAP2", + "gas": 51546, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5658, + "op": "POP", + "gas": 51543, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5659, + "op": "POP", + "gas": 51541, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5660, + "op": "JUMP", + "gas": 51539, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1705, + "op": "JUMPDEST", + "gas": 51531, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1706, + "op": "SWAP1", + "gas": 51530, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1707, + "op": "DUP2", + "gas": 51527, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1708, + "op": "MSTORE", + "gas": 51524, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1709, + "op": "PUSH1", + "gas": 51521, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1711, + "op": "ADD", + "gas": 51518, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1712, + "op": "PUSH1", + "gas": 51515, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1714, + "op": "MLOAD", + "gas": 51512, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1715, + "op": "DUP1", + "gas": 51509, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1716, + "op": "SWAP2", + "gas": 51506, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1717, + "op": "SUB", + "gas": 51503, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1718, + "op": "SWAP1", + "gas": 51500, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1719, + "op": "SHA3", + "gas": 51497, + "gasCost": 42, + "depth": 1 + }, + { + "pc": 1720, + "op": "PUSH0", + "gas": 51455, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1721, + "op": "PUSH2", + "gas": 51453, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1724, + "op": "EXP", + "gas": 51450, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1725, + "op": "DUP2", + "gas": 51440, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1726, + "op": "SLOAD", + "gas": 51437, + "gasCost": 2100, + "depth": 1 + }, + { + "pc": 1727, + "op": "DUP2", + "gas": 49337, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1728, + "op": "PUSH1", + "gas": 49334, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1730, + "op": "MUL", + "gas": 49331, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1731, + "op": "NOT", + "gas": 49326, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1732, + "op": "AND", + "gas": 49323, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1733, + "op": "SWAP1", + "gas": 49320, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1734, + "op": "DUP4", + "gas": 49317, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1735, + "op": "ISZERO", + "gas": 49314, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1736, + "op": "ISZERO", + "gas": 49311, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1737, + "op": "MUL", + "gas": 49308, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 1738, + "op": "OR", + "gas": 49303, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1739, + "op": "SWAP1", + "gas": 49300, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1740, + "op": "SSTORE", + "gas": 49297, + "gasCost": 20000, + "depth": 1 + }, + { + "pc": 1741, + "op": "POP", + "gas": 29297, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1742, + "op": "DUP1", + "gas": 29295, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1743, + "op": "PUSH1", + "gas": 29292, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1745, + "op": "DUP8", + "gas": 29289, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1746, + "op": "PUSH1", + "gas": 29286, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1748, + "op": "MLOAD", + "gas": 29283, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1749, + "op": "PUSH2", + "gas": 29280, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1752, + "op": "SWAP2", + "gas": 29277, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1753, + "op": "SWAP1", + "gas": 29274, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1754, + "op": "PUSH2", + "gas": 29271, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1757, + "op": "JUMP", + "gas": 29268, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5639, + "op": "JUMPDEST", + "gas": 29260, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5640, + "op": "PUSH0", + "gas": 29259, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5641, + "op": "PUSH2", + "gas": 29257, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5644, + "op": "DUP3", + "gas": 29254, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5645, + "op": "DUP5", + "gas": 29251, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5646, + "op": "PUSH2", + "gas": 29248, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5649, + "op": "JUMP", + "gas": 29245, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5478, + "op": "JUMPDEST", + "gas": 29237, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5479, + "op": "PUSH0", + "gas": 29236, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5480, + "op": "PUSH2", + "gas": 29234, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5483, + "op": "DUP3", + "gas": 29231, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5484, + "op": "PUSH2", + "gas": 29228, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5487, + "op": "JUMP", + "gas": 29225, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5468, + "op": "JUMPDEST", + "gas": 29217, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5469, + "op": "PUSH0", + "gas": 29216, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5470, + "op": "DUP2", + "gas": 29214, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5471, + "op": "MLOAD", + "gas": 29211, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5472, + "op": "SWAP1", + "gas": 29208, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5473, + "op": "POP", + "gas": 29205, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5474, + "op": "SWAP2", + "gas": 29203, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5475, + "op": "SWAP1", + "gas": 29200, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5476, + "op": "POP", + "gas": 29197, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5477, + "op": "JUMP", + "gas": 29195, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5488, + "op": "JUMPDEST", + "gas": 29187, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5489, + "op": "PUSH2", + "gas": 29186, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5492, + "op": "DUP2", + "gas": 29183, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5493, + "op": "DUP6", + "gas": 29180, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5494, + "op": "PUSH2", + "gas": 29177, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5497, + "op": "JUMP", + "gas": 29174, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5384, + "op": "JUMPDEST", + "gas": 29166, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5385, + "op": "PUSH0", + "gas": 29165, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5386, + "op": "DUP2", + "gas": 29163, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5387, + "op": "SWAP1", + "gas": 29160, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5388, + "op": "POP", + "gas": 29157, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5389, + "op": "SWAP3", + "gas": 29155, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5390, + "op": "SWAP2", + "gas": 29152, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5391, + "op": "POP", + "gas": 29149, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5392, + "op": "POP", + "gas": 29147, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5393, + "op": "JUMP", + "gas": 29145, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5498, + "op": "JUMPDEST", + "gas": 29137, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5499, + "op": "SWAP4", + "gas": 29136, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5500, + "op": "POP", + "gas": 29133, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5501, + "op": "PUSH2", + "gas": 29131, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5504, + "op": "DUP2", + "gas": 29128, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5505, + "op": "DUP6", + "gas": 29125, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5506, + "op": "PUSH1", + "gas": 29122, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5508, + "op": "DUP7", + "gas": 29119, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5509, + "op": "ADD", + "gas": 29116, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5510, + "op": "PUSH2", + "gas": 29113, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5513, + "op": "JUMP", + "gas": 29110, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5108, + "op": "JUMPDEST", + "gas": 29102, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5109, + "op": "DUP3", + "gas": 29101, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5110, + "op": "DUP2", + "gas": 29098, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5111, + "op": "DUP4", + "gas": 29095, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5112, + "op": "opcode 0x5e not defined", + "gas": 29092, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 5113, + "op": "PUSH0", + "gas": 29086, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5114, + "op": "DUP4", + "gas": 29084, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5115, + "op": "DUP4", + "gas": 29081, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5116, + "op": "ADD", + "gas": 29078, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5117, + "op": "MSTORE", + "gas": 29075, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5118, + "op": "POP", + "gas": 29072, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5119, + "op": "POP", + "gas": 29070, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5120, + "op": "POP", + "gas": 29068, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5121, + "op": "JUMP", + "gas": 29066, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5514, + "op": "JUMPDEST", + "gas": 29058, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5515, + "op": "DUP1", + "gas": 29057, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5516, + "op": "DUP5", + "gas": 29054, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5517, + "op": "ADD", + "gas": 29051, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5518, + "op": "SWAP2", + "gas": 29048, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5519, + "op": "POP", + "gas": 29045, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5520, + "op": "POP", + "gas": 29043, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5521, + "op": "SWAP3", + "gas": 29041, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5522, + "op": "SWAP2", + "gas": 29038, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5523, + "op": "POP", + "gas": 29035, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5524, + "op": "POP", + "gas": 29033, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5525, + "op": "JUMP", + "gas": 29031, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5650, + "op": "JUMPDEST", + "gas": 29023, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5651, + "op": "SWAP2", + "gas": 29022, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5652, + "op": "POP", + "gas": 29019, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5653, + "op": "DUP2", + "gas": 29017, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5654, + "op": "SWAP1", + "gas": 29014, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5655, + "op": "POP", + "gas": 29011, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5656, + "op": "SWAP3", + "gas": 29009, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5657, + "op": "SWAP2", + "gas": 29006, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5658, + "op": "POP", + "gas": 29003, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5659, + "op": "POP", + "gas": 29001, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5660, + "op": "JUMP", + "gas": 28999, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1758, + "op": "JUMPDEST", + "gas": 28991, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1759, + "op": "SWAP1", + "gas": 28990, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1760, + "op": "DUP2", + "gas": 28987, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1761, + "op": "MSTORE", + "gas": 28984, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1762, + "op": "PUSH1", + "gas": 28981, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1764, + "op": "ADD", + "gas": 28978, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1765, + "op": "PUSH1", + "gas": 28975, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1767, + "op": "MLOAD", + "gas": 28972, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1768, + "op": "DUP1", + "gas": 28969, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1769, + "op": "SWAP2", + "gas": 28966, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1770, + "op": "SUB", + "gas": 28963, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1771, + "op": "SWAP1", + "gas": 28960, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1772, + "op": "SHA3", + "gas": 28957, + "gasCost": 42, + "depth": 1 + }, + { + "pc": 1773, + "op": "SWAP1", + "gas": 28915, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1774, + "op": "DUP2", + "gas": 28912, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1775, + "op": "PUSH2", + "gas": 28909, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1778, + "op": "SWAP2", + "gas": 28906, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1779, + "op": "SWAP1", + "gas": 28903, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1780, + "op": "PUSH2", + "gas": 28900, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1783, + "op": "JUMP", + "gas": 28897, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6167, + "op": "JUMPDEST", + "gas": 28889, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6168, + "op": "PUSH2", + "gas": 28888, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6171, + "op": "DUP3", + "gas": 28885, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6172, + "op": "PUSH2", + "gas": 28882, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6175, + "op": "JUMP", + "gas": 28879, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5082, + "op": "JUMPDEST", + "gas": 28871, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5083, + "op": "PUSH0", + "gas": 28870, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5084, + "op": "DUP2", + "gas": 28868, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5085, + "op": "MLOAD", + "gas": 28865, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5086, + "op": "SWAP1", + "gas": 28862, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5087, + "op": "POP", + "gas": 28859, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5088, + "op": "SWAP2", + "gas": 28857, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5089, + "op": "SWAP1", + "gas": 28854, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5090, + "op": "POP", + "gas": 28851, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5091, + "op": "JUMP", + "gas": 28849, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6176, + "op": "JUMPDEST", + "gas": 28841, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6177, + "op": "PUSH8", + "gas": 28840, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6186, + "op": "DUP2", + "gas": 28837, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6187, + "op": "GT", + "gas": 28834, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6188, + "op": "ISZERO", + "gas": 28831, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6189, + "op": "PUSH2", + "gas": 28828, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6192, + "op": "JUMPI", + "gas": 28825, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6201, + "op": "JUMPDEST", + "gas": 28815, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6202, + "op": "PUSH2", + "gas": 28814, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6205, + "op": "DUP3", + "gas": 28811, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6206, + "op": "SLOAD", + "gas": 28808, + "gasCost": 2100, + "depth": 1 + }, + { + "pc": 6207, + "op": "PUSH2", + "gas": 26708, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6210, + "op": "JUMP", + "gas": 26705, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5706, + "op": "JUMPDEST", + "gas": 26697, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5707, + "op": "PUSH0", + "gas": 26696, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5708, + "op": "PUSH1", + "gas": 26694, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5710, + "op": "DUP3", + "gas": 26691, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5711, + "op": "DIV", + "gas": 26688, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 5712, + "op": "SWAP1", + "gas": 26683, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5713, + "op": "POP", + "gas": 26680, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5714, + "op": "PUSH1", + "gas": 26678, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5716, + "op": "DUP3", + "gas": 26675, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5717, + "op": "AND", + "gas": 26672, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5718, + "op": "DUP1", + "gas": 26669, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5719, + "op": "PUSH2", + "gas": 26666, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5722, + "op": "JUMPI", + "gas": 26663, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 5723, + "op": "PUSH1", + "gas": 26653, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5725, + "op": "DUP3", + "gas": 26650, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5726, + "op": "AND", + "gas": 26647, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5727, + "op": "SWAP2", + "gas": 26644, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5728, + "op": "POP", + "gas": 26641, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5729, + "op": "JUMPDEST", + "gas": 26639, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5730, + "op": "PUSH1", + "gas": 26638, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5732, + "op": "DUP3", + "gas": 26635, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5733, + "op": "LT", + "gas": 26632, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5734, + "op": "DUP2", + "gas": 26629, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5735, + "op": "SUB", + "gas": 26626, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5736, + "op": "PUSH2", + "gas": 26623, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5739, + "op": "JUMPI", + "gas": 26620, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 5748, + "op": "JUMPDEST", + "gas": 26610, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5749, + "op": "POP", + "gas": 26609, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5750, + "op": "SWAP2", + "gas": 26607, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5751, + "op": "SWAP1", + "gas": 26604, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5752, + "op": "POP", + "gas": 26601, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5753, + "op": "JUMP", + "gas": 26599, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6211, + "op": "JUMPDEST", + "gas": 26591, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6212, + "op": "PUSH2", + "gas": 26590, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6215, + "op": "DUP3", + "gas": 26587, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6216, + "op": "DUP3", + "gas": 26584, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6217, + "op": "DUP6", + "gas": 26581, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6218, + "op": "PUSH2", + "gas": 26578, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6221, + "op": "JUMP", + "gas": 26575, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6030, + "op": "JUMPDEST", + "gas": 26567, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6031, + "op": "PUSH1", + "gas": 26566, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6033, + "op": "DUP3", + "gas": 26563, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6034, + "op": "GT", + "gas": 26560, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6035, + "op": "ISZERO", + "gas": 26557, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6036, + "op": "PUSH2", + "gas": 26554, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6039, + "op": "JUMPI", + "gas": 26551, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6095, + "op": "JUMPDEST", + "gas": 26541, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6096, + "op": "POP", + "gas": 26540, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6097, + "op": "POP", + "gas": 26538, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6098, + "op": "POP", + "gas": 26536, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6099, + "op": "JUMP", + "gas": 26534, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6222, + "op": "JUMPDEST", + "gas": 26526, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6223, + "op": "PUSH0", + "gas": 26525, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6224, + "op": "PUSH1", + "gas": 26523, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6226, + "op": "SWAP1", + "gas": 26520, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6227, + "op": "POP", + "gas": 26517, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6228, + "op": "PUSH1", + "gas": 26515, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6230, + "op": "DUP4", + "gas": 26512, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6231, + "op": "GT", + "gas": 26509, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6232, + "op": "PUSH1", + "gas": 26506, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6234, + "op": "DUP2", + "gas": 26503, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6235, + "op": "EQ", + "gas": 26500, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6236, + "op": "PUSH2", + "gas": 26497, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6239, + "op": "JUMPI", + "gas": 26494, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6271, + "op": "JUMPDEST", + "gas": 26484, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6272, + "op": "PUSH1", + "gas": 26483, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6274, + "op": "NOT", + "gas": 26480, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6275, + "op": "DUP5", + "gas": 26477, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6276, + "op": "AND", + "gas": 26474, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6277, + "op": "PUSH2", + "gas": 26471, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6280, + "op": "DUP7", + "gas": 26468, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6281, + "op": "PUSH2", + "gas": 26465, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6284, + "op": "JUMP", + "gas": 26462, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5754, + "op": "JUMPDEST", + "gas": 26454, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5755, + "op": "PUSH0", + "gas": 26453, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5756, + "op": "DUP2", + "gas": 26451, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5757, + "op": "SWAP1", + "gas": 26448, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5758, + "op": "POP", + "gas": 26445, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5759, + "op": "DUP2", + "gas": 26443, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5760, + "op": "PUSH0", + "gas": 26440, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5761, + "op": "MSTORE", + "gas": 26438, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5762, + "op": "PUSH1", + "gas": 26435, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5764, + "op": "PUSH0", + "gas": 26432, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5765, + "op": "SHA3", + "gas": 26430, + "gasCost": 36, + "depth": 1 + }, + { + "pc": 5766, + "op": "SWAP1", + "gas": 26394, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5767, + "op": "POP", + "gas": 26391, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5768, + "op": "SWAP2", + "gas": 26389, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5769, + "op": "SWAP1", + "gas": 26386, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5770, + "op": "POP", + "gas": 26383, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5771, + "op": "JUMP", + "gas": 26381, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6285, + "op": "JUMPDEST", + "gas": 26373, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6286, + "op": "PUSH0", + "gas": 26372, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6287, + "op": "JUMPDEST", + "gas": 26370, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6288, + "op": "DUP3", + "gas": 26369, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6289, + "op": "DUP2", + "gas": 26366, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6290, + "op": "LT", + "gas": 26363, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6291, + "op": "ISZERO", + "gas": 26360, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6292, + "op": "PUSH2", + "gas": 26357, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6295, + "op": "JUMPI", + "gas": 26354, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6296, + "op": "DUP5", + "gas": 26344, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6297, + "op": "DUP10", + "gas": 26341, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6298, + "op": "ADD", + "gas": 26338, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6299, + "op": "MLOAD", + "gas": 26335, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6300, + "op": "DUP3", + "gas": 26332, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6301, + "op": "SSTORE", + "gas": 26329, + "gasCost": 2200, + "depth": 1 + }, + { + "pc": 6302, + "op": "PUSH1", + "gas": 24129, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6304, + "op": "DUP3", + "gas": 24126, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6305, + "op": "ADD", + "gas": 24123, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6306, + "op": "SWAP2", + "gas": 24120, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6307, + "op": "POP", + "gas": 24117, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6308, + "op": "PUSH1", + "gas": 24115, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6310, + "op": "DUP6", + "gas": 24112, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6311, + "op": "ADD", + "gas": 24109, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6312, + "op": "SWAP5", + "gas": 24106, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6313, + "op": "POP", + "gas": 24103, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6314, + "op": "PUSH1", + "gas": 24101, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6316, + "op": "DUP2", + "gas": 24098, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6317, + "op": "ADD", + "gas": 24095, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6318, + "op": "SWAP1", + "gas": 24092, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6319, + "op": "POP", + "gas": 24089, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6320, + "op": "PUSH2", + "gas": 24087, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6323, + "op": "JUMP", + "gas": 24084, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6287, + "op": "JUMPDEST", + "gas": 24076, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6288, + "op": "DUP3", + "gas": 24075, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6289, + "op": "DUP2", + "gas": 24072, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6290, + "op": "LT", + "gas": 24069, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6291, + "op": "ISZERO", + "gas": 24066, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6292, + "op": "PUSH2", + "gas": 24063, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6295, + "op": "JUMPI", + "gas": 24060, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6324, + "op": "JUMPDEST", + "gas": 24050, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6325, + "op": "DUP7", + "gas": 24049, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6326, + "op": "DUP4", + "gas": 24046, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6327, + "op": "LT", + "gas": 24043, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6328, + "op": "ISZERO", + "gas": 24040, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6329, + "op": "PUSH2", + "gas": 24037, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6332, + "op": "JUMPI", + "gas": 24034, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 6353, + "op": "JUMPDEST", + "gas": 24024, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6354, + "op": "PUSH1", + "gas": 24023, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6356, + "op": "PUSH1", + "gas": 24020, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6358, + "op": "DUP9", + "gas": 24017, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6359, + "op": "MUL", + "gas": 24014, + "gasCost": 5, + "depth": 1 + }, + { + "pc": 6360, + "op": "ADD", + "gas": 24009, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6361, + "op": "DUP9", + "gas": 24006, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6362, + "op": "SSTORE", + "gas": 24003, + "gasCost": 20000, + "depth": 1 + }, + { + "pc": 6363, + "op": "POP", + "gas": 4003, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6364, + "op": "POP", + "gas": 4001, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6365, + "op": "POP", + "gas": 3999, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6366, + "op": "JUMPDEST", + "gas": 3997, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6367, + "op": "POP", + "gas": 3996, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6368, + "op": "POP", + "gas": 3994, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6369, + "op": "POP", + "gas": 3992, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6370, + "op": "POP", + "gas": 3990, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6371, + "op": "POP", + "gas": 3988, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6372, + "op": "POP", + "gas": 3986, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6373, + "op": "JUMP", + "gas": 3984, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1784, + "op": "JUMPDEST", + "gas": 3976, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1785, + "op": "POP", + "gas": 3975, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1786, + "op": "PUSH32", + "gas": 3973, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1819, + "op": "DUP7", + "gas": 3970, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1820, + "op": "DUP4", + "gas": 3967, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1821, + "op": "DUP4", + "gas": 3964, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1822, + "op": "TIMESTAMP", + "gas": 3961, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1823, + "op": "PUSH1", + "gas": 3959, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1825, + "op": "MLOAD", + "gas": 3956, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1826, + "op": "PUSH2", + "gas": 3953, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1829, + "op": "SWAP5", + "gas": 3950, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1830, + "op": "SWAP4", + "gas": 3947, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1831, + "op": "SWAP3", + "gas": 3944, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1832, + "op": "SWAP2", + "gas": 3941, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1833, + "op": "SWAP1", + "gas": 3938, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1834, + "op": "PUSH2", + "gas": 3935, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1837, + "op": "JUMP", + "gas": 3932, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6461, + "op": "JUMPDEST", + "gas": 3924, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6462, + "op": "PUSH0", + "gas": 3923, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6463, + "op": "PUSH1", + "gas": 3921, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6465, + "op": "DUP3", + "gas": 3918, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6466, + "op": "ADD", + "gas": 3915, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6467, + "op": "SWAP1", + "gas": 3912, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6468, + "op": "POP", + "gas": 3909, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6469, + "op": "DUP2", + "gas": 3907, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6470, + "op": "DUP2", + "gas": 3904, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6471, + "op": "SUB", + "gas": 3901, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6472, + "op": "PUSH0", + "gas": 3898, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6473, + "op": "DUP4", + "gas": 3896, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6474, + "op": "ADD", + "gas": 3893, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6475, + "op": "MSTORE", + "gas": 3890, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6476, + "op": "PUSH2", + "gas": 3887, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6479, + "op": "DUP2", + "gas": 3884, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6480, + "op": "DUP8", + "gas": 3881, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6481, + "op": "PUSH2", + "gas": 3878, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6484, + "op": "JUMP", + "gas": 3875, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6390, + "op": "JUMPDEST", + "gas": 3867, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6391, + "op": "PUSH0", + "gas": 3866, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6392, + "op": "PUSH2", + "gas": 3864, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6395, + "op": "DUP3", + "gas": 3861, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6396, + "op": "PUSH2", + "gas": 3858, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6399, + "op": "JUMP", + "gas": 3855, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5468, + "op": "JUMPDEST", + "gas": 3847, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5469, + "op": "PUSH0", + "gas": 3846, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5470, + "op": "DUP2", + "gas": 3844, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5471, + "op": "MLOAD", + "gas": 3841, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5472, + "op": "SWAP1", + "gas": 3838, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5473, + "op": "POP", + "gas": 3835, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5474, + "op": "SWAP2", + "gas": 3833, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5475, + "op": "SWAP1", + "gas": 3830, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5476, + "op": "POP", + "gas": 3827, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5477, + "op": "JUMP", + "gas": 3825, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6400, + "op": "JUMPDEST", + "gas": 3817, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6401, + "op": "PUSH2", + "gas": 3816, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6404, + "op": "DUP2", + "gas": 3813, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6405, + "op": "DUP6", + "gas": 3810, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6406, + "op": "PUSH2", + "gas": 3807, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6409, + "op": "JUMP", + "gas": 3804, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6374, + "op": "JUMPDEST", + "gas": 3796, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6375, + "op": "PUSH0", + "gas": 3795, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6376, + "op": "DUP3", + "gas": 3793, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6377, + "op": "DUP3", + "gas": 3790, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6378, + "op": "MSTORE", + "gas": 3787, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6379, + "op": "PUSH1", + "gas": 3784, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6381, + "op": "DUP3", + "gas": 3781, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6382, + "op": "ADD", + "gas": 3778, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6383, + "op": "SWAP1", + "gas": 3775, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6384, + "op": "POP", + "gas": 3772, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6385, + "op": "SWAP3", + "gas": 3770, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6386, + "op": "SWAP2", + "gas": 3767, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6387, + "op": "POP", + "gas": 3764, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6388, + "op": "POP", + "gas": 3762, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6389, + "op": "JUMP", + "gas": 3760, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6410, + "op": "JUMPDEST", + "gas": 3752, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6411, + "op": "SWAP4", + "gas": 3751, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6412, + "op": "POP", + "gas": 3748, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6413, + "op": "PUSH2", + "gas": 3746, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6416, + "op": "DUP2", + "gas": 3743, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6417, + "op": "DUP6", + "gas": 3740, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6418, + "op": "PUSH1", + "gas": 3737, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6420, + "op": "DUP7", + "gas": 3734, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6421, + "op": "ADD", + "gas": 3731, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6422, + "op": "PUSH2", + "gas": 3728, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6425, + "op": "JUMP", + "gas": 3725, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5108, + "op": "JUMPDEST", + "gas": 3717, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5109, + "op": "DUP3", + "gas": 3716, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5110, + "op": "DUP2", + "gas": 3713, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5111, + "op": "DUP4", + "gas": 3710, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5112, + "op": "opcode 0x5e not defined", + "gas": 3707, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 5113, + "op": "PUSH0", + "gas": 3701, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5114, + "op": "DUP4", + "gas": 3699, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5115, + "op": "DUP4", + "gas": 3696, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5116, + "op": "ADD", + "gas": 3693, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5117, + "op": "MSTORE", + "gas": 3690, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5118, + "op": "POP", + "gas": 3687, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5119, + "op": "POP", + "gas": 3685, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5120, + "op": "POP", + "gas": 3683, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5121, + "op": "JUMP", + "gas": 3681, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6426, + "op": "JUMPDEST", + "gas": 3673, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6427, + "op": "PUSH2", + "gas": 3672, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6430, + "op": "DUP2", + "gas": 3669, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6431, + "op": "PUSH2", + "gas": 3666, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6434, + "op": "JUMP", + "gas": 3663, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4423, + "op": "JUMPDEST", + "gas": 3655, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4424, + "op": "PUSH0", + "gas": 3654, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4425, + "op": "PUSH1", + "gas": 3652, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4427, + "op": "NOT", + "gas": 3649, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4428, + "op": "PUSH1", + "gas": 3646, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4430, + "op": "DUP4", + "gas": 3643, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4431, + "op": "ADD", + "gas": 3640, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4432, + "op": "AND", + "gas": 3637, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4433, + "op": "SWAP1", + "gas": 3634, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4434, + "op": "POP", + "gas": 3631, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4435, + "op": "SWAP2", + "gas": 3629, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4436, + "op": "SWAP1", + "gas": 3626, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4437, + "op": "POP", + "gas": 3623, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4438, + "op": "JUMP", + "gas": 3621, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6435, + "op": "JUMPDEST", + "gas": 3613, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6436, + "op": "DUP5", + "gas": 3612, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6437, + "op": "ADD", + "gas": 3609, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6438, + "op": "SWAP2", + "gas": 3606, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6439, + "op": "POP", + "gas": 3603, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6440, + "op": "POP", + "gas": 3601, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6441, + "op": "SWAP3", + "gas": 3599, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6442, + "op": "SWAP2", + "gas": 3596, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6443, + "op": "POP", + "gas": 3593, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6444, + "op": "POP", + "gas": 3591, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6445, + "op": "JUMP", + "gas": 3589, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6485, + "op": "JUMPDEST", + "gas": 3581, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6486, + "op": "SWAP1", + "gas": 3580, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6487, + "op": "POP", + "gas": 3577, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6488, + "op": "PUSH2", + "gas": 3575, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6491, + "op": "PUSH1", + "gas": 3572, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6493, + "op": "DUP4", + "gas": 3569, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6494, + "op": "ADD", + "gas": 3566, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6495, + "op": "DUP7", + "gas": 3563, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6496, + "op": "PUSH2", + "gas": 3560, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6499, + "op": "JUMP", + "gas": 3557, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4813, + "op": "JUMPDEST", + "gas": 3549, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4814, + "op": "PUSH2", + "gas": 3548, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4817, + "op": "DUP2", + "gas": 3545, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4818, + "op": "PUSH2", + "gas": 3542, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4821, + "op": "JUMP", + "gas": 3539, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4802, + "op": "JUMPDEST", + "gas": 3531, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4803, + "op": "PUSH0", + "gas": 3530, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4804, + "op": "DUP2", + "gas": 3528, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4805, + "op": "ISZERO", + "gas": 3525, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4806, + "op": "ISZERO", + "gas": 3522, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4807, + "op": "SWAP1", + "gas": 3519, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4808, + "op": "POP", + "gas": 3516, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4809, + "op": "SWAP2", + "gas": 3514, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4810, + "op": "SWAP1", + "gas": 3511, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4811, + "op": "POP", + "gas": 3508, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4812, + "op": "JUMP", + "gas": 3506, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4822, + "op": "JUMPDEST", + "gas": 3498, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4823, + "op": "DUP3", + "gas": 3497, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4824, + "op": "MSTORE", + "gas": 3494, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4825, + "op": "POP", + "gas": 3491, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4826, + "op": "POP", + "gas": 3489, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4827, + "op": "JUMP", + "gas": 3487, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6500, + "op": "JUMPDEST", + "gas": 3479, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6501, + "op": "DUP2", + "gas": 3478, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6502, + "op": "DUP2", + "gas": 3475, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6503, + "op": "SUB", + "gas": 3472, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6504, + "op": "PUSH1", + "gas": 3469, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6506, + "op": "DUP4", + "gas": 3466, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6507, + "op": "ADD", + "gas": 3463, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6508, + "op": "MSTORE", + "gas": 3460, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6509, + "op": "PUSH2", + "gas": 3457, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6512, + "op": "DUP2", + "gas": 3454, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6513, + "op": "DUP6", + "gas": 3451, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6514, + "op": "PUSH2", + "gas": 3448, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6517, + "op": "JUMP", + "gas": 3445, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5122, + "op": "JUMPDEST", + "gas": 3437, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5123, + "op": "PUSH0", + "gas": 3436, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5124, + "op": "PUSH2", + "gas": 3434, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5127, + "op": "DUP3", + "gas": 3431, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5128, + "op": "PUSH2", + "gas": 3428, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5131, + "op": "JUMP", + "gas": 3425, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5082, + "op": "JUMPDEST", + "gas": 3417, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5083, + "op": "PUSH0", + "gas": 3416, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5084, + "op": "DUP2", + "gas": 3414, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5085, + "op": "MLOAD", + "gas": 3411, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5086, + "op": "SWAP1", + "gas": 3408, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5087, + "op": "POP", + "gas": 3405, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5088, + "op": "SWAP2", + "gas": 3403, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5089, + "op": "SWAP1", + "gas": 3400, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5090, + "op": "POP", + "gas": 3397, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5091, + "op": "JUMP", + "gas": 3395, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5132, + "op": "JUMPDEST", + "gas": 3387, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5133, + "op": "PUSH2", + "gas": 3386, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5136, + "op": "DUP2", + "gas": 3383, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5137, + "op": "DUP6", + "gas": 3380, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5138, + "op": "PUSH2", + "gas": 3377, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5141, + "op": "JUMP", + "gas": 3374, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5092, + "op": "JUMPDEST", + "gas": 3366, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5093, + "op": "PUSH0", + "gas": 3365, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5094, + "op": "DUP3", + "gas": 3363, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5095, + "op": "DUP3", + "gas": 3360, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5096, + "op": "MSTORE", + "gas": 3357, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5097, + "op": "PUSH1", + "gas": 3354, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5099, + "op": "DUP3", + "gas": 3351, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5100, + "op": "ADD", + "gas": 3348, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5101, + "op": "SWAP1", + "gas": 3345, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5102, + "op": "POP", + "gas": 3342, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5103, + "op": "SWAP3", + "gas": 3340, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5104, + "op": "SWAP2", + "gas": 3337, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5105, + "op": "POP", + "gas": 3334, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5106, + "op": "POP", + "gas": 3332, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5107, + "op": "JUMP", + "gas": 3330, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5142, + "op": "JUMPDEST", + "gas": 3322, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5143, + "op": "SWAP4", + "gas": 3321, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5144, + "op": "POP", + "gas": 3318, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5145, + "op": "PUSH2", + "gas": 3316, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5148, + "op": "DUP2", + "gas": 3313, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5149, + "op": "DUP6", + "gas": 3310, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5150, + "op": "PUSH1", + "gas": 3307, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5152, + "op": "DUP7", + "gas": 3304, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5153, + "op": "ADD", + "gas": 3301, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5154, + "op": "PUSH2", + "gas": 3298, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5157, + "op": "JUMP", + "gas": 3295, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5108, + "op": "JUMPDEST", + "gas": 3287, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5109, + "op": "DUP3", + "gas": 3286, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5110, + "op": "DUP2", + "gas": 3283, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5111, + "op": "DUP4", + "gas": 3280, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5112, + "op": "opcode 0x5e not defined", + "gas": 3277, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 5113, + "op": "PUSH0", + "gas": 3271, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5114, + "op": "DUP4", + "gas": 3269, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5115, + "op": "DUP4", + "gas": 3266, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5116, + "op": "ADD", + "gas": 3263, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5117, + "op": "MSTORE", + "gas": 3260, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5118, + "op": "POP", + "gas": 3257, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5119, + "op": "POP", + "gas": 3255, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5120, + "op": "POP", + "gas": 3253, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5121, + "op": "JUMP", + "gas": 3251, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5158, + "op": "JUMPDEST", + "gas": 3243, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5159, + "op": "PUSH2", + "gas": 3242, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5162, + "op": "DUP2", + "gas": 3239, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5163, + "op": "PUSH2", + "gas": 3236, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5166, + "op": "JUMP", + "gas": 3233, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4423, + "op": "JUMPDEST", + "gas": 3225, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4424, + "op": "PUSH0", + "gas": 3224, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4425, + "op": "PUSH1", + "gas": 3222, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4427, + "op": "NOT", + "gas": 3219, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4428, + "op": "PUSH1", + "gas": 3216, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4430, + "op": "DUP4", + "gas": 3213, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4431, + "op": "ADD", + "gas": 3210, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4432, + "op": "AND", + "gas": 3207, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4433, + "op": "SWAP1", + "gas": 3204, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4434, + "op": "POP", + "gas": 3201, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4435, + "op": "SWAP2", + "gas": 3199, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4436, + "op": "SWAP1", + "gas": 3196, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4437, + "op": "POP", + "gas": 3193, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4438, + "op": "JUMP", + "gas": 3191, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5167, + "op": "JUMPDEST", + "gas": 3183, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5168, + "op": "DUP5", + "gas": 3182, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5169, + "op": "ADD", + "gas": 3179, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5170, + "op": "SWAP2", + "gas": 3176, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5171, + "op": "POP", + "gas": 3173, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5172, + "op": "POP", + "gas": 3171, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5173, + "op": "SWAP3", + "gas": 3169, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5174, + "op": "SWAP2", + "gas": 3166, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5175, + "op": "POP", + "gas": 3163, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5176, + "op": "POP", + "gas": 3161, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5177, + "op": "JUMP", + "gas": 3159, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6518, + "op": "JUMPDEST", + "gas": 3151, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6519, + "op": "SWAP1", + "gas": 3150, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6520, + "op": "POP", + "gas": 3147, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6521, + "op": "PUSH2", + "gas": 3145, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6524, + "op": "PUSH1", + "gas": 3142, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6526, + "op": "DUP4", + "gas": 3139, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6527, + "op": "ADD", + "gas": 3136, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6528, + "op": "DUP5", + "gas": 3133, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6529, + "op": "PUSH2", + "gas": 3130, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6532, + "op": "JUMP", + "gas": 3127, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6446, + "op": "JUMPDEST", + "gas": 3119, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6447, + "op": "PUSH2", + "gas": 3118, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6450, + "op": "DUP2", + "gas": 3115, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6451, + "op": "PUSH2", + "gas": 3112, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6454, + "op": "JUMP", + "gas": 3109, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 5210, + "op": "JUMPDEST", + "gas": 3101, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 5211, + "op": "PUSH0", + "gas": 3100, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5212, + "op": "DUP2", + "gas": 3098, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5213, + "op": "SWAP1", + "gas": 3095, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5214, + "op": "POP", + "gas": 3092, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5215, + "op": "SWAP2", + "gas": 3090, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5216, + "op": "SWAP1", + "gas": 3087, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 5217, + "op": "POP", + "gas": 3084, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 5218, + "op": "JUMP", + "gas": 3082, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6455, + "op": "JUMPDEST", + "gas": 3074, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6456, + "op": "DUP3", + "gas": 3073, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6457, + "op": "MSTORE", + "gas": 3070, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6458, + "op": "POP", + "gas": 3067, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6459, + "op": "POP", + "gas": 3065, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6460, + "op": "JUMP", + "gas": 3063, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 6533, + "op": "JUMPDEST", + "gas": 3055, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 6534, + "op": "SWAP6", + "gas": 3054, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6535, + "op": "SWAP5", + "gas": 3051, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 6536, + "op": "POP", + "gas": 3048, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6537, + "op": "POP", + "gas": 3046, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6538, + "op": "POP", + "gas": 3044, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6539, + "op": "POP", + "gas": 3042, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6540, + "op": "POP", + "gas": 3040, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6541, + "op": "JUMP", + "gas": 3038, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1838, + "op": "JUMPDEST", + "gas": 3030, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1839, + "op": "PUSH1", + "gas": 3029, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1841, + "op": "MLOAD", + "gas": 3026, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1842, + "op": "DUP1", + "gas": 3023, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1843, + "op": "SWAP2", + "gas": 3020, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1844, + "op": "SUB", + "gas": 3017, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1845, + "op": "SWAP1", + "gas": 3014, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1846, + "op": "LOG1", + "gas": 3011, + "gasCost": 2798, + "depth": 1 + }, + { + "pc": 1847, + "op": "DUP2", + "gas": 213, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1848, + "op": "SWAP7", + "gas": 210, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1849, + "op": "POP", + "gas": 207, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1850, + "op": "POP", + "gas": 205, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1851, + "op": "POP", + "gas": 203, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1852, + "op": "POP", + "gas": 201, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1853, + "op": "POP", + "gas": 199, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1854, + "op": "POP", + "gas": 197, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1855, + "op": "POP", + "gas": 195, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1856, + "op": "SWAP2", + "gas": 193, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1857, + "op": "SWAP1", + "gas": 190, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1858, + "op": "POP", + "gas": 187, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1859, + "op": "JUMP", + "gas": 185, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 282, + "op": "JUMPDEST", + "gas": 177, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 283, + "op": "PUSH1", + "gas": 176, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 285, + "op": "MLOAD", + "gas": 173, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 286, + "op": "PUSH2", + "gas": 170, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 289, + "op": "SWAP2", + "gas": 167, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 290, + "op": "SWAP1", + "gas": 164, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 291, + "op": "PUSH2", + "gas": 161, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 294, + "op": "JUMP", + "gas": 158, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4828, + "op": "JUMPDEST", + "gas": 150, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4829, + "op": "PUSH0", + "gas": 149, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4830, + "op": "PUSH1", + "gas": 147, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4832, + "op": "DUP3", + "gas": 144, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4833, + "op": "ADD", + "gas": 141, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4834, + "op": "SWAP1", + "gas": 138, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4835, + "op": "POP", + "gas": 135, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4836, + "op": "PUSH2", + "gas": 133, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4839, + "op": "PUSH0", + "gas": 130, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4840, + "op": "DUP4", + "gas": 128, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4841, + "op": "ADD", + "gas": 125, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4842, + "op": "DUP5", + "gas": 122, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4843, + "op": "PUSH2", + "gas": 119, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4846, + "op": "JUMP", + "gas": 116, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4813, + "op": "JUMPDEST", + "gas": 108, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4814, + "op": "PUSH2", + "gas": 107, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4817, + "op": "DUP2", + "gas": 104, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4818, + "op": "PUSH2", + "gas": 101, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4821, + "op": "JUMP", + "gas": 98, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4802, + "op": "JUMPDEST", + "gas": 90, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4803, + "op": "PUSH0", + "gas": 89, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4804, + "op": "DUP2", + "gas": 87, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4805, + "op": "ISZERO", + "gas": 84, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4806, + "op": "ISZERO", + "gas": 81, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4807, + "op": "SWAP1", + "gas": 78, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4808, + "op": "POP", + "gas": 75, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4809, + "op": "SWAP2", + "gas": 73, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4810, + "op": "SWAP1", + "gas": 70, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4811, + "op": "POP", + "gas": 67, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4812, + "op": "JUMP", + "gas": 65, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4822, + "op": "JUMPDEST", + "gas": 57, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4823, + "op": "DUP3", + "gas": 56, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4824, + "op": "MSTORE", + "gas": 53, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4825, + "op": "POP", + "gas": 50, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4826, + "op": "POP", + "gas": 48, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4827, + "op": "JUMP", + "gas": 46, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 4847, + "op": "JUMPDEST", + "gas": 38, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 4848, + "op": "SWAP3", + "gas": 37, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4849, + "op": "SWAP2", + "gas": 34, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4850, + "op": "POP", + "gas": 31, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4851, + "op": "POP", + "gas": 29, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 4852, + "op": "JUMP", + "gas": 27, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 295, + "op": "JUMPDEST", + "gas": 19, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 296, + "op": "PUSH1", + "gas": 18, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 298, + "op": "MLOAD", + "gas": 15, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 299, + "op": "DUP1", + "gas": 12, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 300, + "op": "SWAP2", + "gas": 9, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 301, + "op": "SUB", + "gas": 6, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 302, + "op": "SWAP1", + "gas": 3, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 303, + "op": "RETURN", + "gas": 0, + "gasCost": 0, + "depth": 1 + } + ], + "callTrace": { + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "gas": "0x48953", + "gasUsed": "0x48953", + "to": "0x34118801d76b7082ab065e23496c692d002eaf24", + "input": "0x447a4c620000000000000000000000000000000000000000000000000000000000000005", + "output": "0x0000000000000000000000000000000000000000000000000000000000000001", + "calls": [ + { + "from": "0x34118801d76b7082ab065e23496c692d002eaf24", + "gas": "0x40285", + "gasUsed": "0x347d8", + "to": "0x0000000000000000000000000000000000000008", + "input": "0x00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000002198e9393920d483a7260bfb731fb5d25f1aa493335a9e71297e485b7aef312c21800deef121f1e76426a00665e5c4479674322d4f75edadd46debd5cd992f6ed090689d0585ff075ec9e99ad690c3395bc4b313370b38ef355acdadcd122975b12c85ea5db8c6deb4aab71808dcb408fe3d1e7690c43d37b4ce6cc0166fa7daa", + "output": "0x0000000000000000000000000000000000000000000000000000000000000000", + "type": "STATICCALL" + } + ], + "value": "0x0", + "type": "CALL" + } + } + ], + "withdraw_trie_root": "0xf15fe55ccda900eb1a64fa9abee8054e44b6915dae17e21aef095f4cd49d2a67", + "sequencer_set_verify_hash": "0x72fce9da9f9cca9ae7f43acbcc6060e82ef37152a13cee828b492343ec19eebc", + "startL1QueueIndex": 1321206 + } + ] +] \ No newline at end of file diff --git a/prover/tests/algebra/client/elf/riscv32im-succinct-zkvm-elf b/prover/tests/algebra/client/elf/riscv32im-succinct-zkvm-elf index 94f2f57d..84053a89 100755 Binary files a/prover/tests/algebra/client/elf/riscv32im-succinct-zkvm-elf and b/prover/tests/algebra/client/elf/riscv32im-succinct-zkvm-elf differ diff --git a/prover/tests/bls12381/client/elf/riscv32im-succinct-zkvm-elf b/prover/tests/bls12381/client/elf/riscv32im-succinct-zkvm-elf index 0568d7c3..e3fc78af 100755 Binary files a/prover/tests/bls12381/client/elf/riscv32im-succinct-zkvm-elf and b/prover/tests/bls12381/client/elf/riscv32im-succinct-zkvm-elf differ diff --git a/prover/tests/bls12381/host/src/main.rs b/prover/tests/bls12381/host/src/main.rs index 1e46ee58..10f612fb 100644 --- a/prover/tests/bls12381/host/src/main.rs +++ b/prover/tests/bls12381/host/src/main.rs @@ -21,16 +21,10 @@ fn main() { let (public_values, execution_report) = client.execute(dev_elf, stdin.clone()).run().unwrap(); println!("Program executed successfully."); // Record the number of cycles executed. - println!( - "Number of cycles: {}", - execution_report.total_instruction_count() - ); + println!("Number of cycles: {}", execution_report.total_instruction_count()); let rt_data = public_values.as_slice(); - println!( - "pi_hash generated with sp1-vm execution: {}", - hex::encode(rt_data) - ); + println!("pi_hash generated with sp1-vm execution: {}", hex::encode(rt_data)); let start = Instant::now(); @@ -38,16 +32,10 @@ fn main() { let (pk, vk) = client.setup(dev_elf); // Generate the proof - let proof = client - .prove(&pk, stdin) - .run() - .expect("failed to generate proof"); + let proof = client.prove(&pk, stdin).run().expect("failed to generate proof"); let duration_mins = start.elapsed().as_secs() / 60; - println!( - "Successfully generated proof!, time use: {:?} minutes", - duration_mins - ); + println!("Successfully generated proof!, time use: {:?} minutes", duration_mins); // Verify the proof. client.verify(&proof, &vk).expect("failed to verify proof"); diff --git a/prover/tests/keccak256/client/elf/riscv32im-succinct-zkvm-elf b/prover/tests/keccak256/client/elf/riscv32im-succinct-zkvm-elf index b8b0eba9..66714c8e 100755 Binary files a/prover/tests/keccak256/client/elf/riscv32im-succinct-zkvm-elf and b/prover/tests/keccak256/client/elf/riscv32im-succinct-zkvm-elf differ diff --git a/prover/tests/keccak256/host/src/main.rs b/prover/tests/keccak256/host/src/main.rs index 1e46ee58..10f612fb 100644 --- a/prover/tests/keccak256/host/src/main.rs +++ b/prover/tests/keccak256/host/src/main.rs @@ -21,16 +21,10 @@ fn main() { let (public_values, execution_report) = client.execute(dev_elf, stdin.clone()).run().unwrap(); println!("Program executed successfully."); // Record the number of cycles executed. - println!( - "Number of cycles: {}", - execution_report.total_instruction_count() - ); + println!("Number of cycles: {}", execution_report.total_instruction_count()); let rt_data = public_values.as_slice(); - println!( - "pi_hash generated with sp1-vm execution: {}", - hex::encode(rt_data) - ); + println!("pi_hash generated with sp1-vm execution: {}", hex::encode(rt_data)); let start = Instant::now(); @@ -38,16 +32,10 @@ fn main() { let (pk, vk) = client.setup(dev_elf); // Generate the proof - let proof = client - .prove(&pk, stdin) - .run() - .expect("failed to generate proof"); + let proof = client.prove(&pk, stdin).run().expect("failed to generate proof"); let duration_mins = start.elapsed().as_secs() / 60; - println!( - "Successfully generated proof!, time use: {:?} minutes", - duration_mins - ); + println!("Successfully generated proof!, time use: {:?} minutes", duration_mins); // Verify the proof. client.verify(&proof, &vk).expect("failed to verify proof"); diff --git a/prover/tests/zstd/client/elf/riscv32im-succinct-zkvm-elf b/prover/tests/zstd/client/elf/riscv32im-succinct-zkvm-elf index 7b190131..0be20c87 100755 Binary files a/prover/tests/zstd/client/elf/riscv32im-succinct-zkvm-elf and b/prover/tests/zstd/client/elf/riscv32im-succinct-zkvm-elf differ diff --git a/prover/tests/zstd/host/src/main.rs b/prover/tests/zstd/host/src/main.rs index 862deeaa..ca353b30 100644 --- a/prover/tests/zstd/host/src/main.rs +++ b/prover/tests/zstd/host/src/main.rs @@ -1,6 +1,5 @@ use sp1_sdk::{ProverClient, SP1Stdin}; -use std::io::Read; -use std::{fs::File, path::Path, time::Instant}; +use std::{fs::File, io::Read, path::Path, time::Instant}; fn main() { // Setup the logger. @@ -24,16 +23,10 @@ fn main() { let (public_values, execution_report) = client.execute(dev_elf, stdin.clone()).run().unwrap(); println!("Program executed successfully."); // Record the number of cycles executed. - println!( - "Number of cycles: {}", - execution_report.total_instruction_count() - ); + println!("Number of cycles: {}", execution_report.total_instruction_count()); let rt_data = public_values.as_slice(); - println!( - "pi_hash generated with sp1-vm execution: {}", - hex::encode(rt_data) - ); + println!("pi_hash generated with sp1-vm execution: {}", hex::encode(rt_data)); let start = Instant::now(); @@ -41,16 +34,10 @@ fn main() { let (pk, vk) = client.setup(dev_elf); // Generate the proof - let proof = client - .prove(&pk, stdin) - .run() - .expect("failed to generate proof"); + let proof = client.prove(&pk, stdin).run().expect("failed to generate proof"); let duration_mins = start.elapsed().as_secs() / 60; - println!( - "Successfully generated proof!, time use: {:?} minutes", - duration_mins - ); + println!("Successfully generated proof!, time use: {:?} minutes", duration_mins); // Verify the proof. client.verify(&proof, &vk).expect("failed to verify proof"); diff --git a/tx-submitter/.gitignore b/tx-submitter/.gitignore index 7ef51ca1..835c4a0e 100644 --- a/tx-submitter/.gitignore +++ b/tx-submitter/.gitignore @@ -1,9 +1,56 @@ -.idea -.env* -build -tx-submitter +# IDE and Editor files +.idea/ +.vscode/ +*.swp +*.swo +*~ + +# OS generated files .DS_Store -.vscode -*.log +.DS_Store? +._* +.Spotlight-V100 +.Trashes +ehthumbs.db +Thumbs.db + +# Go specific +*.exe +*.exe~ +*.dll +*.so +*.dylib +*.test +*.out +go.work + +# Binary files +tx-submitter +**/tx-submitter +build/ *debug_bin* -journal.rlp \ No newline at end of file + +# Config and Environment files +.env* + +# Test and Debug files +test/ +testleveldb/ +test_data/ +debug/ +*.test +*.log +*.pprof +cpu.prof +mem.prof +trace.out + +# Coverage reports +coverage.txt + +# Transaction files +journal.rlp +journal*.rlp + +# Temporary files +tmp/ \ No newline at end of file diff --git a/tx-submitter/constants/methods.go b/tx-submitter/constants/methods.go new file mode 100644 index 00000000..aefe24d0 --- /dev/null +++ b/tx-submitter/constants/methods.go @@ -0,0 +1,8 @@ +package constants + +const ( + // MethodCommitBatch is the method name for committing a batch + MethodCommitBatch = "commitBatch" + // MethodFinalizeBatch is the method name for finalizing a batch + MethodFinalizeBatch = "finalizeBatch" +) diff --git a/tx-submitter/db/db.go b/tx-submitter/db/db.go new file mode 100644 index 00000000..ce62bd6e --- /dev/null +++ b/tx-submitter/db/db.go @@ -0,0 +1,73 @@ +package db + +import ( + "fmt" + "strconv" + "sync" + + "morph-l2/tx-submitter/utils" + + "github.com/morph-l2/go-ethereum/ethdb/leveldb" + "github.com/syndtr/goleveldb/leveldb/errors" +) + +var ( + ErrKeyNotFound = errors.ErrNotFound +) + +type Db struct { + db *leveldb.Database + m sync.Mutex +} + +func New(pathname string) (*Db, error) { + // leveldb + ldb, err := leveldb.New(pathname, 0, 0, "tx-submitter", false) + if err != nil { + return nil, fmt.Errorf("failed to create leveldb: %w", err) + } + return &Db{db: ldb}, nil +} +func (d *Db) GetFloat(key string) (float64, error) { + d.m.Lock() + defer d.m.Unlock() + v, err := d.db.Get([]byte(key)) + if err != nil { + return 0, fmt.Errorf("failed get key from leveldb %s: %w", key, err) + } + res, err := utils.ParseStringToType[float64](string(v)) + if err != nil { + return 0, fmt.Errorf("failed to parse string to float64 %s", err) + } + return res, nil +} +func (d *Db) PutFloat(key string, val float64) error { + d.m.Lock() + defer d.m.Unlock() + valStr := strconv.FormatFloat(val, 'f', -1, 64) + err := d.db.Put([]byte(key), []byte(valStr)) + if err != nil { + return fmt.Errorf("failed to put key into leveldb %w", err) + } + return nil +} +func (d *Db) GetString(key string) (string, error) { + d.m.Lock() + defer d.m.Unlock() + v, err := d.db.Get([]byte(key)) + if err != nil { + if err == errors.ErrNotFound { + return "", ErrKeyNotFound + } + return "", fmt.Errorf("failed to get key from leveldb %w", err) + } + return string(v), nil +} +func (d *Db) PutString(key, val string) error { + d.m.Lock() + defer d.m.Unlock() + return d.db.Put([]byte(key), []byte(val)) +} +func (d *Db) Close() error { + return d.db.Close() +} diff --git a/tx-submitter/db/db_test.go b/tx-submitter/db/db_test.go new file mode 100644 index 00000000..a7ecac6d --- /dev/null +++ b/tx-submitter/db/db_test.go @@ -0,0 +1,21 @@ +package db + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func Test_Get_Put(t *testing.T) { + db, err := New("test") + require.NoError(t, err) + + expect := 1.123456789012345 + // expectStr := "1.123456789012345" + + err = db.PutFloat("test", expect) + require.NoError(t, err) + v, err := db.GetFloat("test") + require.NoError(t, err) + require.Equal(t, expect, v) +} diff --git a/tx-submitter/db/interface.go b/tx-submitter/db/interface.go new file mode 100644 index 00000000..0bec57f6 --- /dev/null +++ b/tx-submitter/db/interface.go @@ -0,0 +1,10 @@ +package db + +// Database defines the interface for database operations +type Database interface { + GetString(key string) (string, error) + PutString(key, val string) error + GetFloat(key string) (float64, error) + PutFloat(key string, val float64) error + Close() error +} diff --git a/tx-submitter/entry.go b/tx-submitter/entry.go index 0145243a..bc5675fc 100644 --- a/tx-submitter/entry.go +++ b/tx-submitter/entry.go @@ -10,10 +10,13 @@ import ( "os" "os/signal" "strings" + "time" "morph-l2/bindings/bindings" + "morph-l2/tx-submitter/db" "morph-l2/tx-submitter/event" "morph-l2/tx-submitter/iface" + "morph-l2/tx-submitter/l1checker" "morph-l2/tx-submitter/metrics" "morph-l2/tx-submitter/services" "morph-l2/tx-submitter/utils" @@ -65,6 +68,12 @@ func Main() func(ctx *cli.Context) error { "rough_estimate_base_gas", cfg.RollupTxGasBase, "rough_estimate_per_l1_msg", cfg.RollupTxGasPerL1Msg, "log_level", cfg.LogLevel, + "leveldb_pathname", cfg.LeveldbPathName, + "l1_stop_in_blocks", cfg.BlockNotIncreasedThreshold, + "min_tip", cfg.MinTip, + "max_tip", cfg.MaxTip, + "max_base", cfg.MaxBaseFee, + "tip_bump", cfg.TipFeeBump, ) ctx, cancel := context.WithCancel(context.Background()) @@ -96,14 +105,11 @@ func Main() func(ctx *cli.Context) error { } output = io.MultiWriter(output, logFile) } - logHandler := log.StreamHandler(output, log.TerminalFormat(false)) - logLevel, err := log.LvlFromString(cfg.LogLevel) if err != nil { return err } - log.Root().SetHandler(log.LvlFilterHandler(logLevel, logHandler)) l1RpcClient, err := rpc.Dial(cfg.L1EthRpc) @@ -182,13 +188,24 @@ func Main() func(ctx *cli.Context) error { }, } - eventIndexer := event.NewEventIndexer(cfg.StakingEventStoreFilename, l1Client, new(big.Int).SetUint64(cfg.L1StakingDeployedBlockNumber), filter, cfg.EventIndexStep) - + ldb, err := db.New(cfg.LeveldbPathName) + if err != nil { + return fmt.Errorf("failed to connect leveldb: %w", err) + } + eventInfoStorage := event.NewEventInfoStorage(ldb) + err = eventInfoStorage.Load() + if err != nil { + return err + } + eventIndexer := event.NewEventIndexer(l1Client, new(big.Int).SetUint64(cfg.L1StakingDeployedBlockNumber), filter, cfg.EventIndexStep, eventInfoStorage) // new rotator rotator := services.NewRotator(common.HexToAddress(cfg.L2SequencerAddress), common.HexToAddress(cfg.L2GovAddress), eventIndexer) // start rorator event indexer rotator.StartEventIndexer() + // blockmonitor + bm := l1checker.NewBlockMonitor(cfg.BlockNotIncreasedThreshold, l1Client) + // new rollup service sr := services.NewRollup( ctx, @@ -205,11 +222,11 @@ func Main() func(ctx *cli.Context) error { cfg, rsaPriv, rotator, + ldb, + bm, + eventInfoStorage, ) - // init rollup service - if err := sr.PreCheck(); err != nil { - return err - } + // metrics { if cfg.MetricsServerEnable { @@ -223,11 +240,6 @@ func Main() func(ctx *cli.Context) error { log.Info("metrics server enabled", "host", cfg.MetricsHostname, "port", cfg.MetricsPort) } - // log external sign info - if cfg.ExternalSign { - - } - log.Info("external sign info", "external_sign", cfg.ExternalSign, "appid", cfg.ExternalSignAppid, @@ -236,7 +248,12 @@ func Main() func(ctx *cli.Context) error { "url", cfg.ExternalSignUrl, ) - sr.Start() + err = sr.Start() + for err != nil { + log.Error("rollup service start failed", "error", err) + time.Sleep(time.Second * 5) + err = sr.Start() + } // Catch CTRL-C to ensure a graceful shutdown. interrupt := make(chan os.Signal, 1) diff --git a/tx-submitter/event/indexer.go b/tx-submitter/event/indexer.go index f666c6b2..dc517ba7 100644 --- a/tx-submitter/event/indexer.go +++ b/tx-submitter/event/indexer.go @@ -13,31 +13,31 @@ import ( type EventIndexer struct { client *ethclient.Client - storePath string // store path deployBlock *big.Int // Block number of contract deployment filterQuery ethereum.FilterQuery indexStep uint64 // index step + storage IEventStorage } -func NewEventIndexer(storePath string, client *ethclient.Client, deployedBlock *big.Int, filter ethereum.FilterQuery, indexStep uint64) *EventIndexer { +func NewEventIndexer(client *ethclient.Client, deployedBlock *big.Int, filter ethereum.FilterQuery, indexStep uint64, storage IEventStorage) *EventIndexer { return &EventIndexer{ - storePath: storePath, client: client, deployBlock: deployedBlock, filterQuery: filter, indexStep: indexStep, + storage: storage, } } func (l *EventIndexer) Index() { log.Info("event indexer started") - storage := NewEventInfoStorage(l.storePath) - err := storage.Load() - if err != nil { - log.Crit("failed to load storage", "error", err, "file_name", storage.Filename) - } - if storage.BlockProcessed == 0 { - storage.BlockProcessed = l.deployBlock.Uint64() + + if l.storage.BlockProcessed() == 0 { + l.storage.SetBlockProcessed(l.deployBlock.Uint64()) + err := l.storage.Store() + if err != nil { + log.Error("failed to store initial block number", "error", err) + } } // Create a ticker that triggers every minute @@ -45,7 +45,6 @@ func (l *EventIndexer) Index() { defer ticker.Stop() for range ticker.C { - // Get the current block number currentBlock, err := l.client.BlockNumber(context.Background()) if err != nil { @@ -53,35 +52,33 @@ func (l *EventIndexer) Index() { continue } - if currentBlock <= storage.BlockProcessed { - log.Info("no new block to index", "current_block", currentBlock, "last_processed_block", storage.BlockProcessed) + if currentBlock <= l.storage.BlockProcessed() { + log.Info("no new block to index", "current_block", currentBlock, "last_processed_block", l.storage.BlockProcessed()) continue } // Perform indexing operation - indexedEventInfo, err := l.index(l.client, big.NewInt(int64(storage.BlockProcessed)), big.NewInt(int64(currentBlock))) + indexedEventInfo, err := l.index(l.client, big.NewInt(int64(l.storage.BlockProcessed())), big.NewInt(int64(currentBlock))) if err != nil { log.Error("indexing operation failed", "error", err) continue } if indexedEventInfo != nil { - storage.EventInfo = *indexedEventInfo + l.storage.SetBlockProcessed(indexedEventInfo.BlockProcessed) } else { - storage.EventInfo = EventInfo{ - BlockProcessed: currentBlock, - } + l.storage.SetBlockProcessed(currentBlock) } + // Update storage - err = storage.Store() + err = l.storage.Store() if err != nil { - log.Error("event index complete, failed to update storage", "error", err, "file_name", storage.Filename) + log.Error("event index complete, failed to update storage", "error", err) } else { - log.Info("event index complete storage updated", "processed_block", storage.EventInfo.BlockProcessed, "block_time", storage.EventInfo.BlockTime) + info := l.storage.EventInfo() + log.Info("event index complete, storage updated", "processed_block", info.BlockProcessed, "block_time", info.BlockTime) } - } - } // filter logs from from_block to to_block @@ -91,6 +88,9 @@ func (ei *EventIndexer) index(client *ethclient.Client, fromBlock, toBlock *big. endBlock := toBlock.Uint64() startBlock := endBlock - ei.indexStep lastProcessedBlock := fromBlock.Uint64() + if startBlock < lastProcessedBlock { + startBlock = lastProcessedBlock + } logFilter := ei.GetFilter() // Find the last unprocessed log @@ -123,6 +123,7 @@ func (ei *EventIndexer) index(client *ethclient.Client, fromBlock, toBlock *big. } } } + log.Info("backward indexing", "block_num", startBlock, "target_num", lastProcessedBlock) // update query range endBlock = startBlock if endBlock <= lastProcessedBlock+ei.indexStep { @@ -139,7 +140,6 @@ func (ei *EventIndexer) index(client *ethclient.Client, fromBlock, toBlock *big. func (l *EventIndexer) GetFilter() ethereum.FilterQuery { return l.filterQuery } - -func (l *EventIndexer) GetStorePath() string { - return l.storePath +func (l *EventIndexer) GetStorage() IEventStorage { + return l.storage } diff --git a/tx-submitter/event/storage.go b/tx-submitter/event/storage.go index 7e206273..e40b83ed 100644 --- a/tx-submitter/event/storage.go +++ b/tx-submitter/event/storage.go @@ -3,74 +3,106 @@ package event import ( "encoding/json" "fmt" - "os" "sync" + + "morph-l2/tx-submitter/db" + "morph-l2/tx-submitter/params" ) type IEventStorage interface { Store() error Load() error + BlockProcessed() uint64 + SetBlockProcessed(blockNum uint64) + BlockTime() uint64 + SetBlockTime(blockTime uint64) + EventInfo() EventInfo } -var ( - defaultFilename = "event_info.json" -) - type EventInfo struct { BlockTime uint64 `json:"block_time"` // event emit time BlockProcessed uint64 `json:"block_processed"` // block processed } type EventInfoStorage struct { - EventInfo - Filename string `json:"filename"` // filename - lock sync.Mutex + eventInfo EventInfo + db db.Database + mu sync.RWMutex } -func NewEventInfoStorage(filename string) *EventInfoStorage { - if filename == "" { - filename = defaultFilename - } +func NewEventInfoStorage(db db.Database) *EventInfoStorage { return &EventInfoStorage{ - Filename: filename, + db: db, } } func (e *EventInfoStorage) Store() error { - // Convert struct to JSON string - jsonData, err := json.Marshal(e) + jsonData, err := json.Marshal(e.eventInfo) if err != nil { return fmt.Errorf("failed to convert struct to JSON: %w", err) } - e.lock.Lock() - defer e.lock.Unlock() + e.mu.Lock() + defer e.mu.Unlock() // Write JSON data to file - err = os.WriteFile(e.Filename, jsonData, 0600) + err = e.db.PutString(params.EventInfoKey, string(jsonData)) if err != nil { - return fmt.Errorf("failed to write to file: %w", err) + return fmt.Errorf("failed to write to db: err=%w, data=%v", err, jsonData) } - return nil } + func (e *EventInfoStorage) Load() error { - e.lock.Lock() - defer e.lock.Unlock() - jsonData, err := os.ReadFile(e.Filename) + e.mu.Lock() + defer e.mu.Unlock() + + jsonStr, err := e.db.GetString(params.EventInfoKey) if err != nil { - if os.IsNotExist(err) { - e.EventInfo = EventInfo{} + if err == db.ErrKeyNotFound { + // Initialize with default values if not found + e.eventInfo = EventInfo{} return nil } - return fmt.Errorf("failed to read file: %w", err) + return fmt.Errorf("failed to read from db: %w", err) } - // parse json data to struct - err = json.Unmarshal(jsonData, e) + err = json.Unmarshal([]byte(jsonStr), &e.eventInfo) if err != nil { - return fmt.Errorf("failed to unmarshal JSON: %w", err) + return fmt.Errorf("failed to parse JSON: %w", err) } return nil } + +func (e *EventInfoStorage) BlockProcessed() uint64 { + e.mu.RLock() + defer e.mu.RUnlock() + return e.eventInfo.BlockProcessed +} + +func (e *EventInfoStorage) SetBlockProcessed(blockNum uint64) { + e.mu.Lock() + defer e.mu.Unlock() + e.eventInfo.BlockProcessed = blockNum +} + +func (e *EventInfoStorage) BlockTime() uint64 { + e.mu.RLock() + defer e.mu.RUnlock() + return e.eventInfo.BlockTime +} + +func (e *EventInfoStorage) SetBlockTime(blockTime uint64) { + e.mu.Lock() + defer e.mu.Unlock() + e.eventInfo.BlockTime = blockTime +} + +// EventInfo returns a copy of the current event info. +// This ensures thread safety without exposing the internal state. +func (e *EventInfoStorage) EventInfo() EventInfo { + e.mu.RLock() + defer e.mu.RUnlock() + return e.eventInfo +} diff --git a/tx-submitter/event/storage_test.go b/tx-submitter/event/storage_test.go index 7ba32dbb..2299bab5 100644 --- a/tx-submitter/event/storage_test.go +++ b/tx-submitter/event/storage_test.go @@ -1,25 +1,40 @@ package event import ( + "morph-l2/tx-submitter/db" + "os" + "path/filepath" "testing" "github.com/stretchr/testify/require" ) func TestEventInfoStorage(t *testing.T) { - filename := "hello.json" - storage := NewEventInfoStorage(filename) - err := storage.Load() + // Create a unique test directory + testDir := filepath.Join(t.TempDir(), "testleveldb") + + // Cleanup before test (in case it exists) + os.RemoveAll(testDir) + + // Cleanup after test + t.Cleanup(func() { + os.RemoveAll(testDir) + }) + + db, err := db.New(testDir) + require.NoError(t, err) + storage := NewEventInfoStorage(db) + err = storage.Load() require.NoError(t, err) - storage.BlockTime = 100 - storage.BlockProcessed = 100 + storage.SetBlockTime(100) + storage.SetBlockProcessed(100) err = storage.Store() require.NoError(t, err) - storage2 := NewEventInfoStorage(filename) + storage2 := NewEventInfoStorage(db) err = storage2.Load() require.NoError(t, err) - require.Equal(t, storage.BlockTime, storage2.BlockTime) - require.Equal(t, storage.BlockProcessed, storage2.BlockProcessed) + require.Equal(t, storage.BlockTime(), storage2.BlockTime()) + require.Equal(t, storage.BlockProcessed(), storage2.BlockProcessed()) } diff --git a/tx-submitter/flags/flags.go b/tx-submitter/flags/flags.go index dcfe874c..e7de38ff 100644 --- a/tx-submitter/flags/flags.go +++ b/tx-submitter/flags/flags.go @@ -214,11 +214,29 @@ var ( Value: "StakingEventStore.json", } - CalldataFeeBumpFlag = cli.Uint64Flag{ - Name: "call_data_fee_bump", - Usage: "The fee bump for call data", - Value: 100, //fee = x * origin_fee/100 - EnvVar: prefixEnvVar("CALL_DATA_FEE_BUMP"), + TipFeeBumpFlag = cli.Uint64Flag{ + Name: "TIP_FEE_BUMP", + Usage: "The fee bump for tip", + Value: 120, //bumpTip = tip * TipFeeBump/100 + EnvVar: prefixEnvVar("TIP_FEE_BUMP"), + } + MaxTipFlag = cli.Uint64Flag{ + Name: "max_tip", + Usage: "The maximum tip for a transaction", + Value: 10e9, //10gwei + EnvVar: prefixEnvVar("MAX_TIP"), + } + MinTipFlag = cli.Uint64Flag{ + Name: "min_tip", + Usage: "The minimum tip for a transaction", + Value: 5e8, //0.5gwei + EnvVar: prefixEnvVar("MIN_TIP"), + } + MaxBaseFeeFlag = cli.Uint64Flag{ + Name: "max_base_fee", + Usage: "The maximum base fee for a transaction", + Value: 100e9, //100gwei + EnvVar: prefixEnvVar("MAX_BASE_FEE"), } MaxTxsInPendingPoolFlag = cli.Uint64Flag{ @@ -292,6 +310,20 @@ var ( Value: 100, EnvVar: prefixEnvVar("EVENT_INDEX_STEP"), } + LeveldbPathNameFlag = cli.StringFlag{ + Name: "leveldb_path_name", + Usage: "The path name of the leveldb", + EnvVar: prefixEnvVar("LEVELDB_PATH_NAME"), + Value: "submitter-leveldb", + } + + // l1 block not incremented threshold + BlockNotIncreasedThreshold = cli.Int64Flag{ + Name: "block_not_increased_threshold", + Usage: "The threshold for block not incremented", + Value: 5, + EnvVar: prefixEnvVar("BLOCK_NOT_INCREASED_THRESHOLD"), + } ) var requiredFlags = []cli.Flag{ @@ -331,7 +363,10 @@ var optionalFlags = []cli.Flag{ PrivateKeyFlag, L2SequencerAddressFlag, L2GovAddressFlag, - CalldataFeeBumpFlag, + TipFeeBumpFlag, + MaxTipFlag, + MinTipFlag, + MaxBaseFeeFlag, MaxTxsInPendingPoolFlag, // external sign @@ -345,6 +380,8 @@ var optionalFlags = []cli.Flag{ RotatorBufferFlag, StakingEventStoreFileFlag, EventIndexStepFlag, + LeveldbPathNameFlag, + BlockNotIncreasedThreshold, } // Flags contains the list of configuration options available to the binary. diff --git a/tx-submitter/go.mod b/tx-submitter/go.mod index 3ad0de4c..6335257f 100644 --- a/tx-submitter/go.mod +++ b/tx-submitter/go.mod @@ -2,14 +2,15 @@ module morph-l2/tx-submitter go 1.22 -replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3.1 +replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3.2 require ( github.com/holiman/uint256 v1.2.4 github.com/morph-l2/externalsign v0.3.1 - github.com/morph-l2/go-ethereum v1.10.14-0.20241021080617-0ff2a10a9625 + github.com/morph-l2/go-ethereum v1.10.14-0.20250424011308-f42440d1ace1 github.com/prometheus/client_golang v1.17.0 github.com/stretchr/testify v1.9.0 + github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a github.com/tendermint/tendermint v0.35.9 github.com/urfave/cli v1.22.14 gopkg.in/natefinch/lumberjack.v2 v2.2.1 @@ -71,8 +72,8 @@ require ( github.com/scroll-tech/zktrie v0.8.4 // indirect github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/status-im/keycard-go v0.3.2 // indirect + github.com/stretchr/objx v0.5.2 // indirect github.com/supranational/blst v0.3.11 // indirect - github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect github.com/tklauser/go-sysconf v0.3.13 // indirect github.com/tklauser/numcpus v0.7.0 // indirect github.com/tyler-smith/go-bip39 v1.1.0 // indirect diff --git a/tx-submitter/go.sum b/tx-submitter/go.sum index b4439454..d2a8b941 100644 --- a/tx-submitter/go.sum +++ b/tx-submitter/go.sum @@ -162,14 +162,12 @@ github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqky github.com/mmcloughlin/profile v0.1.1/go.mod h1:IhHD7q1ooxgwTgjxQYkACGA77oFTDdFVejUS1/tS/qU= github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= -github.com/morph-l2/externalsign v0.3.0 h1:eVGON//ofO5eJSZvJQW+8HUeaGlg4seaS99SzS8GQc4= -github.com/morph-l2/externalsign v0.3.0/go.mod h1:b6NJ4GUiiG/gcSJsp3p8ExsIs4ZdphlrVALASnVoGJE= github.com/morph-l2/externalsign v0.3.1 h1:UYFDZFB0L85A4rDvuwLNBiGEi0kSmg9AZ2v8Q5O4dQo= github.com/morph-l2/externalsign v0.3.1/go.mod h1:b6NJ4GUiiG/gcSJsp3p8ExsIs4ZdphlrVALASnVoGJE= -github.com/morph-l2/go-ethereum v1.10.14-0.20241021080617-0ff2a10a9625 h1:4+cbRSS4lacSIC81RXxvA04UHhGVC4SHVn+bKeqhPSM= -github.com/morph-l2/go-ethereum v1.10.14-0.20241021080617-0ff2a10a9625/go.mod h1:sMJCfHOBzVRDkM2yF/Hy+oUk2rgC0CQZHTLs0cyzhhk= -github.com/morph-l2/tendermint v0.3.1 h1:yqyM3/p9sCNmFSsIFeIxS5RBgXHWqbtyNHx16I9cIZ0= -github.com/morph-l2/tendermint v0.3.1/go.mod h1:TtCzp9l6Z6yDUiwv3TbqKqw8Q8RKp3fSz5+adO1/Y8w= +github.com/morph-l2/go-ethereum v1.10.14-0.20250424011308-f42440d1ace1 h1:Mtl4361Zdc8w3SgCI7L/NuPeLaVdX1L/uP/D4ur/9Yw= +github.com/morph-l2/go-ethereum v1.10.14-0.20250424011308-f42440d1ace1/go.mod h1:sMJCfHOBzVRDkM2yF/Hy+oUk2rgC0CQZHTLs0cyzhhk= +github.com/morph-l2/tendermint v0.3.2 h1:Gu6Uj2G6c3YP2NAKFi7A46JZaOCdD4zfZDKCjt0pDm8= +github.com/morph-l2/tendermint v0.3.2/go.mod h1:TtCzp9l6Z6yDUiwv3TbqKqw8Q8RKp3fSz5+adO1/Y8w= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8 h1:nPr65rt6Y5JFSKQO7qToXr7pePgD6Gwiw05lkbyAQTE= @@ -241,6 +239,8 @@ github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+ github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw= github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo= +github.com/stretchr/objx v0.5.2 h1:xuMeJ0Sdp5ZMRXx/aWO6RZxdr3beISkG5/G/aIRr3pY= +github.com/stretchr/objx v0.5.2/go.mod h1:FRsXN1f5AsAjCGJKqEizvkpNtU+EGNCLh3NxZ/8L+MA= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= github.com/stretchr/testify v1.5.1/go.mod h1:5W2xD1RspED5o8YsWQXVCued0rvSQ+mT+I5cxcmMvtA= diff --git a/tx-submitter/iface/batch_fetcher.go b/tx-submitter/iface/batch_fetcher.go new file mode 100644 index 00000000..0bf3bb16 --- /dev/null +++ b/tx-submitter/iface/batch_fetcher.go @@ -0,0 +1,8 @@ +package iface + +import "github.com/morph-l2/go-ethereum/eth" + +// BatchFetcher defines the interface for fetching batch data from nodes +type BatchFetcher interface { + GetRollupBatchByIndex(index uint64) (*eth.RPCRollupBatch, error) +} diff --git a/tx-submitter/iface/metrics.go b/tx-submitter/iface/metrics.go new file mode 100644 index 00000000..6b34a82d --- /dev/null +++ b/tx-submitter/iface/metrics.go @@ -0,0 +1,7 @@ +package iface + +type IMetrics interface { + // Reorg metrics + IncReorgs() + SetReorgDepth(depth float64) +} diff --git a/tx-submitter/iface/reorg_detector.go b/tx-submitter/iface/reorg_detector.go new file mode 100644 index 00000000..896c4db3 --- /dev/null +++ b/tx-submitter/iface/reorg_detector.go @@ -0,0 +1,13 @@ +package iface + +import "context" + +// IReorgDetector defines the interface for chain reorganization detection +type IReorgDetector interface { + // DetectReorg checks if a chain reorganization has occurred + // Returns: + // - bool: whether a reorg was detected + // - uint64: the depth of the reorg (number of blocks from head) + // - error: any error that occurred during detection + DetectReorg(ctx context.Context) (bool, uint64, error) +} diff --git a/tx-submitter/l1checker/blockmonitor.go b/tx-submitter/l1checker/blockmonitor.go new file mode 100644 index 00000000..9c870809 --- /dev/null +++ b/tx-submitter/l1checker/blockmonitor.go @@ -0,0 +1,67 @@ +package l1checker + +import ( + "context" + "sync" + "time" + + "morph-l2/tx-submitter/iface" + + "github.com/morph-l2/go-ethereum/log" +) + +const blockTime = time.Second * 12 + +type IBlockMonitor interface { + BlockNotIncreasedIn(time.Duration) bool +} + +type BlockMonitor struct { + blockGenerateTime time.Duration //12s for Dencun + latestBlockTime time.Time + noGrowthBlockCntTime time.Duration + client iface.L1Client + mu sync.Mutex +} + +func NewBlockMonitor(notGrowthInBlocks int64, client iface.L1Client) *BlockMonitor { + return &BlockMonitor{ + blockGenerateTime: blockTime, + latestBlockTime: time.Time{}, + noGrowthBlockCntTime: time.Duration(notGrowthInBlocks) * blockTime, + client: client, + } +} + +func (m *BlockMonitor) StartMonitoring() { + ticker := time.NewTicker(m.blockGenerateTime) + for ; ; <-ticker.C { + header, err := m.client.HeaderByNumber(context.Background(), nil) + if err != nil { + log.Warn("failed to get block in blockmonitor", "error", err) + continue + } + m.SetLatestBlockTime(time.Unix(int64(header.Time), 0)) + } +} + +func (m *BlockMonitor) IsGrowth() bool { + t := m.GetLatestBlockTime() + if t.IsZero() { + log.Warn("latest block time is zero") + return false + } + return time.Since(t) < m.noGrowthBlockCntTime +} + +func (m *BlockMonitor) SetLatestBlockTime(t time.Time) { + m.mu.Lock() + defer m.mu.Unlock() + m.latestBlockTime = t +} + +func (m *BlockMonitor) GetLatestBlockTime() time.Time { + m.mu.Lock() + defer m.mu.Unlock() + return m.latestBlockTime +} diff --git a/tx-submitter/l1checker/blockmonitor_test.go b/tx-submitter/l1checker/blockmonitor_test.go new file mode 100644 index 00000000..846e814c --- /dev/null +++ b/tx-submitter/l1checker/blockmonitor_test.go @@ -0,0 +1,23 @@ +package l1checker + +import ( + "testing" + "time" + + "github.com/stretchr/testify/require" +) + +func TestIsGrowth(t *testing.T) { + + blockCnt := int64(2) + monitor := NewBlockMonitor(blockCnt, nil) + monitor.latestBlockTime = time.Time{} + require.Equal(t, false, monitor.IsGrowth()) + + monitor.latestBlockTime = time.Now() + require.Equal(t, true, monitor.IsGrowth()) + + monitor.latestBlockTime = time.Now().Add(-monitor.noGrowthBlockCntTime) + require.Equal(t, false, monitor.IsGrowth()) + +} diff --git a/tx-submitter/localpool/journal.go b/tx-submitter/localpool/journal.go index ca918f10..5b17d07c 100644 --- a/tx-submitter/localpool/journal.go +++ b/tx-submitter/localpool/journal.go @@ -82,7 +82,7 @@ func (j *Journal) ParseAllTxs() ([]*types.Transaction, error) { content, err := readFileContent(j.path) if err != nil { - return nil, fmt.Errorf("failed to parse txs: %w", err) + return nil, fmt.Errorf("failed to read journal file: %w", err) } if len(content) == 0 { diff --git a/tx-submitter/metrics/metrics.go b/tx-submitter/metrics/metrics.go index 05f9d1af..0e3b83f0 100644 --- a/tx-submitter/metrics/metrics.go +++ b/tx-submitter/metrics/metrics.go @@ -4,111 +4,194 @@ import ( "net" "net/http" "strconv" + "sync/atomic" "github.com/prometheus/client_golang/prometheus" - "github.com/prometheus/client_golang/prometheus/promauto" "github.com/prometheus/client_golang/prometheus/promhttp" ) -const metricsNamespace = "submitter" - +// Metrics represents the metrics collection for the tx-submitter type Metrics struct { - RpcErrors prometheus.Counter WalletBalance prometheus.Gauge - RollupCostSum prometheus.Counter - FinalizeCostSum prometheus.Counter + RpcErrors prometheus.Counter + RollupCostSum prometheus.Gauge + FinalizeCostSum prometheus.Gauge RollupCost prometheus.Gauge FinalizeCost prometheus.Gauge - L1FeeCollectionSum prometheus.Counter - L1FeeCollection prometheus.Gauge + CollectedL1FeeSum prometheus.Gauge IndexerBlockProcessed prometheus.Gauge + LastCommittedBatch prometheus.Gauge + LastFinalizedBatch prometheus.Gauge + reorgs prometheus.Counter + reorgDepthVal uint64 + reorgCountVal uint64 + confirmedTxs *prometheus.CounterVec } +// NewMetrics creates a new Metrics instance func NewMetrics() *Metrics { - - return &Metrics{ - RpcErrors: promauto.NewCounter(prometheus.CounterOpts{ - Name: "submitter_rpc_errors", - Help: "Number of RPC errors encountered", - Namespace: metricsNamespace, + m := &Metrics{ + WalletBalance: prometheus.NewGauge(prometheus.GaugeOpts{ + Name: "tx_submitter_wallet_balance", + Help: "Current balance of the submitter wallet in ETH", }), - WalletBalance: promauto.NewGauge(prometheus.GaugeOpts{ - Name: "submitter_wallet_balance", - Help: "Wallet balance", - Namespace: metricsNamespace, + RpcErrors: prometheus.NewCounter(prometheus.CounterOpts{ + Name: "tx_submitter_rpc_errors_total", + Help: "Total number of RPC errors encountered", }), - RollupCostSum: promauto.NewCounter(prometheus.CounterOpts{ - Name: "submitter_rollup_cost_sum", - Help: "Rollup cost", - Namespace: metricsNamespace, + RollupCostSum: prometheus.NewGauge(prometheus.GaugeOpts{ + Name: "tx_submitter_rollup_cost_sum", + Help: "Total cost of rollup transactions in ETH", }), - FinalizeCostSum: promauto.NewCounter(prometheus.CounterOpts{ - Name: "submitter_finalize_cost_sum", - Help: "Finalize cost", - Namespace: metricsNamespace, + FinalizeCostSum: prometheus.NewGauge(prometheus.GaugeOpts{ + Name: "tx_submitter_finalize_cost_sum", + Help: "Total cost of finalize transactions in ETH", }), - RollupCost: promauto.NewGauge(prometheus.GaugeOpts{ - Name: "submitter_rollup_cost", - Help: "Rollup cost", - Namespace: metricsNamespace, + RollupCost: prometheus.NewGauge(prometheus.GaugeOpts{ + Name: "tx_submitter_rollup_cost", + Help: "Current rollup transaction cost in ETH", }), - FinalizeCost: promauto.NewGauge(prometheus.GaugeOpts{ - Name: "submitter_finalize_cost", - Help: "Finalize cost", - Namespace: metricsNamespace, + FinalizeCost: prometheus.NewGauge(prometheus.GaugeOpts{ + Name: "tx_submitter_finalize_cost", + Help: "Current finalize transaction cost in ETH", }), - L1FeeCollection: promauto.NewGauge(prometheus.GaugeOpts{ - Name: "submitter_l1_fee_collection", - Help: "L1 fee collection", - Namespace: metricsNamespace, + CollectedL1FeeSum: prometheus.NewGauge(prometheus.GaugeOpts{ + Name: "tx_submitter_collected_l1_fee_sum", + Help: "Total L1 fees collected in ETH", }), - L1FeeCollectionSum: promauto.NewCounter(prometheus.CounterOpts{ - Name: "submitter_l1_fee_collection_sum", - Help: "L1 fee collection", - Namespace: metricsNamespace, + IndexerBlockProcessed: prometheus.NewGauge(prometheus.GaugeOpts{ + Name: "tx_submitter_indexer_block_processed", + Help: "Latest block number processed by the indexer", }), - - IndexerBlockProcessed: promauto.NewGauge(prometheus.GaugeOpts{ - Name: "submitter_indexer_block_processed", - Help: "Indexer block processed", - Namespace: metricsNamespace, + LastCommittedBatch: prometheus.NewGauge(prometheus.GaugeOpts{ + Name: "tx_submitter_last_committed_batch", + Help: "Latest batch committed by the submitter", + }), + LastFinalizedBatch: prometheus.NewGauge(prometheus.GaugeOpts{ + Name: "tx_submitter_last_finalized_batch", + Help: "Latest batch finalized by the submitter", }), + reorgs: prometheus.NewCounter(prometheus.CounterOpts{ + Name: "tx_submitter_reorgs_total", + Help: "Total number of chain reorganizations detected", + }), + confirmedTxs: prometheus.NewCounterVec( + prometheus.CounterOpts{ + Name: "tx_submitter_confirmed_txs_total", + Help: "Total number of confirmed transactions by type", + }, + []string{"type"}, + ), } -} -func (m *Metrics) Serve(hostname string, port uint64) (*http.Server, error) { - mux := http.NewServeMux() - mux.Handle("/metrics", promhttp.Handler()) - srv := new(http.Server) - srv.Addr = net.JoinHostPort(hostname, strconv.FormatUint(port, 10)) - srv.Handler = mux - err := srv.ListenAndServe() - return srv, err + // Register metrics with Prometheus + // We use Register instead of MustRegister to avoid panics if metrics are already registered + _ = prometheus.Register(m.WalletBalance) + _ = prometheus.Register(m.RpcErrors) + _ = prometheus.Register(m.RollupCostSum) + _ = prometheus.Register(m.FinalizeCostSum) + _ = prometheus.Register(m.RollupCost) + _ = prometheus.Register(m.FinalizeCost) + _ = prometheus.Register(m.CollectedL1FeeSum) + _ = prometheus.Register(m.IndexerBlockProcessed) + _ = prometheus.Register(m.LastCommittedBatch) + _ = prometheus.Register(m.LastFinalizedBatch) + _ = prometheus.Register(m.reorgs) + _ = prometheus.Register(m.confirmedTxs) + + return m } +// SetWalletBalance sets the wallet balance metric func (m *Metrics) SetWalletBalance(balance float64) { m.WalletBalance.Set(balance) } +// IncRpcErrors increments the RPC error counter func (m *Metrics) IncRpcErrors() { m.RpcErrors.Inc() } +// SetRollupCost sets the rollup cost metrics func (m *Metrics) SetRollupCost(cost float64) { - m.RollupCostSum.Add(cost) + m.RollupCostSum.Set(cost) m.RollupCost.Set(cost) } +// SetFinalizeCost sets the finalize cost metrics func (m *Metrics) SetFinalizeCost(cost float64) { - m.FinalizeCostSum.Add(cost) - m.RollupCost.Set(cost) + m.FinalizeCostSum.Set(cost) + m.FinalizeCost.Set(cost) } +// SetCollectedL1Fee sets the collected L1 fee metric func (m *Metrics) SetCollectedL1Fee(cost float64) { - m.L1FeeCollectionSum.Add(cost) - m.L1FeeCollection.Set(cost) + m.CollectedL1FeeSum.Set(cost) } +// SetIndexerBlockProcessed sets the indexer block processed metric func (m *Metrics) SetIndexerBlockProcessed(blockNumber uint64) { m.IndexerBlockProcessed.Set(float64(blockNumber)) } + +// SetLastCommittedBatch sets the last committed batch index metric +func (m *Metrics) SetLastCommittedBatch(index uint64) { + m.LastCommittedBatch.Set(float64(index)) +} + +// SetLastFinalizedBatch sets the last finalized batch index metric +func (m *Metrics) SetLastFinalizedBatch(index uint64) { + m.LastFinalizedBatch.Set(float64(index)) +} + +// IncReorgs increments the reorg counter +func (m *Metrics) IncReorgs() { + atomic.AddUint64(&m.reorgCountVal, 1) + m.reorgs.Inc() +} + +// SetReorgDepth sets the reorg depth metric +func (m *Metrics) SetReorgDepth(depth float64) { + atomic.StoreUint64(&m.reorgDepthVal, uint64(depth)) +} + +// GetReorgDepth gets the current reorg depth +func (m *Metrics) GetReorgDepth() float64 { + return float64(atomic.LoadUint64(&m.reorgDepthVal)) +} + +// GetReorgCount gets the current reorg count +func (m *Metrics) GetReorgCount() float64 { + return float64(atomic.LoadUint64(&m.reorgCountVal)) +} + +// IncTxConfirmed increments the confirmed transaction counter for a given type +func (m *Metrics) IncTxConfirmed(txType string) { + m.confirmedTxs.WithLabelValues(txType).Inc() +} + +func (m *Metrics) Serve(hostname string, port uint64) (*http.Server, error) { + mux := http.NewServeMux() + mux.Handle("/metrics", promhttp.Handler()) + srv := new(http.Server) + srv.Addr = net.JoinHostPort(hostname, strconv.FormatUint(port, 10)) + srv.Handler = mux + err := srv.ListenAndServe() + return srv, err +} + +// UnregisterMetrics unregisters all metrics from the default registry +func (m *Metrics) UnregisterMetrics() { + prometheus.Unregister(m.WalletBalance) + prometheus.Unregister(m.RpcErrors) + prometheus.Unregister(m.RollupCostSum) + prometheus.Unregister(m.FinalizeCostSum) + prometheus.Unregister(m.RollupCost) + prometheus.Unregister(m.FinalizeCost) + prometheus.Unregister(m.CollectedL1FeeSum) + prometheus.Unregister(m.IndexerBlockProcessed) + prometheus.Unregister(m.LastCommittedBatch) + prometheus.Unregister(m.LastFinalizedBatch) + prometheus.Unregister(m.reorgs) + prometheus.Unregister(m.confirmedTxs) +} diff --git a/tx-submitter/mock/db.go b/tx-submitter/mock/db.go new file mode 100644 index 00000000..2eb44844 --- /dev/null +++ b/tx-submitter/mock/db.go @@ -0,0 +1,55 @@ +package mock + +import ( + "strconv" + "sync" + + "morph-l2/tx-submitter/db" +) + +type MockDB struct { + store map[string]string + m sync.RWMutex +} + +func NewMockDB() *MockDB { + return &MockDB{ + store: make(map[string]string), + } +} + +func (d *MockDB) GetString(key string) (string, error) { + d.m.RLock() + defer d.m.RUnlock() + if val, ok := d.store[key]; ok { + return val, nil + } + return "", db.ErrKeyNotFound +} + +func (d *MockDB) PutString(key, val string) error { + d.m.Lock() + defer d.m.Unlock() + d.store[key] = val + return nil +} + +func (d *MockDB) GetFloat(key string) (float64, error) { + d.m.RLock() + defer d.m.RUnlock() + if val, ok := d.store[key]; ok { + return strconv.ParseFloat(val, 64) + } + return 0, db.ErrKeyNotFound +} + +func (d *MockDB) PutFloat(key string, val float64) error { + d.m.Lock() + defer d.m.Unlock() + d.store[key] = strconv.FormatFloat(val, 'f', -1, 64) + return nil +} + +func (d *MockDB) Close() error { + return nil +} diff --git a/tx-submitter/mock/event_storage.go b/tx-submitter/mock/event_storage.go new file mode 100644 index 00000000..e2608772 --- /dev/null +++ b/tx-submitter/mock/event_storage.go @@ -0,0 +1,26 @@ +package mock + +import ( + "morph-l2/tx-submitter/event" +) + +// MockEventInfoStorage is a mock implementation of the EventInfoStorage +type MockEventInfoStorage struct { + event.EventInfoStorage +} + +// NewMockEventInfoStorage creates a new mock EventInfoStorage +func NewMockEventInfoStorage() *event.EventInfoStorage { + mockDB := NewMockDB() + return event.NewEventInfoStorage(mockDB) +} + +// Store implements the Store method +func (m *MockEventInfoStorage) Store() error { + return nil +} + +// Load implements the Load method +func (m *MockEventInfoStorage) Load() error { + return nil +} diff --git a/tx-submitter/mock/journal.go b/tx-submitter/mock/journal.go new file mode 100644 index 00000000..abe25dec --- /dev/null +++ b/tx-submitter/mock/journal.go @@ -0,0 +1,34 @@ +package mock + +import ( + "github.com/morph-l2/go-ethereum/core/types" +) + +// MockJournal is a mock implementation of the journal interface for testing +type MockJournal struct { + txs []*types.Transaction +} + +func NewMockJournal() *MockJournal { + return &MockJournal{ + txs: make([]*types.Transaction, 0), + } +} + +func (j *MockJournal) Init() error { + return nil +} + +func (j *MockJournal) AppendTx(tx *types.Transaction) error { + j.txs = append(j.txs, tx) + return nil +} + +func (j *MockJournal) ParseAllTxs() ([]*types.Transaction, error) { + return j.txs, nil +} + +func (j *MockJournal) Clean() error { + j.txs = make([]*types.Transaction, 0) + return nil +} diff --git a/tx-submitter/mock/l1client.go b/tx-submitter/mock/l1client.go new file mode 100644 index 00000000..92565d65 --- /dev/null +++ b/tx-submitter/mock/l1client.go @@ -0,0 +1,240 @@ +package mock + +import ( + "context" + "fmt" + "math/big" + + "github.com/morph-l2/go-ethereum" + "github.com/morph-l2/go-ethereum/common" + "github.com/morph-l2/go-ethereum/core/types" + "github.com/morph-l2/go-ethereum/ethclient" +) + +// L1ClientWrapper is a mock implementation of the L1 client interface +type L1ClientWrapper struct { + *ethclient.Client + Block *types.Block + TipCap *big.Int + SendTxErr error + MockReorg bool + MockReorgDepth uint64 + CallContractErr error + CallContractResult []byte + CodeAtErr error + CodeAtResult []byte + BaseFee *big.Int + Header *types.Header + // Track transactions and their status + transactions map[common.Hash]*types.Transaction + receipts map[common.Hash]*types.Receipt + // Track block history for reorg simulation + blockHistory map[uint64]*types.Block + // Track original block hashes before reorg + originalHashes map[uint64]common.Hash +} + +// FilterLogs implements iface.Client. +func (l *L1ClientWrapper) FilterLogs(ctx context.Context, query ethereum.FilterQuery) ([]types.Log, error) { + panic("unimplemented") +} + +// NonceAt implements iface.Client. +func (l *L1ClientWrapper) NonceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (uint64, error) { + panic("unimplemented") +} + +// PendingCodeAt implements iface.Client. +func (l *L1ClientWrapper) PendingCodeAt(ctx context.Context, account common.Address) ([]byte, error) { + panic("unimplemented") +} + +// SubscribeFilterLogs implements iface.Client. +func (l *L1ClientWrapper) SubscribeFilterLogs(ctx context.Context, query ethereum.FilterQuery, ch chan<- types.Log) (ethereum.Subscription, error) { + panic("unimplemented") +} + +// SuggestGasPrice implements iface.Client. +func (l *L1ClientWrapper) SuggestGasPrice(ctx context.Context) (*big.Int, error) { + panic("unimplemented") +} + +// NewL1ClientWrapper creates a new mock L1 client wrapper +func NewL1ClientWrapper() *L1ClientWrapper { + header := &types.Header{ + Number: big.NewInt(100), + Time: uint64(1234567890), + BaseFee: big.NewInt(1e9), + ExcessBlobGas: new(uint64), + } + *header.ExcessBlobGas = 0 + block := types.NewBlockWithHeader(header) + return &L1ClientWrapper{ + Client: nil, + Block: block, + TipCap: big.NewInt(1e9), + BaseFee: big.NewInt(1e9), + Header: header, + transactions: make(map[common.Hash]*types.Transaction), + receipts: make(map[common.Hash]*types.Receipt), + blockHistory: make(map[uint64]*types.Block), + originalHashes: make(map[uint64]common.Hash), + } +} + +// BlockNumber returns the current block number +func (l *L1ClientWrapper) BlockNumber(ctx context.Context) (uint64, error) { + if l.Block != nil { + return l.Block.NumberU64(), nil + } + return 0, nil +} + +// HeaderByNumber returns the block header at the given number +func (l *L1ClientWrapper) HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error) { + if l.Header != nil { + if l.Header.ExcessBlobGas == nil { + l.Header.ExcessBlobGas = new(uint64) + *l.Header.ExcessBlobGas = 0 + } + return l.Header, nil + } + return nil, ethereum.NotFound +} + +// BlockByNumber returns the block at the given number +func (l *L1ClientWrapper) BlockByNumber(ctx context.Context, number *big.Int) (*types.Block, error) { + if number == nil { + return l.Block, nil + } + + blockNum := number.Uint64() + if l.MockReorg && blockNum > l.MockReorgDepth { + // If we haven't stored the original hash, store it + if _, ok := l.originalHashes[blockNum]; !ok { + if block, ok := l.blockHistory[blockNum]; ok { + l.originalHashes[blockNum] = block.Hash() + } + } + + // Return a block with a different hash to simulate reorg + header := &types.Header{ + Number: number, + Time: uint64(1234567890), + ParentHash: common.HexToHash("0x" + fmt.Sprintf("%x", blockNum+1)), + BaseFee: big.NewInt(1e9), + ExcessBlobGas: new(uint64), + } + *header.ExcessBlobGas = 0 + block := types.NewBlockWithHeader(header) + l.blockHistory[blockNum] = block + l.SimulateReorg() + return block, nil + } + + if block, ok := l.blockHistory[blockNum]; ok { + return block, nil + } + + // For blocks before reorg depth, return blocks with consistent hashes + header := &types.Header{ + Number: number, + Time: uint64(1234567890), + ParentHash: common.HexToHash("0x" + fmt.Sprintf("%x", blockNum)), + BaseFee: big.NewInt(1e9), + ExcessBlobGas: new(uint64), + } + *header.ExcessBlobGas = 0 + block := types.NewBlockWithHeader(header) + l.blockHistory[blockNum] = block + return block, nil +} + +func (l *L1ClientWrapper) CallContract(ctx context.Context, msg ethereum.CallMsg, blockNumber *big.Int) ([]byte, error) { + if l.CallContractErr != nil { + return nil, l.CallContractErr + } + return l.CallContractResult, nil +} + +func (l *L1ClientWrapper) TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error) { + if l.MockReorg { + // During reorg, all transactions should be considered missing + return nil, ethereum.NotFound + } + if receipt, ok := l.receipts[txHash]; ok { + return receipt, nil + } + return nil, ethereum.NotFound +} + +func (l *L1ClientWrapper) TransactionByHash(ctx context.Context, hash common.Hash) (tx *types.Transaction, isPending bool, err error) { + if l.MockReorg { + // During reorg, all transactions should be considered missing + return nil, false, ethereum.NotFound + } + if tx, ok := l.transactions[hash]; ok { + // If there's no receipt, the transaction is pending + // If there's a receipt, the transaction is not pending + _, hasReceipt := l.receipts[hash] + return tx, !hasReceipt, nil + } + return nil, false, ethereum.NotFound +} + +func (l *L1ClientWrapper) PendingNonceAt(ctx context.Context, account common.Address) (uint64, error) { + return 0, nil +} + +func (l *L1ClientWrapper) SuggestGasTipCap(ctx context.Context) (*big.Int, error) { + return l.TipCap, nil +} + +func (l *L1ClientWrapper) EstimateGas(ctx context.Context, msg ethereum.CallMsg) (uint64, error) { + return 21000, nil +} + +func (l *L1ClientWrapper) SendTransaction(ctx context.Context, tx *types.Transaction) error { + if l.SendTxErr != nil { + return l.SendTxErr + } + l.transactions[tx.Hash()] = tx + if !l.MockReorg { + // Only create a receipt if we're not in reorg mode + l.receipts[tx.Hash()] = &types.Receipt{ + TxHash: tx.Hash(), + BlockNumber: l.Block.Number(), + Status: 1, // Success + } + } + return nil +} + +func (l *L1ClientWrapper) BalanceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (*big.Int, error) { + return big.NewInt(1e18), nil +} + +// CodeAt mocks the CodeAt method +func (l *L1ClientWrapper) CodeAt(ctx context.Context, contract common.Address, blockNumber *big.Int) ([]byte, error) { + if l.CodeAtErr != nil { + return nil, l.CodeAtErr + } + return l.CodeAtResult, nil +} + +// SimulateReorg simulates a reorg by clearing transaction receipts +func (l *L1ClientWrapper) SimulateReorg() { + l.receipts = make(map[common.Hash]*types.Receipt) +} + +func (l *L1ClientWrapper) AddTx(tx *types.Transaction) { + l.transactions[tx.Hash()] = tx +} +func (l *L1ClientWrapper) AddReceipt(receipt *types.Receipt) { + l.receipts[receipt.TxHash] = receipt +} + +// ClearReceipts removes all receipts to simulate reorg +func (l *L1ClientWrapper) ClearReceipts() { + l.receipts = make(map[common.Hash]*types.Receipt) +} diff --git a/tx-submitter/mock/l1staking.go b/tx-submitter/mock/l1staking.go new file mode 100644 index 00000000..08939b83 --- /dev/null +++ b/tx-submitter/mock/l1staking.go @@ -0,0 +1,62 @@ +package mock + +import ( + "math/big" + + "github.com/morph-l2/go-ethereum/accounts/abi/bind" + "github.com/morph-l2/go-ethereum/common" +) + +// MockL1Staking is a mock implementation of IL1Staking +type MockL1Staking struct { + activeStakers []common.Address +} + +// NewMockL1Staking creates a new mock L1Staking instance +func NewMockL1Staking() *MockL1Staking { + return &MockL1Staking{ + activeStakers: []common.Address{}, + } +} + +// IsStaker implements IL1Staking +func (m *MockL1Staking) IsStaker(opts *bind.CallOpts, addr common.Address) (bool, error) { + for _, staker := range m.activeStakers { + if staker == addr { + return true, nil + } + } + return false, nil +} + +// GetStakersBitmap implements IL1Staking +func (m *MockL1Staking) GetStakersBitmap(opts *bind.CallOpts, _stakers []common.Address) (*big.Int, error) { + bitmap := big.NewInt(0) + for i, staker := range _stakers { + for _, activeStaker := range m.activeStakers { + if staker == activeStaker { + bitmap.SetBit(bitmap, i, 1) + } + } + } + return bitmap, nil +} + +// GetActiveStakers implements IL1Staking +func (m *MockL1Staking) GetActiveStakers(opts *bind.CallOpts) ([]common.Address, error) { + return m.activeStakers, nil +} + +// GetStakers implements IL1Staking +func (m *MockL1Staking) GetStakers(opts *bind.CallOpts) ([255]common.Address, error) { + var result [255]common.Address + for i := 0; i < len(m.activeStakers) && i < 255; i++ { + result[i] = m.activeStakers[i] + } + return result, nil +} + +// SetActiveStakers sets the active stakers for testing +func (m *MockL1Staking) SetActiveStakers(stakers []common.Address) { + m.activeStakers = stakers +} diff --git a/tx-submitter/mock/l2client.go b/tx-submitter/mock/l2client.go new file mode 100644 index 00000000..4613b5b0 --- /dev/null +++ b/tx-submitter/mock/l2client.go @@ -0,0 +1,214 @@ +package mock + +import ( + "context" + "math/big" + "time" + + "github.com/morph-l2/go-ethereum" + "github.com/morph-l2/go-ethereum/common" + "github.com/morph-l2/go-ethereum/core/types" + "github.com/morph-l2/go-ethereum/eth" +) + +// L2ClientWrapper is a mock implementation of iface.L2Client +type L2ClientWrapper struct { + CallContractErr error + CallContractResult []byte + BlockByNumberErr error + Block *types.Block + Balance *big.Int + TipCap *big.Int + reorgDepth int64 + reorgCount int64 + sequencerSet []common.Address + BaseFee *big.Int +} + +func NewL2ClientWrapper() *L2ClientWrapper { + // Create mock CallContractResult for epoch update time + // Return a timestamp from 1 hour ago + timestamp := time.Now().Add(-1 * time.Hour).Unix() + result := make([]byte, 32) + big.NewInt(timestamp).FillBytes(result) + + // Create a mock sequencer set with two addresses + mockAddr1 := common.HexToAddress("0x1111111111111111111111111111111111111111") + mockAddr2 := common.HexToAddress("0x2222222222222222222222222222222222222222") + sequencerSet := []common.Address{mockAddr1, mockAddr2} + + return &L2ClientWrapper{ + TipCap: big.NewInt(1e9), + Balance: big.NewInt(1e18), + CallContractResult: result, + sequencerSet: sequencerSet, + BaseFee: big.NewInt(1e9), + } +} + +// CallContract implements the CallContract method +func (l *L2ClientWrapper) CallContract(ctx context.Context, msg ethereum.CallMsg, blockNumber *big.Int) ([]byte, error) { + if l.CallContractErr != nil { + return nil, l.CallContractErr + } + + // If calling the sequencer set method, return the mock sequencer set + if msg.Data != nil && len(msg.Data) >= 4 { + methodID := msg.Data[:4] + // Method ID for GetSequencerSet2() + if string(methodID) == "\x77\xd7\xdf\xfb" { + // Encode the sequencer set into bytes + result := make([]byte, 0) + // First 32 bytes for offset + offset := make([]byte, 32) + big.NewInt(32).FillBytes(offset) + result = append(result, offset...) + // Next 32 bytes for length + length := make([]byte, 32) + big.NewInt(int64(len(l.sequencerSet))).FillBytes(length) + result = append(result, length...) + // Then the addresses + for _, addr := range l.sequencerSet { + addrBytes := make([]byte, 32) + copy(addrBytes[12:], addr.Bytes()) + result = append(result, addrBytes...) + } + return result, nil + } + } + + return l.CallContractResult, nil +} + +// BlockByNumber implements the BlockByNumber method +func (l *L2ClientWrapper) BlockByNumber(ctx context.Context, number *big.Int) (*types.Block, error) { + if l.BlockByNumberErr != nil { + return nil, l.BlockByNumberErr + } + if l.Block != nil { + return l.Block, nil + } + return nil, ethereum.NotFound +} + +// HeaderByNumber implements the HeaderByNumber method +func (l *L2ClientWrapper) HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error) { + if l.Block != nil { + return l.Block.Header(), nil + } + return nil, ethereum.NotFound +} + +// BlockNumber implements the BlockNumber method +func (l *L2ClientWrapper) BlockNumber(ctx context.Context) (uint64, error) { + if l.Block != nil { + return l.Block.NumberU64(), nil + } + return 0, nil +} + +// GetReorgDepth returns the mock reorg depth +func (l *L2ClientWrapper) GetReorgDepth() int64 { + return l.reorgDepth +} + +// GetReorgCount returns the mock reorg count +func (l *L2ClientWrapper) GetReorgCount() int64 { + return l.reorgCount +} + +// SetReorgDepth sets the mock reorg depth +func (l *L2ClientWrapper) SetReorgDepth(depth int64) { + l.reorgDepth = depth +} + +// SetReorgCount sets the mock reorg count +func (l *L2ClientWrapper) SetReorgCount(count int64) { + l.reorgCount = count +} + +// BalanceAt implements the BalanceAt method +func (l *L2ClientWrapper) BalanceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (*big.Int, error) { + if l.Balance != nil { + return l.Balance, nil + } + return big.NewInt(0), nil +} + +// TransactionByHash implements the TransactionByHash method +func (l *L2ClientWrapper) TransactionByHash(ctx context.Context, hash common.Hash) (*types.Transaction, bool, error) { + return nil, false, ethereum.NotFound +} + +// NonceAt implements the NonceAt method +func (l *L2ClientWrapper) NonceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (uint64, error) { + return 0, nil +} + +// TransactionReceipt implements the TransactionReceipt method +func (l *L2ClientWrapper) TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error) { + return nil, ethereum.NotFound +} + +// CodeAt implements bind.ContractCaller +func (l *L2ClientWrapper) CodeAt(ctx context.Context, contract common.Address, blockNumber *big.Int) ([]byte, error) { + return nil, nil +} + +// PendingCodeAt implements bind.ContractCaller +func (l *L2ClientWrapper) PendingCodeAt(ctx context.Context, account common.Address) ([]byte, error) { + return nil, nil +} + +// PendingNonceAt implements bind.ContractTransactor +func (l *L2ClientWrapper) PendingNonceAt(ctx context.Context, account common.Address) (uint64, error) { + return 0, nil +} + +// SuggestGasPrice implements bind.ContractTransactor +func (l *L2ClientWrapper) SuggestGasPrice(ctx context.Context) (*big.Int, error) { + return big.NewInt(1e9), nil +} + +// EstimateGas implements bind.ContractTransactor +func (l *L2ClientWrapper) EstimateGas(ctx context.Context, call ethereum.CallMsg) (uint64, error) { + return 21000, nil +} + +// SendTransaction implements bind.ContractTransactor +func (l *L2ClientWrapper) SendTransaction(ctx context.Context, tx *types.Transaction) error { + return nil +} + +// FilterLogs implements bind.ContractFilterer +func (l *L2ClientWrapper) FilterLogs(ctx context.Context, query ethereum.FilterQuery) ([]types.Log, error) { + return nil, nil +} + +// SubscribeFilterLogs implements bind.ContractFilterer +func (l *L2ClientWrapper) SubscribeFilterLogs(ctx context.Context, query ethereum.FilterQuery, ch chan<- types.Log) (ethereum.Subscription, error) { + return nil, nil +} + +// GetBlockTraceByNumber implements L2Client +func (l *L2ClientWrapper) GetBlockTraceByNumber(ctx context.Context, number *big.Int) (*types.BlockTrace, error) { + return nil, nil +} + +// GetRollupBatchByIndex implements L2Client +func (l *L2ClientWrapper) GetRollupBatchByIndex(ctx context.Context, batchIndex uint64) (*eth.RPCRollupBatch, error) { + return nil, nil +} + +// SuggestGasTipCap implements the SuggestGasTipCap method +func (l *L2ClientWrapper) SuggestGasTipCap(ctx context.Context) (*big.Int, error) { + if l.TipCap != nil { + return l.TipCap, nil + } + return big.NewInt(1e9), nil +} + +// GetSequencerSet2 implements IL2Sequencer +func (m *L2ClientWrapper) GetSequencerSet2() ([]common.Address, error) { + return m.sequencerSet, nil +} diff --git a/tx-submitter/mock/reorg_detector.go b/tx-submitter/mock/reorg_detector.go new file mode 100644 index 00000000..a2eea182 --- /dev/null +++ b/tx-submitter/mock/reorg_detector.go @@ -0,0 +1,49 @@ +package mock + +import ( + "context" + "sync" + + "morph-l2/tx-submitter/iface" +) + +// MockReorgDetector implements the IReorgDetector interface for testing +type MockReorgDetector struct { + mu sync.RWMutex + + // Mock return values + detectReorgReturn struct { + hasReorg bool + reorgDepth uint64 + err error + } +} + +// Ensure MockReorgDetector implements IReorgDetector +var _ iface.IReorgDetector = (*MockReorgDetector)(nil) + +// NewMockReorgDetector creates a new instance of MockReorgDetector +func NewMockReorgDetector() *MockReorgDetector { + m := &MockReorgDetector{} + // Initialize with default values + m.detectReorgReturn.hasReorg = false + m.detectReorgReturn.reorgDepth = 0 + m.detectReorgReturn.err = nil + return m +} + +// DetectReorg implements IReorgDetector.DetectReorg +func (m *MockReorgDetector) DetectReorg(ctx context.Context) (bool, uint64, error) { + m.mu.RLock() + defer m.mu.RUnlock() + return m.detectReorgReturn.hasReorg, m.detectReorgReturn.reorgDepth, m.detectReorgReturn.err +} + +// SetDetectReorgReturn sets the return values for the DetectReorg method +func (m *MockReorgDetector) SetDetectReorgReturn(hasReorg bool, reorgDepth uint64, err error) { + m.mu.Lock() + defer m.mu.Unlock() + m.detectReorgReturn.hasReorg = hasReorg + m.detectReorgReturn.reorgDepth = reorgDepth + m.detectReorgReturn.err = err +} diff --git a/tx-submitter/mock/rollup.go b/tx-submitter/mock/rollup.go new file mode 100644 index 00000000..6dd534ff --- /dev/null +++ b/tx-submitter/mock/rollup.go @@ -0,0 +1,91 @@ +package mock + +import ( + "math/big" + + "github.com/morph-l2/go-ethereum/core/types" + + "github.com/morph-l2/go-ethereum/accounts/abi/bind" + + "morph-l2/bindings/bindings" +) + +// MockRollup implements the IRollup interface for testing +type MockRollup struct { + lastCommittedBatchIndex *big.Int + lastFinalizedBatchIndex *big.Int + insideChallengeWindow bool + batchExists bool + batchTx *types.Transaction + finalizeTx *types.Transaction +} + +// NewMockRollup creates a new instance of MockRollup +func NewMockRollup() *MockRollup { + return &MockRollup{ + lastCommittedBatchIndex: big.NewInt(0), + lastFinalizedBatchIndex: big.NewInt(0), + insideChallengeWindow: false, + batchExists: false, + } +} + +// LastCommittedBatchIndex implements IRollup +func (m *MockRollup) LastCommittedBatchIndex(opts *bind.CallOpts) (*big.Int, error) { + return m.lastCommittedBatchIndex, nil +} + +// CommitBatch implements IRollup +func (m *MockRollup) CommitBatch(opts *bind.TransactOpts, batchDataInput bindings.IRollupBatchDataInput, batchSignatureInput bindings.IRollupBatchSignatureInput) (*types.Transaction, error) { + return m.batchTx, nil +} + +// LastFinalizedBatchIndex implements IRollup +func (m *MockRollup) LastFinalizedBatchIndex(opts *bind.CallOpts) (*big.Int, error) { + return m.lastFinalizedBatchIndex, nil +} + +// FinalizeBatch implements IRollup +func (m *MockRollup) FinalizeBatch(opts *bind.TransactOpts, data []byte) (*types.Transaction, error) { + return m.finalizeTx, nil +} + +// BatchInsideChallengeWindow implements IRollup +func (m *MockRollup) BatchInsideChallengeWindow(opts *bind.CallOpts, batchIndex *big.Int) (bool, error) { + return m.insideChallengeWindow, nil +} + +// BatchExist implements IRollup +func (m *MockRollup) BatchExist(opts *bind.CallOpts, batchIndex *big.Int) (bool, error) { + return m.batchExists, nil +} + +// SetLastCommittedBatchIndex sets the mock value for LastCommittedBatchIndex +func (m *MockRollup) SetLastCommittedBatchIndex(index *big.Int) { + m.lastCommittedBatchIndex = index +} + +// SetLastFinalizedBatchIndex sets the mock value for LastFinalizedBatchIndex +func (m *MockRollup) SetLastFinalizedBatchIndex(index *big.Int) { + m.lastFinalizedBatchIndex = index +} + +// SetBatchInsideChallengeWindow sets the mock value for BatchInsideChallengeWindow +func (m *MockRollup) SetBatchInsideChallengeWindow(inside bool) { + m.insideChallengeWindow = inside +} + +// SetBatchExists sets the mock value for BatchExist +func (m *MockRollup) SetBatchExists(exists bool) { + m.batchExists = exists +} + +// SetFinalizeTx sets the mock value for FinalizeBatch transaction +func (m *MockRollup) SetFinalizeTx(tx *types.Transaction) { + m.finalizeTx = tx +} + +// SetBatchTx sets the mock value for CommitBatch transaction +func (m *MockRollup) SetBatchTx(tx *types.Transaction) { + m.batchTx = tx +} diff --git a/tx-submitter/params/leveldb_keys.go b/tx-submitter/params/leveldb_keys.go new file mode 100644 index 00000000..b998e6de --- /dev/null +++ b/tx-submitter/params/leveldb_keys.go @@ -0,0 +1,5 @@ +package params + +const ( + EventInfoKey = "event_info" +) diff --git a/tx-submitter/services/batch_fetcher.go b/tx-submitter/services/batch_fetcher.go new file mode 100644 index 00000000..7c658ab8 --- /dev/null +++ b/tx-submitter/services/batch_fetcher.go @@ -0,0 +1,39 @@ +package services + +import ( + "context" + "fmt" + "morph-l2/tx-submitter/iface" + + "github.com/morph-l2/go-ethereum/eth" +) + +type BatchFetcher struct { + l2Clients []iface.L2Client +} + +func NewBatchFetcher(l2Clients []iface.L2Client) *BatchFetcher { + return &BatchFetcher{ + l2Clients: l2Clients, + } +} + +func (bf *BatchFetcher) GetRollupBatchByIndex(index uint64) (*eth.RPCRollupBatch, error) { + // Try each L2 client until we get a successful response + var lastErr error + for _, client := range bf.l2Clients { + batch, err := client.GetRollupBatchByIndex(context.Background(), index) + if err != nil { + lastErr = err + continue + } + // Validate that batch exists and has signatures before returning + if batch != nil && len(batch.Signatures) > 0 { + return batch, nil + } + } + if lastErr != nil { + return nil, fmt.Errorf("failed to get batch %d from any L2 client: %w", index, lastErr) + } + return nil, fmt.Errorf("batch %d not found in any L2 client", index) +} diff --git a/tx-submitter/services/pendingtx.go b/tx-submitter/services/pendingtx.go index d0f706c9..fc5ac18c 100644 --- a/tx-submitter/services/pendingtx.go +++ b/tx-submitter/services/pendingtx.go @@ -4,236 +4,298 @@ import ( "fmt" "sort" "sync" + "sync/atomic" "time" "morph-l2/bindings/bindings" - journal "morph-l2/tx-submitter/localpool" + "morph-l2/tx-submitter/constants" + "morph-l2/tx-submitter/types" "morph-l2/tx-submitter/utils" "github.com/morph-l2/go-ethereum/accounts/abi" "github.com/morph-l2/go-ethereum/common" - "github.com/morph-l2/go-ethereum/core/types" + ethtypes "github.com/morph-l2/go-ethereum/core/types" "github.com/morph-l2/go-ethereum/log" ) -type TxInfo struct { - sendTime uint64 - tx *types.Transaction +const ( + // MethodCommitBatch is the method name for committing a batch + MethodCommitBatch = "commitBatch" + // MethodFinalizeBatch is the method name for finalizing a batch + MethodFinalizeBatch = "finalizeBatch" +) - queryTimes uint64 +// Journal defines the interface for transaction journaling +type Journal interface { + Init() error + AppendTx(tx *ethtypes.Transaction) error + ParseAllTxs() ([]*ethtypes.Transaction, error) + Clean() error } +// PendingTxs represents the pending transactions pool type PendingTxs struct { - mu sync.Mutex + mu sync.RWMutex - txinfos map[common.Hash]TxInfo + txinfos map[common.Hash]*types.TxRecord pnonce uint64 // pending nonce - failedIndex *uint64 - pindex uint64 // pending batch index + pindex uint64 // pending batch index + pfinalize uint64 - pfinalize uint64 commitBatchId []byte finalizeBatchId []byte - // journal - journal *journal.Journal + journal Journal } -func NewPendingTxs(cid []byte, fid []byte, journal *journal.Journal) *PendingTxs { - return &PendingTxs{ - txinfos: make(map[common.Hash]TxInfo), - commitBatchId: cid, - finalizeBatchId: fid, +// NewPendingTxs creates a new PendingTxs instance +func NewPendingTxs(commitBatchMethodId, finalizeBatchMethodId []byte, journal Journal) *PendingTxs { + pt := &PendingTxs{ + txinfos: make(map[common.Hash]*types.TxRecord), journal: journal, + commitBatchId: commitBatchMethodId, + finalizeBatchId: finalizeBatchMethodId, } + return pt } -func (pt *PendingTxs) Store(tx *types.Transaction) error { - err := pt.journal.AppendTx(tx) - if err != nil { - return fmt.Errorf("failed to store tx: %v", err) +// Store persists a transaction to the journal +func (pt *PendingTxs) Store(tx *ethtypes.Transaction) error { + if tx == nil { + return fmt.Errorf("cannot store nil transaction") + } + if err := pt.journal.AppendTx(tx); err != nil { + return fmt.Errorf("failed to store tx: %w", err) } return nil } +// dump persists all transactions to the journal func (pt *PendingTxs) dump() error { - err := pt.journal.Clean() - if err != nil { - return fmt.Errorf("failed to dump tx: %v", err) + if err := pt.journal.Clean(); err != nil { + return fmt.Errorf("failed to clean journal: %w", err) } + txinfos := pt.getAll() for _, info := range txinfos { - err := pt.journal.AppendTx(info.tx) - if err != nil { - return fmt.Errorf("failed to store tx: %v", err) + if err := pt.journal.AppendTx(info.Tx); err != nil { + return fmt.Errorf("failed to store tx: %w", err) } } return nil } -func (pt *PendingTxs) Add(tx *types.Transaction) { +// Add adds a transaction to the pending pool +func (pt *PendingTxs) Add(tx *ethtypes.Transaction) error { + if tx == nil { + return fmt.Errorf("cannot add nil transaction") + } + pt.mu.Lock() defer pt.mu.Unlock() - pt.txinfos[tx.Hash()] = TxInfo{ - sendTime: uint64(time.Now().Unix()), - tx: tx, + + hash := tx.Hash() + pt.txinfos[hash] = &types.TxRecord{ + Tx: tx, + SendTime: uint64(time.Now().Unix()), + QueryTimes: 0, + Confirmed: false, } - err := pt.journal.AppendTx(tx) - if err != nil { - log.Error("failed to append pending txs", "err", err) + if err := pt.journal.AppendTx(tx); err != nil { + delete(pt.txinfos, hash) + return fmt.Errorf("failed to append tx to journal: %w", err) } + + return nil } -func (pt *PendingTxs) Remove(txHash common.Hash) { +// Remove removes a transaction from the pending pool +func (pt *PendingTxs) Remove(txHash common.Hash) error { pt.mu.Lock() defer pt.mu.Unlock() - delete(pt.txinfos, txHash) - err := pt.dump() - if err != nil { - log.Error("failed to dump pending txs", "err", err) + if _, exists := pt.txinfos[txHash]; !exists { + return nil // tx already removed } -} - -// Recover from mempool -func (pt *PendingTxs) Recover(txs []*types.Transaction, a *abi.ABI) { - // restore state from mempool - if len(txs) > 0 { - var pbindex, pfindex uint64 - for _, tx := range txs { - pt.Add(tx) - - method := utils.ParseMethod(tx, a) - if method == "commitBatch" { - - index := utils.ParseParentBatchIndex(tx.Data()) - if index > pbindex { - pbindex = index - } - } else if method == "finalizeBatch" { - findex := utils.ParseFBatchIndex(tx.Data()) - if findex > pfindex { - pfindex = findex - } - } - } - - pt.SetPindex(pbindex) - pt.SetPFinalize(pfindex) - pt.SetNonce(txs[len(txs)-1].Nonce()) - - log.Info("Recover from mempool", - "tx_count", len(txs), - "max_batch_index", pbindex, - "max_finalize_index", pfindex, - "max_nonce", pt.pnonce, - ) - } else { - log.Info("journal tx is empty") - } + delete(pt.txinfos, txHash) + return pt.dump() } -func (pt *PendingTxs) GetAll() []TxInfo { - pt.mu.Lock() - defer pt.mu.Unlock() +// GetAll returns all pending transactions in nonce order +func (pt *PendingTxs) GetAll() []*types.TxRecord { + pt.mu.RLock() + defer pt.mu.RUnlock() return pt.getAll() } -func (pt *PendingTxs) getAll() []TxInfo { - // copy txs and return - txs := make([]TxInfo, 0, len(pt.txinfos)) + +func (pt *PendingTxs) getAll() []*types.TxRecord { + txs := make([]*types.TxRecord, 0, len(pt.txinfos)) for _, tx := range pt.txinfos { txs = append(txs, tx) } - // sort by nonce sort.SliceStable(txs, func(i, j int) bool { - return txs[i].tx.Nonce() < txs[j].tx.Nonce() + return txs[i].Tx.Nonce() < txs[j].Tx.Nonce() }) return txs } -func (pt *PendingTxs) Get(txHash common.Hash) (TxInfo, bool) { - pt.mu.Lock() - defer pt.mu.Unlock() - tx, ok := pt.txinfos[txHash] - return tx, ok +// GetTxRecord returns a transaction record by its hash +func (pt *PendingTxs) GetTxRecord(hash common.Hash) *types.TxRecord { + pt.mu.RLock() + defer pt.mu.RUnlock() + return pt.txinfos[hash] } +// IncQueryTimes increments the query times for a transaction +// only for missing tx func (pt *PendingTxs) IncQueryTimes(txHash common.Hash) { pt.mu.Lock() defer pt.mu.Unlock() - pt.txinfos[txHash] = TxInfo{tx: pt.txinfos[txHash].tx, queryTimes: pt.txinfos[txHash].queryTimes + 1, sendTime: pt.txinfos[txHash].sendTime} + if tx, ok := pt.txinfos[txHash]; ok { + tx.QueryTimes++ + } } -func (pt *PendingTxs) SetFailedStatus(index uint64) { +// MarkConfirmed marks a transaction as confirmed +func (pt *PendingTxs) MarkConfirmed(hash common.Hash) { pt.mu.Lock() defer pt.mu.Unlock() - - // failed index must be less than pindex - if pt.failedIndex != nil || index >= pt.pindex { - return + if record, exists := pt.txinfos[hash]; exists { + record.Confirmed = true } - - pt.failedIndex = &index } -func (pt *PendingTxs) SetPindex(index uint64) { + +// ClearConfirmedTxs marks all confirmed transactions as unconfirmed +func (pt *PendingTxs) ClearConfirmedTxs() { pt.mu.Lock() defer pt.mu.Unlock() - pt.pindex = index + for _, record := range pt.txinfos { + if record.Confirmed { + log.Info("Marking transaction as unconfirmed due to reorg", + "hash", record.Tx.Hash().String(), + "nonce", record.Tx.Nonce()) + record.Confirmed = false + } + } } +// SetNonce sets the pending nonce func (pt *PendingTxs) SetNonce(nonce uint64) { - pt.mu.Lock() - defer pt.mu.Unlock() - pt.pnonce = nonce + atomic.StoreUint64(&pt.pnonce, nonce) } -func (pt *PendingTxs) SetPFinalize(finalize uint64) { - pt.mu.Lock() - defer pt.mu.Unlock() - pt.pfinalize = finalize +// GetNonce gets the current pending nonce +func (pt *PendingTxs) GetNonce() uint64 { + return atomic.LoadUint64(&pt.pnonce) } -func (pt *PendingTxs) RemoveRollupRestriction() { - pt.mu.Lock() - defer pt.mu.Unlock() +// SetPindex sets the pending index +func (pt *PendingTxs) SetPindex(index uint64) { + atomic.StoreUint64(&pt.pindex, index) +} + +// GetPindex gets the current pending index +func (pt *PendingTxs) GetPindex() uint64 { + return atomic.LoadUint64(&pt.pindex) +} - pt.failedIndex = nil +// SetPFinalize sets the pending finalize index +func (pt *PendingTxs) SetPFinalize(finalize uint64) { + atomic.StoreUint64(&pt.pfinalize, finalize) } -func (pt *PendingTxs) HaveFailed() bool { - return pt.failedIndex != nil +// GetPFinalize gets the current pending finalize index +func (pt *PendingTxs) GetPFinalize() uint64 { + return atomic.LoadUint64(&pt.pfinalize) } +// ExistedIndex checks if a batch index exists func (pt *PendingTxs) ExistedIndex(index uint64) bool { + txs := pt.GetAll() // already has RLock + abi, err := bindings.RollupMetaData.GetAbi() + if err != nil { + log.Error("Failed to get ABI", "err", err) + return false + } - txs := pt.GetAll() - - abi, _ := bindings.RollupMetaData.GetAbi() - pt.mu.Lock() - defer pt.mu.Unlock() for i := len(txs) - 1; i >= 0; i-- { - tx := txs[i].tx - if utils.ParseMethod(tx, abi) == "commitBatch" { + tx := txs[i].Tx + if utils.ParseMethod(tx, abi) == constants.MethodCommitBatch { pindex := utils.ParseParentBatchIndex(tx.Data()) + 1 if index == pindex { return true } + } + } + return false +} + +// Recover recovers transactions from the journal +func (pt *PendingTxs) Recover(txs []*ethtypes.Transaction, abi *abi.ABI) error { + if len(txs) == 0 { + return nil + } + + log.Info("Starting to recover transactions", "count", len(txs)) + var maxCommitBatchIndex, maxFinalizeBatchIndex uint64 + + for _, tx := range txs { + // Get method name + method := utils.ParseMethod(tx, abi) + + // Get batch index based on method + var batchIndex uint64 + if method == constants.MethodCommitBatch { + batchIndex = utils.ParseParentBatchIndex(tx.Data()) + 1 + if batchIndex > maxCommitBatchIndex { + maxCommitBatchIndex = batchIndex + } + } else if method == constants.MethodFinalizeBatch { + batchIndex = utils.ParseFBatchIndex(tx.Data()) + if batchIndex > maxFinalizeBatchIndex { + maxFinalizeBatchIndex = batchIndex + } } + // Log transaction details + log.Info("Recovering transaction", + "hash", tx.Hash().String(), + "method", method, + "batch_index", batchIndex, + "nonce", tx.Nonce(), + "gas", tx.Gas(), + "gas_tip_cap", tx.GasTipCap().String(), + "gas_fee_cap", tx.GasFeeCap().String(), + "blob_gas", tx.BlobGas(), + "blob_fee_cap", tx.BlobGasFeeCap(), + "blob_hashes_count", len(tx.BlobHashes()), + "value", tx.Value().String(), + "size", tx.Size(), + "type", tx.Type(), + ) + + if err := pt.Add(tx); err != nil { + return fmt.Errorf("failed to add tx during recovery: %w", err) + } } - return false -} + pt.SetPindex(maxCommitBatchIndex) + pt.SetPFinalize(maxFinalizeBatchIndex) + pt.SetNonce(txs[len(txs)-1].Nonce()) -func (pt *PendingTxs) ResetFailedIndex(index uint64) { - pt.mu.Lock() - defer pt.mu.Unlock() - pt.failedIndex = &index + log.Info("Recovered from mempool", + "tx_count", len(txs), + "max_batch_index", maxCommitBatchIndex, + "max_finalize_index", maxFinalizeBatchIndex, + "max_nonce", pt.GetNonce(), + ) + + return nil } diff --git a/tx-submitter/services/reorg.go b/tx-submitter/services/reorg.go new file mode 100644 index 00000000..a030b850 --- /dev/null +++ b/tx-submitter/services/reorg.go @@ -0,0 +1,121 @@ +package services + +import ( + "context" + "fmt" + "math/big" + "sync" + + "morph-l2/tx-submitter/iface" + + "github.com/morph-l2/go-ethereum/common" + "github.com/morph-l2/go-ethereum/log" +) + +// ReorgDetector tracks chain reorganizations +type ReorgDetector struct { + mu sync.RWMutex + + // Track the last N block hashes and numbers + blockHistory []blockInfo + maxHistory int + + l1Client iface.Client + metrics iface.IMetrics +} + +type blockInfo struct { + number uint64 + hash common.Hash +} + +func NewReorgDetector(l1Client iface.Client, metrics iface.IMetrics) *ReorgDetector { + return &ReorgDetector{ + blockHistory: make([]blockInfo, 0), + maxHistory: 5, // Track last 50 blocks + l1Client: l1Client, + metrics: metrics, + } +} + +// DetectReorg checks if a reorg has occurred by comparing current chain with tracked history +func (r *ReorgDetector) DetectReorg(ctx context.Context) (bool, uint64, error) { + r.mu.Lock() + defer r.mu.Unlock() + + if len(r.blockHistory) == 0 { + // First run, initialize history + return false, 0, r.updateHistory(ctx) + } + + // Get latest block + latestBlock, err := r.l1Client.BlockByNumber(ctx, nil) + if err != nil { + return false, 0, fmt.Errorf("failed to get latest block: %w", err) + } + + // Check each block in history to find reorg point + reorgDepth := uint64(0) + for i, info := range r.blockHistory { + block, err := r.l1Client.BlockByNumber(ctx, new(big.Int).SetUint64(info.number)) + if err != nil { + return false, 0, fmt.Errorf("failed to get block %d: %w", info.number, err) + } + + if block.Hash() != info.hash { + // Reorg detected + reorgDepth = latestBlock.NumberU64() - info.number + log.Warn("Chain reorganization detected", + "depth", reorgDepth, + "old_hash", info.hash, + "new_hash", block.Hash(), + "block_number", info.number) + + // Update metrics + r.metrics.IncReorgs() + r.metrics.SetReorgDepth(float64(reorgDepth)) + + // Truncate history before reorg point and rebuild + r.blockHistory = r.blockHistory[:i] + err = r.updateHistory(ctx) + return true, reorgDepth, err + } + } + + // No reorg, just update history + return false, 0, r.updateHistory(ctx) +} + +// updateHistory updates the tracked block history +func (r *ReorgDetector) updateHistory(ctx context.Context) error { + latest, err := r.l1Client.BlockByNumber(ctx, nil) + if err != nil { + return fmt.Errorf("failed to get latest block: %w", err) + } + + // Add new blocks to history + currentNum := latest.NumberU64() + startNum := currentNum + if len(r.blockHistory) > 0 { + startNum = r.blockHistory[len(r.blockHistory)-1].number + 1 + } + + for num := startNum; num <= currentNum; num++ { + block, err := r.l1Client.BlockByNumber(ctx, new(big.Int).SetUint64(num)) + if err != nil { + return fmt.Errorf("failed to get block %d: %w", num, err) + } + + r.blockHistory = append(r.blockHistory, blockInfo{ + number: num, + hash: block.Hash(), + }) + } + + // Trim history if too long + if len(r.blockHistory) > r.maxHistory { + r.blockHistory = r.blockHistory[len(r.blockHistory)-r.maxHistory:] + } + + return nil +} diff --git a/tx-submitter/services/rollup.go b/tx-submitter/services/rollup.go index f18e11b6..9e321581 100644 --- a/tx-submitter/services/rollup.go +++ b/tx-submitter/services/rollup.go @@ -17,9 +17,10 @@ import ( "github.com/morph-l2/go-ethereum/common" "github.com/morph-l2/go-ethereum/consensus/misc/eip4844" "github.com/morph-l2/go-ethereum/core" - "github.com/morph-l2/go-ethereum/core/types" + ethtypes "github.com/morph-l2/go-ethereum/core/types" "github.com/morph-l2/go-ethereum/crypto" "github.com/morph-l2/go-ethereum/crypto/bls12381" + "github.com/morph-l2/go-ethereum/crypto/kzg4844" "github.com/morph-l2/go-ethereum/eth" "github.com/morph-l2/go-ethereum/log" "github.com/morph-l2/go-ethereum/params" @@ -27,48 +28,60 @@ import ( "github.com/tendermint/tendermint/blssignatures" "morph-l2/bindings/bindings" + "morph-l2/tx-submitter/constants" + "morph-l2/tx-submitter/db" "morph-l2/tx-submitter/event" "morph-l2/tx-submitter/iface" + "morph-l2/tx-submitter/l1checker" "morph-l2/tx-submitter/localpool" "morph-l2/tx-submitter/metrics" + "morph-l2/tx-submitter/types" "morph-l2/tx-submitter/utils" ) const ( - txSlotSize = 32 * 1024 - txMaxSize = 4 * txSlotSize // 128KB - rotatorWait = 3 * time.Second + txSlotSize = 32 * 1024 + txMaxSize = 4 * txSlotSize // 128KB + rotatorWait = 3 * time.Second + rollupSumKey = "rollup_sum" + finalizeSumKey = "finalize_sum" + collectedL1FeeSumKey = "collected_l1_fee_sum" ) type Rollup struct { - ctx context.Context - metrics *metrics.Metrics - + ctx context.Context + metrics *metrics.Metrics l1RpcClient *rpc.Client L1Client iface.Client L2Clients []iface.L2Client Rollup iface.IRollup - - Staking iface.IL1Staking - - chainId *big.Int - privKey *ecdsa.PrivateKey - rollupAddr common.Address - abi *abi.ABI - + Staking iface.IL1Staking + chainId *big.Int + privKey *ecdsa.PrivateKey + rollupAddr common.Address + abi *abi.ABI // rotator - rotator *Rotator - pendingTxs *PendingTxs - + rotator *Rotator + pendingTxs *PendingTxs rollupFinalizeMu sync.Mutex externalRsaPriv *rsa.PrivateKey // cfg cfg utils.Config // signer - signer types.Signer - + signer ethtypes.Signer + // leveldb + ldb *db.Db + // rollupFeeSum + rollupFeeSum float64 + // finalizeFeeSum + finalizeFeeSum float64 + // collectedL1FeeSum + collectedL1FeeSum float64 // batchcache - batchCache map[uint64]*eth.RPCRollupBatch + batchCache *types.BatchCache + bm *l1checker.BlockMonitor + eventInfoStorage *event.EventInfoStorage + reorgDetector iface.IReorgDetector } func NewRollup( @@ -86,29 +99,43 @@ func NewRollup( cfg utils.Config, rsaPriv *rsa.PrivateKey, rotator *Rotator, + ldb *db.Db, + bm *l1checker.BlockMonitor, + eventInfoStorage *event.EventInfoStorage, ) *Rollup { - - return &Rollup{ - ctx: ctx, - metrics: metrics, - l1RpcClient: l1RpcClient, - L1Client: l1, - Rollup: rollup, - Staking: staking, - L2Clients: l2Clients, - privKey: priKey, - chainId: chainId, - rollupAddr: rollupAddr, - abi: abi, - rotator: rotator, - cfg: cfg, - signer: types.LatestSignerForChainID(chainId), - externalRsaPriv: rsaPriv, - batchCache: make(map[uint64]*eth.RPCRollupBatch), - } + batchFetcher := NewBatchFetcher(l2Clients) + reorgDetector := NewReorgDetector(l1, metrics) + r := &Rollup{ + ctx: ctx, + metrics: metrics, + l1RpcClient: l1RpcClient, + L1Client: l1, + Rollup: rollup, + Staking: staking, + L2Clients: l2Clients, + privKey: priKey, + chainId: chainId, + rollupAddr: rollupAddr, + abi: abi, + rotator: rotator, + cfg: cfg, + signer: ethtypes.LatestSignerForChainID(chainId), + externalRsaPriv: rsaPriv, + batchCache: types.NewBatchCache(batchFetcher), + ldb: ldb, + bm: bm, + eventInfoStorage: eventInfoStorage, + reorgDetector: reorgDetector, + } + return r } -func (r *Rollup) Start() { +func (r *Rollup) Start() error { + + // init rollup service + if err := r.PreCheck(); err != nil { + return err + } // journal jn := localpool.New(r.cfg.JournalFilePath) @@ -117,17 +144,27 @@ func (r *Rollup) Start() { log.Crit("journal file init failed", "err", err) } // pendingtxs - r.pendingTxs = NewPendingTxs(r.abi.Methods["commitBatch"].ID, r.abi.Methods["finalizeBatch"].ID, jn) + r.pendingTxs = NewPendingTxs(r.abi.Methods[constants.MethodCommitBatch].ID, r.abi.Methods[constants.MethodFinalizeBatch].ID, jn) txs, err := jn.ParseAllTxs() if err != nil { - log.Error("parse l1 mempool error", "error", err) - } else { - r.pendingTxs.Recover(txs, r.abi) + log.Crit("parse l1 mempool error", "error", err) + } + if err := r.pendingTxs.Recover(txs, r.abi); err != nil { + log.Crit("failed to recover pending transactions", "error", err) } + // init fee metrics sum + err = r.InitFeeMetricsSum() + if err != nil { + return fmt.Errorf("init fee metrics sum failed: %w", err) + } + + /// start services + // start l1 monitor + go r.bm.StartMonitoring() + // metrics go utils.Loop(r.ctx, 10*time.Second, func() { - // get balacnce of wallet balance, err := r.L1Client.BalanceAt(context.Background(), r.WalletAddr(), nil) if err != nil { @@ -146,8 +183,21 @@ func (r *Rollup) Start() { log.Warn("parse balance to float error", "error", err) return } - r.metrics.SetWalletBalance(balanceEthFloat) + // last committed batch + lastCommittedBatch, err := r.Rollup.LastCommittedBatchIndex(nil) + if err != nil { + log.Warn("get last committed batch error", "error", err) + return + } + r.metrics.SetLastCommittedBatch(lastCommittedBatch.Uint64()) + // last finalized batch + lastFinalizedBatch, err := r.Rollup.LastFinalizedBatchIndex(nil) + if err != nil { + log.Warn("get last finalized batch error", "error", err) + return + } + r.metrics.SetLastFinalizedBatch(lastFinalizedBatch.Uint64()) }) @@ -189,165 +239,535 @@ func (r *Rollup) Start() { } } }) - + return nil } func (r *Rollup) ProcessTx() error { + // Check for reorgs first with exponential backoff retry + _, _, err := r.detectReorgWithRetry() + if err != nil { + log.Warn("Failed to check for reorgs", "error", err) + } - // case 1: in mempool - // -> check timeout - // case 2: no in mempool - // case 2.1: discarded - // case 2.2: tx included -> success - // case 2.3: tx included -> failed - // -> reset index to failed index - - // get all local txs + // Get all local transactions txRecords := r.pendingTxs.GetAll() if len(txRecords) == 0 { return nil } - // query tx status + // Check if this submitter should process transactions + if err := r.checkSubmitterTurn(); err != nil { + if err == errNotMyTurn { + // Get current submitter index for logging + activeSubmitter, activeIndex, _ := r.rotator.CurrentSubmitter(r.L2Clients, r.Staking) + + // Calculate rotation timing information + past := (time.Now().Unix() - r.rotator.startTime.Int64()) % r.rotator.epoch.Int64() + start := time.Now().Unix() - past + end := start + r.rotator.epoch.Int64() + timeLeft := end - time.Now().Unix() + + // Format timestamps for human readability + endTimeFormatted := utils.FormatTime(big.NewInt(end)) + timeLeftFormatted := fmt.Sprintf("%dm%ds", timeLeft/60, timeLeft%60) + + log.Info("Awaiting turn for transaction processing", + "current_submitter", activeSubmitter.Hex(), + "submitter_index", activeIndex, + "total_submitters", len(r.rotator.GetSubmitterSet()), + "next_rotation", endTimeFormatted, + "time_remaining", timeLeftFormatted) + return nil + } + return err + } + + // Process each transaction for _, txRecord := range txRecords { + if err := r.processSingleTx(txRecord); err != nil { + log.Error("Transaction processing failed", + "tx_hash", txRecord.Tx.Hash().String(), + "error", err) + return fmt.Errorf("transaction processing failed: %w", err) + } + } + + return nil +} + +// Helper function to detect reorgs with retry +func (r *Rollup) detectReorgWithRetry() (bool, uint64, error) { + var lastErr error + for i := range 3 { // Try up to 3 times + hasReorg, depth, err := r.reorgDetector.DetectReorg(r.ctx) + if err == nil { + return hasReorg, depth, nil + } + lastErr = err + time.Sleep(time.Duration(i+1) * time.Second) // Exponential backoff + } + return false, 0, lastErr +} + +var errNotMyTurn = errors.New("not my turn") + +func (r *Rollup) checkSubmitterTurn() error { + if r.cfg.PriorityRollup { + return nil + } + activeSubmitter, submitterIndex, err := r.rotator.CurrentSubmitter(r.L2Clients, r.Staking) + if err != nil { + return fmt.Errorf("rollup: get current submitter err, %w", err) + } + + myAddress := r.WalletAddr().Hex() + activeAddress := activeSubmitter.Hex() + isMyTurn := activeAddress == myAddress + + // Calculate rotation timing information + past := (time.Now().Unix() - r.rotator.startTime.Int64()) % r.rotator.epoch.Int64() + start := time.Now().Unix() - past + end := start + r.rotator.epoch.Int64() + timeLeft := end - time.Now().Unix() + + // Format timestamps for human readability + startTimeFormatted := utils.FormatTime(big.NewInt(start)) + endTimeFormatted := utils.FormatTime(big.NewInt(end)) + timeLeftFormatted := fmt.Sprintf("%dm%ds", timeLeft/60, timeLeft%60) + + if !isMyTurn { + log.Debug("Not active submitter", + "active_submitter", activeAddress, + "index", submitterIndex, + "my_address", myAddress, + "total_submitters", len(r.rotator.GetSubmitterSet()), + "rotation_end", endTimeFormatted, + "time_remaining", timeLeftFormatted) + return errNotMyTurn + } + + log.Info("Active submitter status", + "index", submitterIndex, + "total_submitters", len(r.rotator.GetSubmitterSet()), + "rotation_start", startTimeFormatted, + "rotation_end", endTimeFormatted, + "time_remaining", timeLeftFormatted) + return nil +} + +// Handle chain reorganization +func (r *Rollup) handleReorg(depth uint64) error { + // Update metrics + r.metrics.SetReorgDepth(float64(depth)) + r.metrics.IncReorgs() + return nil +} + +// Process a single transaction +func (r *Rollup) processSingleTx(txRecord *types.TxRecord) error { + rtx := txRecord.Tx + method := utils.ParseMethod(rtx, r.abi) + + log.Info("Processing transaction", + "hash", rtx.Hash().String(), + "nonce", rtx.Nonce(), + "method", method, + "query_times", txRecord.QueryTimes) + + // Check transaction status + status, err := r.getTxStatus(rtx) + if err != nil { + return fmt.Errorf("get tx status error: %w", err) + } - rtx := txRecord.tx - method := utils.ParseMethod(rtx, r.abi) - log.Info("process tx", "hash", rtx.Hash().String(), "nonce", rtx.Nonce(), "method", method) - // query tx - _, ispending, err := r.L1Client.TransactionByHash(context.Background(), txRecord.tx.Hash()) + switch status.state { + case txStatusPending: + return r.handlePendingTx(txRecord, rtx, method) + case txStatusConfirmed: + // Get current block number + currentBlock, err := r.L1Client.BlockNumber(context.Background()) if err != nil { - if !utils.ErrStringMatch(err, ethereum.NotFound) { - return fmt.Errorf("query tx error:%w, tx: %s, nonce: %d", err, rtx.Hash().String(), rtx.Nonce()) + return fmt.Errorf("get current block number error: %v", err) + } + + // Check confirmation depth + if status.receipt != nil && currentBlock >= status.receipt.BlockNumber.Uint64()+6 { + // Update fee metrics before removing the transaction + if err := r.updateFeeMetrics(rtx, status.receipt, method); err != nil { + log.Error("Failed to update fee metrics", + "error", err, + "tx_hash", rtx.Hash().String()) } - r.pendingTxs.IncQueryTimes(rtx.Hash()) // not found in mempool, increase query times - } else { - log.Info("query tx success", "hash", rtx.Hash().Hex(), "pending", ispending) + + // Transaction has 6 confirmations, remove it from tracking + log.Info("Removing confirmed tx from tracking after 6 blocks", + "tx_hash", rtx.Hash().String(), + "block_number", status.receipt.BlockNumber.Uint64(), + "current_block", currentBlock, + "gas_used", status.receipt.GasUsed, + "effective_gas_price", status.receipt.EffectiveGasPrice, + "method", method) + if err := r.pendingTxs.Remove(rtx.Hash()); err != nil { + log.Error("failed to remove transaction", "hash", rtx.Hash().String(), "error", err) + } + r.metrics.IncTxConfirmed(method) + return nil } + return r.handleConfirmedTx(txRecord, rtx, method) + case txStatusMissing: + return r.handleMissingTx(txRecord, rtx, method) + default: + return fmt.Errorf("unknown transaction status: %v", status.state) + } +} - // exist in mempool - if ispending { - if txRecord.sendTime+uint64(r.cfg.TxTimeout.Seconds()) < uint64(time.Now().Unix()) { - log.Info("tx timeout", "tx", rtx.Hash().Hex(), "nonce", rtx.Nonce(), "method", method) - newtx, err := r.ReSubmitTx(false, rtx) - if err != nil { - log.Error("resubmit tx", "error", err, "tx", rtx.Hash().Hex(), "nonce", rtx.Nonce()) - return fmt.Errorf("resubmit tx error:%w", err) - } else { - log.Info("replace success", "old_tx", rtx.Hash().Hex(), "new_tx", newtx.Hash().String(), "nonce", rtx.Nonce()) - r.pendingTxs.Remove(rtx.Hash()) - r.pendingTxs.Add(newtx) - } +// updateFeeMetrics updates all fee-related metrics for a confirmed transaction +func (r *Rollup) updateFeeMetrics(tx *ethtypes.Transaction, receipt *ethtypes.Receipt, method string) error { + txFeeEth := calcFee(tx, receipt) + txFeeFloat, _ := txFeeEth.Float64() + + // Update metrics based on transaction type + if method == constants.MethodCommitBatch { + r.rollupFeeSum += txFeeFloat + r.metrics.RollupCostSum.Add(txFeeFloat) + r.metrics.RollupCost.Set(txFeeFloat) + // Update leveldb + err := r.ldb.PutFloat(rollupSumKey, r.rollupFeeSum) + if err != nil { + return fmt.Errorf("failed to update rollup fee sum in leveldb: %w", err) + } + + // Calculate and update L1 fee metrics + batchIndex := utils.ParseParentBatchIndex(tx.Data()) + 1 + batch, ok := r.batchCache.Get(batchIndex) + if ok { + collectedL1Fee := new(big.Float).Quo(new(big.Float).SetInt(batch.CollectedL1Fee.ToInt()), new(big.Float).SetInt(big.NewInt(params.Ether))) + collectedL1FeeFloat, _ := collectedL1Fee.Float64() + + // Update metrics + r.collectedL1FeeSum += collectedL1FeeFloat + r.metrics.CollectedL1FeeSum.Add(collectedL1FeeFloat) + + // Update leveldb + err := r.ldb.PutFloat(collectedL1FeeSumKey, r.collectedL1FeeSum) + if err != nil { + log.Error("failed to update collected L1 fee sum in leveldb", "error", err) } - } else { // not in mempool - receipt, err := r.L1Client.TransactionReceipt(context.Background(), rtx.Hash()) + + log.Info("Updated L1 fee metrics", + "batch_index", batchIndex, + "l1_fee_eth", collectedL1FeeFloat) + } else { + log.Warn("batch not found in cache", "batch_index", batchIndex) + } + } else if method == constants.MethodFinalizeBatch { + r.finalizeFeeSum += txFeeFloat + r.metrics.FinalizeCostSum.Add(txFeeFloat) + r.metrics.FinalizeCost.Set(txFeeFloat) + // Update leveldb + err := r.ldb.PutFloat(finalizeSumKey, r.finalizeFeeSum) + if err != nil { + return fmt.Errorf("failed to update finalize fee sum in leveldb: %w", err) + } + } + + return nil +} + +type txStatus struct { + state int + receipt *ethtypes.Receipt +} + +const ( + txStatusPending = iota + txStatusConfirmed + txStatusMissing +) + +func (r *Rollup) getTxStatus(tx *ethtypes.Transaction) (*txStatus, error) { + receipt, err := r.L1Client.TransactionReceipt(context.Background(), tx.Hash()) + if err == nil { + return &txStatus{state: txStatusConfirmed, receipt: receipt}, nil + } + + if !utils.ErrStringMatch(err, ethereum.NotFound) { + return nil, fmt.Errorf("query tx receipt error: %w", err) + } + + // Check mempool + _, isPending, err := r.L1Client.TransactionByHash(context.Background(), tx.Hash()) + if err != nil { + if !utils.ErrStringMatch(err, ethereum.NotFound) { + return nil, fmt.Errorf("query tx error: %w", err) + } + return &txStatus{state: txStatusMissing}, nil + } + + if isPending { + return &txStatus{state: txStatusPending}, nil + } + + return &txStatus{state: txStatusMissing}, nil +} + +func (r *Rollup) handlePendingTx(txRecord *types.TxRecord, tx *ethtypes.Transaction, method string) error { + // Check for timeout + if txRecord.SendTime+uint64(r.cfg.TxTimeout.Seconds()) < uint64(time.Now().Unix()) { + log.Info("Transaction timed out", + "tx", tx.Hash().Hex(), + "nonce", tx.Nonce(), + "method", method) + + // Try to replace the transaction with higher gas price + return r.replaceTimedOutTx(tx) + } + + // Check if transaction might fail + if method == constants.MethodCommitBatch { + batchIndex := utils.ParseParentBatchIndex(tx.Data()) + 1 + lastCommitted, err := r.Rollup.LastCommittedBatchIndex(nil) + if err != nil { + return fmt.Errorf("get last committed batch index error: %w", err) + } + + if batchIndex <= lastCommitted.Uint64() { + // This batch is already committed by another submitter + log.Info("Batch already committed by another submitter, trying to cancel transaction", + "batch_index", batchIndex, + "last_committed", lastCommitted.Uint64(), + "tx_hash", tx.Hash().String()) + + // Try to cancel the transaction since it will fail + cancelTx, err := r.CancelTx(tx) if err != nil { - log.Error("query tx receipt error", "tx", rtx.Hash().String(), "nonce", rtx.Nonce(), "error", err) - if !utils.ErrStringMatch(err, ethereum.NotFound) { - return err - } + log.Error("Failed to cancel commit batch transaction", + "error", err, + "tx", tx.Hash().Hex(), + "nonce", tx.Nonce(), + "gas", tx.Gas(), + "gas_tip_cap", tx.GasTipCap().String(), + "gas_fee_cap", tx.GasFeeCap().String(), + "blob_fee_cap", tx.BlobGasFeeCap().String(), + "batch_index", batchIndex, + "last_committed", lastCommitted.Uint64()) + return fmt.Errorf("cancel commit batch transaction failed: %w", err) + } - // sr.pendingTxs.txinfos - if txRecord.queryTimes >= 5 { - log.Warn("tx discarded", - "hash", rtx.Hash().String(), - "nonce", rtx.Nonce(), - "query_times", txRecord.queryTimes, - ) - replacedtx, err := r.ReSubmitTx(true, rtx) - if err != nil { - log.Error("resend discarded tx", "old_tx", rtx.Hash().String(), "nonce", rtx.Nonce(), "error", err) - if utils.ErrStringMatch(err, core.ErrNonceTooLow) { - log.Info("discarded tx removed", - "hash", rtx.Hash().String(), - "nonce", rtx.Nonce(), - "method", method, - ) - r.pendingTxs.Remove(rtx.Hash()) - return nil - } - return fmt.Errorf("resend discarded tx: %w", err) - } else { - r.pendingTxs.Remove(rtx.Hash()) - } - r.pendingTxs.Add(replacedtx) - log.Info("resend discarded tx", "old_tx", rtx.Hash().String(), "new_tx", replacedtx.Hash().String(), "nonce", replacedtx.Nonce()) - } else { - log.Info("tx is not found, neither in mempool nor in block", "hash", rtx.Hash().String(), "nonce", rtx.Nonce(), "query_times", txRecord.queryTimes) - } - } else { - logs := utils.ParseBusinessInfo(rtx, r.abi) - logs = append(logs, - "block", receipt.BlockNumber, - "hash", rtx.Hash().String(), - "status", receipt.Status, - "gas_used", receipt.GasUsed, - "type", rtx.Type(), - "nonce", rtx.Nonce(), - "blob_fee_cap", rtx.BlobGasFeeCap(), - "blob_gas", rtx.BlobGas(), - "tx_size", rtx.Size(), - "gas_limit", rtx.Gas(), - "gas_price", rtx.GasPrice(), - ) + log.Info("Successfully sent cancel transaction for commit batch", + "old_tx", tx.Hash().Hex(), + "new_tx", cancelTx.Hash().String(), + "nonce", tx.Nonce()) + if err := r.pendingTxs.Remove(tx.Hash()); err != nil { + log.Error("failed to remove transaction", "hash", tx.Hash().String(), "error", err) + } + if err := r.pendingTxs.Add(cancelTx); err != nil { + log.Error("failed to add cancel transaction", "hash", cancelTx.Hash().String(), "error", err) + } + return nil + } + } else if method == constants.MethodFinalizeBatch { + batchIndex := utils.ParseFBatchIndex(tx.Data()) + lastFinalized, err := r.Rollup.LastFinalizedBatchIndex(nil) + if err != nil { + return fmt.Errorf("get last finalized batch index error: %w", err) + } - log.Info("tx included", - logs..., - ) + if batchIndex <= lastFinalized.Uint64() { + // This batch is already finalized by another submitter + log.Info("Batch already finalized by another submitter, trying to cancel transaction", + "batch_index", batchIndex, + "last_finalized", lastFinalized.Uint64(), + "tx_hash", tx.Hash().String()) - if receipt.Status != types.ReceiptStatusSuccessful { - // if tx is commitBatch - if method == "commitBatch" { - parentindex := utils.ParseParentBatchIndex(rtx.Data()) - index := parentindex + 1 - - // prevent the SetFailedStatus operation from - // happening between RemoveRollupRestriction - // and SetPindex in the rollup function - r.rollupFinalizeMu.Lock() - r.pendingTxs.SetFailedStatus(index) - r.rollupFinalizeMu.Unlock() - - } - - } else { - if method == "commitBatch" && r.pendingTxs.failedIndex != nil { - log.Info("fail revover", "failed_index", r.pendingTxs.failedIndex) - r.pendingTxs.RemoveRollupRestriction() - } - } + // Try to cancel the transaction since it will fail + cancelTx, err := r.CancelTx(tx) + if err != nil { + log.Error("Failed to cancel finalize batch transaction", + "error", err, + "tx", tx.Hash().Hex(), + "nonce", tx.Nonce(), + "gas", tx.Gas(), + "gas_tip_cap", tx.GasTipCap().String(), + "gas_fee_cap", tx.GasFeeCap().String(), + "blob_fee_cap", tx.BlobGasFeeCap().String(), + "batch_index", batchIndex, + "last_finalized", lastFinalized.Uint64()) + return fmt.Errorf("cancel finalize batch transaction failed: %w", err) + } - r.pendingTxs.Remove(rtx.Hash()) - // set metrics - fee := calcFee(receipt) - if fee == 0 { - log.Warn("fee is zero", "hash", rtx.Hash().Hex()) - } - if method == "commitBatch" { - r.metrics.SetRollupCost(fee) - index := utils.ParseParentBatchIndex(rtx.Data()) + 1 - batch, ok := r.batchCache[index] - if ok { - r.metrics.SetCollectedL1Fee(ToEtherFloat((*big.Int)(batch.CollectedL1Fee))) - // remove batch from cache - delete(r.batchCache, index) - } else { - log.Warn("batch not found in batchCache while set collect fee metrics", - "index", index, - ) - } - - } else if method == "finalizeBatch" { - r.metrics.SetFinalizeCost(fee) - } + log.Info("Successfully sent cancel transaction for finalize batch", + "old_tx", tx.Hash().Hex(), + "new_tx", cancelTx.Hash().String(), + "nonce", tx.Nonce()) + if err := r.pendingTxs.Remove(tx.Hash()); err != nil { + log.Error("failed to remove transaction", "hash", tx.Hash().String(), "error", err) + } + if err := r.pendingTxs.Add(cancelTx); err != nil { + log.Error("failed to add cancel transaction", "hash", cancelTx.Hash().String(), "error", err) } + return nil + } + } + + return nil +} + +func (r *Rollup) replaceTimedOutTx(tx *ethtypes.Transaction) error { + newTx, err := r.ReSubmitTx(false, tx) + if err != nil { + log.Error("Failed to resubmit transaction", + "error", err, + "tx", tx.Hash().Hex(), + "nonce", tx.Nonce()) + return fmt.Errorf("resubmit tx error: %w", err) + } + + log.Info("Successfully replaced transaction", + "old_tx", tx.Hash().Hex(), + "new_tx", newTx.Hash().String(), + "nonce", tx.Nonce()) + + if err := r.pendingTxs.Remove(tx.Hash()); err != nil { + log.Error("failed to remove transaction", "hash", tx.Hash().String(), "error", err) + } + if err := r.pendingTxs.Add(newTx); err != nil { + log.Error("failed to add new transaction", "hash", newTx.Hash().String(), "error", err) + } + return nil +} + +func (r *Rollup) handleMissingTx(txRecord *types.TxRecord, tx *ethtypes.Transaction, method string) error { + r.pendingTxs.IncQueryTimes(tx.Hash()) + + // Mark transaction as unconfirmed since it's missing + txRecord.Confirmed = false + + // Only resubmit after several retries + if txRecord.QueryTimes >= 5 { + return r.handleDiscardedTx(txRecord, tx, method) + } + + log.Info("Transaction not found in mempool or chain", + "hash", tx.Hash().String(), + "nonce", tx.Nonce(), + "query_times", txRecord.QueryTimes) + + return nil +} + +func (r *Rollup) handleDiscardedTx(txRecord *types.TxRecord, tx *ethtypes.Transaction, method string) error { + log.Warn("Transaction discarded", + "hash", tx.Hash().String(), + "nonce", tx.Nonce(), + "query_times", txRecord.QueryTimes) + // Try to resubmit with original parameters + replacedTx, err := r.ReSubmitTx(true, tx) + if err != nil { + if utils.ErrStringMatch(err, core.ErrNonceTooLow) { + // Transaction was probably confirmed in a reorg + log.Info("Discarded transaction removed (nonce too low)", + "hash", tx.Hash().String(), + "nonce", tx.Nonce(), + "method", method) + if err := r.pendingTxs.Remove(tx.Hash()); err != nil { + log.Error("failed to remove transaction", "hash", tx.Hash().String(), "error", err) + } + return nil } + return fmt.Errorf("resend discarded tx: %w", err) + } + if err := r.pendingTxs.Remove(tx.Hash()); err != nil { + log.Error("failed to remove transaction", "hash", tx.Hash().String(), "error", err) + } + if err := r.pendingTxs.Add(replacedTx); err != nil { + log.Error("failed to add replaced transaction", "hash", replacedTx.Hash().String(), "error", err) } + log.Info("Successfully resubmitted discarded transaction", + "old_tx", tx.Hash().String(), + "new_tx", replacedTx.Hash().String(), + "nonce", replacedTx.Nonce()) return nil +} + +// handleConfirmedTx handles a confirmed transaction +func (r *Rollup) handleConfirmedTx(txRecord *types.TxRecord, tx *ethtypes.Transaction, txType string) error { + status, err := r.getTxStatus(tx) + if err != nil { + return fmt.Errorf("get tx status error: %w", err) + } + + // Get current block number for confirmation count + currentBlock, err := r.L1Client.BlockNumber(context.Background()) + if err != nil { + return fmt.Errorf("get current block number error: %w", err) + } + confirmations := currentBlock - status.receipt.BlockNumber.Uint64() + log.Info("Transaction confirmation status", + "hash", tx.Hash().String(), + "block_number", status.receipt.BlockNumber.Uint64(), + "current_block", currentBlock, + "confirmations", confirmations) + + method := utils.ParseMethod(tx, r.abi) + if status.receipt.Status == ethtypes.ReceiptStatusFailed { + if method == constants.MethodCommitBatch { + batchIndex := utils.ParseParentBatchIndex(tx.Data()) + 1 + lastCommitted, err := r.Rollup.LastCommittedBatchIndex(nil) + if err != nil { + return fmt.Errorf("get last committed batch index error: %w", err) + } + + if batchIndex <= lastCommitted.Uint64() { + // Another submitter has already committed this batch + log.Warn("Batch commit transaction failed but batch is already committed by another submitter", "batch_index", batchIndex, "tx_hash", tx.Hash().String()) + // Clean up batch from cache since it's already committed + r.batchCache.Delete(batchIndex) + } else { + // Contract bug detected - batch is not committed by anyone else but our transaction failed + log.Warn("Critical error: batch commit transaction failed and batch is not committed by anyone", "batch_index", batchIndex, "tx_hash", tx.Hash().String()) + } + } else if method == constants.MethodFinalizeBatch { + batchIndex := utils.ParseFBatchIndex(tx.Data()) + lastFinalized, err := r.Rollup.LastFinalizedBatchIndex(nil) + if err != nil { + return fmt.Errorf("get last finalized batch index error: %w", err) + } + + if batchIndex <= lastFinalized.Uint64() { + // Another submitter has already finalized this batch + log.Warn("Batch finalize transaction failed but batch is already finalized by another submitter", "batch_index", batchIndex, "tx_hash", tx.Hash().String()) + } else { + // Contract bug detected - batch is not finalized by anyone else but our transaction failed + log.Warn("Critical error: batch finalize transaction failed and batch is not finalized by anyone", "batch_index", batchIndex, "tx_hash", tx.Hash().String()) + } + } + } else { // Transaction succeeded + // Get current block number for confirmation count only for successful transactions + currentBlock, err := r.L1Client.BlockNumber(context.Background()) + if err != nil { + return fmt.Errorf("get current block number error: %w", err) + } + confirmations := currentBlock - status.receipt.BlockNumber.Uint64() + + if method == constants.MethodCommitBatch { + batchIndex := utils.ParseParentBatchIndex(tx.Data()) + 1 + log.Info("Successfully committed batch", "batch_index", batchIndex, "tx_hash", tx.Hash().String(), "block_number", status.receipt.BlockNumber.Uint64(), "gas_used", status.receipt.GasUsed, "confirm", confirmations) + + // Clean up batch from cache after successful commit + r.batchCache.Delete(batchIndex) + } else if method == constants.MethodFinalizeBatch { + batchIndex := utils.ParseFBatchIndex(tx.Data()) + log.Info("Successfully finalized batch", "batch_index", batchIndex, "tx_hash", tx.Hash().String(), "block_number", status.receipt.BlockNumber.Uint64(), "gas_used", status.receipt.GasUsed, "confirm", confirmations) + } + } + + r.pendingTxs.MarkConfirmed(tx.Hash()) + return nil } func (r *Rollup) finalize() error { @@ -452,7 +872,7 @@ func (r *Rollup) finalize() error { } } - tx := types.NewTx(&types.DynamicFeeTx{ + tx := ethtypes.NewTx(ðtypes.DynamicFeeTx{ ChainID: r.chainId, Nonce: nonce, GasTipCap: tip, @@ -502,7 +922,9 @@ func (r *Rollup) finalize() error { r.pendingTxs.SetNonce(signedTx.Nonce()) r.pendingTxs.SetPFinalize(target.Uint64()) - r.pendingTxs.Add(signedTx) + if err := r.pendingTxs.Add(signedTx); err != nil { + log.Error("failed to add signed transaction", "hash", signedTx.Hash().String(), "error", err) + } } return nil @@ -510,31 +932,35 @@ func (r *Rollup) finalize() error { } func (r *Rollup) rollup() error { - + // Get current block height if !r.cfg.PriorityRollup { - cur, err := r.rotator.CurrentSubmitter(r.L2Clients, r.Staking) + activeSubmitter, activeIndex, err := r.rotator.CurrentSubmitter(r.L2Clients, r.Staking) if err != nil { return fmt.Errorf("rollup: get current submitter err, %w", err) } - storage := event.NewEventInfoStorage(r.rotator.indexer.GetStorePath()) - err = storage.Load() + err = r.eventInfoStorage.Load() if err != nil { return fmt.Errorf("failed to load storage in rollup: %w", err) } + log.Debug("Indexer status", + "blocks_processed", r.eventInfoStorage.BlockProcessed(), + "last_event_time", r.eventInfoStorage.BlockTime()) + // get current blocknumber blockNumber, err := r.L1Client.BlockNumber(context.Background()) if err != nil { return fmt.Errorf("failed to get block number in rollup: %w", err) } // set metrics - r.metrics.SetIndexerBlockProcessed(storage.EventInfo.BlockProcessed) + r.metrics.SetIndexerBlockProcessed(r.eventInfoStorage.BlockProcessed()) // check if indexed block number is too old - if blockNumber > storage.EventInfo.BlockProcessed+100 { - log.Info("indexed block number is too old, wait indexer to catch up", + if blockNumber > r.eventInfoStorage.BlockProcessed()+100 { + log.Info("Indexer sync required", "module", r.GetModuleName(), - "block_number", blockNumber, - "processed_block", storage.EventInfo.BlockProcessed) + "current_block", blockNumber, + "processed_block", r.eventInfoStorage.BlockProcessed(), + "blocks_behind", blockNumber-r.eventInfoStorage.BlockProcessed()) return nil } @@ -542,30 +968,52 @@ func (r *Rollup) rollup() error { start := time.Now().Unix() - past end := start + r.rotator.epoch.Int64() - log.Info("rotator info", - "turn", cur.Hex(), - "cur", r.WalletAddr(), - "start", start, - "end", end, - "now", time.Now().Unix(), - ) - - if cur.Hex() == r.WalletAddr().Hex() { - left := end - time.Now().Unix() - if left < r.cfg.RotatorBuffer { - log.Info("rollup time not enough, wait next turn", "left", left) + // Calculate time remaining in current turn + timeLeft := end - time.Now().Unix() + myAddress := r.WalletAddr().Hex() + activeAddress := activeSubmitter.Hex() + isMyTurn := activeAddress == myAddress + totalSubmitters := len(r.rotator.GetSubmitterSet()) + + // Format timestamps for human readability + startTimeFormatted := utils.FormatTime(big.NewInt(start)) + endTimeFormatted := utils.FormatTime(big.NewInt(end)) + timeLeftFormatted := fmt.Sprintf("%dm%ds", timeLeft/60, timeLeft%60) + + log.Info("Rotation status", + "submitter_index", activeIndex, + "active_submitter", activeAddress, + "my_address", myAddress, + "total_submitters", totalSubmitters, + "is_my_turn", isMyTurn, + "rotation_start", startTimeFormatted, + "rotation_end", endTimeFormatted, + "time_remaining", timeLeftFormatted) + + if isMyTurn { + if timeLeft < r.cfg.RotatorBuffer { + bufferFormatted := fmt.Sprintf("%dm%ds", r.cfg.RotatorBuffer/60, r.cfg.RotatorBuffer%60) + log.Info("Insufficient time for rollup", + "time_remaining", timeLeftFormatted, + "buffer_required", bufferFormatted) return nil } - log.Info("start to rollup") + log.Info("Starting rollup", + "submitter_index", activeIndex, + "total_submitters", totalSubmitters) } else { - log.Info("wait for my turn") + log.Info("Skipping rollup - not active submitter", + "active_index", activeIndex, + "active_submitter", activeAddress) return nil } } if len(r.pendingTxs.txinfos) > int(r.cfg.MaxTxsInPendingPool) { - log.Info("too many txs in mempool, wait") + log.Info("Pending pool full", + "current_size", len(r.pendingTxs.txinfos), + "max_size", r.cfg.MaxTxsInPendingPool) return nil } @@ -577,68 +1025,43 @@ func (r *Rollup) rollup() error { } cindex := cindexBig.Uint64() - if r.pendingTxs.failedIndex != nil && cindex >= *r.pendingTxs.failedIndex { - r.pendingTxs.RemoveRollupRestriction() + switch { + case r.pendingTxs.pindex != 0: + batchIndex = max(cindex, r.pendingTxs.pindex) + 1 + default: + batchIndex = cindex + 1 } - if r.pendingTxs.failedIndex != nil { - batchIndex = *r.pendingTxs.failedIndex - } else { - if r.pendingTxs.pindex != 0 { - if cindex > r.pendingTxs.pindex { - batchIndex = cindex + 1 - } else { - batchIndex = r.pendingTxs.pindex + 1 - } - - } else { - batchIndex = cindex + 1 - } - } + log.Debug("Batch status", + "last_committed", cindex, + "next_batch", batchIndex, + "current_processing", r.pendingTxs.pindex) - log.Info("batch info", "last_commit_batch", batchIndex-1, "batch_will_get", batchIndex) if r.pendingTxs.ExistedIndex(batchIndex) { - log.Info("batch index already committed", "index", batchIndex) + log.Debug("Batch already committed", + "batch_index", batchIndex) return nil } - if r.pendingTxs.failedIndex != nil && batchIndex > *r.pendingTxs.failedIndex { - log.Warn("rollup rejected", "index", batchIndex) + batch, ok := r.batchCache.Get(batchIndex) + if !ok { + log.Info("Batch not found in cache", + "batch_index", batchIndex) return nil } - batch, err := GetRollupBatchByIndex(batchIndex, r.L2Clients) - if err != nil { - return fmt.Errorf("get rollup batch by index err:%v", err) - } - - // check if the batch is valid - if batch == nil { - log.Info("new batch not found, wait for the next turn") - return nil - } - - if len(batch.Signatures) == 0 { - log.Info("length of batch signature is empty, wait for the next turn") - return nil - } - - // set batch cache - // it shoud be removed after the batch is committed - r.batchCache[batchIndex] = batch - signature, err := r.buildSignatureInput(batch) if err != nil { return err } rollupBatch := bindings.IRollupBatchDataInput{ - Version: uint8(batch.Version), - ParentBatchHeader: batch.ParentBatchHeader, - BlockContexts: batch.BlockContexts, - SkippedL1MessageBitmap: batch.SkippedL1MessageBitmap, - PrevStateRoot: batch.PrevStateRoot, - PostStateRoot: batch.PostStateRoot, - WithdrawalRoot: batch.WithdrawRoot, + Version: uint8(batch.Version), + ParentBatchHeader: batch.ParentBatchHeader, + LastBlockNumber: batch.LastBlockNumber, + NumL1Messages: batch.NumL1Messages, + PrevStateRoot: batch.PrevStateRoot, + PostStateRoot: batch.PostStateRoot, + WithdrawalRoot: batch.WithdrawRoot, } // tip and cap @@ -652,122 +1075,133 @@ func (r *Rollup) rollup() error { if err != nil { return fmt.Errorf("pack calldata error:%v", err) } + // Estimate gas for transaction gas, err := r.EstimateGas(r.WalletAddr(), r.rollupAddr, calldata, gasFeeCap, tip) if err != nil { - log.Warn("estimate gas failed", "err", err) - // have failed tx & estimate err -> no rough estimate - if r.pendingTxs.HaveFailed() { - log.Warn("estimate gas err, wait failed tx fixed", - "err", err, - "update_pooled_pending_index", cindex+1, - ) - r.pendingTxs.ResetFailedIndex(cindex + 1) - return nil - } - + log.Warn("Estimate gas failed", "batch_index", batchIndex, "error", err) + // Use rough estimation based on L1 message count if r.cfg.RoughEstimateGas { msgcnt := utils.ParseL1MessageCnt(batch.BlockContexts) gas = r.RoughRollupGasEstimate(msgcnt) - log.Info("rough estimate rollup tx gas", "gas", gas, "msgcnt", msgcnt) + log.Info("Using rough gas estimation", + "batch_index", batchIndex, + "gas_limit", gas, + "l1_messages", msgcnt) } else { - log.Warn("no rough estimate gas, return") return nil } } - // add buffer to gas + // Apply gas buffer gas = r.BumpGas(gas) - // calc nonce - var nonce uint64 - if r.pendingTxs.pnonce != 0 { - nonce = r.pendingTxs.pnonce + 1 - } else { - nonce, err = r.L1Client.PendingNonceAt(context.Background(), r.WalletAddr()) - if err != nil { - return fmt.Errorf("query layer1 nonce error:%v", err.Error()) - } + // Get next nonce + nonce := r.getNextNonce() + if nonce == 0 { + return fmt.Errorf("failed to get next nonce") } - var tx *types.Transaction - if len(batch.Sidecar.Blobs) > 0 { - versionedHashes := make([]common.Hash, 0) - for _, commit := range batch.Sidecar.Commitments { - versionedHashes = append(versionedHashes, kZGToVersionedHash(commit)) - } - // blob tx - tx = types.NewTx(&types.BlobTx{ - ChainID: uint256.MustFromBig(r.chainId), - Nonce: nonce, - GasTipCap: uint256.MustFromBig(big.NewInt(tip.Int64())), - GasFeeCap: uint256.MustFromBig(big.NewInt(gasFeeCap.Int64())), - Gas: gas, - To: r.rollupAddr, - Data: calldata, - BlobFeeCap: uint256.MustFromBig(blobFee), - BlobHashes: versionedHashes, - Sidecar: &types.BlobTxSidecar{ - Blobs: batch.Sidecar.Blobs, - Commitments: batch.Sidecar.Commitments, - Proofs: batch.Sidecar.Proofs, - }, - }) - - } else { - tx = types.NewTx(&types.DynamicFeeTx{ - ChainID: r.chainId, - Nonce: nonce, - GasTipCap: tip, - GasFeeCap: gasFeeCap, - Gas: gas, - To: &r.rollupAddr, - Data: calldata, - }) + // Create and sign transaction + tx, err := r.createRollupTx(batch, nonce, gas, tip, gasFeeCap, blobFee, calldata) + if err != nil { + return fmt.Errorf("failed to create rollup tx: %w", err) } signedTx, err := r.Sign(tx) if err != nil { - return fmt.Errorf("sign tx error:%v", err) + return fmt.Errorf("failed to sign tx: %w", err) } - log.Info("rollup tx info", - "batch_index", batchIndex, - "hash", signedTx.Hash().String(), - "type", signedTx.Type(), - "nonce", signedTx.Nonce(), - "gas", signedTx.Gas(), - "tip", signedTx.GasTipCap().String(), - "fee_cap", signedTx.GasFeeCap().String(), - "blob_fee_cap", signedTx.BlobGasFeeCap(), - "blob_gas", signedTx.BlobGas(), - "size", signedTx.Size(), - "blob_len", len(signedTx.BlobHashes()), - ) + // Log transaction details before sending + r.logTxInfo(signedTx, batchIndex) - err = r.SendTx(signedTx) - if err != nil { - log.Error("send tx to mempool", "error", err.Error()) - if utils.ErrStringMatch(err, core.ErrNonceTooLow) { - // adjust nonce - n1, _, err := utils.ParseNonce(err.Error()) - if err != nil { - return fmt.Errorf("parse nonce err: %w", err) - } - r.pendingTxs.SetNonce(n1 - 1) - log.Info("update pnonce", "nonce", n1-1) - } - return fmt.Errorf("send tx error:%v", err.Error()) - } else { - log.Info("rollup tx send to mempool succuess", "hash", signedTx.Hash().String()) + // Send transaction + if err := r.SendTx(signedTx); err != nil { + return fmt.Errorf("failed to send tx: %w", err) + } - r.pendingTxs.SetPindex(batchIndex) - r.pendingTxs.SetNonce(tx.Nonce()) - r.pendingTxs.Add(signedTx) + // Update pending state + r.pendingTxs.SetPindex(batchIndex) + r.pendingTxs.SetNonce(tx.Nonce()) + if err := r.pendingTxs.Add(signedTx); err != nil { + log.Error("Failed to track transaction", "error", err) } return nil } +func (r *Rollup) getNextNonce() uint64 { + if r.pendingTxs.pnonce != 0 { + return r.pendingTxs.pnonce + 1 + } + + nonce, err := r.L1Client.PendingNonceAt(context.Background(), r.WalletAddr()) + if err != nil { + log.Error("Failed to get nonce", "error", err) + return 0 + } + return nonce +} + +func (r *Rollup) createRollupTx(batch *eth.RPCRollupBatch, nonce, gas uint64, tip, gasFeeCap, blobFee *big.Int, calldata []byte) (*ethtypes.Transaction, error) { + if len(batch.Sidecar.Blobs) > 0 { + return r.createBlobTx(batch, nonce, gas, tip, gasFeeCap, blobFee, calldata) + } + return r.createDynamicFeeTx(nonce, gas, tip, gasFeeCap, calldata) +} + +func (r *Rollup) createBlobTx(batch *eth.RPCRollupBatch, nonce, gas uint64, tip, gasFeeCap, blobFee *big.Int, calldata []byte) (*ethtypes.Transaction, error) { + versionedHashes := make([]common.Hash, 0, len(batch.Sidecar.Commitments)) + for _, commit := range batch.Sidecar.Commitments { + versionedHashes = append(versionedHashes, kZGToVersionedHash(commit)) + } + + return ethtypes.NewTx(ðtypes.BlobTx{ + ChainID: uint256.MustFromBig(r.chainId), + Nonce: nonce, + GasTipCap: uint256.MustFromBig(big.NewInt(tip.Int64())), + GasFeeCap: uint256.MustFromBig(big.NewInt(gasFeeCap.Int64())), + Gas: gas, + To: r.rollupAddr, + Data: calldata, + BlobFeeCap: uint256.MustFromBig(blobFee), + BlobHashes: versionedHashes, + Sidecar: ðtypes.BlobTxSidecar{ + Blobs: batch.Sidecar.Blobs, + Commitments: batch.Sidecar.Commitments, + Proofs: batch.Sidecar.Proofs, + }, + }), nil +} + +func (r *Rollup) createDynamicFeeTx(nonce, gas uint64, tip, gasFeeCap *big.Int, calldata []byte) (*ethtypes.Transaction, error) { + return ethtypes.NewTx(ðtypes.DynamicFeeTx{ + ChainID: r.chainId, + Nonce: nonce, + GasTipCap: tip, + GasFeeCap: gasFeeCap, + Gas: gas, + To: &r.rollupAddr, + Data: calldata, + }), nil +} + +func (r *Rollup) logTxInfo(tx *ethtypes.Transaction, batchIndex uint64) { + log.Info("Rollup transaction created", + "batch_index", batchIndex, + "hash", tx.Hash().String(), + "type", tx.Type(), + "nonce", tx.Nonce(), + "gas", tx.Gas(), + "tip", tx.GasTipCap().String(), + "fee_cap", tx.GasFeeCap().String(), + "blob_fee_cap", tx.BlobGasFeeCap(), + "blob_gas", tx.BlobGas(), + "size", tx.Size(), + "blob_count", len(tx.BlobHashes()), + ) +} + func (r *Rollup) buildSignatureInput(batch *eth.RPCRollupBatch) (*bindings.IRollupBatchSignatureInput, error) { blsSignatures := batch.Signatures if len(blsSignatures) == 0 { @@ -806,14 +1240,32 @@ func (r *Rollup) buildSignatureInput(batch *eth.RPCRollupBatch) (*bindings.IRoll } func (r *Rollup) GetGasTipAndCap() (*big.Int, *big.Int, *big.Int, error) { - tip, err := r.L1Client.SuggestGasTipCap(context.Background()) + + head, err := r.L1Client.HeaderByNumber(context.Background(), nil) if err != nil { return nil, nil, nil, err } - head, err := r.L1Client.HeaderByNumber(context.Background(), nil) + if head.BaseFee != nil { + log.Info("market fee info", "feecap", head.BaseFee) + if r.cfg.MaxBaseFee > 0 && head.BaseFee.Cmp(big.NewInt(int64(r.cfg.MaxBaseFee))) > 0 { + return nil, nil, nil, fmt.Errorf("base fee is too high, base fee %v exceeds max %v", head.BaseFee, r.cfg.MaxBaseFee) + } + } + + tip, err := r.L1Client.SuggestGasTipCap(context.Background()) if err != nil { return nil, nil, nil, err } + log.Info("market fee info", "tip", tip) + + if r.cfg.TipFeeBump > 0 { + tip = new(big.Int).Mul(tip, big.NewInt(int64(r.cfg.TipFeeBump))) + tip = new(big.Int).Div(tip, big.NewInt(100)) + } + if r.cfg.MaxTip > 0 && tip.Cmp(big.NewInt(int64(r.cfg.MaxTip))) > 0 { + return nil, nil, nil, fmt.Errorf("tip is too high, tip %v exceeds max %v", tip, r.cfg.MaxTip) + } + var gasFeeCap *big.Int if head.BaseFee != nil { gasFeeCap = new(big.Int).Add( @@ -828,17 +1280,15 @@ func (r *Rollup) GetGasTipAndCap() (*big.Int, *big.Int, *big.Int, error) { var blobFee *big.Int if head.ExcessBlobGas != nil { blobFee = eip4844.CalcBlobFee(*head.ExcessBlobGas) + // Set to 3x to handle blob market congestion + blobFee = new(big.Int).Mul(blobFee, big.NewInt(3)) } - //calldata fee bump x*fee/100 - if r.cfg.CalldataFeeBump > 0 { - // feecap - gasFeeCap = new(big.Int).Mul(gasFeeCap, big.NewInt(int64(r.cfg.CalldataFeeBump))) - gasFeeCap = new(big.Int).Div(gasFeeCap, big.NewInt(100)) - // tip - tip = new(big.Int).Mul(tip, big.NewInt(int64(r.cfg.CalldataFeeBump))) - tip = new(big.Int).Div(tip, big.NewInt(100)) - } + log.Info("fee info after bump", + "tip", tip, + "feecap", gasFeeCap, + "blobfee", blobFee, + ) return tip, gasFeeCap, blobFee, nil } @@ -1002,14 +1452,14 @@ func GetEpochUpdateTime(addr common.Address, clients []iface.L2Client) (*big.Int } -func UpdateGasLimit(tx *types.Transaction) (*types.Transaction, error) { +func UpdateGasLimit(tx *ethtypes.Transaction) (*ethtypes.Transaction, error) { // add buffer to gas limit (*1.2) newGasLimit := tx.Gas() * 12 / 10 - var newTx *types.Transaction - if tx.Type() == types.LegacyTxType { + var newTx *ethtypes.Transaction + if tx.Type() == ethtypes.LegacyTxType { - newTx = types.NewTx(&types.LegacyTx{ + newTx = ethtypes.NewTx(ðtypes.LegacyTx{ Nonce: tx.Nonce(), GasPrice: big.NewInt(tx.GasPrice().Int64()), Gas: newGasLimit, @@ -1017,8 +1467,8 @@ func UpdateGasLimit(tx *types.Transaction) (*types.Transaction, error) { Value: tx.Value(), Data: tx.Data(), }) - } else if tx.Type() == types.DynamicFeeTxType { - newTx = types.NewTx(&types.DynamicFeeTx{ + } else if tx.Type() == ethtypes.DynamicFeeTxType { + newTx = ethtypes.NewTx(ðtypes.DynamicFeeTx{ Nonce: tx.Nonce(), GasTipCap: big.NewInt(tx.GasTipCap().Int64()), GasFeeCap: big.NewInt(tx.GasFeeCap().Int64()), @@ -1027,8 +1477,8 @@ func UpdateGasLimit(tx *types.Transaction) (*types.Transaction, error) { Value: tx.Value(), Data: tx.Data(), }) - } else if tx.Type() == types.BlobTxType { - newTx = types.NewTx(&types.BlobTx{ + } else if tx.Type() == ethtypes.BlobTxType { + newTx = ethtypes.NewTx(ðtypes.BlobTx{ ChainID: uint256.MustFromBig(tx.ChainId()), Nonce: tx.Nonce(), GasTipCap: uint256.MustFromBig(big.NewInt(tx.GasTipCap().Int64())), @@ -1049,12 +1499,16 @@ func UpdateGasLimit(tx *types.Transaction) (*types.Transaction, error) { } // send tx to l1 with business logic check -func (r *Rollup) SendTx(tx *types.Transaction) error { +func (r *Rollup) SendTx(tx *ethtypes.Transaction) error { // judge tx info is valid if tx == nil { return errors.New("nil tx") } + // l1 health check + if r.bm != nil && !r.bm.IsGrowth() { + return fmt.Errorf("block not growth in %d blocks time", r.cfg.BlockNotIncreasedThreshold) + } err := sendTx(r.L1Client, r.cfg.TxFeeLimit, tx) if err != nil { @@ -1063,19 +1517,23 @@ func (r *Rollup) SendTx(tx *types.Transaction) error { // after send tx // add to pending txs - r.pendingTxs.Add(tx) + if r.pendingTxs != nil { + if err := r.pendingTxs.Add(tx); err != nil { + log.Error("failed to add transaction", "hash", tx.Hash().String(), "error", err) + } + } return nil } // send tx to l1 with business logic check -func sendTx(client iface.Client, txFeeLimit uint64, tx *types.Transaction) error { +func sendTx(client iface.Client, txFeeLimit uint64, tx *ethtypes.Transaction) error { // fee limit if txFeeLimit > 0 { var fee uint64 // calc tx gas fee - if tx.Type() == types.BlobTxType { + if tx.Type() == ethtypes.BlobTxType { // blob fee fee = tx.BlobGasFeeCap().Uint64() * tx.BlobGas() // tx fee @@ -1092,7 +1550,7 @@ func sendTx(client iface.Client, txFeeLimit uint64, tx *types.Transaction) error return client.SendTransaction(context.Background(), tx) } -func (r *Rollup) ReSubmitTx(resend bool, tx *types.Transaction) (*types.Transaction, error) { +func (r *Rollup) ReSubmitTx(resend bool, tx *ethtypes.Transaction) (*ethtypes.Transaction, error) { if tx == nil { return nil, errors.New("nil tx") } @@ -1114,12 +1572,12 @@ func (r *Rollup) ReSubmitTx(resend bool, tx *types.Transaction) (*types.Transact tip, gasFeeCap, blobFeeCap, err := r.GetGasTipAndCap() if err != nil { - log.Error("get tip and cap", "err", err) + return nil, fmt.Errorf("get gas tip and cap error:%w", err) } if !resend { // bump tip & feeCap - bumpedFeeCap := calcThresholdValue(tx.GasFeeCap(), tx.Type() == types.BlobTxType) - bumpedTip := calcThresholdValue(tx.GasTipCap(), tx.Type() == types.BlobTxType) + bumpedFeeCap := calcThresholdValue(tx.GasFeeCap(), tx.Type() == ethtypes.BlobTxType) + bumpedTip := calcThresholdValue(tx.GasTipCap(), tx.Type() == ethtypes.BlobTxType) // if bumpedTip > tip if bumpedTip.Cmp(tip) > 0 { @@ -1130,18 +1588,41 @@ func (r *Rollup) ReSubmitTx(resend bool, tx *types.Transaction) (*types.Transact gasFeeCap = bumpedFeeCap } - if tx.Type() == types.BlobTxType { - bumpedBlobFeeCap := calcThresholdValue(tx.BlobGasFeeCap(), tx.Type() == types.BlobTxType) + if tx.Type() == ethtypes.BlobTxType { + bumpedBlobFeeCap := calcThresholdValue(tx.BlobGasFeeCap(), tx.Type() == ethtypes.BlobTxType) if bumpedBlobFeeCap.Cmp(blobFeeCap) > 0 { blobFeeCap = bumpedBlobFeeCap } } + + if r.cfg.MinTip > 0 && tip.Cmp(big.NewInt(int64(r.cfg.MinTip))) < 0 { + log.Info("replace tip is too low, update tip to min tip ", "tip", tip, "min_tip", r.cfg.MinTip) + tip = big.NewInt(int64(r.cfg.MinTip)) + // recalc feecap + head, err := r.L1Client.HeaderByNumber(context.Background(), nil) + if err != nil { + return nil, fmt.Errorf("get l1 head error:%w", err) + } + var recalculatedFeecap *big.Int + if head.BaseFee != nil { + recalculatedFeecap = new(big.Int).Add( + tip, + new(big.Int).Mul(head.BaseFee, big.NewInt(2)), + ) + } else { + recalculatedFeecap = new(big.Int).Set(tip) + } + if recalculatedFeecap.Cmp(gasFeeCap) > 0 { + gasFeeCap = recalculatedFeecap + } + } } - var newTx *types.Transaction + var newTx *ethtypes.Transaction switch tx.Type() { - case types.DynamicFeeTxType: - newTx = types.NewTx(&types.DynamicFeeTx{ + case ethtypes.DynamicFeeTxType: + newTx = ethtypes.NewTx(ðtypes.DynamicFeeTx{ + ChainID: tx.ChainId(), To: tx.To(), Nonce: tx.Nonce(), GasFeeCap: gasFeeCap, @@ -1150,9 +1631,9 @@ func (r *Rollup) ReSubmitTx(resend bool, tx *types.Transaction) (*types.Transact Value: tx.Value(), Data: tx.Data(), }) - case types.BlobTxType: + case ethtypes.BlobTxType: - newTx = types.NewTx(&types.BlobTx{ + newTx = ethtypes.NewTx(ðtypes.BlobTx{ ChainID: uint256.MustFromBig(tx.ChainId()), Nonce: tx.Nonce(), GasTipCap: uint256.MustFromBig(tip), @@ -1171,11 +1652,23 @@ func (r *Rollup) ReSubmitTx(resend bool, tx *types.Transaction) (*types.Transact } + // weiToGwei converts wei value to gwei string representation + weiToGwei := func(wei *big.Int) string { + if wei == nil { + return "0" + } + gwei := new(big.Float).Quo( + new(big.Float).SetInt(wei), + new(big.Float).SetInt64(1e9), + ) + return gwei.Text('f', 6) + } + log.Info("new tx info", "tx_type", newTx.Type(), - "gas_tip", tip.String(), //todo: convert to gwei - "gas_fee_cap", gasFeeCap.String(), //todo: convert to gwei - "blob_fee_cap", blobFeeCap.String(), //todo: convert to gwei + "gas_tip_gwei", weiToGwei(tip), + "gas_fee_cap_gwei", weiToGwei(gasFeeCap), + "blob_fee_cap_gwei", weiToGwei(blobFeeCap), ) // sign tx newTx, err = r.Sign(newTx) @@ -1235,3 +1728,177 @@ func (r *Rollup) RoughFinalizeGasEstimate() uint64 { func (r *Rollup) GetModuleName() string { return "rollup" } + +func (r *Rollup) InitFeeMetricsSum() error { + // try to init rollupFeeSum & finalizeFeeSum + // read rollupFeeSum + rollupFeeSum, err := r.ldb.GetFloat(rollupSumKey) + if err != nil { + log.Warn("read rollupFeeSum from leveldb failed", "error", err) + if utils.ErrStringMatch(err, db.ErrKeyNotFound) { + err = r.ldb.PutFloat(rollupSumKey, 0) + if err != nil { + return fmt.Errorf("put rollupFeeSum to leveldb failed, key: %s, %w", rollupSumKey, err) + } + } else { + return fmt.Errorf("get data from leveldb faild, key: %s, %w", rollupSumKey, err) + } + } + log.Info(fmt.Sprintf("rollupFeeSum: %f", rollupFeeSum)) + finalizeFeeSum, err := r.ldb.GetFloat(finalizeSumKey) + if err != nil { + log.Warn("read finalizeFeeSum from leveldb failed", "error", err) + if utils.ErrStringMatch(err, db.ErrKeyNotFound) { + err = r.ldb.PutFloat(finalizeSumKey, 0) + if err != nil { + return fmt.Errorf("put finalizeFeeSum to leveldb failed, key: %s, %w", finalizeSumKey, err) + } + } else { + return fmt.Errorf("get data from leveldb faild, key: %s, %w", finalizeSumKey, err) + } + } + log.Info(fmt.Sprintf("finalizeFeeSum: %f", finalizeFeeSum)) + collectedL1FeeSum, err := r.ldb.GetFloat(collectedL1FeeSumKey) + if err != nil { + log.Warn("read collectedL1FeeSum from leveldb failed", "error", err) + if utils.ErrStringMatch(err, db.ErrKeyNotFound) { + err = r.ldb.PutFloat(collectedL1FeeSumKey, 0) + if err != nil { + return fmt.Errorf("put collectedL1FeeSum to leveldb failed, key: %s, %w", collectedL1FeeSumKey, err) + } + } else { + return fmt.Errorf("get data from leveldb faild, key: %s, %w", collectedL1FeeSumKey, err) + } + } + r.collectedL1FeeSum = collectedL1FeeSum + log.Info(fmt.Sprintf("collectedL1FeeSum: %f", collectedL1FeeSum)) + + r.rollupFeeSum = rollupFeeSum + r.finalizeFeeSum = finalizeFeeSum + r.collectedL1FeeSum = collectedL1FeeSum + // set fee sum init val + r.metrics.RollupCostSum.Add(r.rollupFeeSum) + r.metrics.FinalizeCostSum.Add(r.finalizeFeeSum) + r.metrics.CollectedL1FeeSum.Add(r.collectedL1FeeSum) + return nil +} + +// ClearPendingTxs clears all pending transactions +func (p *PendingTxs) ClearPendingTxs() { + p.txinfos = make(map[common.Hash]*types.TxRecord) +} + +// MarkUnconfirmed marks a transaction as unconfirmed in the pending pool +func (p *PendingTxs) MarkUnconfirmed(hash common.Hash) { + if txRecord, ok := p.txinfos[hash]; ok { + txRecord.Confirmed = false + } +} + +// CancelTx creates a new transaction with empty calldata to cancel the original transaction +func (r *Rollup) CancelTx(tx *ethtypes.Transaction) (*ethtypes.Transaction, error) { + if tx == nil { + return nil, errors.New("nil tx") + } + + log.Info("canceling transaction", + "hash", tx.Hash().String(), + "gas_fee_cap", tx.GasFeeCap().String(), + "gas_tip", tx.GasTipCap().String(), + "blob_fee_cap", tx.BlobGasFeeCap().String(), + "gas", tx.Gas(), + "nonce", tx.Nonce(), + ) + + tip, gasFeeCap, blobFeeCap, err := r.GetGasTipAndCap() + if err != nil { + return nil, fmt.Errorf("get gas tip and cap error:%w", err) + } + + // bump tip & feeCap + bumpedFeeCap := calcThresholdValue(tx.GasFeeCap(), tx.Type() == ethtypes.BlobTxType) + bumpedTip := calcThresholdValue(tx.GasTipCap(), tx.Type() == ethtypes.BlobTxType) + + // if bumpedTip > tip + if bumpedTip.Cmp(tip) > 0 { + tip = bumpedTip + } + + if bumpedFeeCap.Cmp(gasFeeCap) > 0 { + gasFeeCap = bumpedFeeCap + } + + if tx.Type() == ethtypes.BlobTxType { + bumpedBlobFeeCap := calcThresholdValue(tx.BlobGasFeeCap(), tx.Type() == ethtypes.BlobTxType) + if bumpedBlobFeeCap.Cmp(blobFeeCap) > 0 { + blobFeeCap = bumpedBlobFeeCap + } + } + + var newTx *ethtypes.Transaction + switch tx.Type() { + case ethtypes.DynamicFeeTxType: + newTx = ethtypes.NewTx(ðtypes.DynamicFeeTx{ + ChainID: tx.ChainId(), + To: tx.To(), + Nonce: tx.Nonce(), + GasFeeCap: gasFeeCap, + GasTipCap: tip, + Gas: tx.Gas(), + Value: tx.Value(), + Data: []byte{}, // Empty calldata for cancellation + }) + case ethtypes.BlobTxType: + // For blob transactions, we need to keep one empty blob + var emptyBlob kzg4844.Blob + emptyCommitment, err := kzg4844.BlobToCommitment(&emptyBlob) + if err != nil { + return nil, fmt.Errorf("failed to create empty blob commitment: %w", err) + } + emptyProof, err := kzg4844.ComputeBlobProof(&emptyBlob, emptyCommitment) + if err != nil { + return nil, fmt.Errorf("failed to create empty blob proof: %w", err) + } + + newTx = ethtypes.NewTx(ðtypes.BlobTx{ + ChainID: uint256.MustFromBig(tx.ChainId()), + Nonce: tx.Nonce(), + GasTipCap: uint256.MustFromBig(tip), + GasFeeCap: uint256.MustFromBig(gasFeeCap), + Gas: tx.Gas(), + To: *tx.To(), + Value: uint256.MustFromBig(tx.Value()), + Data: []byte{}, // Empty calldata for cancellation + BlobFeeCap: uint256.MustFromBig(blobFeeCap), + BlobHashes: []common.Hash{kZGToVersionedHash(emptyCommitment)}, + Sidecar: ðtypes.BlobTxSidecar{ + Blobs: []kzg4844.Blob{emptyBlob}, + Commitments: []kzg4844.Commitment{emptyCommitment}, + Proofs: []kzg4844.Proof{emptyProof}, + }, + }) + default: + return nil, fmt.Errorf("cancel unknown tx type:%v", tx.Type()) + } + + log.Info("new cancel tx info", + "tx_type", newTx.Type(), + "gas_tip_gwei", utils.WeiToGwei(tip), + "gas_fee_cap_gwei", utils.WeiToGwei(gasFeeCap), + "blob_fee_cap_gwei", utils.WeiToGwei(blobFeeCap), + ) + + // sign tx + newTx, err = r.Sign(newTx) + if err != nil { + return nil, fmt.Errorf("sign tx error:%w", err) + } + + // send tx + err = r.SendTx(newTx) + if err != nil { + return nil, fmt.Errorf("send tx error:%w", err) + } + + return newTx, nil +} diff --git a/tx-submitter/services/rollup_handle_test.go b/tx-submitter/services/rollup_handle_test.go new file mode 100644 index 00000000..64f03b19 --- /dev/null +++ b/tx-submitter/services/rollup_handle_test.go @@ -0,0 +1,240 @@ +package services + +import ( + "context" + "math/big" + "testing" + "time" + + "github.com/morph-l2/go-ethereum" + "github.com/morph-l2/go-ethereum/common" + "github.com/morph-l2/go-ethereum/core" + ethtypes "github.com/morph-l2/go-ethereum/core/types" + "github.com/morph-l2/go-ethereum/crypto" + "github.com/stretchr/testify/require" + + "morph-l2/bindings/bindings" + "morph-l2/tx-submitter/event" + "morph-l2/tx-submitter/iface" + "morph-l2/tx-submitter/metrics" + "morph-l2/tx-submitter/mock" + "morph-l2/tx-submitter/types" + "morph-l2/tx-submitter/utils" +) + +// setupTestRollup creates a test Rollup instance with mocked dependencies +func setupTestRollup(t *testing.T) (*Rollup, *mock.L1ClientWrapper, *mock.L2ClientWrapper, *mock.MockRollup) { + // Create mock clients + l1Mock := mock.NewL1ClientWrapper() + l2Mock := mock.NewL2ClientWrapper() + + // Set mock values for gas estimation + l1Mock.BaseFee = big.NewInt(1e9) // 1 gwei + l1Mock.TipCap = big.NewInt(1e9) // 1 gwei + + // Create a private key for testing + privateKey, err := crypto.GenerateKey() + require.NoError(t, err) + + // Create mock metrics + metrics := metrics.NewMetrics() + t.Cleanup(func() { + metrics.UnregisterMetrics() + }) + + // Create mock event storage + eventStorage := mock.NewMockEventInfoStorage() + err = eventStorage.Load() + require.NoError(t, err) + + // Initialize event storage with test data + eventStorage.SetBlockProcessed(1000) + eventStorage.SetBlockTime(uint64(time.Now().Unix())) + err = eventStorage.Store() + require.NoError(t, err) + + // Create mock event indexer + indexer := event.NewEventIndexer( + nil, // We don't need a real ethclient.Client for testing + big.NewInt(0), + ethereum.FilterQuery{}, + 100, + eventStorage, + ) + + // Create mock rotator + rotator := NewRotator(common.Address{}, common.Address{}, indexer) + + // Create mock L1Staking + l1Staking := mock.NewMockL1Staking() + // Set some test stakers + testStakers := []common.Address{ + common.HexToAddress("0x1111111111111111111111111111111111111111"), + common.HexToAddress("0x2222222222222222222222222222222222222222"), + } + l1Staking.SetActiveStakers(testStakers) + + // Create rollup config + defaultCfg := utils.Config{ + MaxTip: 10e9, + MaxBaseFee: 100e9, + MinTip: 1e9, + TipFeeBump: 100, + TxTimeout: 10 * time.Second, + PriorityRollup: true, + } + + // Create mock journal + mockJournal := mock.NewMockJournal() + + // Create mock rollup + mockRollup := mock.NewMockRollup() + + // Get Rollup ABI + rollupAbi, err := bindings.RollupMetaData.GetAbi() + require.NoError(t, err) + require.NotNil(t, rollupAbi) + + // Create rollup instance + rollup := NewRollup( + context.Background(), + metrics, + nil, + l1Mock, + []iface.L2Client{l2Mock}, + mockRollup, + l1Staking, + big.NewInt(1), + privateKey, + common.Address{}, + rollupAbi, + defaultCfg, + nil, + rotator, + nil, + nil, + eventStorage, + ) + + // Initialize pending transactions + rollup.pendingTxs = NewPendingTxs([]byte{}, []byte{}, mockJournal) + + // Initialize reorg detector + // Use the mock implementation for controlled testing + mockReorgDetector := mock.NewMockReorgDetector() + rollup.reorgDetector = mockReorgDetector + + return rollup, l1Mock, l2Mock, mockRollup +} + +// TestHandleDiscardedTx tests the handling of discarded transactions +func TestHandleDiscardedTx(t *testing.T) { + r, l1Mock, _, _ := setupTestRollup(t) + + // Create a test transaction + tx := ethtypes.NewTx(ðtypes.DynamicFeeTx{ + ChainID: big.NewInt(1), + Nonce: 1, + GasTipCap: big.NewInt(1e9), + GasFeeCap: big.NewInt(2e9), + Gas: 21000, + To: &common.Address{}, + }) + + txRecord := &types.TxRecord{ + Tx: tx, + SendTime: uint64(time.Now().Unix()), + QueryTimes: 5, // Set high enough to trigger discard handling + } + + // Test case 1: Transaction was confirmed in a reorg + l1Mock.SendTxErr = core.ErrNonceTooLow + err := r.handleDiscardedTx(txRecord, tx, "commitBatch") + require.NoError(t, err) + require.Equal(t, 0, len(r.pendingTxs.GetAll()), "Transaction should be removed from pending pool") + + // Test case 2: Successful resubmission + l1Mock.SendTxErr = nil + tx = ethtypes.NewTx(ðtypes.DynamicFeeTx{ + ChainID: big.NewInt(1), + Nonce: 2, + GasTipCap: big.NewInt(1e9), + GasFeeCap: big.NewInt(2e9), + Gas: 21000, + To: &common.Address{}, + }) + txRecord.Tx = tx + + err = r.handleDiscardedTx(txRecord, tx, "commitBatch") + require.NoError(t, err) + require.Equal(t, 1, len(r.pendingTxs.GetAll()), "New transaction should be added to pending pool") +} + +// TestHandleReorg tests the handling of chain reorganizations +func TestHandleReorg(t *testing.T) { + r, _, _, _ := setupTestRollup(t) + + // Test reorg handling + depth := uint64(2) + err := r.handleReorg(depth) + require.NoError(t, err) + + // Verify metrics + require.Equal(t, float64(depth), r.metrics.GetReorgDepth()) + require.Equal(t, float64(1), r.metrics.GetReorgCount()) + +} + +// TestHandleMissingTx tests the handling of missing transactions +func TestHandleMissingTx(t *testing.T) { + r, l1Mock, _, _ := setupTestRollup(t) + + // Create a test transaction + tx := ethtypes.NewTx(ðtypes.DynamicFeeTx{ + ChainID: big.NewInt(1), + Nonce: 1, + GasTipCap: big.NewInt(1e9), + GasFeeCap: big.NewInt(2e9), + Gas: 21000, + To: &common.Address{}, + }) + + // Test case 1: Transaction with low query times + txRecord := &types.TxRecord{ + Tx: tx, + SendTime: uint64(time.Now().Unix()), + QueryTimes: 2, + } + + // add record to localpool + r.pendingTxs.txinfos[tx.Hash()] = txRecord + + err := r.handleMissingTx(txRecord, tx, "commitBatch") + require.NoError(t, err) + record := r.pendingTxs.GetTxRecord(tx.Hash()) + require.NotNil(t, record, "Transaction record should exist") + require.Equal(t, uint64(3), record.QueryTimes) + + // Test case 2: Transaction with high query times + oldHash := tx.Hash() + txRecord.QueryTimes = 5 + // Set up mock for successful resubmission + l1Mock.SendTxErr = nil + err = r.handleMissingTx(txRecord, tx, "commitBatch") + require.NoError(t, err) + + // The old transaction should be removed + record = r.pendingTxs.GetTxRecord(oldHash) + require.Nil(t, record, "Old transaction should be removed") + + // Find the new transaction by checking all pending transactions + found := false + for _, txRecord := range r.pendingTxs.GetAll() { + if txRecord.Tx.Nonce() == tx.Nonce() { + found = true + require.Equal(t, uint64(0), txRecord.QueryTimes, "New transaction should have reset query times") + break + } + } + require.True(t, found, "New transaction should exist in pending pool") +} diff --git a/tx-submitter/services/rollup_test.go b/tx-submitter/services/rollup_test.go index 3476d8f8..abbca104 100644 --- a/tx-submitter/services/rollup_test.go +++ b/tx-submitter/services/rollup_test.go @@ -7,6 +7,7 @@ import ( "github.com/holiman/uint256" "github.com/morph-l2/go-ethereum/common" "github.com/morph-l2/go-ethereum/core/types" + "github.com/morph-l2/go-ethereum/crypto/kzg4844" "github.com/stretchr/testify/require" "morph-l2/tx-submitter/utils" @@ -49,3 +50,369 @@ func TestSendTx(t *testing.T) { err = sendTx(nil, 1, blobTx) require.ErrorContains(t, err, utils.ErrExceedFeeLimit.Error()) } + +func TestGetGasTipAndCap(t *testing.T) { + initTip := big.NewInt(1e9) + baseFee := big.NewInt(1e9) + block := types.NewBlockWithHeader( + &types.Header{ + BaseFee: baseFee, + }, + ) + + r, l1Mock, _, _ := setupTestRollup(t) + l1Mock.TipCap = initTip + l1Mock.Block = block + + tip, feecap, blobfee, err := r.GetGasTipAndCap() + require.NoError(t, err) + require.NotNil(t, tip) + require.NotNil(t, feecap) + require.NotNil(t, blobfee) + require.Equal(t, initTip, tip) + + // Test with different TipFeeBump + r, l1Mock, _, _ = setupTestRollup(t) + l1Mock.TipCap = initTip + l1Mock.Block = block + r.cfg.TipFeeBump = 200 + + tip, feecap, blobfee, err = r.GetGasTipAndCap() + require.NoError(t, err) + require.NotNil(t, tip) + require.NotNil(t, feecap) + require.NotNil(t, blobfee) + require.Equal(t, tip, initTip.Mul(initTip, big.NewInt(2))) + + // Test with base fee too high + r, l1Mock, _, _ = setupTestRollup(t) + l1Mock.TipCap = initTip + l1Mock.Block = block + r.cfg.MaxBaseFee = baseFee.Uint64() - 1 + + _, _, _, err = r.GetGasTipAndCap() + require.ErrorContains(t, err, "base fee is too high") + + // Test with tip too high + r, l1Mock, _, _ = setupTestRollup(t) + l1Mock.TipCap = initTip + l1Mock.Block = block + r.cfg.MaxTip = initTip.Uint64() - 1 + + _, _, _, err = r.GetGasTipAndCap() + require.ErrorContains(t, err, "tip is too high") +} + +func TestReSubmitTx(t *testing.T) { + marketTip := big.NewInt(3e9) // 3 Gwei market tip + baseFee := big.NewInt(2e9) // 2 Gwei base fee + block := types.NewBlockWithHeader( + &types.Header{ + BaseFee: baseFee, + }, + ) + + r, l1Mock, _, _ := setupTestRollup(t) + l1Mock.TipCap = marketTip + l1Mock.Block = block + r.cfg.MaxTip = 10e12 + r.cfg.MaxBaseFee = 100e9 + r.cfg.MinTip = 1e9 + r.cfg.TipFeeBump = 0 // no bump for replace mode + + // Test nil tx + _, err := r.ReSubmitTx(false, nil) + require.ErrorContains(t, err, "nil tx") + + t.Run("DynamicFeeTx", func(t *testing.T) { + oldDynamicTx := types.NewTx(&types.DynamicFeeTx{ + ChainID: big.NewInt(1), + Nonce: 1, + GasTipCap: big.NewInt(2e9), // 2 Gwei + GasFeeCap: big.NewInt(10e9), // 10 Gwei + Gas: 100000, + To: &common.Address{}, + Value: big.NewInt(0), + Data: []byte{1, 2, 3, 4}, + }) + + // Test Replace Mode + t.Run("Replace", func(t *testing.T) { + newTx, err := r.ReSubmitTx(false, oldDynamicTx) + require.NoError(t, err) + require.NotNil(t, newTx) + + // Verify fields preserved + require.Equal(t, oldDynamicTx.Nonce(), newTx.Nonce()) + require.Equal(t, oldDynamicTx.Gas(), newTx.Gas()) + require.Equal(t, oldDynamicTx.Data(), newTx.Data()) + require.Equal(t, oldDynamicTx.Value(), newTx.Value()) + + // Verify fees are at least 1.1x of original + originalTip := oldDynamicTx.GasTipCap() + newTip := newTx.GasTipCap() + expectedTip := new(big.Int).Mul(originalTip, big.NewInt(110)) + expectedTip = expectedTip.Div(expectedTip, big.NewInt(100)) + require.True(t, newTip.Cmp(expectedTip) >= 0, "new tip should be at least 1.1x of original") + + originalFeeCap := oldDynamicTx.GasFeeCap() + newFeeCap := newTx.GasFeeCap() + expectedFeeCap := new(big.Int).Mul(originalFeeCap, big.NewInt(110)) + expectedFeeCap = expectedFeeCap.Div(expectedFeeCap, big.NewInt(100)) + require.True(t, newFeeCap.Cmp(expectedFeeCap) >= 0, "new fee cap should be at least 1.1x of original") + }) + + // Test Resubmit Mode + t.Run("Resubmit", func(t *testing.T) { + newTx, err := r.ReSubmitTx(true, oldDynamicTx) + require.NoError(t, err) + require.NotNil(t, newTx) + + // Verify fields preserved + require.Equal(t, oldDynamicTx.Nonce(), newTx.Nonce()) + require.Equal(t, oldDynamicTx.Gas(), newTx.Gas()) + require.Equal(t, oldDynamicTx.Data(), newTx.Data()) + require.Equal(t, oldDynamicTx.Value(), newTx.Value()) + require.Equal(t, oldDynamicTx.ChainId(), newTx.ChainId()) + + // Verify fees are market prices + require.Equal(t, marketTip.Uint64(), newTx.GasTipCap().Uint64(), "new tip should be market price") + require.True(t, newTx.GasFeeCap().Cmp(baseFee) > 0, "new fee cap should be higher than base fee") + }) + }) + + t.Run("BlobTx", func(t *testing.T) { + oldBlobTx := types.NewTx(&types.BlobTx{ + ChainID: uint256.MustFromBig(big.NewInt(1)), + Nonce: 2, + GasTipCap: uint256.MustFromBig(big.NewInt(2e9)), + GasFeeCap: uint256.MustFromBig(big.NewInt(10e9)), + Gas: 200000, + To: common.Address{}, + Value: uint256.NewInt(0), + Data: []byte{1, 2, 3, 4}, + BlobFeeCap: uint256.MustFromBig(big.NewInt(5e9)), + BlobHashes: []common.Hash{{1}}, + Sidecar: &types.BlobTxSidecar{ + Blobs: []kzg4844.Blob{{1}}, + Commitments: []kzg4844.Commitment{{1}}, + Proofs: []kzg4844.Proof{{1}}, + }, + }) + + // Test Replace Mode + t.Run("Replace", func(t *testing.T) { + newTx, err := r.ReSubmitTx(false, oldBlobTx) + require.NoError(t, err) + require.NotNil(t, newTx) + + // Verify fields preserved + require.Equal(t, oldBlobTx.Nonce(), newTx.Nonce()) + require.Equal(t, oldBlobTx.Gas(), newTx.Gas()) + require.Equal(t, oldBlobTx.Data(), newTx.Data()) + require.Equal(t, oldBlobTx.Value(), newTx.Value()) + require.Equal(t, len(oldBlobTx.BlobHashes()), len(newTx.BlobHashes())) + + // Verify fees are at least 2x of original + originalTip := oldBlobTx.GasTipCap() + newTip := newTx.GasTipCap() + expectedTip := new(big.Int).Mul(originalTip, big.NewInt(200)) + expectedTip = expectedTip.Div(expectedTip, big.NewInt(100)) + require.True(t, newTip.Cmp(expectedTip) >= 0, "new tip should be at least 2x of original") + + originalFeeCap := oldBlobTx.GasFeeCap() + newFeeCap := newTx.GasFeeCap() + expectedFeeCap := new(big.Int).Mul(originalFeeCap, big.NewInt(200)) + expectedFeeCap = expectedFeeCap.Div(expectedFeeCap, big.NewInt(100)) + require.True(t, newFeeCap.Cmp(expectedFeeCap) >= 0, "new fee cap should be at least 2x of original") + + originalBlobFeeCap := oldBlobTx.BlobGasFeeCap() + newBlobFeeCap := newTx.BlobGasFeeCap() + expectedBlobFeeCap := new(big.Int).Mul(originalBlobFeeCap, big.NewInt(200)) + expectedBlobFeeCap = expectedBlobFeeCap.Div(expectedBlobFeeCap, big.NewInt(100)) + require.True(t, newBlobFeeCap.Cmp(expectedBlobFeeCap) >= 0, "new blob fee cap should be at least 2x of original") + }) + + // Test Resubmit Mode + t.Run("Resubmit", func(t *testing.T) { + newTx, err := r.ReSubmitTx(true, oldBlobTx) + require.NoError(t, err) + require.NotNil(t, newTx) + + // Verify fields preserved + require.Equal(t, oldBlobTx.Nonce(), newTx.Nonce()) + require.Equal(t, oldBlobTx.Gas(), newTx.Gas()) + require.Equal(t, oldBlobTx.Data(), newTx.Data()) + require.Equal(t, oldBlobTx.Value(), newTx.Value()) + require.Equal(t, len(oldBlobTx.BlobHashes()), len(newTx.BlobHashes())) + + // Verify fees are market prices + require.Equal(t, marketTip.Uint64(), newTx.GasTipCap().Uint64(), "new tip should be market price") + require.True(t, newTx.GasFeeCap().Cmp(baseFee) > 0, "new fee cap should be higher than base fee") + require.NotNil(t, newTx.BlobGasFeeCap(), "new blob tx should have blob fee cap") + }) + }) +} + +func TestCancelTx(t *testing.T) { + // Setup mock L1 client + initTip := big.NewInt(1e9) + baseFee := big.NewInt(1e9) + block := types.NewBlockWithHeader( + &types.Header{ + BaseFee: baseFee, + }, + ) + + r, l1Mock, _, _ := setupTestRollup(t) + l1Mock.TipCap = initTip + l1Mock.Block = block + r.cfg.MaxTip = 10e12 + r.cfg.MaxBaseFee = 100e9 + r.cfg.MinTip = 1e9 + r.cfg.TipFeeBump = 120 // 20% bump + + // Test 1: Cancel nil transaction + _, err := r.CancelTx(nil) + require.Error(t, err) + require.Contains(t, err.Error(), "nil tx") + + // Test 2: Cancel DynamicFeeTx + originalDynamicTx := types.NewTx(&types.DynamicFeeTx{ + ChainID: big.NewInt(1), + Nonce: 1, + GasTipCap: big.NewInt(2e9), // 2 Gwei + GasFeeCap: big.NewInt(10e9), // 10 Gwei + Gas: 100000, + To: &common.Address{}, + Value: big.NewInt(0), + Data: []byte{1, 2, 3, 4}, // Some non-empty data + }) + + cancelTx, err := r.CancelTx(originalDynamicTx) + require.NoError(t, err) + require.NotNil(t, cancelTx) + + // Verify the cancel transaction + require.Equal(t, originalDynamicTx.Nonce(), cancelTx.Nonce()) + require.Equal(t, originalDynamicTx.Gas(), cancelTx.Gas()) + require.Equal(t, 0, len(cancelTx.Data())) + + // Verify fee multipliers for DynamicFeeTx (1.2x) + originalTip := originalDynamicTx.GasTipCap() + cancelTip := cancelTx.GasTipCap() + expectedTip := new(big.Int).Mul(originalTip, big.NewInt(110)) + expectedTip = expectedTip.Div(expectedTip, big.NewInt(100)) + require.True(t, cancelTip.Cmp(expectedTip) >= 0, "cancel tx tip should be at least 1.1x of original") + + originalFeeCap := originalDynamicTx.GasFeeCap() + cancelFeeCap := cancelTx.GasFeeCap() + expectedFeeCap := new(big.Int).Mul(originalFeeCap, big.NewInt(110)) + expectedFeeCap = expectedFeeCap.Div(expectedFeeCap, big.NewInt(100)) + require.True(t, cancelFeeCap.Cmp(expectedFeeCap) >= 0, "cancel tx fee cap should be at least 1.1x of original") + + // Test 3: Cancel BlobTx + blobTx := types.NewTx(&types.BlobTx{ + ChainID: uint256.MustFromBig(big.NewInt(1)), + Nonce: 2, + GasTipCap: uint256.MustFromBig(big.NewInt(2e9)), + GasFeeCap: uint256.MustFromBig(big.NewInt(10e9)), + Gas: 200000, + To: common.Address{}, + Value: uint256.NewInt(0), + Data: []byte{1, 2, 3, 4}, + BlobFeeCap: uint256.MustFromBig(big.NewInt(5e9)), + BlobHashes: []common.Hash{{1}}, + Sidecar: &types.BlobTxSidecar{ + Blobs: []kzg4844.Blob{{1}}, + Commitments: []kzg4844.Commitment{{1}}, + Proofs: []kzg4844.Proof{{1}}, + }, + }) + + cancelBlobTx, err := r.CancelTx(blobTx) + require.NoError(t, err) + require.NotNil(t, cancelBlobTx) + + // Verify the cancel blob transaction + require.Equal(t, blobTx.Nonce(), cancelBlobTx.Nonce()) + require.Equal(t, blobTx.Gas(), cancelBlobTx.Gas()) + require.Equal(t, 0, len(cancelBlobTx.Data())) + + // Verify fee multipliers for BlobTx (2x) + originalTip = blobTx.GasTipCap() + cancelTip = cancelBlobTx.GasTipCap() + require.True(t, cancelTip.Cmp(new(big.Int).Mul(originalTip, big.NewInt(2))) >= 0, "cancel blob tx tip should be at least 2x of original") + + originalFeeCap = blobTx.GasFeeCap() + cancelFeeCap = cancelBlobTx.GasFeeCap() + require.True(t, cancelFeeCap.Cmp(new(big.Int).Mul(originalFeeCap, big.NewInt(2))) >= 0, "cancel blob tx fee cap should be at least 2x of original") + + originalBlobFeeCap := blobTx.BlobGasFeeCap() + cancelBlobFeeCap := cancelBlobTx.BlobGasFeeCap() + require.True(t, cancelBlobFeeCap.Cmp(new(big.Int).Mul(originalBlobFeeCap, big.NewInt(2))) >= 0, "cancel blob tx blob fee cap should be at least 2x of original") + require.Equal(t, 1, len(cancelBlobTx.BlobHashes())) + require.Equal(t, 1, len(cancelBlobTx.BlobTxSidecar().Blobs)) +} + +func TestTxStateTransition(t *testing.T) { + // Create test transactions + tx1 := types.NewTx(&types.DynamicFeeTx{ + ChainID: big.NewInt(1), + Nonce: 0, + GasTipCap: big.NewInt(1), + GasFeeCap: big.NewInt(100), + Gas: 21000, + To: &common.Address{}, + Value: big.NewInt(1), + }) + receipt := &types.Receipt{ + TxHash: tx1.Hash(), + BlockNumber: big.NewInt(1000), + Status: 1, + BlobGasUsed: 0, + BlobGasPrice: big.NewInt(0), + } + + // Create rollup instance + rollup, l1Mock, _, _ := setupTestRollup(t) + rollup.cfg.PriorityRollup = true + + // Test transaction state transitions + t.Run("Transaction State Flow", func(t *testing.T) { + // Step 1: Transaction exists only locally (not in mempool or block) + err := rollup.pendingTxs.Add(tx1) + require.NoError(t, err) + status, err := rollup.getTxStatus(tx1) + require.NoError(t, err) + require.Equal(t, txStatusMissing, status.state) + + // Step 2: Transaction detected in mempool + l1Mock.AddTx(tx1) + status, err = rollup.getTxStatus(tx1) + require.NoError(t, err) + require.Equal(t, txStatusPending, status.state) + + // Step 3: Transaction included in block + l1Mock.AddReceipt(receipt) + status, err = rollup.getTxStatus(tx1) + require.NoError(t, err) + require.Equal(t, txStatusConfirmed, status.state) + + // Step 4: Transaction finalized (after 6 blocks) + l1Mock.Block = types.NewBlockWithHeader( + &types.Header{ + Number: big.NewInt(1006), + }, + ) + status, err = rollup.getTxStatus(tx1) + require.NoError(t, err) + require.Equal(t, txStatusConfirmed, status.state) + + // Step 5: Process transaction and verify cleanup + rollup.ProcessTx() + // Verify transaction is removed from pendingTxs after finalization + txRecord := rollup.pendingTxs.GetTxRecord(tx1.Hash()) + require.Nil(t, txRecord) + }) +} diff --git a/tx-submitter/services/rotator.go b/tx-submitter/services/rotator.go index 913fff48..bb5bb81a 100644 --- a/tx-submitter/services/rotator.go +++ b/tx-submitter/services/rotator.go @@ -56,18 +56,18 @@ func (r *Rotator) UpdateState(clients []iface.L2Client, l1Staking iface.IL1Staki return fmt.Errorf("GetCurrentSubmitter: failed to get sequencer set update time: %w", err) } - storage := event.NewEventInfoStorage(r.indexer.GetStorePath()) + storage := r.indexer.GetStorage() err = storage.Load() if err != nil { log.Error("failed to load storage", "err", err) return fmt.Errorf("GetCurrentSubmitter: failed to load storage: %w", err) } // if index not complete - if storage.BlockProcessed == 0 { + if storage.BlockProcessed() == 0 { return errors.New("wait event index service to complete") } - r.startTime = utils.MaxOfThreeBig(epochUpdateTime, sequcerUpdateTime, big.NewInt(int64(storage.BlockTime))) + r.startTime = utils.MaxOfThreeBig(epochUpdateTime, sequcerUpdateTime, big.NewInt(int64(storage.BlockTime()))) // get current sequencer set seqSet, err := QuerySequencerSet(r.l2SequencerAddr, clients) @@ -92,30 +92,44 @@ func (r *Rotator) UpdateState(clients []iface.L2Client, l1Staking iface.IL1Staki } submitterSet := utils.IntersectionOfAddresses(r.GetSequencerSet(), stakers) r.SetSubmitterSet(submitterSet) + // rotator info + log.Info( + "rotator state updated", + "epoch", r.epoch, + "start_time", utils.FormatTime(r.startTime), + "start_timestamp", r.startTime, + "epoch_update_time", utils.FormatTime(epochUpdateTime), + "epoch_update_timestamp", epochUpdateTime, + "seq_update_time", utils.FormatTime(sequcerUpdateTime), + "seq_update_timestamp", sequcerUpdateTime, + "indexed_latest_block", storage.BlockProcessed(), + "indexed_event_time", utils.FormatTime(big.NewInt(int64(storage.BlockTime()))), + "indexed_event_timestamp", storage.BlockTime(), + ) return nil } // GetCurrentSubmitter returns the current sequencer that should be submitting -func (r *Rotator) CurrentSubmitter(clients []iface.L2Client, l1Staking iface.IL1Staking) (*common.Address, error) { +func (r *Rotator) CurrentSubmitter(clients []iface.L2Client, l1Staking iface.IL1Staking) (*common.Address, int64, error) { err := r.UpdateState(clients, l1Staking) if err != nil { - return nil, fmt.Errorf("update state err: %w", err) + return nil, 0, fmt.Errorf("update state err: %w", err) } if len(r.GetSubmitterSet()) == 0 { - return nil, fmt.Errorf("GetCurrentSubmitter: sequencer set is empty") + return nil, 0, fmt.Errorf("GetCurrentSubmitter: sequencer set is empty") } if r.epoch.Int64() == 0 { - return nil, fmt.Errorf("GetCurrentSubmitter: epoch is 0") + return nil, 0, fmt.Errorf("GetCurrentSubmitter: epoch is 0") } sec := time.Now().Unix() - r.startTime.Int64() seqIdx := sec / r.epoch.Int64() % int64(len(r.GetSequencerSet())) - return &r.GetSubmitterSet()[seqIdx], nil + return &r.GetSubmitterSet()[seqIdx], seqIdx, nil } diff --git a/tx-submitter/services/utils.go b/tx-submitter/services/utils.go index 4c55dd03..302f692f 100644 --- a/tx-submitter/services/utils.go +++ b/tx-submitter/services/utils.go @@ -5,7 +5,7 @@ import ( "math/big" "github.com/morph-l2/go-ethereum/common" - "github.com/morph-l2/go-ethereum/core/types" + ethtypes "github.com/morph-l2/go-ethereum/core/types" "github.com/morph-l2/go-ethereum/crypto/kzg4844" "github.com/morph-l2/go-ethereum/params" ) @@ -44,27 +44,45 @@ func calcThresholdValue(x *big.Int, isBlobTx bool) *big.Int { return threshold } -func calcFee(receipt *types.Receipt) float64 { +// calcFee calculates the total transaction fee in ETH +// For regular transactions: fee = gasUsed * effectiveGasPrice +// For blob transactions: fee = (gasUsed * effectiveGasPrice) + (blobGasUsed * blobGasPrice) +func calcFee(tx *ethtypes.Transaction, receipt *ethtypes.Receipt) *big.Float { + if receipt == nil || tx == nil { + return new(big.Float).SetUint64(0) + } - if receipt == nil || receipt.EffectiveGasPrice == nil { - return 0 + // Calculate base transaction fee + gasUsed := new(big.Float).SetUint64(receipt.GasUsed) + effectiveGasPrice := new(big.Float) + if receipt.EffectiveGasPrice != nil { + effectiveGasPrice.SetInt(receipt.EffectiveGasPrice) } + txFee := new(big.Float).Mul(gasUsed, effectiveGasPrice) + + // Convert to ETH + ethDenominator := new(big.Float).SetInt(big.NewInt(params.Ether)) + txFeeEth := new(big.Float).Quo(txFee, ethDenominator) - calldatafee := new(big.Int).Mul(receipt.EffectiveGasPrice, big.NewInt(int64(receipt.GasUsed))) - // blobfee - blobfee := big.NewInt(0) - if receipt.Type == types.BlobTxType { - if receipt.BlobGasPrice == nil { - return 0 + // Add blob fee for blob transactions + if tx.Type() == ethtypes.BlobTxType { + blobGasUsed := new(big.Float).SetUint64(tx.BlobGas()) + blobGasPrice := new(big.Float) + if receipt.BlobGasPrice != nil { + blobGasPrice.SetInt(receipt.BlobGasPrice) } - blobfee = new(big.Int).Mul(big.NewInt(int64(receipt.BlobGasUsed)), receipt.BlobGasPrice) + blobFee := new(big.Float).Mul(blobGasUsed, blobGasPrice) + blobFeeEth := new(big.Float).Quo(blobFee, ethDenominator) + txFeeEth.Add(txFeeEth, blobFeeEth) } - fee := new(big.Int).Add(calldatafee, blobfee) - return ToEtherFloat(fee) + return txFeeEth } func ToEtherFloat(weiAmt *big.Int) float64 { + if weiAmt == nil { + return 0 + } etherAmt := new(big.Rat).SetFrac(weiAmt, big.NewInt(params.Ether)) fEtherAmt, _ := etherAmt.Float64() return fEtherAmt diff --git a/tx-submitter/types/batch_cache.go b/tx-submitter/types/batch_cache.go new file mode 100644 index 00000000..9be2d603 --- /dev/null +++ b/tx-submitter/types/batch_cache.go @@ -0,0 +1,97 @@ +package types + +import ( + "sync" + + "morph-l2/tx-submitter/iface" + + "github.com/morph-l2/go-ethereum/eth" + "github.com/morph-l2/go-ethereum/log" +) + +type BatchCache struct { + m sync.RWMutex + batchCache map[uint64]*eth.RPCRollupBatch + fetcher iface.BatchFetcher +} + +// NewBatchCache creates a new batch cache instance +func NewBatchCache(fetcher iface.BatchFetcher) *BatchCache { + return &BatchCache{ + batchCache: make(map[uint64]*eth.RPCRollupBatch), + fetcher: fetcher, + } +} + +// Get retrieves a batch from the cache by its index +// If not found in cache, tries to fetch from node +func (b *BatchCache) Get(batchIndex uint64) (*eth.RPCRollupBatch, bool) { + // First try to get from cache + b.m.RLock() + batch, ok := b.batchCache[batchIndex] + b.m.RUnlock() + + if ok { + return batch, true + } + + // If not in cache, try to fetch from node + if b.fetcher != nil { + fetchedBatch, err := b.fetcher.GetRollupBatchByIndex(batchIndex) + if err != nil { + log.Warn("Failed to fetch batch from node", + "index", batchIndex, + "error", err) + return nil, false + } + + // Validate batch before caching - batch must exist and have signatures + if fetchedBatch != nil && len(fetchedBatch.Signatures) > 0 { + // Store valid batch in cache for future use + b.m.Lock() + b.batchCache[batchIndex] = fetchedBatch + b.m.Unlock() + + return fetchedBatch, true + } else if fetchedBatch != nil { + // Batch exists but doesn't have signatures, don't cache it + log.Debug("Batch validation failed - no signatures", + "batch_index", batchIndex, + "found", fetchedBatch != nil, + "has_signatures", len(fetchedBatch.Signatures) > 0) + return fetchedBatch, true + } + } + + return nil, false +} + +func (b *BatchCache) Set(batchIndex uint64, batch *eth.RPCRollupBatch) { + // Validate batch before caching - batch must exist and have signatures + if batch == nil || len(batch.Signatures) == 0 { + log.Debug("Refusing to cache invalid batch", + "batch_index", batchIndex, + "exists", batch != nil, + "has_signatures", batch != nil && len(batch.Signatures) > 0) + return + } + + b.m.Lock() + defer b.m.Unlock() + + b.batchCache[batchIndex] = batch +} + +func (b *BatchCache) Delete(batchIndex uint64) { + b.m.Lock() + defer b.m.Unlock() + + delete(b.batchCache, batchIndex) +} + +// Clear removes all entries from the batch cache +func (bc *BatchCache) Clear() { + bc.m.Lock() + defer bc.m.Unlock() + bc.batchCache = make(map[uint64]*eth.RPCRollupBatch) +} diff --git a/tx-submitter/types/batch_cache_test.go b/tx-submitter/types/batch_cache_test.go new file mode 100644 index 00000000..ae1449fd --- /dev/null +++ b/tx-submitter/types/batch_cache_test.go @@ -0,0 +1,201 @@ +package types + +import ( + "sync" + "testing" + + "github.com/morph-l2/go-ethereum/eth" + + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/mock" +) + +// MockBatchFetcher implements the BatchFetcher interface for testing +type MockBatchFetcher struct { + mock.Mock +} + +func (m *MockBatchFetcher) GetRollupBatchByIndex(index uint64) (*eth.RPCRollupBatch, error) { + args := m.Called(index) + if args.Get(0) == nil { + return nil, args.Error(1) + } + return args.Get(0).(*eth.RPCRollupBatch), args.Error(1) +} + +func TestBatchCache(t *testing.T) { + t.Run("Get non-existent batch - fetch from node", func(t *testing.T) { + mockFetcher := new(MockBatchFetcher) + cache := NewBatchCache(mockFetcher) + + expectedBatch := ð.RPCRollupBatch{ + Version: 1, + Signatures: []eth.RPCBatchSignature{ + { + Signature: []byte("signature"), + }, + }, + } + mockFetcher.On("GetRollupBatchByIndex", uint64(1)).Return(expectedBatch, nil) + + batch, ok := cache.Get(1) + assert.True(t, ok) + assert.Equal(t, expectedBatch, batch) + + mockFetcher.AssertExpectations(t) + + // Second get should use cache + batch, ok = cache.Get(1) + assert.True(t, ok) + assert.Equal(t, expectedBatch, batch) + }) + + t.Run("Get non-existent batch - fetch fails", func(t *testing.T) { + mockFetcher := new(MockBatchFetcher) + cache := NewBatchCache(mockFetcher) + + mockFetcher.On("GetRollupBatchByIndex", uint64(2)).Return(nil, assert.AnError).Once() + + batch, ok := cache.Get(2) + assert.False(t, ok) + assert.Nil(t, batch) + + mockFetcher.AssertExpectations(t) + }) + + t.Run("Set and Get batch", func(t *testing.T) { + mockFetcher := new(MockBatchFetcher) + cache := NewBatchCache(mockFetcher) + + batch := ð.RPCRollupBatch{ + Version: 1, + Signatures: []eth.RPCBatchSignature{ + { + Signature: []byte("signature"), + }, + }, + } + + // Add this line to set up the mock expectation + mockFetcher.On("GetRollupBatchByIndex", uint64(3)).Return(batch, nil).Maybe() + + cache.Set(3, batch) + + gotBatch, ok := cache.Get(3) + assert.True(t, ok) + assert.Equal(t, batch, gotBatch) + + mockFetcher.AssertExpectations(t) + }) + + t.Run("Delete batch", func(t *testing.T) { + mockFetcher := new(MockBatchFetcher) + cache := NewBatchCache(mockFetcher) + + batch := ð.RPCRollupBatch{ + Version: 1, + Signatures: []eth.RPCBatchSignature{ + { + Signature: []byte("signature"), + }, + }, + } + + cache.Set(4, batch) + gotBatch, ok := cache.Get(4) + assert.True(t, ok) + assert.Equal(t, batch, gotBatch) + + cache.Delete(4) + + // Setup mock for fetching after delete + mockFetcher.On("GetRollupBatchByIndex", uint64(4)).Return(nil, assert.AnError).Once() + + gotBatch, ok = cache.Get(4) + assert.False(t, ok) + assert.Nil(t, gotBatch) + + mockFetcher.AssertExpectations(t) + }) + + t.Run("Clear cache", func(t *testing.T) { + mockFetcher := new(MockBatchFetcher) + cache := NewBatchCache(mockFetcher) + + batch1 := ð.RPCRollupBatch{ + Version: 1, + Signatures: []eth.RPCBatchSignature{ + { + Signature: []byte("signature1"), + }, + }, + } + batch2 := ð.RPCRollupBatch{ + Version: 2, + Signatures: []eth.RPCBatchSignature{ + { + Signature: []byte("signature2"), + }, + }, + } + + cache.Set(5, batch1) + cache.Set(6, batch2) + + cache.Clear() + + // Setup mocks for fetching after clear + mockFetcher.On("GetRollupBatchByIndex", uint64(5)).Return(nil, assert.AnError).Once() + mockFetcher.On("GetRollupBatchByIndex", uint64(6)).Return(nil, assert.AnError).Once() + + gotBatch, ok := cache.Get(5) + assert.False(t, ok) + assert.Nil(t, gotBatch) + + gotBatch, ok = cache.Get(6) + assert.False(t, ok) + assert.Nil(t, gotBatch) + + mockFetcher.AssertExpectations(t) + }) + + t.Run("Concurrent access", func(t *testing.T) { + mockFetcher := new(MockBatchFetcher) + cache := NewBatchCache(mockFetcher) + + // Pre-set a batch to avoid nil pointer in concurrent access + testBatch := ð.RPCRollupBatch{ + Version: 7, + Signatures: []eth.RPCBatchSignature{ + { + Signature: []byte("signature"), + }, + }, + } + cache.Set(7, testBatch) + + // Setup mock expectation to allow any number of calls + mockFetcher.On("GetRollupBatchByIndex", uint64(7)).Return(testBatch, nil).Maybe() + + var wg sync.WaitGroup + for i := 0; i < 10; i++ { + wg.Add(1) + go func() { + defer wg.Done() + + batch, ok := cache.Get(7) + if ok && batch != nil { + cache.Set(7, batch) + } + }() + } + + wg.Wait() + + // Final validation of cache state + batch, ok := cache.Get(7) + assert.True(t, ok) + assert.NotNil(t, batch) + assert.Equal(t, testBatch.Version, batch.Version) + }) +} diff --git a/tx-submitter/types/batch_cache_validation_test.go b/tx-submitter/types/batch_cache_validation_test.go new file mode 100644 index 00000000..c809b5e5 --- /dev/null +++ b/tx-submitter/types/batch_cache_validation_test.go @@ -0,0 +1,135 @@ +package types + +import ( + "testing" + + "github.com/morph-l2/go-ethereum/common" + "github.com/morph-l2/go-ethereum/eth" + "github.com/stretchr/testify/assert" +) + +func TestBatchValidation(t *testing.T) { + t.Run("Get - Valid batch with signatures is cached", func(t *testing.T) { + mockFetcher := new(MockBatchFetcher) + cache := NewBatchCache(mockFetcher) + + // Create valid batch with signatures + validBatch := ð.RPCRollupBatch{ + Version: 1, + Signatures: []eth.RPCBatchSignature{ + { + Signer: common.HexToAddress("0x1234567890123456789012345678901234567890"), + Signature: []byte("test-signature"), + }, + }, + } + + mockFetcher.On("GetRollupBatchByIndex", uint64(1)).Return(validBatch, nil).Once() + + // Get should return the batch and cache it + batch, ok := cache.Get(1) + assert.True(t, ok) + assert.Equal(t, validBatch, batch) + assert.Equal(t, 1, len(batch.Signatures)) + + // Second get should use cache without calling fetcher + batch, ok = cache.Get(1) + assert.True(t, ok) + assert.Equal(t, validBatch, batch) + + mockFetcher.AssertExpectations(t) + }) + + t.Run("Get - Invalid batch without signatures is not cached", func(t *testing.T) { + mockFetcher := new(MockBatchFetcher) + cache := NewBatchCache(mockFetcher) + + // Create invalid batch without signatures + invalidBatch := ð.RPCRollupBatch{ + Version: 1, + Signatures: []eth.RPCBatchSignature{}, // Empty signatures + } + + mockFetcher.On("GetRollupBatchByIndex", uint64(2)).Return(invalidBatch, nil).Once() + mockFetcher.On("GetRollupBatchByIndex", uint64(2)).Return(invalidBatch, nil).Once() // Second call because not cached + + // Get should return the batch but not cache it + batch, ok := cache.Get(2) + assert.True(t, ok) // Still returns true because batch was found, just not cached + assert.Equal(t, invalidBatch, batch) + assert.Equal(t, 0, len(batch.Signatures)) + + // Second get should call fetcher again since it wasn't cached + batch, ok = cache.Get(2) + assert.True(t, ok) + assert.Equal(t, invalidBatch, batch) + + mockFetcher.AssertExpectations(t) + }) + + t.Run("Set - Valid batch with signatures is stored", func(t *testing.T) { + mockFetcher := new(MockBatchFetcher) + cache := NewBatchCache(mockFetcher) + + // Create valid batch with signatures + validBatch := ð.RPCRollupBatch{ + Version: 1, + Signatures: []eth.RPCBatchSignature{ + { + Signer: common.HexToAddress("0x1234567890123456789012345678901234567890"), + Signature: []byte("test-signature"), + }, + }, + } + + // Set should store the batch + cache.Set(3, validBatch) + + // Get should retrieve from cache + batch, ok := cache.Get(3) + assert.True(t, ok) + assert.Equal(t, validBatch, batch) + }) + + t.Run("Set - Invalid batch without signatures is not stored", func(t *testing.T) { + mockFetcher := new(MockBatchFetcher) + cache := NewBatchCache(mockFetcher) + + // Create invalid batch without signatures + invalidBatch := ð.RPCRollupBatch{ + Version: 1, + Signatures: []eth.RPCBatchSignature{}, // Empty signatures + } + + // Set should not store the batch + cache.Set(4, invalidBatch) + + // Setup mock for fetching since batch shouldn't be in cache + mockFetcher.On("GetRollupBatchByIndex", uint64(4)).Return(nil, assert.AnError).Once() + + // Get should try to fetch from node and fail + batch, ok := cache.Get(4) + assert.False(t, ok) + assert.Nil(t, batch) + + mockFetcher.AssertExpectations(t) + }) + + t.Run("Set - Nil batch is not stored", func(t *testing.T) { + mockFetcher := new(MockBatchFetcher) + cache := NewBatchCache(mockFetcher) + + // Set with nil batch should not store anything + cache.Set(5, nil) + + // Setup mock for fetching since nothing should be in cache + mockFetcher.On("GetRollupBatchByIndex", uint64(5)).Return(nil, assert.AnError).Once() + + // Get should try to fetch from node and fail + batch, ok := cache.Get(5) + assert.False(t, ok) + assert.Nil(t, batch) + + mockFetcher.AssertExpectations(t) + }) +} diff --git a/tx-submitter/types/tx.go b/tx-submitter/types/tx.go new file mode 100644 index 00000000..45ec9644 --- /dev/null +++ b/tx-submitter/types/tx.go @@ -0,0 +1,13 @@ +package types + +import ( + "github.com/morph-l2/go-ethereum/core/types" +) + +// TxRecord represents a transaction record with metadata +type TxRecord struct { + Tx *types.Transaction + SendTime uint64 + QueryTimes uint64 // missing tx query times + Confirmed bool // Track if transaction has been confirmed in a block +} diff --git a/tx-submitter/utils/config.go b/tx-submitter/utils/config.go index 5a6a9c81..31bd9c9e 100644 --- a/tx-submitter/utils/config.go +++ b/tx-submitter/utils/config.go @@ -82,8 +82,11 @@ type Config struct { // journal file path JournalFilePath string - // calldata fee bump - CalldataFeeBump uint64 + // tip bump + TipFeeBump uint64 + MaxTip uint64 + MinTip uint64 + MaxBaseFee uint64 //max txs in pendingpool MaxTxsInPendingPool uint64 @@ -104,6 +107,9 @@ type Config struct { L1StakingDeployedBlockNumber uint64 // event indexer index step EventIndexStep uint64 + // leveldb path name + LeveldbPathName string + BlockNotIncreasedThreshold int64 } // NewConfig parses the DriverConfig from the provided flags or environment variables. @@ -148,9 +154,11 @@ func NewConfig(ctx *cli.Context) (Config, error) { GasLimitBuffer: ctx.GlobalUint64(flags.GasLimitBuffer.Name), - JournalFilePath: ctx.GlobalString(flags.JournalFlag.Name), - // calldata fee bump - CalldataFeeBump: ctx.GlobalUint64(flags.CalldataFeeBumpFlag.Name), + JournalFilePath: ctx.GlobalString(flags.JournalFlag.Name), + TipFeeBump: ctx.GlobalUint64(flags.TipFeeBumpFlag.Name), + MaxTip: ctx.GlobalUint64(flags.MaxTipFlag.Name), + MinTip: ctx.GlobalUint64(flags.MinTipFlag.Name), + MaxBaseFee: ctx.GlobalUint64(flags.MaxBaseFeeFlag.Name), MaxTxsInPendingPool: ctx.GlobalUint64(flags.MaxTxsInPendingPoolFlag.Name), // external sign @@ -171,6 +179,10 @@ func NewConfig(ctx *cli.Context) (Config, error) { L1StakingDeployedBlockNumber: ctx.GlobalUint64(flags.L1StakingDeployedBlocknumFlag.Name), // index step EventIndexStep: ctx.GlobalUint64(flags.EventIndexStepFlag.Name), + // leveldb path name + LeveldbPathName: ctx.GlobalString(flags.LeveldbPathNameFlag.Name), + // BlockNotIncreasedThreshold + BlockNotIncreasedThreshold: ctx.GlobalInt64(flags.BlockNotIncreasedThreshold.Name), } return cfg, nil diff --git a/tx-submitter/utils/methods.go b/tx-submitter/utils/methods.go index 12d94c2d..65a96c15 100644 --- a/tx-submitter/utils/methods.go +++ b/tx-submitter/utils/methods.go @@ -1,7 +1,10 @@ package utils import ( + "fmt" "math/big" + "reflect" + "strconv" "github.com/morph-l2/go-ethereum" "github.com/morph-l2/go-ethereum/common" @@ -61,3 +64,86 @@ func IntersectionOfAddresses(a, b []common.Address) []common.Address { return intersection } + +func ParseStringToType[T any](s string) (T, error) { + var result T + var err error + + // 获取目标类型的名称 + switch any(result).(type) { + case int: + var v int64 + v, err = strconv.ParseInt(s, 10, 0) + result = reflect.ValueOf(int(v)).Interface().(T) + case int8: + var v int64 + v, err = strconv.ParseInt(s, 10, 8) + result = reflect.ValueOf(int8(v)).Interface().(T) + case int16: + var v int64 + v, err = strconv.ParseInt(s, 10, 16) + result = reflect.ValueOf(int16(v)).Interface().(T) + case int32: + var v int64 + v, err = strconv.ParseInt(s, 10, 32) + result = reflect.ValueOf(int32(v)).Interface().(T) + case int64: + var v int64 + v, err = strconv.ParseInt(s, 10, 64) + result = reflect.ValueOf(v).Interface().(T) + case uint: + var v uint64 + v, err = strconv.ParseUint(s, 10, 0) + result = reflect.ValueOf(uint(v)).Interface().(T) + case uint8: + var v uint64 + v, err = strconv.ParseUint(s, 10, 8) + result = reflect.ValueOf(uint8(v)).Interface().(T) + case uint16: + var v uint64 + v, err = strconv.ParseUint(s, 10, 16) + result = reflect.ValueOf(uint16(v)).Interface().(T) + case uint32: + var v uint64 + v, err = strconv.ParseUint(s, 10, 32) + result = reflect.ValueOf(uint32(v)).Interface().(T) + case uint64: + var v uint64 + v, err = strconv.ParseUint(s, 10, 64) + result = reflect.ValueOf(v).Interface().(T) + case float32: + var v float64 + v, err = strconv.ParseFloat(s, 32) + result = reflect.ValueOf(float32(v)).Interface().(T) + case float64: + var v float64 + v, err = strconv.ParseFloat(s, 64) + result = reflect.ValueOf(v).Interface().(T) + case bool: + var v bool + v, err = strconv.ParseBool(s) + result = reflect.ValueOf(v).Interface().(T) + case string: + result = reflect.ValueOf(s).Interface().(T) + default: + return *new(T), fmt.Errorf("unsupported type: %v", reflect.TypeOf(result)) + } + + if err != nil { + return *new(T), err + } + + return result, nil +} + +// WeiToGwei converts wei value to gwei string representation +func WeiToGwei(wei *big.Int) string { + if wei == nil { + return "0" + } + gwei := new(big.Float).Quo( + new(big.Float).SetInt(wei), + new(big.Float).SetInt64(1e9), + ) + return gwei.Text('f', 9) +} diff --git a/tx-submitter/utils/methods_test.go b/tx-submitter/utils/methods_test.go new file mode 100644 index 00000000..ed050dda --- /dev/null +++ b/tx-submitter/utils/methods_test.go @@ -0,0 +1,155 @@ +package utils + +import ( + "fmt" + "math/big" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestParseStringToType(t *testing.T) { + tests := []struct { + input string + expected any + hasError bool + }{ + // int cases + {"123", int(123), false}, + {"-123", int(-123), false}, + {"notanumber", int(0), true}, + + // int8 cases + {"123", int8(123), false}, + {"-128", int8(-128), false}, + {"notanumber", int8(0), true}, + + // int16 cases + {"123", int16(123), false}, + {"32767", int16(32767), false}, + {"notanumber", int16(0), true}, + + // uint cases + {"123", uint(123), false}, + {"notanumber", uint(0), true}, + + // float32 cases + {"123.45", float32(123.45), false}, + {"-123.45", float32(-123.45), false}, + {"notanumber", float32(0), true}, + + // float64 cases + {"123.45", float64(123.45), false}, + {"-123.45", float64(-123.45), false}, + {"notanumber", float64(0), true}, + + // bool cases + {"true", true, false}, + {"false", false, false}, + {"notabool", false, true}, + + // string cases + {"test", "test", false}, + } + + for _, tc := range tests { + t.Run(fmt.Sprintf("%v -> %v", tc.input, tc.expected), func(t *testing.T) { + var result any + var err error + + switch tc.expected.(type) { + case int: + result, err = ParseStringToType[int](tc.input) + case int8: + result, err = ParseStringToType[int8](tc.input) + case int16: + result, err = ParseStringToType[int16](tc.input) + case uint: + result, err = ParseStringToType[uint](tc.input) + case float32: + result, err = ParseStringToType[float32](tc.input) + case float64: + result, err = ParseStringToType[float64](tc.input) + case bool: + result, err = ParseStringToType[bool](tc.input) + case string: + result, err = ParseStringToType[string](tc.input) + } + + if tc.hasError { + require.Error(t, err) + } else { + require.NoError(t, err) + require.Equal(t, tc.expected, result) + } + }) + } +} + +func TestWeiToGwei(t *testing.T) { + tests := []struct { + name string + input *big.Int + expected string + }{ + { + name: "nil input", + input: nil, + expected: "0", + }, + { + name: "zero wei", + input: big.NewInt(0), + expected: "0.000000000", + }, + { + name: "1 wei", + input: big.NewInt(1), + expected: "0.000000001", + }, + { + name: "1000 wei", + input: big.NewInt(1000), + expected: "0.000001000", + }, + { + name: "1 million wei", + input: big.NewInt(1000000), + expected: "0.001000000", + }, + { + name: "1 gwei", + input: big.NewInt(1e9), + expected: "1.000000000", + }, + { + name: "1.5 gwei", + input: big.NewInt(1.5e9), + expected: "1.500000000", + }, + { + name: "precise small number", + input: big.NewInt(123456789), + expected: "0.123456789", + }, + { + name: "large number", + input: new(big.Int).Mul(big.NewInt(1e18), big.NewInt(1000)), + expected: "1000000000000.000000000", + }, + { + name: "max precision test", + input: big.NewInt(1234567891), + expected: "1.234567891", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := WeiToGwei(tt.input) + if result != tt.expected { + t.Errorf("WeiToGwei(%v) = %v, want %v", tt.input, result, tt.expected) + } + }) + } +} diff --git a/tx-submitter/utils/utils.go b/tx-submitter/utils/utils.go index bcfc0205..06de87e6 100644 --- a/tx-submitter/utils/utils.go +++ b/tx-submitter/utils/utils.go @@ -5,6 +5,7 @@ import ( "context" "encoding/binary" "fmt" + "math/big" "reflect" "regexp" "strconv" @@ -36,10 +37,32 @@ func Loop(ctx context.Context, period time.Duration, f func()) { } func ParseFBatchIndex(calldata []byte) uint64 { - abi, _ := bindings.RollupMetaData.GetAbi() - parms, _ := abi.Methods["finalizeBatch"].Inputs.Unpack(calldata[4:]) - batchHeader, _ := ntype.DecodeBatchHeader(parms[0].([]byte)) - return batchHeader.BatchIndex + if len(calldata) < 4 { + return 0 + } + + abi, err := bindings.RollupMetaData.GetAbi() + if err != nil { + return 0 + } + + method, exists := abi.Methods["finalizeBatch"] + if !exists { + return 0 + } + + parms, err := method.Inputs.Unpack(calldata[4:]) + if err != nil || len(parms) == 0 { + return 0 + } + + batchBytes, ok := parms[0].([]byte) + if !ok || len(batchBytes) < 9 { + return 0 + } + + // 1-9 is batch index + return binary.BigEndian.Uint64(batchBytes[1:9]) } func ParseParentBatchIndex(calldata []byte) uint64 { @@ -56,6 +79,46 @@ func ParseParentBatchIndex(calldata []byte) uint64 { return batchIndex } +// SetFBatchIndex sets the batch index in the calldata while preserving all other data +func SetFBatchIndex(calldata []byte, batchIndex uint64) error { + if len(calldata) < 4 { + return fmt.Errorf("calldata too short") + } + + abi, err := bindings.RollupMetaData.GetAbi() + if err != nil { + return fmt.Errorf("failed to get ABI: %w", err) + } + + method, exists := abi.Methods["finalizeBatch"] + if !exists { + return fmt.Errorf("finalizeBatch method not found in ABI") + } + + parms, err := method.Inputs.Unpack(calldata[4:]) + if err != nil || len(parms) == 0 { + return fmt.Errorf("failed to unpack parameters: %w", err) + } + + batchBytes, ok := parms[0].([]byte) + if !ok || len(batchBytes) < 9 { + return fmt.Errorf("invalid batch bytes") + } + + // Modify only the batch index (bytes 1-9) while keeping other data unchanged + binary.BigEndian.PutUint64(batchBytes[1:9], batchIndex) + + // Re-encode the parameters + encodedParams, err := method.Inputs.Pack(batchBytes) + if err != nil { + return fmt.Errorf("failed to pack parameters: %w", err) + } + + // Update only the parameter portion, keeping the method ID unchanged + copy(calldata[4:], encodedParams) + return nil +} + // ParseL1Mempool parses the L1 mempool and returns the transactions. func ParseL1Mempool(rpc *rpc.Client, addr common.Address) ([]*types.Transaction, error) { @@ -121,10 +184,10 @@ func ParseBusinessInfo(tx *types.Transaction, a *abi.ABI) []interface{} { if err != nil { log.Error("unpack finalizeBatch error", "err", err) } - batchHeader, _ := ntype.DecodeBatchHeader(parms[0].([]byte)) + batchIndex, _ := ntype.BatchHeaderBytes(parms[0].([]byte)).BatchIndex() res = append(res, "method", method, - "finalizedIndex", batchHeader.BatchIndex, + "finalizedIndex", batchIndex, ) } @@ -185,3 +248,12 @@ func ParseL1MessageCnt(blockContexts hexutil.Bytes) uint64 { return l1msgcnt } + +// FormatTime formats a timestamp into RFC3339 format string. +// Returns "N/A" for nil or non-positive timestamps. +func FormatTime(timestamp *big.Int) string { + if timestamp == nil || timestamp.Int64() <= 0 { + return "N/A" + } + return time.Unix(timestamp.Int64(), 0).Format(time.RFC3339) +} diff --git a/tx-submitter/utils/utils_test.go b/tx-submitter/utils/utils_test.go index 71cf6111..75f2382f 100644 --- a/tx-submitter/utils/utils_test.go +++ b/tx-submitter/utils/utils_test.go @@ -9,8 +9,35 @@ import ( // test ParseBatchIndex func TestParseBatchIndex(t *testing.T) { - calldata := "7c41b6ac00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000700000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000006a01569a961a135cd518f1d60b16690ed77cbb57ff41f140666ffb0b1938147c8531e7b0d46e12a1124700d67365d60df674e29aedc1aebfab8a2516418dcb3bf2227ae5ba08d7291c96c8cbddcc148bf48a6d68c7974b94356f53754ef6171d757000000000000000000000000000000000000000000000000000000000000007900000000000000001000000000000000000000000000000004990fbff45d7e8597d187ce8259265d90fe605c7d19e9988e1bf8f7d66cc7758f01a327088bb2b13151449d8313c281d0006d12e8453e863637b746898b6ad5a63ca0f329a4dd37e80ce4b871ad90e271ea9c989cb1c3fc0a8b7e2b597f9309d4000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004b114000000000000012e00000000665d92ba0000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000012f00000000665d92c10000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000013000000000665d92c70000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000013100000000665d92cd0000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000013200000000665d92d40000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000013300000000665d92da0000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000013400000000665d92e00000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000013500000000665d92e70000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000013600000000665d92ed0000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000013700000000665d92f40000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000013800000000665d92fa0000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000013900000000665d93000000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000013a00000000665d93040000000000000000000000000000000000000000000000000000000000000000000000000098968000010000000000000000013b00000000665d930b0000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000013c00000000665d93110000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000013d00000000665d93180000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000013e00000000665d931e0000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000013f00000000665d93240000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000014000000000665d932b0000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000014100000000665d93310000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000140000000000000000000000000000000000000000000000000000000000000040000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000004000000000000000000000000310824aa27a29d269d2f9c0a8563c0e3c98dd226000000000000000000000000343c5154ffe47c8a07df5ea6846404e68e9809a2000000000000000000000000783698dcdebdc96785c5c60ed96113612ba09c2b000000000000000000000000aac606d51de6a5abf0d1b9dbd5ed5ff2ac2e521b00000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000160000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000783698dcdebdc96785c5c60ed96113612ba09c2b000000000000000000000000310824aa27a29d269d2f9c0a8563c0e3c98dd226000000000000000000000000343c5154ffe47c8a07df5ea6846404e68e9809a2000000000000000000000000aac606d51de6a5abf0d1b9dbd5ed5ff2ac2e521b0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000783698dcdebdc96785c5c60ed96113612ba09c2b000000000000000000000000310824aa27a29d269d2f9c0a8563c0e3c98dd226000000000000000000000000343c5154ffe47c8a07df5ea6846404e68e9809a2000000000000000000000000aac606d51de6a5abf0d1b9dbd5ed5ff2ac2e521b0000000000000000000000000000000000000000000000000000000000000004000000000000000000000000783698dcdebdc96785c5c60ed96113612ba09c2b000000000000000000000000310824aa27a29d269d2f9c0a8563c0e3c98dd226000000000000000000000000343c5154ffe47c8a07df5ea6846404e68e9809a2000000000000000000000000aac606d51de6a5abf0d1b9dbd5ed5ff2ac2e521b0000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000523732e2d1bd32915c305d4c1c444a45d8d86bfac774ebe433fe9189e2e19e9191d060297472b470e78145e09b3572600000000000000000000000000000000039635922129044f931b0ae73aa7c0f1d4224f0ec6d72bd87ab0d436bbf26e0ca7e2bf29ee3ee94850a87be7c6c77deb" + calldata := "4a8d544f00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000008f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c000000000000000000000000000000000000000000000000000000000000001e02c48c62b7604ecf508766324cd85afdc5faeb86de53f12dee5c24c7e25957b02018f517672a7760905227d4f085cf88d82b4793497846bb366b6cedd69af06aae5857a041c5a53ed68439ff4c9b8a79b9b749eb93f1e07ed07f58d60ebcf737300000000000000000000000000000000000000000000000000000000000000f900000000000000377b00000000000000000000000000001d987eb22c17eea2e2e3f3756599686586cbc42883ceedded826bc8508c13539cf6e017301c53247c7de720dd18b7d668cbcc17cb711a7aae46fbc43224203e0bca62c74b38e4c32df8e0656c3bd6acedc0ec57684327c99d10a1247f00ab8d3dece2c48c62b7604ecf508766324cd85afdc5faeb86de53f12dee5c24c7e25957b02e5857a041c5a53ed68439ff4c9b8a79b9b749eb93f1e07ed07f58d60ebcf7373a4d7461c3b8d74650efdca322d5fe15e699d534ee47ec9321bcb82bc7a9ec6e97bf7c21d9929b9d5d906a163a1dd8e74341ef11f7b84681b67d76953ee6ee3fb000000000000000000000000000000000000000000000000000000000000000000000000008ca2025800000000006acc320000000067d1c5aa00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc330000000067d1c5ab00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800003000000000000006acc340000000067d1c5ac00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc350000000067d1c5ad00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc360000000067d1c5ae00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc370000000067d1c5af00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acc380000000067d1c5b000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800004000000000000006acc390000000067d1c5b100000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc3a0000000067d1c5b200000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acc3b0000000067d1c5b300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc3c0000000067d1c5b500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc3d0000000067d1c5b600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acc3e0000000067d1c5b700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc3f0000000067d1c5b900000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc400000000067d1c5ba00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acc410000000067d1c5bc00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc420000000067d1c5bd00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc430000000067d1c5be00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc440000000067d1c5bf00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc450000000067d1c5c000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc460000000067d1c5c100000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc470000000067d1c5c200000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acc480000000067d1c5c300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc490000000067d1c5c400000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc4a0000000067d1c5c500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc4b0000000067d1c5c600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800003000000000000006acc4c0000000067d1c5c700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc4d0000000067d1c5c800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc4e0000000067d1c5c900000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acc4f0000000067d1c5ca00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc500000000067d1c5cc00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acc510000000067d1c5cd00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc520000000067d1c5ce00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc530000000067d1c5cf00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc540000000067d1c5d000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800005000000000000006acc550000000067d1c5d100000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc560000000067d1c5d200000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc570000000067d1c5d300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acc580000000067d1c5d400000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acc590000000067d1c5d500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800003000000000000006acc5a0000000067d1c5d600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc5b0000000067d1c5d700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc5c0000000067d1c5d800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc5d0000000067d1c5d900000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acc5e0000000067d1c5da00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800003000000000000006acc5f0000000067d1c5db00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc600000000067d1c5dc00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc610000000067d1c5dd00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc620000000067d1c5de00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acc630000000067d1c5df00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc640000000067d1c5e000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc650000000067d1c5e200000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc660000000067d1c5e300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc670000000067d1c5e400000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc680000000067d1c5e500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acc690000000067d1c5e600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc6a0000000067d1c5e700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc6b0000000067d1c5e800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc6c0000000067d1c5e900000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800003000000000000006acc6d0000000067d1c5ea00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc6e0000000067d1c5eb00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acc6f0000000067d1c5ec00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800003000000000000006acc700000000067d1c5ed00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acc710000000067d1c5ee00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc720000000067d1c5ef00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc730000000067d1c5f000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc740000000067d1c5f300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc750000000067d1c5f400000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc760000000067d1c5f500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc770000000067d1c5f600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc780000000067d1c5f700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc790000000067d1c5f800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc7a0000000067d1c5f900000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc7b0000000067d1c5fa00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acc7c0000000067d1c5fb00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc7d0000000067d1c5fc00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc7e0000000067d1c5fd00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc7f0000000067d1c5ff00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acc800000000067d1c60000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc810000000067d1c60200000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc820000000067d1c60300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc830000000067d1c60400000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc840000000067d1c60600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acc850000000067d1c60700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc860000000067d1c60800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc870000000067d1c60a00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acc880000000067d1c60c00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc890000000067d1c60e00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc8a0000000067d1c60f00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800003000000000000006acc8b0000000067d1c61000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800003000000000000006acc8c0000000067d1c61200000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc8d0000000067d1c61300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc8e0000000067d1c61400000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acc8f0000000067d1c61500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800003000000000000006acc900000000067d1c61600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc910000000067d1c61700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc920000000067d1c61800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc930000000067d1c61900000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc940000000067d1c61a00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc950000000067d1c61b00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc960000000067d1c61d00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc970000000067d1c61e00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc980000000067d1c61f00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc990000000067d1c62000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc9a0000000067d1c62100000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc9b0000000067d1c62200000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acc9c0000000067d1c62300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc9d0000000067d1c62500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acc9e0000000067d1c62600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800003000000000000006acc9f0000000067d1c62700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acca00000000067d1c62800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acca10000000067d1c62a00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acca20000000067d1c62b00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acca30000000067d1c62c00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acca40000000067d1c62d00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acca50000000067d1c62e00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acca60000000067d1c63000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acca70000000067d1c63300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acca80000000067d1c63400000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acca90000000067d1c63600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accaa0000000067d1c63900000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accab0000000067d1c63a00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accac0000000067d1c63d00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accad0000000067d1c63e00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accae0000000067d1c63f00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accaf0000000067d1c64100000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accb00000000067d1c64300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accb10000000067d1c64500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006accb20000000067d1c64700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accb30000000067d1c64900000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accb40000000067d1c64b00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accb50000000067d1c64c00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accb60000000067d1c64e00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accb70000000067d1c64f00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accb80000000067d1c65000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accb90000000067d1c65200000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accba0000000067d1c65300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accbb0000000067d1c65400000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accbc0000000067d1c65500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accbd0000000067d1c65600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accbe0000000067d1c65700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accbf0000000067d1c65900000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accc00000000067d1c65a00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006accc10000000067d1c65b00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accc20000000067d1c65c00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accc30000000067d1c65d00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accc40000000067d1c65e00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accc50000000067d1c65f00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accc60000000067d1c66000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800003000000000000006accc70000000067d1c66100000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accc80000000067d1c66200000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accc90000000067d1c66300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accca0000000067d1c66400000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acccb0000000067d1c66500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acccc0000000067d1c66600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acccd0000000067d1c66700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800003000000000000006accce0000000067d1c66800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acccf0000000067d1c66900000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accd00000000067d1c66a00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accd10000000067d1c66b00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006accd20000000067d1c66c00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006accd30000000067d1c66d00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accd40000000067d1c66e00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accd50000000067d1c66f00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accd60000000067d1c67000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006accd70000000067d1c67200000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accd80000000067d1c67300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accd90000000067d1c67400000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accda0000000067d1c67500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accdb0000000067d1c67600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accdc0000000067d1c67700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accdd0000000067d1c67800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accde0000000067d1c67900000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accdf0000000067d1c67a00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acce00000000067d1c67b00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acce10000000067d1c67c00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acce20000000067d1c67d00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acce30000000067d1c67e00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acce40000000067d1c67f00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acce50000000067d1c68000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acce60000000067d1c68100000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acce70000000067d1c68200000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acce80000000067d1c68300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acce90000000067d1c68400000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accea0000000067d1c68500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acceb0000000067d1c68600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006accec0000000067d1c68700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acced0000000067d1c68800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006accee0000000067d1c68900000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accef0000000067d1c68b00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accf00000000067d1c68d00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accf10000000067d1c68e00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accf20000000067d1c68f00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accf30000000067d1c69000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800003000000000000006accf40000000067d1c69100000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accf50000000067d1c69200000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006accf60000000067d1c69300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006accf70000000067d1c69400000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accf80000000067d1c69500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accf90000000067d1c69600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006accfa0000000067d1c69700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accfb0000000067d1c69800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accfc0000000067d1c69900000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accfd0000000067d1c69a00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006accfe0000000067d1c69b00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006accff0000000067d1c69c00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd000000000067d1c69d00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd010000000067d1c69e00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acd020000000067d1c69f00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd030000000067d1c6a000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd040000000067d1c6a100000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acd050000000067d1c6a300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acd060000000067d1c6a400000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd070000000067d1c6a500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd080000000067d1c6a600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd090000000067d1c6a700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd0a0000000067d1c6a800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acd0b0000000067d1c6a900000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd0c0000000067d1c6aa00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acd0d0000000067d1c6ab00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd0e0000000067d1c6ac00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd0f0000000067d1c6af00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd100000000067d1c6b100000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd110000000067d1c6b200000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd120000000067d1c6b300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd130000000067d1c6b500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acd140000000067d1c6b800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd150000000067d1c6bb00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd160000000067d1c6bd00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acd170000000067d1c6bf00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd180000000067d1c6c100000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acd190000000067d1c6c300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd1a0000000067d1c6c400000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd1b0000000067d1c6c500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd1c0000000067d1c6c600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd1d0000000067d1c6c700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd1e0000000067d1c6c800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd1f0000000067d1c6ca00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd200000000067d1c6cb00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd210000000067d1c6cd00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd220000000067d1c6ce00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd230000000067d1c6cf00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd240000000067d1c6d100000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd250000000067d1c6d300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd260000000067d1c6d400000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd270000000067d1c6d500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd280000000067d1c6d600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd290000000067d1c6d800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd2a0000000067d1c6da00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd2b0000000067d1c6dc00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acd2c0000000067d1c6de00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd2d0000000067d1c6df00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd2e0000000067d1c6e000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd2f0000000067d1c6e200000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd300000000067d1c6e300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd310000000067d1c6e400000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd320000000067d1c6e500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd330000000067d1c6e600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd340000000067d1c6e800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd350000000067d1c6e900000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd360000000067d1c6eb00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd370000000067d1c6ed00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd380000000067d1c6ef00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acd390000000067d1c6f100000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd3a0000000067d1c6f200000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd3b0000000067d1c6f300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd3c0000000067d1c6f500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd3d0000000067d1c6f600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd3e0000000067d1c6f700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd3f0000000067d1c6f800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd400000000067d1c6fa00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd410000000067d1c6fb00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd420000000067d1c6fc00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd430000000067d1c6fd00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd440000000067d1c6fe00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd450000000067d1c6ff00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd460000000067d1c70000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd470000000067d1c70100000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd480000000067d1c70200000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd490000000067d1c70300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd4a0000000067d1c70400000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd4b0000000067d1c70500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd4c0000000067d1c70600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd4d0000000067d1c70700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd4e0000000067d1c70800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd4f0000000067d1c70900000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800003000000000000006acd500000000067d1c70b00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd510000000067d1c70c00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd520000000067d1c70d00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd530000000067d1c70e00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd540000000067d1c70f00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd550000000067d1c71000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd560000000067d1c71100000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acd570000000067d1c71300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd580000000067d1c71500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd590000000067d1c71600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800003000000000000006acd5a0000000067d1c71700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd5b0000000067d1c71800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acd5c0000000067d1c71900000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd5d0000000067d1c71a00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800004000000000000006acd5e0000000067d1c71b00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd5f0000000067d1c71c00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd600000000067d1c71d00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800003000000000000006acd610000000067d1c71e00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd620000000067d1c71f00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acd630000000067d1c72000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd640000000067d1c72100000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd650000000067d1c72200000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800003000000000000006acd660000000067d1c72300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acd670000000067d1c72400000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd680000000067d1c72500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd690000000067d1c72600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acd6a0000000067d1c72700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd6b0000000067d1c72800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd6c0000000067d1c72900000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd6d0000000067d1c72a00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acd6e0000000067d1c72b00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800004000000000000006acd6f0000000067d1c72c00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acd700000000067d1c72e00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd710000000067d1c72f00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd720000000067d1c73000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acd730000000067d1c73100000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acd740000000067d1c73200000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd750000000067d1c73300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acd760000000067d1c73400000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd770000000067d1c73500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd780000000067d1c73600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acd790000000067d1c73700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800003000000000000006acd7a0000000067d1c73800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acd7b0000000067d1c73900000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd7c0000000067d1c73a00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd7d0000000067d1c73b00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800003000000000000006acd7e0000000067d1c73c00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd7f0000000067d1c73e00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800003000000000000006acd800000000067d1c73f00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd810000000067d1c74000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd820000000067d1c74100000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd830000000067d1c74200000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800003000000000000006acd840000000067d1c74300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd850000000067d1c74400000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acd860000000067d1c74500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd870000000067d1c74600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acd880000000067d1c74700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acd890000000067d1c74800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd8a0000000067d1c74900000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800003000000000000006acd8b0000000067d1c74a00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd8c0000000067d1c74b00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd8d0000000067d1c74c00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd8e0000000067d1c74d00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd8f0000000067d1c74f00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd900000000067d1c75000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd910000000067d1c75100000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd920000000067d1c75200000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd930000000067d1c75300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd940000000067d1c75500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd950000000067d1c75600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd960000000067d1c75700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd970000000067d1c75800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd980000000067d1c75900000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd990000000067d1c75a00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd9a0000000067d1c75b00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd9b0000000067d1c75c00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd9c0000000067d1c75d00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd9d0000000067d1c75e00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd9e0000000067d1c75f00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acd9f0000000067d1c76000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acda00000000067d1c76200000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acda10000000067d1c76300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acda20000000067d1c76500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acda30000000067d1c76600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acda40000000067d1c76700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acda50000000067d1c76800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acda60000000067d1c76a00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acda70000000067d1c76b00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acda80000000067d1c76c00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acda90000000067d1c76d00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdaa0000000067d1c76e00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdab0000000067d1c76f00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acdac0000000067d1c77000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdad0000000067d1c77100000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdae0000000067d1c77200000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdaf0000000067d1c77300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdb00000000067d1c77400000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdb10000000067d1c77500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdb20000000067d1c77600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdb30000000067d1c77700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdb40000000067d1c77800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acdb50000000067d1c77900000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acdb60000000067d1c77a00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acdb70000000067d1c77b00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdb80000000067d1c77c00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdb90000000067d1c77e00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdba0000000067d1c78000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdbb0000000067d1c78200000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdbc0000000067d1c78300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdbd0000000067d1c78400000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdbe0000000067d1c78600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdbf0000000067d1c78700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdc00000000067d1c78800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdc10000000067d1c78b00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdc20000000067d1c78c00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdc30000000067d1c78d00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdc40000000067d1c78f00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdc50000000067d1c79100000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdc60000000067d1c79300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdc70000000067d1c79400000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdc80000000067d1c79500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdc90000000067d1c79700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdca0000000067d1c79800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acdcb0000000067d1c79900000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acdcc0000000067d1c79b00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdcd0000000067d1c79c00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdce0000000067d1c79e00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdcf0000000067d1c79f00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdd00000000067d1c7a000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdd10000000067d1c7a200000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdd20000000067d1c7a400000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdd30000000067d1c7a600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdd40000000067d1c7a700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdd50000000067d1c7a800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdd60000000067d1c7a900000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdd70000000067d1c7aa00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdd80000000067d1c7ab00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdd90000000067d1c7ac00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdda0000000067d1c7ad00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acddb0000000067d1c7ae00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acddc0000000067d1c7af00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acddd0000000067d1c7b000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdde0000000067d1c7b100000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acddf0000000067d1c7b200000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acde00000000067d1c7b300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acde10000000067d1c7b500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acde20000000067d1c7b700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acde30000000067d1c7b800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acde40000000067d1c7b900000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acde50000000067d1c7bb00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acde60000000067d1c7bc00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acde70000000067d1c7bd00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acde80000000067d1c7bf00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acde90000000067d1c7c000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdea0000000067d1c7c200000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdeb0000000067d1c7c300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdec0000000067d1c7c400000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acded0000000067d1c7c500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800003000000000000006acdee0000000067d1c7c600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdef0000000067d1c7c800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdf00000000067d1c7c900000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acdf10000000067d1c7ca00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdf20000000067d1c7cb00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdf30000000067d1c7cc00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdf40000000067d1c7cd00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdf50000000067d1c7ce00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdf60000000067d1c7d000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdf70000000067d1c7d100000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdf80000000067d1c7d200000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdf90000000067d1c7d300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdfa0000000067d1c7d400000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006acdfb0000000067d1c7d500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdfc0000000067d1c7d600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdfd0000000067d1c7d700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdfe0000000067d1c7d800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006acdff0000000067d1c7d900000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace000000000067d1c7da00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006ace010000000067d1c7db00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006ace020000000067d1c7dd00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace030000000067d1c7df00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace040000000067d1c7e000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace050000000067d1c7e100000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800005000000000000006ace060000000067d1c7e200000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace070000000067d1c7e300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006ace080000000067d1c7e400000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace090000000067d1c7e500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006ace0a0000000067d1c7e600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace0b0000000067d1c7e700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace0c0000000067d1c7e800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace0d0000000067d1c7e900000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800003000000000000006ace0e0000000067d1c7ea00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace0f0000000067d1c7eb00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800003000000000000006ace100000000067d1c7ec00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800003000000000000006ace110000000067d1c7ed00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006ace120000000067d1c7ee00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006ace130000000067d1c7ef00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace140000000067d1c7f000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace150000000067d1c7f100000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace160000000067d1c7f200000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace170000000067d1c7f300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006ace180000000067d1c7f400000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800003000000000000006ace190000000067d1c7f500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace1a0000000067d1c7f700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace1b0000000067d1c7f800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace1c0000000067d1c7f900000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace1d0000000067d1c7fa00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace1e0000000067d1c7fb00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800003000000000000006ace1f0000000067d1c7fc00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace200000000067d1c7fd00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006ace210000000067d1c7fe00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace220000000067d1c7ff00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace230000000067d1c80000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace240000000067d1c80100000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006ace250000000067d1c80200000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace260000000067d1c80300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace270000000067d1c80400000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006ace280000000067d1c80500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace290000000067d1c80600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace2a0000000067d1c80800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace2b0000000067d1c80900000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace2c0000000067d1c80a00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace2d0000000067d1c80c00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace2e0000000067d1c80d00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace2f0000000067d1c80e00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace300000000067d1c81000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace310000000067d1c81100000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006ace320000000067d1c81200000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace330000000067d1c81300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace340000000067d1c81400000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace350000000067d1c81500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace360000000067d1c81600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace370000000067d1c81700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace380000000067d1c81800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace390000000067d1c81900000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800004000000000000006ace3a0000000067d1c81b00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace3b0000000067d1c81c00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace3c0000000067d1c81d00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace3d0000000067d1c81f00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace3e0000000067d1c82100000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800003000000000000006ace3f0000000067d1c82300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace400000000067d1c82400000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace410000000067d1c82500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace420000000067d1c82600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace430000000067d1c82700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace440000000067d1c82800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace450000000067d1c82900000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace460000000067d1c82a00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006ace470000000067d1c82b00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace480000000067d1c82c00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace490000000067d1c82d00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006ace4a0000000067d1c82e00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800003000000000000006ace4b0000000067d1c83000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace4c0000000067d1c83100000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace4d0000000067d1c83200000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace4e0000000067d1c83400000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006ace4f0000000067d1c83500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace500000000067d1c83600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace510000000067d1c83700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace520000000067d1c83800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace530000000067d1c83900000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace540000000067d1c83a00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace550000000067d1c83b00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace560000000067d1c83c00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace570000000067d1c83d00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006ace580000000067d1c83e00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800003000000000000006ace590000000067d1c83f00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006ace5a0000000067d1c84100000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace5b0000000067d1c84200000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace5c0000000067d1c84300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006ace5d0000000067d1c84400000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006ace5e0000000067d1c84500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace5f0000000067d1c84700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace600000000067d1c84900000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace610000000067d1c84a00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace620000000067d1c84b00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace630000000067d1c84c00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace640000000067d1c84d00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace650000000067d1c84e00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace660000000067d1c84f00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace670000000067d1c85000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace680000000067d1c85100000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace690000000067d1c85200000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace6a0000000067d1c85300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800003000000000000006ace6b0000000067d1c85400000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006ace6c0000000067d1c85600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace6d0000000067d1c85800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006ace6e0000000067d1c85900000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace6f0000000067d1c85a00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace700000000067d1c85b00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace710000000067d1c85c00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace720000000067d1c85d00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace730000000067d1c85e00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace740000000067d1c85f00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006ace750000000067d1c86000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace760000000067d1c86100000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006ace770000000067d1c86300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace780000000067d1c86400000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace790000000067d1c86500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006ace7a0000000067d1c86700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace7b0000000067d1c86800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace7c0000000067d1c86900000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace7d0000000067d1c86a00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006ace7e0000000067d1c86c00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006ace7f0000000067d1c86d00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006ace800000000067d1c86e00000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace810000000067d1c87000000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace820000000067d1c87100000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace830000000067d1c87200000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800003000000000000006ace840000000067d1c87300000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace850000000067d1c87400000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace860000000067d1c87500000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace870000000067d1c87600000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800002000000000000006ace880000000067d1c87700000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000006ace890000000067d1c87800000000000000000000000000000000000000000000000000000000000f42400000000001c9c3800001000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fe0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000044000000000000000000000000000000000000000000000000000000000000003c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001c0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000002c000000000000000000000000000000000000000000000000000000000000000070000000000000000000000006ab0e960911b50f6d14f249782ac12ec3e7584a0000000000000000000000000bba36cdf020788f0d08d5688c0bee3fb30ce1c8000000000000000000000000034e387b37d3adeaa6d5b92ce30de3af3dca39796000000000000000000000000a59b26db10c5ca26a97aa2fd2e74cb8da9d1eb65000000000000000000000000f834ffbeb6bb3f4841afc6b5fb40b94cd580fa2300000000000000000000000061f2945d4bc9e40b66a6376d1094a50438f613e2000000000000000000000000b6cf39ee72e0127e6ea6059e38b8c197227a6ac700000000000000000000000000000000000000000000000000000000000000070000000000000000000000006ab0e960911b50f6d14f249782ac12ec3e7584a0000000000000000000000000bba36cdf020788f0d08d5688c0bee3fb30ce1c8000000000000000000000000034e387b37d3adeaa6d5b92ce30de3af3dca39796000000000000000000000000a59b26db10c5ca26a97aa2fd2e74cb8da9d1eb65000000000000000000000000f834ffbeb6bb3f4841afc6b5fb40b94cd580fa2300000000000000000000000061f2945d4bc9e40b66a6376d1094a50438f613e2000000000000000000000000b6cf39ee72e0127e6ea6059e38b8c197227a6ac700000000000000000000000000000000000000000000000000000000000000070000000000000000000000006ab0e960911b50f6d14f249782ac12ec3e7584a0000000000000000000000000bba36cdf020788f0d08d5688c0bee3fb30ce1c8000000000000000000000000034e387b37d3adeaa6d5b92ce30de3af3dca39796000000000000000000000000a59b26db10c5ca26a97aa2fd2e74cb8da9d1eb65000000000000000000000000f834ffbeb6bb3f4841afc6b5fb40b94cd580fa2300000000000000000000000061f2945d4bc9e40b66a6376d1094a50438f613e2000000000000000000000000b6cf39ee72e0127e6ea6059e38b8c197227a6ac700000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000015f903b2fe6b812c9c5b4882525df682e2a26238bdd18badf5a4d3bf2dc2ec8acd600d92182181e25359a631da62585b00000000000000000000000000000000022a08b55fac8d2669fb3a47977ac43b2b9918d953532cab1625c9e94f49c333b7160442a38e8399a285646df4081c60" bs, err := hex.DecodeString(calldata) require.NoError(t, err) - require.EqualValues(t, ParseParentBatchIndex(bs), 16) + require.EqualValues(t, ParseParentBatchIndex(bs), 14203) +} + +func TestParseFBatchIndex(t *testing.T) { + // Test case 1: Original test case + calldata := "13361101000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000f90000000000000036a700000000000000000000000000001d630ed957794a607e274cdd09fd72217c7c2d9c0be5c11f993d66bf58f1ba098d950170e28b2b52dabe6efe96dbcfe85f691872adb80af292efbb7ded8e53ada1a000d75f5b0490922155046b8428750e9eede0df103c264d67434112e0b4320b8702e53bafa072ec3bbdafbbed9601a82f193d6d64db604ed931a0617779ccebb63d83b92dd5879bfb5e44ba433bafbb65afc822c7d000210ec0d296c59446d2cfa4d7461c3b8d74650efdca322d5fe15e699d534ee47ec9321bcb82bc7a9ec6e9260ff211c1f2db0cf21655a25035100797bc47c339502a0f1a791c0739d4e96000000000000000" + bs, err := hex.DecodeString(calldata) + require.NoError(t, err) + require.EqualValues(t, ParseFBatchIndex(bs), 13991) + + // Test case 2: Modify batch index + err = SetFBatchIndex(bs, 13992) + require.NoError(t, err) + require.EqualValues(t, ParseFBatchIndex(bs), 13992) + + // Test case 3: Test with invalid calldata + invalidCalldata := []byte{0x12, 0x34} // Too short + require.EqualValues(t, ParseFBatchIndex(invalidCalldata), 0) + + // Test case 4: Test with large batch index + err = SetFBatchIndex(bs, 999999) + require.NoError(t, err) + require.EqualValues(t, ParseFBatchIndex(bs), 999999) + + // Test case 5: Test with zero batch index + err = SetFBatchIndex(bs, 0) + require.NoError(t, err) + require.EqualValues(t, ParseFBatchIndex(bs), 0) }