diff --git a/.github/workflows/contracts.yml b/.github/workflows/contracts.yml index d9b81a7b4..f28ecc84e 100644 --- a/.github/workflows/contracts.yml +++ b/.github/workflows/contracts.yml @@ -47,7 +47,7 @@ jobs: - name: Install Go uses: actions/setup-go@v5 with: - go-version: 1.22.x + go-version: 1.24.x - name: Install Foundry uses: foundry-rs/foundry-toolchain@v1 with: diff --git a/.github/workflows/deployer.yml b/.github/workflows/deployer.yml index 5faa9da2b..5ecfe5ff3 100644 --- a/.github/workflows/deployer.yml +++ b/.github/workflows/deployer.yml @@ -28,7 +28,7 @@ jobs: - name: Install Go uses: actions/setup-go@v5 with: - go-version: 1.22.x + go-version: 1.24.x - name: Lint run: | rm -rf $HOME/.cache/golangci-lint @@ -40,6 +40,6 @@ jobs: - name: Install Go uses: actions/setup-go@v5 with: - go-version: 1.22.x + go-version: 1.24.x - name: Run tests run: make test diff --git a/.github/workflows/node.yml b/.github/workflows/node.yml index d5a8e0bfc..96c8ee082 100644 --- a/.github/workflows/node.yml +++ b/.github/workflows/node.yml @@ -28,7 +28,7 @@ jobs: - name: Install Go uses: actions/setup-go@v5 with: - go-version: 1.22.x + go-version: 1.24.x - name: Lint run: | rm -rf $HOME/.cache/golangci-lint @@ -40,7 +40,7 @@ jobs: - name: Install Go uses: actions/setup-go@v5 with: - go-version: 1.22.x + go-version: 1.24.x - name: Run build run: make build - name: Run tests diff --git a/.github/workflows/oracle.yml b/.github/workflows/oracle.yml index f7713932e..e273f6784 100644 --- a/.github/workflows/oracle.yml +++ b/.github/workflows/oracle.yml @@ -1,47 +1,47 @@ -name: Oracle +# name: Oracle -on: - push: - branches: - - main - paths: - - "oracle/**" - - ".github/workflows/oracle.yaml" - pull_request: - paths: - - "build/**" - - "bindings/**" - - "node/**" - - "oracle/**" - - ".github/workflows/oracle.yaml" +# on: +# push: +# branches: +# - main +# paths: +# - "oracle/**" +# - ".github/workflows/oracle.yaml" +# pull_request: +# paths: +# - "build/**" +# - "bindings/**" +# - "node/**" +# - "oracle/**" +# - ".github/workflows/oracle.yaml" -defaults: - run: - working-directory: "oracle" +# defaults: +# run: +# working-directory: "oracle" -jobs: - check: - if: github.event.pull_request.draft == false - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Install Go - uses: actions/setup-go@v5 - with: - go-version: 1.22.x - - name: Lint - run: | - rm -rf $HOME/.cache/golangci-lint - make lint - test: - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v3 - - name: Install Go - uses: actions/setup-go@v5 - with: - go-version: 1.22.x - - name: Run build - run: make build - - name: Run tests - run: make test +# jobs: +# check: +# if: github.event.pull_request.draft == false +# runs-on: ubuntu-latest +# steps: +# - uses: actions/checkout@v3 +# - name: Install Go +# uses: actions/setup-go@v5 +# with: +# go-version: 1.24.x +# - name: Lint +# run: | +# rm -rf $HOME/.cache/golangci-lint +# make lint +# test: +# runs-on: ubuntu-latest +# steps: +# - uses: actions/checkout@v3 +# - name: Install Go +# uses: actions/setup-go@v5 +# with: +# go-version: 1.24.x +# - name: Run build +# run: make build +# - name: Run tests +# run: make test diff --git a/.github/workflows/prover.yml b/.github/workflows/prover.yml index 1d066b0d8..be0b26846 100644 --- a/.github/workflows/prover.yml +++ b/.github/workflows/prover.yml @@ -24,10 +24,9 @@ jobs: steps: - uses: actions/checkout@v4 - uses: dtolnay/rust-toolchain@stable - with: - components: rustfmt + - run: rustup component add rustfmt --toolchain nightly-2024-07-07 - run: cargo fmt --all --check - + build: name: build runs-on: ubuntu-latest diff --git a/.github/workflows/tx-submitter.yml b/.github/workflows/tx-submitter.yml index a9e729b83..4d122c6dd 100644 --- a/.github/workflows/tx-submitter.yml +++ b/.github/workflows/tx-submitter.yml @@ -29,7 +29,7 @@ jobs: - name: Install Go uses: actions/setup-go@v5 with: - go-version: 1.22.x + go-version: 1.24.x - name: Lint run: | rm -rf $HOME/.cache/golangci-lint @@ -41,7 +41,7 @@ jobs: - name: Install Go uses: actions/setup-go@v5 with: - go-version: 1.22.x + go-version: 1.24.x - name: Run build run: make build - name: Run tests diff --git a/.gitignore b/.gitignore index d267e053d..5e39098e6 100644 --- a/.gitignore +++ b/.gitignore @@ -20,12 +20,18 @@ ops/l2-genesis/.devnet ops/l2-genesis/.qanet ops/l2-genesis/.testnet ops/l2-genesis/.holesky +ops/l2-genesis/.hoodi ops/l2-genesis/.mainnet ops/l2-genesis/.morphtestnet ops/devnet-morph/devnet/__pycache__ contracts/qanetL1.json contracts/holesky.json +contracts/hoodi.json +contracts/mainnet.json .env # logs -*.log \ No newline at end of file +*.log + +# mpt-switch-test (local testing only) +ops/mpt-switch-test \ No newline at end of file diff --git a/.gitmodules b/.gitmodules index 3b72cbd03..8e75b5bce 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,3 @@ [submodule "go-ethereum"] path = go-ethereum url = https://github.com/morph-l2/go-ethereum.git -branch = main diff --git a/Dockerfile.l2-node b/Dockerfile.l2-node new file mode 100644 index 000000000..a0fae6673 --- /dev/null +++ b/Dockerfile.l2-node @@ -0,0 +1,24 @@ +# Build Stage +FROM ghcr.io/morph-l2/go-ubuntu-builder:go-1.24-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.24-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"] \ No newline at end of file diff --git a/Makefile b/Makefile index 955efc36a..afde54dbc 100644 --- a/Makefile +++ b/Makefile @@ -1,7 +1,8 @@ ################## update dependencies #################### +ETHEREUM_SUBMODULE_COMMIT_OR_TAG := morph-v2.1.2 +ETHEREUM_TARGET_VERSION := morph-v2.1.2 +TENDERMINT_TARGET_VERSION := v0.3.3 -ETHEREUM_TARGET_VERSION := v1.10.14-0.20241224100051-1582a364edc0 -TENDERMINT_TARGET_VERSION := v0.3.1 ETHEREUM_MODULE_NAME := github.com/morph-l2/go-ethereum TENDERMINT_MODULE_NAME := github.com/morph-l2/tendermint @@ -30,6 +31,7 @@ update_all_mod: @$(MAKE) update_mod MODULE=ops/tools @$(MAKE) update_mod MODULE=oracle @$(MAKE) update_mod MODULE=tx-submitter + @$(MAKE) update_mod MODULE=token-price-oracle update: @@ -39,7 +41,13 @@ update: submodules: git submodule update --init - git submodule update --remote + @if [ -d "go-ethereum" ]; then \ + echo "Updating go-ethereum submodule to tag $(ETHEREUM_SUBMODULE_COMMIT_OR_TAG)..."; \ + cd go-ethereum && \ + git fetch --tags && \ + git checkout $(ETHEREUM_SUBMODULE_COMMIT_OR_TAG) && \ + cd ..; \ + fi .PHONY: submodules ################## bindings #################### @@ -58,12 +66,13 @@ lint-sol: .PHONY: lint-sol lint-go: + go work sync make -C bindings lint make -C contracts lint-go make -C node lint make -C ops/l2-genesis lint make -C ops/tools lint - make -C oracle lint +## make -C oracle lint make -C tx-submitter lint .PHONY: lint-go @@ -120,7 +129,7 @@ go-rust-alpine-builder: go-ubuntu-builder: @if [ -z "$(shell docker images -q morph/go-ubuntu-builder 2> /dev/null)" ]; then \ echo "Docker image morph/go-ubuntu-builder does not exist. Building..."; \ - cd ops/docker/intermediate && docker build -t morph/go-ubuntu-builder:go-1.22-ubuntu . -f go-ubuntu-builder.Dockerfile; \ + cd ops/docker/intermediate && docker build -t morph/go-ubuntu-builder:go-1.24-ubuntu . -f go-ubuntu-builder.Dockerfile; \ else \ echo "Docker image morph/go-ubuntu-builder already exists."; \ fi @@ -140,7 +149,7 @@ devnet-down: cd ops/docker && docker compose -f docker-compose-4nodes.yml down .PHONY: devnet-down -devnet-clean-build: devnet-down +devnet-clean-build: devnet-down devnet-l1-clean docker volume ls --filter name=docker-* --format='{{.Name}}' | xargs -r docker volume rm rm -rf ops/l2-genesis/.devnet rm -rf ops/docker/.devnet @@ -156,6 +165,10 @@ devnet-clean: devnet-clean-build devnet-l1: python3 ops/devnet-morph/main.py --polyrepo-dir=. --only-l1 +devnet-l1-clean: + @cd ops/docker && ./layer1/scripts/clean.sh +.PHONY: devnet-l1-clean + devnet-logs: @(cd ops/docker && docker-compose logs -f) .PHONY: devnet-logs diff --git a/MakefileEc2.mk b/MakefileEc2.mk index f52581388..92832247d 100644 --- a/MakefileEc2.mk +++ b/MakefileEc2.mk @@ -22,34 +22,34 @@ build-bk-prod-morph-prod-mainnet-to-morph-tx-submitter: 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: +# build for qanet +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-0582-morph-technical-department-testnet-data/testnet/holesky/morph-setup/morph-node.tar.gz + aws s3 cp morph-node.tar.gz s3://morph-7637-morph-technical-department-qanet-data/morph-setup/morph-node.tar.gz -build-bk-prod-morph-prod-testnet-to-morph-tx-submitter-holesky: +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-0582-morph-technical-department-testnet-data/testnet/holesky/morph-setup/tx-submitter.tar.gz - - -build-bk-test-morph-test-qanet-to-morph-node-qanet: + aws s3 cp tx-submitter.tar.gz s3://morph-7637-morph-technical-department-qanet-data/morph-setup/tx-submitter.tar.gz + + # build for hoodi +build-bk-prod-morph-prod-testnet-to-morph-node-hoodi: 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 + aws s3 cp morph-node.tar.gz s3://morph-0582-morph-technical-department-testnet-data/testnet/hoodi/morph-setup/morph-node.tar.gz -build-bk-test-morph-test-qanet-to-morph-tx-submitter-qanet: +build-bk-prod-morph-prod-testnet-to-morph-tx-submitter-hoodi: 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 + aws s3 cp tx-submitter.tar.gz s3://morph-0582-morph-technical-department-testnet-data/testnet/hoodi/morph-setup/tx-submitter.tar.gz diff --git a/MakefileEks.mk b/MakefileEks.mk index 0b935d10a..b2c3c7a31 100644 --- a/MakefileEks.mk +++ b/MakefileEks.mk @@ -93,6 +93,41 @@ build-bk-test-morph-test-qanet-to-morph-staking-oracle-qanet: start-bk-test-morph-test-qanet-to-morph-staking-oracle-qanet: /data/secret-manager-wrapper ./staking-oracle +# qanet +build-bk-test-morph-test-qanet-to-morph-token-price-oracle: + if [ ! -d dist ]; then mkdir -p dist; fi + env GO111MODULE=on CGO_LDFLAGS="-ldl" CGO_ENABLED=1 go build -v $(LDFLAGS) -o token-price-oracle/token-price-oracle ./token-price-oracle/cmd + cp token-price-oracle/token-price-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-token-price-oracle: + /data/secret-manager-wrapper ./token-price-oracle + +# hoodi token price oracle +build-bk-prod-morph-prod-testnet-to-morph-token-price-oracle-hoodi: + if [ ! -d dist ]; then mkdir -p dist; fi + env GO111MODULE=on CGO_LDFLAGS="-ldl" CGO_ENABLED=1 go build -v $(LDFLAGS) -o token-price-oracle/token-price-oracle ./token-price-oracle/cmd + cp token-price-oracle/token-price-oracle dist/ + aws s3 cp s3://morph-0582-morph-technical-department-testnet-data/testnet/hoodi/morph-setup/secret-manager-wrapper.tar.gz ./ + tar -xvzf secret-manager-wrapper.tar.gz + + +start-bk-prod-morph-prod-testnet-to-morph-token-price-oracle-hoodi: + /data/secret-manager-wrapper ./token-price-oracle + + +build-bk-prod-morph-prod-mainnet-to-morph-token-price-oracle: + if [ ! -d dist ]; then mkdir -p dist; fi + env GO111MODULE=on CGO_LDFLAGS="-ldl" CGO_ENABLED=1 go build -v $(LDFLAGS) -o token-price-oracle/token-price-oracle ./token-price-oracle/cmd + cp token-price-oracle/token-price-oracle dist/ + aws s3 cp s3://morph-0582-morph-technical-department-mainnet-data/morph-setup/secret-manager-wrapper.tar.gz ./ + tar -xvzf secret-manager-wrapper.tar.gz + + +start-bk-prod-morph-prod-mainnet-to-morph-token-price-oracle: + /data/secret-manager-wrapper ./token-price-oracle + # gas-oracle # testnet @@ -107,6 +142,20 @@ build-bk-prod-morph-prod-testnet-to-morph-gas-price-oracle-holesky: start-bk-prod-morph-prod-testnet-to-morph-gas-price-oracle-holesky: /data/secret-manager-wrapper ./app +# gas-oracle +# hoodi +build-bk-prod-morph-prod-testnet-to-morph-gas-price-oracle-hoodi: + 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/hoodi/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-hoodi: + /data/secret-manager-wrapper ./app + + # prover # testnet build-bk-prod-morph-prod-testnet-to-morph-prover-holesky: @@ -155,4 +204,4 @@ build-bk-prod-morph-prod-testnet-to-morph-staking-oracle-holesky: 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 + /data/secret-manager-wrapper ./staking-oracle diff --git a/README.md b/README.md index 09d6d7e85..79234c2f4 100644 --- a/README.md +++ b/README.md @@ -10,6 +10,73 @@ Morph is an innovative force reshaping the consumer blockchain landscape for pra 2. [How Does RVP Run in Morph?](https://medium.com/@morphlayer2/how-does-rvp-run-in-morph-6025233a21cc) +## Development + +### Setting Up Local Development Network + +This repository supports launching a local private Morph network for development and debugging purposes. + +#### Start the Development Network + +```bash +make devnet-up +``` + +This command performs the following steps: +1. Initializes and updates the go-ethereum submodule to the specified version +2. Builds the go-ubuntu-builder Docker image (if not already present) +3. Compiles all necessary components (L1 execution layer, consensus layer, L2 node, and services) +4. Generates genesis configurations for both L1 and L2 networks +5. Deploys smart contracts to the L1 network +6. Starts a 4-node Morph network with associated services + +**Note:** The initial startup may take considerable time due to extensive building operations. + +#### Clean Up the Network + +To completely remove the development network including Docker images: + +```bash +make devnet-clean +``` + +To clean up only the data and build artifacts while preserving Docker images: + +```bash +make devnet-clean-build +``` + +### Managing Dependencies + +#### Update Module Dependencies + +To download or update dependencies for all modules in this monorepo: + +```bash +make update +``` + +This command synchronizes the Go workspace and updates all module dependencies according to the versions specified in the Makefile: +- `ETHEREUM_TARGET_VERSION`: Specifies the go-ethereum dependency version +- `TENDERMINT_TARGET_VERSION`: Specifies the tendermint dependency version + +#### Update Submodules + +To update the go-ethereum submodule to the target version: + +```bash +make submodules +``` + +This command updates the go-ethereum submodule to the commit/tag specified by `ETHEREUM_SUBMODULE_COMMIT_OR_TAG` in the Makefile. + +### Additional Commands + +- `make lint`: Run linters for both Solidity and Go code +- `make fmt`: Format Solidity and Go code +- `make bindings`: Generate Go bindings from smart contracts +- `make geth`: Build the geth binary from the go-ethereum submodule + ## Learn more Website: https://www.morphl2.io/ diff --git a/bindings/Makefile b/bindings/Makefile index 80655a0c0..a98e10d37 100644 --- a/bindings/Makefile +++ b/bindings/Makefile @@ -52,7 +52,8 @@ bindings: \ morph-standard-erc20-factory-bindings \ morph-wrapped-ether-bindings \ erc20-bindings \ - l2-wst-eth-bindings + l2-wst-eth-bindings \ + l2-token-registry-bindings version: forge --version abigen --version @@ -118,6 +119,8 @@ l2-to-l1-message-passer-bindings: compile ./gen_bindings.sh contracts/l2/system/L2ToL1MessagePasser.sol:L2ToL1MessagePasser $(pkg) l2-tx-fee-vault-bindings: compile ./gen_bindings.sh contracts/l2/system/L2TxFeeVault.sol:L2TxFeeVault $(pkg) +l2-token-registry-bindings: compile + ./gen_bindings.sh contracts/l2/system/L2TokenRegistry.sol:L2TokenRegistry $(pkg) # Staking l2-gov-bindings: compile @@ -191,7 +194,7 @@ more: compile-forge go run ./gen/main.go \ -artifacts ../contracts/artifacts \ -out ./bindings \ - -contracts ProxyAdmin,TransparentUpgradeableProxy,L1MessageQueueWithGasPriceOracle,L1USDCGateway,L1Staking,L1CrossDomainMessenger,L1StandardERC20Gateway,L1ETHGateway,L1ERC20Gateway,L1GatewayRouter,L1WETHGateway,L1LidoGateway,Rollup,MultipleVersionRollupVerifier,L2CrossDomainMessenger,GasPriceOracle,L2ToL1MessagePasser,L2TxFeeVault,Sequencer,Gov,Distribute,L2Staking,Record,L2ETHGateway,L2StandardERC20Gateway,L2GatewayRouter,L2WETHGateway,L2ERC20Gateway,L2ERC721Gateway,L2ERC1155Gateway,L2LidoGateway,MorphToken,MorphStandardERC20,MorphStandardERC20Factory,WrappedEther,L2USDCGateway,EnforcedTxGateway,L1ERC721Gateway,L1ERC1155Gateway,L1ReverseCustomGateway,L2WithdrawLockERC20Gateway,L2ReverseCustomGateway,Whitelist,ZkEvmVerifierV1,L2WstETHToken \ + -contracts ProxyAdmin,TransparentUpgradeableProxy,L2TokenRegistry,L1MessageQueueWithGasPriceOracle,L1USDCGateway,L1Staking,L1CrossDomainMessenger,L1StandardERC20Gateway,L1ETHGateway,L1ERC20Gateway,L1GatewayRouter,L1WETHGateway,L1LidoGateway,Rollup,MultipleVersionRollupVerifier,L2CrossDomainMessenger,GasPriceOracle,L2ToL1MessagePasser,L2TxFeeVault,Sequencer,Gov,Distribute,L2Staking,Record,L2ETHGateway,L2StandardERC20Gateway,L2GatewayRouter,L2WETHGateway,L2ERC20Gateway,L2ERC721Gateway,L2ERC1155Gateway,L2LidoGateway,MorphToken,MorphStandardERC20,MorphStandardERC20Factory,WrappedEther,L2USDCGateway,EnforcedTxGateway,L1ERC721Gateway,L1ERC1155Gateway,L1ReverseCustomGateway,L2WithdrawLockERC20Gateway,L2ReverseCustomGateway,Whitelist,ZkEvmVerifierV1,L2WstETHToken \ -package bindings mkdir: diff --git a/bindings/ast/canonicalize.go b/bindings/ast/canonicalize.go index 695add25d..0fdfc7f54 100644 --- a/bindings/ast/canonicalize.go +++ b/bindings/ast/canonicalize.go @@ -49,7 +49,7 @@ func CanonicalizeASTIDs(in *solc.StorageLayout) *solc.StorageLayout { } replaceAstID := matches[0][2] - newType := strings.Replace(oldType, replaceAstID, strconv.Itoa(int(lastId)), 1) + newType := strings.Replace(oldType, replaceAstID, strconv.FormatUint(uint64(lastId), 10), 1) typeRemappings[oldType] = newType lastId++ } diff --git a/bindings/bin/distribute_deployed.hex b/bindings/bin/distribute_deployed.hex index f8c4dfac1..de3304d96 100644 --- a/bindings/bin/distribute_deployed.hex +++ b/bindings/bin/distribute_deployed.hex @@ -1 +1 @@ -0x608060405234801561000f575f80fd5b5060043610610163575f3560e01c8063a766c529116100c7578063cd4281d01161007d578063d557714111610063578063d55771411461033e578063de6ac93314610365578063f2fde38b14610388575f80fd5b8063cd4281d014610304578063cdd0c50e1461032b575f80fd5b8063b809af0f116100ad578063b809af0f146102b6578063bf2dca0a146102c9578063c4d66de8146102f1575f80fd5b8063a766c5291461027b578063ac2ac640146102a3575f80fd5b8063807de4431161011c578063921ae9b811610102578063921ae9b8146102245780639889be5114610247578063996cba6814610268575f80fd5b8063807de443146101d45780638da5cb5b14610213575f80fd5b80635cf20c7b1161014c5780635cf20c7b146101a6578063715018a6146101b95780637f683ee3146101c1575f80fd5b8063273d8e82146101675780634eedab3214610191575b5f80fd5b61017a610175366004612537565b61039b565b6040516101889291906125c2565b60405180910390f35b6101a461019f3660046125ef565b610729565b005b6101a46101b43660046125ef565b6107c7565b6101a46109c3565b6101a46101cf366004612617565b6109d6565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610188565b6033546001600160a01b03166101fb565b610237610232366004612537565b610c1c565b6040516101889493929190612656565b61025a6102553660046126d5565b610f59565b604051908152602001610188565b6101a4610276366004612706565b611230565b61025a610289366004612537565b6001600160a01b03165f9081526067602052604090205490565b6101a46102b1366004612537565b611355565b6101a46102c436600461274c565b61149e565b61025a6102d7366004612537565b6001600160a01b03165f9081526068602052604090205490565b6101a46102ff366004612537565b6115dc565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b6101a46103393660046127f3565b6117a6565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b6103786103733660046126d5565b611b06565b6040519015158152602001610188565b6101a4610396366004612537565b611b31565b6001600160a01b0381165f90815260696020526040812060609182916103c090611bc1565b9050805f0361043c5760405162461bcd60e51b815260206004820152602860248201527f696e76616c69642064656c656761746f72206f72206e6f2072656d61696e696e60448201527f672072657761726400000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b8067ffffffffffffffff8111156104555761045561288f565b60405190808252806020026020018201604052801561047e578160200160208202803683370190505b5092508067ffffffffffffffff81111561049a5761049a61288f565b6040519080825280602002602001820160405280156104c3578160200160208202803683370190505b5091505f5b6001600160a01b0385165f9081526069602052604090206104e890611bc1565b811015610722576001600160a01b0385165f9081526069602052604081206105109083611bca565b6001600160a01b038088165f908152606960209081526040808320938516835260039093019052908120549192509081908190805b6065548110156106bf576001600160a01b038087165f9081526066602090815260408083208584528252808320938f168352600490930190522054156105b9576001600160a01b038087165f9081526066602090815260408083208584528252808320938f16835260049093019052205492505b6001600160a01b0386165f9081526066602090815260408083208484529091529020600101541561060d576001600160a01b0386165f90815260666020908152604080832084845290915290206001015493505b6001600160a01b0386165f908152606660209081526040808320848452909152902054849061063d9085906128e9565b6106479190612900565b6106519086612938565b6001600160a01b03808d165f908152606960209081526040808320938b16835260029093019052205490955060ff1680156106b357506001600160a01b03808c165f908152606960209081526040808320938a16835260049093019052205481145b6106bf57600101610545565b50848987815181106106d3576106d361294b565b60200260200101906001600160a01b031690816001600160a01b031681525050838887815181106107065761070661294b565b60209081029190910101525050600190930192506104c8915050565b5050915091565b610731611bdc565b6001600160a01b0382165f908152606760205260409020545b8181116107a8576001600160a01b0383165f908152606660209081526040808320848452909152812081815560018101829055906002820181818161078f82826124ee565b50505050505080806107a090612978565b91505061074a565b6001600160a01b039092165f9081526067602052604090209190915550565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461083f5760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6065545f036108905760405162461bcd60e51b815260206004820152600e60248201527f6e6f74206d696e746564207965740000000000000000000000000000000000006044820152606401610433565b5f8115806108ab575060016065546108a891906129af565b82115b6108b557816108c4565b60016065546108c491906129af565b90505f805b6001600160a01b0385165f9081526069602052604090206108e990611bc1565b8110156109ac576001600160a01b0385165f90815260696020526040812081906109139084611bca565b6001600160a01b0388165f9081526069602052604090209091506109379082611c36565b801561096b57506001600160a01b038088165f90815260696020908152604080832093851683526003909301905220548510155b15610992575f8061097d838a89611c57565b909250905061098c8287612938565b95509250505b816109a557826109a181612978565b9350505b50506108c9565b5080156109bd576109bd84826120b2565b50505050565b6109cb611bdc565b6109d45f612308565b565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610a4e5760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6001600160a01b0384165f9081526066602090815260408083208584529091529020600101819055811580610aaa57506001600160a01b038084165f908152606960209081526040808320938816835260039093019052205482145b15610b8f576001600160a01b0384165f9081526066602090815260408083208584529091529020610ade9060020184612371565b506001600160a01b038085165f90815260666020908152604080832086845282528083209387168352600490930181528282208290556069905220610b239085612371565b506001600160a01b038381165f908152606960209081526040808320938816835260028401825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560038401825280832083905560049093019052908120556109bd565b6001600160a01b038084165f9081526069602090815260408083209388168352600290930190522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155610bed90836129af565b6001600160a01b038085165f908152606960209081526040808320938916835260049093019052205550505050565b6001600160a01b0381165f908152606960205260408120606091829182918291610c4590611bc1565b90505f8167ffffffffffffffff811115610c6157610c6161288f565b604051908082528060200260200182016040528015610c8a578160200160208202803683370190505b5090505f8267ffffffffffffffff811115610ca757610ca761288f565b604051908082528060200260200182016040528015610cd0578160200160208202803683370190505b5090505f8367ffffffffffffffff811115610ced57610ced61288f565b604051908082528060200260200182016040528015610d16578160200160208202803683370190505b5090505f8467ffffffffffffffff811115610d3357610d3361288f565b604051908082528060200260200182016040528015610d5c578160200160208202803683370190505b5090505f5b85811015610f48576001600160a01b038b165f908152606960205260409020610d8a9082611bca565b858281518110610d9c57610d9c61294b565b60200260200101906001600160a01b031690816001600160a01b03168152505060695f8c6001600160a01b03166001600160a01b031681526020019081526020015f206002015f868381518110610df557610df561294b565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f9054906101000a900460ff16848281518110610e3b57610e3b61294b565b9115156020928302919091018201526001600160a01b038c165f908152606990915260408120865160039091019190879084908110610e7c57610e7c61294b565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054838281518110610eb657610eb661294b565b60200260200101818152505060695f8c6001600160a01b03166001600160a01b031681526020019081526020015f206004015f868381518110610efb57610efb61294b565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054828281518110610f3557610f3561294b565b6020908102919091010152600101610d61565b509299919850965090945092505050565b6001600160a01b0381165f908152606960205260408120610f7990611bc1565b5f03610fed5760405162461bcd60e51b815260206004820152602860248201527f696e76616c69642064656c656761746f72206f72206e6f2072656d61696e696e60448201527f67207265776172640000000000000000000000000000000000000000000000006064820152608401610433565b6001600160a01b0382165f90815260696020526040902061100e9084611c36565b61107f5760405162461bcd60e51b8152602060048201526024808201527f6e6f2072656d61696e696e6720726577617264206f66207468652064656c656760448201527f61746565000000000000000000000000000000000000000000000000000000006064820152608401610433565b6001600160a01b038083165f9081526069602090815260408083209387168352600390930190529081205481905b606554811015611227576001600160a01b038087165f9081526066602090815260408083208584528252808320938916835260049093019052205415611121576001600160a01b038087165f9081526066602090815260408083208584528252808320938916835260049093019052205491505b6001600160a01b0386165f90815260666020908152604080832084845290915290206001015415611175576001600160a01b0386165f90815260666020908152604080832084845290915290206001015492505b6001600160a01b0386165f90815260666020908152604080832084845290915290205483906111a59084906128e9565b6111af9190612900565b6111b99085612938565b6001600160a01b038087165f908152606960209081526040808320938b16835260029093019052205490945060ff16801561121b57506001600160a01b038086165f908152606960209081526040808320938a16835260049093019052205481145b611227576001016110ad565b50505092915050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146112a85760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6065545f036112f95760405162461bcd60e51b815260206004820152600e60248201527f6e6f74206d696e746564207965740000000000000000000000000000000000006044820152606401610433565b5f8115806113145750600160655461131191906129af565b82115b61131e578161132d565b600160655461132d91906129af565b90505f61133b858584611c57565b509050801561134e5761134e84826120b2565b5050505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146113cd5760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6001600160a01b0381165f908152606860205260409020546114315760405162461bcd60e51b815260206004820152601660248201527f6e6f20636f6d6d697373696f6e20746f20636c61696d000000000000000000006044820152606401610433565b6001600160a01b0381165f908152606860205260408120805491905561145782826120b2565b816001600160a01b03167f8e14daa5332205b1634040e1054e93d1f5396ec8bf0115d133b7fbaf4a52e4118260405161149291815260200190565b60405180910390a25050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146115165760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6001600160a01b0386165f90815260666020908152604080832087845290915290206001810183905561154c9060020186612385565b506001600160a01b038087165f90815260666020908152604080832088845282528083209389168352600490930190522083905580156115d4576001600160a01b0385165f9081526069602052604090206115a79087612385565b506001600160a01b038086165f908152606960209081526040808320938a16835260039093019052208490555b505050505050565b5f54610100900460ff16158080156115fa57505f54600160ff909116105b806116135750303b15801561161357505f5460ff166001145b6116855760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610433565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156116e1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b0382166117375760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964206f776e6572206164647265737300000000000000000000006044820152606401610433565b61174082612308565b80156117a2575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461181e5760405162461bcd60e51b815260206004820152601c60248201527f6f6e6c79207265636f726420636f6e747261637420616c6c6f776564000000006044820152606401610433565b60658054905f61182d83612978565b919050555086600160655461184291906129af565b1461188f5760405162461bcd60e51b815260206004820152601360248201527f696e76616c69642065706f636820696e646578000000000000000000000000006044820152606401610433565b828514801561189d57508085145b6118e95760405162461bcd60e51b815260206004820152601360248201527f696e76616c69642064617461206c656e677468000000000000000000000000006044820152606401610433565b5f5b85811015611afc578484828181106119055761190561294b565b9050602002013560665f8989858181106119215761192161294b565b90506020020160208101906119369190612537565b6001600160a01b0316815260208082019290925260409081015f9081208c82529092528120919091556066908888848181106119745761197461294b565b90506020020160208101906119899190612537565b6001600160a01b0316815260208082019290925260409081015f9081208b82529092529020600101541580156119be57505f88115b15611a7f5760665f8888848181106119d8576119d861294b565b90506020020160208101906119ed9190612537565b6001600160a01b03166001600160a01b031681526020019081526020015f205f60018a611a1a91906129af565b81526020019081526020015f206001015460665f898985818110611a4057611a4061294b565b9050602002016020810190611a559190612537565b6001600160a01b0316815260208082019290925260409081015f9081208c82529092529020600101555b828282818110611a9157611a9161294b565b9050602002013560685f898985818110611aad57611aad61294b565b9050602002016020810190611ac29190612537565b6001600160a01b03166001600160a01b031681526020019081526020015f205f828254611aef9190612938565b90915550506001016118eb565b5050505050505050565b6001600160a01b0382165f908152606960205260408120611b279083611c36565b1590505b92915050565b611b39611bdc565b6001600160a01b038116611bb55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610433565b611bbe81612308565b50565b5f611b2b825490565b5f611bd58383612399565b9392505050565b6033546001600160a01b031633146109d45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610433565b6001600160a01b0381165f9081526001830160205260408120541515611bd5565b6001600160a01b0382165f9081526069602052604081208190611c7a9086611c36565b611cc65760405162461bcd60e51b815260206004820152601360248201527f6e6f2072656d61696e696e6720726577617264000000000000000000000000006044820152606401610433565b6001600160a01b038085165f9081526069602090815260408083209389168352600390930190522054831015611d3e5760405162461bcd60e51b815260206004820152601260248201527f616c6c2072657761726420636c61696d656400000000000000000000000000006044820152606401610433565b6001600160a01b038085165f9081526069602090815260408083209389168352600390930190529081205481905b858111611f7f576001600160a01b038089165f9081526066602090815260408083208584528252808320938b16835260049093019052205415611ddd576001600160a01b038089165f9081526066602090815260408083208584528252808320938b16835260049093019052205491505b6001600160a01b0388165f90815260666020908152604080832084845290915290206001015415611e31576001600160a01b0388165f90815260666020908152604080832084845290915290206001015492505b6001600160a01b0388165f9081526066602090815260408083208484529091529020548390611e619084906128e9565b611e6b9190612900565b611e759086612938565b6001600160a01b038089165f908152606960209081526040808320938d16835260029093019052205490955060ff168015611ed757506001600160a01b038088165f908152606960209081526040808320938c16835260049093019052205481145b15611f6d576001600160a01b0387165f90815260696020526040902060019450611f019089612371565b506001600160a01b038781165f908152606960209081526040808320938c16835260028401825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556003840182528083208390556004909301905290812055611f7f565b80611f7781612978565b915050611d6c565b50611f8b856001612938565b6001600160a01b038088165f908152606960209081526040808320938c16835260039093018152828220939093556066909252812090611fcc876001612938565b81526020019081526020015f206004015f876001600160a01b03166001600160a01b031681526020019081526020015f20545f03612052576001600160a01b0387165f9081526066602052604081208291612028886001612938565b815260208082019290925260409081015f9081206001600160a01b038b1682526004019092529020555b866001600160a01b0316866001600160a01b03167f7a84a08b02c91f3c62d572853f966fc799bbd121e8ad7833a4494ab8dcfcb40487876040516120a0929190918252602082015260400190565b60405180910390a35050935093915050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561212f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061215391906129c2565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152602482018590529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303815f875af11580156121dd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061220191906129d9565b506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561227f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a391906129c2565b90505f831180156122bc5750826122ba82846129af565b145b6109bd5760405162461bcd60e51b815260206004820152601b60248201527f6d6f72706820746f6b656e207472616e73666572206661696c656400000000006044820152606401610433565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f611bd5836001600160a01b0384166123bf565b5f611bd5836001600160a01b0384166124a2565b5f825f0182815481106123ae576123ae61294b565b905f5260205f200154905092915050565b5f8181526001830160205260408120548015612499575f6123e16001836129af565b85549091505f906123f4906001906129af565b9050818114612453575f865f0182815481106124125761241261294b565b905f5260205f200154905080875f0184815481106124325761243261294b565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080612464576124646129f4565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611b2b565b5f915050611b2b565b5f8181526001830160205260408120546124e757508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155611b2b565b505f611b2b565b5080545f8255905f5260205f2090810190611bbe91905b80821115612518575f8155600101612505565b5090565b80356001600160a01b0381168114612532575f80fd5b919050565b5f60208284031215612547575f80fd5b611bd58261251c565b5f815180845260208085019450602084015f5b838110156125885781516001600160a01b031687529582019590820190600101612563565b509495945050505050565b5f815180845260208085019450602084015f5b83811015612588578151875295820195908201906001016125a6565b604081525f6125d46040830185612550565b82810360208401526125e68185612593565b95945050505050565b5f8060408385031215612600575f80fd5b6126098361251c565b946020939093013593505050565b5f805f806080858703121561262a575f80fd5b6126338561251c565b93506126416020860161251c565b93969395505050506040820135916060013590565b608081525f6126686080830187612550565b8281036020848101919091528651808352878201928201905f5b818110156126a0578451151583529383019391830191600101612682565b505084810360408601526126b48188612593565b9250505082810360608401526126ca8185612593565b979650505050505050565b5f80604083850312156126e6575f80fd5b6126ef8361251c565b91506126fd6020840161251c565b90509250929050565b5f805f60608486031215612718575f80fd5b6127218461251c565b925061272f6020850161251c565b9150604084013590509250925092565b8015158114611bbe575f80fd5b5f805f805f8060c08789031215612761575f80fd5b61276a8761251c565b95506127786020880161251c565b945060408701359350606087013592506080870135915060a087013561279d8161273f565b809150509295509295509295565b5f8083601f8401126127bb575f80fd5b50813567ffffffffffffffff8111156127d2575f80fd5b6020830191508360208260051b85010111156127ec575f80fd5b9250929050565b5f805f805f805f6080888a031215612809575f80fd5b87359650602088013567ffffffffffffffff80821115612827575f80fd5b6128338b838c016127ab565b909850965060408a013591508082111561284b575f80fd5b6128578b838c016127ab565b909650945060608a013591508082111561286f575f80fd5b5061287c8a828b016127ab565b989b979a50959850939692959293505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082028115828204841417611b2b57611b2b6128bc565b5f82612933577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b80820180821115611b2b57611b2b6128bc565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036129a8576129a86128bc565b5060010190565b81810381811115611b2b57611b2b6128bc565b5f602082840312156129d2575f80fd5b5051919050565b5f602082840312156129e9575f80fd5b8151611bd58161273f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea164736f6c6343000818000a +0x608060405234801561000f575f80fd5b5060043610610163575f3560e01c8063a766c529116100c7578063cd4281d01161007d578063d557714111610063578063d55771411461033e578063de6ac93314610365578063f2fde38b14610388575f80fd5b8063cd4281d014610304578063cdd0c50e1461032b575f80fd5b8063b809af0f116100ad578063b809af0f146102b6578063bf2dca0a146102c9578063c4d66de8146102f1575f80fd5b8063a766c5291461027b578063ac2ac640146102a3575f80fd5b8063807de4431161011c578063921ae9b811610102578063921ae9b8146102245780639889be5114610247578063996cba6814610268575f80fd5b8063807de443146101d45780638da5cb5b14610213575f80fd5b80635cf20c7b1161014c5780635cf20c7b146101a6578063715018a6146101b95780637f683ee3146101c1575f80fd5b8063273d8e82146101675780634eedab3214610191575b5f80fd5b61017a610175366004612512565b61039b565b60405161018892919061259d565b60405180910390f35b6101a461019f3660046125ca565b610729565b005b6101a46101b43660046125ca565b6107c7565b6101a46109a6565b6101a46101cf3660046125f2565b6109b9565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610188565b6033546001600160a01b03166101fb565b610237610232366004612512565b610bff565b6040516101889493929190612631565b61025a6102553660046126b0565b610f3c565b604051908152602001610188565b6101a46102763660046126e1565b611213565b61025a610289366004612512565b6001600160a01b03165f9081526067602052604090205490565b6101a46102b1366004612512565b611337565b6101a46102c4366004612727565b611480565b61025a6102d7366004612512565b6001600160a01b03165f9081526068602052604090205490565b6101a46102ff366004612512565b6115be565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b6101a46103393660046127ce565b611788565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b6103786103733660046126b0565b611ae8565b6040519015158152602001610188565b6101a4610396366004612512565b611b13565b6001600160a01b0381165f90815260696020526040812060609182916103c090611ba3565b9050805f0361043c5760405162461bcd60e51b815260206004820152602860248201527f696e76616c69642064656c656761746f72206f72206e6f2072656d61696e696e60448201527f672072657761726400000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b8067ffffffffffffffff8111156104555761045561286a565b60405190808252806020026020018201604052801561047e578160200160208202803683370190505b5092508067ffffffffffffffff81111561049a5761049a61286a565b6040519080825280602002602001820160405280156104c3578160200160208202803683370190505b5091505f5b6001600160a01b0385165f9081526069602052604090206104e890611ba3565b811015610722576001600160a01b0385165f9081526069602052604081206105109083611bac565b6001600160a01b038088165f908152606960209081526040808320938516835260039093019052908120549192509081908190805b6065548110156106bf576001600160a01b038087165f9081526066602090815260408083208584528252808320938f168352600490930190522054156105b9576001600160a01b038087165f9081526066602090815260408083208584528252808320938f16835260049093019052205492505b6001600160a01b0386165f9081526066602090815260408083208484529091529020600101541561060d576001600160a01b0386165f90815260666020908152604080832084845290915290206001015493505b6001600160a01b0386165f908152606660209081526040808320848452909152902054849061063d9085906128c4565b61064791906128db565b6106519086612913565b6001600160a01b03808d165f908152606960209081526040808320938b16835260029093019052205490955060ff1680156106b357506001600160a01b03808c165f908152606960209081526040808320938a16835260049093019052205481145b6106bf57600101610545565b50848987815181106106d3576106d3612926565b60200260200101906001600160a01b031690816001600160a01b0316815250508388878151811061070657610706612926565b60209081029190910101525050600190930192506104c8915050565b5050915091565b610731611bbe565b6001600160a01b0382165f908152606760205260409020545b8181116107a8576001600160a01b0383165f908152606660209081526040808320848452909152812081815560018101829055906002820181818161078f82826124c9565b50505050505080806107a090612953565b91505061074a565b6001600160a01b039092165f9081526067602052604090209190915550565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461083f5760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6065545f036108905760405162461bcd60e51b815260206004820152600e60248201527f6e6f74206d696e746564207965740000000000000000000000000000000000006044820152606401610433565b5f8115806108ab575060016065546108a8919061298a565b82115b6108b557816108c4565b60016065546108c4919061298a565b90505f805b6001600160a01b0385165f9081526069602052604090206108e990611ba3565b81101561098f576001600160a01b0385165f9081526069602052604081206109119083611bac565b6001600160a01b0387165f9081526069602052604090209091506109359082611c18565b801561096957506001600160a01b038087165f90815260696020908152604080832093851683526003909301905220548410155b1561098657610979818786611c39565b6109839084612913565b92505b506001016108c9565b5080156109a0576109a0848261208d565b50505050565b6109ae611bbe565b6109b75f6122e3565b565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610a315760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6001600160a01b0384165f9081526066602090815260408083208584529091529020600101819055811580610a8d57506001600160a01b038084165f908152606960209081526040808320938816835260039093019052205482145b15610b72576001600160a01b0384165f9081526066602090815260408083208584529091529020610ac1906002018461234c565b506001600160a01b038085165f90815260666020908152604080832086845282528083209387168352600490930181528282208290556069905220610b06908561234c565b506001600160a01b038381165f908152606960209081526040808320938816835260028401825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560038401825280832083905560049093019052908120556109a0565b6001600160a01b038084165f9081526069602090815260408083209388168352600290930190522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155610bd0908361298a565b6001600160a01b038085165f908152606960209081526040808320938916835260049093019052205550505050565b6001600160a01b0381165f908152606960205260408120606091829182918291610c2890611ba3565b90505f8167ffffffffffffffff811115610c4457610c4461286a565b604051908082528060200260200182016040528015610c6d578160200160208202803683370190505b5090505f8267ffffffffffffffff811115610c8a57610c8a61286a565b604051908082528060200260200182016040528015610cb3578160200160208202803683370190505b5090505f8367ffffffffffffffff811115610cd057610cd061286a565b604051908082528060200260200182016040528015610cf9578160200160208202803683370190505b5090505f8467ffffffffffffffff811115610d1657610d1661286a565b604051908082528060200260200182016040528015610d3f578160200160208202803683370190505b5090505f5b85811015610f2b576001600160a01b038b165f908152606960205260409020610d6d9082611bac565b858281518110610d7f57610d7f612926565b60200260200101906001600160a01b031690816001600160a01b03168152505060695f8c6001600160a01b03166001600160a01b031681526020019081526020015f206002015f868381518110610dd857610dd8612926565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f9054906101000a900460ff16848281518110610e1e57610e1e612926565b9115156020928302919091018201526001600160a01b038c165f908152606990915260408120865160039091019190879084908110610e5f57610e5f612926565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054838281518110610e9957610e99612926565b60200260200101818152505060695f8c6001600160a01b03166001600160a01b031681526020019081526020015f206004015f868381518110610ede57610ede612926565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054828281518110610f1857610f18612926565b6020908102919091010152600101610d44565b509299919850965090945092505050565b6001600160a01b0381165f908152606960205260408120610f5c90611ba3565b5f03610fd05760405162461bcd60e51b815260206004820152602860248201527f696e76616c69642064656c656761746f72206f72206e6f2072656d61696e696e60448201527f67207265776172640000000000000000000000000000000000000000000000006064820152608401610433565b6001600160a01b0382165f908152606960205260409020610ff19084611c18565b6110625760405162461bcd60e51b8152602060048201526024808201527f6e6f2072656d61696e696e6720726577617264206f66207468652064656c656760448201527f61746565000000000000000000000000000000000000000000000000000000006064820152608401610433565b6001600160a01b038083165f9081526069602090815260408083209387168352600390930190529081205481905b60655481101561120a576001600160a01b038087165f9081526066602090815260408083208584528252808320938916835260049093019052205415611104576001600160a01b038087165f9081526066602090815260408083208584528252808320938916835260049093019052205491505b6001600160a01b0386165f90815260666020908152604080832084845290915290206001015415611158576001600160a01b0386165f90815260666020908152604080832084845290915290206001015492505b6001600160a01b0386165f90815260666020908152604080832084845290915290205483906111889084906128c4565b61119291906128db565b61119c9085612913565b6001600160a01b038087165f908152606960209081526040808320938b16835260029093019052205490945060ff1680156111fe57506001600160a01b038086165f908152606960209081526040808320938a16835260049093019052205481145b61120a57600101611090565b50505092915050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461128b5760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6065545f036112dc5760405162461bcd60e51b815260206004820152600e60248201527f6e6f74206d696e746564207965740000000000000000000000000000000000006044820152606401610433565b5f8115806112f7575060016065546112f4919061298a565b82115b6113015781611310565b6001606554611310919061298a565b90505f61131e858584611c39565b9050801561133057611330848261208d565b5050505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146113af5760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6001600160a01b0381165f908152606860205260409020546114135760405162461bcd60e51b815260206004820152601660248201527f6e6f20636f6d6d697373696f6e20746f20636c61696d000000000000000000006044820152606401610433565b6001600160a01b0381165f9081526068602052604081208054919055611439828261208d565b816001600160a01b03167f8e14daa5332205b1634040e1054e93d1f5396ec8bf0115d133b7fbaf4a52e4118260405161147491815260200190565b60405180910390a25050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146114f85760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6001600160a01b0386165f90815260666020908152604080832087845290915290206001810183905561152e9060020186612360565b506001600160a01b038087165f90815260666020908152604080832088845282528083209389168352600490930190522083905580156115b6576001600160a01b0385165f9081526069602052604090206115899087612360565b506001600160a01b038086165f908152606960209081526040808320938a16835260039093019052208490555b505050505050565b5f54610100900460ff16158080156115dc57505f54600160ff909116105b806115f55750303b1580156115f557505f5460ff166001145b6116675760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610433565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156116c3575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b0382166117195760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964206f776e6572206164647265737300000000000000000000006044820152606401610433565b611722826122e3565b8015611784575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146118005760405162461bcd60e51b815260206004820152601c60248201527f6f6e6c79207265636f726420636f6e747261637420616c6c6f776564000000006044820152606401610433565b60658054905f61180f83612953565b9190505550866001606554611824919061298a565b146118715760405162461bcd60e51b815260206004820152601360248201527f696e76616c69642065706f636820696e646578000000000000000000000000006044820152606401610433565b828514801561187f57508085145b6118cb5760405162461bcd60e51b815260206004820152601360248201527f696e76616c69642064617461206c656e677468000000000000000000000000006044820152606401610433565b5f5b85811015611ade578484828181106118e7576118e7612926565b9050602002013560665f89898581811061190357611903612926565b90506020020160208101906119189190612512565b6001600160a01b0316815260208082019290925260409081015f9081208c825290925281209190915560669088888481811061195657611956612926565b905060200201602081019061196b9190612512565b6001600160a01b0316815260208082019290925260409081015f9081208b82529092529020600101541580156119a057505f88115b15611a615760665f8888848181106119ba576119ba612926565b90506020020160208101906119cf9190612512565b6001600160a01b03166001600160a01b031681526020019081526020015f205f60018a6119fc919061298a565b81526020019081526020015f206001015460665f898985818110611a2257611a22612926565b9050602002016020810190611a379190612512565b6001600160a01b0316815260208082019290925260409081015f9081208c82529092529020600101555b828282818110611a7357611a73612926565b9050602002013560685f898985818110611a8f57611a8f612926565b9050602002016020810190611aa49190612512565b6001600160a01b03166001600160a01b031681526020019081526020015f205f828254611ad19190612913565b90915550506001016118cd565b5050505050505050565b6001600160a01b0382165f908152606960205260408120611b099083611c18565b1590505b92915050565b611b1b611bbe565b6001600160a01b038116611b975760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610433565b611ba0816122e3565b50565b5f611b0d825490565b5f611bb78383612374565b9392505050565b6033546001600160a01b031633146109b75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610433565b6001600160a01b0381165f9081526001830160205260408120541515611bb7565b6001600160a01b0382165f908152606960205260408120611c5a9085611c18565b611ca65760405162461bcd60e51b815260206004820152601360248201527f6e6f2072656d61696e696e6720726577617264000000000000000000000000006044820152606401610433565b6001600160a01b038084165f9081526069602090815260408083209388168352600390930190522054821015611d1e5760405162461bcd60e51b815260206004820152601260248201527f616c6c2072657761726420636c61696d656400000000000000000000000000006044820152606401610433565b6001600160a01b038084165f9081526069602090815260408083209388168352600390930190529081205481905b848111611f5b576001600160a01b038088165f9081526066602090815260408083208584528252808320938a16835260049093019052205415611dbd576001600160a01b038088165f9081526066602090815260408083208584528252808320938a16835260049093019052205491505b6001600160a01b0387165f90815260666020908152604080832084845290915290206001015415611e11576001600160a01b0387165f90815260666020908152604080832084845290915290206001015492505b6001600160a01b0387165f9081526066602090815260408083208484529091529020548390611e419084906128c4565b611e4b91906128db565b611e559085612913565b6001600160a01b038088165f908152606960209081526040808320938c16835260029093019052205490945060ff168015611eb757506001600160a01b038087165f908152606960209081526040808320938b16835260049093019052205481145b15611f49576001600160a01b0386165f908152606960205260409020611edd908861234c565b506001600160a01b038681165f908152606960209081526040808320938b16835260028401825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556003840182528083208390556004909301905290812055611f5b565b80611f5381612953565b915050611d4c565b50611f67846001612913565b6001600160a01b038087165f908152606960209081526040808320938b16835260039093018152828220939093556066909252812090611fa8866001612913565b81526020019081526020015f206004015f866001600160a01b03166001600160a01b031681526020019081526020015f20545f0361202e576001600160a01b0386165f9081526066602052604081208291612004876001612913565b815260208082019290925260409081015f9081206001600160a01b038a1682526004019092529020555b856001600160a01b0316856001600160a01b03167f7a84a08b02c91f3c62d572853f966fc799bbd121e8ad7833a4494ab8dcfcb404868660405161207c929190918252602082015260400190565b60405180910390a350509392505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561210a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061212e919061299d565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152602482018590529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303815f875af11580156121b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121dc91906129b4565b506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561225a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061227e919061299d565b90505f83118015612297575082612295828461298a565b145b6109a05760405162461bcd60e51b815260206004820152601b60248201527f6d6f72706820746f6b656e207472616e73666572206661696c656400000000006044820152606401610433565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f611bb7836001600160a01b03841661239a565b5f611bb7836001600160a01b03841661247d565b5f825f01828154811061238957612389612926565b905f5260205f200154905092915050565b5f8181526001830160205260408120548015612474575f6123bc60018361298a565b85549091505f906123cf9060019061298a565b905081811461242e575f865f0182815481106123ed576123ed612926565b905f5260205f200154905080875f01848154811061240d5761240d612926565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061243f5761243f6129cf565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611b0d565b5f915050611b0d565b5f8181526001830160205260408120546124c257508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155611b0d565b505f611b0d565b5080545f8255905f5260205f2090810190611ba091905b808211156124f3575f81556001016124e0565b5090565b80356001600160a01b038116811461250d575f80fd5b919050565b5f60208284031215612522575f80fd5b611bb7826124f7565b5f815180845260208085019450602084015f5b838110156125635781516001600160a01b03168752958201959082019060010161253e565b509495945050505050565b5f815180845260208085019450602084015f5b8381101561256357815187529582019590820190600101612581565b604081525f6125af604083018561252b565b82810360208401526125c1818561256e565b95945050505050565b5f80604083850312156125db575f80fd5b6125e4836124f7565b946020939093013593505050565b5f805f8060808587031215612605575f80fd5b61260e856124f7565b935061261c602086016124f7565b93969395505050506040820135916060013590565b608081525f612643608083018761252b565b8281036020848101919091528651808352878201928201905f5b8181101561267b57845115158352938301939183019160010161265d565b5050848103604086015261268f818861256e565b9250505082810360608401526126a5818561256e565b979650505050505050565b5f80604083850312156126c1575f80fd5b6126ca836124f7565b91506126d8602084016124f7565b90509250929050565b5f805f606084860312156126f3575f80fd5b6126fc846124f7565b925061270a602085016124f7565b9150604084013590509250925092565b8015158114611ba0575f80fd5b5f805f805f8060c0878903121561273c575f80fd5b612745876124f7565b9550612753602088016124f7565b945060408701359350606087013592506080870135915060a08701356127788161271a565b809150509295509295509295565b5f8083601f840112612796575f80fd5b50813567ffffffffffffffff8111156127ad575f80fd5b6020830191508360208260051b85010111156127c7575f80fd5b9250929050565b5f805f805f805f6080888a0312156127e4575f80fd5b87359650602088013567ffffffffffffffff80821115612802575f80fd5b61280e8b838c01612786565b909850965060408a0135915080821115612826575f80fd5b6128328b838c01612786565b909650945060608a013591508082111561284a575f80fd5b506128578a828b01612786565b989b979a50959850939692959293505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082028115828204841417611b0d57611b0d612897565b5f8261290e577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b80820180821115611b0d57611b0d612897565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361298357612983612897565b5060010190565b81810381811115611b0d57611b0d612897565b5f602082840312156129ad575f80fd5b5051919050565b5f602082840312156129c4575f80fd5b8151611bb78161271a565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea164736f6c6343000818000a diff --git a/bindings/bin/gov_deployed.hex b/bindings/bin/gov_deployed.hex index bd4d5d5dd..c6ac23fbd 100644 --- a/bindings/bin/gov_deployed.hex +++ b/bindings/bin/gov_deployed.hex @@ -1 +1 @@ -0x608060405234801561000f575f80fd5b5060043610610184575f3560e01c8063807de443116100dd578063b511328d11610088578063e5aec99511610063578063e5aec995146103b0578063f2fde38b146103b9578063f92ad219146103cc575f80fd5b8063b511328d14610356578063d5cc89ba14610394578063d7693075146103a7575f80fd5b80638e21d5fb116100b85780638e21d5fb146102dd57806396dea93614610304578063a83d07371461034d575f80fd5b8063807de4431461026a57806385963052146102b65780638da5cb5b146102bf575f80fd5b806349c1a5811161013d578063715018a611610118578063715018a61461022757806374c260cf1461022f57806377c7938014610261575f80fd5b806349c1a581146101e85780635bcfadb51461020b578063639661901461021e575f80fd5b8063132002fc1161016d578063132002fc146101b0578063237a4b96146101cc5780634428c1a4146101df575f80fd5b80630121b93f146101885780630d61b5191461019d575b5f80fd5b61019b610196366004611764565b6103df565b005b61019b6101ab366004611764565b610727565b6101b9606b5481565b6040519081526020015b60405180910390f35b6101b96101da36600461177b565b6107db565b6101b9606a5481565b6101fb6101f63660046117b2565b610acb565b60405190151581526020016101c3565b61019b610219366004611764565b610aeb565b6101b9606c5481565b61019b610bba565b61024261023d366004611764565b610bcd565b60408051931515845291151560208401521515908201526060016101c3565b6101b960675481565b6102917f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c3565b6101b960655481565b60335473ffffffffffffffffffffffffffffffffffffffff16610291565b6102917f000000000000000000000000000000000000000000000000000000000000000081565b610332610312366004611764565b606e6020525f908152604090208054600182015460029092015490919083565b604080519384526020840192909252908201526060016101c3565b6101b960715481565b61037f610364366004611764565b606f6020525f90815260409020805460019091015460ff1682565b604080519283529015156020830152016101c3565b61019b6103a2366004611764565b610d25565b6101b9606d5481565b6101b960695481565b61019b6103c73660046117e0565b610e38565b61019b6103da366004611802565b610ed5565b5f73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016636d46e987336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015610484573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104a89190611842565b9050806104fc5760405162461bcd60e51b815260206004820152601660248201527f6f6e6c792073657175656e63657220616c6c6f7765640000000000000000000060448201526064015b60405180910390fd5b606c5482111561054e5760405162461bcd60e51b815260206004820152601260248201527f696e76616c69642070726f706f73616c4944000000000000000000000000000060448201526064016104f3565b607154821161059f5760405162461bcd60e51b815260206004820152601260248201527f657870697265642070726f706f73616c4944000000000000000000000000000060448201526064016104f3565b606d548210156105f15760405162461bcd60e51b815260206004820152600f60248201527f70726f706f73616c207072756e6564000000000000000000000000000000000060448201526064016104f3565b5f828152606f60205260409020805460019091015460ff1680610612575080155b8061061c57504281105b156106695760405162461bcd60e51b815260206004820152601060248201527f766f74696e672068617320656e6465640000000000000000000000000000000060448201526064016104f3565b610680335f858152607060205260409020906112a3565b156106f35760405162461bcd60e51b815260206004820152602960248201527f73657175656e63657220616c726561647920766f74656420666f72207468697360448201527f2070726f706f73616c000000000000000000000000000000000000000000000060648201526084016104f3565b61070a335f858152607060205260409020906112d1565b50610714836112f2565b156107225761072283611429565b505050565b5f8061073283610bcd565b509150915081156107855760405162461bcd60e51b815260206004820152601060248201527f766f74696e672068617320656e6465640000000000000000000000000000000060448201526064016104f3565b806107d25760405162461bcd60e51b815260206004820181905260248201527f70726f706f73616c20686173206e6f74206265656e207061737365642079657460448201526064016104f3565b61072283611429565b5f8073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016636d46e987336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015610881573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108a59190611842565b9050806108f45760405162461bcd60e51b815260206004820152601660248201527f6f6e6c792073657175656e63657220616c6c6f7765640000000000000000000060448201526064016104f3565b82604001355f036109475760405162461bcd60e51b815260206004820152601460248201527f696e76616c696420726f6c6c75702065706f636800000000000000000000000060448201526064016104f3565b82351515806109595750602083013515155b6109a55760405162461bcd60e51b815260206004820152601460248201527f696e76616c696420626174636820706172616d7300000000000000000000000060448201526064016104f3565b606c8054905f6109b48361188e565b9091555050606c545f908152606e6020526040902083906109ec82828135815560208201356001820155604082013560028201555050565b9050506040518060400160405280606b5442610a0891906118c5565b81525f6020918201819052606c548152606f82526040902082518155910151600190910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905533606c54604080518635815260208088013590820152818701359181019190915273ffffffffffffffffffffffffffffffffffffffff92909216917f66e5b37817dfa9935ab8e631ce7774a2e773d56cc8ea6815ac65f1fbac6420849060600160405180910390a35050606c54919050565b5f828152607060205260408120610ae290836112a3565b90505b92915050565b610af361160d565b5f81118015610b045750606b548114155b610b755760405162461bcd60e51b8152602060048201526024808201527f696e76616c6964206e65772070726f706f73616c20766f74696e67206475726160448201527f74696f6e0000000000000000000000000000000000000000000000000000000060648201526084016104f3565b606b80549082905560408051828152602081018490527ffe810823e41a0cf27003f3eac9c17098028ba0aece75bd9783a8da7f75fb3aa3910160405180910390a15050565b610bc261160d565b610bcb5f611674565b565b5f805f606c54841115610c225760405162461bcd60e51b815260206004820152601260248201527f696e76616c69642070726f706f73616c4944000000000000000000000000000060448201526064016104f3565b607154841015610c745760405162461bcd60e51b815260206004820152601060248201527f657870697265642070726f706f73616c0000000000000000000000000000000060448201526064016104f3565b606d54841015610cc65760405162461bcd60e51b815260206004820152600f60248201527f70726f706f73616c207072756e6564000000000000000000000000000000000060448201526064016104f3565b6071548403610cdd57506001915081905080610d1e565b5f848152606f602052604090206001810154905460ff909116908180610d01575080155b80610d0b57504281105b610d14876112f2565b8394509450945050505b9193909250565b6071548110610d9c5760405162461bcd60e51b815260206004820152603e60248201527f6f6e6c7920616c6c6f7720746f2064656c657465207468652070726f706f736160448201527f6c206265666f72206c6174657374207061737365642070726f706f73616c000060648201526084016104f3565b606d545b818111610e26575f818152606e6020908152604080832083815560018082018590556002909101849055606f83528184208481550180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560709091528120908181610e0f8282611736565b505050508080610e1e9061188e565b915050610da0565b50610e328160016118c5565b606d5550565b610e4061160d565b73ffffffffffffffffffffffffffffffffffffffff8116610ec95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104f3565b610ed281611674565b50565b5f54610100900460ff1615808015610ef357505f54600160ff909116105b80610f0c5750303b158015610f0c57505f5460ff166001145b610f7e5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104f3565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610fda575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff861661103d5760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964206f776e65722061646472657373000000000000000000000060448201526064016104f3565b5f851161108c5760405162461bcd60e51b815260206004820181905260248201527f696e76616c69642070726f706f73616c20766f74696e67206475726174696f6e60448201526064016104f3565b5f82116110db5760405162461bcd60e51b815260206004820152601460248201527f696e76616c696420726f6c6c75702065706f636800000000000000000000000060448201526064016104f3565b831515806110e857508215155b6111345760405162461bcd60e51b815260206004820152601460248201527f696e76616c696420626174636820706172616d7300000000000000000000000060448201526064016104f3565b61113d86611674565b606b85905560658490556067839055606982905542606a55604080515f8152602081018790527ffe810823e41a0cf27003f3eac9c17098028ba0aece75bd9783a8da7f75fb3aa3910160405180910390a1604080515f8152602081018690527fa044538eba1b21d23eb13fa35811ca9d1d7ff9ef1c81ee4dc594fca08412531b910160405180910390a1604080515f8152602081018590527fab2cb47d396c5d12c082ac9b6512d332af2767ca8e1fa5bcef40fa6970626569910160405180910390a1604080515f8152602081018490527f9b20ee151d057f4f3ece7fdf4ca1370cf143f181760e7712b722572f2dcba88f910160405180910390a1801561129b575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526001830160205260408120541515610ae2565b5f610ae28373ffffffffffffffffffffffffffffffffffffffff84166116ea565b5f807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166377d7dffb6040518163ffffffff1660e01b81526004015f60405180830381865afa15801561135c573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526113a19190810190611915565b90505f805b8251811015611406576113eb8382815181106113c4576113c46119f3565b602002602001015160705f8881526020019081526020015f206112a390919063ffffffff16565b156113fe576113fb8260016118c5565b91505b6001016113a6565b506003825160026114179190611a20565b6114219190611a37565b109392505050565b60718190555f818152606e60205260409020546065541461149d57606580545f838152606e60205260409081902054928390555190917fa044538eba1b21d23eb13fa35811ca9d1d7ff9ef1c81ee4dc594fca08412531b9161149391848252602082015260400190565b60405180910390a1505b5f818152606e60205260409020600101546067541461151257606780545f838152606e60205260409081902060010154928390555190917fab2cb47d396c5d12c082ac9b6512d332af2767ca8e1fa5bcef40fa69706265699161150891848252602082015260400190565b60405180910390a1505b5f818152606e60205260409020600201546069541461158657606980545f838152606e6020908152604091829020600201805490945542606a55925481518381529384015290917f9b20ee151d057f4f3ece7fdf4ca1370cf143f181760e7712b722572f2dcba88f910160405180910390a1505b5f818152606f6020908152604091829020600190810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690911790556065546067546069548451928352928201529182015281907fd31188695e1c2a2d02b755e14fa986aca41d391c337437b9159eaed8347e7f1c9060600160405180910390a250565b60335473ffffffffffffffffffffffffffffffffffffffff163314610bcb5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104f3565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f81815260018301602052604081205461172f57508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610ae5565b505f610ae5565b5080545f8255905f5260205f2090810190610ed291905b80821115611760575f815560010161174d565b5090565b5f60208284031215611774575f80fd5b5035919050565b5f6060828403121561178b575f80fd5b50919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610ed2575f80fd5b5f80604083850312156117c3575f80fd5b8235915060208301356117d581611791565b809150509250929050565b5f602082840312156117f0575f80fd5b81356117fb81611791565b9392505050565b5f805f805f60a08688031215611816575f80fd5b853561182181611791565b97602087013597506040870135966060810135965060800135945092505050565b5f60208284031215611852575f80fd5b815180151581146117fb575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036118be576118be611861565b5060010190565b80820180821115610ae557610ae5611861565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b805161191081611791565b919050565b5f6020808385031215611926575f80fd5b825167ffffffffffffffff8082111561193d575f80fd5b818501915085601f830112611950575f80fd5b815181811115611962576119626118d8565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811085821117156119a5576119a56118d8565b6040529182528482019250838101850191888311156119c2575f80fd5b938501935b828510156119e7576119d885611905565b845293850193928501926119c7565b98975050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8082028115828204841417610ae557610ae5611861565b5f82611a6a577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b50049056fea164736f6c6343000818000a +0x608060405234801561000f575f80fd5b5060043610610163575f3560e01c806377c79380116100c757806396dea9361161007d578063e5aec99511610063578063e5aec9951461036a578063f2fde38b14610373578063f92ad21914610386575f80fd5b806396dea936146102e3578063b511328d1461032c575f80fd5b806385963052116100ad57806385963052146102955780638da5cb5b1461029e5780638e21d5fb146102bc575f80fd5b806377c7938014610240578063807de44314610249575f80fd5b806349c1a5811161011c578063639661901161010257806363966190146101fd578063715018a61461020657806374c260cf1461020e575f80fd5b806349c1a581146101c75780635bcfadb5146101ea575f80fd5b8063132002fc1161014c578063132002fc1461018f578063237a4b96146101ab5780634428c1a4146101be575f80fd5b80630121b93f146101675780630d61b5191461017c575b5f80fd5b61017a6101753660046115d6565b610399565b005b61017a61018a3660046115d6565b610690565b610198606b5481565b6040519081526020015b60405180910390f35b6101986101b93660046115ed565b610744565b610198606a5481565b6101da6101d5366004611624565b610a34565b60405190151581526020016101a2565b61017a6101f83660046115d6565b610a54565b610198606c5481565b61017a610b23565b61022161021c3660046115d6565b610b36565b60408051931515845291151560208401521515908201526060016101a2565b61019860675481565b6102707f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a2565b61019860655481565b60335473ffffffffffffffffffffffffffffffffffffffff16610270565b6102707f000000000000000000000000000000000000000000000000000000000000000081565b6103116102f13660046115d6565b606e6020525f908152604090208054600182015460029092015490919083565b604080519384526020840192909252908201526060016101a2565b61035561033a3660046115d6565b606f6020525f90815260409020805460019091015460ff1682565b604080519283529015156020830152016101a2565b61019860695481565b61017a610381366004611652565b610c23565b61017a610394366004611674565b610cc0565b5f73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016636d46e987336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa15801561043e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061046291906116b4565b9050806104b65760405162461bcd60e51b815260206004820152601660248201527f6f6e6c792073657175656e63657220616c6c6f7765640000000000000000000060448201526064015b60405180910390fd5b606c548211156105085760405162461bcd60e51b815260206004820152601260248201527f696e76616c69642070726f706f73616c4944000000000000000000000000000060448201526064016104ad565b606d5482101561055a5760405162461bcd60e51b815260206004820152600f60248201527f70726f706f73616c207072756e6564000000000000000000000000000000000060448201526064016104ad565b5f828152606f60205260409020805460019091015460ff168061057b575080155b8061058557504281105b156105d25760405162461bcd60e51b815260206004820152601060248201527f766f74696e672068617320656e6465640000000000000000000000000000000060448201526064016104ad565b6105e9335f8581526070602052604090209061108e565b1561065c5760405162461bcd60e51b815260206004820152602960248201527f73657175656e63657220616c726561647920766f74656420666f72207468697360448201527f2070726f706f73616c000000000000000000000000000000000000000000000060648201526084016104ad565b610673335f858152607060205260409020906110bc565b5061067d836110dd565b1561068b5761068b83611214565b505050565b5f8061069b83610b36565b509150915081156106ee5760405162461bcd60e51b815260206004820152601060248201527f766f74696e672068617320656e6465640000000000000000000000000000000060448201526064016104ad565b8061073b5760405162461bcd60e51b815260206004820181905260248201527f70726f706f73616c20686173206e6f74206265656e207061737365642079657460448201526064016104ad565b61068b83611214565b5f8073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016636d46e987336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa1580156107ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061080e91906116b4565b90508061085d5760405162461bcd60e51b815260206004820152601660248201527f6f6e6c792073657175656e63657220616c6c6f7765640000000000000000000060448201526064016104ad565b82604001355f036108b05760405162461bcd60e51b815260206004820152601460248201527f696e76616c696420726f6c6c75702065706f636800000000000000000000000060448201526064016104ad565b82351515806108c25750602083013515155b61090e5760405162461bcd60e51b815260206004820152601460248201527f696e76616c696420626174636820706172616d7300000000000000000000000060448201526064016104ad565b606c8054905f61091d83611700565b9091555050606c545f908152606e60205260409020839061095582828135815560208201356001820155604082013560028201555050565b9050506040518060400160405280606b54426109719190611737565b81525f6020918201819052606c548152606f82526040902082518155910151600190910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905533606c54604080518635815260208088013590820152818701359181019190915273ffffffffffffffffffffffffffffffffffffffff92909216917f66e5b37817dfa9935ab8e631ce7774a2e773d56cc8ea6815ac65f1fbac6420849060600160405180910390a35050606c54919050565b5f828152607060205260408120610a4b908361108e565b90505b92915050565b610a5c61147f565b5f81118015610a6d5750606b548114155b610ade5760405162461bcd60e51b8152602060048201526024808201527f696e76616c6964206e65772070726f706f73616c20766f74696e67206475726160448201527f74696f6e0000000000000000000000000000000000000000000000000000000060648201526084016104ad565b606b80549082905560408051828152602081018490527ffe810823e41a0cf27003f3eac9c17098028ba0aece75bd9783a8da7f75fb3aa3910160405180910390a15050565b610b2b61147f565b610b345f6114e6565b565b5f805f606c54841115610b8b5760405162461bcd60e51b815260206004820152601260248201527f696e76616c69642070726f706f73616c4944000000000000000000000000000060448201526064016104ad565b606d54841015610bdd5760405162461bcd60e51b815260206004820152600f60248201527f70726f706f73616c207072756e6564000000000000000000000000000000000060448201526064016104ad565b5f848152606f602052604090206001810154905460ff909116908180610c01575080155b80610c0b57504281105b610c14876110dd565b90979096509194509092505050565b610c2b61147f565b73ffffffffffffffffffffffffffffffffffffffff8116610cb45760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104ad565b610cbd816114e6565b50565b5f54610100900460ff1615808015610cde57505f54600160ff909116105b80610cf75750303b158015610cf757505f5460ff166001145b610d695760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104ad565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610dc5575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff8616610e285760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964206f776e65722061646472657373000000000000000000000060448201526064016104ad565b5f8511610e775760405162461bcd60e51b815260206004820181905260248201527f696e76616c69642070726f706f73616c20766f74696e67206475726174696f6e60448201526064016104ad565b5f8211610ec65760405162461bcd60e51b815260206004820152601460248201527f696e76616c696420726f6c6c75702065706f636800000000000000000000000060448201526064016104ad565b83151580610ed357508215155b610f1f5760405162461bcd60e51b815260206004820152601460248201527f696e76616c696420626174636820706172616d7300000000000000000000000060448201526064016104ad565b610f28866114e6565b606b85905560658490556067839055606982905542606a55604080515f8152602081018790527ffe810823e41a0cf27003f3eac9c17098028ba0aece75bd9783a8da7f75fb3aa3910160405180910390a1604080515f8152602081018690527fa044538eba1b21d23eb13fa35811ca9d1d7ff9ef1c81ee4dc594fca08412531b910160405180910390a1604080515f8152602081018590527fab2cb47d396c5d12c082ac9b6512d332af2767ca8e1fa5bcef40fa6970626569910160405180910390a1604080515f8152602081018490527f9b20ee151d057f4f3ece7fdf4ca1370cf143f181760e7712b722572f2dcba88f910160405180910390a18015611086575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526001830160205260408120541515610a4b565b5f610a4b8373ffffffffffffffffffffffffffffffffffffffff841661155c565b5f807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166377d7dffb6040518163ffffffff1660e01b81526004015f60405180830381865afa158015611147573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261118c9190810190611787565b90505f805b82518110156111f1576111d68382815181106111af576111af611865565b602002602001015160705f8881526020019081526020015f2061108e90919063ffffffff16565b156111e9576111e6826001611737565b91505b600101611191565b506003825160026112029190611892565b61120c91906118a9565b109392505050565b5f818152606e60205260409020546065541461128357606580545f838152606e60205260409081902054928390555190917fa044538eba1b21d23eb13fa35811ca9d1d7ff9ef1c81ee4dc594fca08412531b9161127991848252602082015260400190565b60405180910390a1505b5f818152606e6020526040902060010154606754146112f857606780545f838152606e60205260409081902060010154928390555190917fab2cb47d396c5d12c082ac9b6512d332af2767ca8e1fa5bcef40fa6970626569916112ee91848252602082015260400190565b60405180910390a1505b5f818152606e60205260409020600201546069541461136c57606980545f838152606e6020908152604091829020600201805490945542606a55925481518381529384015290917f9b20ee151d057f4f3ece7fdf4ca1370cf143f181760e7712b722572f2dcba88f910160405180910390a1505b5f818152606f60205260409020600190810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169091179055606d545b8181101561142b575f818152606e6020908152604080832083815560018082018590556002909101849055606f83528184208481550180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556070909152812090818161141b82826115a8565b5050600190920191506113ab9050565b50606d8190556065546067546069546040805193845260208401929092529082015281907fd31188695e1c2a2d02b755e14fa986aca41d391c337437b9159eaed8347e7f1c9060600160405180910390a250565b60335473ffffffffffffffffffffffffffffffffffffffff163314610b345760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104ad565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f8181526001830160205260408120546115a157508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610a4e565b505f610a4e565b5080545f8255905f5260205f2090810190610cbd91905b808211156115d2575f81556001016115bf565b5090565b5f602082840312156115e6575f80fd5b5035919050565b5f606082840312156115fd575f80fd5b50919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610cbd575f80fd5b5f8060408385031215611635575f80fd5b82359150602083013561164781611603565b809150509250929050565b5f60208284031215611662575f80fd5b813561166d81611603565b9392505050565b5f805f805f60a08688031215611688575f80fd5b853561169381611603565b97602087013597506040870135966060810135965060800135945092505050565b5f602082840312156116c4575f80fd5b8151801515811461166d575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611730576117306116d3565b5060010190565b80820180821115610a4e57610a4e6116d3565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b805161178281611603565b919050565b5f6020808385031215611798575f80fd5b825167ffffffffffffffff808211156117af575f80fd5b818501915085601f8301126117c2575f80fd5b8151818111156117d4576117d461174a565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811085821117156118175761181761174a565b604052918252848201925083810185019188831115611834575f80fd5b938501935b828510156118595761184a85611777565b84529385019392850192611839565b98975050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8082028115828204841417610a4e57610a4e6116d3565b5f826118dc577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b50049056fea164736f6c6343000818000a diff --git a/bindings/bin/l1messagequeuewithgaspriceoracle_deployed.hex b/bindings/bin/l1messagequeuewithgaspriceoracle_deployed.hex index a0cd87ec7..262279f7c 100644 --- a/bindings/bin/l1messagequeuewithgaspriceoracle_deployed.hex +++ b/bindings/bin/l1messagequeuewithgaspriceoracle_deployed.hex @@ -1 +1 @@ -0x608060405234801561000f575f80fd5b5060043610610184575f3560e01c8063a85006ca116100dd578063d99bc80e11610088578063e3176bd511610063578063e3176bd51461037a578063f2fde38b14610383578063fd0ad31e14610396575f80fd5b8063d99bc80e1461033a578063da35a26f1461034d578063e172d3a114610360575f80fd5b8063bdc6f0a0116100b8578063bdc6f0a0146102ed578063c276067714610300578063d5ad4a9714610327575f80fd5b8063a85006ca146102b1578063ae453cd5146102ba578063bb7862ca146102cd575f80fd5b80635f9cd92e1161013d5780638da5cb5b116101185780638da5cb5b14610259578063927ede2d146102775780639b1597821461029e575f80fd5b80635f9cd92e146101f2578063715018a6146102055780638770d7071461020d575f80fd5b80633e4cbbe61161016d5780633e4cbbe6146101c35780635ad9945a146101d65780635e45da23146101e9575f80fd5b806329aa604b146101885780633c7f5283146101ae575b5f80fd5b61019b610196366004611173565b61039e565b6040519081526020015b60405180910390f35b6101c16101bc36600461118a565b6103bd565b005b61019b6101d13660046111cd565b61052e565b61019b6101e436600461123a565b6105e2565b61019b60685481565b6101c16102003660046112b6565b6107d2565b6101c1610867565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a5565b60335473ffffffffffffffffffffffffffffffffffffffff16610234565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b6101c16102ac3660046112cf565b61087a565b61019b60675481565b61019b6102c8366004611173565b61095c565b606b546102349073ffffffffffffffffffffffffffffffffffffffff1681565b6101c16102fb366004611325565b6109d2565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b6101c1610335366004611173565b610b03565b6101c1610348366004611173565b610b49565b6101c161035b366004611398565b610b8f565b61019b61036e3660046113c2565b60100261520801919050565b61019b60655481565b6101c16103913660046112b6565b610d48565b60665461019b565b606681815481106103ad575f80fd5b5f91825260209091200154905081565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146104475760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c792063616c6c61626c652062792074686520726f6c6c7570000000000060448201526064015b60405180910390fd5b6101008111156104995760405162461bcd60e51b815260206004820152601560248201527f706f7020746f6f206d616e79206d657373616765730000000000000000000000604482015260640161043e565b81606754146104ea5760405162461bcd60e51b815260206004820152601460248201527f737461727420696e646578206d69736d61746368000000000000000000000000604482015260640161043e565b80820160675560408051838152602081018390527f3d48b97f20730c965868963266b0d25d8abe3f06babb60fc3b2b80c9e8907f2691015b60405180910390a15050565b606b546040517fefc7840100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301525f92169063efc7840190602401602060405180830381865afa15801561059c573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906105c09190611401565b156105cc57505f6105dc565b6065546105d99083611427565b90505b92915050565b5f607e8161068c565b5f816105f957506001919050565b5b811561060f5760089190911c906001016105fa565b919050565b80608083106001811461064c5761062a846105eb565b60808101835360018301925084816020036008021b835280830192505061066d565b848415166001811461066057848353610665565b608083535b506001820191505b509392505050565b806094815360609290921b60018301525060150190565b6005604051018061069f60018c83610614565b90506106ad60018983610614565b90506106b98982610675565b90506106c760018b83610614565b9050600186146001811461072f576038871060018114610714576106ea886105eb565b8060b701845360018401935088816020036008021b84528084019350508789843791870191610729565b87608001835360018301925087898437918701915b50610740565b61073d5f89355f1a84610614565b91505b5061074b8c82610675565b90508181035f80603883106001811461077e57610767846105eb565b60f78101600882021b851793506001019150610789565b8360c0019250600191505b5086816008021b821791506001810190508060080292508451831c8284610100031b17915080850394505080845250508181038220925050508092505050979650505050505050565b6107da610de5565b606b5460405173ffffffffffffffffffffffffffffffffffffffff8084169216907ff91b2a410a89d46f14ee984a57e6d7892c217f116905371180998e20cef237e5905f90a3606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b61086f610de5565b6108785f610e4c565b565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146109255760405162461bcd60e51b815260206004820152602b60248201527f4f6e6c792063616c6c61626c6520627920746865204c3143726f7373446f6d6160448201527f696e4d657373656e676572000000000000000000000000000000000000000000606482015260840161043e565b610930838383610ec2565b337311110000000000000000000000000000000011110161095581865f878787610fbe565b5050505050565b6066545f9082106109af5760405162461bcd60e51b815260206004820152601a60248201527f6d65737361676520696e646578206f7574206f662072616e6765000000000000604482015260640161043e565b606682815481106109c2576109c2611463565b905f5260205f2001549050919050565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610a7d5760405162461bcd60e51b815260206004820152602660248201527f4f6e6c792063616c6c61626c652062792074686520456e666f7263656454784760448201527f6174657761790000000000000000000000000000000000000000000000000000606482015260840161043e565b73ffffffffffffffffffffffffffffffffffffffff86163b15610ae25760405162461bcd60e51b815260206004820152600860248201527f6f6e6c7920454f41000000000000000000000000000000000000000000000000604482015260640161043e565b610aed838383610ec2565b610afb868686868686610fbe565b505050505050565b610b0b610de5565b606880549082905560408051828152602081018490527fa030881e03ff723954dd0d35500564afab9603555d09d4456a32436f2b2373c59101610522565b610b51610de5565b606580549082905560408051828152602081018490527fc5271ba80b67178cc31f04a3755325121400925878dc608432b6fcaead3663299101610522565b5f54610100900460ff1615808015610bad57505f54600160ff909116105b80610bc65750303b158015610bc657505f5460ff166001145b610c385760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161043e565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610c94575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610c9c61106f565b6068839055606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790558015610d43575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610d50610de5565b73ffffffffffffffffffffffffffffffffffffffff8116610dd95760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161043e565b610de281610e4c565b50565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108785760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161043e565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b606854831115610f3a5760405162461bcd60e51b815260206004820152602560248201527f476173206c696d6974206d757374206e6f7420657863656564206d617847617360448201527f4c696d6974000000000000000000000000000000000000000000000000000000606482015260840161043e565b601081026152080180841015610fb85760405162461bcd60e51b815260206004820152603360248201527f496e73756666696369656e7420676173206c696d69742c206d7573742062652060448201527f61626f766520696e7472696e7369632067617300000000000000000000000000606482015260840161043e565b50505050565b6066545f610fd18883888a8989896105e2565b606680546001810182555f919091527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e943540181905560405190915073ffffffffffffffffffffffffffffffffffffffff80891691908a16907f69cfcb8e6d4192b8aba9902243912587f37e550d75c1fa801491fce26717f37e9061105d908a9087908b908b908b90611490565b60405180910390a35050505050505050565b5f54610100900460ff166110eb5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161043e565b6108785f54610100900460ff1661116a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161043e565b61087833610e4c565b5f60208284031215611183575f80fd5b5035919050565b5f806040838503121561119b575f80fd5b50508035926020909101359150565b803573ffffffffffffffffffffffffffffffffffffffff8116811461060f575f80fd5b5f80604083850312156111de575f80fd5b6111e7836111aa565b946020939093013593505050565b5f8083601f840112611205575f80fd5b50813567ffffffffffffffff81111561121c575f80fd5b602083019150836020828501011115611233575f80fd5b9250929050565b5f805f805f805f60c0888a031215611250575f80fd5b611259886111aa565b96506020880135955060408801359450611275606089016111aa565b93506080880135925060a088013567ffffffffffffffff811115611297575f80fd5b6112a38a828b016111f5565b989b979a50959850939692959293505050565b5f602082840312156112c6575f80fd5b6105d9826111aa565b5f805f80606085870312156112e2575f80fd5b6112eb856111aa565b935060208501359250604085013567ffffffffffffffff81111561130d575f80fd5b611319878288016111f5565b95989497509550505050565b5f805f805f8060a0878903121561133a575f80fd5b611343876111aa565b9550611351602088016111aa565b94506040870135935060608701359250608087013567ffffffffffffffff81111561137a575f80fd5b61138689828a016111f5565b979a9699509497509295939492505050565b5f80604083850312156113a9575f80fd5b823591506113b9602084016111aa565b90509250929050565b5f80602083850312156113d3575f80fd5b823567ffffffffffffffff8111156113e9575f80fd5b6113f5858286016111f5565b90969095509350505050565b5f60208284031215611411575f80fd5b81518015158114611420575f80fd5b9392505050565b80820281158282048414176105dc577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b85815267ffffffffffffffff8516602082015283604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010194935050505056fea164736f6c6343000818000a +0x608060405234801561000f575f80fd5b50600436106101a5575f3560e01c8063ae453cd5116100e8578063d99bc80e11610093578063e3176bd51161006e578063e3176bd5146103c2578063f2fde38b146103cb578063f7ca0c51146103de578063fd0ad31e146103fd575f80fd5b8063d99bc80e14610382578063da35a26f14610395578063e172d3a1146103a8575f80fd5b8063bdc6f0a0116100c3578063bdc6f0a014610335578063c276067714610348578063d5ad4a971461036f575f80fd5b8063ae453cd5146102fa578063b59b1a781461030d578063bb7862ca14610315575f80fd5b8063715018a6116101535780638dc73d871161012e5780638dc73d8714610298578063927ede2d146102b75780639b159782146102de578063a85006ca146102f1575f80fd5b8063715018a6146102265780638770d7071461022e5780638da5cb5b1461027a575f80fd5b80635ad9945a116101835780635ad9945a146101f75780635e45da231461020a5780635f9cd92e14610213575f80fd5b806329aa604b146101a95780633c7f5283146101cf5780633e4cbbe6146101e4575b5f80fd5b6101bc6101b7366004611229565b610405565b6040519081526020015b60405180910390f35b6101e26101dd366004611240565b610424565b005b6101bc6101f2366004611283565b610595565b6101bc6102053660046112f0565b610649565b6101bc60685481565b6101e261022136600461136c565b610839565b6101e26108ce565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c6565b60335473ffffffffffffffffffffffffffffffffffffffff16610255565b6101bc6102a6366004611229565b606c6020525f908152604090205481565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b6101e26102ec366004611385565b6108e1565b6101bc60675481565b6101bc610308366004611229565b6109c3565b6101bc610a39565b606b546102559073ffffffffffffffffffffffffffffffffffffffff1681565b6101e26103433660046113db565b610a7c565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b6101e261037d366004611229565b610bad565b6101e2610390366004611229565b610bf3565b6101e26103a336600461144e565b610c39565b6101bc6103b6366004611478565b60100261520801919050565b6101bc60655481565b6101e26103d936600461136c565b610df2565b6101bc6103ec366004611229565b5f908152606c602052604090205490565b6066546101bc565b60668181548110610414575f80fd5b5f91825260209091200154905081565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146104ae5760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c792063616c6c61626c652062792074686520726f6c6c7570000000000060448201526064015b60405180910390fd5b6101008111156105005760405162461bcd60e51b815260206004820152601560248201527f706f7020746f6f206d616e79206d65737361676573000000000000000000000060448201526064016104a5565b81606754146105515760405162461bcd60e51b815260206004820152601460248201527f737461727420696e646578206d69736d6174636800000000000000000000000060448201526064016104a5565b80820160675560408051838152602081018390527f3d48b97f20730c965868963266b0d25d8abe3f06babb60fc3b2b80c9e8907f2691015b60405180910390a15050565b606b546040517fefc7840100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301525f92169063efc7840190602401602060405180830381865afa158015610603573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061062791906114b7565b1561063357505f610643565b60655461064090836114dd565b90505b92915050565b5f607e816106f3565b5f8161066057506001919050565b5b81156106765760089190911c90600101610661565b919050565b8060808310600181146106b35761069184610652565b60808101835360018301925084816020036008021b83528083019250506106d4565b84841516600181146106c7578483536106cc565b608083535b506001820191505b509392505050565b806094815360609290921b60018301525060150190565b6005604051018061070660018c8361067b565b90506107146001898361067b565b905061072089826106dc565b905061072e60018b8361067b565b9050600186146001811461079657603887106001811461077b5761075188610652565b8060b701845360018401935088816020036008021b84528084019350508789843791870191610790565b87608001835360018301925087898437918701915b506107a7565b6107a45f89355f1a8461067b565b91505b506107b28c826106dc565b90508181035f8060388310600181146107e5576107ce84610652565b60f78101600882021b8517935060010191506107f0565b8360c0019250600191505b5086816008021b821791506001810190508060080292508451831c8284610100031b17915080850394505080845250508181038220925050508092505050979650505050505050565b610841610e8f565b606b5460405173ffffffffffffffffffffffffffffffffffffffff8084169216907ff91b2a410a89d46f14ee984a57e6d7892c217f116905371180998e20cef237e5905f90a3606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6108d6610e8f565b6108df5f610ef6565b565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff161461098c5760405162461bcd60e51b815260206004820152602b60248201527f4f6e6c792063616c6c61626c6520627920746865204c3143726f7373446f6d6160448201527f696e4d657373656e67657200000000000000000000000000000000000000000060648201526084016104a5565b610997838383610f6c565b33731111000000000000000000000000000000001111016109bc81865f878787611068565b5050505050565b6066545f908210610a165760405162461bcd60e51b815260206004820152601a60248201527f6d65737361676520696e646578206f7574206f662072616e676500000000000060448201526064016104a5565b60668281548110610a2957610a29611519565b905f5260205f2001549050919050565b6066546067545f91118015610a5d57506067545f908152606c602052604090205415155b15610a7757506067545f908152606c602052604090205490565b504290565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610b275760405162461bcd60e51b815260206004820152602660248201527f4f6e6c792063616c6c61626c652062792074686520456e666f7263656454784760448201527f617465776179000000000000000000000000000000000000000000000000000060648201526084016104a5565b73ffffffffffffffffffffffffffffffffffffffff86163b15610b8c5760405162461bcd60e51b815260206004820152600860248201527f6f6e6c7920454f4100000000000000000000000000000000000000000000000060448201526064016104a5565b610b97838383610f6c565b610ba5868686868686611068565b505050505050565b610bb5610e8f565b606880549082905560408051828152602081018490527fa030881e03ff723954dd0d35500564afab9603555d09d4456a32436f2b2373c59101610589565b610bfb610e8f565b606580549082905560408051828152602081018490527fc5271ba80b67178cc31f04a3755325121400925878dc608432b6fcaead3663299101610589565b5f54610100900460ff1615808015610c5757505f54600160ff909116105b80610c705750303b158015610c7057505f5460ff166001145b610ce25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104a5565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610d3e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610d46611125565b6068839055606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790558015610ded575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610dfa610e8f565b73ffffffffffffffffffffffffffffffffffffffff8116610e835760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104a5565b610e8c81610ef6565b50565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108df5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104a5565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b606854831115610fe45760405162461bcd60e51b815260206004820152602560248201527f476173206c696d6974206d757374206e6f7420657863656564206d617847617360448201527f4c696d697400000000000000000000000000000000000000000000000000000060648201526084016104a5565b6010810261520801808410156110625760405162461bcd60e51b815260206004820152603360248201527f496e73756666696369656e7420676173206c696d69742c206d7573742062652060448201527f61626f766520696e7472696e736963206761730000000000000000000000000060648201526084016104a5565b50505050565b6066545f61107b8883888a898989610649565b60668054600181019091557f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e94354018190555f838152606c6020526040908190204290555190915073ffffffffffffffffffffffffffffffffffffffff80891691908a16907f69cfcb8e6d4192b8aba9902243912587f37e550d75c1fa801491fce26717f37e90611113908a9087908b908b908b90611546565b60405180910390a35050505050505050565b5f54610100900460ff166111a15760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016104a5565b6108df5f54610100900460ff166112205760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016104a5565b6108df33610ef6565b5f60208284031215611239575f80fd5b5035919050565b5f8060408385031215611251575f80fd5b50508035926020909101359150565b803573ffffffffffffffffffffffffffffffffffffffff81168114610676575f80fd5b5f8060408385031215611294575f80fd5b61129d83611260565b946020939093013593505050565b5f8083601f8401126112bb575f80fd5b50813567ffffffffffffffff8111156112d2575f80fd5b6020830191508360208285010111156112e9575f80fd5b9250929050565b5f805f805f805f60c0888a031215611306575f80fd5b61130f88611260565b9650602088013595506040880135945061132b60608901611260565b93506080880135925060a088013567ffffffffffffffff81111561134d575f80fd5b6113598a828b016112ab565b989b979a50959850939692959293505050565b5f6020828403121561137c575f80fd5b61064082611260565b5f805f8060608587031215611398575f80fd5b6113a185611260565b935060208501359250604085013567ffffffffffffffff8111156113c3575f80fd5b6113cf878288016112ab565b95989497509550505050565b5f805f805f8060a087890312156113f0575f80fd5b6113f987611260565b955061140760208801611260565b94506040870135935060608701359250608087013567ffffffffffffffff811115611430575f80fd5b61143c89828a016112ab565b979a9699509497509295939492505050565b5f806040838503121561145f575f80fd5b8235915061146f60208401611260565b90509250929050565b5f8060208385031215611489575f80fd5b823567ffffffffffffffff81111561149f575f80fd5b6114ab858286016112ab565b90969095509350505050565b5f602082840312156114c7575f80fd5b815180151581146114d6575f80fd5b9392505050565b8082028115828204841417610643577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b85815267ffffffffffffffff8516602082015283604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010194935050505056fea164736f6c6343000818000a diff --git a/bindings/bin/l1staking_deployed.hex b/bindings/bin/l1staking_deployed.hex index d2d93e247..401476f33 100644 --- a/bindings/bin/l1staking_deployed.hex +++ b/bindings/bin/l1staking_deployed.hex @@ -1 +1 @@ -0x608060405260043610610303575f3560e01c80638142951a11610191578063ae81de53116100dc578063d51c90a911610087578063e2a6ad5f11610062578063e2a6ad5f1461092d578063f2fde38b1461094c578063f4fe7fef1461096b575f80fd5b8063d51c90a9146108a0578063dd4785f5146108b5578063df155033146108f6575f80fd5b8063c7cd469a116100b7578063c7cd469a14610843578063cde4cd1114610862578063d096c3c614610881575f80fd5b8063ae81de53146107ef578063affed0e01461080e578063bfa02ba914610824575f80fd5b80639b19251a1161013c578063a3066aab11610117578063a3066aab1461079c578063a4f209b0146107bb578063ab8c53dc146107da575f80fd5b80639b19251a1461072e5780639d48f4171461075c5780639fb82db914610788575f80fd5b80638da5cb5b1161016c5780638da5cb5b146106b05780639168ae72146106cd578063927ede2d146106fb575f80fd5b80638142951a1461063f578063831cfb581461065e5780638a565ac314610691575f80fd5b806343352d61116102515780636f1e8533116101fc578063797adbde116101d7578063797adbde146105b95780637a4e87c3146105d85780637a9262a214610613575f80fd5b80636f1e853314610560578063715018a61461057f57806374fe27b714610593575f80fd5b806352d472eb1161022c57806352d472eb146104fd5780636801579114610512578063692c565b14610531575f80fd5b806343352d61146104a857806345bc4d10146104c95780634d64903a146104e8575f80fd5b806335928991116102b15780633ccfd60b1161028c5780633ccfd60b1461046b5780633ee2a1f91461047f57806341de239b14610493575f80fd5b806335928991146103dc5780633a9bbede146103fb5780633cb747bf14610439575f80fd5b80632e407a6f116102e15780632e407a6f1461035a578063303afb9e14610386578063320ff860146103bd575f80fd5b80630d13fd7b146103075780632108db35146103305780632a28e5a314610345575b5f80fd5b348015610312575f80fd5b5061031d6101a65481565b6040519081526020015b60405180910390f35b34801561033b575f80fd5b5061031d609c5481565b6103586103533660046134c8565b61098a565b005b348015610365575f80fd5b5061031d610374366004613522565b6101a16020525f908152604090205481565b348015610391575f80fd5b506103a56103a0366004613542565b610d85565b6040516001600160a01b039091168152602001610327565b3480156103c8575f80fd5b506103586103d7366004613559565b610da4565b3480156103e7575f80fd5b506103586103f6366004613542565b6110bf565b348015610406575f80fd5b50610429610415366004613522565b609f6020525f908152604090205460ff1681565b6040519015158152602001610327565b348015610444575f80fd5b507f00000000000000000000000000000000000000000000000000000000000000006103a5565b348015610476575f80fd5b5061035861116c565b34801561048a575f80fd5b50610358611338565b34801561049e575f80fd5b5061031d60995481565b3480156104b3575f80fd5b506104bc61134a565b6040516103279190613601565b3480156104d4575f80fd5b5061031d6104e3366004613542565b611390565b3480156104f3575f80fd5b5061031d60985481565b348015610508575f80fd5b5061031d609a5481565b34801561051d575f80fd5b5061042961052c366004613522565b6116c9565b34801561053c575f80fd5b5061042961054b366004613542565b6101a46020525f908152604090205460ff1681565b34801561056b575f80fd5b5061042961057a366004613522565b611764565b34801561058a575f80fd5b506103586117dd565b34801561059e575f80fd5b506104296105ad366004613683565b60019695505050505050565b3480156105c4575f80fd5b506103a56105d3366004613542565b6117ee565b3480156105e3575f80fd5b506104296105f2366004613729565b80516020818301810180516101a38252928201919093012091525460ff1681565b34801561061e575f80fd5b5061031d61062d366004613522565b6101a56020525f908152604090205481565b34801561064a575f80fd5b50610358610659366004613763565b611817565b348015610669575f80fd5b506103a57f000000000000000000000000000000000000000000000000000000000000000081565b34801561069c575f80fd5b506103586106ab366004613542565b611cd9565b3480156106bb575f80fd5b506033546001600160a01b03166103a5565b3480156106d8575f80fd5b506106ec6106e7366004613522565b611d7c565b604051610327939291906137fe565b348015610706575f80fd5b506103a57f000000000000000000000000000000000000000000000000000000000000000081565b348015610739575f80fd5b50610429610748366004613522565b609e6020525f908152604090205460ff1681565b348015610767575f80fd5b5061077b610776366004613542565b611e2f565b6040516103279190613871565b348015610793575f80fd5b5061077b611f4c565b3480156107a7575f80fd5b506103586107b6366004613522565b6120fa565b3480156107c6575f80fd5b506103586107d5366004613542565b61222a565b3480156107e5575f80fd5b5061031d609d5481565b3480156107fa575f80fd5b50610358610809366004613542565b6122da565b348015610819575f80fd5b5061031d6101a75481565b34801561082f575f80fd5b506097546103a5906001600160a01b031681565b34801561084e575f80fd5b5061035861085d366004613883565b61237d565b34801561086d575f80fd5b5061035861087c366004613522565b61251e565b34801561088c575f80fd5b5061031d61089b366004613522565b61258c565b3480156108ab575f80fd5b5061031d609b5481565b3480156108c0575f80fd5b506108e46108cf366004613522565b61019f6020525f908152604090205460ff1681565b60405160ff9091168152602001610327565b348015610901575f80fd5b50610429610910366004613522565b6001600160a01b03165f9081526101a16020526040902054151590565b348015610938575f80fd5b5061031d6109473660046138ea565b612606565b348015610957575f80fd5b50610358610966366004613522565b612738565b348015610976575f80fd5b50610358610985366004613542565b6127c5565b335f818152609e602052604090205460ff166109ed5760405162461bcd60e51b815260206004820152601060248201527f6e6f7420696e2077686974656c6973740000000000000000000000000000000060448201526064015b60405180910390fd5b335f9081526101a260205260409020546001600160a01b031615610a535760405162461bcd60e51b815260206004820152601260248201527f616c72656164792072656769737465726564000000000000000000000000000060448201526064016109e4565b8215801590610a7157505f8381526101a4602052604090205460ff16155b610abd5760405162461bcd60e51b815260206004820152601960248201527f696e76616c69642074656e6465726d696e74207075626b65790000000000000060448201526064016109e4565b8151610100148015610af057506101a382604051610adb9190613929565b9081526040519081900360200190205460ff16155b610b3c5760405162461bcd60e51b815260206004820152601260248201527f696e76616c696420626c73207075626b6579000000000000000000000000000060448201526064016109e4565b6098543414610b8d5760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964207374616b696e672076616c7565000000000000000000000060448201526064016109e4565b6040518060600160405280610b9f3390565b6001600160a01b03908116825260208083018790526040928301869052335f9081526101a28252839020845181547fffffffffffffffffffffffff00000000000000000000000000000000000000001693169290921782558301516001820155908201516002820190610c1290826139e0565b50905050610c25610c203390565b612868565b60016101a383604051610c389190613929565b90815260408051918290036020908101909220805493151560ff199485161790555f8681526101a49092529020805490911660011790557fb9c7babb56df9f2da4a30811a6c778e4e68af88b72712d56cf62c5516e20e199610c973390565b8484604051610ca8939291906137fe565b60405180910390a1335f9081526101a26020908152604091829020825160608101845281546001600160a01b03168152600182015492810192909252600281018054610d809484019190610cfb90613944565b80601f0160208091040260200160405190810160405280929190818152602001828054610d2790613944565b8015610d725780601f10610d4957610100808354040283529160200191610d72565b820191905f5260205f20905b815481529060010190602001808311610d5557829003601f168201915b505050505081525050612976565b505050565b60a08160ff8110610d94575f80fd5b01546001600160a01b0316905081565b610dac612ab7565b5f5b815181101561107b57610dd9828281518110610dcc57610dcc613ade565b60200260200101516116c9565b610e4b5760405162461bcd60e51b815260206004820152602160248201527f6f6e6c7920616374697665207374616b65722063616e2062652072656d6f766560448201527f640000000000000000000000000000000000000000000000000000000000000060648201526084016109e4565b6101a55f838381518110610e6157610e61613ade565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20545f14610ed75760405162461bcd60e51b815260206004820152600b60248201527f7769746864726177696e6700000000000000000000000000000000000000000060448201526064016109e4565b609954610ee49043613b38565b6101a55f848481518110610efa57610efa613ade565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2081905550610f47828281518110610f3a57610f3a613ade565b6020026020010151612b11565b818181518110610f5957610f59613ade565b60200260200101516001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d56101a55f858581518110610fa157610fa1613ade565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054604051610fd891815260200190565b60405180910390a2609e5f838381518110610ff557610ff5613ade565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81549060ff02191690556001609f5f84848151811061104257611042613ade565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101610dae565b507f3f446646c03e618be8238a586960d6d625f35c653cdca1ef59609993e8ed2c84816040516110ab9190613871565b60405180910390a16110bc81612c03565b50565b6110c7612ab7565b5f811180156110d957506101a6548114155b6111255760405162461bcd60e51b815260206004820152601f60248201527f696e76616c6964206368616c6c656e6765206465706f7369742076616c75650060448201526064016109e4565b6101a680549082905560408051828152602081018490527f36f971a40478225aeb80cfbf5e80306e8cb76d3bf7d56fdc5e490945cddb7d5591015b60405180910390a15050565b611175336116c9565b6111c15760405162461bcd60e51b815260206004820152601260248201527f6f6e6c7920616374697665207374616b6572000000000000000000000000000060448201526064016109e4565b335f9081526101a560205260409020541561121e5760405162461bcd60e51b815260206004820152600b60248201527f7769746864726177696e6700000000000000000000000000000000000000000060448201526064016109e4565b60995461122b9043613b38565b335f8181526101a5602052604090209190915561124790612b11565b335f8181526101a560209081526040918290205491519182527f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5910160405180910390a2335f908152609e60209081526040808320805460ff19908116909155609f83528184208054909116600190811790915581518181528083019092529091828101908036833701905050905033815f815181106112e9576112e9613ade565b60200260200101906001600160a01b031690816001600160a01b0316815250507f3f446646c03e618be8238a586960d6d625f35c653cdca1ef59609993e8ed2c84816040516110ab9190613871565b611340612ab7565b611348612d00565b565b611352613395565b60408051611fe08101918290529060a09060ff9082845b81546001600160a01b03168152600190910190602001808311611369575050505050905090565b6097545f906001600160a01b0316336001600160a01b0316146113f55760405162461bcd60e51b815260206004820152601460248201527f6f6e6c7920726f6c6c757020636f6e747261637400000000000000000000000060448201526064016109e4565b6113fd61301a565b5f61140783611e2f565b90505f805b82518110156115ec575f6001600160a01b031683828151811061143157611431613ade565b60200260200101516001600160a01b031603156115e4575f6101a55f85848151811061145f5761145f613ade565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205411156114e2576101a55f8483815181106114a3576114a3613ade565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f9055609854826114db9190613b38565b91506115e4565b61151c8382815181106114f7576114f7613ade565b60200260200101516001600160a01b03165f9081526101a16020526040902054151590565b6115e45760985461152d9083613b38565b9150611544838281518110610f3a57610f3a613ade565b609e5f84838151811061155957611559613ade565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81549060ff02191690556001609f5f8584815181106115a6576115a6613ade565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b60010161140c565b505f6064609a54836115fe9190613b4b565b6116089190613b62565b90506116148183613b9a565b609d5f8282546116249190613b38565b909155505060975461163f906001600160a01b031682613073565b7f654f4a61849f1b3ad10abb283d27f02d5fece7b820acc5a3b874713b58748b5a8360405161166e9190613871565b60405180910390a17f3f446646c03e618be8238a586960d6d625f35c653cdca1ef59609993e8ed2c84836040516116a59190613871565b60405180910390a16116b683612c03565b925050506116c46001606555565b919050565b6001600160a01b0381165f90815261019f602052604081205460ff1681036116f257505f919050565b6001600160a01b0382165f81815261019f602052604090205460a09061171d9060019060ff16613bad565b60ff1660ff811061173057611730613ade565b01546001600160a01b031614801561175e57506001600160a01b0382165f9081526101a16020526040902054155b92915050565b6001600160a01b0381165f90815261019f602052604081205460ff16810361178d57505f919050565b6001600160a01b0382165f81815261019f602052604090205460a0906117b89060019060ff16613bad565b60ff1660ff81106117cb576117cb613ade565b01546001600160a01b03161492915050565b6117e5612ab7565b6113485f613123565b6101a081815481106117fe575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f54610100900460ff161580801561183557505f54600160ff909116105b8061184e5750303b15801561184e57505f5460ff166001145b6118c05760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016109e4565b5f805460ff1916600117905580156118fe575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b0388166119545760405162461bcd60e51b815260206004820152601760248201527f696e76616c696420726f6c6c757020636f6e747261637400000000000000000060448201526064016109e4565b5f87116119a35760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964207374616b696e672076616c7565000000000000000000000060448201526064016109e4565b5f86116119f25760405162461bcd60e51b815260206004820152601f60248201527f696e76616c6964206368616c6c656e6765206465706f7369742076616c75650060448201526064016109e4565b5f8511611a415760405162461bcd60e51b815260206004820152601e60248201527f696e76616c6964207769746864726177616c206c6f636b20626c6f636b73000060448201526064016109e4565b5f8311611a905760405162461bcd60e51b815260206004820152601c60248201527f696e76616c696420676173206c696d697420616464207374616b65720000000060448201526064016109e4565b5f8211611adf5760405162461bcd60e51b815260206004820181905260248201527f696e76616c696420676173206c696d69742072656d6f7665207374616b65727360448201526064016109e4565b5f84118015611aef575060648411155b611b605760405162461bcd60e51b8152602060048201526024808201527f696e76616c6964206368616c6c656e676572207265776172642070657263656e60448201527f746167650000000000000000000000000000000000000000000000000000000060648201526084016109e4565b611b6861318c565b611b70613210565b609780547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038a16179055609a84905560988790556101a68690556099859055609b839055609c829055604080515f8152602081018590527f0ef80fb82bf5439b8591744c0fde771f5d93dce7a7970b1e9b7828cdc3970e9c910160405180910390a1604080515f8152602081018490527fdd4b37d1f14888147fe4be2cfaedcbf148fd07ececc856d0433241b8b6e4a7f7910160405180910390a1604080515f8152602081018690527fa46de936426e045703b2d34a292a19fde92b329018db8e0da750033876b655ba910160405180910390a18015611ccf575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b611ce1612ab7565b5f81118015611cf25750609c548114155b611d3e5760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964206e657720676173206c696d6974000000000000000000000060448201526064016109e4565b609c80549082905560408051828152602081018490527fdd4b37d1f14888147fe4be2cfaedcbf148fd07ececc856d0433241b8b6e4a7f79101611160565b6101a26020525f90815260409020805460018201546002830180546001600160a01b03909316939192611dae90613944565b80601f0160208091040260200160405190810160405280929190818152602001828054611dda90613944565b8015611e255780601f10611dfc57610100808354040283529160200191611e25565b820191905f5260205f20905b815481529060010190602001808311611e0857829003601f168201915b5050505050905083565b6060600182901c5f5b8115611e5f57611e49816001613b38565b9050611e56600183613b9a565b82169150611e38565b8067ffffffffffffffff811115611e7857611e786133fe565b604051908082528060200260200182016040528015611ea1578160200160208202803683370190505b5092505f60015b60ff8160ff1611611f4357600160ff82161b861615611f315760a0611ece600183613bad565b60ff1660ff8110611ee157611ee1613ade565b015485516001600160a01b0390911690869084908110611f0357611f03613ade565b6001600160a01b0390921660209283029190910190910152611f26826001613b38565b915082821015611f43575b80611f3b81613bc6565b915050611ea8565b50505050919050565b6040805160ff80825261200082019092526060915f91829160208201611fe0803683370190505090505f5b60ff81101561201b575f60a08260ff8110611f9457611f94613ade565b01546001600160a01b031614801590611fdc57506101a15f60a08360ff8110611fbf57611fbf613ade565b01546001600160a01b0316815260208101919091526040015f2054155b156120135782611feb81613be4565b935050600182828151811061200257612002613ade565b911515602092830291909101909101525b600101611f77565b505f8267ffffffffffffffff811115612036576120366133fe565b60405190808252806020026020018201604052801561205f578160200160208202803683370190505b5090505f805b60ff8110156120f05783818151811061208057612080613ade565b6020026020010151156120e85760a08160ff81106120a0576120a0613ade565b015483516001600160a01b03909116908490849081106120c2576120c2613ade565b6001600160a01b0390921660209283029190910190910152816120e481613be4565b9250505b600101612065565b5090949350505050565b61210261301a565b335f9081526101a5602052604090205461215e5760405162461bcd60e51b815260206004820152601460248201527f7769746864726177616c206e6f7420657869737400000000000000000000000060448201526064016109e4565b335f9081526101a560205260409020544310156121bd5760405162461bcd60e51b815260206004820152601160248201527f7769746864726177616c206c6f636b656400000000000000000000000000000060448201526064016109e4565b335f9081526101a560205260408120556121d5612d00565b604080516001600160a01b0383168152905133917f89309c9b2aeaffbdce717113df9427298b20448c05919bf889e05f8c3094254b919081900360200190a261222081609854613073565b6110bc6001606555565b612232612ab7565b5f81118015612242575060648111155b80156122505750609a548114155b61229c5760405162461bcd60e51b815260206004820152601960248201527f696e76616c6964207265776172642070657263656e746167650000000000000060448201526064016109e4565b609a80549082905560408051828152602081018490527fa46de936426e045703b2d34a292a19fde92b329018db8e0da750033876b655ba9101611160565b6122e2612ab7565b5f811180156122f35750609b548114155b61233f5760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964206e657720676173206c696d6974000000000000000000000060448201526064016109e4565b609b80549082905560408051828152602081018490527f0ef80fb82bf5439b8591744c0fde771f5d93dce7a7970b1e9b7828cdc3970e9c9101611160565b612385612ab7565b5f5b8381101561247d57609f5f8686848181106123a4576123a4613ade565b90506020020160208101906123b99190613522565b6001600160a01b0316815260208101919091526040015f205460ff16156124225760405162461bcd60e51b815260206004820152600f60248201527f696e2072656d6f766564206c697374000000000000000000000000000000000060448201526064016109e4565b6001609e5f87878581811061243957612439613ade565b905060200201602081019061244e9190613522565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055600101612387565b505f5b818110156124da57609e5f84848481811061249d5761249d613ade565b90506020020160208101906124b29190613522565b6001600160a01b0316815260208101919091526040015f20805460ff19169055600101612480565b507fe375867e538b40218c1b3db2ccceaf875eb073e38b510449e6088c1539ac8622848484846040516125109493929190613c55565b60405180910390a150505050565b612526612ab7565b61252e61301a565b609d5461253b8282613073565b5f609d55604080516001600160a01b0384168152602081018390527fa1fefb6c5328a92a416e321ed50997303fe7135fd88c28b0592b21ce42b5cdd9910160405180910390a1506110bc6001606555565b5f61259682611764565b6125e25760405162461bcd60e51b815260206004820152600e60248201527f696e76616c6964207374616b657200000000000000000000000000000000000060448201526064016109e4565b506001600160a01b03165f90815261019f6020526040902054600160ff9091161b90565b5f60ff8211156126585760405162461bcd60e51b815260206004820152601c60248201527f7374616b657273206c656e677468206f7574206f6620626f756e64730000000060448201526064016109e4565b5f5b828110156127315761268c84848381811061267757612677613ade565b905060200201602081019061057a9190613522565b6126d85760405162461bcd60e51b815260206004820152600e60248201527f696e76616c6964207374616b657200000000000000000000000000000000000060448201526064016109e4565b61019f5f8585848181106126ee576126ee613ade565b90506020020160208101906127039190613522565b6001600160a01b0316815260208101919091526040015f2054600160ff90911681901b92909217910161265a565b5092915050565b612740612ab7565b6001600160a01b0381166127bc5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109e4565b6110bc81613123565b6127cd612ab7565b5f811180156127de57506098548114155b61282a5760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964207374616b696e672076616c7565000000000000000000000060448201526064016109e4565b609880549082905560408051828152602081018490527f91e3ed304d49776a78bbe0df6bf7156f5433763621e5e728a3c2adfe7de743689101611160565b5f5b60ff8160ff16101561292d575f60a060ff80841690811061288d5761288d613ade565b01546001600160a01b031603612925578160a08260ff1660ff81106128b4576128b4613ade565b0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790556128f6816001613c86565b6001600160a01b03929092165f90815261019f60205260409020805460ff191660ff9093169290921790915550565b60010161286a565b5060405162461bcd60e51b815260206004820152600960248201527f736c6f742066756c6c000000000000000000000000000000000000000000000060448201526064016109e4565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b2267a7b7f00000000000000000000000000000000000000000000000000000000000000005f6101a754856040516024016129dd929190613c9f565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f7046529b00000000000000000000000000000000000000000000000000000000179052609b5490517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b168152612a739493929190600401613cdd565b5f604051808303815f87803b158015612a8a575f80fd5b505af1158015612a9c573d5f803e3d5ffd5b505050506101a7546001612ab09190613b38565b6101a75550565b6033546001600160a01b031633146113485760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109e4565b6001600160a01b0381165f9081526101a1602052604090205415612b775760405162461bcd60e51b815260206004820152601560248201527f616c726561647920696e2064656c6574654c697374000000000000000000000060448201526064016109e4565b6101a080546001810182555f919091527f7980fe0f714a613298681d64b7b8ffa7b148338dd52429f307d72798d5c317c40180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038316179055609954612be79043613b38565b6001600160a01b039091165f9081526101a16020526040902055565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b2267a7b7f00000000000000000000000000000000000000000000000000000000000000005f6101a75485604051602401612c6a929190613d15565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcce6cf9f00000000000000000000000000000000000000000000000000000000179052609c5490517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b168152612a739493929190600401613cdd565b5f5b6101a0548110156110bc575f6001600160a01b03166101a08281548110612d2b57612d2b613ade565b5f918252602090912001546001600160a01b031603612e66576101a15f6101a08381548110612d5c57612d5c613ade565b5f9182526020808320909101546001600160a01b031683528201929092526040018120556101a08054612d9190600190613b9a565b81548110612da157612da1613ade565b5f918252602090912001546101a080546001600160a01b039092169183908110612dcd57612dcd613ade565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506101a0805480612e0a57612e0a613d2d565b5f8281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055612d02565b436101a15f6101a08481548110612e7f57612e7f613ade565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054116130085760a0600161019f5f6101a08581548110612ec457612ec4613ade565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054612ef5919060ff16613bad565b60ff1660ff8110612f0857612f08613ade565b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556101a0805461019f915f9184908110612f4a57612f4a613ade565b5f9182526020808320909101546001600160a01b031683528201929092526040018120805460ff191690556101a080546101a292919084908110612f9057612f90613ade565b5f9182526020808320909101546001600160a01b03168352820192909252604001812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001681556001810182905590612fee60028301826133b4565b50506101a15f6101a08381548110612d5c57612d5c613ade565b8061301281613be4565b915050612d02565b60026065540361306c5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109e4565b6002606555565b8015613118575f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146130c2576040519150601f19603f3d011682016040523d82523d5f602084013e6130c7565b606091505b5050905080610d805760405162461bcd60e51b815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c6564000000000060448201526064016109e4565b5050565b6001606555565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff166132085760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109e4565b611348613294565b5f54610100900460ff1661328c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109e4565b611348613319565b5f54610100900460ff166133105760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109e4565b61134833613123565b5f54610100900460ff1661311c5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109e4565b60405180611fe0016040528060ff906020820280368337509192915050565b5080546133c090613944565b5f825580601f106133cf575050565b601f0160209004905f5260205f20908101906110bc91905b808211156133fa575f81556001016133e7565b5090565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715613454576134546133fe565b604052919050565b5f82601f83011261346b575f80fd5b813567ffffffffffffffff811115613485576134856133fe565b6134986020601f19601f8401160161342b565b8181528460208386010111156134ac575f80fd5b816020850160208301375f918101602001919091529392505050565b5f80604083850312156134d9575f80fd5b82359150602083013567ffffffffffffffff8111156134f6575f80fd5b6135028582860161345c565b9150509250929050565b80356001600160a01b03811681146116c4575f80fd5b5f60208284031215613532575f80fd5b61353b8261350c565b9392505050565b5f60208284031215613552575f80fd5b5035919050565b5f602080838503121561356a575f80fd5b823567ffffffffffffffff80821115613581575f80fd5b818501915085601f830112613594575f80fd5b8135818111156135a6576135a66133fe565b8060051b91506135b784830161342b565b81815291830184019184810190888411156135d0575f80fd5b938501935b838510156135f5576135e68561350c565b825293850193908501906135d5565b98975050505050505050565b611fe0810181835f5b60ff8110156136325781516001600160a01b031683526020928301929091019060010161360a565b50505092915050565b5f8083601f84011261364b575f80fd5b50813567ffffffffffffffff811115613662575f80fd5b6020830191508360208260051b850101111561367c575f80fd5b9250929050565b5f805f805f8060808789031215613698575f80fd5b86359550602087013567ffffffffffffffff808211156136b6575f80fd5b6136c28a838b0161363b565b90975095506040890135945060608901359150808211156136e1575f80fd5b818901915089601f8301126136f4575f80fd5b813581811115613702575f80fd5b8a6020828501011115613713575f80fd5b6020830194508093505050509295509295509295565b5f60208284031215613739575f80fd5b813567ffffffffffffffff81111561374f575f80fd5b61375b8482850161345c565b949350505050565b5f805f805f805f60e0888a031215613779575f80fd5b6137828861350c565b9960208901359950604089013598606081013598506080810135975060a0810135965060c00135945092505050565b5f5b838110156137cb5781810151838201526020016137b3565b50505f910152565b5f81518084526137ea8160208601602086016137b1565b601f01601f19169290920160200192915050565b6001600160a01b0384168152826020820152606060408201525f61382560608301846137d3565b95945050505050565b5f815180845260208085019450602084015f5b838110156138665781516001600160a01b031687529582019590820190600101613841565b509495945050505050565b602081525f61353b602083018461382e565b5f805f8060408587031215613896575f80fd5b843567ffffffffffffffff808211156138ad575f80fd5b6138b98883890161363b565b909650945060208701359150808211156138d1575f80fd5b506138de8782880161363b565b95989497509550505050565b5f80602083850312156138fb575f80fd5b823567ffffffffffffffff811115613911575f80fd5b61391d8582860161363b565b90969095509350505050565b5f825161393a8184602087016137b1565b9190910192915050565b600181811c9082168061395857607f821691505b60208210810361398f577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f821115610d8057805f5260205f20601f840160051c810160208510156139ba5750805b601f840160051c820191505b818110156139d9575f81556001016139c6565b5050505050565b815167ffffffffffffffff8111156139fa576139fa6133fe565b613a0e81613a088454613944565b84613995565b602080601f831160018114613a60575f8415613a2a5750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613ad6565b5f85815260208120601f198616915b82811015613a8e57888601518255948401946001909101908401613a6f565b5085821015613aca57878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b505060018460011b0185555b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561175e5761175e613b0b565b808202811582820484141761175e5761175e613b0b565b5f82613b95577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b8181038181111561175e5761175e613b0b565b60ff828116828216039081111561175e5761175e613b0b565b5f60ff821660ff8103613bdb57613bdb613b0b565b60010192915050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613c1457613c14613b0b565b5060010190565b8183525f60208085019450825f5b85811015613866576001600160a01b03613c428361350c565b1687529582019590820190600101613c29565b604081525f613c68604083018688613c1b565b8281036020840152613c7b818587613c1b565b979650505050505050565b60ff818116838216019081111561175e5761175e613b0b565b828152604060208201526001600160a01b038251166040820152602082015160608201525f60408301516060608084015261382560a08401826137d3565b6001600160a01b0385168152836020820152608060408201525f613d0460808301856137d3565b905082606083015295945050505050565b828152604060208201525f61375b604083018461382e565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea164736f6c6343000818000a +0x6080604052600436106102f8575f3560e01c80637a9262a211610191578063ab8c53dc116100dc578063d51c90a911610087578063e2a6ad5f11610062578063e2a6ad5f1461090c578063f2fde38b1461092b578063f4fe7fef1461094a575f80fd5b8063d51c90a91461087f578063dd4785f514610894578063df155033146108d5575f80fd5b8063c7cd469a116100b7578063c7cd469a14610822578063cde4cd1114610841578063d096c3c614610860575f80fd5b8063ab8c53dc146107cf578063ae81de53146107e4578063bfa02ba914610803575f80fd5b8063927ede2d1161013c5780639fb82db9116101175780639fb82db91461077d578063a3066aab14610791578063a4f209b0146107b0575f80fd5b8063927ede2d146106f05780639b19251a146107235780639d48f41714610751575f80fd5b80638a565ac31161016c5780638a565ac3146106865780638da5cb5b146106a55780639168ae72146106c2575f80fd5b80637a9262a2146106085780638142951a14610634578063831cfb5814610653575f80fd5b806341de239b11610251578063692c565b116101fc57806374fe27b7116101d757806374fe27b714610588578063797adbde146105ae5780637a4e87c3146105cd575f80fd5b8063692c565b146105265780636f1e853314610555578063715018a614610574575f80fd5b80634d64903a1161022c5780634d64903a146104dd57806352d472eb146104f25780636801579114610507575f80fd5b806341de239b1461048857806343352d611461049d57806345bc4d10146104be575f80fd5b8063320ff860116102b15780633cb747bf1161028c5780633cb747bf1461042e5780633ccfd60b146104605780633ee2a1f914610474575f80fd5b8063320ff860146103b257806335928991146103d15780633a9bbede146103f0575f80fd5b80632a28e5a3116102e15780632a28e5a31461033a5780632e407a6f1461034f578063303afb9e1461037b575f80fd5b80630d13fd7b146102fc5780632108db3514610325575b5f80fd5b348015610307575f80fd5b506103126101a65481565b6040519081526020015b60405180910390f35b348015610330575f80fd5b50610312609c5481565b61034d610348366004613407565b610969565b005b34801561035a575f80fd5b50610312610369366004613461565b6101a16020525f908152604090205481565b348015610386575f80fd5b5061039a610395366004613481565b610d64565b6040516001600160a01b03909116815260200161031c565b3480156103bd575f80fd5b5061034d6103cc366004613498565b610d83565b3480156103dc575f80fd5b5061034d6103eb366004613481565b61109e565b3480156103fb575f80fd5b5061041e61040a366004613461565b609f6020525f908152604090205460ff1681565b604051901515815260200161031c565b348015610439575f80fd5b507f000000000000000000000000000000000000000000000000000000000000000061039a565b34801561046b575f80fd5b5061034d61114b565b34801561047f575f80fd5b5061034d611317565b348015610493575f80fd5b5061031260995481565b3480156104a8575f80fd5b506104b1611329565b60405161031c9190613540565b3480156104c9575f80fd5b506103126104d8366004613481565b61136f565b3480156104e8575f80fd5b5061031260985481565b3480156104fd575f80fd5b50610312609a5481565b348015610512575f80fd5b5061041e610521366004613461565b611675565b348015610531575f80fd5b5061041e610540366004613481565b6101a46020525f908152604090205460ff1681565b348015610560575f80fd5b5061041e61056f366004613461565b611710565b34801561057f575f80fd5b5061034d611789565b348015610593575f80fd5b5061041e6105a23660046135c2565b60019695505050505050565b3480156105b9575f80fd5b5061039a6105c8366004613481565b61179a565b3480156105d8575f80fd5b5061041e6105e7366004613668565b80516020818301810180516101a38252928201919093012091525460ff1681565b348015610613575f80fd5b50610312610622366004613461565b6101a56020525f908152604090205481565b34801561063f575f80fd5b5061034d61064e3660046136a2565b6117c3565b34801561065e575f80fd5b5061039a7f000000000000000000000000000000000000000000000000000000000000000081565b348015610691575f80fd5b5061034d6106a0366004613481565b611c85565b3480156106b0575f80fd5b506033546001600160a01b031661039a565b3480156106cd575f80fd5b506106e16106dc366004613461565b611d28565b60405161031c9392919061373d565b3480156106fb575f80fd5b5061039a7f000000000000000000000000000000000000000000000000000000000000000081565b34801561072e575f80fd5b5061041e61073d366004613461565b609e6020525f908152604090205460ff1681565b34801561075c575f80fd5b5061077061076b366004613481565b611ddb565b60405161031c919061376d565b348015610788575f80fd5b50610770611ef8565b34801561079c575f80fd5b5061034d6107ab366004613461565b6120a6565b3480156107bb575f80fd5b5061034d6107ca366004613481565b6121d6565b3480156107da575f80fd5b50610312609d5481565b3480156107ef575f80fd5b5061034d6107fe366004613481565b612286565b34801561080e575f80fd5b5060975461039a906001600160a01b031681565b34801561082d575f80fd5b5061034d61083c3660046137b9565b612329565b34801561084c575f80fd5b5061034d61085b366004613461565b6124ca565b34801561086b575f80fd5b5061031261087a366004613461565b612538565b34801561088a575f80fd5b50610312609b5481565b34801561089f575f80fd5b506108c36108ae366004613461565b61019f6020525f908152604090205460ff1681565b60405160ff909116815260200161031c565b3480156108e0575f80fd5b5061041e6108ef366004613461565b6001600160a01b03165f9081526101a16020526040902054151590565b348015610917575f80fd5b50610312610926366004613820565b6125b2565b348015610936575f80fd5b5061034d610945366004613461565b6126e4565b348015610955575f80fd5b5061034d610964366004613481565b612771565b335f818152609e602052604090205460ff166109cc5760405162461bcd60e51b815260206004820152601060248201527f6e6f7420696e2077686974656c6973740000000000000000000000000000000060448201526064015b60405180910390fd5b335f9081526101a260205260409020546001600160a01b031615610a325760405162461bcd60e51b815260206004820152601260248201527f616c72656164792072656769737465726564000000000000000000000000000060448201526064016109c3565b8215801590610a5057505f8381526101a4602052604090205460ff16155b610a9c5760405162461bcd60e51b815260206004820152601960248201527f696e76616c69642074656e6465726d696e74207075626b65790000000000000060448201526064016109c3565b8151610100148015610acf57506101a382604051610aba919061385f565b9081526040519081900360200190205460ff16155b610b1b5760405162461bcd60e51b815260206004820152601260248201527f696e76616c696420626c73207075626b6579000000000000000000000000000060448201526064016109c3565b6098543414610b6c5760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964207374616b696e672076616c7565000000000000000000000060448201526064016109c3565b6040518060600160405280610b7e3390565b6001600160a01b03908116825260208083018790526040928301869052335f9081526101a28252839020845181547fffffffffffffffffffffffff00000000000000000000000000000000000000001693169290921782558301516001820155908201516002820190610bf1908261390f565b50905050610c04610bff3390565b612814565b60016101a383604051610c17919061385f565b90815260408051918290036020908101909220805493151560ff199485161790555f8681526101a49092529020805490911660011790557fb9c7babb56df9f2da4a30811a6c778e4e68af88b72712d56cf62c5516e20e199610c763390565b8484604051610c879392919061373d565b60405180910390a1335f9081526101a26020908152604091829020825160608101845281546001600160a01b03168152600182015492810192909252600281018054610d5f9484019190610cda9061387a565b80601f0160208091040260200160405190810160405280929190818152602001828054610d069061387a565b8015610d515780601f10610d2857610100808354040283529160200191610d51565b820191905f5260205f20905b815481529060010190602001808311610d3457829003601f168201915b505050505081525050612922565b505050565b60a08160ff8110610d73575f80fd5b01546001600160a01b0316905081565b610d8b612a4a565b5f5b815181101561105a57610db8828281518110610dab57610dab613a0d565b6020026020010151611675565b610e2a5760405162461bcd60e51b815260206004820152602160248201527f6f6e6c7920616374697665207374616b65722063616e2062652072656d6f766560448201527f640000000000000000000000000000000000000000000000000000000000000060648201526084016109c3565b6101a55f838381518110610e4057610e40613a0d565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f20545f14610eb65760405162461bcd60e51b815260206004820152600b60248201527f7769746864726177696e6700000000000000000000000000000000000000000060448201526064016109c3565b609954610ec39043613a67565b6101a55f848481518110610ed957610ed9613a0d565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2081905550610f26828281518110610f1957610f19613a0d565b6020026020010151612aa4565b818181518110610f3857610f38613a0d565b60200260200101516001600160a01b03167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d56101a55f858581518110610f8057610f80613a0d565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054604051610fb791815260200190565b60405180910390a2609e5f838381518110610fd457610fd4613a0d565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81549060ff02191690556001609f5f84848151811061102157611021613a0d565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055600101610d8d565b507f3f446646c03e618be8238a586960d6d625f35c653cdca1ef59609993e8ed2c848160405161108a919061376d565b60405180910390a161109b81612b96565b50565b6110a6612a4a565b5f811180156110b857506101a6548114155b6111045760405162461bcd60e51b815260206004820152601f60248201527f696e76616c6964206368616c6c656e6765206465706f7369742076616c75650060448201526064016109c3565b6101a680549082905560408051828152602081018490527f36f971a40478225aeb80cfbf5e80306e8cb76d3bf7d56fdc5e490945cddb7d5591015b60405180910390a15050565b61115433611675565b6111a05760405162461bcd60e51b815260206004820152601260248201527f6f6e6c7920616374697665207374616b6572000000000000000000000000000060448201526064016109c3565b335f9081526101a56020526040902054156111fd5760405162461bcd60e51b815260206004820152600b60248201527f7769746864726177696e6700000000000000000000000000000000000000000060448201526064016109c3565b60995461120a9043613a67565b335f8181526101a5602052604090209190915561122690612aa4565b335f8181526101a560209081526040918290205491519182527f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5910160405180910390a2335f908152609e60209081526040808320805460ff19908116909155609f83528184208054909116600190811790915581518181528083019092529091828101908036833701905050905033815f815181106112c8576112c8613a0d565b60200260200101906001600160a01b031690816001600160a01b0316815250507f3f446646c03e618be8238a586960d6d625f35c653cdca1ef59609993e8ed2c848160405161108a919061376d565b61131f612a4a565b611327612c8e565b565b6113316132d4565b60408051611fe08101918290529060a09060ff9082845b81546001600160a01b03168152600190910190602001808311611348575050505050905090565b6097545f906001600160a01b0316336001600160a01b0316146113d45760405162461bcd60e51b815260206004820152601460248201527f6f6e6c7920726f6c6c757020636f6e747261637400000000000000000000000060448201526064016109c3565b6113dc612f59565b5f6113e683611ddb565b90505f805b8251811015611598575f6101a55f85848151811061140b5761140b613a0d565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054111561148e576101a55f84838151811061144f5761144f613a0d565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f9055609854826114879190613a67565b9150611590565b6114c88382815181106114a3576114a3613a0d565b60200260200101516001600160a01b03165f9081526101a16020526040902054151590565b611590576098546114d99083613a67565b91506114f0838281518110610f1957610f19613a0d565b609e5f84838151811061150557611505613a0d565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81549060ff02191690556001609f5f85848151811061155257611552613a0d565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b6001016113eb565b505f6064609a54836115aa9190613a7a565b6115b49190613a91565b90506115c08183613ac9565b609d5f8282546115d09190613a67565b90915550506097546115eb906001600160a01b031682612fb2565b7f654f4a61849f1b3ad10abb283d27f02d5fece7b820acc5a3b874713b58748b5a8360405161161a919061376d565b60405180910390a17f3f446646c03e618be8238a586960d6d625f35c653cdca1ef59609993e8ed2c8483604051611651919061376d565b60405180910390a161166283612b96565b925050506116706001606555565b919050565b6001600160a01b0381165f90815261019f602052604081205460ff16810361169e57505f919050565b6001600160a01b0382165f81815261019f602052604090205460a0906116c99060019060ff16613adc565b60ff1660ff81106116dc576116dc613a0d565b01546001600160a01b031614801561170a57506001600160a01b0382165f9081526101a16020526040902054155b92915050565b6001600160a01b0381165f90815261019f602052604081205460ff16810361173957505f919050565b6001600160a01b0382165f81815261019f602052604090205460a0906117649060019060ff16613adc565b60ff1660ff811061177757611777613a0d565b01546001600160a01b03161492915050565b611791612a4a565b6113275f613062565b6101a081815481106117aa575f80fd5b5f918252602090912001546001600160a01b0316905081565b5f54610100900460ff16158080156117e157505f54600160ff909116105b806117fa5750303b1580156117fa57505f5460ff166001145b61186c5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016109c3565b5f805460ff1916600117905580156118aa575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b0388166119005760405162461bcd60e51b815260206004820152601760248201527f696e76616c696420726f6c6c757020636f6e747261637400000000000000000060448201526064016109c3565b5f871161194f5760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964207374616b696e672076616c7565000000000000000000000060448201526064016109c3565b5f861161199e5760405162461bcd60e51b815260206004820152601f60248201527f696e76616c6964206368616c6c656e6765206465706f7369742076616c75650060448201526064016109c3565b5f85116119ed5760405162461bcd60e51b815260206004820152601e60248201527f696e76616c6964207769746864726177616c206c6f636b20626c6f636b73000060448201526064016109c3565b5f8311611a3c5760405162461bcd60e51b815260206004820152601c60248201527f696e76616c696420676173206c696d697420616464207374616b65720000000060448201526064016109c3565b5f8211611a8b5760405162461bcd60e51b815260206004820181905260248201527f696e76616c696420676173206c696d69742072656d6f7665207374616b65727360448201526064016109c3565b5f84118015611a9b575060648411155b611b0c5760405162461bcd60e51b8152602060048201526024808201527f696e76616c6964206368616c6c656e676572207265776172642070657263656e60448201527f746167650000000000000000000000000000000000000000000000000000000060648201526084016109c3565b611b146130cb565b611b1c61314f565b609780547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038a16179055609a84905560988790556101a68690556099859055609b839055609c829055604080515f8152602081018590527f0ef80fb82bf5439b8591744c0fde771f5d93dce7a7970b1e9b7828cdc3970e9c910160405180910390a1604080515f8152602081018490527fdd4b37d1f14888147fe4be2cfaedcbf148fd07ececc856d0433241b8b6e4a7f7910160405180910390a1604080515f8152602081018690527fa46de936426e045703b2d34a292a19fde92b329018db8e0da750033876b655ba910160405180910390a18015611c7b575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b611c8d612a4a565b5f81118015611c9e5750609c548114155b611cea5760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964206e657720676173206c696d6974000000000000000000000060448201526064016109c3565b609c80549082905560408051828152602081018490527fdd4b37d1f14888147fe4be2cfaedcbf148fd07ececc856d0433241b8b6e4a7f7910161113f565b6101a26020525f90815260409020805460018201546002830180546001600160a01b03909316939192611d5a9061387a565b80601f0160208091040260200160405190810160405280929190818152602001828054611d869061387a565b8015611dd15780601f10611da857610100808354040283529160200191611dd1565b820191905f5260205f20905b815481529060010190602001808311611db457829003601f168201915b5050505050905083565b6060600182901c5f5b8115611e0b57611df5816001613a67565b9050611e02600183613ac9565b82169150611de4565b8067ffffffffffffffff811115611e2457611e2461333d565b604051908082528060200260200182016040528015611e4d578160200160208202803683370190505b5092505f60015b60ff8160ff1611611eef57600160ff82161b861615611edd5760a0611e7a600183613adc565b60ff1660ff8110611e8d57611e8d613a0d565b015485516001600160a01b0390911690869084908110611eaf57611eaf613a0d565b6001600160a01b0390921660209283029190910190910152611ed2826001613a67565b915082821015611eef575b80611ee781613af5565b915050611e54565b50505050919050565b6040805160ff80825261200082019092526060915f91829160208201611fe0803683370190505090505f5b60ff811015611fc7575f60a08260ff8110611f4057611f40613a0d565b01546001600160a01b031614801590611f8857506101a15f60a08360ff8110611f6b57611f6b613a0d565b01546001600160a01b0316815260208101919091526040015f2054155b15611fbf5782611f9781613b13565b9350506001828281518110611fae57611fae613a0d565b911515602092830291909101909101525b600101611f23565b505f8267ffffffffffffffff811115611fe257611fe261333d565b60405190808252806020026020018201604052801561200b578160200160208202803683370190505b5090505f805b60ff81101561209c5783818151811061202c5761202c613a0d565b6020026020010151156120945760a08160ff811061204c5761204c613a0d565b015483516001600160a01b039091169084908490811061206e5761206e613a0d565b6001600160a01b03909216602092830291909101909101528161209081613b13565b9250505b600101612011565b5090949350505050565b6120ae612f59565b335f9081526101a5602052604090205461210a5760405162461bcd60e51b815260206004820152601460248201527f7769746864726177616c206e6f7420657869737400000000000000000000000060448201526064016109c3565b335f9081526101a560205260409020544310156121695760405162461bcd60e51b815260206004820152601160248201527f7769746864726177616c206c6f636b656400000000000000000000000000000060448201526064016109c3565b335f9081526101a56020526040812055612181612c8e565b604080516001600160a01b0383168152905133917f89309c9b2aeaffbdce717113df9427298b20448c05919bf889e05f8c3094254b919081900360200190a26121cc81609854612fb2565b61109b6001606555565b6121de612a4a565b5f811180156121ee575060648111155b80156121fc5750609a548114155b6122485760405162461bcd60e51b815260206004820152601960248201527f696e76616c6964207265776172642070657263656e746167650000000000000060448201526064016109c3565b609a80549082905560408051828152602081018490527fa46de936426e045703b2d34a292a19fde92b329018db8e0da750033876b655ba910161113f565b61228e612a4a565b5f8111801561229f5750609b548114155b6122eb5760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964206e657720676173206c696d6974000000000000000000000060448201526064016109c3565b609b80549082905560408051828152602081018490527f0ef80fb82bf5439b8591744c0fde771f5d93dce7a7970b1e9b7828cdc3970e9c910161113f565b612331612a4a565b5f5b8381101561242957609f5f86868481811061235057612350613a0d565b90506020020160208101906123659190613461565b6001600160a01b0316815260208101919091526040015f205460ff16156123ce5760405162461bcd60e51b815260206004820152600f60248201527f696e2072656d6f766564206c697374000000000000000000000000000000000060448201526064016109c3565b6001609e5f8787858181106123e5576123e5613a0d565b90506020020160208101906123fa9190613461565b6001600160a01b0316815260208101919091526040015f20805460ff1916911515919091179055600101612333565b505f5b8181101561248657609e5f84848481811061244957612449613a0d565b905060200201602081019061245e9190613461565b6001600160a01b0316815260208101919091526040015f20805460ff1916905560010161242c565b507fe375867e538b40218c1b3db2ccceaf875eb073e38b510449e6088c1539ac8622848484846040516124bc9493929190613b8f565b60405180910390a150505050565b6124d2612a4a565b6124da612f59565b609d546124e78282612fb2565b5f609d55604080516001600160a01b0384168152602081018390527fa1fefb6c5328a92a416e321ed50997303fe7135fd88c28b0592b21ce42b5cdd9910160405180910390a15061109b6001606555565b5f61254282611710565b61258e5760405162461bcd60e51b815260206004820152600e60248201527f696e76616c6964207374616b657200000000000000000000000000000000000060448201526064016109c3565b506001600160a01b03165f90815261019f6020526040902054600160ff9091161b90565b5f60ff8211156126045760405162461bcd60e51b815260206004820152601c60248201527f7374616b657273206c656e677468206f7574206f6620626f756e64730000000060448201526064016109c3565b5f5b828110156126dd5761263884848381811061262357612623613a0d565b905060200201602081019061056f9190613461565b6126845760405162461bcd60e51b815260206004820152600e60248201527f696e76616c6964207374616b657200000000000000000000000000000000000060448201526064016109c3565b61019f5f85858481811061269a5761269a613a0d565b90506020020160208101906126af9190613461565b6001600160a01b0316815260208101919091526040015f2054600160ff90911681901b929092179101612606565b5092915050565b6126ec612a4a565b6001600160a01b0381166127685760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016109c3565b61109b81613062565b612779612a4a565b5f8111801561278a57506098548114155b6127d65760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964207374616b696e672076616c7565000000000000000000000060448201526064016109c3565b609880549082905560408051828152602081018490527f91e3ed304d49776a78bbe0df6bf7156f5433763621e5e728a3c2adfe7de74368910161113f565b5f5b60ff8160ff1610156128d9575f60a060ff80841690811061283957612839613a0d565b01546001600160a01b0316036128d1578160a08260ff1660ff811061286057612860613a0d565b0180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790556128a2816001613bc0565b6001600160a01b03929092165f90815261019f60205260409020805460ff191660ff9093169290921790915550565b600101612816565b5060405162461bcd60e51b815260206004820152600960248201527f736c6f742066756c6c000000000000000000000000000000000000000000000060448201526064016109c3565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b2267a7b7f00000000000000000000000000000000000000000000000000000000000000005f846040516024016129849190613bd9565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f6d454d5100000000000000000000000000000000000000000000000000000000179052609b5490517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b168152612a1a9493929190600401613c10565b5f604051808303815f87803b158015612a31575f80fd5b505af1158015612a43573d5f803e3d5ffd5b5050505050565b6033546001600160a01b031633146113275760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016109c3565b6001600160a01b0381165f9081526101a1602052604090205415612b0a5760405162461bcd60e51b815260206004820152601560248201527f616c726561647920696e2064656c6574654c697374000000000000000000000060448201526064016109c3565b6101a080546001810182555f919091527f7980fe0f714a613298681d64b7b8ffa7b148338dd52429f307d72798d5c317c40180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b038316179055609954612b7a9043613a67565b6001600160a01b039091165f9081526101a16020526040902055565b7f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663b2267a7b7f00000000000000000000000000000000000000000000000000000000000000005f84604051602401612bf8919061376d565b60408051601f198184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0be67fcc00000000000000000000000000000000000000000000000000000000179052609c5490517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b168152612a1a9493929190600401613c10565b5f5b6101a05481101561109b57436101a15f6101a08481548110612cb457612cb4613a0d565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205411612f475760a0600161019f5f6101a08581548110612cf957612cf9613a0d565b5f9182526020808320909101546001600160a01b03168352820192909252604001902054612d2a919060ff16613adc565b60ff1660ff8110612d3d57612d3d613a0d565b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556101a0805461019f915f9184908110612d7f57612d7f613a0d565b5f9182526020808320909101546001600160a01b031683528201929092526040018120805460ff191690556101a080546101a292919084908110612dc557612dc5613a0d565b5f9182526020808320909101546001600160a01b03168352820192909252604001812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001681556001810182905590612e2360028301826132f3565b50506101a15f6101a08381548110612e3d57612e3d613a0d565b5f9182526020808320909101546001600160a01b031683528201929092526040018120556101a08054612e7290600190613ac9565b81548110612e8257612e82613a0d565b5f918252602090912001546101a080546001600160a01b039092169183908110612eae57612eae613a0d565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506101a0805480612eeb57612eeb613c48565b5f8281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055019055612c90565b80612f5181613b13565b915050612c90565b600260655403612fab5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016109c3565b6002606555565b8015613057575f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613001576040519150601f19603f3d011682016040523d82523d5f602084013e613006565b606091505b5050905080610d5f5760405162461bcd60e51b815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c6564000000000060448201526064016109c3565b5050565b6001606555565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff166131475760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109c3565b6113276131d3565b5f54610100900460ff166131cb5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109c3565b611327613258565b5f54610100900460ff1661324f5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109c3565b61132733613062565b5f54610100900460ff1661305b5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016109c3565b60405180611fe0016040528060ff906020820280368337509192915050565b5080546132ff9061387a565b5f825580601f1061330e575050565b601f0160209004905f5260205f209081019061109b91905b80821115613339575f8155600101613326565b5090565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff811182821017156133935761339361333d565b604052919050565b5f82601f8301126133aa575f80fd5b813567ffffffffffffffff8111156133c4576133c461333d565b6133d76020601f19601f8401160161336a565b8181528460208386010111156133eb575f80fd5b816020850160208301375f918101602001919091529392505050565b5f8060408385031215613418575f80fd5b82359150602083013567ffffffffffffffff811115613435575f80fd5b6134418582860161339b565b9150509250929050565b80356001600160a01b0381168114611670575f80fd5b5f60208284031215613471575f80fd5b61347a8261344b565b9392505050565b5f60208284031215613491575f80fd5b5035919050565b5f60208083850312156134a9575f80fd5b823567ffffffffffffffff808211156134c0575f80fd5b818501915085601f8301126134d3575f80fd5b8135818111156134e5576134e561333d565b8060051b91506134f684830161336a565b818152918301840191848101908884111561350f575f80fd5b938501935b83851015613534576135258561344b565b82529385019390850190613514565b98975050505050505050565b611fe0810181835f5b60ff8110156135715781516001600160a01b0316835260209283019290910190600101613549565b50505092915050565b5f8083601f84011261358a575f80fd5b50813567ffffffffffffffff8111156135a1575f80fd5b6020830191508360208260051b85010111156135bb575f80fd5b9250929050565b5f805f805f80608087890312156135d7575f80fd5b86359550602087013567ffffffffffffffff808211156135f5575f80fd5b6136018a838b0161357a565b9097509550604089013594506060890135915080821115613620575f80fd5b818901915089601f830112613633575f80fd5b813581811115613641575f80fd5b8a6020828501011115613652575f80fd5b6020830194508093505050509295509295509295565b5f60208284031215613678575f80fd5b813567ffffffffffffffff81111561368e575f80fd5b61369a8482850161339b565b949350505050565b5f805f805f805f60e0888a0312156136b8575f80fd5b6136c18861344b565b9960208901359950604089013598606081013598506080810135975060a0810135965060c00135945092505050565b5f5b8381101561370a5781810151838201526020016136f2565b50505f910152565b5f81518084526137298160208601602086016136f0565b601f01601f19169290920160200192915050565b6001600160a01b0384168152826020820152606060408201525f6137646060830184613712565b95945050505050565b602080825282518282018190525f9190848201906040850190845b818110156137ad5783516001600160a01b031683529284019291840191600101613788565b50909695505050505050565b5f805f80604085870312156137cc575f80fd5b843567ffffffffffffffff808211156137e3575f80fd5b6137ef8883890161357a565b90965094506020870135915080821115613807575f80fd5b506138148782880161357a565b95989497509550505050565b5f8060208385031215613831575f80fd5b823567ffffffffffffffff811115613847575f80fd5b6138538582860161357a565b90969095509350505050565b5f82516138708184602087016136f0565b9190910192915050565b600181811c9082168061388e57607f821691505b6020821081036138c5577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f821115610d5f57805f5260205f20601f840160051c810160208510156138f05750805b601f840160051c820191505b81811015612a43575f81556001016138fc565b815167ffffffffffffffff8111156139295761392961333d565b61393d81613937845461387a565b846138cb565b602080601f83116001811461398f575f84156139595750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b178555613a05565b5f85815260208120601f198616915b828110156139bd5788860151825594840194600190910190840161399e565b50858210156139f957878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b505060018460011b0185555b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561170a5761170a613a3a565b808202811582820484141761170a5761170a613a3a565b5f82613ac4577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b8181038181111561170a5761170a613a3a565b60ff828116828216039081111561170a5761170a613a3a565b5f60ff821660ff8103613b0a57613b0a613a3a565b60010192915050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613b4357613b43613a3a565b5060010190565b8183525f60208085019450825f5b85811015613b84576001600160a01b03613b718361344b565b1687529582019590820190600101613b58565b509495945050505050565b604081525f613ba2604083018688613b4a565b8281036020840152613bb5818587613b4a565b979650505050505050565b60ff818116838216019081111561170a5761170a613a3a565b602081526001600160a01b038251166020820152602082015160408201525f604083015160608084015261369a6080840182613712565b6001600160a01b0385168152836020820152608060408201525f613c376080830185613712565b905082606083015295945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea164736f6c6343000818000a diff --git a/bindings/bin/l2staking_deployed.hex b/bindings/bin/l2staking_deployed.hex index d748c0f81..7eec59704 100644 --- a/bindings/bin/l2staking_deployed.hex +++ b/bindings/bin/l2staking_deployed.hex @@ -1 +1 @@ -0x608060405234801561000f575f80fd5b50600436106102ec575f3560e01c8063746c8ae111610192578063affed0e0116100e8578063e10911b111610093578063f2fde38b1161006e578063f2fde38b146106cf578063fad99f98146106e2578063fc6facc6146106ea575f80fd5b8063e10911b11461069e578063ed70b343146106a6578063f0261bc2146106c6575f80fd5b8063cce6cf9f116100c3578063cce6cf9f14610643578063d31d83d914610656578063d557714114610677575f80fd5b8063affed0e0146105f1578063b5d2e0dc146105fa578063c64814dd14610619575f80fd5b80638da5cb5b1161014857806391bd43a41161012357806391bd43a41461059e578063927ede2d146105bd57806396ab994d146105e4575f80fd5b80638da5cb5b146105445780638e21d5fb146105555780639168ae721461057c575f80fd5b80637b05afb5116101785780637b05afb5146104db578063831cfb58146104fa57806384d7d1d414610521575f80fd5b8063746c8ae1146104cb57806376671808146104d3575f80fd5b80633b8024211161024757806343352d61116101fd57806346cdc18a116101d857806346cdc18a146104a85780637046529b146104b0578063715018a6146104c3575f80fd5b806343352d611461047a578063439162b514610482578063459598a214610495575f80fd5b80633cb747bf1161022d5780633cb747bf146104065780633d9353fe1461044057806340b5c83714610467575f80fd5b80633b802421146103ea5780633c323a1b146103f3575f80fd5b8063174e31c4116102a75780632e787be3116102825780632e787be3146103ae57806330158eea146103b75780633385ccc2146103d7575f80fd5b8063174e31c41461037f57806319fac8fd146103925780632cc138be146103a5575f80fd5b80630eb573af116102d75780630eb573af1461032b5780630f3b70591461033e57806312a3e94714610376575f80fd5b806243b758146102f05780629c6f0c14610316575b5f80fd5b6103036102fe3660046145c5565b6106fd565b6040519081526020015b60405180910390f35b6103296103243660046145e0565b610723565b005b61032961033936600461462a565b610901565b61035161034c366004614641565b610a14565b604080516001600160a01b03909416845260208401929092529082015260600161030d565b610303609a5481565b61032961038d366004614641565b610a5c565b6103296103a036600461462a565b610bd4565b61030360985481565b61030360995481565b6103ca6103c53660046146b3565b610cf6565b60405161030d9190614753565b6103296103e53660046145c5565b610f1d565b610303609c5481565b610329610401366004614641565b611557565b7f00000000000000000000000000000000000000000000000000000000000000005b6040516001600160a01b03909116815260200161030d565b6104287f000000000000000000000000000000000000000000000000000000000000000081565b61032961047536600461462a565b611be6565b6103ca611cf9565b6103296104903660046147f9565b611f15565b6104286104a336600461462a565b612446565b609d54610303565b6103296104be3660046145e0565b61246e565b6103296125c8565b6103296125db565b6103036128cb565b6103036104e93660046145c5565b60a06020525f908152604090205481565b6104287f000000000000000000000000000000000000000000000000000000000000000081565b61053461052f3660046145c5565b61293f565b604051901515815260200161030d565b6033546001600160a01b0316610428565b6104287f000000000000000000000000000000000000000000000000000000000000000081565b61058f61058a3660046145c5565b612969565b60405161030d93929190614867565b6103036105ac3660046145c5565b60a16020525f908152604090205481565b6104287f000000000000000000000000000000000000000000000000000000000000000081565b6097546105349060ff1681565b61030360a55481565b6103036106083660046145c5565b609e6020525f908152604090205481565b610303610627366004614897565b60a360209081525f928352604080842090915290825290205481565b6103296106513660046148c3565b612a1b565b61066961066436600461490b565b612f87565b60405161030d929190614980565b6104287f000000000000000000000000000000000000000000000000000000000000000081565b610329613115565b6106b96106b43660046145c5565b613499565b60405161030d91906149a0565b610303609b5481565b6103296106dd3660046145c5565b61352f565b6103296135bc565b6103296106f83660046148c3565b61366a565b6001600160a01b0381165f90815260a26020526040812061071d90613a35565b92915050565b61072b613a3e565b8160a55481146107825760405162461bcd60e51b815260206004820152600d60248201527f696e76616c6964206e6f6e63650000000000000000000000000000000000000060448201526064015b60405180910390fd5b61078d836001614a2e565b60a555609e5f6107a060208501856145c5565b6001600160a01b03166001600160a01b031681526020019081526020015f20545f0361084257609d6107d560208401846145c5565b81546001810183555f9283526020808420909101805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039390931692909217909155609d5491609e91610828908601866145c5565b6001600160a01b0316815260208101919091526040015f20555b81609f5f61085360208401846145c5565b6001600160a01b0316815260208101919091526040015f206108758282614b5e565b50610885905060208301836145c5565b6001600160a01b03167f058ecb29c230cd5df283c89e996187ed521393fe4546cd1b097921c4b2de293d60208401356108c16040860186614a41565b6040516108d093929190614cc5565b60405180910390a260975460ff161580156108ef5750609954609d5411155b156108fc576108fc613a98565b505050565b610909613a3e565b5f8111801561091a57506099548114155b61098c5760405162461bcd60e51b815260206004820152602260248201527f696e76616c6964206e65772073657175656e63657220736574206d617820736960448201527f7a650000000000000000000000000000000000000000000000000000000000006064820152608401610779565b609980549082905560408051828152602081018490527f98b982a120d9be7d9c68d85a1aed8158d1d52e517175bfb3eb4280692f19b1ed910160405180910390a16097545f9060ff166109e157609d546109e5565b609c545b90505f60995482106109f9576099546109fb565b815b9050609b548114610a0e57610a0e613a98565b50505050565b60a4602052815f5260405f208181548110610a2d575f80fd5b5f9182526020909120600390910201805460018201546002909201546001600160a01b03909116935090915083565b610a64613c18565b6001600160a01b038216610b1a576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016635cf20c7b336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602481018490526044015f604051808303815f87803b158015610aff575f80fd5b505af1158015610b11573d5f803e3d5ffd5b50505050610bc6565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663996cba6883336040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03928316600482015291166024820152604481018490526064015f604051808303815f87803b158015610baf575f80fd5b505af1158015610bc1573d5f803e3d5ffd5b505050505b610bd06001606555565b5050565b335f908152609e6020526040902054610c2f5760405162461bcd60e51b815260206004820152601360248201527f6f6e6c79207374616b657220616c6c6f776564000000000000000000000000006044820152606401610779565b6014811115610c805760405162461bcd60e51b815260206004820152601260248201527f696e76616c696420636f6d6d697373696f6e00000000000000000000000000006044820152606401610779565b335f90815260a06020526040812082905560975460ff16610ca1575f610cb4565b610ca96128cb565b610cb4906001614a2e565b604080518481526020810183905291925033917f6e500db30ce535d38852e318f333e9be41a3fec6c65d234ebb06203c896db9a5910160405180910390a25050565b60605f8267ffffffffffffffff811115610d1257610d12614aa2565b604051908082528060200260200182016040528015610d5e57816020015b60408051606080820183525f808352602083015291810191909152815260200190600190039081610d305790505b5090505f5b83811015610f15576040518060600160405280609f5f888886818110610d8b57610d8b614d18565b9050602002016020810190610da091906145c5565b6001600160a01b03908116825260208083019390935260409091015f908120549091168352910190609f90888886818110610ddd57610ddd614d18565b9050602002016020810190610df291906145c5565b6001600160a01b03166001600160a01b031681526020019081526020015f20600101548152602001609f5f888886818110610e2f57610e2f614d18565b9050602002016020810190610e4491906145c5565b6001600160a01b03166001600160a01b031681526020019081526020015f206002018054610e7190614acf565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9d90614acf565b8015610ee85780601f10610ebf57610100808354040283529160200191610ee8565b820191905f5260205f20905b815481529060010190602001808311610ecb57829003601f168201915b5050505050815250828281518110610f0257610f02614d18565b6020908102919091010152600101610d63565b509392505050565b610f25613c18565b6001600160a01b0381165f90815260a360209081526040808320338452909152902054610f945760405162461bcd60e51b815260206004820152601660248201527f7374616b696e6720616d6f756e74206973207a65726f000000000000000000006044820152606401610779565b6001600160a01b0381165f908152609e60205260408120546097549015919060ff16610fc0575f610fd3565b610fc86128cb565b610fd3906001614a2e565b6097549091505f9060ff168015610fe8575082155b610ff25781610fff565b609a54610fff9083614a2e565b604080516060810182526001600160a01b038781168083525f81815260a36020908152858220338084528183528784208054848901908152888a018b815283875260a486528a87208054600180820183559189528789208c51600390920201805473ffffffffffffffffffffffffffffffffffffffff191691909b16178a558251908a015551600290980197909755908452908252829055925191815260a1909252928120805494955091936110b6908490614d45565b90915550506001600160a01b0385165f90815260a2602052604090206110dc9033613c78565b506001600160a01b0385165f908152609e602052604090205484158015611105575060975460ff165b80156111125750609c5481105b15611373576001600160a01b0386165f908152609e602052604081205461113b90600190614d45565b90505b6001609c5461114d9190614d45565b8110156113715760a15f609d838154811061116a5761116a614d18565b5f9182526020808320909101546001600160a01b031683528201929092526040018120549060a190609d61119f856001614a2e565b815481106111af576111af614d18565b5f9182526020808320909101546001600160a01b031683528201929092526040019020541115611369575f609d82815481106111ed576111ed614d18565b5f918252602090912001546001600160a01b03169050609d611210836001614a2e565b8154811061122057611220614d18565b5f91825260209091200154609d80546001600160a01b03909216918490811061124b5761124b614d18565b5f918252602090912001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039290921691909117905580609d61128e846001614a2e565b8154811061129e5761129e614d18565b5f918252602090912001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790556112de826001614a2e565b609e5f609d85815481106112f4576112f4614d18565b5f9182526020808320909101546001600160a01b03168352820192909252604001902055611323826002614a2e565b609e5f609d611333866001614a2e565b8154811061134357611343614d18565b5f9182526020808320909101546001600160a01b03168352820192909252604001902055505b60010161113e565b505b8415801561139657506001600160a01b0386165f90815260a16020526040902054155b156113b3576001609c5f8282546113ad9190614d45565b90915550505b6001600160a01b038681165f81815260a160205260408082205481517f7f683ee30000000000000000000000000000000000000000000000000000000081526004810194909452336024850152604484018990526064840152517f000000000000000000000000000000000000000000000000000000000000000090931692637f683ee392608480820193929182900301818387803b158015611454575f80fd5b505af1158015611466573d5f803e3d5ffd5b505050506114713390565b6001600160a01b0316866001600160a01b03167f92039db29d8c0a1aa1433fe109c69488c8c5e51b23c9de7d303ad80c1fef778c846020015187876040516114cc939291909283526020830191909152604082015260600190565b60405180910390a3841580156114e4575060975460ff165b80156114f25750609b548111155b80156115385750609b546001600160a01b0387165f908152609e602052604090205411806115385750609c546001600160a01b0387165f908152609e6020526040902054115b1561154557611545613a98565b50505050506115546001606555565b50565b6001600160a01b0382165f908152609e602052604090205482906115bd5760405162461bcd60e51b815260206004820152600a60248201527f6e6f74207374616b6572000000000000000000000000000000000000000000006044820152606401610779565b6115c5613c18565b5f82116116145760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964207374616b6520616d6f756e740000000000000000000000006044820152606401610779565b61161e3384613c93565b1561166b5760405162461bcd60e51b815260206004820152601660248201527f756e64656c65676174696f6e20756e636c61696d6564000000000000000000006044820152606401610779565b6001600160a01b0383165f90815260a3602090815260408083203384529091529020546116e95761169c3384613d1c565b156116e95760405162461bcd60e51b815260206004820152601060248201527f72657761726420756e636c61696d6564000000000000000000000000000000006044820152606401610779565b6001600160a01b0383165f90815260a1602052604081208054849290611710908490614a2e565b90915550506001600160a01b0383165f90815260a36020908152604080832033845290915281208054849290611747908490614a2e565b90915550506001600160a01b0383165f90815260a26020526040902061176d9033613dd1565b506001600160a01b0383165f90815260a160205260409020548290036117a5576001609c5f82825461179f9190614a2e565b90915550505b6001600160a01b0383165f908152609e602052604090205460975460ff1680156117cf5750600181115b15611a15575f6117e0600183614d45565b90505b8015611a135760a15f609d6117f9600185614d45565b8154811061180957611809614d18565b905f5260205f20015f9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020015f205460a15f609d848154811061185a5761185a614d18565b5f9182526020808320909101546001600160a01b031683528201929092526040019020541115611a01575f609d611892600184614d45565b815481106118a2576118a2614d18565b5f91825260209091200154609d80546001600160a01b03909216925090839081106118cf576118cf614d18565b5f918252602090912001546001600160a01b0316609d6118f0600185614d45565b8154811061190057611900614d18565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555080609d838154811061193f5761193f614d18565b5f9182526020822001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0393909316929092179091558290609e90609d611986600185614d45565b8154811061199657611996614d18565b5f9182526020808320909101546001600160a01b031683528201929092526040019020556119c5826001614a2e565b609e5f609d85815481106119db576119db614d18565b5f9182526020808320909101546001600160a01b03168352820192909252604001902055505b80611a0b81614d58565b9150506117e3565b505b6097545f9060ff16611a27575f611a3a565b611a2f6128cb565b611a3a906001614a2e565b6001600160a01b0386165f81815260a36020908152604080832033808552908352928190205481519081529182018990528181018590525193945090927fc4ad67bad2c1f682946a406d840f1b273f5cd5a53fcc1a03d078d92bfa2e07d09181900360600190a36001600160a01b038581165f81815260a360209081526040808320338085528184528285205486865260a18552838620548287529290945282517fb809af0f000000000000000000000000000000000000000000000000000000008152600481019690965260248601526044850187905260648501839052608485015290881460a4840152517f00000000000000000000000000000000000000000000000000000000000000009093169263b809af0f9260c480820193929182900301818387803b158015611b6e575f80fd5b505af1158015611b80573d5f803e3d5ffd5b50505050611b95611b8e3390565b3086613de5565b60975460ff168015611ba85750609b5482115b8015611bcd57506099546001600160a01b0386165f908152609e602052604090205411155b15611bda57611bda613a98565b50506108fc6001606555565b611bee613a3e565b60975460ff1615611c415760405162461bcd60e51b815260206004820152601660248201527f72657761726420616c72656164792073746172746564000000000000000000006044820152606401610779565b4281118015611c5a5750611c586201518082614d9a565b155b8015611c6857506098548114155b611cb45760405162461bcd60e51b815260206004820152601960248201527f696e76616c6964207265776172642073746172742074696d65000000000000006044820152606401610779565b609880549082905560408051828152602081018490527f91c38708087fb4ba51bd0e6a106cc1fbaf340479a2e81d18f2341e8c78f97555910160405180910390a15050565b609d546060905f9067ffffffffffffffff811115611d1957611d19614aa2565b604051908082528060200260200182016040528015611d6557816020015b60408051606080820183525f808352602083015291810191909152815260200190600190039081611d375790505b5090505f5b609d54811015611f0f576040518060600160405280609f5f609d8581548110611d9557611d95614d18565b5f9182526020808320909101546001600160a01b0390811684528382019490945260409092018120549092168352609d80549390910192609f92919086908110611de157611de1614d18565b905f5260205f20015f9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020015f20600101548152602001609f5f609d8581548110611e3a57611e3a614d18565b5f9182526020808320909101546001600160a01b0316835282019290925260400190206002018054611e6b90614acf565b80601f0160208091040260200160405190810160405280929190818152602001828054611e9790614acf565b8015611ee25780601f10611eb957610100808354040283529160200191611ee2565b820191905f5260205f20905b815481529060010190602001808311611ec557829003601f168201915b5050505050815250828281518110611efc57611efc614d18565b6020908102919091010152600101611d6a565b50919050565b5f54610100900460ff1615808015611f3357505f54600160ff909116105b80611f4c5750303b158015611f4c57505f5460ff166001145b611fbe5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610779565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561201a575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b0387166120705760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964206f776e6572206164647265737300000000000000000000006044820152606401610779565b5f86116120e55760405162461bcd60e51b815260206004820152602260248201527f73657175656e6365727353697a65206d7573742067726561746572207468616e60448201527f20300000000000000000000000000000000000000000000000000000000000006064820152608401610779565b5f85116121345760405162461bcd60e51b815260206004820152601c60248201527f696e76616c696420756e64656c65676174654c6f636b45706f636873000000006044820152606401610779565b428411801561214d575061214b6201518085614d9a565b155b6121995760405162461bcd60e51b815260206004820152601960248201527f696e76616c6964207265776172642073746172742074696d65000000000000006044820152606401610779565b816121e65760405162461bcd60e51b815260206004820152601760248201527f696e76616c696420696e697469616c207374616b6572730000000000000000006044820152606401610779565b6121ef8761404b565b6121f76140a9565b6099869055609a8590556098849055609b8290555f5b609b548110156123685783838281811061222957612229614d18565b905060200281019061223b9190614dad565b609f5f86868581811061225057612250614d18565b90506020028101906122629190614dad565b6122709060208101906145c5565b6001600160a01b0316815260208101919091526040015f206122928282614b5e565b905050609d8484838181106122a9576122a9614d18565b90506020028101906122bb9190614dad565b6122c99060208101906145c5565b8154600180820184555f938452602090932001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055612312908290614a2e565b609e5f86868581811061232757612327614d18565b90506020028101906123399190614dad565b6123479060208101906145c5565b6001600160a01b0316815260208101919091526040015f205560010161220d565b50604080515f8152602081018890527f98b982a120d9be7d9c68d85a1aed8158d1d52e517175bfb3eb4280692f19b1ed910160405180910390a1604080515f8152602081018690527f91c38708087fb4ba51bd0e6a106cc1fbaf340479a2e81d18f2341e8c78f97555910160405180910390a1801561243d575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b609d8181548110612455575f80fd5b5f918252602090912001546001600160a01b0316905081565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561255657507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015612527573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061254b9190614de9565b6001600160a01b0316145b61072b5760405162461bcd60e51b815260206004820152602c60248201527f7374616b696e673a206f6e6c79206f74686572207374616b696e6720636f6e7460448201527f7261637420616c6c6f77656400000000000000000000000000000000000000006064820152608401610779565b6125d0613a3e565b6125d95f61404b565b565b6125e3613a3e565b60985442101561265a5760405162461bcd60e51b8152602060048201526024808201527f63616e2774207374617274206265666f7265207265776172642073746172742060448201527f74696d65000000000000000000000000000000000000000000000000000000006064820152608401610779565b5f609c54116126ab5760405162461bcd60e51b815260206004820152600e60248201527f6e6f6e652063616e6469646174650000000000000000000000000000000000006044820152606401610779565b609780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091555b609d54811015612868575f5b8181101561285f5760a15f609d838154811061270457612704614d18565b905f5260205f20015f9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020015f205460a15f609d858154811061275557612755614d18565b5f9182526020808320909101546001600160a01b031683528201929092526040019020541115612857575f609d828154811061279357612793614d18565b5f91825260209091200154609d80546001600160a01b03909216925090849081106127c0576127c0614d18565b5f91825260209091200154609d80546001600160a01b0390921691849081106127eb576127eb614d18565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555080609d848154811061282a5761282a614d18565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550505b6001016126e6565b506001016126da565b505f5b609d548110156128c257612880816001614a2e565b609e5f609d848154811061289657612896614d18565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205560010161286b565b506125d9613a98565b5f60985442101561291e5760405162461bcd60e51b815260206004820152601960248201527f726577617264206973206e6f74207374617274656420796574000000000000006044820152606401610779565b62015180609854426129309190614d45565b61293a9190614e04565b905090565b6001600160a01b0381165f90815260a360209081526040808320338452909152812054151561071d565b609f6020525f90815260409020805460018201546002830180546001600160a01b0390931693919261299a90614acf565b80601f01602080910402602001604051908101604052809291908181526020018280546129c690614acf565b8015612a115780601f106129e857610100808354040283529160200191612a11565b820191905f5260205f20905b8154815290600101906020018083116129f457829003601f168201915b5050505050905083565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015612b0357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ad4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612af89190614de9565b6001600160a01b0316145b612b755760405162461bcd60e51b815260206004820152602c60248201527f7374616b696e673a206f6e6c79206f74686572207374616b696e6720636f6e7460448201527f7261637420616c6c6f77656400000000000000000000000000000000000000006064820152608401610779565b8260a5548114612bc75760405162461bcd60e51b815260206004820152600d60248201527f696e76616c6964206e6f6e6365000000000000000000000000000000000000006044820152606401610779565b612bd2846001614a2e565b60a5555f805b83811015612f3857609b54609e5f878785818110612bf857612bf8614d18565b9050602002016020810190612c0d91906145c5565b6001600160a01b03166001600160a01b031681526020019081526020015f205411612c3757600191505b5f609e5f878785818110612c4d57612c4d614d18565b9050602002016020810190612c6291906145c5565b6001600160a01b03166001600160a01b031681526020019081526020015f20541115612eba575f6001609e5f888886818110612ca057612ca0614d18565b9050602002016020810190612cb591906145c5565b6001600160a01b03166001600160a01b031681526020019081526020015f2054612cdf9190614d45565b90505b609d54612cf190600190614d45565b811015612dc357609d612d05826001614a2e565b81548110612d1557612d15614d18565b5f91825260209091200154609d80546001600160a01b039092169183908110612d4057612d40614d18565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506001609e5f609d8481548110612d8357612d83614d18565b5f9182526020808320909101546001600160a01b0316835282019290925260400181208054909190612db6908490614d45565b9091555050600101612ce2565b50609d805480612dd557612dd5614e17565b5f8281526020812082015f19908101805473ffffffffffffffffffffffffffffffffffffffff19169055909101909155609e90868684818110612e1a57612e1a614d18565b9050602002016020810190612e2f91906145c5565b6001600160a01b03166001600160a01b031681526020019081526020015f205f90555f60a15f878785818110612e6757612e67614d18565b9050602002016020810190612e7c91906145c5565b6001600160a01b03166001600160a01b031681526020019081526020015f20541115612eba576001609c5f828254612eb49190614d45565b90915550505b609f5f868684818110612ecf57612ecf614d18565b9050602002016020810190612ee491906145c5565b6001600160a01b0316815260208101919091526040015f908120805473ffffffffffffffffffffffffffffffffffffffff191681556001810182905590612f2e6002830182614567565b5050600101612bd8565b507f3511bf213f9290ba907e91e12a43e8471251e1879580ae5509292a3514c23f618484604051612f6a929190614e44565b60405180910390a18015612f8057612f80613a98565b5050505050565b5f60605f8411612fd95760405162461bcd60e51b815260206004820152601160248201527f696e76616c696420706167652073697a650000000000000000000000000000006044820152606401610779565b6001600160a01b0385165f90815260a260205260409020612ff990613a35565b91508367ffffffffffffffff81111561301457613014614aa2565b60405190808252806020026020018201604052801561303d578160200160208202803683370190505b5090505f61304b8486614e91565b90505f600161305a8682614a2e565b6130649088614e91565b61306e9190614d45565b905061307b600185614d45565b8111156130905761308d600185614d45565b90505b815f5b828211613109576130c7826130a781614ea8565b6001600160a01b038c165f90815260a2602052604090209094509061412d565b85826130d281614ea8565b9350815181106130e4576130e4614d18565b60200260200101906001600160a01b031690816001600160a01b031681525050613093565b50505050935093915050565b61311d613c18565b335f90815260a46020526040812054815b818110156134335760975460ff16158061317e575061314b6128cb565b335f90815260a46020526040902080548390811061316b5761316b614d18565b905f5260205f2090600302016002015411155b1561342157335f90815260a4602052604090208054829081106131a3576131a3614d18565b905f5260205f20906003020160010154836131be9190614a2e565b335f90815260a46020526040812080549295509091839081106131e3576131e3614d18565b5f91825260208220600390910201546001600160a01b0316915060a4816132073390565b6001600160a01b03166001600160a01b031681526020019081526020015f20838154811061323757613237614d18565b905f5260205f2090600302016002015490505f60a45f6132543390565b6001600160a01b03166001600160a01b031681526020019081526020015f20848154811061328457613284614d18565b905f5260205f2090600302016001015490506001856132a39190614d45565b84101561336857335f90815260a4602052604090206132c3600187614d45565b815481106132d3576132d3614d18565b905f5260205f20906003020160a45f6132e93390565b6001600160a01b03166001600160a01b031681526020019081526020015f20858154811061331957613319614d18565b5f91825260209091208254600390920201805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03909216919091178155600180830154908201556002918201549101555b335f90815260a46020526040902080548061338557613385614e17565b5f8281526020812060035f1990930192830201805473ffffffffffffffffffffffffffffffffffffffff19168155600181810183905560029091019190915591556133d09086614d45565b604080518481526020810184905291965033916001600160a01b038616917f921046659ea3b3b3f8e8fefd2bece3121b2d929ead94c696a75beedee477fdb6910160405180910390a350505061312e565b61342c816001614a2e565b905061312e565b505f82116134835760405162461bcd60e51b815260206004820152601760248201527f6e6f204d6f72706820746f6b656e20746f20636c61696d0000000000000000006044820152606401610779565b61348d3383614138565b50506125d96001606555565b6001600160a01b0381165f90815260a460209081526040808320805482518185028101850190935280835260609492939192909184015b82821015613524575f848152602090819020604080516060810182526003860290920180546001600160a01b03168352600180820154848601526002909101549183019190915290835290920191016134d0565b505050509050919050565b613537613a3e565b6001600160a01b0381166135b35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610779565b6115548161404b565b6135c4613c18565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663ac2ac640336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b0390911660048201526024015f604051808303815f87803b15801561364a575f80fd5b505af115801561365c573d5f803e3d5ffd5b505050506125d96001606555565b613672613a3e565b8260a55481146136c45760405162461bcd60e51b815260206004820152600d60248201527f696e76616c6964206e6f6e6365000000000000000000000000000000000000006044820152606401610779565b6136cf846001614a2e565b60a5555f805b83811015612f3857609b54609e5f8787858181106136f5576136f5614d18565b905060200201602081019061370a91906145c5565b6001600160a01b03166001600160a01b031681526020019081526020015f20541161373457600191505b5f609e5f87878581811061374a5761374a614d18565b905060200201602081019061375f91906145c5565b6001600160a01b03166001600160a01b031681526020019081526020015f205411156139b7575f6001609e5f88888681811061379d5761379d614d18565b90506020020160208101906137b291906145c5565b6001600160a01b03166001600160a01b031681526020019081526020015f20546137dc9190614d45565b90505b609d546137ee90600190614d45565b8110156138c057609d613802826001614a2e565b8154811061381257613812614d18565b5f91825260209091200154609d80546001600160a01b03909216918390811061383d5761383d614d18565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506001609e5f609d848154811061388057613880614d18565b5f9182526020808320909101546001600160a01b03168352820192909252604001812080549091906138b3908490614d45565b90915550506001016137df565b50609d8054806138d2576138d2614e17565b5f8281526020812082015f19908101805473ffffffffffffffffffffffffffffffffffffffff19169055909101909155609e9086868481811061391757613917614d18565b905060200201602081019061392c91906145c5565b6001600160a01b03166001600160a01b031681526020019081526020015f205f90555f60a15f87878581811061396457613964614d18565b905060200201602081019061397991906145c5565b6001600160a01b03166001600160a01b031681526020019081526020015f205411156139b7576001609c5f8282546139b19190614d45565b90915550505b609f5f8686848181106139cc576139cc614d18565b90506020020160208101906139e191906145c5565b6001600160a01b0316815260208101919091526040015f908120805473ffffffffffffffffffffffffffffffffffffffff191681556001810182905590613a2b6002830182614567565b50506001016136d5565b5f61071d825490565b6033546001600160a01b031633146125d95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610779565b60995460975460ff1615613abc57609954609c541015613ab75750609c545b613acd565b609954609d541015613acd5750609d545b5f8167ffffffffffffffff811115613ae757613ae7614aa2565b604051908082528060200260200182016040528015613b10578160200160208202803683370190505b5090505f5b82811015613b7d57609d8181548110613b3057613b30614d18565b905f5260205f20015f9054906101000a90046001600160a01b0316828281518110613b5d57613b5d614d18565b6001600160a01b0390921660209283029190910190910152600101613b15565b506040517f9b8201a40000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639b8201a490613be3908490600401614ec0565b5f604051808303815f87803b158015613bfa575f80fd5b505af1158015613c0c573d5f803e3d5ffd5b50509151609b55505050565b600260655403613c6a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610779565b6002606555565b6001606555565b5f613c8c836001600160a01b038416614396565b9392505050565b5f805b6001600160a01b0384165f90815260a46020526040902054811015613d13576001600160a01b038481165f90815260a46020526040902080549185169183908110613ce357613ce3614d18565b5f9182526020909120600390910201546001600160a01b031603613d0b57600191505061071d565b600101613c96565b505f9392505050565b6040517fde6ac9330000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015282811660248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063de6ac93390604401602060405180830381865afa158015613da5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613dc99190614ed2565b159392505050565b5f613c8c836001600160a01b038416614479565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015613e66573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e8a9190614ef1565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301528581166024830152604482018590529192507f0000000000000000000000000000000000000000000000000000000000000000909116906323b872dd906064016020604051808303815f875af1158015613f1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f409190614ed2565b506040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015613fc2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613fe69190614ef1565b90505f83118015613fff575082613ffd8383614d45565b145b612f805760405162461bcd60e51b815260206004820152601b60248201527f6d6f72706820746f6b656e207472616e73666572206661696c656400000000006044820152606401610779565b603380546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff166141255760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610779565b6125d96144c5565b5f613c8c8383614541565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa1580156141b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141dd9190614ef1565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152602482018590529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303815f875af1158015614267573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061428b9190614ed2565b506040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa15801561430d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143319190614ef1565b90505f8311801561434a5750826143488383614d45565b145b610a0e5760405162461bcd60e51b815260206004820152601b60248201527f6d6f72706820746f6b656e207472616e73666572206661696c656400000000006044820152606401610779565b5f8181526001830160205260408120548015614470575f6143b8600183614d45565b85549091505f906143cb90600190614d45565b905081811461442a575f865f0182815481106143e9576143e9614d18565b905f5260205f200154905080875f01848154811061440957614409614d18565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061443b5761443b614e17565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f90556001935050505061071d565b5f91505061071d565b5f8181526001830160205260408120546144be57508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561071d565b505f61071d565b5f54610100900460ff16613c715760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610779565b5f825f01828154811061455657614556614d18565b905f5260205f200154905092915050565b50805461457390614acf565b5f825580601f10614582575050565b601f0160209004905f5260205f209081019061155491905b808211156145ad575f815560010161459a565b5090565b6001600160a01b0381168114611554575f80fd5b5f602082840312156145d5575f80fd5b8135613c8c816145b1565b5f80604083850312156145f1575f80fd5b82359150602083013567ffffffffffffffff81111561460e575f80fd5b83016060818603121561461f575f80fd5b809150509250929050565b5f6020828403121561463a575f80fd5b5035919050565b5f8060408385031215614652575f80fd5b823561465d816145b1565b946020939093013593505050565b5f8083601f84011261467b575f80fd5b50813567ffffffffffffffff811115614692575f80fd5b6020830191508360208260051b85010111156146ac575f80fd5b9250929050565b5f80602083850312156146c4575f80fd5b823567ffffffffffffffff8111156146da575f80fd5b6146e68582860161466b565b90969095509350505050565b5f81518084525f5b81811015614716576020818501810151868301820152016146fa565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b838110156147eb578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0018552815180516001600160a01b03168452878101518885015286015160608785018190526147d7818601836146f2565b96890196945050509086019060010161477a565b509098975050505050505050565b5f805f805f8060a0878903121561480e575f80fd5b8635614819816145b1565b9550602087013594506040870135935060608701359250608087013567ffffffffffffffff811115614849575f80fd5b61485589828a0161466b565b979a9699509497509295939492505050565b6001600160a01b0384168152826020820152606060408201525f61488e60608301846146f2565b95945050505050565b5f80604083850312156148a8575f80fd5b82356148b3816145b1565b9150602083013561461f816145b1565b5f805f604084860312156148d5575f80fd5b83359250602084013567ffffffffffffffff8111156148f2575f80fd5b6148fe8682870161466b565b9497909650939450505050565b5f805f6060848603121561491d575f80fd5b8335614928816145b1565b95602085013595506040909401359392505050565b5f815180845260208085019450602084015f5b838110156149755781516001600160a01b031687529582019590820190600101614950565b509495945050505050565b828152604060208201525f614998604083018461493d565b949350505050565b602080825282518282018190525f919060409081850190868401855b828110156149f457815180516001600160a01b03168552868101518786015285015185850152606090930192908501906001016149bc565b5091979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561071d5761071d614a01565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614a74575f80fd5b83018035915067ffffffffffffffff821115614a8e575f80fd5b6020019150368190038213156146ac575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b600181811c90821680614ae357607f821691505b602082108103611f0f577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b601f8211156108fc57805f5260205f20601f840160051c81016020851015614b3f5750805b601f840160051c820191505b81811015612f80575f8155600101614b4b565b8135614b69816145b1565b6001600160a01b03811673ffffffffffffffffffffffffffffffffffffffff1983541617825550600160208084013560018401556002830160408501357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1863603018112614bd5575f80fd5b8501803567ffffffffffffffff811115614bed575f80fd5b8036038483011315614bfd575f80fd5b614c1181614c0b8554614acf565b85614b1a565b5f601f821160018114614c44575f8315614c2d57508382018601355b5f19600385901b1c1916600184901b178555614cba565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08516915b82811015614c9057868501890135825593880193908901908801614c71565b5084821015614cae575f1960f88660031b161c198885880101351681555b505060018360011b0185555b505050505050505050565b83815260406020820152816040820152818360608301375f818301606090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010192915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8181038181111561071d5761071d614a01565b5f81614d6657614d66614a01565b505f190190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82614da857614da8614d6d565b500690565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112614ddf575f80fd5b9190910192915050565b5f60208284031215614df9575f80fd5b8151613c8c816145b1565b5f82614e1257614e12614d6d565b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b60208082528181018390525f908460408401835b86811015614e86578235614e6b816145b1565b6001600160a01b031682529183019190830190600101614e58565b509695505050505050565b808202811582820484141761071d5761071d614a01565b5f5f198203614eb957614eb9614a01565b5060010190565b602081525f613c8c602083018461493d565b5f60208284031215614ee2575f80fd5b81518015158114613c8c575f80fd5b5f60208284031215614f01575f80fd5b505191905056fea164736f6c6343000818000a +0x608060405234801561000f575f80fd5b50600436106102cc575f3560e01c8063715018a61161017c578063927ede2d116100dd578063d557714111610093578063f0261bc21161006e578063f0261bc21461068a578063f2fde38b14610693578063fad99f98146106a6575f80fd5b8063d55771411461063b578063e10911b114610662578063ed70b3431461066a575f80fd5b8063b5d2e0dc116100c3578063b5d2e0dc146105d1578063c64814dd146105f0578063d31d83d91461061a575f80fd5b8063927ede2d1461059d57806396ab994d146105c4575f80fd5b806384d7d1d4116101325780638e21d5fb116101185780638e21d5fb146105355780639168ae721461055c57806391bd43a41461057e575f80fd5b806384d7d1d4146105015780638da5cb5b14610524575f80fd5b8063766718081161016257806376671808146104b35780637b05afb5146104bb578063831cfb58146104da575f80fd5b8063715018a6146104a3578063746c8ae1146104ab575f80fd5b80633385ccc21161023157806340b5c837116101e7578063459598a2116101c2578063459598a21461047557806346cdc18a146104885780636d454d5114610490575f80fd5b806340b5c8371461044757806343352d611461045a578063439162b514610462575f80fd5b80633c323a1b116102175780633c323a1b146103d35780633cb747bf146103e65780633d9353fe14610420575f80fd5b80633385ccc2146103b75780633b802421146103ca575f80fd5b8063174e31c4116102865780632cc138be1161026c5780632cc138be146103855780632e787be31461038e57806330158eea14610397575f80fd5b8063174e31c41461035f57806319fac8fd14610372575f80fd5b80630eb573af116102b65780630eb573af1461030b5780630f3b70591461031e57806312a3e94714610356575f80fd5b806243b758146102d05780630be67fcc146102f6575b5f80fd5b6102e36102de366004614148565b6106ae565b6040519081526020015b60405180910390f35b6103096103043660046141ab565b6106d4565b005b6103096103193660046141ea565b610bf9565b61033161032c366004614201565b610d0c565b604080516001600160a01b0390941684526020840192909252908201526060016102ed565b6102e3609a5481565b61030961036d366004614201565b610d54565b6103096103803660046141ea565b610ecc565b6102e360985481565b6102e360995481565b6103aa6103a53660046141ab565b610fee565b6040516102ed919061428c565b6103096103c5366004614148565b611215565b6102e3609c5481565b6103096103e1366004614201565b611870565b7f00000000000000000000000000000000000000000000000000000000000000005b6040516001600160a01b0390911681526020016102ed565b6104087f000000000000000000000000000000000000000000000000000000000000000081565b6103096104553660046141ea565b611f0a565b6103aa61201d565b610309610470366004614332565b612239565b6104086104833660046141ea565b612775565b609d546102e3565b61030961049e3660046143a0565b61279d565b610309612a6e565b610309612a81565b6102e3612d71565b6102e36104c9366004614148565b60a06020525f908152604090205481565b6104087f000000000000000000000000000000000000000000000000000000000000000081565b61051461050f366004614148565b612de5565b60405190151581526020016102ed565b6033546001600160a01b0316610408565b6104087f000000000000000000000000000000000000000000000000000000000000000081565b61056f61056a366004614148565b612e0f565b6040516102ed939291906143d7565b6102e361058c366004614148565b60a16020525f908152604090205481565b6104087f000000000000000000000000000000000000000000000000000000000000000081565b6097546105149060ff1681565b6102e36105df366004614148565b609e6020525f908152604090205481565b6102e36105fe366004614407565b60a360209081525f928352604080842090915290825290205481565b61062d61062836600461443e565b612ec1565b6040516102ed9291906144b3565b6104087f000000000000000000000000000000000000000000000000000000000000000081565b61030961303b565b61067d610678366004614148565b6133d5565b6040516102ed91906144d3565b6102e3609b5481565b6103096106a1366004614148565b61346b565b6103096134f8565b6001600160a01b0381165f90815260a2602052604081206106ce906135a6565b92915050565b336001600160a01b037f0000000000000000000000000000000000000000000000000000000000000000161480156107bc57507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa15801561078d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906107b19190614534565b6001600160a01b0316145b6108335760405162461bcd60e51b815260206004820152602c60248201527f7374616b696e673a206f6e6c79206f74686572207374616b696e6720636f6e7460448201527f7261637420616c6c6f776564000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5f805b82811015610bac57609b54609e5f8686858181106108565761085661454f565b905060200201602081019061086b9190614148565b6001600160a01b03166001600160a01b031681526020019081526020015f20541161089557600191505b5f609e5f8686858181106108ab576108ab61454f565b90506020020160208101906108c09190614148565b6001600160a01b03166001600160a01b031681526020019081526020015f20541115610b23575f6001609e5f8787868181106108fe576108fe61454f565b90506020020160208101906109139190614148565b6001600160a01b03166001600160a01b031681526020019081526020015f205461093d91906145a9565b90505b609d5461094f906001906145a9565b811015610a2157609d6109638260016145bc565b815481106109735761097361454f565b5f91825260209091200154609d80546001600160a01b03909216918390811061099e5761099e61454f565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506001609e5f609d84815481106109e1576109e161454f565b5f9182526020808320909101546001600160a01b0316835282019290925260400181208054909190610a149084906145a9565b9091555050600101610940565b50609d805480610a3357610a336145cf565b5f8281526020812082015f1990810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055909101909155609e90858584818110610a8357610a8361454f565b9050602002016020810190610a989190614148565b6001600160a01b03166001600160a01b031681526020019081526020015f205f90555f60a15f868685818110610ad057610ad061454f565b9050602002016020810190610ae59190614148565b6001600160a01b03166001600160a01b031681526020019081526020015f20541115610b23576001609c5f828254610b1d91906145a9565b90915550505b609f5f858584818110610b3857610b3861454f565b9050602002016020810190610b4d9190614148565b6001600160a01b0316815260208101919091526040015f90812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001681556001810182905590610ba260028301826140ea565b5050600101610836565b507f3511bf213f9290ba907e91e12a43e8471251e1879580ae5509292a3514c23f618383604051610bde9291906145fc565b60405180910390a18015610bf457610bf46135af565b505050565b610c0161372f565b5f81118015610c1257506099548114155b610c845760405162461bcd60e51b815260206004820152602260248201527f696e76616c6964206e65772073657175656e63657220736574206d617820736960448201527f7a65000000000000000000000000000000000000000000000000000000000000606482015260840161082a565b609980549082905560408051828152602081018490527f98b982a120d9be7d9c68d85a1aed8158d1d52e517175bfb3eb4280692f19b1ed910160405180910390a16097545f9060ff16610cd957609d54610cdd565b609c545b90505f6099548210610cf157609954610cf3565b815b9050609b548114610d0657610d066135af565b50505050565b60a4602052815f5260405f208181548110610d25575f80fd5b5f9182526020909120600390910201805460018201546002909201546001600160a01b03909116935090915083565b610d5c613789565b6001600160a01b038216610e12576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016635cf20c7b336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602481018490526044015f604051808303815f87803b158015610df7575f80fd5b505af1158015610e09573d5f803e3d5ffd5b50505050610ebe565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663996cba6883336040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03928316600482015291166024820152604481018490526064015f604051808303815f87803b158015610ea7575f80fd5b505af1158015610eb9573d5f803e3d5ffd5b505050505b610ec86001606555565b5050565b335f908152609e6020526040902054610f275760405162461bcd60e51b815260206004820152601360248201527f6f6e6c79207374616b657220616c6c6f77656400000000000000000000000000604482015260640161082a565b6014811115610f785760405162461bcd60e51b815260206004820152601260248201527f696e76616c696420636f6d6d697373696f6e0000000000000000000000000000604482015260640161082a565b335f90815260a06020526040812082905560975460ff16610f99575f610fac565b610fa1612d71565b610fac9060016145bc565b604080518481526020810183905291925033917f6e500db30ce535d38852e318f333e9be41a3fec6c65d234ebb06203c896db9a5910160405180910390a25050565b60605f8267ffffffffffffffff81111561100a5761100a614649565b60405190808252806020026020018201604052801561105657816020015b60408051606080820183525f8083526020830152918101919091528152602001906001900390816110285790505b5090505f5b8381101561120d576040518060600160405280609f5f8888868181106110835761108361454f565b90506020020160208101906110989190614148565b6001600160a01b03908116825260208083019390935260409091015f908120549091168352910190609f908888868181106110d5576110d561454f565b90506020020160208101906110ea9190614148565b6001600160a01b03166001600160a01b031681526020019081526020015f20600101548152602001609f5f8888868181106111275761112761454f565b905060200201602081019061113c9190614148565b6001600160a01b03166001600160a01b031681526020019081526020015f20600201805461116990614676565b80601f016020809104026020016040519081016040528092919081815260200182805461119590614676565b80156111e05780601f106111b7576101008083540402835291602001916111e0565b820191905f5260205f20905b8154815290600101906020018083116111c357829003601f168201915b50505050508152508282815181106111fa576111fa61454f565b602090810291909101015260010161105b565b509392505050565b61121d613789565b6001600160a01b0381165f90815260a36020908152604080832033845290915290205461128c5760405162461bcd60e51b815260206004820152601660248201527f7374616b696e6720616d6f756e74206973207a65726f00000000000000000000604482015260640161082a565b6001600160a01b0381165f908152609e60205260408120546097549015919060ff166112b8575f6112cb565b6112c0612d71565b6112cb9060016145bc565b6097549091505f9060ff1680156112e0575082155b6112ea57816112f7565b609a546112f790836145bc565b604080516060810182526001600160a01b038781168083525f81815260a36020908152858220338084528183528784208054848901908152888a018b815283875260a486528a87208054600180820183559189528789208c5160039092020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001691909b16178a558251908a015551600290980197909755908452908252829055925191815260a1909252928120805494955091936113b99084906145a9565b90915550506001600160a01b0385165f90815260a2602052604090206113df90336137e9565b506001600160a01b0385165f908152609e602052604090205484158015611408575060975460ff165b80156114155750609c5481105b1561168c576001600160a01b0386165f908152609e602052604081205461143e906001906145a9565b90505b6001609c5461145091906145a9565b81101561168a5760a15f609d838154811061146d5761146d61454f565b5f9182526020808320909101546001600160a01b031683528201929092526040018120549060a190609d6114a28560016145bc565b815481106114b2576114b261454f565b5f9182526020808320909101546001600160a01b031683528201929092526040019020541115611682575f609d82815481106114f0576114f061454f565b5f918252602090912001546001600160a01b03169050609d6115138360016145bc565b815481106115235761152361454f565b5f91825260209091200154609d80546001600160a01b03909216918490811061154e5761154e61454f565b5f91825260209091200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039290921691909117905580609d61159c8460016145bc565b815481106115ac576115ac61454f565b5f91825260209091200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790556115f78260016145bc565b609e5f609d858154811061160d5761160d61454f565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205561163c8260026145bc565b609e5f609d61164c8660016145bc565b8154811061165c5761165c61454f565b5f9182526020808320909101546001600160a01b03168352820192909252604001902055505b600101611441565b505b841580156116af57506001600160a01b0386165f90815260a16020526040902054155b156116cc576001609c5f8282546116c691906145a9565b90915550505b6001600160a01b038681165f81815260a160205260408082205481517f7f683ee30000000000000000000000000000000000000000000000000000000081526004810194909452336024850152604484018990526064840152517f000000000000000000000000000000000000000000000000000000000000000090931692637f683ee392608480820193929182900301818387803b15801561176d575f80fd5b505af115801561177f573d5f803e3d5ffd5b5050505061178a3390565b6001600160a01b0316866001600160a01b03167f92039db29d8c0a1aa1433fe109c69488c8c5e51b23c9de7d303ad80c1fef778c846020015187876040516117e5939291909283526020830191909152604082015260600190565b60405180910390a3841580156117fd575060975460ff165b801561180b5750609b548111155b80156118515750609b546001600160a01b0387165f908152609e602052604090205411806118515750609c546001600160a01b0387165f908152609e6020526040902054115b1561185e5761185e6135af565b505050505061186d6001606555565b50565b6001600160a01b0382165f908152609e602052604090205482906118d65760405162461bcd60e51b815260206004820152600a60248201527f6e6f74207374616b657200000000000000000000000000000000000000000000604482015260640161082a565b6118de613789565b5f821161192d5760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964207374616b6520616d6f756e74000000000000000000000000604482015260640161082a565b6119373384613804565b156119845760405162461bcd60e51b815260206004820152601660248201527f756e64656c65676174696f6e20756e636c61696d656400000000000000000000604482015260640161082a565b6001600160a01b0383165f90815260a360209081526040808320338452909152902054611a02576119b5338461388d565b15611a025760405162461bcd60e51b815260206004820152601060248201527f72657761726420756e636c61696d656400000000000000000000000000000000604482015260640161082a565b6001600160a01b0383165f90815260a1602052604081208054849290611a299084906145bc565b90915550506001600160a01b0383165f90815260a36020908152604080832033845290915281208054849290611a609084906145bc565b90915550506001600160a01b0383165f90815260a260205260409020611a869033613942565b506001600160a01b0383165f90815260a16020526040902054829003611abe576001609c5f828254611ab891906145bc565b90915550505b6001600160a01b0383165f908152609e602052604090205460975460ff168015611ae85750600181115b15611d39575f611af96001836145a9565b90505b8015611d375760a15f609d611b126001856145a9565b81548110611b2257611b2261454f565b905f5260205f20015f9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020015f205460a15f609d8481548110611b7357611b7361454f565b5f9182526020808320909101546001600160a01b031683528201929092526040019020541115611d25575f609d611bab6001846145a9565b81548110611bbb57611bbb61454f565b5f91825260209091200154609d80546001600160a01b0390921692509083908110611be857611be861454f565b5f918252602090912001546001600160a01b0316609d611c096001856145a9565b81548110611c1957611c1961454f565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555080609d8381548110611c5857611c5861454f565b5f918252602082200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0393909316929092179091558290609e90609d611caa6001856145a9565b81548110611cba57611cba61454f565b5f9182526020808320909101546001600160a01b03168352820192909252604001902055611ce98260016145bc565b609e5f609d8581548110611cff57611cff61454f565b5f9182526020808320909101546001600160a01b03168352820192909252604001902055505b80611d2f816146c1565b915050611afc565b505b6097545f9060ff16611d4b575f611d5e565b611d53612d71565b611d5e9060016145bc565b6001600160a01b0386165f81815260a36020908152604080832033808552908352928190205481519081529182018990528181018590525193945090927fc4ad67bad2c1f682946a406d840f1b273f5cd5a53fcc1a03d078d92bfa2e07d09181900360600190a36001600160a01b038581165f81815260a360209081526040808320338085528184528285205486865260a18552838620548287529290945282517fb809af0f000000000000000000000000000000000000000000000000000000008152600481019690965260248601526044850187905260648501839052608485015290881460a4840152517f00000000000000000000000000000000000000000000000000000000000000009093169263b809af0f9260c480820193929182900301818387803b158015611e92575f80fd5b505af1158015611ea4573d5f803e3d5ffd5b50505050611eb9611eb23390565b3086613956565b60975460ff168015611ecc5750609b5482115b8015611ef157506099546001600160a01b0386165f908152609e602052604090205411155b15611efe57611efe6135af565b5050610bf46001606555565b611f1261372f565b60975460ff1615611f655760405162461bcd60e51b815260206004820152601660248201527f72657761726420616c7265616479207374617274656400000000000000000000604482015260640161082a565b4281118015611f7e5750611f7c6201518082614703565b155b8015611f8c57506098548114155b611fd85760405162461bcd60e51b815260206004820152601960248201527f696e76616c6964207265776172642073746172742074696d6500000000000000604482015260640161082a565b609880549082905560408051828152602081018490527f91c38708087fb4ba51bd0e6a106cc1fbaf340479a2e81d18f2341e8c78f97555910160405180910390a15050565b609d546060905f9067ffffffffffffffff81111561203d5761203d614649565b60405190808252806020026020018201604052801561208957816020015b60408051606080820183525f80835260208301529181019190915281526020019060019003908161205b5790505b5090505f5b609d54811015612233576040518060600160405280609f5f609d85815481106120b9576120b961454f565b5f9182526020808320909101546001600160a01b0390811684528382019490945260409092018120549092168352609d80549390910192609f929190869081106121055761210561454f565b905f5260205f20015f9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020015f20600101548152602001609f5f609d858154811061215e5761215e61454f565b5f9182526020808320909101546001600160a01b031683528201929092526040019020600201805461218f90614676565b80601f01602080910402602001604051908101604052809291908181526020018280546121bb90614676565b80156122065780601f106121dd57610100808354040283529160200191612206565b820191905f5260205f20905b8154815290600101906020018083116121e957829003601f168201915b50505050508152508282815181106122205761222061454f565b602090810291909101015260010161208e565b50919050565b5f54610100900460ff161580801561225757505f54600160ff909116105b806122705750303b15801561227057505f5460ff166001145b6122e25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161082a565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561233e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b0387166123945760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964206f776e657220616464726573730000000000000000000000604482015260640161082a565b5f86116124095760405162461bcd60e51b815260206004820152602260248201527f73657175656e6365727353697a65206d7573742067726561746572207468616e60448201527f2030000000000000000000000000000000000000000000000000000000000000606482015260840161082a565b5f85116124585760405162461bcd60e51b815260206004820152601c60248201527f696e76616c696420756e64656c65676174654c6f636b45706f63687300000000604482015260640161082a565b4284118015612471575061246f6201518085614703565b155b6124bd5760405162461bcd60e51b815260206004820152601960248201527f696e76616c6964207265776172642073746172742074696d6500000000000000604482015260640161082a565b8161250a5760405162461bcd60e51b815260206004820152601760248201527f696e76616c696420696e697469616c207374616b657273000000000000000000604482015260640161082a565b61251387613bc3565b61251b613c2c565b6099869055609a8590556098849055609b8290555f5b609b548110156126975783838281811061254d5761254d61454f565b905060200281019061255f9190614716565b609f5f8686858181106125745761257461454f565b90506020028101906125869190614716565b612594906020810190614148565b6001600160a01b0316815260208101919091526040015f206125b682826147f7565b905050609d8484838181106125cd576125cd61454f565b90506020028101906125df9190614716565b6125ed906020810190614148565b8154600180820184555f93845260209093200180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03929092169190911790556126419082906145bc565b609e5f8686858181106126565761265661454f565b90506020028101906126689190614716565b612676906020810190614148565b6001600160a01b0316815260208101919091526040015f2055600101612531565b50604080515f8152602081018890527f98b982a120d9be7d9c68d85a1aed8158d1d52e517175bfb3eb4280692f19b1ed910160405180910390a1604080515f8152602081018690527f91c38708087fb4ba51bd0e6a106cc1fbaf340479a2e81d18f2341e8c78f97555910160405180910390a1801561276c575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b609d8181548110612784575f80fd5b5f918252602090912001546001600160a01b0316905081565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561288557507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015612856573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061287a9190614534565b6001600160a01b0316145b6128f75760405162461bcd60e51b815260206004820152602c60248201527f7374616b696e673a206f6e6c79206f74686572207374616b696e6720636f6e7460448201527f7261637420616c6c6f7765640000000000000000000000000000000000000000606482015260840161082a565b609e5f6129076020840184614148565b6001600160a01b03166001600160a01b031681526020019081526020015f20545f036129b457609d61293c6020830183614148565b81546001810183555f928352602080842090910180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b039390931692909217909155609d5491609e9161299a90850185614148565b6001600160a01b0316815260208101919091526040015f20555b80609f5f6129c56020840184614148565b6001600160a01b0316815260208101919091526040015f206129e782826147f7565b506129f790506020820182614148565b6001600160a01b03167f058ecb29c230cd5df283c89e996187ed521393fe4546cd1b097921c4b2de293d6020830135612a336040850185614752565b604051612a4293929190614969565b60405180910390a260975460ff16158015612a615750609954609d5411155b1561186d5761186d6135af565b612a7661372f565b612a7f5f613bc3565b565b612a8961372f565b609854421015612b005760405162461bcd60e51b8152602060048201526024808201527f63616e2774207374617274206265666f7265207265776172642073746172742060448201527f74696d6500000000000000000000000000000000000000000000000000000000606482015260840161082a565b5f609c5411612b515760405162461bcd60e51b815260206004820152600e60248201527f6e6f6e652063616e646964617465000000000000000000000000000000000000604482015260640161082a565b609780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091555b609d54811015612d0e575f5b81811015612d055760a15f609d8381548110612baa57612baa61454f565b905f5260205f20015f9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020015f205460a15f609d8581548110612bfb57612bfb61454f565b5f9182526020808320909101546001600160a01b031683528201929092526040019020541115612cfd575f609d8281548110612c3957612c3961454f565b5f91825260209091200154609d80546001600160a01b0390921692509084908110612c6657612c6661454f565b5f91825260209091200154609d80546001600160a01b039092169184908110612c9157612c9161454f565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555080609d8481548110612cd057612cd061454f565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550505b600101612b8c565b50600101612b80565b505f5b609d54811015612d6857612d268160016145bc565b609e5f609d8481548110612d3c57612d3c61454f565b5f9182526020808320909101546001600160a01b03168352820192909252604001902055600101612d11565b50612a7f6135af565b5f609854421015612dc45760405162461bcd60e51b815260206004820152601960248201527f726577617264206973206e6f7420737461727465642079657400000000000000604482015260640161082a565b6201518060985442612dd691906145a9565b612de091906149bc565b905090565b6001600160a01b0381165f90815260a36020908152604080832033845290915281205415156106ce565b609f6020525f90815260409020805460018201546002830180546001600160a01b03909316939192612e4090614676565b80601f0160208091040260200160405190810160405280929190818152602001828054612e6c90614676565b8015612eb75780601f10612e8e57610100808354040283529160200191612eb7565b820191905f5260205f20905b815481529060010190602001808311612e9a57829003601f168201915b5050505050905083565b5f60605f8411612f135760405162461bcd60e51b815260206004820152601160248201527f696e76616c696420706167652073697a65000000000000000000000000000000604482015260640161082a565b6001600160a01b0385165f90815260a260205260409020612f33906135a6565b91508367ffffffffffffffff811115612f4e57612f4e614649565b604051908082528060200260200182016040528015612f77578160200160208202803683370190505b5090505f612f8584866149cf565b90505f6001612f9486826145bc565b612f9e90886149cf565b612fa891906145a9565b9050612fb56001856145a9565b811115612fca57612fc76001856145a9565b90505b815b818111613030576001600160a01b0388165f90815260a260205260409020612ff49082613cb0565b8482815181106130065761300661454f565b6001600160a01b039092166020928302919091019091015280613028816149e6565b915050612fcc565b505050935093915050565b613043613789565b335f90815260a46020526040812054815b8181101561336f5760975460ff1615806130a45750613071612d71565b335f90815260a4602052604090208054839081106130915761309161454f565b905f5260205f2090600302016002015411155b1561335d57335f90815260a4602052604090208054829081106130c9576130c961454f565b905f5260205f20906003020160010154836130e491906145bc565b335f90815260a46020526040812080549295509091839081106131095761310961454f565b5f91825260208220600390910201546001600160a01b0316915060a48161312d3390565b6001600160a01b03166001600160a01b031681526020019081526020015f20838154811061315d5761315d61454f565b905f5260205f2090600302016002015490505f60a45f61317a3390565b6001600160a01b03166001600160a01b031681526020019081526020015f2084815481106131aa576131aa61454f565b905f5260205f2090600302016001015490506001856131c991906145a9565b84101561329957335f90815260a4602052604090206131e96001876145a9565b815481106131f9576131f961454f565b905f5260205f20906003020160a45f61320f3390565b6001600160a01b03166001600160a01b031681526020019081526020015f20858154811061323f5761323f61454f565b5f9182526020909120825460039092020180547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b03909216919091178155600180830154908201556002918201549101555b335f90815260a4602052604090208054806132b6576132b66145cf565b5f8281526020812060035f199093019283020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001681556001818101839055600290910191909155915561330c90866145a9565b604080518481526020810184905291965033916001600160a01b038616917f921046659ea3b3b3f8e8fefd2bece3121b2d929ead94c696a75beedee477fdb6910160405180910390a3505050613054565b6133688160016145bc565b9050613054565b505f82116133bf5760405162461bcd60e51b815260206004820152601760248201527f6e6f204d6f72706820746f6b656e20746f20636c61696d000000000000000000604482015260640161082a565b6133c93383613cbb565b5050612a7f6001606555565b6001600160a01b0381165f90815260a460209081526040808320805482518185028101850190935280835260609492939192909184015b82821015613460575f848152602090819020604080516060810182526003860290920180546001600160a01b031683526001808201548486015260029091015491830191909152908352909201910161340c565b505050509050919050565b61347361372f565b6001600160a01b0381166134ef5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161082a565b61186d81613bc3565b613500613789565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663ac2ac640336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b0390911660048201526024015f604051808303815f87803b158015613586575f80fd5b505af1158015613598573d5f803e3d5ffd5b50505050612a7f6001606555565b5f6106ce825490565b60995460975460ff16156135d357609954609c5410156135ce5750609c545b6135e4565b609954609d5410156135e45750609d545b5f8167ffffffffffffffff8111156135fe576135fe614649565b604051908082528060200260200182016040528015613627578160200160208202803683370190505b5090505f5b8281101561369457609d81815481106136475761364761454f565b905f5260205f20015f9054906101000a90046001600160a01b03168282815181106136745761367461454f565b6001600160a01b039092166020928302919091019091015260010161362c565b506040517f9b8201a40000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639b8201a4906136fa9084906004016149fe565b5f604051808303815f87803b158015613711575f80fd5b505af1158015613723573d5f803e3d5ffd5b50509151609b55505050565b6033546001600160a01b03163314612a7f5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161082a565b6002606554036137db5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161082a565b6002606555565b6001606555565b5f6137fd836001600160a01b038416613f19565b9392505050565b5f805b6001600160a01b0384165f90815260a46020526040902054811015613884576001600160a01b038481165f90815260a460205260409020805491851691839081106138545761385461454f565b5f9182526020909120600390910201546001600160a01b03160361387c5760019150506106ce565b600101613807565b505f9392505050565b6040517fde6ac9330000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015282811660248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063de6ac93390604401602060405180830381865afa158015613916573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061393a9190614a10565b159392505050565b5f6137fd836001600160a01b038416613ffc565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa1580156139d7573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139fb9190614a2f565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301528581166024830152604482018590529192507f0000000000000000000000000000000000000000000000000000000000000000909116906323b872dd906064016020604051808303815f875af1158015613a8d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613ab19190614a10565b506040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015613b33573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613b579190614a2f565b90505f83118015613b70575082613b6e83836145a9565b145b613bbc5760405162461bcd60e51b815260206004820152601b60248201527f6d6f72706820746f6b656e207472616e73666572206661696c65640000000000604482015260640161082a565b5050505050565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff16613ca85760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161082a565b612a7f614048565b5f6137fd83836140c4565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015613d3c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613d609190614a2f565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152602482018590529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303815f875af1158015613dea573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e0e9190614a10565b506040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015613e90573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613eb49190614a2f565b90505f83118015613ecd575082613ecb83836145a9565b145b610d065760405162461bcd60e51b815260206004820152601b60248201527f6d6f72706820746f6b656e207472616e73666572206661696c65640000000000604482015260640161082a565b5f8181526001830160205260408120548015613ff3575f613f3b6001836145a9565b85549091505f90613f4e906001906145a9565b9050818114613fad575f865f018281548110613f6c57613f6c61454f565b905f5260205f200154905080875f018481548110613f8c57613f8c61454f565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080613fbe57613fbe6145cf565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506106ce565b5f9150506106ce565b5f81815260018301602052604081205461404157508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556106ce565b505f6106ce565b5f54610100900460ff166137e25760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e67000000000000000000000000000000000000000000606482015260840161082a565b5f825f0182815481106140d9576140d961454f565b905f5260205f200154905092915050565b5080546140f690614676565b5f825580601f10614105575050565b601f0160209004905f5260205f209081019061186d91905b80821115614130575f815560010161411d565b5090565b6001600160a01b038116811461186d575f80fd5b5f60208284031215614158575f80fd5b81356137fd81614134565b5f8083601f840112614173575f80fd5b50813567ffffffffffffffff81111561418a575f80fd5b6020830191508360208260051b85010111156141a4575f80fd5b9250929050565b5f80602083850312156141bc575f80fd5b823567ffffffffffffffff8111156141d2575f80fd5b6141de85828601614163565b90969095509350505050565b5f602082840312156141fa575f80fd5b5035919050565b5f8060408385031215614212575f80fd5b823561421d81614134565b946020939093013593505050565b5f81518084525f5b8181101561424f57602081850181015186830182015201614233565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b83811015614324578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0018552815180516001600160a01b03168452878101518885015286015160608785018190526143108186018361422b565b9689019694505050908601906001016142b3565b509098975050505050505050565b5f805f805f8060a08789031215614347575f80fd5b863561435281614134565b9550602087013594506040870135935060608701359250608087013567ffffffffffffffff811115614382575f80fd5b61438e89828a01614163565b979a9699509497509295939492505050565b5f602082840312156143b0575f80fd5b813567ffffffffffffffff8111156143c6575f80fd5b8201606081850312156137fd575f80fd5b6001600160a01b0384168152826020820152606060408201525f6143fe606083018461422b565b95945050505050565b5f8060408385031215614418575f80fd5b823561442381614134565b9150602083013561443381614134565b809150509250929050565b5f805f60608486031215614450575f80fd5b833561445b81614134565b95602085013595506040909401359392505050565b5f815180845260208085019450602084015f5b838110156144a85781516001600160a01b031687529582019590820190600101614483565b509495945050505050565b828152604060208201525f6144cb6040830184614470565b949350505050565b602080825282518282018190525f919060409081850190868401855b8281101561452757815180516001600160a01b03168552868101518786015285015185850152606090930192908501906001016144ef565b5091979650505050505050565b5f60208284031215614544575f80fd5b81516137fd81614134565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b818103818111156106ce576106ce61457c565b808201808211156106ce576106ce61457c565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b60208082528181018390525f908460408401835b8681101561463e57823561462381614134565b6001600160a01b031682529183019190830190600101614610565b509695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b600181811c9082168061468a57607f821691505b602082108103612233577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f816146cf576146cf61457c565b505f190190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82614711576147116146d6565b500690565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112614748575f80fd5b9190910192915050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614785575f80fd5b83018035915067ffffffffffffffff82111561479f575f80fd5b6020019150368190038213156141a4575f80fd5b601f821115610bf457805f5260205f20601f840160051c810160208510156147d85750805b601f840160051c820191505b81811015613bbc575f81556001016147e4565b813561480281614134565b6001600160a01b0381167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550600160208084013560018401556002830160408501357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1863603018112614879575f80fd5b8501803567ffffffffffffffff811115614891575f80fd5b80360384830113156148a1575f80fd5b6148b5816148af8554614676565b856147b3565b5f601f8211600181146148e8575f83156148d157508382018601355b5f19600385901b1c1916600184901b17855561495e565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08516915b8281101561493457868501890135825593880193908901908801614915565b5084821015614952575f1960f88660031b161c198885880101351681555b505060018360011b0185555b505050505050505050565b83815260406020820152816040820152818360608301375f818301606090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010192915050565b5f826149ca576149ca6146d6565b500490565b80820281158282048414176106ce576106ce61457c565b5f5f1982036149f7576149f761457c565b5060010190565b602081525f6137fd6020830184614470565b5f60208284031215614a20575f80fd5b815180151581146137fd575f80fd5b5f60208284031215614a3f575f80fd5b505191905056fea164736f6c6343000818000a diff --git a/bindings/bin/l2tokenregistry_deployed.hex b/bindings/bin/l2tokenregistry_deployed.hex new file mode 100644 index 000000000..65114effb --- /dev/null +++ b/bindings/bin/l2tokenregistry_deployed.hex @@ -0,0 +1 @@ +0x608060405234801561000f575f80fd5b50600436106101c6575f3560e01c80638cbab7e4116100fe578063ce67be261161009e578063ef0fde0f1161006e578063ef0fde0f146104bf578063efeadb6d146104d2578063f2fde38b146104e5578063fce40489146104f8575f80fd5b8063ce67be261461047e578063dbbb2faa14610486578063dddc98be14610499578063e3de72a5146104ac575f80fd5b8063a1218001116100d9578063a121800114610432578063a313d00714610445578063b10b69ee14610458578063c4d66de81461046b575f80fd5b80638cbab7e4146103f15780638da5cb5b146104045780639190202e1461041f575f80fd5b80635c45246b11610169578063724f91ce11610144578063724f91ce146103105780637304880c1461034657806385519c36146103595780638c399691146103de575f80fd5b80635c45246b146102de5780636f6d6cc1146102f3578063715018a614610308575f80fd5b806322bd5c1c116101a457806322bd5c1c146102795780632848aeaf146102965780632a1ea5a2146102b85780634cbcdd13146102cb575f80fd5b80631585458c146101ca57806319904c33146101e85780631c58e79314610215575b5f80fd5b6101d261050b565b6040516101df91906125af565b60405180910390f35b6102076101f6366004612620565b60996020525f908152604090205481565b6040519081526020016101df565b610228610223366004612620565b61060a565b6040805183516001600160a01b03168152602080850151908201528382015115159181019190915260608084015160ff169082015260809283015192810192909252151560a082015260c0016101df565b609b546102869060ff1681565b60405190151581526020016101df565b6102866102a436600461264f565b609a6020525f908152604090205460ff1681565b6102076102c6366004612620565b610700565b6102866102d9366004612620565b610768565b6102f16102ec366004612677565b61077e565b005b6102fb6107ac565b6040516101df91906126c8565b6102f1610854565b61033361031e36600461264f565b60986020525f908152604090205461ffff1681565b60405161ffff90911681526020016101df565b6102f161035436600461270f565b610867565b6103a4610367366004612620565b60976020525f908152604090208054600182015460028301546003909301546001600160a01b0390921692909160ff808316926101009004169085565b604080516001600160a01b03909616865260208601949094529115159284019290925260ff9091166060830152608082015260a0016101df565b6102f16103ec3660046128df565b610c46565b6103336103ff36600461264f565b610e4b565b6033546040516001600160a01b0390911681526020016101df565b6102f161042d366004612987565b610eb4565b6102f1610440366004612ab4565b611055565b610207610453366004612620565b611171565b6102f1610466366004612b7d565b6111dc565b6102f161047936600461264f565b611345565b610207611513565b6102f1610494366004612620565b611523565b6102076104a7366004612b7d565b6116a5565b6102f16104ba366004612ba5565b61180d565b6102f16104cd366004612b7d565b61194b565b6102f16104e0366004612bfb565b611ab3565b6102f16104f336600461264f565b611b20565b610286610506366004612620565b611bca565b60605f610518609c611c0d565b90505f815167ffffffffffffffff81111561053557610535612771565b60405190808252806020026020018201604052801561057957816020015b604080518082019091525f80825260208201528152602001906001900390816105535790505b5090505f5b8251811015610603575f83828151811061059a5761059a612c14565b60209081029190910181015161ffff81165f818152609784526040908190205481518083019092529181526001600160a01b039091169281018390528551919350908590859081106105ee576105ee612c14565b6020908102919091010152505060010161057e565b5092915050565b6040805160a0810182525f8082526020820181905291810182905260608101829052608081019190915261ffff82165f908152609760205260408120546001600160a01b0316610686576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505061ffff81165f90815260976020908152604091829020825160a08101845281546001600160a01b031681526001820154928101839052600282015460ff80821615159583019590955261010090049093166060840152600301546080830152801515906106f490611c20565b60208301529092909150565b61ffff81165f908152609760205260408120546001600160a01b0316610752576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5061ffff165f9081526099602052604090205490565b5f610778609c61ffff8416611c53565b92915050565b610786611c6a565b61078e611cde565b61079b8585858585611d51565b6107a56001606555565b5050505050565b60605f6107b9609c611c0d565b90505f815167ffffffffffffffff8111156107d6576107d6612771565b6040519080825280602002602001820160405280156107ff578160200160208202803683370190505b5090505f5b82518110156106035782818151811061081f5761081f612c14565b602002602001015182828151811061083957610839612c14565b61ffff90921660209283029190910190910152600101610804565b61085c611c6a565b6108655f6120c1565b565b61086f611c6a565b610877611cde565b61ffff86165f908152609760205260409020546001600160a01b03166108c9576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038516610909576040517f1eb00b0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f03610942576040517f70ce14bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0385165f9081526098602052604090205461ffff16801580159061097557508661ffff168161ffff1614155b156109ac576040517fe4476a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60129050866001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610a29575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610a2691810190612c41565b60015b15610a315790505b61ffff88165f9081526097602090815260409182902054825160a081019093526001600160a01b038a811684521691908101610a6d898961212a565b815286151560208083019190915260ff808616604080850191909152606093840189905261ffff8e165f90815260978452819020855181546001600160a01b039182167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161782559386015160018201559085015160028201805495870151909316610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff911515919091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009095169490941793909317905560809092015160039091015581811690891614610bb9576001600160a01b038181165f9081526098602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000908116909155928b1682529020805490911661ffff8b161790555b61ffff89165f8181526099602052604080822091909155516001600160a01b038a1691907f60281b1abf645864e8443ca11a3c3b51a6a9203a376da58db7919f7cfebc4aa990610c29908b908a9088908b90938452911515602084015260ff166040830152606082015260800190565b60405180910390a3505050610c3e6001606555565b505050505050565b5f610c596033546001600160a01b031690565b609b546001600160a01b0391909116331491505f9060ff168015610c8b5750335f908152609a602052604090205460ff165b905081158015610c99575080155b15610cd0576040517f2af07d2000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8251845114610d0b576040517f9d89020a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b84518110156107a5575f6001600160a01b031660975f878481518110610d3557610d35612c14565b60209081029190910181015161ffff1682528101919091526040015f20546001600160a01b031614610e4357838181518110610d7357610d73612c14565b60200260200101515f0315610e4357838181518110610d9457610d94612c14565b602002602001015160995f878481518110610db157610db1612c14565b602002602001015161ffff1661ffff1681526020019081526020015f2081905550848181518110610de457610de4612c14565b602002602001015161ffff167fd73999ac164146908368455e72209122b67c149b37aab024e2707394a2c70467858381518110610e2357610e23612c14565b6020026020010151604051610e3a91815260200190565b60405180910390a25b600101610d0d565b6001600160a01b0381165f9081526098602052604081205461ffff1680158015610e7d57506001600160a01b03831615155b15610778576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ebc611c6a565b828114610ef5576040517f9d89020a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b838110156107a5575f858583818110610f1257610f12612c14565b9050602002016020810190610f279190612620565b90505f848484818110610f3c57610f3c612c14565b9050602002016020810190610f519190612bfb565b61ffff83165f908152609760205260409020549091506001600160a01b0316610f7b57505061104d565b61ffff82165f9081526097602052604090206002015460ff16801515821515146110495761ffff83165f90815260976020526040902060020180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016831580159190911790915561101a5760405161ffff8416907fba78a86bd882b78fb95715a0d827188ec0a8ad3f500310d33a39b94c9ff677b8905f90a2611049565b60405161ffff8416907fa625871090c2595895650b8e9222d1a3267cedf9de819bf446400962ce1357ef905f90a25b5050505b600101610ef7565b61105d611c6a565b611065611cde565b8351855114158061107857508251855114155b8061108557508151855114155b8061109257508051855114155b156110c9576040517f9d89020a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b85518110156111665761115e8682815181106110e9576110e9612c14565b602002602001015186838151811061110357611103612c14565b602002602001015186848151811061111d5761111d612c14565b602002602001015186858151811061113757611137612c14565b602002602001015186868151811061115157611151612c14565b6020026020010151611d51565b6001016110cb565b506107a56001606555565b61ffff81165f908152609760205260408120546001600160a01b03166111c3576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5061ffff165f9081526097602052604090206003015490565b5f6111ef6033546001600160a01b031690565b609b546001600160a01b0391909116331491505f9060ff1680156112215750335f908152609a602052604090205460ff165b90508115801561122f575080155b15611266576040517f2af07d2000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff84165f908152609760205260409020546001600160a01b03166112b8576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f036112f0576040517ebfc92100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff84165f8181526099602052604090819020859055517fd73999ac164146908368455e72209122b67c149b37aab024e2707394a2c70467906113379086815260200190565b60405180910390a250505050565b5f54610100900460ff161580801561136357505f54600160ff909116105b8061137c5750303b15801561137c57505f5460ff166001145b61140d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611469575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b611471612179565b611479612217565b611482826120c1565b609b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561150f575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b5f61151e609c6122b5565b905090565b61152b611c6a565b61ffff81165f908152609760205260409020546001600160a01b03168061157e576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61158d609c61ffff8416611c53565b6115c3576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff82165f81815260976020908152604080832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168155600181018490556002810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090811690915560039091018490556001600160a01b038616845260988352818420805490911690559282526099905290812055611668826122be565b6040516001600160a01b0382169061ffff8416907f330282f89b53f03dfc62130ddb33062a147ad25d691915b575732f62fb6fce9a905f90a35050565b61ffff82165f908152609760205260408120546001600160a01b03166116f7576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff83165f818152609760209081526040808320815160a08101835281546001600160a01b03168152600182015481850152600282015460ff8082161515838601526101009091041660608201526003909101546080820152938352609990915281205490819003611795576040517ebfc92100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8260800151856117a69190612c8e565b90508160016117b58284612ca5565b6117bf9190612cb8565b6117c99190612ccb565b9350835f03611804576040517f82c4a8c900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505092915050565b611815611c6a565b8051825114611850576040517fd9183d2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b82518110156119465781818151811061186d5761186d612c14565b6020026020010151609a5f85848151811061188a5761188a612c14565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff0219169083151502179055508281815181106118d9576118d9612c14565b60200260200101516001600160a01b03167f6dad0aed33f4b7f07095619b668698e17943fd9f4c83e7cfcc7f6dd880a1158883838151811061191d5761191d612c14565b6020026020010151604051611936911515815260200190565b60405180910390a2600101611852565b505050565b5f61195e6033546001600160a01b031690565b609b546001600160a01b0391909116331491505f9060ff1680156119905750335f908152609a602052604090205460ff165b90508115801561199e575080155b156119d5576040517f2af07d2000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff84165f908152609760205260409020546001600160a01b0316611a27576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f03611a60576040517f70ce14bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff84165f818152609760209081526040808320600301879055609982528083209290925590518581527f7b614d0c690ae942aec30d9378eb72c3678dd8cb74a55343c87baf8dfe078e749101611337565b611abb611c6a565b609b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215159081179091556040519081527f16435b45f7482047f839a6a19d291442627200f52cad2803c595150d0d440eb39060200160405180910390a150565b611b28611c6a565b6001600160a01b038116611bbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401611404565b611bc7816120c1565b50565b61ffff81165f908152609760205260408120546001600160a01b0316611bf157505f919050565b5061ffff165f9081526097602052604090206002015460ff1690565b60605f611c19836122cd565b9392505050565b5f81611c2d57505f919050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b5f8181526001830160205260408120541515611c19565b6033546001600160a01b03163314610865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611404565b600260655403611d4a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611404565b6002606555565b6001600160a01b038416611d91576040517f1eb00b0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8461ffff165f03611dce576040517f6aa2a93700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff85165f908152609760205260409020546001600160a01b031615611e21576040517fc9b3c8a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384165f9081526098602052604090205461ffff1615611e74576040517fe4476a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f03611ead576040517f70ce14bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60129050846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611f2a575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611f2791810190612c41565b60015b15611f325790505b6040518060a00160405280866001600160a01b03168152602001611f56868661212a565b81525f602080830182905260ff808616604080860191909152606094850188905261ffff8c1680855260978452818520875181546001600160a01b039182167fffffffffffffffffffffffff000000000000000000000000000000000000000090911617825588860151600183015588840151600283018054998b0151909616610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff911515919091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000998a161717909455608090970151600390970196909655908a168352609890915290208054909116909117905561205986612326565b604080518581525f602082015260ff8316818301526060810184905290516001600160a01b0387169161ffff8916917fb9d0acb419ab21384716fbeaa0bcbc172f6347c9bf4fc0614c4e79fc47b36e119181900360800190a3505050505050565b6001606555565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f8161213757505f610778565b60018301612171576040517feab9612d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505060010190565b5f54610100900460ff1661220f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401611404565b610865612335565b5f54610100900460ff166122ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401611404565b6108656123d4565b5f610778825490565b61150f609c61ffff831661246a565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561231a57602002820191905f5260205f20905b815481526020019060010190808311612306575b50505050509050919050565b61150f609c61ffff8316612475565b5f54610100900460ff166123cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401611404565b610865336120c1565b5f54610100900460ff166120ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401611404565b5f611c198383612480565b5f611c198383612563565b5f818152600183016020526040812054801561255a575f6124a2600183612cb8565b85549091505f906124b590600190612cb8565b9050818114612514575f865f0182815481106124d3576124d3612c14565b905f5260205f200154905080875f0184815481106124f3576124f3612c14565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061252557612525612d03565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610778565b5f915050610778565b5f8181526001830160205260408120546125a857508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610778565b505f610778565b602080825282518282018190525f919060409081850190868401855b828110156125fd578151805161ffff1685528601516001600160a01b03168685015292840192908501906001016125cb565b5091979650505050505050565b803561ffff8116811461261b575f80fd5b919050565b5f60208284031215612630575f80fd5b611c198261260a565b80356001600160a01b038116811461261b575f80fd5b5f6020828403121561265f575f80fd5b611c1982612639565b8035801515811461261b575f80fd5b5f805f805f60a0868803121561268b575f80fd5b6126948661260a565b94506126a260208701612639565b9350604086013592506126b760608701612668565b949793965091946080013592915050565b602080825282518282018190525f9190848201906040850190845b8181101561270357835161ffff16835292840192918401916001016126e3565b50909695505050505050565b5f805f805f8060c08789031215612724575f80fd5b61272d8761260a565b955061273b60208801612639565b94506040870135935061275060608801612668565b925061275e60808801612668565b915060a087013590509295509295509295565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156127e5576127e5612771565b604052919050565b5f67ffffffffffffffff82111561280657612806612771565b5060051b60200190565b5f82601f83011261281f575f80fd5b8135602061283461282f836127ed565b61279e565b8083825260208201915060208460051b870101935086841115612855575f80fd5b602086015b848110156128785761286b8161260a565b835291830191830161285a565b509695505050505050565b5f82601f830112612892575f80fd5b813560206128a261282f836127ed565b8083825260208201915060208460051b8701019350868411156128c3575f80fd5b602086015b8481101561287857803583529183019183016128c8565b5f80604083850312156128f0575f80fd5b823567ffffffffffffffff80821115612907575f80fd5b61291386838701612810565b93506020850135915080821115612928575f80fd5b5061293585828601612883565b9150509250929050565b5f8083601f84011261294f575f80fd5b50813567ffffffffffffffff811115612966575f80fd5b6020830191508360208260051b8501011115612980575f80fd5b9250929050565b5f805f806040858703121561299a575f80fd5b843567ffffffffffffffff808211156129b1575f80fd5b6129bd8883890161293f565b909650945060208701359150808211156129d5575f80fd5b506129e28782880161293f565b95989497509550505050565b5f82601f8301126129fd575f80fd5b81356020612a0d61282f836127ed565b8083825260208201915060208460051b870101935086841115612a2e575f80fd5b602086015b8481101561287857612a4481612639565b8352918301918301612a33565b5f82601f830112612a60575f80fd5b81356020612a7061282f836127ed565b8083825260208201915060208460051b870101935086841115612a91575f80fd5b602086015b8481101561287857612aa781612668565b8352918301918301612a96565b5f805f805f60a08688031215612ac8575f80fd5b853567ffffffffffffffff80821115612adf575f80fd5b612aeb89838a01612810565b96506020880135915080821115612b00575f80fd5b612b0c89838a016129ee565b95506040880135915080821115612b21575f80fd5b612b2d89838a01612883565b94506060880135915080821115612b42575f80fd5b612b4e89838a01612a51565b93506080880135915080821115612b63575f80fd5b50612b7088828901612883565b9150509295509295909350565b5f8060408385031215612b8e575f80fd5b612b978361260a565b946020939093013593505050565b5f8060408385031215612bb6575f80fd5b823567ffffffffffffffff80821115612bcd575f80fd5b612bd9868387016129ee565b93506020850135915080821115612bee575f80fd5b5061293585828601612a51565b5f60208284031215612c0b575f80fd5b611c1982612668565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215612c51575f80fd5b815160ff81168114611c19575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808202811582820484141761077857610778612c61565b8082018082111561077857610778612c61565b8181038181111561077857610778612c61565b5f82612cfe577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea164736f6c6343000818000a diff --git a/bindings/bin/rollup_deployed.hex b/bindings/bin/rollup_deployed.hex index b23011457..5c9b85600 100644 --- a/bindings/bin/rollup_deployed.hex +++ b/bindings/bin/rollup_deployed.hex @@ -1 +1 @@ -0x608060405260043610610306575f3560e01c8063728cdbca11610191578063b35dac4e116100dc578063ddd8a3dc11610087578063e3fff1dd11610062578063e3fff1dd146109b1578063f2fde38b146109d0578063fb1e8b04146109ef575f80fd5b8063ddd8a3dc1461095e578063de8b30351461097d578063dff7827e1461099c575f80fd5b8063cd4edc69116100b7578063cd4edc6914610917578063ce5db8d61461092a578063d279c1911461093f575f80fd5b8063b35dac4e146108ba578063b3e0a509146108d9578063bedb86fb146108f8575f80fd5b8063a415d8dc1161013c578063abc8d68d11610117578063abc8d68d1461085b578063b31a77d314610886578063b34844251461089b575f80fd5b8063a415d8dc146107f9578063a479265d14610827578063a4f209b01461083c575f80fd5b80638f1d37761161016c5780638f1d3776146106f9578063910129d4146107a957806397fc007c146107da575f80fd5b8063728cdbca146106a457806388b1ea09146106c35780638da5cb5b146106dc575f80fd5b80632b7ac3f3116102515780635ef7a94a116101fc57806368589dfa116101d757806368589dfa146106465780636c578c1d14610671578063715018a614610690575f80fd5b80635ef7a94a1461057b5780635f77cf1d146105db5780636126729014610627575f80fd5b80634a8d544f1161022c5780634a8d544f1461053257806357e0af6c146105455780635c975abb14610564575f80fd5b80632b7ac3f3146104c75780633b70c18a146104fe5780633e001b661461051d575f80fd5b806313361101116102b157806321e2f9e01161028c57806321e2f9e0146104525780632362f03e146104715780632571098d1461049c575f80fd5b806313361101146103ee57806318463fb01461040d57806318af3b2b14610422575f80fd5b806310d44583116102e157806310d4458314610398578063116a1f42146103b7578063121dcd50146103d9575f80fd5b806304d7721514610311578063059def61146103545780630ceb678014610377575f80fd5b3661030d57005b5f80fd5b34801561031c575f80fd5b5061033f61032b3660046140f4565b60a36020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561035f575f80fd5b50610369609d5481565b60405190815260200161034b565b348015610382575f80fd5b50610396610391366004614126565b610a04565b005b3480156103a3575f80fd5b506103966103b2366004614184565b610ad6565b3480156103c2575f80fd5b5061033f6103d13660046140f4565b609d54101590565b3480156103e4575f80fd5b50610369609e5481565b3480156103f9575f80fd5b506103966104083660046141cc565b610e2f565b348015610418575f80fd5b5061036960a75481565b34801561042d575f80fd5b5061033f61043c3660046140f4565b5f90815260a26020526040902060010154421090565b34801561045d575f80fd5b5061033f61046c3660046140f4565b611326565b34801561047c575f80fd5b5061036961048b3660046140f4565b60a16020525f908152604090205481565b3480156104a7575f80fd5b506103696104b63660046140f4565b60a06020525f908152604090205481565b3480156104d2575f80fd5b50609c546104e6906001600160a01b031681565b6040516001600160a01b03909116815260200161034b565b348015610509575f80fd5b50609b546104e6906001600160a01b031681565b348015610528575f80fd5b5061036960aa5481565b61039661054036600461420b565b611354565b348015610550575f80fd5b5061039661055f3660046140f4565b611bd7565b34801561056f575f80fd5b5060655460ff1661033f565b348015610586575f80fd5b506105bb6105953660046140f4565b60a26020525f908152604090208054600182015460028301546003909301549192909184565b60408051948552602085019390935291830152606082015260800161034b565b3480156105e6575f80fd5b5061060e7f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff909116815260200161034b565b348015610632575f80fd5b506103966106413660046140f4565b611c82565b348015610651575f80fd5b506103696106603660046140f4565b60ab6020525f908152604090205481565b34801561067c575f80fd5b5061039661068b366004614126565b611e97565b34801561069b575f80fd5b50610396611f54565b3480156106af575f80fd5b506103966106be366004614278565b611f67565b3480156106ce575f80fd5b5060a65461033f9060ff1681565b3480156106e7575f80fd5b506033546001600160a01b03166104e6565b348015610704575f80fd5b506107656107133660046140f4565b60a46020525f9081526040902080546001820154600283015460039093015467ffffffffffffffff831693680100000000000000009093046001600160a01b0316929060ff8082169161010090041686565b6040805167ffffffffffffffff90971687526001600160a01b03909516602087015293850192909252606084015215156080830152151560a082015260c00161034b565b3480156107b4575f80fd5b5061033f6107c33660046140f4565b5f90815260a4602052604090206003015460ff1690565b3480156107e5575f80fd5b506103966107f4366004614126565b6122aa565b348015610804575f80fd5b5061033f610813366004614126565b609f6020525f908152604090205460ff1681565b348015610832575f80fd5b5061036960995481565b348015610847575f80fd5b506103966108563660046140f4565b61238d565b348015610866575f80fd5b50610369610875366004614126565b60a56020525f908152604090205481565b348015610891575f80fd5b5061036960a85481565b3480156108a6575f80fd5b506103966108b53660046142d3565b61243d565b3480156108c5575f80fd5b506103966108d4366004614126565b612682565b3480156108e4575f80fd5b506103966108f33660046141cc565b6126db565b348015610903575f80fd5b50610396610912366004614347565b612a2b565b610396610925366004614362565b612b86565b348015610935575f80fd5b5061036960985481565b34801561094a575f80fd5b50610396610959366004614126565b613152565b348015610969575f80fd5b506097546104e6906001600160a01b031681565b348015610988575f80fd5b5061033f6109973660046140f4565b613211565b3480156109a7575f80fd5b50610369609a5481565b3480156109bc575f80fd5b506103966109cb3660046140f4565b61325b565b3480156109db575f80fd5b506103966109ea366004614126565b6132fe565b3480156109fa575f80fd5b5061036960a95481565b610a0c61338b565b6001600160a01b0381165f908152609f602052604090205460ff1615610a795760405162461bcd60e51b815260206004820152601f60248201527f6163636f756e7420697320616c72656164792061206368616c6c656e6765720060448201526064015b60405180910390fd5b6001600160a01b0381165f818152609f6020908152604091829020805460ff1916600190811790915591519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc00991015b60405180910390a250565b610ade61338b565b5f8111610b2d5760405162461bcd60e51b815260206004820152601560248201527f636f756e74206d757374206265206e6f6e7a65726f00000000000000000000006044820152606401610a70565b5f80610b3985856133e5565b915091505f610b4c836001015160c01c90565b5f81815260a160205260409020549091508214610bab5760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b5f60a181610bb987856143c5565b81526020019081526020015f205414610c395760405162461bcd60e51b8152602060048201526024808201527f726576657274696e67206d7573742073746172742066726f6d2074686520656e60448201527f64696e67000000000000000000000000000000000000000000000000000000006064820152608401610a70565b609d548111610cb05760405162461bcd60e51b815260206004820152602160248201527f63616e206f6e6c792072657665727420756e46696e616c697a6564206261746360448201527f68000000000000000000000000000000000000000000000000000000000000006064820152608401610a70565b610cbb6001826143d8565b609e555b8315610e2757604051829082907ecae2739091badfd91c373f0a16cede691e0cd25bb80cff77dd5caeb4710146905f90a35f81815260a16020526040812055610d0781613211565b15610d62575f81815260a460209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a59092528220805491929091610d529084906143c5565b909155505060a6805460ff191690555b5f81815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a85415801590610ddf575060a85481145b15610de9575f60a8555b6001015f81815260a160205260409020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90940193915081610cbf575b505050505050565b60a85415610e7f5760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b610e87613400565b5f80610e9384846133e5565b915091505f610ea6836001015160c01c90565b5f81815260a160205260409020549091508214610f055760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b610f0e81611326565b610f5a5760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610a70565b610f6381613211565b15610fb05760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610a70565b5f81815260a4602052604090206003015460ff16156110115760405162461bcd60e51b815260206004820152601660248201527f62617463682073686f756c6420626520726576657274000000000000000000006044820152606401610a70565b5f81815260a260205260409020600101544210156110715760405162461bcd60e51b815260206004820152601960248201527f626174636820696e206368616c6c656e67652077696e646f77000000000000006044820152606401610a70565b605983015160a05f6110846001856143d8565b81526020019081526020015f2054146110df5760405162461bcd60e51b815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610a70565b5f81815260a060205260409020541561113a5760405162461bcd60e51b815260206004820152601660248201527f626174636820616c7265616479207665726966696564000000000000000000006044820152606401610a70565b80609d546001011461118e5760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610a70565b609d819055600160a35f6111a3866099015190565b815260208101919091526040015f20805460ff191691151591909117905560798301515f82815260a060205260409020556111f26111e5846011015160c01c90565b600985015160c01c613453565b60a25f6112006001846143d8565b815260208101919091526040015f908120818155600180820183905560028201839055600390910182905560ab919061123990846143d8565b81526020019081526020015f205f905560a45f60018361125991906143d8565b815260208082019290925260409081015f90812080547fffffffff00000000000000000000000000000000000000000000000000000000168155600181018290556002810182905560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905583815260a1909252902054817f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d611302866079015190565b60998701516040805192835260208301919091520160405180910390a35050505050565b5f81815260a260205260408120541580159061134e57505f82815260a1602052604090205415155b92915050565b6097546001600160a01b03166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156113c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e491906143eb565b6114305760405162461bcd60e51b815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f7765640000000000006044820152606401610a70565b60a854156114805760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b611488613400565b6114956020830183614406565b60ff16156114e55760405162461bcd60e51b815260206004820152600f60248201527f696e76616c69642076657273696f6e00000000000000000000000000000000006044820152606401610a70565b5f6114f36040840184614426565b915050806115435760405162461bcd60e51b815260206004820152600e60248201527f626174636820697320656d7074790000000000000000000000000000000000006044820152606401610a70565b60608301356115945760405162461bcd60e51b815260206004820152601b60248201527f70726576696f757320737461746520726f6f74206973207a65726f00000000006044820152606401610a70565b60808301356115e55760405162461bcd60e51b815260206004820152601660248201527f6e657720737461746520726f6f74206973207a65726f000000000000000000006044820152606401610a70565b5f806115fc6115f76020870187614426565b6133e5565b915091505f61160f836001015160c01c90565b90505f60a1816116208460016143c5565b81526020019081526020015f20541461167b5760405162461bcd60e51b815260206004820152601760248201527f626174636820616c726561647920636f6d6d69747465640000000000000000006044820152606401610a70565b609e5481146116cc5760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610a70565b5f81815260a1602052604090205482146117285760405162461bcd60e51b815260206004820152601b60248201527f696e636f727265637420706172656e74206261746368206861736800000000006044820152606401610a70565b5f81815260ab60205260409020546060870135146117885760405162461bcd60e51b815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610a70565b5f611797846011015160c01c90565b90505f80806117e96117ac60408c018c614426565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508792508891506135109050565b600196909601959485019493840193925090505f80491561180b575f4961182d565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440145b60408051611f2081019091529850905060f96118588961185060208f018f614406565b60ff1661368d565b60c087811b60018b015285811b60098b015286901b60118a01526019890183905260608c013560598a015260808c013560798a015260a08c013560998a01526118c7896118a860208e018e614426565b6040516118b6929190614487565b604051809103902060b99190910152565b60d98901889052603989018290528089205f88815260a1602090815260408083209390935560ab905290812060808e0135905560a65460ff16156119345760a7545f90815260a460205260409020600201546099544291611927916143c5565b61193191906143d8565b90505b6040518060800160405280428152602001826098544261195491906143c5565b61195e91906143c5565b81526020016119af8f80604001906119769190614426565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061369492505050565b81526097546020909101906001600160a01b031663d096c3c6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611a23573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a479190614496565b90525f89815260a2602090815260409182902083518155838201516001820155918301516002830155606090920151600390910155609e8990556097546001600160a01b031692506374fe27b791508c3590611aaf90611aa9908f018f614426565b5f6136eb565b5f8e8060400190611ac09190614426565b6040518663ffffffff1660e01b8152600401611ae09594939291906144f4565b602060405180830381865afa158015611afb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b1f91906143eb565b611b915760405162461bcd60e51b815260206004820152602160248201527f746865207369676e617475726520766572696669636174696f6e206661696c6560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610a70565b5f86815260a16020526040808220549051909188917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a35050505050505050505050565b611bdf61338b565b5f81118015611bf057506099548114155b611c3c5760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964206e65772070726f6f662077696e646f7700000000000000006044820152606401610a70565b609980549082905560408051828152602081018490527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a6191015b60405180910390a15050565b5f54600290610100900460ff16158015611ca257505f5460ff8083169116105b611d145760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a70565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055611d4f5f5460ff1690565b60ff16600214611da15760405162461bcd60e51b815260206004820152601660248201527f6d757374206861766520696e697469616c697a656421000000000000000000006044820152606401610a70565b81611e145760405162461bcd60e51b815260206004820152602760248201527f63616e206e6f742073657420737461746520726f6f742077697468206279746560448201527f73333228302921000000000000000000000000000000000000000000000000006064820152608401610a70565b609e545f90815260ab6020526040902054611e3d57609e545f90815260ab602052604090208290555b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611c76565b611e9f61338b565b6001600160a01b0381165f908152609f602052604090205460ff16611f065760405162461bcd60e51b815260206004820152601b60248201527f6163636f756e74206973206e6f742061206368616c6c656e67657200000000006044820152606401610a70565b6001600160a01b0381165f818152609f60209081526040808320805460ff19169055519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc0099101610acb565b611f5c61338b565b611f655f61373f565b565b5f54610100900460ff1615808015611f8557505f54600160ff909116105b80611f9e5750303b158015611f9e57505f5460ff166001145b6120105760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a70565b5f805460ff19166001179055801561204e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b038616158061206b57506001600160a01b038516155b156120a2576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0387166120f85760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206c31207374616b696e6720636f6e747261637400000000006044820152606401610a70565b6121006137a8565b61210861382c565b609780546001600160a01b03808a167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255609b8054898416908316179055609c805492881692909116821790556098859055609984905560a98390556040515f907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96908290a3604080515f8152602081018690527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a437910160405180910390a1604080515f8152602081018590527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a61910160405180910390a1604080515f8152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b0223910160405180910390a180156122a1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b6122b261338b565b6001600160a01b038116158015906122d85750609c546001600160a01b03828116911614155b6123245760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964206e65772076657269666965720000000000000000000000006044820152606401610a70565b609c80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96905f90a35050565b61239561338b565b5f811180156123a5575060648111155b80156123b3575060a9548114155b6123ff5760405162461bcd60e51b815260206004820152601f60248201527f696e76616c69642070726f6f66207265776172642070657263656e74616765006044820152606401610a70565b60a980549082905560408051828152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b02239101611c76565b60a8541561248d5760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b612495613400565b5f806124a186866133e5565b915091505f6124b4836001015160c01c90565b5f81815260a1602052604090205490915082146125135760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b61251c81613211565b6125685760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610a70565b5f81815260a4602052604090206003810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560a6805460ff1916905560995460029091015442916125c1916143c5565b11612637575f81815260a4602090815260408083206003908101805460ff1916600117905560a2835292819020909201548251808401909352600783527f54696d656f75740000000000000000000000000000000000000000000000000091830191909152612632918391906138b0565b6122a1565b612642838686613a0c565b6122a181336040518060400160405280600d81526020017f50726f6f66207375636365737300000000000000000000000000000000000000815250613bbf565b61268a61338b565b60aa80545f90915561269c8282613c8b565b604080516001600160a01b0384168152602081018390527fb1b2058a6969e2d25e47bcaebe8ae21c29a23b2752429315b75e2f4f285f3d879101611c76565b6126e361338b565b5f805260a06020527fb84a74ec6ef4d0e83b6006dfaa014ab4026f9f3b97d186e604d29998a4e808ea541561275a5760405162461bcd60e51b815260206004820152601660248201527f67656e6573697320626174636820696d706f72746564000000000000000000006044820152606401610a70565b5f8061276684846133e5565b915091505f612779836001015160c01c90565b905080156127c95760405162461bcd60e51b815260206004820152601360248201527f696e76616c696420626174636820696e646578000000000000000000000000006044820152606401610a70565b5f6127d5846079015190565b9050806128245760405162461bcd60e51b815260206004820152600f60248201527f7a65726f20737461746520726f6f7400000000000000000000000000000000006044820152606401610a70565b600984015160c01c156128795760405162461bcd60e51b815260206004820152601d60248201527f6c31206d65737361676520706f707065642073686f756c6420626520300000006044820152606401610a70565b5f612885856019015190565b036128d25760405162461bcd60e51b815260206004820152600e60248201527f7a65726f206461746120686173680000000000000000000000000000000000006044820152606401610a70565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440146128fe856039015190565b1461294b5760405162461bcd60e51b815260206004820152601660248201527f696e76616c69642076657273696f6e65642068617368000000000000000000006044820152606401610a70565b5f82815260a1602090815260408083208690558051608081018252428082528184019081528183018581526060830186815288875260a2865284872093518455915160018401555160028301555160039091015560ab825280832084905560a0909152808220839055609e849055609d84905551849184917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a3604080518281525f6020820152849184917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d910160405180910390a3505050505050565b612a3361338b565b8015612b5457612a41613d36565b60a65460ff1615612b135760a7545f90815260a460209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a59092528220805491929091612a959084906143c5565b909155505060a7545f90815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a6805460ff191690555b7f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b6040516001600160a01b03909116815260200160405180910390a150565b612b5c613d90565b7f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33612b36565b50565b335f908152609f602052604090205460ff16612be45760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206368616c6c656e67657220616c6c6f776564000000000000006044820152606401610a70565b60a85415612c345760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b612c3c613400565b60a65460ff1615612c8f5760405162461bcd60e51b815260206004820152601460248201527f616c726561647920696e206368616c6c656e67650000000000000000000000006044820152606401610a70565b8167ffffffffffffffff16609d5410612cea5760405162461bcd60e51b815260206004820152601760248201527f626174636820616c72656164792066696e616c697a65640000000000000000006044820152606401610a70565b67ffffffffffffffff82165f90815260a160205260409020548114612d515760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b612d648267ffffffffffffffff16611326565b612db05760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610a70565b67ffffffffffffffff82165f90815260a460205260409020546801000000000000000090046001600160a01b031615612e2b5760405162461bcd60e51b815260206004820152601860248201527f626174636820616c7265616479206368616c6c656e67656400000000000000006044820152606401610a70565b67ffffffffffffffff82165f90815260a260205260409020600101544210612ebb5760405162461bcd60e51b815260206004820152603360248201527f63616e6e6f74206368616c6c656e6765206261746368206f757473696465207460448201527f6865206368616c6c656e67652077696e646f77000000000000000000000000006064820152608401610a70565b60975f9054906101000a90046001600160a01b03166001600160a01b0316630d13fd7b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f0b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f2f9190614496565b341015612f7e5760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742076616c756500000000000000000000000000006044820152606401610a70565b67ffffffffffffffff82811660a78190556040805160c0810182528281523360208083018281523484860190815242606086019081525f6080870181815260a0880182815299825260a4909552969096209451855492516001600160a01b031668010000000000000000027fffffffff00000000000000000000000000000000000000000000000000000000909316981697909717178355945160018301559151600282015592516003909301805492511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff941515949094167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909316929092179290921790556001600160a01b03168267ffffffffffffffff167f3a6ea19df25b49e7624e313ce7c1ab23984238e93727260db56a81735b1b9976346040516130d091815260200190565b60405180910390a35f609d5460016130e891906143c5565b90505b609e548111613140578267ffffffffffffffff16811461312e576099545f82815260a26020526040812060010180549091906131289084906143c5565b90915550505b8061313881614567565b9150506130eb565b505060a6805460ff1916600117905550565b335f90815260a56020526040812054908190036131b15760405162461bcd60e51b815260206004820152601c60248201527f696e76616c69642062617463684368616c6c656e6765526577617264000000006044820152606401610a70565b335f90815260a560205260408120556131ca8282613c8b565b816001600160a01b03167f9c25fa83f414ed363c8d39c98fb3e17567b3431cede71eb062c49d2a63ce247a8260405161320591815260200190565b60405180910390a25050565b5f81815260a460205260408120546801000000000000000090046001600160a01b03161580159061134e5750505f90815260a46020526040902060030154610100900460ff161590565b61326361338b565b5f8111801561327457506098548114155b6132c05760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206e65772066696e616c697a6520706572696f6400000000006044820152606401610a70565b609880549082905560408051828152602081018490527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a4379101611c76565b61330661338b565b6001600160a01b0381166133825760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a70565b612b838161373f565b6033546001600160a01b03163314611f655760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a70565b5f805f6133f28585613dc9565b812090969095509350505050565b60655460ff1615611f655760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a70565b805f0361345e575050565b8082035f5b8281101561350a5761010081840381111561347d57508083035b609b546040517f3c7f528300000000000000000000000000000000000000000000000000000000815260048101859052602481018390526001600160a01b0390911690633c7f5283906044015f604051808303815f87803b1580156134e0575f80fd5b505af11580156134f2573d5f803e3d5ffd5b50505050610100830192505061010081019050613463565b50505050565b60405183515f9182916020870191908190849061352e908590613e32565b90506002840193505f5b818110156135b257603c81028501805184526020908101517fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000001690840152603a830192505f613588603c8361459e565b61359290876143c5565b90505f6135a382603a015160f01c90565b97909701965050600101613538565b506020850282016040525b801561367b575f6135d285603a015160f01c90565b90506135e083828b8b613ec7565b92505f6135f1866038015160f01c90565b9050818110156136435760405162461bcd60e51b815260206004820152601d60248201527f6e756d20747873206c657373207468616e206e756d204c31206d7367730000006044820152606401610a70565b50978801979690960195603c93909301927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016135bd565b50819003902096919550909350505050565b8082535050565b5f805f6020840190506002810191505f6136af828651613e32565b90505f5b6136be6001836143d8565b8110156136d457603c93909301926001016136b3565b505f6136e1845160c01c90565b9695505050505050565b60605f808080806136fe888a018a6146a2565b955095509550955095505081871061371c5794506137389350505050565b838710613730578295505050505050613738565b509293505050505b9392505050565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff166138245760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b611f65613f95565b5f54610100900460ff166138a85760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b611f6561401d565b60a88390555f83815260a460205260408082205460975491517f45bc4d1000000000000000000000000000000000000000000000000000000000815260048101869052680100000000000000009091046001600160a01b03908116939216906345bc4d10906024016020604051808303815f875af1158015613934573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139589190614496565b5f86815260a460205260409020600101549091506139779082906143c5565b5f86815260a460209081526040808320546801000000000000000090046001600160a01b0316835260a5909152812080549091906139b69084906143c5565b90915550506040516139c990849061473f565b604051908190038120906001600160a01b0384169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b80613a595760405162461bcd60e51b815260206004820152601360248201527f496e76616c69642062617463682070726f6f66000000000000000000000000006044820152606401610a70565b5f613a68846001015160c01c90565b90505f613a76856039015190565b90505f7f0000000000000000000000000000000000000000000000000000000000000000613aa5876059015190565b6079880151609989015160b98a015160198b015160405160c09690961b7fffffffffffffffff000000000000000000000000000000000000000000000000166020870152602886019490945260488501929092526068840152608883015260a882015260c8810183905260e801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120609c549091506001600160a01b0316632c09a848613b67885160f81c90565b858888866040518663ffffffff1660e01b8152600401613b8b95949392919061476b565b5f6040518083038186803b158015613ba1575f80fd5b505afa158015613bb3573d5f803e3d5ffd5b50505050505050505050565b5f83815260a4602052604081206001015460a954909190606490613be3908461459e565b613bed919061479c565b9050613bf981836143d8565b60aa5f828254613c0991906143c5565b90915550506001600160a01b0384165f90815260a5602052604081208054839290613c359084906143c5565b9091555050604051613c4890849061473f565b604051908190038120906001600160a01b0386169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b8015613d32575f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613cda576040519150601f19603f3d011682016040523d82523d5f602084013e613cdf565b606091505b5050905080613d305760405162461bcd60e51b815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c656400000000006044820152606401610a70565b505b5050565b613d3e613400565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613d733390565b6040516001600160a01b03909116815260200160405180910390a1565b613d986140a2565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33613d73565b5f8160f9811015613e1c5760405162461bcd60e51b815260206004820152601d60248201527f626174636820686561646572206c656e67746820746f6f20736d616c6c0000006044820152606401610a70565b6040519150808483378082016040529250929050565b5f613e3e835160f01c90565b9050805f03613e79576040517f5168407700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613e84603c8261459e565b613e8f9060026143c5565b821461134e576040517f4a969e2d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f835f03613ed6575083613f8d565b609b546001600160a01b03165f5b85811015613f87576040517fae453cd5000000000000000000000000000000000000000000000000000000008152600481018590525f906001600160a01b0384169063ae453cd590602401602060405180830381865afa158015613f4a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f6e9190614496565b8852506020909601956001948501949384019301613ee4565b50859150505b949350505050565b5f54610100900460ff166140115760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b6065805460ff19169055565b5f54610100900460ff166140995760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b611f653361373f565b60655460ff16611f655760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610a70565b5f60208284031215614104575f80fd5b5035919050565b80356001600160a01b0381168114614121575f80fd5b919050565b5f60208284031215614136575f80fd5b6137388261410b565b5f8083601f84011261414f575f80fd5b50813567ffffffffffffffff811115614166575f80fd5b60208301915083602082850101111561417d575f80fd5b9250929050565b5f805f60408486031215614196575f80fd5b833567ffffffffffffffff8111156141ac575f80fd5b6141b88682870161413f565b909790965060209590950135949350505050565b5f80602083850312156141dd575f80fd5b823567ffffffffffffffff8111156141f3575f80fd5b6141ff8582860161413f565b90969095509350505050565b5f806040838503121561421c575f80fd5b823567ffffffffffffffff80821115614233575f80fd5b9084019060c08287031215614246575f80fd5b9092506020840135908082111561425b575f80fd5b5083016060818603121561426d575f80fd5b809150509250929050565b5f805f805f8060c0878903121561428d575f80fd5b6142968761410b565b95506142a46020880161410b565b94506142b26040880161410b565b9350606087013592506080870135915060a087013590509295509295509295565b5f805f80604085870312156142e6575f80fd5b843567ffffffffffffffff808211156142fd575f80fd5b6143098883890161413f565b90965094506020870135915080821115614321575f80fd5b5061432e8782880161413f565b95989497509550505050565b8015158114612b83575f80fd5b5f60208284031215614357575f80fd5b81356137388161433a565b5f8060408385031215614373575f80fd5b823567ffffffffffffffff8116811461438a575f80fd5b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561134e5761134e614398565b8181038181111561134e5761134e614398565b5f602082840312156143fb575f80fd5b81516137388161433a565b5f60208284031215614416575f80fd5b813560ff81168114613738575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614459575f80fd5b83018035915067ffffffffffffffff821115614473575f80fd5b60200191503681900382131561417d575f80fd5b818382375f9101908152919050565b5f602082840312156144a6575f80fd5b5051919050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f6080820187835260206080602085015281885180845260a08601915060208a0193505f5b8181101561453e5784516001600160a01b031683529383019391830191600101614519565b505087604086015284810360608601526145598187896144ad565b9a9950505050505050505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361459757614597614398565b5060010190565b808202811582820484141761134e5761134e614398565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126145f1575f80fd5b8135602067ffffffffffffffff8083111561460e5761460e6145b5565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108482111715614651576146516145b5565b6040529384526020818701810194908101925087851115614670575f80fd5b6020870191505b84821015614697576146888261410b565b83529183019190830190614677565b979650505050505050565b5f805f805f8060c087890312156146b7575f80fd5b86359550602087013567ffffffffffffffff808211156146d5575f80fd5b6146e18a838b016145e2565b96506040890135955060608901359150808211156146fd575f80fd5b6147098a838b016145e2565b94506080890135935060a0890135915080821115614725575f80fd5b5061473289828a016145e2565b9150509295509295509295565b5f82515f5b8181101561475e5760208186018101518583015201614744565b505f920191825250919050565b858152846020820152608060408201525f61478a6080830185876144ad565b90508260608301529695505050505050565b5f826147cf577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b50049056fea164736f6c6343000818000a +0x608060405260043610610332575f3560e01c806388b1ea09116101a7578063bedb86fb116100e7578063d8dc99d211610092578063dff7827e1161006d578063dff7827e14610a3a578063e3fff1dd14610a4f578063f2fde38b14610a6e578063fb1e8b0414610a8d575f80fd5b8063d8dc99d2146109e7578063ddd8a3dc146109fc578063de8b303514610a1b575f80fd5b8063ce5db8d6116100c2578063ce5db8d614610994578063cf9a6745146109a9578063d279c191146109c8575f80fd5b8063bedb86fb14610943578063c555389214610962578063cd4edc6914610981575f80fd5b8063a479265d11610152578063b31a77d31161012d578063b31a77d3146108d1578063b3484425146108e6578063b35dac4e14610905578063b3e0a50914610924575f80fd5b8063a479265d14610872578063a4f209b014610887578063abc8d68d146108a6575f80fd5b8063910129d411610182578063910129d4146107f457806397fc007c14610825578063a415d8dc14610844575f80fd5b806388b1ea091461070e5780638da5cb5b146107275780638f1d377614610744575f80fd5b80633b70c18a116102725780635ef7a94a1161021d57806368589dfa116101f857806368589dfa146106915780636c578c1d146106bc578063715018a6146106db578063728cdbca146106ef575f80fd5b80635ef7a94a146105c65780635f77cf1d146106265780636126729014610672575f80fd5b80634e8f1d671161024d5780634e8f1d671461057157806357e0af6c146105905780635c975abb146105af575f80fd5b80633b70c18a1461052a5780633e001b6614610549578063428868b51461055e575f80fd5b806313361101116102dd57806321e2f9e0116102b857806321e2f9e01461047e5780632362f03e1461049d5780632571098d146104c85780632b7ac3f3146104f3575f80fd5b8063133611011461041a57806318463fb01461043957806318af3b2b1461044e575f80fd5b806310d445831161030d57806310d44583146103c4578063116a1f42146103e3578063121dcd5014610405575f80fd5b806304d772151461033d578063059def61146103805780630ceb6780146103a3575f80fd5b3661033957005b5f80fd5b348015610348575f80fd5b5061036b61035736600461462b565b60a36020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561038b575f80fd5b50610395609d5481565b604051908152602001610377565b3480156103ae575f80fd5b506103c26103bd36600461465d565b610aa2565b005b3480156103cf575f80fd5b506103c26103de3660046146bb565b610b74565b3480156103ee575f80fd5b5061036b6103fd36600461462b565b609d54101590565b348015610410575f80fd5b50610395609e5481565b348015610425575f80fd5b506103c2610434366004614703565b610eb0565b348015610444575f80fd5b5061039560a75481565b348015610459575f80fd5b5061036b61046836600461462b565b5f90815260a26020526040902060010154421090565b348015610489575f80fd5b5061036b61049836600461462b565b61138a565b3480156104a8575f80fd5b506103956104b736600461462b565b60a16020525f908152604090205481565b3480156104d3575f80fd5b506103956104e236600461462b565b60a06020525f908152604090205481565b3480156104fe575f80fd5b50609c54610512906001600160a01b031681565b6040516001600160a01b039091168152602001610377565b348015610535575f80fd5b50609b54610512906001600160a01b031681565b348015610554575f80fd5b5061039560aa5481565b6103c261056c366004614768565b6113b8565b34801561057c575f80fd5b506103c261058b3660046147c8565b6115f4565b34801561059b575f80fd5b506103c26105aa36600461462b565b6118c2565b3480156105ba575f80fd5b5060655460ff1661036b565b3480156105d1575f80fd5b506106066105e036600461462b565b60a26020525f908152604090208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001610377565b348015610631575f80fd5b506106597f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610377565b34801561067d575f80fd5b506103c261068c36600461462b565b61196d565b34801561069c575f80fd5b506103956106ab36600461462b565b60ab6020525f908152604090205481565b3480156106c7575f80fd5b506103c26106d636600461465d565b611b48565b3480156106e6575f80fd5b506103c2611c05565b3480156106fa575f80fd5b506103c2610709366004614879565b611c18565b348015610719575f80fd5b5060a65461036b9060ff1681565b348015610732575f80fd5b506033546001600160a01b0316610512565b34801561074f575f80fd5b506107b061075e36600461462b565b60a46020525f9081526040902080546001820154600283015460039093015467ffffffffffffffff831693680100000000000000009093046001600160a01b0316929060ff8082169161010090041686565b6040805167ffffffffffffffff90971687526001600160a01b03909516602087015293850192909252606084015215156080830152151560a082015260c001610377565b3480156107ff575f80fd5b5061036b61080e36600461462b565b5f90815260a4602052604090206003015460ff1690565b348015610830575f80fd5b506103c261083f36600461465d565b611f21565b34801561084f575f80fd5b5061036b61085e36600461465d565b609f6020525f908152604090205460ff1681565b34801561087d575f80fd5b5061039560995481565b348015610892575f80fd5b506103c26108a136600461462b565b612004565b3480156108b1575f80fd5b506103956108c036600461465d565b60a56020525f908152604090205481565b3480156108dc575f80fd5b5061039560a85481565b3480156108f1575f80fd5b506103c26109003660046148d4565b6120b4565b348015610910575f80fd5b506103c261091f36600461465d565b6123b8565b34801561092f575f80fd5b506103c261093e366004614703565b612411565b34801561094e575f80fd5b506103c261095d366004614948565b612761565b34801561096d575f80fd5b506103c261097c36600461462b565b61289f565b6103c261098f36600461497a565b612942565b34801561099f575f80fd5b5061039560985481565b3480156109b4575f80fd5b506103c26109c336600461462b565b612ed4565b3480156109d3575f80fd5b506103c26109e236600461465d565b613043565b3480156109f2575f80fd5b5061039560ac5481565b348015610a07575f80fd5b50609754610512906001600160a01b031681565b348015610a26575f80fd5b5061036b610a3536600461462b565b613102565b348015610a45575f80fd5b50610395609a5481565b348015610a5a575f80fd5b506103c2610a6936600461462b565b61314c565b348015610a79575f80fd5b506103c2610a8836600461465d565b6131ef565b348015610a98575f80fd5b5061039560a95481565b610aaa61327c565b6001600160a01b0381165f908152609f602052604090205460ff1615610b175760405162461bcd60e51b815260206004820152601f60248201527f6163636f756e7420697320616c72656164792061206368616c6c656e6765720060448201526064015b60405180910390fd5b6001600160a01b0381165f818152609f6020908152604091829020805460ff1916600190811790915591519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc00991015b60405180910390a250565b610b7c61327c565b5f8111610bcb5760405162461bcd60e51b815260206004820152601560248201527f636f756e74206d757374206265206e6f6e7a65726f00000000000000000000006044820152606401610b0e565b5f80610bd785856132d6565b915091505f610bea836001015160c01c90565b5f81815260a160205260409020549091508214610c495760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610b0e565b5f60a181610c5787856149cf565b81526020019081526020015f205414610cd75760405162461bcd60e51b8152602060048201526024808201527f726576657274696e67206d7573742073746172742066726f6d2074686520656e60448201527f64696e67000000000000000000000000000000000000000000000000000000006064820152608401610b0e565b609d548111610d4e5760405162461bcd60e51b815260206004820152602160248201527f63616e206f6e6c792072657665727420756e46696e616c697a6564206261746360448201527f68000000000000000000000000000000000000000000000000000000000000006064820152608401610b0e565b610d596001826149e2565b609e555b8315610ea857604051829082907ecae2739091badfd91c373f0a16cede691e0cd25bb80cff77dd5caeb4710146905f90a35f81815260a16020526040812055610da581613102565b15610e00575f81815260a460209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a59092528220805491929091610df09084906149cf565b909155505060a6805460ff191690555b5f81815260a46020526040812080547fffffffff00000000000000000000000000000000000000000000000000000000168155600181018290556002810191909155600301805461ffff1916905560a85415801590610e60575060a85481145b15610e6a575f60a8555b6001015f81815260a160205260409020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90940193915081610d5d575b505050505050565b60a85415610f005760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610b0e565b610f0861336f565b5f80610f1484846132d6565b915091505f610f27836001015160c01c90565b5f81815260a160205260409020549091508214610f865760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610b0e565b610f8f8161138a565b610fdb5760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610b0e565b610fe481613102565b156110315760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610b0e565b5f81815260a4602052604090206003015460ff16156110925760405162461bcd60e51b815260206004820152601660248201527f62617463682073686f756c6420626520726576657274000000000000000000006044820152606401610b0e565b5f81815260a260205260409020600101544210156110f25760405162461bcd60e51b815260206004820152601960248201527f626174636820696e206368616c6c656e67652077696e646f77000000000000006044820152606401610b0e565b605983015160a05f6111056001856149e2565b81526020019081526020015f2054146111605760405162461bcd60e51b815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610b0e565b5f81815260a06020526040902054156111bb5760405162461bcd60e51b815260206004820152601660248201527f626174636820616c7265616479207665726966696564000000000000000000006044820152606401610b0e565b80609d546001011461120f5760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610b0e565b609d819055600160a35f611224866099015190565b815260208101919091526040015f20805460ff191691151591909117905560798301515f82815260a06020526040902055611273611266846011015160c01c90565b600985015160c01c6133c2565b60a25f6112816001846149e2565b815260208101919091526040015f908120818155600180820183905560028201839055600390910182905560ab91906112ba90846149e2565b81526020019081526020015f205f905560a45f6001836112da91906149e2565b815260208082019290925260409081015f90812080547fffffffff000000000000000000000000000000000000000000000000000000001681556001810182905560028101829055600301805461ffff1916905583815260a1909252902054817f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d611366866079015190565b60998701516040805192835260208301919091520160405180910390a35050505050565b5f81815260a26020526040812054158015906113b257505f82815260a1602052604090205415155b92915050565b6097546001600160a01b03166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611424573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061144891906149f5565b6114945760405162461bcd60e51b815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f7765640000000000006044820152606401610b0e565b60a854156114e45760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610b0e565b6114ec61336f565b60ac54609b54604080517fb59b1a7800000000000000000000000000000000000000000000000000000000815290514293926001600160a01b03169163b59b1a789160048083019260209291908290030181865afa158015611550573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115749190614a10565b61157e91906149cf565b10156115e6575f6115956080840160608501614a27565b61ffff16116115e65760405162461bcd60e51b815260206004820152600b60248201527f6c316d73672064656c61790000000000000000000000000000000000000000006044820152606401610b0e565b6115f0828261347f565b5050565b60a854156116445760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610b0e565b61164c61336f565b60ac54609e545f90815260a260205260408120549091429161166e91906149cf565b1090505f4260ac54609b5f9054906101000a90046001600160a01b03166001600160a01b031663b59b1a786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116ea9190614a10565b6116f491906149cf565b109050811580156117025750805b15611769575f61171860808a0160608b01614a27565b61ffff16116117695760405162461bcd60e51b815260206004820152600b60248201527f6c316d73672064656c61790000000000000000000000000000000000000000006044820152606401610b0e565b81806117725750805b6117be5760405162461bcd60e51b815260206004820152600e60248201527f696e76616c69642074696d696e670000000000000000000000000000000000006044820152606401610b0e565b6117c8888861347f565b5f806117d488886132d6565b915091505f6117e7836001015160c01c90565b905080609e541461183a5760405162461bcd60e51b815260206004820152601660248201527f696e636f727265637420626174636820686561646572000000000000000000006044820152606401610b0e565b5f81815260a1602052604090205482146118965760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610b0e565b5f81815260a260205260409020426001909101556118b5838888613bb2565b5050505050505050505050565b6118ca61327c565b5f811180156118db57506099548114155b6119275760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964206e65772070726f6f662077696e646f7700000000000000006044820152606401610b0e565b609980549082905560408051828152602081018490527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a6191015b60405180910390a15050565b5f54600290610100900460ff1615801561198d57505f5460ff8083169116105b6119ff5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610b0e565b5f805461ffff191660ff831617610100179055611a1d5f5460ff1690565b60ff16600214611a6f5760405162461bcd60e51b815260206004820152601660248201527f6d757374206861766520696e697469616c697a656421000000000000000000006044820152606401610b0e565b81611ae25760405162461bcd60e51b815260206004820152602760248201527f63616e206e6f742073657420737461746520726f6f742077697468206279746560448201527f73333228302921000000000000000000000000000000000000000000000000006064820152608401610b0e565b609e545f90815260ab6020526040902054611b0b57609e545f90815260ab602052604090208290555b5f805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611961565b611b5061327c565b6001600160a01b0381165f908152609f602052604090205460ff16611bb75760405162461bcd60e51b815260206004820152601b60248201527f6163636f756e74206973206e6f742061206368616c6c656e67657200000000006044820152606401610b0e565b6001600160a01b0381165f818152609f60209081526040808320805460ff19169055519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc0099101610b69565b611c0d61327c565b611c165f613d65565b565b5f54610100900460ff1615808015611c3657505f54600160ff909116105b80611c4f5750303b158015611c4f57505f5460ff166001145b611cc15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610b0e565b5f805460ff191660011790558015611ce2575f805461ff0019166101001790555b6001600160a01b0386161580611cff57506001600160a01b038516155b15611d36576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038716611d8c5760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206c31207374616b696e6720636f6e747261637400000000006044820152606401610b0e565b611d94613dce565b611d9c613e52565b609780546001600160a01b03808a167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255609b8054898416908316179055609c805492881692909116821790556098859055609984905560a98390556040515f907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96908290a3604080515f8152602081018690527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a437910160405180910390a1604080515f8152602081018590527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a61910160405180910390a1604080515f8152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b0223910160405180910390a18015611f18575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b611f2961327c565b6001600160a01b03811615801590611f4f5750609c546001600160a01b03828116911614155b611f9b5760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964206e65772076657269666965720000000000000000000000006044820152606401610b0e565b609c80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96905f90a35050565b61200c61327c565b5f8111801561201c575060648111155b801561202a575060a9548114155b6120765760405162461bcd60e51b815260206004820152601f60248201527f696e76616c69642070726f6f66207265776172642070657263656e74616765006044820152606401610b0e565b60a980549082905560408051828152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b02239101611961565b60a854156121045760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610b0e565b61210c61336f565b6097546001600160a01b03166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015612178573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061219c91906149f5565b6121e85760405162461bcd60e51b815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f7765640000000000006044820152606401610b0e565b5f806121f486866132d6565b915091505f612207836001015160c01c90565b5f81815260a1602052604090205490915082146122665760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610b0e565b61226f81613102565b6122bb5760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610b0e565b5f81815260a46020526040902060038101805461ff00191661010017905560a6805460ff1916905560995460029091015442916122f7916149cf565b1161236d575f81815260a4602090815260408083206003908101805460ff1916600117905560a2835292819020909201548251808401909352600783527f54696d656f7574000000000000000000000000000000000000000000000000009183019190915261236891839190613ed6565b611f18565b612378838686613bb2565b611f1881336040518060400160405280600d81526020017f50726f6f66207375636365737300000000000000000000000000000000000000815250614032565b6123c061327c565b60aa80545f9091556123d282826140fe565b604080516001600160a01b0384168152602081018390527fb1b2058a6969e2d25e47bcaebe8ae21c29a23b2752429315b75e2f4f285f3d879101611961565b61241961327c565b5f805260a06020527fb84a74ec6ef4d0e83b6006dfaa014ab4026f9f3b97d186e604d29998a4e808ea54156124905760405162461bcd60e51b815260206004820152601660248201527f67656e6573697320626174636820696d706f72746564000000000000000000006044820152606401610b0e565b5f8061249c84846132d6565b915091505f6124af836001015160c01c90565b905080156124ff5760405162461bcd60e51b815260206004820152601360248201527f696e76616c696420626174636820696e646578000000000000000000000000006044820152606401610b0e565b5f61250b846079015190565b90508061255a5760405162461bcd60e51b815260206004820152600f60248201527f7a65726f20737461746520726f6f7400000000000000000000000000000000006044820152606401610b0e565b600984015160c01c156125af5760405162461bcd60e51b815260206004820152601d60248201527f6c31206d65737361676520706f707065642073686f756c6420626520300000006044820152606401610b0e565b5f6125bb856019015190565b036126085760405162461bcd60e51b815260206004820152600e60248201527f7a65726f206461746120686173680000000000000000000000000000000000006044820152606401610b0e565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014612634856039015190565b146126815760405162461bcd60e51b815260206004820152601660248201527f696e76616c69642076657273696f6e65642068617368000000000000000000006044820152606401610b0e565b5f82815260a1602090815260408083208690558051608081018252428082528184019081528183018581526060830186815288875260a2865284872093518455915160018401555160028301555160039091015560ab825280832084905560a0909152808220839055609e849055609d84905551849184917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a3604080518281525f6020820152849184917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d910160405180910390a3505050505050565b61276961327c565b801561286d576127776141a8565b60a65460ff161561282c5760a7545f90815260a460209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a590925282208054919290916127cb9084906149cf565b909155505060a7545f90815260a46020526040812080547fffffffff00000000000000000000000000000000000000000000000000000000168155600181018290556002810191909155600301805461ffff1916905560a6805460ff191690555b7f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b6040516001600160a01b03909116815260200160405180910390a150565b612875614202565b7f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa3361284f565b50565b6128a761327c565b5f811180156128b8575060ac548114155b6129045760405162461bcd60e51b815260206004820152601f60248201527f696e76616c6964206e657720726f6c6c75702064656c617920706572696f64006044820152606401610b0e565b60ac80549082905560408051828152602081018490527f624e47dc9fb8f8cfeaf4ead4710277cc1757136cfa885e465514cf6d510f0ad19101611961565b335f908152609f602052604090205460ff166129a05760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206368616c6c656e67657220616c6c6f776564000000000000006044820152606401610b0e565b60a854156129f05760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610b0e565b6129f861336f565b60a65460ff1615612a4b5760405162461bcd60e51b815260206004820152601460248201527f616c726561647920696e206368616c6c656e67650000000000000000000000006044820152606401610b0e565b8167ffffffffffffffff16609d5410612aa65760405162461bcd60e51b815260206004820152601760248201527f626174636820616c72656164792066696e616c697a65640000000000000000006044820152606401610b0e565b67ffffffffffffffff82165f90815260a160205260409020548114612b0d5760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610b0e565b612b208267ffffffffffffffff1661138a565b612b6c5760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610b0e565b67ffffffffffffffff82165f90815260a460205260409020546801000000000000000090046001600160a01b031615612be75760405162461bcd60e51b815260206004820152601860248201527f626174636820616c7265616479206368616c6c656e67656400000000000000006044820152606401610b0e565b67ffffffffffffffff82165f90815260a260205260409020600101544210612c775760405162461bcd60e51b815260206004820152603360248201527f63616e6e6f74206368616c6c656e6765206261746368206f757473696465207460448201527f6865206368616c6c656e67652077696e646f77000000000000000000000000006064820152608401610b0e565b60975f9054906101000a90046001600160a01b03166001600160a01b0316630d13fd7b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cc7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ceb9190614a10565b341015612d3a5760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742076616c756500000000000000000000000000006044820152606401610b0e565b67ffffffffffffffff82811660a78190556040805160c0810182528281523360208083018281523484860190815242606086019081525f6080870181815260a0880182815299825260a4909552969096209451855492516001600160a01b031668010000000000000000027fffffffff000000000000000000000000000000000000000000000000000000009093169816979097171783559451600183015591516002820155925160039093018054925115156101000261ff00199415159490941661ffff19909316929092179290921790556001600160a01b03168267ffffffffffffffff167f3a6ea19df25b49e7624e313ce7c1ab23984238e93727260db56a81735b1b997634604051612e5291815260200190565b60405180910390a35f609d546001612e6a91906149cf565b90505b609e548111612ec2578267ffffffffffffffff168114612eb0576099545f82815260a2602052604081206001018054909190612eaa9084906149cf565b90915550505b80612eba81614a48565b915050612e6d565b505060a6805460ff1916600117905550565b5f54600390610100900460ff16158015612ef457505f5460ff8083169116105b612f665760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610b0e565b5f805461ffff191660ff831617610100178155829003612fc85760405162461bcd60e51b815260206004820152601b60248201527f696e76616c696420726f6c6c75702064656c617920706572696f6400000000006044820152606401610b0e565b60ac829055604080515f8152602081018490527f624e47dc9fb8f8cfeaf4ead4710277cc1757136cfa885e465514cf6d510f0ad1910160405180910390a15f805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611961565b335f90815260a56020526040812054908190036130a25760405162461bcd60e51b815260206004820152601c60248201527f696e76616c69642062617463684368616c6c656e6765526577617264000000006044820152606401610b0e565b335f90815260a560205260408120556130bb82826140fe565b816001600160a01b03167f9c25fa83f414ed363c8d39c98fb3e17567b3431cede71eb062c49d2a63ce247a826040516130f691815260200190565b60405180910390a25050565b5f81815260a460205260408120546801000000000000000090046001600160a01b0316158015906113b25750505f90815260a46020526040902060030154610100900460ff161590565b61315461327c565b5f8111801561316557506098548114155b6131b15760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206e65772066696e616c697a6520706572696f6400000000006044820152606401610b0e565b609880549082905560408051828152602081018490527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a4379101611961565b6131f761327c565b6001600160a01b0381166132735760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b0e565b61289c81613d65565b6033546001600160a01b03163314611c165760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b0e565b5f805f6132e3858561423b565b90505f8160ff165f03613304576132fa86866142ab565b9094509050613361565b8160ff16600103613319576132fa8686614314565b60405162461bcd60e51b815260206004820152601960248201527f556e737570706f727465642062617463682076657273696f6e000000000000006044820152606401610b0e565b808420925050509250929050565b60655460ff1615611c165760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610b0e565b805f036133cd575050565b8082035f5b82811015613479576101008184038111156133ec57508083035b609b546040517f3c7f528300000000000000000000000000000000000000000000000000000000815260048101859052602481018390526001600160a01b0390911690633c7f5283906044015f604051808303815f87803b15801561344f575f80fd5b505af1158015613461573d5f803e3d5ffd5b505050506101008301925050610100810190506133d2565b50505050565b61348c6020830183614a7f565b60ff1615806134aa57506134a36020830183614a7f565b60ff166001145b6134f65760405162461bcd60e51b815260206004820152600f60248201527f696e76616c69642076657273696f6e00000000000000000000000000000000006044820152606401610b0e565b60808201356135475760405162461bcd60e51b815260206004820152601b60248201527f70726576696f757320737461746520726f6f74206973207a65726f00000000006044820152606401610b0e565b60a08201356135985760405162461bcd60e51b815260206004820152601660248201527f6e657720737461746520726f6f74206973207a65726f000000000000000000006044820152606401610b0e565b5f806135af6135aa6020860186614a9f565b6132d6565b915091505f6135c2836001015160c01c90565b90505f60a1816135d38460016149cf565b81526020019081526020015f20541461362e5760405162461bcd60e51b815260206004820152601760248201527f626174636820616c726561647920636f6d6d69747465640000000000000000006044820152606401610b0e565b609e54811461367f5760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610b0e565b5f81815260a1602052604090205482146136db5760405162461bcd60e51b815260206004820152601b60248201527f696e636f727265637420706172656e74206261746368206861736800000000006044820152606401610b0e565b5f81815260ab602052604090205460808601351461373b5760405162461bcd60e51b815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610b0e565b5f61374a846011015160c01c90565b90505f6137766137606060890160408a01614b00565b61377060808a0160608b01614a27565b84614367565b90506137886080880160608901614a27565b6001939093019261ffff1691909101905f8049156137a7575f496137c9565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440145b905060f96137da60208a018a614a7f565b60ff166001036137e957506101015b60408051828101909152965061380e8761380660208c018c614a7f565b60ff166143ab565b60c085901b600188015261383c8761382c60808c0160608d01614a27565b61ffff1660c01b60099190910152565b60c084811b6011890152601988018490526039880183905260808a0135605989015260a08a0135607989015289013560998801526138a08761388160208b018b614a9f565b60405161388f929190614b19565b604051809103902060b99190910152565b60d9870186905260016138b660208b018b614a7f565b60ff16106138e8576138e8876138d260608c0160408d01614b00565b67ffffffffffffffff1660c01b60f99190910152565b8087205f86815260a1602090815260408083209390935560ab905290812060a08b0135905560a65460ff16156139475760a7545f90815260a46020526040902060020154609954429161393a916149cf565b61394491906149e2565b90505b6040518060800160405280428152602001826098544261396791906149cf565b61397191906149cf565b815260200161398660608d0160408e01614b00565b67ffffffffffffffff1681526097546020909101906001600160a01b031663d096c3c6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015613a04573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a289190614a10565b90525f87815260a2602090815260409182902083518155838201516001820155918301516002830155606090920151600390910155609e8790556097546001600160a01b031692506374fe27b79150893590613a9090613a8a908c018c614a9f565b5f6143b2565b5f613a9e60408d018d614a9f565b6040518663ffffffff1660e01b8152600401613abe959493929190614b6f565b602060405180830381865afa158015613ad9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613afd91906149f5565b613b6f5760405162461bcd60e51b815260206004820152602160248201527f746865207369676e617475726520766572696669636174696f6e206661696c6560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610b0e565b5f84815260a16020526040808220549051909186917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a35050505050505050565b80613bff5760405162461bcd60e51b815260206004820152601360248201527f496e76616c69642062617463682070726f6f66000000000000000000000000006044820152606401610b0e565b5f613c0e846001015160c01c90565b90505f613c1c856039015190565b90505f7f0000000000000000000000000000000000000000000000000000000000000000613c4b876059015190565b6079880151609989015160b98a015160198b015160405160c09690961b7fffffffffffffffff000000000000000000000000000000000000000000000000166020870152602886019490945260488501929092526068840152608883015260a882015260c8810183905260e801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120609c549091506001600160a01b0316632c09a848613d0d885160f81c90565b858888866040518663ffffffff1660e01b8152600401613d31959493929190614be2565b5f6040518083038186803b158015613d47575f80fd5b505afa158015613d59573d5f803e3d5ffd5b50505050505050505050565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff16613e4a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610b0e565b611c16614406565b5f54610100900460ff16613ece5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610b0e565b611c1661448e565b60a88390555f83815260a460205260408082205460975491517f45bc4d1000000000000000000000000000000000000000000000000000000000815260048101869052680100000000000000009091046001600160a01b03908116939216906345bc4d10906024016020604051808303815f875af1158015613f5a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f7e9190614a10565b5f86815260a46020526040902060010154909150613f9d9082906149cf565b5f86815260a460209081526040808320546801000000000000000090046001600160a01b0316835260a590915281208054909190613fdc9084906149cf565b9091555050604051613fef908490614c13565b604051908190038120906001600160a01b0384169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b5f83815260a4602052604081206001015460a9549091906064906140569084614c3f565b6140609190614c56565b905061406c81836149e2565b60aa5f82825461407c91906149cf565b90915550506001600160a01b0384165f90815260a56020526040812080548392906140a89084906149cf565b90915550506040516140bb908490614c13565b604051908190038120906001600160a01b0386169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b80156115f0575f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461414d576040519150601f19603f3d011682016040523d82523d5f602084013e614152565b606091505b50509050806141a35760405162461bcd60e51b815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c656400000000006044820152606401610b0e565b505050565b6141b061336f565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586141e53390565b6040516001600160a01b03909116815260200160405180910390a1565b61420a614513565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336141e5565b5f816142895760405162461bcd60e51b815260206004820152601260248201527f456d7074792062617463682068656164657200000000000000000000000000006044820152606401610b0e565b82825f81811061429b5761429b614c8e565b919091013560f81c949350505050565b5f8160f98110156142fe5760405162461bcd60e51b815260206004820152601d60248201527f626174636820686561646572206c656e67746820746f6f20736d616c6c0000006044820152606401610b0e565b6040519150808483378082016040529250929050565b5f8161010181146142fe5760405162461bcd60e51b815260206004820181905260248201527f626174636820686561646572206c656e67746820697320696e636f72726563746044820152606401610b0e565b6040805160c085901b815260f084901b6008820152600a60208502820181019092525f91810161439c8161ffff871686614565565b82900390912095945050505050565b8082535050565b60605f808080806143c5888a018a614da8565b95509550955095509550508187106143e35794506143ff9350505050565b8387106143f75782955050505050506143ff565b509293505050505b9392505050565b5f54610100900460ff166144825760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610b0e565b6065805460ff19169055565b5f54610100900460ff1661450a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610b0e565b611c1633613d65565b60655460ff16611c165760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610b0e565b5f825f036145745750826143ff565b609b546001600160a01b03165f5b84811015614621576040517fae453cd5000000000000000000000000000000000000000000000000000000008152600481018590525f906001600160a01b0384169063ae453cd590602401602060405180830381865afa1580156145e8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061460c9190614a10565b87525060209095019460019384019301614582565b5093949350505050565b5f6020828403121561463b575f80fd5b5035919050565b80356001600160a01b0381168114614658575f80fd5b919050565b5f6020828403121561466d575f80fd5b6143ff82614642565b5f8083601f840112614686575f80fd5b50813567ffffffffffffffff81111561469d575f80fd5b6020830191508360208285010111156146b4575f80fd5b9250929050565b5f805f604084860312156146cd575f80fd5b833567ffffffffffffffff8111156146e3575f80fd5b6146ef86828701614676565b909790965060209590950135949350505050565b5f8060208385031215614714575f80fd5b823567ffffffffffffffff81111561472a575f80fd5b61473685828601614676565b90969095509350505050565b5f60e08284031215614752575f80fd5b50919050565b5f60608284031215614752575f80fd5b5f8060408385031215614779575f80fd5b823567ffffffffffffffff80821115614790575f80fd5b61479c86838701614742565b935060208501359150808211156147b1575f80fd5b506147be85828601614758565b9150509250929050565b5f805f805f80608087890312156147dd575f80fd5b863567ffffffffffffffff808211156147f4575f80fd5b6148008a838b01614742565b97506020890135915080821115614815575f80fd5b6148218a838b01614758565b96506040890135915080821115614836575f80fd5b6148428a838b01614676565b9096509450606089013591508082111561485a575f80fd5b5061486789828a01614676565b979a9699509497509295939492505050565b5f805f805f8060c0878903121561488e575f80fd5b61489787614642565b95506148a560208801614642565b94506148b360408801614642565b9350606087013592506080870135915060a087013590509295509295509295565b5f805f80604085870312156148e7575f80fd5b843567ffffffffffffffff808211156148fe575f80fd5b61490a88838901614676565b90965094506020870135915080821115614922575f80fd5b5061492f87828801614676565b95989497509550505050565b801515811461289c575f80fd5b5f60208284031215614958575f80fd5b81356143ff8161493b565b803567ffffffffffffffff81168114614658575f80fd5b5f806040838503121561498b575f80fd5b61499483614963565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156113b2576113b26149a2565b818103818111156113b2576113b26149a2565b5f60208284031215614a05575f80fd5b81516143ff8161493b565b5f60208284031215614a20575f80fd5b5051919050565b5f60208284031215614a37575f80fd5b813561ffff811681146143ff575f80fd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a7857614a786149a2565b5060010190565b5f60208284031215614a8f575f80fd5b813560ff811681146143ff575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614ad2575f80fd5b83018035915067ffffffffffffffff821115614aec575f80fd5b6020019150368190038213156146b4575f80fd5b5f60208284031215614b10575f80fd5b6143ff82614963565b818382375f9101908152919050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f6080820187835260206080602085015281885180845260a08601915060208a0193505f5b81811015614bb95784516001600160a01b031683529383019391830191600101614b94565b50508760408601528481036060860152614bd4818789614b28565b9a9950505050505050505050565b858152846020820152608060408201525f614c01608083018587614b28565b90508260608301529695505050505050565b5f82515f5b81811015614c325760208186018101518583015201614c18565b505f920191825250919050565b80820281158282048414176113b2576113b26149a2565b5f82614c89577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112614cf7575f80fd5b8135602067ffffffffffffffff80831115614d1457614d14614cbb565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108482111715614d5757614d57614cbb565b6040529384526020818701810194908101925087851115614d76575f80fd5b6020870191505b84821015614d9d57614d8e82614642565b83529183019190830190614d7d565b979650505050505050565b5f805f805f8060c08789031215614dbd575f80fd5b86359550602087013567ffffffffffffffff80821115614ddb575f80fd5b614de78a838b01614ce8565b9650604089013595506060890135915080821115614e03575f80fd5b614e0f8a838b01614ce8565b94506080890135935060a0890135915080821115614e2b575f80fd5b50614e3889828a01614ce8565b915050929550929550929556fea164736f6c6343000818000a diff --git a/bindings/bindings/distribute.go b/bindings/bindings/distribute.go index 3632a94b0..d251237d9 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: "0x60e060405234801562000010575f80fd5b5073530000000000000000000000000000000000001360805273530000000000000000000000000000000000001560a05273530000000000000000000000000000000000001260c0526200006362000069565b62000127565b5f54610100900460ff1615620000d55760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161462000125575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b60805160a05160c051612a2e620001915f395f818161030901526117a901525f81816101d9015281816107ca015281816109d9015281816112330152818161135801526114a101525f8181610343015281816120e20152818161219501526122320152612a2e5ff3fe608060405234801561000f575f80fd5b5060043610610163575f3560e01c8063a766c529116100c7578063cd4281d01161007d578063d557714111610063578063d55771411461033e578063de6ac93314610365578063f2fde38b14610388575f80fd5b8063cd4281d014610304578063cdd0c50e1461032b575f80fd5b8063b809af0f116100ad578063b809af0f146102b6578063bf2dca0a146102c9578063c4d66de8146102f1575f80fd5b8063a766c5291461027b578063ac2ac640146102a3575f80fd5b8063807de4431161011c578063921ae9b811610102578063921ae9b8146102245780639889be5114610247578063996cba6814610268575f80fd5b8063807de443146101d45780638da5cb5b14610213575f80fd5b80635cf20c7b1161014c5780635cf20c7b146101a6578063715018a6146101b95780637f683ee3146101c1575f80fd5b8063273d8e82146101675780634eedab3214610191575b5f80fd5b61017a610175366004612537565b61039b565b6040516101889291906125c2565b60405180910390f35b6101a461019f3660046125ef565b610729565b005b6101a46101b43660046125ef565b6107c7565b6101a46109c3565b6101a46101cf366004612617565b6109d6565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610188565b6033546001600160a01b03166101fb565b610237610232366004612537565b610c1c565b6040516101889493929190612656565b61025a6102553660046126d5565b610f59565b604051908152602001610188565b6101a4610276366004612706565b611230565b61025a610289366004612537565b6001600160a01b03165f9081526067602052604090205490565b6101a46102b1366004612537565b611355565b6101a46102c436600461274c565b61149e565b61025a6102d7366004612537565b6001600160a01b03165f9081526068602052604090205490565b6101a46102ff366004612537565b6115dc565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b6101a46103393660046127f3565b6117a6565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b6103786103733660046126d5565b611b06565b6040519015158152602001610188565b6101a4610396366004612537565b611b31565b6001600160a01b0381165f90815260696020526040812060609182916103c090611bc1565b9050805f0361043c5760405162461bcd60e51b815260206004820152602860248201527f696e76616c69642064656c656761746f72206f72206e6f2072656d61696e696e60448201527f672072657761726400000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b8067ffffffffffffffff8111156104555761045561288f565b60405190808252806020026020018201604052801561047e578160200160208202803683370190505b5092508067ffffffffffffffff81111561049a5761049a61288f565b6040519080825280602002602001820160405280156104c3578160200160208202803683370190505b5091505f5b6001600160a01b0385165f9081526069602052604090206104e890611bc1565b811015610722576001600160a01b0385165f9081526069602052604081206105109083611bca565b6001600160a01b038088165f908152606960209081526040808320938516835260039093019052908120549192509081908190805b6065548110156106bf576001600160a01b038087165f9081526066602090815260408083208584528252808320938f168352600490930190522054156105b9576001600160a01b038087165f9081526066602090815260408083208584528252808320938f16835260049093019052205492505b6001600160a01b0386165f9081526066602090815260408083208484529091529020600101541561060d576001600160a01b0386165f90815260666020908152604080832084845290915290206001015493505b6001600160a01b0386165f908152606660209081526040808320848452909152902054849061063d9085906128e9565b6106479190612900565b6106519086612938565b6001600160a01b03808d165f908152606960209081526040808320938b16835260029093019052205490955060ff1680156106b357506001600160a01b03808c165f908152606960209081526040808320938a16835260049093019052205481145b6106bf57600101610545565b50848987815181106106d3576106d361294b565b60200260200101906001600160a01b031690816001600160a01b031681525050838887815181106107065761070661294b565b60209081029190910101525050600190930192506104c8915050565b5050915091565b610731611bdc565b6001600160a01b0382165f908152606760205260409020545b8181116107a8576001600160a01b0383165f908152606660209081526040808320848452909152812081815560018101829055906002820181818161078f82826124ee565b50505050505080806107a090612978565b91505061074a565b6001600160a01b039092165f9081526067602052604090209190915550565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461083f5760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6065545f036108905760405162461bcd60e51b815260206004820152600e60248201527f6e6f74206d696e746564207965740000000000000000000000000000000000006044820152606401610433565b5f8115806108ab575060016065546108a891906129af565b82115b6108b557816108c4565b60016065546108c491906129af565b90505f805b6001600160a01b0385165f9081526069602052604090206108e990611bc1565b8110156109ac576001600160a01b0385165f90815260696020526040812081906109139084611bca565b6001600160a01b0388165f9081526069602052604090209091506109379082611c36565b801561096b57506001600160a01b038088165f90815260696020908152604080832093851683526003909301905220548510155b15610992575f8061097d838a89611c57565b909250905061098c8287612938565b95509250505b816109a557826109a181612978565b9350505b50506108c9565b5080156109bd576109bd84826120b2565b50505050565b6109cb611bdc565b6109d45f612308565b565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610a4e5760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6001600160a01b0384165f9081526066602090815260408083208584529091529020600101819055811580610aaa57506001600160a01b038084165f908152606960209081526040808320938816835260039093019052205482145b15610b8f576001600160a01b0384165f9081526066602090815260408083208584529091529020610ade9060020184612371565b506001600160a01b038085165f90815260666020908152604080832086845282528083209387168352600490930181528282208290556069905220610b239085612371565b506001600160a01b038381165f908152606960209081526040808320938816835260028401825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560038401825280832083905560049093019052908120556109bd565b6001600160a01b038084165f9081526069602090815260408083209388168352600290930190522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155610bed90836129af565b6001600160a01b038085165f908152606960209081526040808320938916835260049093019052205550505050565b6001600160a01b0381165f908152606960205260408120606091829182918291610c4590611bc1565b90505f8167ffffffffffffffff811115610c6157610c6161288f565b604051908082528060200260200182016040528015610c8a578160200160208202803683370190505b5090505f8267ffffffffffffffff811115610ca757610ca761288f565b604051908082528060200260200182016040528015610cd0578160200160208202803683370190505b5090505f8367ffffffffffffffff811115610ced57610ced61288f565b604051908082528060200260200182016040528015610d16578160200160208202803683370190505b5090505f8467ffffffffffffffff811115610d3357610d3361288f565b604051908082528060200260200182016040528015610d5c578160200160208202803683370190505b5090505f5b85811015610f48576001600160a01b038b165f908152606960205260409020610d8a9082611bca565b858281518110610d9c57610d9c61294b565b60200260200101906001600160a01b031690816001600160a01b03168152505060695f8c6001600160a01b03166001600160a01b031681526020019081526020015f206002015f868381518110610df557610df561294b565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f9054906101000a900460ff16848281518110610e3b57610e3b61294b565b9115156020928302919091018201526001600160a01b038c165f908152606990915260408120865160039091019190879084908110610e7c57610e7c61294b565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054838281518110610eb657610eb661294b565b60200260200101818152505060695f8c6001600160a01b03166001600160a01b031681526020019081526020015f206004015f868381518110610efb57610efb61294b565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054828281518110610f3557610f3561294b565b6020908102919091010152600101610d61565b509299919850965090945092505050565b6001600160a01b0381165f908152606960205260408120610f7990611bc1565b5f03610fed5760405162461bcd60e51b815260206004820152602860248201527f696e76616c69642064656c656761746f72206f72206e6f2072656d61696e696e60448201527f67207265776172640000000000000000000000000000000000000000000000006064820152608401610433565b6001600160a01b0382165f90815260696020526040902061100e9084611c36565b61107f5760405162461bcd60e51b8152602060048201526024808201527f6e6f2072656d61696e696e6720726577617264206f66207468652064656c656760448201527f61746565000000000000000000000000000000000000000000000000000000006064820152608401610433565b6001600160a01b038083165f9081526069602090815260408083209387168352600390930190529081205481905b606554811015611227576001600160a01b038087165f9081526066602090815260408083208584528252808320938916835260049093019052205415611121576001600160a01b038087165f9081526066602090815260408083208584528252808320938916835260049093019052205491505b6001600160a01b0386165f90815260666020908152604080832084845290915290206001015415611175576001600160a01b0386165f90815260666020908152604080832084845290915290206001015492505b6001600160a01b0386165f90815260666020908152604080832084845290915290205483906111a59084906128e9565b6111af9190612900565b6111b99085612938565b6001600160a01b038087165f908152606960209081526040808320938b16835260029093019052205490945060ff16801561121b57506001600160a01b038086165f908152606960209081526040808320938a16835260049093019052205481145b611227576001016110ad565b50505092915050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146112a85760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6065545f036112f95760405162461bcd60e51b815260206004820152600e60248201527f6e6f74206d696e746564207965740000000000000000000000000000000000006044820152606401610433565b5f8115806113145750600160655461131191906129af565b82115b61131e578161132d565b600160655461132d91906129af565b90505f61133b858584611c57565b509050801561134e5761134e84826120b2565b5050505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146113cd5760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6001600160a01b0381165f908152606860205260409020546114315760405162461bcd60e51b815260206004820152601660248201527f6e6f20636f6d6d697373696f6e20746f20636c61696d000000000000000000006044820152606401610433565b6001600160a01b0381165f908152606860205260408120805491905561145782826120b2565b816001600160a01b03167f8e14daa5332205b1634040e1054e93d1f5396ec8bf0115d133b7fbaf4a52e4118260405161149291815260200190565b60405180910390a25050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146115165760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6001600160a01b0386165f90815260666020908152604080832087845290915290206001810183905561154c9060020186612385565b506001600160a01b038087165f90815260666020908152604080832088845282528083209389168352600490930190522083905580156115d4576001600160a01b0385165f9081526069602052604090206115a79087612385565b506001600160a01b038086165f908152606960209081526040808320938a16835260039093019052208490555b505050505050565b5f54610100900460ff16158080156115fa57505f54600160ff909116105b806116135750303b15801561161357505f5460ff166001145b6116855760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610433565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156116e1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b0382166117375760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964206f776e6572206164647265737300000000000000000000006044820152606401610433565b61174082612308565b80156117a2575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461181e5760405162461bcd60e51b815260206004820152601c60248201527f6f6e6c79207265636f726420636f6e747261637420616c6c6f776564000000006044820152606401610433565b60658054905f61182d83612978565b919050555086600160655461184291906129af565b1461188f5760405162461bcd60e51b815260206004820152601360248201527f696e76616c69642065706f636820696e646578000000000000000000000000006044820152606401610433565b828514801561189d57508085145b6118e95760405162461bcd60e51b815260206004820152601360248201527f696e76616c69642064617461206c656e677468000000000000000000000000006044820152606401610433565b5f5b85811015611afc578484828181106119055761190561294b565b9050602002013560665f8989858181106119215761192161294b565b90506020020160208101906119369190612537565b6001600160a01b0316815260208082019290925260409081015f9081208c82529092528120919091556066908888848181106119745761197461294b565b90506020020160208101906119899190612537565b6001600160a01b0316815260208082019290925260409081015f9081208b82529092529020600101541580156119be57505f88115b15611a7f5760665f8888848181106119d8576119d861294b565b90506020020160208101906119ed9190612537565b6001600160a01b03166001600160a01b031681526020019081526020015f205f60018a611a1a91906129af565b81526020019081526020015f206001015460665f898985818110611a4057611a4061294b565b9050602002016020810190611a559190612537565b6001600160a01b0316815260208082019290925260409081015f9081208c82529092529020600101555b828282818110611a9157611a9161294b565b9050602002013560685f898985818110611aad57611aad61294b565b9050602002016020810190611ac29190612537565b6001600160a01b03166001600160a01b031681526020019081526020015f205f828254611aef9190612938565b90915550506001016118eb565b5050505050505050565b6001600160a01b0382165f908152606960205260408120611b279083611c36565b1590505b92915050565b611b39611bdc565b6001600160a01b038116611bb55760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610433565b611bbe81612308565b50565b5f611b2b825490565b5f611bd58383612399565b9392505050565b6033546001600160a01b031633146109d45760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610433565b6001600160a01b0381165f9081526001830160205260408120541515611bd5565b6001600160a01b0382165f9081526069602052604081208190611c7a9086611c36565b611cc65760405162461bcd60e51b815260206004820152601360248201527f6e6f2072656d61696e696e6720726577617264000000000000000000000000006044820152606401610433565b6001600160a01b038085165f9081526069602090815260408083209389168352600390930190522054831015611d3e5760405162461bcd60e51b815260206004820152601260248201527f616c6c2072657761726420636c61696d656400000000000000000000000000006044820152606401610433565b6001600160a01b038085165f9081526069602090815260408083209389168352600390930190529081205481905b858111611f7f576001600160a01b038089165f9081526066602090815260408083208584528252808320938b16835260049093019052205415611ddd576001600160a01b038089165f9081526066602090815260408083208584528252808320938b16835260049093019052205491505b6001600160a01b0388165f90815260666020908152604080832084845290915290206001015415611e31576001600160a01b0388165f90815260666020908152604080832084845290915290206001015492505b6001600160a01b0388165f9081526066602090815260408083208484529091529020548390611e619084906128e9565b611e6b9190612900565b611e759086612938565b6001600160a01b038089165f908152606960209081526040808320938d16835260029093019052205490955060ff168015611ed757506001600160a01b038088165f908152606960209081526040808320938c16835260049093019052205481145b15611f6d576001600160a01b0387165f90815260696020526040902060019450611f019089612371565b506001600160a01b038781165f908152606960209081526040808320938c16835260028401825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556003840182528083208390556004909301905290812055611f7f565b80611f7781612978565b915050611d6c565b50611f8b856001612938565b6001600160a01b038088165f908152606960209081526040808320938c16835260039093018152828220939093556066909252812090611fcc876001612938565b81526020019081526020015f206004015f876001600160a01b03166001600160a01b031681526020019081526020015f20545f03612052576001600160a01b0387165f9081526066602052604081208291612028886001612938565b815260208082019290925260409081015f9081206001600160a01b038b1682526004019092529020555b866001600160a01b0316866001600160a01b03167f7a84a08b02c91f3c62d572853f966fc799bbd121e8ad7833a4494ab8dcfcb40487876040516120a0929190918252602082015260400190565b60405180910390a35050935093915050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561212f573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061215391906129c2565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152602482018590529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303815f875af11580156121dd573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061220191906129d9565b506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561227f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906122a391906129c2565b90505f831180156122bc5750826122ba82846129af565b145b6109bd5760405162461bcd60e51b815260206004820152601b60248201527f6d6f72706820746f6b656e207472616e73666572206661696c656400000000006044820152606401610433565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f611bd5836001600160a01b0384166123bf565b5f611bd5836001600160a01b0384166124a2565b5f825f0182815481106123ae576123ae61294b565b905f5260205f200154905092915050565b5f8181526001830160205260408120548015612499575f6123e16001836129af565b85549091505f906123f4906001906129af565b9050818114612453575f865f0182815481106124125761241261294b565b905f5260205f200154905080875f0184815481106124325761243261294b565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080612464576124646129f4565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611b2b565b5f915050611b2b565b5f8181526001830160205260408120546124e757508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155611b2b565b505f611b2b565b5080545f8255905f5260205f2090810190611bbe91905b80821115612518575f8155600101612505565b5090565b80356001600160a01b0381168114612532575f80fd5b919050565b5f60208284031215612547575f80fd5b611bd58261251c565b5f815180845260208085019450602084015f5b838110156125885781516001600160a01b031687529582019590820190600101612563565b509495945050505050565b5f815180845260208085019450602084015f5b83811015612588578151875295820195908201906001016125a6565b604081525f6125d46040830185612550565b82810360208401526125e68185612593565b95945050505050565b5f8060408385031215612600575f80fd5b6126098361251c565b946020939093013593505050565b5f805f806080858703121561262a575f80fd5b6126338561251c565b93506126416020860161251c565b93969395505050506040820135916060013590565b608081525f6126686080830187612550565b8281036020848101919091528651808352878201928201905f5b818110156126a0578451151583529383019391830191600101612682565b505084810360408601526126b48188612593565b9250505082810360608401526126ca8185612593565b979650505050505050565b5f80604083850312156126e6575f80fd5b6126ef8361251c565b91506126fd6020840161251c565b90509250929050565b5f805f60608486031215612718575f80fd5b6127218461251c565b925061272f6020850161251c565b9150604084013590509250925092565b8015158114611bbe575f80fd5b5f805f805f8060c08789031215612761575f80fd5b61276a8761251c565b95506127786020880161251c565b945060408701359350606087013592506080870135915060a087013561279d8161273f565b809150509295509295509295565b5f8083601f8401126127bb575f80fd5b50813567ffffffffffffffff8111156127d2575f80fd5b6020830191508360208260051b85010111156127ec575f80fd5b9250929050565b5f805f805f805f6080888a031215612809575f80fd5b87359650602088013567ffffffffffffffff80821115612827575f80fd5b6128338b838c016127ab565b909850965060408a013591508082111561284b575f80fd5b6128578b838c016127ab565b909650945060608a013591508082111561286f575f80fd5b5061287c8a828b016127ab565b989b979a50959850939692959293505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082028115828204841417611b2b57611b2b6128bc565b5f82612933577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b80820180821115611b2b57611b2b6128bc565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036129a8576129a86128bc565b5060010190565b81810381811115611b2b57611b2b6128bc565b5f602082840312156129d2575f80fd5b5051919050565b5f602082840312156129e9575f80fd5b8151611bd58161273f565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea164736f6c6343000818000a", + Bin: "0x60e060405234801562000010575f80fd5b5073530000000000000000000000000000000000001360805273530000000000000000000000000000000000001560a05273530000000000000000000000000000000000001260c0526200006362000069565b62000127565b5f54610100900460ff1615620000d55760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161462000125575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b60805160a05160c051612a09620001915f395f8181610309015261178b01525f81816101d9015281816107ca015281816109bc015281816112160152818161133a015261148301525f8181610343015281816120bd01528181612170015261220d0152612a095ff3fe608060405234801561000f575f80fd5b5060043610610163575f3560e01c8063a766c529116100c7578063cd4281d01161007d578063d557714111610063578063d55771411461033e578063de6ac93314610365578063f2fde38b14610388575f80fd5b8063cd4281d014610304578063cdd0c50e1461032b575f80fd5b8063b809af0f116100ad578063b809af0f146102b6578063bf2dca0a146102c9578063c4d66de8146102f1575f80fd5b8063a766c5291461027b578063ac2ac640146102a3575f80fd5b8063807de4431161011c578063921ae9b811610102578063921ae9b8146102245780639889be5114610247578063996cba6814610268575f80fd5b8063807de443146101d45780638da5cb5b14610213575f80fd5b80635cf20c7b1161014c5780635cf20c7b146101a6578063715018a6146101b95780637f683ee3146101c1575f80fd5b8063273d8e82146101675780634eedab3214610191575b5f80fd5b61017a610175366004612512565b61039b565b60405161018892919061259d565b60405180910390f35b6101a461019f3660046125ca565b610729565b005b6101a46101b43660046125ca565b6107c7565b6101a46109a6565b6101a46101cf3660046125f2565b6109b9565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b6040516001600160a01b039091168152602001610188565b6033546001600160a01b03166101fb565b610237610232366004612512565b610bff565b6040516101889493929190612631565b61025a6102553660046126b0565b610f3c565b604051908152602001610188565b6101a46102763660046126e1565b611213565b61025a610289366004612512565b6001600160a01b03165f9081526067602052604090205490565b6101a46102b1366004612512565b611337565b6101a46102c4366004612727565b611480565b61025a6102d7366004612512565b6001600160a01b03165f9081526068602052604090205490565b6101a46102ff366004612512565b6115be565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b6101a46103393660046127ce565b611788565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b6103786103733660046126b0565b611ae8565b6040519015158152602001610188565b6101a4610396366004612512565b611b13565b6001600160a01b0381165f90815260696020526040812060609182916103c090611ba3565b9050805f0361043c5760405162461bcd60e51b815260206004820152602860248201527f696e76616c69642064656c656761746f72206f72206e6f2072656d61696e696e60448201527f672072657761726400000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b8067ffffffffffffffff8111156104555761045561286a565b60405190808252806020026020018201604052801561047e578160200160208202803683370190505b5092508067ffffffffffffffff81111561049a5761049a61286a565b6040519080825280602002602001820160405280156104c3578160200160208202803683370190505b5091505f5b6001600160a01b0385165f9081526069602052604090206104e890611ba3565b811015610722576001600160a01b0385165f9081526069602052604081206105109083611bac565b6001600160a01b038088165f908152606960209081526040808320938516835260039093019052908120549192509081908190805b6065548110156106bf576001600160a01b038087165f9081526066602090815260408083208584528252808320938f168352600490930190522054156105b9576001600160a01b038087165f9081526066602090815260408083208584528252808320938f16835260049093019052205492505b6001600160a01b0386165f9081526066602090815260408083208484529091529020600101541561060d576001600160a01b0386165f90815260666020908152604080832084845290915290206001015493505b6001600160a01b0386165f908152606660209081526040808320848452909152902054849061063d9085906128c4565b61064791906128db565b6106519086612913565b6001600160a01b03808d165f908152606960209081526040808320938b16835260029093019052205490955060ff1680156106b357506001600160a01b03808c165f908152606960209081526040808320938a16835260049093019052205481145b6106bf57600101610545565b50848987815181106106d3576106d3612926565b60200260200101906001600160a01b031690816001600160a01b0316815250508388878151811061070657610706612926565b60209081029190910101525050600190930192506104c8915050565b5050915091565b610731611bbe565b6001600160a01b0382165f908152606760205260409020545b8181116107a8576001600160a01b0383165f908152606660209081526040808320848452909152812081815560018101829055906002820181818161078f82826124c9565b50505050505080806107a090612953565b91505061074a565b6001600160a01b039092165f9081526067602052604090209190915550565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461083f5760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6065545f036108905760405162461bcd60e51b815260206004820152600e60248201527f6e6f74206d696e746564207965740000000000000000000000000000000000006044820152606401610433565b5f8115806108ab575060016065546108a8919061298a565b82115b6108b557816108c4565b60016065546108c4919061298a565b90505f805b6001600160a01b0385165f9081526069602052604090206108e990611ba3565b81101561098f576001600160a01b0385165f9081526069602052604081206109119083611bac565b6001600160a01b0387165f9081526069602052604090209091506109359082611c18565b801561096957506001600160a01b038087165f90815260696020908152604080832093851683526003909301905220548410155b1561098657610979818786611c39565b6109839084612913565b92505b506001016108c9565b5080156109a0576109a0848261208d565b50505050565b6109ae611bbe565b6109b75f6122e3565b565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031614610a315760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6001600160a01b0384165f9081526066602090815260408083208584529091529020600101819055811580610a8d57506001600160a01b038084165f908152606960209081526040808320938816835260039093019052205482145b15610b72576001600160a01b0384165f9081526066602090815260408083208584529091529020610ac1906002018461234c565b506001600160a01b038085165f90815260666020908152604080832086845282528083209387168352600490930181528282208290556069905220610b06908561234c565b506001600160a01b038381165f908152606960209081526040808320938816835260028401825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560038401825280832083905560049093019052908120556109a0565b6001600160a01b038084165f9081526069602090815260408083209388168352600290930190522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155610bd0908361298a565b6001600160a01b038085165f908152606960209081526040808320938916835260049093019052205550505050565b6001600160a01b0381165f908152606960205260408120606091829182918291610c2890611ba3565b90505f8167ffffffffffffffff811115610c4457610c4461286a565b604051908082528060200260200182016040528015610c6d578160200160208202803683370190505b5090505f8267ffffffffffffffff811115610c8a57610c8a61286a565b604051908082528060200260200182016040528015610cb3578160200160208202803683370190505b5090505f8367ffffffffffffffff811115610cd057610cd061286a565b604051908082528060200260200182016040528015610cf9578160200160208202803683370190505b5090505f8467ffffffffffffffff811115610d1657610d1661286a565b604051908082528060200260200182016040528015610d3f578160200160208202803683370190505b5090505f5b85811015610f2b576001600160a01b038b165f908152606960205260409020610d6d9082611bac565b858281518110610d7f57610d7f612926565b60200260200101906001600160a01b031690816001600160a01b03168152505060695f8c6001600160a01b03166001600160a01b031681526020019081526020015f206002015f868381518110610dd857610dd8612926565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f9054906101000a900460ff16848281518110610e1e57610e1e612926565b9115156020928302919091018201526001600160a01b038c165f908152606990915260408120865160039091019190879084908110610e5f57610e5f612926565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054838281518110610e9957610e99612926565b60200260200101818152505060695f8c6001600160a01b03166001600160a01b031681526020019081526020015f206004015f868381518110610ede57610ede612926565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f2054828281518110610f1857610f18612926565b6020908102919091010152600101610d44565b509299919850965090945092505050565b6001600160a01b0381165f908152606960205260408120610f5c90611ba3565b5f03610fd05760405162461bcd60e51b815260206004820152602860248201527f696e76616c69642064656c656761746f72206f72206e6f2072656d61696e696e60448201527f67207265776172640000000000000000000000000000000000000000000000006064820152608401610433565b6001600160a01b0382165f908152606960205260409020610ff19084611c18565b6110625760405162461bcd60e51b8152602060048201526024808201527f6e6f2072656d61696e696e6720726577617264206f66207468652064656c656760448201527f61746565000000000000000000000000000000000000000000000000000000006064820152608401610433565b6001600160a01b038083165f9081526069602090815260408083209387168352600390930190529081205481905b60655481101561120a576001600160a01b038087165f9081526066602090815260408083208584528252808320938916835260049093019052205415611104576001600160a01b038087165f9081526066602090815260408083208584528252808320938916835260049093019052205491505b6001600160a01b0386165f90815260666020908152604080832084845290915290206001015415611158576001600160a01b0386165f90815260666020908152604080832084845290915290206001015492505b6001600160a01b0386165f90815260666020908152604080832084845290915290205483906111889084906128c4565b61119291906128db565b61119c9085612913565b6001600160a01b038087165f908152606960209081526040808320938b16835260029093019052205490945060ff1680156111fe57506001600160a01b038086165f908152606960209081526040808320938a16835260049093019052205481145b61120a57600101611090565b50505092915050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03161461128b5760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6065545f036112dc5760405162461bcd60e51b815260206004820152600e60248201527f6e6f74206d696e746564207965740000000000000000000000000000000000006044820152606401610433565b5f8115806112f7575060016065546112f4919061298a565b82115b6113015781611310565b6001606554611310919061298a565b90505f61131e858584611c39565b9050801561133057611330848261208d565b5050505050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146113af5760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6001600160a01b0381165f908152606860205260409020546114135760405162461bcd60e51b815260206004820152601660248201527f6e6f20636f6d6d697373696f6e20746f20636c61696d000000000000000000006044820152606401610433565b6001600160a01b0381165f9081526068602052604081208054919055611439828261208d565b816001600160a01b03167f8e14daa5332205b1634040e1054e93d1f5396ec8bf0115d133b7fbaf4a52e4118260405161147491815260200190565b60405180910390a25050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146114f85760405162461bcd60e51b815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f7765646044820152606401610433565b6001600160a01b0386165f90815260666020908152604080832087845290915290206001810183905561152e9060020186612360565b506001600160a01b038087165f90815260666020908152604080832088845282528083209389168352600490930190522083905580156115b6576001600160a01b0385165f9081526069602052604090206115899087612360565b506001600160a01b038086165f908152606960209081526040808320938a16835260039093019052208490555b505050505050565b5f54610100900460ff16158080156115dc57505f54600160ff909116105b806115f55750303b1580156115f557505f5460ff166001145b6116675760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610433565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156116c3575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b0382166117195760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964206f776e6572206164647265737300000000000000000000006044820152606401610433565b611722826122e3565b8015611784575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b337f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316146118005760405162461bcd60e51b815260206004820152601c60248201527f6f6e6c79207265636f726420636f6e747261637420616c6c6f776564000000006044820152606401610433565b60658054905f61180f83612953565b9190505550866001606554611824919061298a565b146118715760405162461bcd60e51b815260206004820152601360248201527f696e76616c69642065706f636820696e646578000000000000000000000000006044820152606401610433565b828514801561187f57508085145b6118cb5760405162461bcd60e51b815260206004820152601360248201527f696e76616c69642064617461206c656e677468000000000000000000000000006044820152606401610433565b5f5b85811015611ade578484828181106118e7576118e7612926565b9050602002013560665f89898581811061190357611903612926565b90506020020160208101906119189190612512565b6001600160a01b0316815260208082019290925260409081015f9081208c825290925281209190915560669088888481811061195657611956612926565b905060200201602081019061196b9190612512565b6001600160a01b0316815260208082019290925260409081015f9081208b82529092529020600101541580156119a057505f88115b15611a615760665f8888848181106119ba576119ba612926565b90506020020160208101906119cf9190612512565b6001600160a01b03166001600160a01b031681526020019081526020015f205f60018a6119fc919061298a565b81526020019081526020015f206001015460665f898985818110611a2257611a22612926565b9050602002016020810190611a379190612512565b6001600160a01b0316815260208082019290925260409081015f9081208c82529092529020600101555b828282818110611a7357611a73612926565b9050602002013560685f898985818110611a8f57611a8f612926565b9050602002016020810190611aa49190612512565b6001600160a01b03166001600160a01b031681526020019081526020015f205f828254611ad19190612913565b90915550506001016118cd565b5050505050505050565b6001600160a01b0382165f908152606960205260408120611b099083611c18565b1590505b92915050565b611b1b611bbe565b6001600160a01b038116611b975760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610433565b611ba0816122e3565b50565b5f611b0d825490565b5f611bb78383612374565b9392505050565b6033546001600160a01b031633146109b75760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610433565b6001600160a01b0381165f9081526001830160205260408120541515611bb7565b6001600160a01b0382165f908152606960205260408120611c5a9085611c18565b611ca65760405162461bcd60e51b815260206004820152601360248201527f6e6f2072656d61696e696e6720726577617264000000000000000000000000006044820152606401610433565b6001600160a01b038084165f9081526069602090815260408083209388168352600390930190522054821015611d1e5760405162461bcd60e51b815260206004820152601260248201527f616c6c2072657761726420636c61696d656400000000000000000000000000006044820152606401610433565b6001600160a01b038084165f9081526069602090815260408083209388168352600390930190529081205481905b848111611f5b576001600160a01b038088165f9081526066602090815260408083208584528252808320938a16835260049093019052205415611dbd576001600160a01b038088165f9081526066602090815260408083208584528252808320938a16835260049093019052205491505b6001600160a01b0387165f90815260666020908152604080832084845290915290206001015415611e11576001600160a01b0387165f90815260666020908152604080832084845290915290206001015492505b6001600160a01b0387165f9081526066602090815260408083208484529091529020548390611e419084906128c4565b611e4b91906128db565b611e559085612913565b6001600160a01b038088165f908152606960209081526040808320938c16835260029093019052205490945060ff168015611eb757506001600160a01b038087165f908152606960209081526040808320938b16835260049093019052205481145b15611f49576001600160a01b0386165f908152606960205260409020611edd908861234c565b506001600160a01b038681165f908152606960209081526040808320938b16835260028401825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556003840182528083208390556004909301905290812055611f5b565b80611f5381612953565b915050611d4c565b50611f67846001612913565b6001600160a01b038087165f908152606960209081526040808320938b16835260039093018152828220939093556066909252812090611fa8866001612913565b81526020019081526020015f206004015f866001600160a01b03166001600160a01b031681526020019081526020015f20545f0361202e576001600160a01b0386165f9081526066602052604081208291612004876001612913565b815260208082019290925260409081015f9081206001600160a01b038a1682526004019092529020555b856001600160a01b0316856001600160a01b03167f7a84a08b02c91f3c62d572853f966fc799bbd121e8ad7833a4494ab8dcfcb404868660405161207c929190918252602082015260400190565b60405180910390a350509392505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561210a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061212e919061299d565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152602482018590529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303815f875af11580156121b8573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121dc91906129b4565b506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f907f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316906370a0823190602401602060405180830381865afa15801561225a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061227e919061299d565b90505f83118015612297575082612295828461298a565b145b6109a05760405162461bcd60e51b815260206004820152601b60248201527f6d6f72706820746f6b656e207472616e73666572206661696c656400000000006044820152606401610433565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f611bb7836001600160a01b03841661239a565b5f611bb7836001600160a01b03841661247d565b5f825f01828154811061238957612389612926565b905f5260205f200154905092915050565b5f8181526001830160205260408120548015612474575f6123bc60018361298a565b85549091505f906123cf9060019061298a565b905081811461242e575f865f0182815481106123ed576123ed612926565b905f5260205f200154905080875f01848154811061240d5761240d612926565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061243f5761243f6129cf565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050611b0d565b5f915050611b0d565b5f8181526001830160205260408120546124c257508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155611b0d565b505f611b0d565b5080545f8255905f5260205f2090810190611ba091905b808211156124f3575f81556001016124e0565b5090565b80356001600160a01b038116811461250d575f80fd5b919050565b5f60208284031215612522575f80fd5b611bb7826124f7565b5f815180845260208085019450602084015f5b838110156125635781516001600160a01b03168752958201959082019060010161253e565b509495945050505050565b5f815180845260208085019450602084015f5b8381101561256357815187529582019590820190600101612581565b604081525f6125af604083018561252b565b82810360208401526125c1818561256e565b95945050505050565b5f80604083850312156125db575f80fd5b6125e4836124f7565b946020939093013593505050565b5f805f8060808587031215612605575f80fd5b61260e856124f7565b935061261c602086016124f7565b93969395505050506040820135916060013590565b608081525f612643608083018761252b565b8281036020848101919091528651808352878201928201905f5b8181101561267b57845115158352938301939183019160010161265d565b5050848103604086015261268f818861256e565b9250505082810360608401526126a5818561256e565b979650505050505050565b5f80604083850312156126c1575f80fd5b6126ca836124f7565b91506126d8602084016124f7565b90509250929050565b5f805f606084860312156126f3575f80fd5b6126fc846124f7565b925061270a602085016124f7565b9150604084013590509250925092565b8015158114611ba0575f80fd5b5f805f805f8060c0878903121561273c575f80fd5b612745876124f7565b9550612753602088016124f7565b945060408701359350606087013592506080870135915060a08701356127788161271a565b809150509295509295509295565b5f8083601f840112612796575f80fd5b50813567ffffffffffffffff8111156127ad575f80fd5b6020830191508360208260051b85010111156127c7575f80fd5b9250929050565b5f805f805f805f6080888a0312156127e4575f80fd5b87359650602088013567ffffffffffffffff80821115612802575f80fd5b61280e8b838c01612786565b909850965060408a0135915080821115612826575f80fd5b6128328b838c01612786565b909650945060608a013591508082111561284a575f80fd5b506128578a828b01612786565b989b979a50959850939692959293505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082028115828204841417611b0d57611b0d612897565b5f8261290e577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b80820180821115611b0d57611b0d612897565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361298357612983612897565b5060010190565b81810381811115611b0d57611b0d612897565b5f602082840312156129ad575f80fd5b5051919050565b5f602082840312156129c4575f80fd5b8151611bb78161271a565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea164736f6c6343000818000a", } // 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 decb59f62..c64d807ec 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 = "0x608060405234801561000f575f80fd5b5060043610610163575f3560e01c8063a766c529116100c7578063cd4281d01161007d578063d557714111610063578063d557714114610372578063de6ac93314610399578063f2fde38b146103bc575f80fd5b8063cd4281d014610338578063cdd0c50e1461035f575f80fd5b8063b809af0f116100ad578063b809af0f146102dd578063bf2dca0a146102f0578063c4d66de814610325575f80fd5b8063a766c52914610295578063ac2ac640146102ca575f80fd5b8063807de4431161011c578063921ae9b811610102578063921ae9b81461023e5780639889be5114610261578063996cba6814610282575f80fd5b8063807de443146101d45780638da5cb5b14610220575f80fd5b80635cf20c7b1161014c5780635cf20c7b146101a6578063715018a6146101b95780637f683ee3146101c1575f80fd5b8063273d8e82146101675780634eedab3214610191575b5f80fd5b61017a610175366004612cc8565b6103cf565b604051610188929190612d60565b60405180910390f35b6101a461019f366004612d8d565b610820565b005b6101a46101b4366004612d8d565b6108e5565b6101a4610b56565b6101a46101cf366004612db5565b610b69565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610188565b60335473ffffffffffffffffffffffffffffffffffffffff166101fb565b61025161024c366004612cc8565b610e31565b6040516101889493929190612df4565b61027461026f366004612e73565b611231565b604051908152602001610188565b6101a4610290366004612ea4565b6115be565b6102746102a3366004612cc8565b73ffffffffffffffffffffffffffffffffffffffff165f9081526067602052604090205490565b6101a46102d8366004612cc8565b611724565b6101a46102eb366004612eea565b6118d5565b6102746102fe366004612cc8565b73ffffffffffffffffffffffffffffffffffffffff165f9081526068602052604090205490565b6101a4610333366004612cc8565b611a6e565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b6101a461036d366004612f91565b611c79565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b6103ac6103a7366004612e73565b61208f565b6040519015158152602001610188565b6101a46103ca366004612cc8565b6120c7565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260696020526040812060609182916104019061217e565b9050805f03610497576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f696e76616c69642064656c656761746f72206f72206e6f2072656d61696e696e60448201527f672072657761726400000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b8067ffffffffffffffff8111156104b0576104b061302d565b6040519080825280602002602001820160405280156104d9578160200160208202803683370190505b5092508067ffffffffffffffff8111156104f5576104f561302d565b60405190808252806020026020018201604052801561051e578160200160208202803683370190505b5091505f5b73ffffffffffffffffffffffffffffffffffffffff85165f9081526069602052604090206105509061217e565b8110156108195773ffffffffffffffffffffffffffffffffffffffff85165f9081526069602052604081206105859083612187565b73ffffffffffffffffffffffffffffffffffffffff8088165f908152606960209081526040808320938516835260039093019052908120549192509081908190805b60655481101561079c5773ffffffffffffffffffffffffffffffffffffffff8087165f9081526066602090815260408083208584528252808320938f168352600490930190522054156106555773ffffffffffffffffffffffffffffffffffffffff8087165f9081526066602090815260408083208584528252808320938f16835260049093019052205492505b73ffffffffffffffffffffffffffffffffffffffff86165f908152606660209081526040808320848452909152902060010154156106c35773ffffffffffffffffffffffffffffffffffffffff86165f90815260666020908152604080832084845290915290206001015493505b73ffffffffffffffffffffffffffffffffffffffff86165f9081526066602090815260408083208484529091529020548490610700908590613087565b61070a919061309e565b61071490866130d6565b73ffffffffffffffffffffffffffffffffffffffff808d165f908152606960209081526040808320938b16835260029093019052205490955060ff168015610790575073ffffffffffffffffffffffffffffffffffffffff808c165f908152606960209081526040808320938a16835260049093019052205481145b61079c576001016105c7565b50848987815181106107b0576107b06130e9565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838887815181106107fd576107fd6130e9565b6020908102919091010152505060019093019250610523915050565b5050915091565b610828612199565b73ffffffffffffffffffffffffffffffffffffffff82165f908152606760205260409020545b8181116108b95773ffffffffffffffffffffffffffffffffffffffff83165f90815260666020908152604080832084845290915281208181556001810182905590600282018181816108a08282612c72565b50505050505080806108b190613116565b91505061084e565b73ffffffffffffffffffffffffffffffffffffffff9092165f9081526067602052604090209190915550565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f776564604482015260640161048e565b6065545f036109ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f6e6f74206d696e74656420796574000000000000000000000000000000000000604482015260640161048e565b5f811580610a0a57506001606554610a07919061314d565b82115b610a145781610a23565b6001606554610a23919061314d565b90505f805b73ffffffffffffffffffffffffffffffffffffffff85165f908152606960205260409020610a559061217e565b811015610b3f5773ffffffffffffffffffffffffffffffffffffffff85165f9081526069602052604081208190610a8c9084612187565b73ffffffffffffffffffffffffffffffffffffffff88165f908152606960205260409020909150610abd908261221a565b8015610afe575073ffffffffffffffffffffffffffffffffffffffff8088165f90815260696020908152604080832093851683526003909301905220548510155b15610b25575f80610b10838a89612248565b9092509050610b1f82876130d6565b95509250505b81610b385782610b3481613116565b9350505b5050610a28565b508015610b5057610b5084826127ce565b50505050565b610b5e612199565b610b675f612a65565b565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610c08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f776564604482015260640161048e565b73ffffffffffffffffffffffffffffffffffffffff84165f9081526066602090815260408083208584529091529020600101819055811580610c7e575073ffffffffffffffffffffffffffffffffffffffff8084165f908152606960209081526040808320938816835260039093019052205482145b15610d8a5773ffffffffffffffffffffffffffffffffffffffff84165f9081526066602090815260408083208584529091529020610cbf9060020184612adb565b5073ffffffffffffffffffffffffffffffffffffffff8085165f90815260666020908152604080832086845282528083209387168352600490930181528282208290556069905220610d119085612adb565b5073ffffffffffffffffffffffffffffffffffffffff8381165f908152606960209081526040808320938816835260028401825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556003840182528083208390556004909301905290812055610b50565b73ffffffffffffffffffffffffffffffffffffffff8084165f9081526069602090815260408083209388168352600290930190522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155610df5908361314d565b73ffffffffffffffffffffffffffffffffffffffff8085165f908152606960209081526040808320938916835260049093019052205550505050565b73ffffffffffffffffffffffffffffffffffffffff81165f908152606960205260408120606091829182918291610e679061217e565b90505f8167ffffffffffffffff811115610e8357610e8361302d565b604051908082528060200260200182016040528015610eac578160200160208202803683370190505b5090505f8267ffffffffffffffff811115610ec957610ec961302d565b604051908082528060200260200182016040528015610ef2578160200160208202803683370190505b5090505f8367ffffffffffffffff811115610f0f57610f0f61302d565b604051908082528060200260200182016040528015610f38578160200160208202803683370190505b5090505f8467ffffffffffffffff811115610f5557610f5561302d565b604051908082528060200260200182016040528015610f7e578160200160208202803683370190505b5090505f5b858110156112205773ffffffffffffffffffffffffffffffffffffffff8b165f908152606960205260409020610fb99082612187565b858281518110610fcb57610fcb6130e9565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060695f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015f868381518110611058576110586130e9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff168482815181106110b8576110b86130e9565b91151560209283029190910182015273ffffffffffffffffffffffffffffffffffffffff8c165f908152606990915260408120865160039091019190879084908110611106576111066130e9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205483828151811061115a5761115a6130e9565b60200260200101818152505060695f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206004015f8683815181106111b9576111b96130e9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205482828151811061120d5761120d6130e9565b6020908102919091010152600101610f83565b509299919850965090945092505050565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260696020526040812061125e9061217e565b5f036112ec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f696e76616c69642064656c656761746f72206f72206e6f2072656d61696e696e60448201527f6720726577617264000000000000000000000000000000000000000000000000606482015260840161048e565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260696020526040902061131a908461221a565b6113a5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f6e6f2072656d61696e696e6720726577617264206f66207468652064656c656760448201527f6174656500000000000000000000000000000000000000000000000000000000606482015260840161048e565b73ffffffffffffffffffffffffffffffffffffffff8083165f9081526069602090815260408083209387168352600390930190529081205481905b6065548110156115b55773ffffffffffffffffffffffffffffffffffffffff8087165f908152606660209081526040808320858452825280832093891683526004909301905220541561146e5773ffffffffffffffffffffffffffffffffffffffff8087165f9081526066602090815260408083208584528252808320938916835260049093019052205491505b73ffffffffffffffffffffffffffffffffffffffff86165f908152606660209081526040808320848452909152902060010154156114dc5773ffffffffffffffffffffffffffffffffffffffff86165f90815260666020908152604080832084845290915290206001015492505b73ffffffffffffffffffffffffffffffffffffffff86165f9081526066602090815260408083208484529091529020548390611519908490613087565b611523919061309e565b61152d90856130d6565b73ffffffffffffffffffffffffffffffffffffffff8087165f908152606960209081526040808320938b16835260029093019052205490945060ff1680156115a9575073ffffffffffffffffffffffffffffffffffffffff8086165f908152606960209081526040808320938a16835260049093019052205481145b6115b5576001016113e0565b50505092915050565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff161461165d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f776564604482015260640161048e565b6065545f036116c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f6e6f74206d696e74656420796574000000000000000000000000000000000000604482015260640161048e565b5f8115806116e3575060016065546116e0919061314d565b82115b6116ed57816116fc565b60016065546116fc919061314d565b90505f61170a858584612248565b509050801561171d5761171d84826127ce565b5050505050565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146117c3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f776564604482015260640161048e565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526068602052604090205461184e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6e6f20636f6d6d697373696f6e20746f20636c61696d00000000000000000000604482015260640161048e565b73ffffffffffffffffffffffffffffffffffffffff81165f908152606860205260408120805491905561188182826127ce565b8173ffffffffffffffffffffffffffffffffffffffff167f8e14daa5332205b1634040e1054e93d1f5396ec8bf0115d133b7fbaf4a52e411826040516118c991815260200190565b60405180910390a25050565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614611974576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f776564604482015260640161048e565b73ffffffffffffffffffffffffffffffffffffffff86165f9081526066602090815260408083208784529091529020600181018390556119b79060020186612afc565b5073ffffffffffffffffffffffffffffffffffffffff8087165f9081526066602090815260408083208884528252808320938916835260049093019052208390558015611a665773ffffffffffffffffffffffffffffffffffffffff85165f908152606960205260409020611a2c9087612afc565b5073ffffffffffffffffffffffffffffffffffffffff8086165f908152606960209081526040808320938a16835260039093019052208490555b505050505050565b5f54610100900460ff1615808015611a8c57505f54600160ff909116105b80611aa55750303b158015611aa557505f5460ff166001145b611b31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161048e565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611b8d575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff8216611c0a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c6964206f776e657220616464726573730000000000000000000000604482015260640161048e565b611c1382612a65565b8015611c75575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614611d18576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6f6e6c79207265636f726420636f6e747261637420616c6c6f77656400000000604482015260640161048e565b60658054905f611d2783613116565b9190505550866001606554611d3c919061314d565b14611da3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c69642065706f636820696e64657800000000000000000000000000604482015260640161048e565b8285148015611db157508085145b611e17576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c69642064617461206c656e67746800000000000000000000000000604482015260640161048e565b5f5b8581101561208557848482818110611e3357611e336130e9565b9050602002013560665f898985818110611e4f57611e4f6130e9565b9050602002016020810190611e649190612cc8565b73ffffffffffffffffffffffffffffffffffffffff16815260208082019290925260409081015f9081208c8252909252812091909155606690888884818110611eaf57611eaf6130e9565b9050602002016020810190611ec49190612cc8565b73ffffffffffffffffffffffffffffffffffffffff16815260208082019290925260409081015f9081208b8252909252902060010154158015611f0657505f88115b15611fee5760665f888884818110611f2057611f206130e9565b9050602002016020810190611f359190612cc8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60018a611f7c919061314d565b81526020019081526020015f206001015460665f898985818110611fa257611fa26130e9565b9050602002016020810190611fb79190612cc8565b73ffffffffffffffffffffffffffffffffffffffff16815260208082019290925260409081015f9081208c82529092529020600101555b828282818110612000576120006130e9565b9050602002013560685f89898581811061201c5761201c6130e9565b90506020020160208101906120319190612cc8565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461207891906130d6565b9091555050600101611e19565b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526069602052604081206120bd908361221a565b1590505b92915050565b6120cf612199565b73ffffffffffffffffffffffffffffffffffffffff8116612172576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161048e565b61217b81612a65565b50565b5f6120c1825490565b5f6121928383612b1d565b9392505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314610b67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161048e565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526001830160205260408120541515612192565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526069602052604081208190612278908661221a565b6122de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f6e6f2072656d61696e696e672072657761726400000000000000000000000000604482015260640161048e565b73ffffffffffffffffffffffffffffffffffffffff8085165f908152606960209081526040808320938916835260039093019052205483101561237d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f616c6c2072657761726420636c61696d65640000000000000000000000000000604482015260640161048e565b73ffffffffffffffffffffffffffffffffffffffff8085165f9081526069602090815260408083209389168352600390930190529081205481905b8581116126405773ffffffffffffffffffffffffffffffffffffffff8089165f9081526066602090815260408083208584528252808320938b168352600490930190522054156124435773ffffffffffffffffffffffffffffffffffffffff8089165f9081526066602090815260408083208584528252808320938b16835260049093019052205491505b73ffffffffffffffffffffffffffffffffffffffff88165f908152606660209081526040808320848452909152902060010154156124b15773ffffffffffffffffffffffffffffffffffffffff88165f90815260666020908152604080832084845290915290206001015492505b73ffffffffffffffffffffffffffffffffffffffff88165f90815260666020908152604080832084845290915290205483906124ee908490613087565b6124f8919061309e565b61250290866130d6565b73ffffffffffffffffffffffffffffffffffffffff8089165f908152606960209081526040808320938d16835260029093019052205490955060ff16801561257e575073ffffffffffffffffffffffffffffffffffffffff8088165f908152606960209081526040808320938c16835260049093019052205481145b1561262e5773ffffffffffffffffffffffffffffffffffffffff87165f908152606960205260409020600194506125b59089612adb565b5073ffffffffffffffffffffffffffffffffffffffff8781165f908152606960209081526040808320938c16835260028401825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556003840182528083208390556004909301905290812055612640565b8061263881613116565b9150506123b8565b5061264c8560016130d6565b73ffffffffffffffffffffffffffffffffffffffff8088165f908152606960209081526040808320938c1683526003909301815282822093909355606690925281209061269a8760016130d6565b81526020019081526020015f206004015f8773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20545f036127545773ffffffffffffffffffffffffffffffffffffffff87165f908152606660205260408120829161271d8860016130d6565b815260208082019290925260409081015f90812073ffffffffffffffffffffffffffffffffffffffff8b1682526004019092529020555b8673ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f7a84a08b02c91f3c62d572853f966fc799bbd121e8ad7833a4494ab8dcfcb40487876040516127bc929190918252602082015260400190565b60405180910390a35050935093915050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612858573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061287c9190613160565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303815f875af1158015612913573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129379190613177565b506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa1580156129c2573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129e69190613160565b90505f831180156129ff5750826129fd828461314d565b145b610b50576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6d6f72706820746f6b656e207472616e73666572206661696c65640000000000604482015260640161048e565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f6121928373ffffffffffffffffffffffffffffffffffffffff8416612b43565b5f6121928373ffffffffffffffffffffffffffffffffffffffff8416612c26565b5f825f018281548110612b3257612b326130e9565b905f5260205f200154905092915050565b5f8181526001830160205260408120548015612c1d575f612b6560018361314d565b85549091505f90612b789060019061314d565b9050818114612bd7575f865f018281548110612b9657612b966130e9565b905f5260205f200154905080875f018481548110612bb657612bb66130e9565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080612be857612be8613192565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506120c1565b5f9150506120c1565b5f818152600183016020526040812054612c6b57508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556120c1565b505f6120c1565b5080545f8255905f5260205f209081019061217b91905b80821115612c9c575f8155600101612c89565b5090565b803573ffffffffffffffffffffffffffffffffffffffff81168114612cc3575f80fd5b919050565b5f60208284031215612cd8575f80fd5b61219282612ca0565b5f815180845260208085019450602084015f5b83811015612d2657815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101612cf4565b509495945050505050565b5f815180845260208085019450602084015f5b83811015612d2657815187529582019590820190600101612d44565b604081525f612d726040830185612ce1565b8281036020840152612d848185612d31565b95945050505050565b5f8060408385031215612d9e575f80fd5b612da783612ca0565b946020939093013593505050565b5f805f8060808587031215612dc8575f80fd5b612dd185612ca0565b9350612ddf60208601612ca0565b93969395505050506040820135916060013590565b608081525f612e066080830187612ce1565b8281036020848101919091528651808352878201928201905f5b81811015612e3e578451151583529383019391830191600101612e20565b50508481036040860152612e528188612d31565b925050508281036060840152612e688185612d31565b979650505050505050565b5f8060408385031215612e84575f80fd5b612e8d83612ca0565b9150612e9b60208401612ca0565b90509250929050565b5f805f60608486031215612eb6575f80fd5b612ebf84612ca0565b9250612ecd60208501612ca0565b9150604084013590509250925092565b801515811461217b575f80fd5b5f805f805f8060c08789031215612eff575f80fd5b612f0887612ca0565b9550612f1660208801612ca0565b945060408701359350606087013592506080870135915060a0870135612f3b81612edd565b809150509295509295509295565b5f8083601f840112612f59575f80fd5b50813567ffffffffffffffff811115612f70575f80fd5b6020830191508360208260051b8501011115612f8a575f80fd5b9250929050565b5f805f805f805f6080888a031215612fa7575f80fd5b87359650602088013567ffffffffffffffff80821115612fc5575f80fd5b612fd18b838c01612f49565b909850965060408a0135915080821115612fe9575f80fd5b612ff58b838c01612f49565b909650945060608a013591508082111561300d575f80fd5b5061301a8a828b01612f49565b989b979a50959850939692959293505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820281158282048414176120c1576120c161305a565b5f826130d1577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b808201808211156120c1576120c161305a565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036131465761314661305a565b5060010190565b818103818111156120c1576120c161305a565b5f60208284031215613170575f80fd5b5051919050565b5f60208284031215613187575f80fd5b815161219281612edd565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea164736f6c6343000818000a" +var DistributeDeployedBin = "0x608060405234801561000f575f80fd5b5060043610610163575f3560e01c8063a766c529116100c7578063cd4281d01161007d578063d557714111610063578063d557714114610372578063de6ac93314610399578063f2fde38b146103bc575f80fd5b8063cd4281d014610338578063cdd0c50e1461035f575f80fd5b8063b809af0f116100ad578063b809af0f146102dd578063bf2dca0a146102f0578063c4d66de814610325575f80fd5b8063a766c52914610295578063ac2ac640146102ca575f80fd5b8063807de4431161011c578063921ae9b811610102578063921ae9b81461023e5780639889be5114610261578063996cba6814610282575f80fd5b8063807de443146101d45780638da5cb5b14610220575f80fd5b80635cf20c7b1161014c5780635cf20c7b146101a6578063715018a6146101b95780637f683ee3146101c1575f80fd5b8063273d8e82146101675780634eedab3214610191575b5f80fd5b61017a610175366004612ca3565b6103cf565b604051610188929190612d3b565b60405180910390f35b6101a461019f366004612d68565b610820565b005b6101a46101b4366004612d68565b6108e5565b6101a4610b39565b6101a46101cf366004612d90565b610b4c565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610188565b60335473ffffffffffffffffffffffffffffffffffffffff166101fb565b61025161024c366004612ca3565b610e14565b6040516101889493929190612dcf565b61027461026f366004612e4e565b611214565b604051908152602001610188565b6101a4610290366004612e7f565b6115a1565b6102746102a3366004612ca3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526067602052604090205490565b6101a46102d8366004612ca3565b611706565b6101a46102eb366004612ec5565b6118b7565b6102746102fe366004612ca3565b73ffffffffffffffffffffffffffffffffffffffff165f9081526068602052604090205490565b6101a4610333366004612ca3565b611a50565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b6101a461036d366004612f6c565b611c5b565b6101fb7f000000000000000000000000000000000000000000000000000000000000000081565b6103ac6103a7366004612e4e565b612071565b6040519015158152602001610188565b6101a46103ca366004612ca3565b6120a9565b73ffffffffffffffffffffffffffffffffffffffff81165f908152606960205260408120606091829161040190612160565b9050805f03610497576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f696e76616c69642064656c656761746f72206f72206e6f2072656d61696e696e60448201527f672072657761726400000000000000000000000000000000000000000000000060648201526084015b60405180910390fd5b8067ffffffffffffffff8111156104b0576104b0613008565b6040519080825280602002602001820160405280156104d9578160200160208202803683370190505b5092508067ffffffffffffffff8111156104f5576104f5613008565b60405190808252806020026020018201604052801561051e578160200160208202803683370190505b5091505f5b73ffffffffffffffffffffffffffffffffffffffff85165f90815260696020526040902061055090612160565b8110156108195773ffffffffffffffffffffffffffffffffffffffff85165f9081526069602052604081206105859083612169565b73ffffffffffffffffffffffffffffffffffffffff8088165f908152606960209081526040808320938516835260039093019052908120549192509081908190805b60655481101561079c5773ffffffffffffffffffffffffffffffffffffffff8087165f9081526066602090815260408083208584528252808320938f168352600490930190522054156106555773ffffffffffffffffffffffffffffffffffffffff8087165f9081526066602090815260408083208584528252808320938f16835260049093019052205492505b73ffffffffffffffffffffffffffffffffffffffff86165f908152606660209081526040808320848452909152902060010154156106c35773ffffffffffffffffffffffffffffffffffffffff86165f90815260666020908152604080832084845290915290206001015493505b73ffffffffffffffffffffffffffffffffffffffff86165f9081526066602090815260408083208484529091529020548490610700908590613062565b61070a9190613079565b61071490866130b1565b73ffffffffffffffffffffffffffffffffffffffff808d165f908152606960209081526040808320938b16835260029093019052205490955060ff168015610790575073ffffffffffffffffffffffffffffffffffffffff808c165f908152606960209081526040808320938a16835260049093019052205481145b61079c576001016105c7565b50848987815181106107b0576107b06130c4565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050838887815181106107fd576107fd6130c4565b6020908102919091010152505060019093019250610523915050565b5050915091565b61082861217b565b73ffffffffffffffffffffffffffffffffffffffff82165f908152606760205260409020545b8181116108b95773ffffffffffffffffffffffffffffffffffffffff83165f90815260666020908152604080832084845290915281208181556001810182905590600282018181816108a08282612c4d565b50505050505080806108b1906130f1565b91505061084e565b73ffffffffffffffffffffffffffffffffffffffff9092165f9081526067602052604090209190915550565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610984576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f776564604482015260640161048e565b6065545f036109ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f6e6f74206d696e74656420796574000000000000000000000000000000000000604482015260640161048e565b5f811580610a0a57506001606554610a079190613128565b82115b610a145781610a23565b6001606554610a239190613128565b90505f805b73ffffffffffffffffffffffffffffffffffffffff85165f908152606960205260409020610a5590612160565b811015610b225773ffffffffffffffffffffffffffffffffffffffff85165f908152606960205260408120610a8a9083612169565b73ffffffffffffffffffffffffffffffffffffffff87165f908152606960205260409020909150610abb90826121fc565b8015610afc575073ffffffffffffffffffffffffffffffffffffffff8087165f90815260696020908152604080832093851683526003909301905220548410155b15610b1957610b0c81878661222a565b610b1690846130b1565b92505b50600101610a28565b508015610b3357610b3384826127a9565b50505050565b610b4161217b565b610b4a5f612a40565b565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610beb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f776564604482015260640161048e565b73ffffffffffffffffffffffffffffffffffffffff84165f9081526066602090815260408083208584529091529020600101819055811580610c61575073ffffffffffffffffffffffffffffffffffffffff8084165f908152606960209081526040808320938816835260039093019052205482145b15610d6d5773ffffffffffffffffffffffffffffffffffffffff84165f9081526066602090815260408083208584529091529020610ca29060020184612ab6565b5073ffffffffffffffffffffffffffffffffffffffff8085165f90815260666020908152604080832086845282528083209387168352600490930181528282208290556069905220610cf49085612ab6565b5073ffffffffffffffffffffffffffffffffffffffff8381165f908152606960209081526040808320938816835260028401825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556003840182528083208390556004909301905290812055610b33565b73ffffffffffffffffffffffffffffffffffffffff8084165f9081526069602090815260408083209388168352600290930190522080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001908117909155610dd89083613128565b73ffffffffffffffffffffffffffffffffffffffff8085165f908152606960209081526040808320938916835260049093019052205550505050565b73ffffffffffffffffffffffffffffffffffffffff81165f908152606960205260408120606091829182918291610e4a90612160565b90505f8167ffffffffffffffff811115610e6657610e66613008565b604051908082528060200260200182016040528015610e8f578160200160208202803683370190505b5090505f8267ffffffffffffffff811115610eac57610eac613008565b604051908082528060200260200182016040528015610ed5578160200160208202803683370190505b5090505f8367ffffffffffffffff811115610ef257610ef2613008565b604051908082528060200260200182016040528015610f1b578160200160208202803683370190505b5090505f8467ffffffffffffffff811115610f3857610f38613008565b604051908082528060200260200182016040528015610f61578160200160208202803683370190505b5090505f5b858110156112035773ffffffffffffffffffffffffffffffffffffffff8b165f908152606960205260409020610f9c9082612169565b858281518110610fae57610fae6130c4565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060695f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002015f86838151811061103b5761103b6130c4565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9054906101000a900460ff1684828151811061109b5761109b6130c4565b91151560209283029190910182015273ffffffffffffffffffffffffffffffffffffffff8c165f9081526069909152604081208651600390910191908790849081106110e9576110e96130c4565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205483828151811061113d5761113d6130c4565b60200260200101818152505060695f8c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206004015f86838151811061119c5761119c6130c4565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20548282815181106111f0576111f06130c4565b6020908102919091010152600101610f66565b509299919850965090945092505050565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260696020526040812061124190612160565b5f036112cf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602860248201527f696e76616c69642064656c656761746f72206f72206e6f2072656d61696e696e60448201527f6720726577617264000000000000000000000000000000000000000000000000606482015260840161048e565b73ffffffffffffffffffffffffffffffffffffffff82165f9081526069602052604090206112fd90846121fc565b611388576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f6e6f2072656d61696e696e6720726577617264206f66207468652064656c656760448201527f6174656500000000000000000000000000000000000000000000000000000000606482015260840161048e565b73ffffffffffffffffffffffffffffffffffffffff8083165f9081526069602090815260408083209387168352600390930190529081205481905b6065548110156115985773ffffffffffffffffffffffffffffffffffffffff8087165f90815260666020908152604080832085845282528083209389168352600490930190522054156114515773ffffffffffffffffffffffffffffffffffffffff8087165f9081526066602090815260408083208584528252808320938916835260049093019052205491505b73ffffffffffffffffffffffffffffffffffffffff86165f908152606660209081526040808320848452909152902060010154156114bf5773ffffffffffffffffffffffffffffffffffffffff86165f90815260666020908152604080832084845290915290206001015492505b73ffffffffffffffffffffffffffffffffffffffff86165f90815260666020908152604080832084845290915290205483906114fc908490613062565b6115069190613079565b61151090856130b1565b73ffffffffffffffffffffffffffffffffffffffff8087165f908152606960209081526040808320938b16835260029093019052205490945060ff16801561158c575073ffffffffffffffffffffffffffffffffffffffff8086165f908152606960209081526040808320938a16835260049093019052205481145b611598576001016113c3565b50505092915050565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614611640576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f776564604482015260640161048e565b6065545f036116ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f6e6f74206d696e74656420796574000000000000000000000000000000000000604482015260640161048e565b5f8115806116c6575060016065546116c39190613128565b82115b6116d057816116df565b60016065546116df9190613128565b90505f6116ed85858461222a565b905080156116ff576116ff84826127a9565b5050505050565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146117a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f776564604482015260640161048e565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260686020526040902054611830576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6e6f20636f6d6d697373696f6e20746f20636c61696d00000000000000000000604482015260640161048e565b73ffffffffffffffffffffffffffffffffffffffff81165f908152606860205260408120805491905561186382826127a9565b8173ffffffffffffffffffffffffffffffffffffffff167f8e14daa5332205b1634040e1054e93d1f5396ec8bf0115d133b7fbaf4a52e411826040516118ab91815260200190565b60405180910390a25050565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614611956576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f6f6e6c79206c32207374616b696e6720636f6e747261637420616c6c6f776564604482015260640161048e565b73ffffffffffffffffffffffffffffffffffffffff86165f9081526066602090815260408083208784529091529020600181018390556119999060020186612ad7565b5073ffffffffffffffffffffffffffffffffffffffff8087165f9081526066602090815260408083208884528252808320938916835260049093019052208390558015611a485773ffffffffffffffffffffffffffffffffffffffff85165f908152606960205260409020611a0e9087612ad7565b5073ffffffffffffffffffffffffffffffffffffffff8086165f908152606960209081526040808320938a16835260039093019052208490555b505050505050565b5f54610100900460ff1615808015611a6e57505f54600160ff909116105b80611a875750303b158015611a8757505f5460ff166001145b611b13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161048e565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611b6f575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff8216611bec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c6964206f776e657220616464726573730000000000000000000000604482015260640161048e565b611bf582612a40565b8015611c57575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614611cfa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f6f6e6c79207265636f726420636f6e747261637420616c6c6f77656400000000604482015260640161048e565b60658054905f611d09836130f1565b9190505550866001606554611d1e9190613128565b14611d85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c69642065706f636820696e64657800000000000000000000000000604482015260640161048e565b8285148015611d9357508085145b611df9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c69642064617461206c656e67746800000000000000000000000000604482015260640161048e565b5f5b8581101561206757848482818110611e1557611e156130c4565b9050602002013560665f898985818110611e3157611e316130c4565b9050602002016020810190611e469190612ca3565b73ffffffffffffffffffffffffffffffffffffffff16815260208082019290925260409081015f9081208c8252909252812091909155606690888884818110611e9157611e916130c4565b9050602002016020810190611ea69190612ca3565b73ffffffffffffffffffffffffffffffffffffffff16815260208082019290925260409081015f9081208b8252909252902060010154158015611ee857505f88115b15611fd05760665f888884818110611f0257611f026130c4565b9050602002016020810190611f179190612ca3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f60018a611f5e9190613128565b81526020019081526020015f206001015460665f898985818110611f8457611f846130c4565b9050602002016020810190611f999190612ca3565b73ffffffffffffffffffffffffffffffffffffffff16815260208082019290925260409081015f9081208c82529092529020600101555b828282818110611fe257611fe26130c4565b9050602002013560685f898985818110611ffe57611ffe6130c4565b90506020020160208101906120139190612ca3565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f82825461205a91906130b1565b9091555050600101611dfb565b5050505050505050565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260696020526040812061209f90836121fc565b1590505b92915050565b6120b161217b565b73ffffffffffffffffffffffffffffffffffffffff8116612154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161048e565b61215d81612a40565b50565b5f6120a3825490565b5f6121748383612af8565b9392505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314610b4a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161048e565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526001830160205260408120541515612174565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260696020526040812061225890856121fc565b6122be576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f6e6f2072656d61696e696e672072657761726400000000000000000000000000604482015260640161048e565b73ffffffffffffffffffffffffffffffffffffffff8084165f908152606960209081526040808320938816835260039093019052205482101561235d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f616c6c2072657761726420636c61696d65640000000000000000000000000000604482015260640161048e565b73ffffffffffffffffffffffffffffffffffffffff8084165f9081526069602090815260408083209388168352600390930190529081205481905b84811161261c5773ffffffffffffffffffffffffffffffffffffffff8088165f9081526066602090815260408083208584528252808320938a168352600490930190522054156124235773ffffffffffffffffffffffffffffffffffffffff8088165f9081526066602090815260408083208584528252808320938a16835260049093019052205491505b73ffffffffffffffffffffffffffffffffffffffff87165f908152606660209081526040808320848452909152902060010154156124915773ffffffffffffffffffffffffffffffffffffffff87165f90815260666020908152604080832084845290915290206001015492505b73ffffffffffffffffffffffffffffffffffffffff87165f90815260666020908152604080832084845290915290205483906124ce908490613062565b6124d89190613079565b6124e290856130b1565b73ffffffffffffffffffffffffffffffffffffffff8088165f908152606960209081526040808320938c16835260029093019052205490945060ff16801561255e575073ffffffffffffffffffffffffffffffffffffffff8087165f908152606960209081526040808320938b16835260049093019052205481145b1561260a5773ffffffffffffffffffffffffffffffffffffffff86165f9081526069602052604090206125919088612ab6565b5073ffffffffffffffffffffffffffffffffffffffff8681165f908152606960209081526040808320938b16835260028401825280832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600384018252808320839055600490930190529081205561261c565b80612614816130f1565b915050612398565b506126288460016130b1565b73ffffffffffffffffffffffffffffffffffffffff8087165f908152606960209081526040808320938b168352600390930181528282209390935560669092528120906126768660016130b1565b81526020019081526020015f206004015f8673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20545f036127305773ffffffffffffffffffffffffffffffffffffffff86165f90815260666020526040812082916126f98760016130b1565b815260208082019290925260409081015f90812073ffffffffffffffffffffffffffffffffffffffff8a1682526004019092529020555b8573ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167f7a84a08b02c91f3c62d572853f966fc799bbd121e8ad7833a4494ab8dcfcb4048686604051612798929190918252602082015260400190565b60405180910390a350509392505050565b6040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa158015612833573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612857919061313b565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303815f875af11580156128ee573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129129190613152565b506040517f70a082310000000000000000000000000000000000000000000000000000000081523060048201525f907f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16906370a0823190602401602060405180830381865afa15801561299d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906129c1919061313b565b90505f831180156129da5750826129d88284613128565b145b610b33576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6d6f72706820746f6b656e207472616e73666572206661696c65640000000000604482015260640161048e565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f6121748373ffffffffffffffffffffffffffffffffffffffff8416612b1e565b5f6121748373ffffffffffffffffffffffffffffffffffffffff8416612c01565b5f825f018281548110612b0d57612b0d6130c4565b905f5260205f200154905092915050565b5f8181526001830160205260408120548015612bf8575f612b40600183613128565b85549091505f90612b5390600190613128565b9050818114612bb2575f865f018281548110612b7157612b716130c4565b905f5260205f200154905080875f018481548110612b9157612b916130c4565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080612bc357612bc361316d565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506120a3565b5f9150506120a3565b5f818152600183016020526040812054612c4657508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556120a3565b505f6120a3565b5080545f8255905f5260205f209081019061215d91905b80821115612c77575f8155600101612c64565b5090565b803573ffffffffffffffffffffffffffffffffffffffff81168114612c9e575f80fd5b919050565b5f60208284031215612cb3575f80fd5b61217482612c7b565b5f815180845260208085019450602084015f5b83811015612d0157815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101612ccf565b509495945050505050565b5f815180845260208085019450602084015f5b83811015612d0157815187529582019590820190600101612d1f565b604081525f612d4d6040830185612cbc565b8281036020840152612d5f8185612d0c565b95945050505050565b5f8060408385031215612d79575f80fd5b612d8283612c7b565b946020939093013593505050565b5f805f8060808587031215612da3575f80fd5b612dac85612c7b565b9350612dba60208601612c7b565b93969395505050506040820135916060013590565b608081525f612de16080830187612cbc565b8281036020848101919091528651808352878201928201905f5b81811015612e19578451151583529383019391830191600101612dfb565b50508481036040860152612e2d8188612d0c565b925050508281036060840152612e438185612d0c565b979650505050505050565b5f8060408385031215612e5f575f80fd5b612e6883612c7b565b9150612e7660208401612c7b565b90509250929050565b5f805f60608486031215612e91575f80fd5b612e9a84612c7b565b9250612ea860208501612c7b565b9150604084013590509250925092565b801515811461215d575f80fd5b5f805f805f8060c08789031215612eda575f80fd5b612ee387612c7b565b9550612ef160208801612c7b565b945060408701359350606087013592506080870135915060a0870135612f1681612eb8565b809150509295509295509295565b5f8083601f840112612f34575f80fd5b50813567ffffffffffffffff811115612f4b575f80fd5b6020830191508360208260051b8501011115612f65575f80fd5b9250929050565b5f805f805f805f6080888a031215612f82575f80fd5b87359650602088013567ffffffffffffffff80821115612fa0575f80fd5b612fac8b838c01612f24565b909850965060408a0135915080821115612fc4575f80fd5b612fd08b838c01612f24565b909650945060608a0135915080821115612fe8575f80fd5b50612ff58a828b01612f24565b989b979a50959850939692959293505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820281158282048414176120a3576120a3613035565b5f826130ac577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b808201808211156120a3576120a3613035565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361312157613121613035565b5060010190565b818103818111156120a3576120a3613035565b5f6020828403121561314b575f80fd5b5051919050565b5f60208284031215613162575f80fd5b815161217481612eb8565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea164736f6c6343000818000a" func init() { if err := json.Unmarshal([]byte(DistributeStorageLayoutJSON), DistributeStorageLayout); err != nil { diff --git a/bindings/bindings/gov.go b/bindings/bindings/gov.go index 464d964eb..52a935182 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\":[{\"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", + 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", } // GovABI is the input ABI used to generate the binding from. @@ -395,37 +395,6 @@ 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) @@ -647,37 +616,6 @@ 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) @@ -709,27 +647,6 @@ 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 dd15ac15a..52fed2962 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)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\"}}}" +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\"}}}" var GovStorageLayout = new(solc.StorageLayout) -var GovDeployedBin = "0x608060405234801561000f575f80fd5b5060043610610184575f3560e01c8063807de443116100dd578063b511328d11610088578063e5aec99511610063578063e5aec995146103b0578063f2fde38b146103b9578063f92ad219146103cc575f80fd5b8063b511328d14610356578063d5cc89ba14610394578063d7693075146103a7575f80fd5b80638e21d5fb116100b85780638e21d5fb146102dd57806396dea93614610304578063a83d07371461034d575f80fd5b8063807de4431461026a57806385963052146102b65780638da5cb5b146102bf575f80fd5b806349c1a5811161013d578063715018a611610118578063715018a61461022757806374c260cf1461022f57806377c7938014610261575f80fd5b806349c1a581146101e85780635bcfadb51461020b578063639661901461021e575f80fd5b8063132002fc1161016d578063132002fc146101b0578063237a4b96146101cc5780634428c1a4146101df575f80fd5b80630121b93f146101885780630d61b5191461019d575b5f80fd5b61019b6101963660046119ba565b6103df565b005b61019b6101ab3660046119ba565b6107c3565b6101b9606b5481565b6040519081526020015b60405180910390f35b6101b96101da3660046119d1565b6108ab565b6101b9606a5481565b6101fb6101f6366004611a08565b610be9565b60405190151581526020016101c3565b61019b6102193660046119ba565b610c09565b6101b9606c5481565b61019b610cf2565b61024261023d3660046119ba565b610d05565b60408051931515845291151560208401521515908201526060016101c3565b6101b960675481565b6102917f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c3565b6101b960655481565b60335473ffffffffffffffffffffffffffffffffffffffff16610291565b6102917f000000000000000000000000000000000000000000000000000000000000000081565b6103326103123660046119ba565b606e6020525f908152604090208054600182015460029092015490919083565b604080519384526020840192909252908201526060016101c3565b6101b960715481565b61037f6103643660046119ba565b606f6020525f90815260409020805460019091015460ff1682565b604080519283529015156020830152016101c3565b61019b6103a23660046119ba565b610eab565b6101b9606d5481565b6101b960695481565b61019b6103c7366004611a36565b610fd8565b61019b6103da366004611a58565b61108f565b5f73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016636d46e987336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015610484573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906104a89190611a98565b905080610516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6f6e6c792073657175656e63657220616c6c6f7765640000000000000000000060448201526064015b60405180910390fd5b606c54821115610582576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e76616c69642070726f706f73616c49440000000000000000000000000000604482015260640161050d565b60715482116105ed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f657870697265642070726f706f73616c49440000000000000000000000000000604482015260640161050d565b606d54821015610659576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f70726f706f73616c207072756e65640000000000000000000000000000000000604482015260640161050d565b5f828152606f60205260409020805460019091015460ff168061067a575080155b8061068457504281105b156106eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f766f74696e672068617320656e64656400000000000000000000000000000000604482015260640161050d565b610702335f858152607060205260409020906114df565b1561078f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f73657175656e63657220616c726561647920766f74656420666f72207468697360448201527f2070726f706f73616c0000000000000000000000000000000000000000000000606482015260840161050d565b6107a6335f8581526070602052604090209061150d565b506107b08361152e565b156107be576107be83611665565b505050565b5f806107ce83610d05565b5091509150811561083b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f766f74696e672068617320656e64656400000000000000000000000000000000604482015260640161050d565b806108a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f70726f706f73616c20686173206e6f74206265656e2070617373656420796574604482015260640161050d565b6107be83611665565b5f8073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016636d46e987336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015610951573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906109759190611a98565b9050806109de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6f6e6c792073657175656e63657220616c6c6f77656400000000000000000000604482015260640161050d565b82604001355f03610a4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e76616c696420726f6c6c75702065706f6368000000000000000000000000604482015260640161050d565b8235151580610a5d5750602083013515155b610ac3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e76616c696420626174636820706172616d73000000000000000000000000604482015260640161050d565b606c8054905f610ad283611ae4565b9091555050606c545f908152606e602052604090208390610b0a82828135815560208201356001820155604082013560028201555050565b9050506040518060400160405280606b5442610b269190611b1b565b81525f6020918201819052606c548152606f82526040902082518155910151600190910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905533606c54604080518635815260208088013590820152818701359181019190915273ffffffffffffffffffffffffffffffffffffffff92909216917f66e5b37817dfa9935ab8e631ce7774a2e773d56cc8ea6815ac65f1fbac6420849060600160405180910390a35050606c54919050565b5f828152607060205260408120610c0090836114df565b90505b92915050565b610c11611849565b5f81118015610c225750606b548114155b610cad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f696e76616c6964206e65772070726f706f73616c20766f74696e67206475726160448201527f74696f6e00000000000000000000000000000000000000000000000000000000606482015260840161050d565b606b80549082905560408051828152602081018490527ffe810823e41a0cf27003f3eac9c17098028ba0aece75bd9783a8da7f75fb3aa3910160405180910390a15050565b610cfa611849565b610d035f6118ca565b565b5f805f606c54841115610d74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e76616c69642070726f706f73616c49440000000000000000000000000000604482015260640161050d565b607154841015610de0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f657870697265642070726f706f73616c00000000000000000000000000000000604482015260640161050d565b606d54841015610e4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f70726f706f73616c207072756e65640000000000000000000000000000000000604482015260640161050d565b6071548403610e6357506001915081905080610ea4565b5f848152606f602052604090206001810154905460ff909116908180610e87575080155b80610e9157504281105b610e9a8761152e565b8394509450945050505b9193909250565b6071548110610f3c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603e60248201527f6f6e6c7920616c6c6f7720746f2064656c657465207468652070726f706f736160448201527f6c206265666f72206c6174657374207061737365642070726f706f73616c0000606482015260840161050d565b606d545b818111610fc6575f818152606e6020908152604080832083815560018082018590556002909101849055606f83528184208481550180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016905560709091528120908181610faf828261198c565b505050508080610fbe90611ae4565b915050610f40565b50610fd2816001611b1b565b606d5550565b610fe0611849565b73ffffffffffffffffffffffffffffffffffffffff8116611083576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f6464726573730000000000000000000000000000000000000000000000000000606482015260840161050d565b61108c816118ca565b50565b5f54610100900460ff16158080156110ad57505f54600160ff909116105b806110c65750303b1580156110c657505f5460ff166001145b611152576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a6564000000000000000000000000000000000000606482015260840161050d565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156111ae575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff861661122b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c6964206f776e657220616464726573730000000000000000000000604482015260640161050d565b5f8511611294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f696e76616c69642070726f706f73616c20766f74696e67206475726174696f6e604482015260640161050d565b5f82116112fd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e76616c696420726f6c6c75702065706f6368000000000000000000000000604482015260640161050d565b8315158061130a57508215155b611370576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e76616c696420626174636820706172616d73000000000000000000000000604482015260640161050d565b611379866118ca565b606b85905560658490556067839055606982905542606a55604080515f8152602081018790527ffe810823e41a0cf27003f3eac9c17098028ba0aece75bd9783a8da7f75fb3aa3910160405180910390a1604080515f8152602081018690527fa044538eba1b21d23eb13fa35811ca9d1d7ff9ef1c81ee4dc594fca08412531b910160405180910390a1604080515f8152602081018590527fab2cb47d396c5d12c082ac9b6512d332af2767ca8e1fa5bcef40fa6970626569910160405180910390a1604080515f8152602081018490527f9b20ee151d057f4f3ece7fdf4ca1370cf143f181760e7712b722572f2dcba88f910160405180910390a180156114d7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526001830160205260408120541515610c00565b5f610c008373ffffffffffffffffffffffffffffffffffffffff8416611940565b5f807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166377d7dffb6040518163ffffffff1660e01b81526004015f60405180830381865afa158015611598573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682016040526115dd9190810190611b6b565b90505f805b82518110156116425761162783828151811061160057611600611c49565b602002602001015160705f8881526020019081526020015f206114df90919063ffffffff16565b1561163a57611637826001611b1b565b91505b6001016115e2565b506003825160026116539190611c76565b61165d9190611c8d565b109392505050565b60718190555f818152606e6020526040902054606554146116d957606580545f838152606e60205260409081902054928390555190917fa044538eba1b21d23eb13fa35811ca9d1d7ff9ef1c81ee4dc594fca08412531b916116cf91848252602082015260400190565b60405180910390a1505b5f818152606e60205260409020600101546067541461174e57606780545f838152606e60205260409081902060010154928390555190917fab2cb47d396c5d12c082ac9b6512d332af2767ca8e1fa5bcef40fa69706265699161174491848252602082015260400190565b60405180910390a1505b5f818152606e6020526040902060020154606954146117c257606980545f838152606e6020908152604091829020600201805490945542606a55925481518381529384015290917f9b20ee151d057f4f3ece7fdf4ca1370cf143f181760e7712b722572f2dcba88f910160405180910390a1505b5f818152606f6020908152604091829020600190810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690911790556065546067546069548451928352928201529182015281907fd31188695e1c2a2d02b755e14fa986aca41d391c337437b9159eaed8347e7f1c9060600160405180910390a250565b60335473ffffffffffffffffffffffffffffffffffffffff163314610d03576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640161050d565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f81815260018301602052604081205461198557508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610c03565b505f610c03565b5080545f8255905f5260205f209081019061108c91905b808211156119b6575f81556001016119a3565b5090565b5f602082840312156119ca575f80fd5b5035919050565b5f606082840312156119e1575f80fd5b50919050565b73ffffffffffffffffffffffffffffffffffffffff8116811461108c575f80fd5b5f8060408385031215611a19575f80fd5b823591506020830135611a2b816119e7565b809150509250929050565b5f60208284031215611a46575f80fd5b8135611a51816119e7565b9392505050565b5f805f805f60a08688031215611a6c575f80fd5b8535611a77816119e7565b97602087013597506040870135966060810135965060800135945092505050565b5f60208284031215611aa8575f80fd5b81518015158114611a51575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611b1457611b14611ab7565b5060010190565b80820180821115610c0357610c03611ab7565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b8051611b66816119e7565b919050565b5f6020808385031215611b7c575f80fd5b825167ffffffffffffffff80821115611b93575f80fd5b818501915085601f830112611ba6575f80fd5b815181811115611bb857611bb8611b2e565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108582111715611bfb57611bfb611b2e565b604052918252848201925083810185019188831115611c18575f80fd5b938501935b82851015611c3d57611c2e85611b5b565b84529385019392850192611c1d565b98975050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8082028115828204841417610c0357610c03611ab7565b5f82611cc0577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b50049056fea164736f6c6343000818000a" +var GovDeployedBin = "0x608060405234801561000f575f80fd5b5060043610610163575f3560e01c806377c79380116100c757806396dea9361161007d578063e5aec99511610063578063e5aec9951461036a578063f2fde38b14610373578063f92ad21914610386575f80fd5b806396dea936146102e3578063b511328d1461032c575f80fd5b806385963052116100ad57806385963052146102955780638da5cb5b1461029e5780638e21d5fb146102bc575f80fd5b806377c7938014610240578063807de44314610249575f80fd5b806349c1a5811161011c578063639661901161010257806363966190146101fd578063715018a61461020657806374c260cf1461020e575f80fd5b806349c1a581146101c75780635bcfadb5146101ea575f80fd5b8063132002fc1161014c578063132002fc1461018f578063237a4b96146101ab5780634428c1a4146101be575f80fd5b80630121b93f146101675780630d61b5191461017c575b5f80fd5b61017a6101753660046117de565b610399565b005b61017a61018a3660046117de565b610712565b610198606b5481565b6040519081526020015b60405180910390f35b6101986101b93660046117f5565b6107fa565b610198606a5481565b6101da6101d536600461182c565b610b38565b60405190151581526020016101a2565b61017a6101f83660046117de565b610b58565b610198606c5481565b61017a610c41565b61022161021c3660046117de565b610c54565b60408051931515845291151560208401521515908201526060016101a2565b61019860675481565b6102707f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a2565b61019860655481565b60335473ffffffffffffffffffffffffffffffffffffffff16610270565b6102707f000000000000000000000000000000000000000000000000000000000000000081565b6103116102f13660046117de565b606e6020525f908152604090208054600182015460029092015490919083565b604080519384526020840192909252908201526060016101a2565b61035561033a3660046117de565b606f6020525f90815260409020805460019091015460ff1682565b604080519283529015156020830152016101a2565b61019860695481565b61017a61038136600461185a565b610d75565b61017a61039436600461187c565b610e2c565b5f73ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016636d46e987336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa15801561043e573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061046291906118bc565b9050806104d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6f6e6c792073657175656e63657220616c6c6f7765640000000000000000000060448201526064015b60405180910390fd5b606c5482111561053c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e76616c69642070726f706f73616c4944000000000000000000000000000060448201526064016104c7565b606d548210156105a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f70726f706f73616c207072756e6564000000000000000000000000000000000060448201526064016104c7565b5f828152606f60205260409020805460019091015460ff16806105c9575080155b806105d357504281105b1561063a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f766f74696e672068617320656e6465640000000000000000000000000000000060448201526064016104c7565b610651335f8581526070602052604090209061127c565b156106de576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602960248201527f73657175656e63657220616c726561647920766f74656420666f72207468697360448201527f2070726f706f73616c000000000000000000000000000000000000000000000060648201526084016104c7565b6106f5335f858152607060205260409020906112aa565b506106ff836112cb565b1561070d5761070d83611402565b505050565b5f8061071d83610c54565b5091509150811561078a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f766f74696e672068617320656e6465640000000000000000000000000000000060448201526064016104c7565b806107f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f70726f706f73616c20686173206e6f74206265656e207061737365642079657460448201526064016104c7565b61070d83611402565b5f8073ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016636d46e987336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa1580156108a0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906108c491906118bc565b90508061092d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6f6e6c792073657175656e63657220616c6c6f7765640000000000000000000060448201526064016104c7565b82604001355f0361099a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e76616c696420726f6c6c75702065706f636800000000000000000000000060448201526064016104c7565b82351515806109ac5750602083013515155b610a12576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e76616c696420626174636820706172616d7300000000000000000000000060448201526064016104c7565b606c8054905f610a2183611908565b9091555050606c545f908152606e602052604090208390610a5982828135815560208201356001820155604082013560028201555050565b9050506040518060400160405280606b5442610a75919061193f565b81525f6020918201819052606c548152606f82526040902082518155910151600190910180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905533606c54604080518635815260208088013590820152818701359181019190915273ffffffffffffffffffffffffffffffffffffffff92909216917f66e5b37817dfa9935ab8e631ce7774a2e773d56cc8ea6815ac65f1fbac6420849060600160405180910390a35050606c54919050565b5f828152607060205260408120610b4f908361127c565b90505b92915050565b610b6061166d565b5f81118015610b715750606b548114155b610bfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f696e76616c6964206e65772070726f706f73616c20766f74696e67206475726160448201527f74696f6e0000000000000000000000000000000000000000000000000000000060648201526084016104c7565b606b80549082905560408051828152602081018490527ffe810823e41a0cf27003f3eac9c17098028ba0aece75bd9783a8da7f75fb3aa3910160405180910390a15050565b610c4961166d565b610c525f6116ee565b565b5f805f606c54841115610cc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e76616c69642070726f706f73616c4944000000000000000000000000000060448201526064016104c7565b606d54841015610d2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f70726f706f73616c207072756e6564000000000000000000000000000000000060448201526064016104c7565b5f848152606f602052604090206001810154905460ff909116908180610d53575080155b80610d5d57504281105b610d66876112cb565b90979096509194509092505050565b610d7d61166d565b73ffffffffffffffffffffffffffffffffffffffff8116610e20576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104c7565b610e29816116ee565b50565b5f54610100900460ff1615808015610e4a57505f54600160ff909116105b80610e635750303b158015610e6357505f5460ff166001145b610eef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104c7565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610f4b575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff8616610fc8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c6964206f776e65722061646472657373000000000000000000000060448201526064016104c7565b5f8511611031576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f696e76616c69642070726f706f73616c20766f74696e67206475726174696f6e60448201526064016104c7565b5f821161109a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e76616c696420726f6c6c75702065706f636800000000000000000000000060448201526064016104c7565b831515806110a757508215155b61110d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e76616c696420626174636820706172616d7300000000000000000000000060448201526064016104c7565b611116866116ee565b606b85905560658490556067839055606982905542606a55604080515f8152602081018790527ffe810823e41a0cf27003f3eac9c17098028ba0aece75bd9783a8da7f75fb3aa3910160405180910390a1604080515f8152602081018690527fa044538eba1b21d23eb13fa35811ca9d1d7ff9ef1c81ee4dc594fca08412531b910160405180910390a1604080515f8152602081018590527fab2cb47d396c5d12c082ac9b6512d332af2767ca8e1fa5bcef40fa6970626569910160405180910390a1604080515f8152602081018490527f9b20ee151d057f4f3ece7fdf4ca1370cf143f181760e7712b722572f2dcba88f910160405180910390a18015611274575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050505050565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526001830160205260408120541515610b4f565b5f610b4f8373ffffffffffffffffffffffffffffffffffffffff8416611764565b5f807f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff166377d7dffb6040518163ffffffff1660e01b81526004015f60405180830381865afa158015611335573d5f803e3d5ffd5b505050506040513d5f823e601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820160405261137a919081019061198f565b90505f805b82518110156113df576113c483828151811061139d5761139d611a6d565b602002602001015160705f8881526020019081526020015f2061127c90919063ffffffff16565b156113d7576113d482600161193f565b91505b60010161137f565b506003825160026113f09190611a9a565b6113fa9190611ab1565b109392505050565b5f818152606e60205260409020546065541461147157606580545f838152606e60205260409081902054928390555190917fa044538eba1b21d23eb13fa35811ca9d1d7ff9ef1c81ee4dc594fca08412531b9161146791848252602082015260400190565b60405180910390a1505b5f818152606e6020526040902060010154606754146114e657606780545f838152606e60205260409081902060010154928390555190917fab2cb47d396c5d12c082ac9b6512d332af2767ca8e1fa5bcef40fa6970626569916114dc91848252602082015260400190565b60405180910390a1505b5f818152606e60205260409020600201546069541461155a57606980545f838152606e6020908152604091829020600201805490945542606a55925481518381529384015290917f9b20ee151d057f4f3ece7fdf4ca1370cf143f181760e7712b722572f2dcba88f910160405180910390a1505b5f818152606f60205260409020600190810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169091179055606d545b81811015611619575f818152606e6020908152604080832083815560018082018590556002909101849055606f83528184208481550180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556070909152812090818161160982826117b0565b5050600190920191506115999050565b50606d8190556065546067546069546040805193845260208401929092529082015281907fd31188695e1c2a2d02b755e14fa986aca41d391c337437b9159eaed8347e7f1c9060600160405180910390a250565b60335473ffffffffffffffffffffffffffffffffffffffff163314610c52576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104c7565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f8181526001830160205260408120546117a957508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610b52565b505f610b52565b5080545f8255905f5260205f2090810190610e2991905b808211156117da575f81556001016117c7565b5090565b5f602082840312156117ee575f80fd5b5035919050565b5f60608284031215611805575f80fd5b50919050565b73ffffffffffffffffffffffffffffffffffffffff81168114610e29575f80fd5b5f806040838503121561183d575f80fd5b82359150602083013561184f8161180b565b809150509250929050565b5f6020828403121561186a575f80fd5b81356118758161180b565b9392505050565b5f805f805f60a08688031215611890575f80fd5b853561189b8161180b565b97602087013597506040870135966060810135965060800135945092505050565b5f602082840312156118cc575f80fd5b81518015158114611875575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203611938576119386118db565b5060010190565b80820180821115610b5257610b526118db565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b805161198a8161180b565b919050565b5f60208083850312156119a0575f80fd5b825167ffffffffffffffff808211156119b7575f80fd5b818501915085601f8301126119ca575f80fd5b8151818111156119dc576119dc611952565b8060051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108582111715611a1f57611a1f611952565b604052918252848201925083810185019188831115611a3c575f80fd5b938501935b82851015611a6157611a528561197f565b84529385019392850192611a41565b98975050505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8082028115828204841417610b5257610b526118db565b5f82611ae4577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b50049056fea164736f6c6343000818000a" func init() { if err := json.Unmarshal([]byte(GovStorageLayoutJSON), GovStorageLayout); err != nil { diff --git a/bindings/bindings/l1messagequeuewithgaspriceoracle.go b/bindings/bindings/l1messagequeuewithgaspriceoracle.go index fca2a8623..c2a248f6c 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\"}],\"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", + 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\":[],\"name\":\"getFirstUnfinalizedMessageEnqueueTime\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"index\",\"type\":\"uint256\"}],\"name\":\"getMessageEnqueueTimestamp\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"timestamp\",\"type\":\"uint256\"}],\"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\":\"messageEnqueueTime\",\"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: "0x60e060405234801562000010575f80fd5b50604051620017ca380380620017ca833981016040819052620000339162000185565b6001600160a01b03831615806200005157506001600160a01b038216155b806200006457506001600160a01b038116155b156200008357604051630ecc6fdf60e41b815260040160405180910390fd5b6200008d620000ab565b6001600160a01b0392831660805290821660a0521660c052620001cc565b5f54610100900460ff1615620001175760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff9081161462000167575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b80516001600160a01b038116811462000180575f80fd5b919050565b5f805f6060848603121562000198575f80fd5b620001a38462000169565b9250620001b36020850162000169565b9150620001c36040850162000169565b90509250925092565b60805160a05160c0516115be6200020c5f395f818161034d0152610a7f01525f8181610233015261042701525f81816102bc01526108e401526115be5ff3fe608060405234801561000f575f80fd5b50600436106101a5575f3560e01c8063ae453cd5116100e8578063d99bc80e11610093578063e3176bd51161006e578063e3176bd5146103c2578063f2fde38b146103cb578063f7ca0c51146103de578063fd0ad31e146103fd575f80fd5b8063d99bc80e14610382578063da35a26f14610395578063e172d3a1146103a8575f80fd5b8063bdc6f0a0116100c3578063bdc6f0a014610335578063c276067714610348578063d5ad4a971461036f575f80fd5b8063ae453cd5146102fa578063b59b1a781461030d578063bb7862ca14610315575f80fd5b8063715018a6116101535780638dc73d871161012e5780638dc73d8714610298578063927ede2d146102b75780639b159782146102de578063a85006ca146102f1575f80fd5b8063715018a6146102265780638770d7071461022e5780638da5cb5b1461027a575f80fd5b80635ad9945a116101835780635ad9945a146101f75780635e45da231461020a5780635f9cd92e14610213575f80fd5b806329aa604b146101a95780633c7f5283146101cf5780633e4cbbe6146101e4575b5f80fd5b6101bc6101b7366004611229565b610405565b6040519081526020015b60405180910390f35b6101e26101dd366004611240565b610424565b005b6101bc6101f2366004611283565b610595565b6101bc6102053660046112f0565b610649565b6101bc60685481565b6101e261022136600461136c565b610839565b6101e26108ce565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c6565b60335473ffffffffffffffffffffffffffffffffffffffff16610255565b6101bc6102a6366004611229565b606c6020525f908152604090205481565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b6101e26102ec366004611385565b6108e1565b6101bc60675481565b6101bc610308366004611229565b6109c3565b6101bc610a39565b606b546102559073ffffffffffffffffffffffffffffffffffffffff1681565b6101e26103433660046113db565b610a7c565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b6101e261037d366004611229565b610bad565b6101e2610390366004611229565b610bf3565b6101e26103a336600461144e565b610c39565b6101bc6103b6366004611478565b60100261520801919050565b6101bc60655481565b6101e26103d936600461136c565b610df2565b6101bc6103ec366004611229565b5f908152606c602052604090205490565b6066546101bc565b60668181548110610414575f80fd5b5f91825260209091200154905081565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146104ae5760405162461bcd60e51b815260206004820152601b60248201527f4f6e6c792063616c6c61626c652062792074686520726f6c6c7570000000000060448201526064015b60405180910390fd5b6101008111156105005760405162461bcd60e51b815260206004820152601560248201527f706f7020746f6f206d616e79206d65737361676573000000000000000000000060448201526064016104a5565b81606754146105515760405162461bcd60e51b815260206004820152601460248201527f737461727420696e646578206d69736d6174636800000000000000000000000060448201526064016104a5565b80820160675560408051838152602081018390527f3d48b97f20730c965868963266b0d25d8abe3f06babb60fc3b2b80c9e8907f2691015b60405180910390a15050565b606b546040517fefc7840100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301525f92169063efc7840190602401602060405180830381865afa158015610603573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061062791906114b7565b1561063357505f610643565b60655461064090836114dd565b90505b92915050565b5f607e816106f3565b5f8161066057506001919050565b5b81156106765760089190911c90600101610661565b919050565b8060808310600181146106b35761069184610652565b60808101835360018301925084816020036008021b83528083019250506106d4565b84841516600181146106c7578483536106cc565b608083535b506001820191505b509392505050565b806094815360609290921b60018301525060150190565b6005604051018061070660018c8361067b565b90506107146001898361067b565b905061072089826106dc565b905061072e60018b8361067b565b9050600186146001811461079657603887106001811461077b5761075188610652565b8060b701845360018401935088816020036008021b84528084019350508789843791870191610790565b87608001835360018301925087898437918701915b506107a7565b6107a45f89355f1a8461067b565b91505b506107b28c826106dc565b90508181035f8060388310600181146107e5576107ce84610652565b60f78101600882021b8517935060010191506107f0565b8360c0019250600191505b5086816008021b821791506001810190508060080292508451831c8284610100031b17915080850394505080845250508181038220925050508092505050979650505050505050565b610841610e8f565b606b5460405173ffffffffffffffffffffffffffffffffffffffff8084169216907ff91b2a410a89d46f14ee984a57e6d7892c217f116905371180998e20cef237e5905f90a3606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6108d6610e8f565b6108df5f610ef6565b565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff161461098c5760405162461bcd60e51b815260206004820152602b60248201527f4f6e6c792063616c6c61626c6520627920746865204c3143726f7373446f6d6160448201527f696e4d657373656e67657200000000000000000000000000000000000000000060648201526084016104a5565b610997838383610f6c565b33731111000000000000000000000000000000001111016109bc81865f878787611068565b5050505050565b6066545f908210610a165760405162461bcd60e51b815260206004820152601a60248201527f6d65737361676520696e646578206f7574206f662072616e676500000000000060448201526064016104a5565b60668281548110610a2957610a29611519565b905f5260205f2001549050919050565b6066546067545f91118015610a5d57506067545f908152606c602052604090205415155b15610a7757506067545f908152606c602052604090205490565b504290565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610b275760405162461bcd60e51b815260206004820152602660248201527f4f6e6c792063616c6c61626c652062792074686520456e666f7263656454784760448201527f617465776179000000000000000000000000000000000000000000000000000060648201526084016104a5565b73ffffffffffffffffffffffffffffffffffffffff86163b15610b8c5760405162461bcd60e51b815260206004820152600860248201527f6f6e6c7920454f4100000000000000000000000000000000000000000000000060448201526064016104a5565b610b97838383610f6c565b610ba5868686868686611068565b505050505050565b610bb5610e8f565b606880549082905560408051828152602081018490527fa030881e03ff723954dd0d35500564afab9603555d09d4456a32436f2b2373c59101610589565b610bfb610e8f565b606580549082905560408051828152602081018490527fc5271ba80b67178cc31f04a3755325121400925878dc608432b6fcaead3663299101610589565b5f54610100900460ff1615808015610c5757505f54600160ff909116105b80610c705750303b158015610c7057505f5460ff166001145b610ce25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104a5565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610d3e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610d46611125565b6068839055606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790558015610ded575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610dfa610e8f565b73ffffffffffffffffffffffffffffffffffffffff8116610e835760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104a5565b610e8c81610ef6565b50565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108df5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104a5565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b606854831115610fe45760405162461bcd60e51b815260206004820152602560248201527f476173206c696d6974206d757374206e6f7420657863656564206d617847617360448201527f4c696d697400000000000000000000000000000000000000000000000000000060648201526084016104a5565b6010810261520801808410156110625760405162461bcd60e51b815260206004820152603360248201527f496e73756666696369656e7420676173206c696d69742c206d7573742062652060448201527f61626f766520696e7472696e736963206761730000000000000000000000000060648201526084016104a5565b50505050565b6066545f61107b8883888a898989610649565b60668054600181019091557f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e94354018190555f838152606c6020526040908190204290555190915073ffffffffffffffffffffffffffffffffffffffff80891691908a16907f69cfcb8e6d4192b8aba9902243912587f37e550d75c1fa801491fce26717f37e90611113908a9087908b908b908b90611546565b60405180910390a35050505050505050565b5f54610100900460ff166111a15760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016104a5565b6108df5f54610100900460ff166112205760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016104a5565b6108df33610ef6565b5f60208284031215611239575f80fd5b5035919050565b5f8060408385031215611251575f80fd5b50508035926020909101359150565b803573ffffffffffffffffffffffffffffffffffffffff81168114610676575f80fd5b5f8060408385031215611294575f80fd5b61129d83611260565b946020939093013593505050565b5f8083601f8401126112bb575f80fd5b50813567ffffffffffffffff8111156112d2575f80fd5b6020830191508360208285010111156112e9575f80fd5b9250929050565b5f805f805f805f60c0888a031215611306575f80fd5b61130f88611260565b9650602088013595506040880135945061132b60608901611260565b93506080880135925060a088013567ffffffffffffffff81111561134d575f80fd5b6113598a828b016112ab565b989b979a50959850939692959293505050565b5f6020828403121561137c575f80fd5b61064082611260565b5f805f8060608587031215611398575f80fd5b6113a185611260565b935060208501359250604085013567ffffffffffffffff8111156113c3575f80fd5b6113cf878288016112ab565b95989497509550505050565b5f805f805f8060a087890312156113f0575f80fd5b6113f987611260565b955061140760208801611260565b94506040870135935060608701359250608087013567ffffffffffffffff811115611430575f80fd5b61143c89828a016112ab565b979a9699509497509295939492505050565b5f806040838503121561145f575f80fd5b8235915061146f60208401611260565b90509250929050565b5f8060208385031215611489575f80fd5b823567ffffffffffffffff81111561149f575f80fd5b6114ab858286016112ab565b90969095509350505050565b5f602082840312156114c7575f80fd5b815180151581146114d6575f80fd5b9392505050565b8082028115828204841417610643577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b85815267ffffffffffffffff8516602082015283604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010194935050505056fea164736f6c6343000818000a", } // L1MessageQueueWithGasPriceOracleABI is the input ABI used to generate the binding from. @@ -419,6 +419,68 @@ func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleCallerS return _L1MessageQueueWithGasPriceOracle.Contract.GetCrossDomainMessage(&_L1MessageQueueWithGasPriceOracle.CallOpts, _queueIndex) } +// GetFirstUnfinalizedMessageEnqueueTime is a free data retrieval call binding the contract method 0xb59b1a78. +// +// Solidity: function getFirstUnfinalizedMessageEnqueueTime() view returns(uint256 timestamp) +func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleCaller) GetFirstUnfinalizedMessageEnqueueTime(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _L1MessageQueueWithGasPriceOracle.contract.Call(opts, &out, "getFirstUnfinalizedMessageEnqueueTime") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetFirstUnfinalizedMessageEnqueueTime is a free data retrieval call binding the contract method 0xb59b1a78. +// +// Solidity: function getFirstUnfinalizedMessageEnqueueTime() view returns(uint256 timestamp) +func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleSession) GetFirstUnfinalizedMessageEnqueueTime() (*big.Int, error) { + return _L1MessageQueueWithGasPriceOracle.Contract.GetFirstUnfinalizedMessageEnqueueTime(&_L1MessageQueueWithGasPriceOracle.CallOpts) +} + +// GetFirstUnfinalizedMessageEnqueueTime is a free data retrieval call binding the contract method 0xb59b1a78. +// +// Solidity: function getFirstUnfinalizedMessageEnqueueTime() view returns(uint256 timestamp) +func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleCallerSession) GetFirstUnfinalizedMessageEnqueueTime() (*big.Int, error) { + return _L1MessageQueueWithGasPriceOracle.Contract.GetFirstUnfinalizedMessageEnqueueTime(&_L1MessageQueueWithGasPriceOracle.CallOpts) +} + +// GetMessageEnqueueTimestamp is a free data retrieval call binding the contract method 0xf7ca0c51. +// +// Solidity: function getMessageEnqueueTimestamp(uint256 index) view returns(uint256 timestamp) +func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleCaller) GetMessageEnqueueTimestamp(opts *bind.CallOpts, index *big.Int) (*big.Int, error) { + var out []interface{} + err := _L1MessageQueueWithGasPriceOracle.contract.Call(opts, &out, "getMessageEnqueueTimestamp", index) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetMessageEnqueueTimestamp is a free data retrieval call binding the contract method 0xf7ca0c51. +// +// Solidity: function getMessageEnqueueTimestamp(uint256 index) view returns(uint256 timestamp) +func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleSession) GetMessageEnqueueTimestamp(index *big.Int) (*big.Int, error) { + return _L1MessageQueueWithGasPriceOracle.Contract.GetMessageEnqueueTimestamp(&_L1MessageQueueWithGasPriceOracle.CallOpts, index) +} + +// GetMessageEnqueueTimestamp is a free data retrieval call binding the contract method 0xf7ca0c51. +// +// Solidity: function getMessageEnqueueTimestamp(uint256 index) view returns(uint256 timestamp) +func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleCallerSession) GetMessageEnqueueTimestamp(index *big.Int) (*big.Int, error) { + return _L1MessageQueueWithGasPriceOracle.Contract.GetMessageEnqueueTimestamp(&_L1MessageQueueWithGasPriceOracle.CallOpts, index) +} + // L2BaseFee is a free data retrieval call binding the contract method 0xe3176bd5. // // Solidity: function l2BaseFee() view returns(uint256) @@ -481,6 +543,37 @@ func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleCallerS return _L1MessageQueueWithGasPriceOracle.Contract.MaxGasLimit(&_L1MessageQueueWithGasPriceOracle.CallOpts) } +// MessageEnqueueTime is a free data retrieval call binding the contract method 0x8dc73d87. +// +// Solidity: function messageEnqueueTime(uint256 ) view returns(uint256) +func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleCaller) MessageEnqueueTime(opts *bind.CallOpts, arg0 *big.Int) (*big.Int, error) { + var out []interface{} + err := _L1MessageQueueWithGasPriceOracle.contract.Call(opts, &out, "messageEnqueueTime", arg0) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// MessageEnqueueTime is a free data retrieval call binding the contract method 0x8dc73d87. +// +// Solidity: function messageEnqueueTime(uint256 ) view returns(uint256) +func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleSession) MessageEnqueueTime(arg0 *big.Int) (*big.Int, error) { + return _L1MessageQueueWithGasPriceOracle.Contract.MessageEnqueueTime(&_L1MessageQueueWithGasPriceOracle.CallOpts, arg0) +} + +// MessageEnqueueTime is a free data retrieval call binding the contract method 0x8dc73d87. +// +// Solidity: function messageEnqueueTime(uint256 ) view returns(uint256) +func (_L1MessageQueueWithGasPriceOracle *L1MessageQueueWithGasPriceOracleCallerSession) MessageEnqueueTime(arg0 *big.Int) (*big.Int, error) { + return _L1MessageQueueWithGasPriceOracle.Contract.MessageEnqueueTime(&_L1MessageQueueWithGasPriceOracle.CallOpts, arg0) +} + // MessageQueue is a free data retrieval call binding the contract method 0x29aa604b. // // Solidity: function messageQueue(uint256 ) view returns(bytes32) diff --git a/bindings/bindings/l1messagequeuewithgaspriceoracle_more.go b/bindings/bindings/l1messagequeuewithgaspriceoracle_more.go index 95974e781..beaba5dd0 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)1014_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)1013_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)1015_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\"},{\"astId\":1012,\"contract\":\"contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol:L1MessageQueueWithGasPriceOracle\",\"label\":\"messageEnqueueTime\",\"offset\":0,\"slot\":\"108\",\"type\":\"t_mapping(t_uint256,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)1013_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\"},\"t_array(t_uint256)1014_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)1015_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 = "0x608060405234801561000f575f80fd5b5060043610610184575f3560e01c8063a85006ca116100dd578063d99bc80e11610088578063e3176bd511610063578063e3176bd51461037a578063f2fde38b14610383578063fd0ad31e14610396575f80fd5b8063d99bc80e1461033a578063da35a26f1461034d578063e172d3a114610360575f80fd5b8063bdc6f0a0116100b8578063bdc6f0a0146102ed578063c276067714610300578063d5ad4a9714610327575f80fd5b8063a85006ca146102b1578063ae453cd5146102ba578063bb7862ca146102cd575f80fd5b80635f9cd92e1161013d5780638da5cb5b116101185780638da5cb5b14610259578063927ede2d146102775780639b1597821461029e575f80fd5b80635f9cd92e146101f2578063715018a6146102055780638770d7071461020d575f80fd5b80633e4cbbe61161016d5780633e4cbbe6146101c35780635ad9945a146101d65780635e45da23146101e9575f80fd5b806329aa604b146101885780633c7f5283146101ae575b5f80fd5b61019b6101963660046112df565b61039e565b6040519081526020015b60405180910390f35b6101c16101bc3660046112f6565b6103bd565b005b61019b6101d1366004611339565b61057c565b61019b6101e43660046113a6565b610630565b61019b60685481565b6101c1610200366004611422565b610820565b6101c16108b5565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101a5565b60335473ffffffffffffffffffffffffffffffffffffffff16610234565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b6101c16102ac36600461143b565b6108c8565b61019b60675481565b61019b6102c83660046112df565b6109c4565b606b546102349073ffffffffffffffffffffffffffffffffffffffff1681565b6101c16102fb366004611491565b610a54565b6102347f000000000000000000000000000000000000000000000000000000000000000081565b6101c16103353660046112df565b610bb9565b6101c16103483660046112df565b610bff565b6101c161035b366004611504565b610c45565b61019b61036e36600461152e565b60100261520801919050565b61019b60655481565b6101c1610391366004611422565b610e18565b60665461019b565b606681815481106103ad575f80fd5b5f91825260209091200154905081565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610461576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4f6e6c792063616c6c61626c652062792074686520726f6c6c7570000000000060448201526064015b60405180910390fd5b6101008111156104cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f706f7020746f6f206d616e79206d6573736167657300000000000000000000006044820152606401610458565b8160675414610538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f737461727420696e646578206d69736d617463680000000000000000000000006044820152606401610458565b80820160675560408051838152602081018390527f3d48b97f20730c965868963266b0d25d8abe3f06babb60fc3b2b80c9e8907f2691015b60405180910390a15050565b606b546040517fefc7840100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301525f92169063efc7840190602401602060405180830381865afa1580156105ea573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061060e919061156d565b1561061a57505f61062a565b6065546106279083611593565b90505b92915050565b5f607e816106da565b5f8161064757506001919050565b5b811561065d5760089190911c90600101610648565b919050565b80608083106001811461069a5761067884610639565b60808101835360018301925084816020036008021b83528083019250506106bb565b84841516600181146106ae578483536106b3565b608083535b506001820191505b509392505050565b806094815360609290921b60018301525060150190565b600560405101806106ed60018c83610662565b90506106fb60018983610662565b905061070789826106c3565b905061071560018b83610662565b9050600186146001811461077d5760388710600181146107625761073888610639565b8060b701845360018401935088816020036008021b84528084019350508789843791870191610777565b87608001835360018301925087898437918701915b5061078e565b61078b5f89355f1a84610662565b91505b506107998c826106c3565b90508181035f8060388310600181146107cc576107b584610639565b60f78101600882021b8517935060010191506107d7565b8360c0019250600191505b5086816008021b821791506001810190508060080292508451831c8284610100031b17915080850394505080845250508181038220925050508092505050979650505050505050565b610828610ecf565b606b5460405173ffffffffffffffffffffffffffffffffffffffff8084169216907ff91b2a410a89d46f14ee984a57e6d7892c217f116905371180998e20cef237e5905f90a3606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b6108bd610ecf565b6108c65f610f50565b565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff161461098d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4f6e6c792063616c6c61626c6520627920746865204c3143726f7373446f6d6160448201527f696e4d657373656e6765720000000000000000000000000000000000000000006064820152608401610458565b610998838383610fc6565b33731111000000000000000000000000000000001111016109bd81865f8787876110f6565b5050505050565b6066545f908210610a31576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d65737361676520696e646578206f7574206f662072616e67650000000000006044820152606401610458565b60668281548110610a4457610a446115cf565b905f5260205f2001549050919050565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610b19576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f6e6c792063616c6c61626c652062792074686520456e666f7263656454784760448201527f61746577617900000000000000000000000000000000000000000000000000006064820152608401610458565b73ffffffffffffffffffffffffffffffffffffffff86163b15610b98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f6f6e6c7920454f410000000000000000000000000000000000000000000000006044820152606401610458565b610ba3838383610fc6565b610bb18686868686866110f6565b505050505050565b610bc1610ecf565b606880549082905560408051828152602081018490527fa030881e03ff723954dd0d35500564afab9603555d09d4456a32436f2b2373c59101610570565b610c07610ecf565b606580549082905560408051828152602081018490527fc5271ba80b67178cc31f04a3755325121400925878dc608432b6fcaead3663299101610570565b5f54610100900460ff1615808015610c6357505f54600160ff909116105b80610c7c5750303b158015610c7c57505f5460ff166001145b610d08576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610458565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610d64575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610d6c6111a7565b6068839055606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790558015610e13575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610e20610ecf565b73ffffffffffffffffffffffffffffffffffffffff8116610ec3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610458565b610ecc81610f50565b50565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610458565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b606854831115611058576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f476173206c696d6974206d757374206e6f7420657863656564206d617847617360448201527f4c696d69740000000000000000000000000000000000000000000000000000006064820152608401610458565b6010810261520801808410156110f0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f496e73756666696369656e7420676173206c696d69742c206d7573742062652060448201527f61626f766520696e7472696e73696320676173000000000000000000000000006064820152608401610458565b50505050565b6066545f6111098883888a898989610630565b606680546001810182555f919091527f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e943540181905560405190915073ffffffffffffffffffffffffffffffffffffffff80891691908a16907f69cfcb8e6d4192b8aba9902243912587f37e550d75c1fa801491fce26717f37e90611195908a9087908b908b908b906115fc565b60405180910390a35050505050505050565b5f54610100900460ff1661123d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610458565b6108c65f54610100900460ff166112d6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610458565b6108c633610f50565b5f602082840312156112ef575f80fd5b5035919050565b5f8060408385031215611307575f80fd5b50508035926020909101359150565b803573ffffffffffffffffffffffffffffffffffffffff8116811461065d575f80fd5b5f806040838503121561134a575f80fd5b61135383611316565b946020939093013593505050565b5f8083601f840112611371575f80fd5b50813567ffffffffffffffff811115611388575f80fd5b60208301915083602082850101111561139f575f80fd5b9250929050565b5f805f805f805f60c0888a0312156113bc575f80fd5b6113c588611316565b965060208801359550604088013594506113e160608901611316565b93506080880135925060a088013567ffffffffffffffff811115611403575f80fd5b61140f8a828b01611361565b989b979a50959850939692959293505050565b5f60208284031215611432575f80fd5b61062782611316565b5f805f806060858703121561144e575f80fd5b61145785611316565b935060208501359250604085013567ffffffffffffffff811115611479575f80fd5b61148587828801611361565b95989497509550505050565b5f805f805f8060a087890312156114a6575f80fd5b6114af87611316565b95506114bd60208801611316565b94506040870135935060608701359250608087013567ffffffffffffffff8111156114e6575f80fd5b6114f289828a01611361565b979a9699509497509295939492505050565b5f8060408385031215611515575f80fd5b8235915061152560208401611316565b90509250929050565b5f806020838503121561153f575f80fd5b823567ffffffffffffffff811115611555575f80fd5b61156185828601611361565b90969095509350505050565b5f6020828403121561157d575f80fd5b8151801515811461158c575f80fd5b9392505050565b808202811582820484141761062a577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b85815267ffffffffffffffff8516602082015283604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010194935050505056fea164736f6c6343000818000a" +var L1MessageQueueWithGasPriceOracleDeployedBin = "0x608060405234801561000f575f80fd5b50600436106101a5575f3560e01c8063ae453cd5116100e8578063d99bc80e11610093578063e3176bd51161006e578063e3176bd5146103c2578063f2fde38b146103cb578063f7ca0c51146103de578063fd0ad31e146103fd575f80fd5b8063d99bc80e14610382578063da35a26f14610395578063e172d3a1146103a8575f80fd5b8063bdc6f0a0116100c3578063bdc6f0a014610335578063c276067714610348578063d5ad4a971461036f575f80fd5b8063ae453cd5146102fa578063b59b1a781461030d578063bb7862ca14610315575f80fd5b8063715018a6116101535780638dc73d871161012e5780638dc73d8714610298578063927ede2d146102b75780639b159782146102de578063a85006ca146102f1575f80fd5b8063715018a6146102265780638770d7071461022e5780638da5cb5b1461027a575f80fd5b80635ad9945a116101835780635ad9945a146101f75780635e45da231461020a5780635f9cd92e14610213575f80fd5b806329aa604b146101a95780633c7f5283146101cf5780633e4cbbe6146101e4575b5f80fd5b6101bc6101b7366004611395565b610405565b6040519081526020015b60405180910390f35b6101e26101dd3660046113ac565b610424565b005b6101bc6101f23660046113ef565b6105e3565b6101bc61020536600461145c565b610697565b6101bc60685481565b6101e26102213660046114d8565b610887565b6101e261091c565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101c6565b60335473ffffffffffffffffffffffffffffffffffffffff16610255565b6101bc6102a6366004611395565b606c6020525f908152604090205481565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b6101e26102ec3660046114f1565b61092f565b6101bc60675481565b6101bc610308366004611395565b610a2b565b6101bc610abb565b606b546102559073ffffffffffffffffffffffffffffffffffffffff1681565b6101e2610343366004611547565b610afe565b6102557f000000000000000000000000000000000000000000000000000000000000000081565b6101e261037d366004611395565b610c63565b6101e2610390366004611395565b610ca9565b6101e26103a33660046115ba565b610cef565b6101bc6103b63660046115e4565b60100261520801919050565b6101bc60655481565b6101e26103d93660046114d8565b610ec2565b6101bc6103ec366004611395565b5f908152606c602052604090205490565b6066546101bc565b60668181548110610414575f80fd5b5f91825260209091200154905081565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146104c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f4f6e6c792063616c6c61626c652062792074686520726f6c6c7570000000000060448201526064015b60405180910390fd5b610100811115610534576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f706f7020746f6f206d616e79206d65737361676573000000000000000000000060448201526064016104bf565b816067541461059f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f737461727420696e646578206d69736d6174636800000000000000000000000060448201526064016104bf565b80820160675560408051838152602081018390527f3d48b97f20730c965868963266b0d25d8abe3f06babb60fc3b2b80c9e8907f2691015b60405180910390a15050565b606b546040517fefc7840100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301525f92169063efc7840190602401602060405180830381865afa158015610651573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906106759190611623565b1561068157505f610691565b60655461068e9083611649565b90505b92915050565b5f607e81610741565b5f816106ae57506001919050565b5b81156106c45760089190911c906001016106af565b919050565b806080831060018114610701576106df846106a0565b60808101835360018301925084816020036008021b8352808301925050610722565b84841516600181146107155784835361071a565b608083535b506001820191505b509392505050565b806094815360609290921b60018301525060150190565b6005604051018061075460018c836106c9565b9050610762600189836106c9565b905061076e898261072a565b905061077c60018b836106c9565b905060018614600181146107e45760388710600181146107c95761079f886106a0565b8060b701845360018401935088816020036008021b845280840193505087898437918701916107de565b87608001835360018301925087898437918701915b506107f5565b6107f25f89355f1a846106c9565b91505b506108008c8261072a565b90508181035f8060388310600181146108335761081c846106a0565b60f78101600882021b85179350600101915061083e565b8360c0019250600191505b5086816008021b821791506001810190508060080292508451831c8284610100031b17915080850394505080845250508181038220925050508092505050979650505050505050565b61088f610f79565b606b5460405173ffffffffffffffffffffffffffffffffffffffff8084169216907ff91b2a410a89d46f14ee984a57e6d7892c217f116905371180998e20cef237e5905f90a3606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055565b610924610f79565b61092d5f610ffa565b565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16146109f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f4f6e6c792063616c6c61626c6520627920746865204c3143726f7373446f6d6160448201527f696e4d657373656e67657200000000000000000000000000000000000000000060648201526084016104bf565b6109ff838383611070565b3373111100000000000000000000000000000000111101610a2481865f8787876111a0565b5050505050565b6066545f908210610a98576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6d65737361676520696e646578206f7574206f662072616e676500000000000060448201526064016104bf565b60668281548110610aab57610aab611685565b905f5260205f2001549050919050565b6066546067545f91118015610adf57506067545f908152606c602052604090205415155b15610af957506067545f908152606c602052604090205490565b504290565b337f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1614610bc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f6e6c792063616c6c61626c652062792074686520456e666f7263656454784760448201527f617465776179000000000000000000000000000000000000000000000000000060648201526084016104bf565b73ffffffffffffffffffffffffffffffffffffffff86163b15610c42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600860248201527f6f6e6c7920454f4100000000000000000000000000000000000000000000000060448201526064016104bf565b610c4d838383611070565b610c5b8686868686866111a0565b505050505050565b610c6b610f79565b606880549082905560408051828152602081018490527fa030881e03ff723954dd0d35500564afab9603555d09d4456a32436f2b2373c591016105d7565b610cb1610f79565b606580549082905560408051828152602081018490527fc5271ba80b67178cc31f04a3755325121400925878dc608432b6fcaead36632991016105d7565b5f54610100900460ff1615808015610d0d57505f54600160ff909116105b80610d265750303b158015610d2657505f5460ff166001145b610db2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016104bf565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015610e0e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b610e1661125d565b6068839055606b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff84161790558015610ebd575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b505050565b610eca610f79565b73ffffffffffffffffffffffffffffffffffffffff8116610f6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016104bf565b610f7681610ffa565b50565b60335473ffffffffffffffffffffffffffffffffffffffff16331461092d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016104bf565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b606854831115611102576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602560248201527f476173206c696d6974206d757374206e6f7420657863656564206d617847617360448201527f4c696d697400000000000000000000000000000000000000000000000000000060648201526084016104bf565b60108102615208018084101561119a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f496e73756666696369656e7420676173206c696d69742c206d7573742062652060448201527f61626f766520696e7472696e736963206761730000000000000000000000000060648201526084016104bf565b50505050565b6066545f6111b38883888a898989610697565b60668054600181019091557f46501879b8ca8525e8c2fd519e2fbfcfa2ebea26501294aa02cbfcfb12e94354018190555f838152606c6020526040908190204290555190915073ffffffffffffffffffffffffffffffffffffffff80891691908a16907f69cfcb8e6d4192b8aba9902243912587f37e550d75c1fa801491fce26717f37e9061124b908a9087908b908b908b906116b2565b60405180910390a35050505050505050565b5f54610100900460ff166112f3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016104bf565b61092d5f54610100900460ff1661138c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016104bf565b61092d33610ffa565b5f602082840312156113a5575f80fd5b5035919050565b5f80604083850312156113bd575f80fd5b50508035926020909101359150565b803573ffffffffffffffffffffffffffffffffffffffff811681146106c4575f80fd5b5f8060408385031215611400575f80fd5b611409836113cc565b946020939093013593505050565b5f8083601f840112611427575f80fd5b50813567ffffffffffffffff81111561143e575f80fd5b602083019150836020828501011115611455575f80fd5b9250929050565b5f805f805f805f60c0888a031215611472575f80fd5b61147b886113cc565b96506020880135955060408801359450611497606089016113cc565b93506080880135925060a088013567ffffffffffffffff8111156114b9575f80fd5b6114c58a828b01611417565b989b979a50959850939692959293505050565b5f602082840312156114e8575f80fd5b61068e826113cc565b5f805f8060608587031215611504575f80fd5b61150d856113cc565b935060208501359250604085013567ffffffffffffffff81111561152f575f80fd5b61153b87828801611417565b95989497509550505050565b5f805f805f8060a0878903121561155c575f80fd5b611565876113cc565b9550611573602088016113cc565b94506040870135935060608701359250608087013567ffffffffffffffff81111561159c575f80fd5b6115a889828a01611417565b979a9699509497509295939492505050565b5f80604083850312156115cb575f80fd5b823591506115db602084016113cc565b90509250929050565b5f80602083850312156115f5575f80fd5b823567ffffffffffffffff81111561160b575f80fd5b61161785828601611417565b90969095509350505050565b5f60208284031215611633575f80fd5b81518015158114611642575f80fd5b9392505050565b8082028115828204841417610691577f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b85815267ffffffffffffffff8516602082015283604082015260806060820152816080820152818360a08301375f81830160a090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010194935050505056fea164736f6c6343000818000a" func init() { if err := json.Unmarshal([]byte(L1MessageQueueWithGasPriceOracleStorageLayoutJSON), L1MessageQueueWithGasPriceOracleStorageLayout); err != nil { diff --git a/bindings/bindings/l1staking.go b/bindings/bindings/l1staking.go index f22c3b2dd..6ef653abe 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\":\"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", + 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", } // L1StakingABI is the input ABI used to generate the binding from. @@ -729,37 +729,6 @@ 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 a72d81cd0..c3a973380 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)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\"}}}" +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\"}}}" var L1StakingStorageLayout = new(solc.StorageLayout) -var L1StakingDeployedBin = "0x608060405260043610610303575f3560e01c80638142951a11610191578063ae81de53116100dc578063d51c90a911610087578063e2a6ad5f11610062578063e2a6ad5f14610961578063f2fde38b14610980578063f4fe7fef1461099f575f80fd5b8063d51c90a9146108c7578063dd4785f5146108dc578063df1550331461091d575f80fd5b8063c7cd469a116100b7578063c7cd469a1461086a578063cde4cd1114610889578063d096c3c6146108a8575f80fd5b8063ae81de5314610809578063affed0e014610828578063bfa02ba91461083e575f80fd5b80639b19251a1161013c578063a3066aab11610117578063a3066aab146107b6578063a4f209b0146107d5578063ab8c53dc146107f4575f80fd5b80639b19251a146107485780639d48f417146107765780639fb82db9146107a2575f80fd5b80638da5cb5b1161016c5780638da5cb5b146106bd5780639168ae72146106e7578063927ede2d14610715575f80fd5b80638142951a1461064c578063831cfb581461066b5780638a565ac31461069e575f80fd5b806343352d61116102515780636f1e8533116101fc578063797adbde116101d7578063797adbde146105c65780637a4e87c3146105e55780637a9262a214610620575f80fd5b80636f1e85331461056d578063715018a61461058c57806374fe27b7146105a0575f80fd5b806352d472eb1161022c57806352d472eb1461050a578063680157911461051f578063692c565b1461053e575f80fd5b806343352d61146104b557806345bc4d10146104d65780634d64903a146104f5575f80fd5b806335928991116102b15780633ccfd60b1161028c5780633ccfd60b146104785780633ee2a1f91461048c57806341de239b146104a0575f80fd5b806335928991146103e95780633a9bbede146104085780633cb747bf14610446575f80fd5b80632e407a6f116102e15780632e407a6f1461035a578063303afb9e14610386578063320ff860146103ca575f80fd5b80630d13fd7b146103075780632108db35146103305780632a28e5a314610345575b5f80fd5b348015610312575f80fd5b5061031d6101a65481565b6040519081526020015b60405180910390f35b34801561033b575f80fd5b5061031d609c5481565b610358610353366004613e43565b6109be565b005b348015610365575f80fd5b5061031d610374366004613eaa565b6101a16020525f908152604090205481565b348015610391575f80fd5b506103a56103a0366004613eca565b610e80565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610327565b3480156103d5575f80fd5b506103586103e4366004613ee1565b610eac565b3480156103f4575f80fd5b50610358610403366004613eca565b61129b565b348015610413575f80fd5b50610436610422366004613eaa565b609f6020525f908152604090205460ff1681565b6040519015158152602001610327565b348015610451575f80fd5b507f00000000000000000000000000000000000000000000000000000000000000006103a5565b348015610483575f80fd5b50610358611362565b348015610497575f80fd5b5061035861159a565b3480156104ab575f80fd5b5061031d60995481565b3480156104c0575f80fd5b506104c96115ac565b6040516103279190613f89565b3480156104e1575f80fd5b5061031d6104f0366004613eca565b6115ff565b348015610500575f80fd5b5061031d60985481565b348015610515575f80fd5b5061031d609a5481565b34801561052a575f80fd5b50610436610539366004613eaa565b611a08565b348015610549575f80fd5b50610436610558366004613eca565b6101a46020525f908152604090205460ff1681565b348015610578575f80fd5b50610436610587366004613eaa565b611ad7565b348015610597575f80fd5b50610358611b77565b3480156105ab575f80fd5b506104366105ba366004614018565b60019695505050505050565b3480156105d1575f80fd5b506103a56105e0366004613eca565b611b88565b3480156105f0575f80fd5b506104366105ff3660046140be565b80516020818301810180516101a38252928201919093012091525460ff1681565b34801561062b575f80fd5b5061031d61063a366004613eaa565b6101a56020525f908152604090205481565b348015610657575f80fd5b506103586106663660046140f8565b611bbe565b348015610676575f80fd5b506103a57f000000000000000000000000000000000000000000000000000000000000000081565b3480156106a9575f80fd5b506103586106b8366004613eca565b612188565b3480156106c8575f80fd5b5060335473ffffffffffffffffffffffffffffffffffffffff166103a5565b3480156106f2575f80fd5b50610706610701366004613eaa565b612245565b604051610327939291906141b1565b348015610720575f80fd5b506103a57f000000000000000000000000000000000000000000000000000000000000000081565b348015610753575f80fd5b50610436610762366004613eaa565b609e6020525f908152604090205460ff1681565b348015610781575f80fd5b50610795610790366004613eca565b612305565b604051610327919061423e565b3480156107ad575f80fd5b5061079561243c565b3480156107c1575f80fd5b506103586107d0366004613eaa565b61261e565b3480156107e0575f80fd5b506103586107ef366004613eca565b61278f565b3480156107ff575f80fd5b5061031d609d5481565b348015610814575f80fd5b50610358610823366004613eca565b612859565b348015610833575f80fd5b5061031d6101a75481565b348015610849575f80fd5b506097546103a59073ffffffffffffffffffffffffffffffffffffffff1681565b348015610875575f80fd5b50610358610884366004614250565b612916565b348015610894575f80fd5b506103586108a3366004613eaa565b612b34565b3480156108b3575f80fd5b5061031d6108c2366004613eaa565b612baf565b3480156108d2575f80fd5b5061031d609b5481565b3480156108e7575f80fd5b5061090b6108f6366004613eaa565b61019f6020525f908152604090205460ff1681565b60405160ff9091168152602001610327565b348015610928575f80fd5b50610436610937366004613eaa565b73ffffffffffffffffffffffffffffffffffffffff165f9081526101a16020526040902054151590565b34801561096c575f80fd5b5061031d61097b3660046142b7565b612c50565b34801561098b575f80fd5b5061035861099a366004613eaa565b612dc3565b3480156109aa575f80fd5b506103586109b9366004613eca565b612e77565b335f818152609e602052604090205460ff16610a3b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6e6f7420696e2077686974656c6973740000000000000000000000000000000060448201526064015b60405180910390fd5b335f9081526101a2602052604090205473ffffffffffffffffffffffffffffffffffffffff1615610ac8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f616c7265616479207265676973746572656400000000000000000000000000006044820152606401610a32565b8215801590610ae657505f8381526101a4602052604090205460ff16155b610b4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f696e76616c69642074656e6465726d696e74207075626b6579000000000000006044820152606401610a32565b8151610100148015610b7f57506101a382604051610b6a91906142f6565b9081526040519081900360200190205460ff16155b610be5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e76616c696420626c73207075626b657900000000000000000000000000006044820152606401610a32565b6098543414610c50576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c6964207374616b696e672076616c756500000000000000000000006044820152606401610a32565b6040518060600160405280610c623390565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083018790526040928301869052335f9081526101a28252839020845181547fffffffffffffffffffffffff00000000000000000000000000000000000000001693169290921782558301516001820155908201516002820190610ce290826143ad565b50905050610cf5610cf03390565b612f34565b60016101a383604051610d0891906142f6565b9081526040805191829003602090810190922080549315157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009485161790555f8681526101a49092529020805490911660011790557fb9c7babb56df9f2da4a30811a6c778e4e68af88b72712d56cf62c5516e20e199610d853390565b8484604051610d96939291906141b1565b60405180910390a1335f9081526101a260209081526040918290208251606081018452815473ffffffffffffffffffffffffffffffffffffffff168152600182015492810192909252600281018054610e7b9484019190610df690614311565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2290614311565b8015610e6d5780601f10610e4457610100808354040283529160200191610e6d565b820191905f5260205f20905b815481529060010190602001808311610e5057829003601f168201915b5050505050815250506130a1565b505050565b60a08160ff8110610e8f575f80fd5b015473ffffffffffffffffffffffffffffffffffffffff16905081565b610eb461320d565b5f5b815181101561125757610ee1828281518110610ed457610ed46144c9565b6020026020010151611a08565b610f6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f6f6e6c7920616374697665207374616b65722063616e2062652072656d6f766560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610a32565b6101a55f838381518110610f8357610f836144c9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20545f1461102d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f7769746864726177696e670000000000000000000000000000000000000000006044820152606401610a32565b60995461103a9043614523565b6101a55f848481518110611050576110506144c9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20819055506110b78282815181106110aa576110aa6144c9565b602002602001015161328e565b8181815181106110c9576110c96144c9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d56101a55f85858151811061111e5761111e6144c9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460405161116f91815260200190565b60405180910390a2609e5f83838151811061118c5761118c6144c9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81549060ff02191690556001609f5f8484815181106111f3576111f36144c9565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff1682528101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055600101610eb6565b507f3f446646c03e618be8238a586960d6d625f35c653cdca1ef59609993e8ed2c8481604051611287919061423e565b60405180910390a1611298816133c1565b50565b6112a361320d565b5f811180156112b557506101a6548114155b61131b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f696e76616c6964206368616c6c656e6765206465706f7369742076616c7565006044820152606401610a32565b6101a680549082905560408051828152602081018490527f36f971a40478225aeb80cfbf5e80306e8cb76d3bf7d56fdc5e490945cddb7d5591015b60405180910390a15050565b61136b33611a08565b6113d1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6f6e6c7920616374697665207374616b657200000000000000000000000000006044820152606401610a32565b335f9081526101a5602052604090205415611448576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f7769746864726177696e670000000000000000000000000000000000000000006044820152606401610a32565b6099546114559043614523565b335f8181526101a560205260409020919091556114719061328e565b335f8181526101a560209081526040918290205491519182527f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5910160405180910390a2335f908152609e6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00908116909155609f83528184208054909116600190811790915581518181528083019092529091828101908036833701905050905033815f81518110611531576115316144c9565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f3f446646c03e618be8238a586960d6d625f35c653cdca1ef59609993e8ed2c8481604051611287919061423e565b6115a261320d565b6115aa6134e9565b565b6115b4613cd4565b60408051611fe08101918290529060a09060ff9082845b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116115cb575050505050905090565b6097545f9073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611698576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6f6e6c7920726f6c6c757020636f6e74726163740000000000000000000000006044820152606401610a32565b6116a06138a3565b5f6116aa83612305565b90505f805b825181101561191e575f73ffffffffffffffffffffffffffffffffffffffff168382815181106116e1576116e16144c9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff160315611916575f6101a55f85848151811061171c5761171c6144c9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205411156117d3576101a55f84838151811061177a5761177a6144c9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f9055609854826117cc9190614523565b9150611916565b61181a8382815181106117e8576117e86144c9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff165f9081526101a16020526040902054151590565b6119165760985461182b9083614523565b91506118428382815181106110aa576110aa6144c9565b609e5f848381518110611857576118576144c9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81549060ff02191690556001609f5f8584815181106118be576118be6144c9565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b6001016116af565b505f6064609a54836119309190614536565b61193a919061454d565b90506119468183614585565b609d5f8282546119569190614523565b909155505060975461197e9073ffffffffffffffffffffffffffffffffffffffff1682613916565b7f654f4a61849f1b3ad10abb283d27f02d5fece7b820acc5a3b874713b58748b5a836040516119ad919061423e565b60405180910390a17f3f446646c03e618be8238a586960d6d625f35c653cdca1ef59609993e8ed2c84836040516119e4919061423e565b60405180910390a16119f5836133c1565b92505050611a036001606555565b919050565b73ffffffffffffffffffffffffffffffffffffffff81165f90815261019f602052604081205460ff168103611a3e57505f919050565b73ffffffffffffffffffffffffffffffffffffffff82165f81815261019f602052604090205460a090611a769060019060ff16614598565b60ff1660ff8110611a8957611a896144c9565b015473ffffffffffffffffffffffffffffffffffffffff16148015611ad1575073ffffffffffffffffffffffffffffffffffffffff82165f9081526101a16020526040902054155b92915050565b73ffffffffffffffffffffffffffffffffffffffff81165f90815261019f602052604081205460ff168103611b0d57505f919050565b73ffffffffffffffffffffffffffffffffffffffff82165f81815261019f602052604090205460a090611b459060019060ff16614598565b60ff1660ff8110611b5857611b586144c9565b015473ffffffffffffffffffffffffffffffffffffffff161492915050565b611b7f61320d565b6115aa5f6139ed565b6101a08181548110611b98575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b5f54610100900460ff1615808015611bdc57505f54600160ff909116105b80611bf55750303b158015611bf557505f5460ff166001145b611c81576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a32565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611cdd575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff8816611d5a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f696e76616c696420726f6c6c757020636f6e74726163740000000000000000006044820152606401610a32565b5f8711611dc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c6964207374616b696e672076616c756500000000000000000000006044820152606401610a32565b5f8611611e2c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f696e76616c6964206368616c6c656e6765206465706f7369742076616c7565006044820152606401610a32565b5f8511611e95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f696e76616c6964207769746864726177616c206c6f636b20626c6f636b7300006044820152606401610a32565b5f8311611efe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f696e76616c696420676173206c696d697420616464207374616b6572000000006044820152606401610a32565b5f8211611f67576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f696e76616c696420676173206c696d69742072656d6f7665207374616b6572736044820152606401610a32565b5f84118015611f77575060648411155b612002576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f696e76616c6964206368616c6c656e676572207265776172642070657263656e60448201527f74616765000000000000000000000000000000000000000000000000000000006064820152608401610a32565b61200a613a63565b612012613b01565b609780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a16179055609a84905560988790556101a68690556099859055609b839055609c829055604080515f8152602081018590527f0ef80fb82bf5439b8591744c0fde771f5d93dce7a7970b1e9b7828cdc3970e9c910160405180910390a1604080515f8152602081018490527fdd4b37d1f14888147fe4be2cfaedcbf148fd07ececc856d0433241b8b6e4a7f7910160405180910390a1604080515f8152602081018690527fa46de936426e045703b2d34a292a19fde92b329018db8e0da750033876b655ba910160405180910390a1801561217e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b61219061320d565b5f811180156121a15750609c548114155b612207576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c6964206e657720676173206c696d697400000000000000000000006044820152606401610a32565b609c80549082905560408051828152602081018490527fdd4b37d1f14888147fe4be2cfaedcbf148fd07ececc856d0433241b8b6e4a7f79101611356565b6101a26020525f908152604090208054600182015460028301805473ffffffffffffffffffffffffffffffffffffffff90931693919261228490614311565b80601f01602080910402602001604051908101604052809291908181526020018280546122b090614311565b80156122fb5780601f106122d2576101008083540402835291602001916122fb565b820191905f5260205f20905b8154815290600101906020018083116122de57829003601f168201915b5050505050905083565b6060600182901c5f5b81156123355761231f816001614523565b905061232c600183614585565b8216915061230e565b8067ffffffffffffffff81111561234e5761234e613d3d565b604051908082528060200260200182016040528015612377578160200160208202803683370190505b5092505f60015b60ff8160ff161161243357600160ff82161b8616156124215760a06123a4600183614598565b60ff1660ff81106123b7576123b76144c9565b0154855173ffffffffffffffffffffffffffffffffffffffff909116908690849081106123e6576123e66144c9565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152612416826001614523565b915082821015612433575b8061242b816145b1565b91505061237e565b50505050919050565b6040805160ff80825261200082019092526060915f91829160208201611fe0803683370190505090505f5b60ff811015612525575f60a08260ff8110612484576124846144c9565b015473ffffffffffffffffffffffffffffffffffffffff16148015906124e657506101a15f60a08360ff81106124bc576124bc6144c9565b015473ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f2054155b1561251d57826124f5816145cf565b935050600182828151811061250c5761250c6144c9565b911515602092830291909101909101525b600101612467565b505f8267ffffffffffffffff81111561254057612540613d3d565b604051908082528060200260200182016040528015612569578160200160208202803683370190505b5090505f805b60ff8110156126145783818151811061258a5761258a6144c9565b60200260200101511561260c5760a08160ff81106125aa576125aa6144c9565b0154835173ffffffffffffffffffffffffffffffffffffffff909116908490849081106125d9576125d96144c9565b73ffffffffffffffffffffffffffffffffffffffff9092166020928302919091019091015281612608816145cf565b9250505b60010161256f565b5090949350505050565b6126266138a3565b335f9081526101a5602052604090205461269c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f7769746864726177616c206e6f742065786973740000000000000000000000006044820152606401610a32565b335f9081526101a56020526040902054431015612715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f7769746864726177616c206c6f636b65640000000000000000000000000000006044820152606401610a32565b335f9081526101a5602052604081205561272d6134e9565b6040805173ffffffffffffffffffffffffffffffffffffffff83168152905133917f89309c9b2aeaffbdce717113df9427298b20448c05919bf889e05f8c3094254b919081900360200190a261278581609854613916565b6112986001606555565b61279761320d565b5f811180156127a7575060648111155b80156127b55750609a548114155b61281b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f696e76616c6964207265776172642070657263656e74616765000000000000006044820152606401610a32565b609a80549082905560408051828152602081018490527fa46de936426e045703b2d34a292a19fde92b329018db8e0da750033876b655ba9101611356565b61286161320d565b5f811180156128725750609b548114155b6128d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c6964206e657720676173206c696d697400000000000000000000006044820152606401610a32565b609b80549082905560408051828152602081018490527f0ef80fb82bf5439b8591744c0fde771f5d93dce7a7970b1e9b7828cdc3970e9c9101611356565b61291e61320d565b5f5b83811015612a6857609f5f86868481811061293d5761293d6144c9565b90506020020160208101906129529190613eaa565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f205460ff16156129e2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e2072656d6f766564206c69737400000000000000000000000000000000006044820152606401610a32565b6001609e5f8787858181106129f9576129f96144c9565b9050602002016020810190612a0e9190613eaa565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055600101612920565b505f5b81811015612af057609e5f848484818110612a8857612a886144c9565b9050602002016020810190612a9d9190613eaa565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055600101612a6b565b507fe375867e538b40218c1b3db2ccceaf875eb073e38b510449e6088c1539ac862284848484604051612b26949392919061464d565b60405180910390a150505050565b612b3c61320d565b612b446138a3565b609d54612b518282613916565b5f609d556040805173ffffffffffffffffffffffffffffffffffffffff84168152602081018390527fa1fefb6c5328a92a416e321ed50997303fe7135fd88c28b0592b21ce42b5cdd9910160405180910390a1506112986001606555565b5f612bb982611ad7565b612c1f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f696e76616c6964207374616b65720000000000000000000000000000000000006044820152606401610a32565b5073ffffffffffffffffffffffffffffffffffffffff165f90815261019f6020526040902054600160ff9091161b90565b5f60ff821115612cbc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f7374616b657273206c656e677468206f7574206f6620626f756e6473000000006044820152606401610a32565b5f5b82811015612dbc57612cf0848483818110612cdb57612cdb6144c9565b90506020020160208101906105879190613eaa565b612d56576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f696e76616c6964207374616b65720000000000000000000000000000000000006044820152606401610a32565b61019f5f858584818110612d6c57612d6c6144c9565b9050602002016020810190612d819190613eaa565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f2054600160ff90911681901b929092179101612cbe565b5092915050565b612dcb61320d565b73ffffffffffffffffffffffffffffffffffffffff8116612e6e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a32565b611298816139ed565b612e7f61320d565b5f81118015612e9057506098548114155b612ef6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c6964207374616b696e672076616c756500000000000000000000006044820152606401610a32565b609880549082905560408051828152602081018490527f91e3ed304d49776a78bbe0df6bf7156f5433763621e5e728a3c2adfe7de743689101611356565b5f5b60ff8160ff16101561303e575f60a060ff808416908110612f5957612f596144c9565b015473ffffffffffffffffffffffffffffffffffffffff1603613036578160a08260ff1660ff8110612f8d57612f8d6144c9565b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055612fdc81600161467e565b73ffffffffffffffffffffffffffffffffffffffff929092165f90815261019f6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff9093169290921790915550565b600101612f36565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f736c6f742066756c6c00000000000000000000000000000000000000000000006044820152606401610a32565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b2267a7b7f00000000000000000000000000000000000000000000000000000000000000005f6101a75485604051602401613115929190614697565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f7046529b00000000000000000000000000000000000000000000000000000000179052609b5490517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b1681526131c994939291906004016146e2565b5f604051808303815f87803b1580156131e0575f80fd5b505af11580156131f2573d5f803e3d5ffd5b505050506101a75460016132069190614523565b6101a75550565b60335473ffffffffffffffffffffffffffffffffffffffff1633146115aa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a32565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526101a160205260409020541561331b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f616c726561647920696e2064656c6574654c69737400000000000000000000006044820152606401610a32565b6101a080546001810182555f919091527f7980fe0f714a613298681d64b7b8ffa7b148338dd52429f307d72798d5c317c40180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff83161790556099546133989043614523565b73ffffffffffffffffffffffffffffffffffffffff9091165f9081526101a16020526040902055565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b2267a7b7f00000000000000000000000000000000000000000000000000000000000000005f6101a75485604051602401613435929190614727565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fcce6cf9f00000000000000000000000000000000000000000000000000000000179052609c5490517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b1681526131c994939291906004016146e2565b5f5b6101a054811015611298575f73ffffffffffffffffffffffffffffffffffffffff166101a08281548110613521576135216144c9565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff160361369d576101a15f6101a0838154811061355f5761355f6144c9565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040018120556101a080546135a190600190614585565b815481106135b1576135b16144c9565b5f918252602090912001546101a0805473ffffffffffffffffffffffffffffffffffffffff90921691839081106135ea576135ea6144c9565b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506101a08054806136415761364161473f565b5f8281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690550190556134eb565b436101a15f6101a084815481106136b6576136b66144c9565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054116138915760a0600161019f5f6101a08581548110613708576137086144c9565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054613746919060ff16614598565b60ff1660ff8110613759576137596144c9565b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556101a0805461019f915f918490811061379b5761379b6144c9565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556101a080546101a29291908490811061380c5761380c6144c9565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001812080547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560018101829055906138776002830182613cf3565b50506101a15f6101a0838154811061355f5761355f6144c9565b8061389b816145cf565b9150506134eb565b60026065540361390f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a32565b6002606555565b80156139e2575f8273ffffffffffffffffffffffffffffffffffffffff16826040515f6040518083038185875af1925050503d805f8114613972576040519150601f19603f3d011682016040523d82523d5f602084013e613977565b606091505b5050905080610e7b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c656400000000006044820152606401610a32565b5050565b6001606555565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff16613af9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a32565b6115aa613b9f565b5f54610100900460ff16613b97576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a32565b6115aa613c3e565b5f54610100900460ff16613c35576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a32565b6115aa336139ed565b5f54610100900460ff166139e6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a32565b60405180611fe0016040528060ff906020820280368337509192915050565b508054613cff90614311565b5f825580601f10613d0e575050565b601f0160209004905f5260205f209081019061129891905b80821115613d39575f8155600101613d26565b5090565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613db157613db1613d3d565b604052919050565b5f82601f830112613dc8575f80fd5b813567ffffffffffffffff811115613de257613de2613d3d565b613e1360207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613d6a565b818152846020838601011115613e27575f80fd5b816020850160208301375f918101602001919091529392505050565b5f8060408385031215613e54575f80fd5b82359150602083013567ffffffffffffffff811115613e71575f80fd5b613e7d85828601613db9565b9150509250929050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611a03575f80fd5b5f60208284031215613eba575f80fd5b613ec382613e87565b9392505050565b5f60208284031215613eda575f80fd5b5035919050565b5f6020808385031215613ef2575f80fd5b823567ffffffffffffffff80821115613f09575f80fd5b818501915085601f830112613f1c575f80fd5b813581811115613f2e57613f2e613d3d565b8060051b9150613f3f848301613d6a565b8181529183018401918481019088841115613f58575f80fd5b938501935b83851015613f7d57613f6e85613e87565b82529385019390850190613f5d565b98975050505050505050565b611fe0810181835f5b60ff811015613fc757815173ffffffffffffffffffffffffffffffffffffffff16835260209283019290910190600101613f92565b50505092915050565b5f8083601f840112613fe0575f80fd5b50813567ffffffffffffffff811115613ff7575f80fd5b6020830191508360208260051b8501011115614011575f80fd5b9250929050565b5f805f805f806080878903121561402d575f80fd5b86359550602087013567ffffffffffffffff8082111561404b575f80fd5b6140578a838b01613fd0565b9097509550604089013594506060890135915080821115614076575f80fd5b818901915089601f830112614089575f80fd5b813581811115614097575f80fd5b8a60208285010111156140a8575f80fd5b6020830194508093505050509295509295509295565b5f602082840312156140ce575f80fd5b813567ffffffffffffffff8111156140e4575f80fd5b6140f084828501613db9565b949350505050565b5f805f805f805f60e0888a03121561410e575f80fd5b61411788613e87565b9960208901359950604089013598606081013598506080810135975060a0810135965060c00135945092505050565b5f5b83811015614160578181015183820152602001614148565b50505f910152565b5f815180845261417f816020860160208601614146565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f6141e56060830184614168565b95945050505050565b5f815180845260208085019450602084015f5b8381101561423357815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101614201565b509495945050505050565b602081525f613ec360208301846141ee565b5f805f8060408587031215614263575f80fd5b843567ffffffffffffffff8082111561427a575f80fd5b61428688838901613fd0565b9096509450602087013591508082111561429e575f80fd5b506142ab87828801613fd0565b95989497509550505050565b5f80602083850312156142c8575f80fd5b823567ffffffffffffffff8111156142de575f80fd5b6142ea85828601613fd0565b90969095509350505050565b5f8251614307818460208701614146565b9190910192915050565b600181811c9082168061432557607f821691505b60208210810361435c577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f821115610e7b57805f5260205f20601f840160051c810160208510156143875750805b601f840160051c820191505b818110156143a6575f8155600101614393565b5050505050565b815167ffffffffffffffff8111156143c7576143c7613d3d565b6143db816143d58454614311565b84614362565b602080601f83116001811461442d575f84156143f75750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556144c1565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b828110156144795788860151825594840194600190910190840161445a565b50858210156144b557878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b505060018460011b0185555b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115611ad157611ad16144f6565b8082028115828204841417611ad157611ad16144f6565b5f82614580577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b81810381811115611ad157611ad16144f6565b60ff8281168282160390811115611ad157611ad16144f6565b5f60ff821660ff81036145c6576145c66144f6565b60010192915050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036145ff576145ff6144f6565b5060010190565b8183525f60208085019450825f5b858110156142335773ffffffffffffffffffffffffffffffffffffffff61463a83613e87565b1687529582019590820190600101614614565b604081525f614660604083018688614606565b8281036020840152614673818587614606565b979650505050505050565b60ff8181168382160190811115611ad157611ad16144f6565b8281526040602082015273ffffffffffffffffffffffffffffffffffffffff8251166040820152602082015160608201525f6040830151606060808401526141e560a0840182614168565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152608060408201525f6147166080830185614168565b905082606083015295945050505050565b828152604060208201525f6140f060408301846141ee565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea164736f6c6343000818000a" +var L1StakingDeployedBin = "0x6080604052600436106102f8575f3560e01c80637a9262a211610191578063ab8c53dc116100dc578063d51c90a911610087578063e2a6ad5f11610062578063e2a6ad5f14610940578063f2fde38b1461095f578063f4fe7fef1461097e575f80fd5b8063d51c90a9146108a6578063dd4785f5146108bb578063df155033146108fc575f80fd5b8063c7cd469a116100b7578063c7cd469a14610849578063cde4cd1114610868578063d096c3c614610887575f80fd5b8063ab8c53dc146107e9578063ae81de53146107fe578063bfa02ba91461081d575f80fd5b8063927ede2d1161013c5780639fb82db9116101175780639fb82db914610797578063a3066aab146107ab578063a4f209b0146107ca575f80fd5b8063927ede2d1461070a5780639b19251a1461073d5780639d48f4171461076b575f80fd5b80638a565ac31161016c5780638a565ac3146106935780638da5cb5b146106b25780639168ae72146106dc575f80fd5b80637a9262a2146106155780638142951a14610641578063831cfb5814610660575f80fd5b806341de239b11610251578063692c565b116101fc57806374fe27b7116101d757806374fe27b714610595578063797adbde146105bb5780637a4e87c3146105da575f80fd5b8063692c565b146105335780636f1e853314610562578063715018a614610581575f80fd5b80634d64903a1161022c5780634d64903a146104ea57806352d472eb146104ff5780636801579114610514575f80fd5b806341de239b1461049557806343352d61146104aa57806345bc4d10146104cb575f80fd5b8063320ff860116102b15780633cb747bf1161028c5780633cb747bf1461043b5780633ccfd60b1461046d5780633ee2a1f914610481575f80fd5b8063320ff860146103bf57806335928991146103de5780633a9bbede146103fd575f80fd5b80632a28e5a3116102e15780632a28e5a31461033a5780632e407a6f1461034f578063303afb9e1461037b575f80fd5b80630d13fd7b146102fc5780632108db3514610325575b5f80fd5b348015610307575f80fd5b506103126101a65481565b6040519081526020015b60405180910390f35b348015610330575f80fd5b50610312609c5481565b61034d610348366004613d4e565b61099d565b005b34801561035a575f80fd5b50610312610369366004613db5565b6101a16020525f908152604090205481565b348015610386575f80fd5b5061039a610395366004613dd5565b610e5f565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161031c565b3480156103ca575f80fd5b5061034d6103d9366004613dec565b610e8b565b3480156103e9575f80fd5b5061034d6103f8366004613dd5565b61127a565b348015610408575f80fd5b5061042b610417366004613db5565b609f6020525f908152604090205460ff1681565b604051901515815260200161031c565b348015610446575f80fd5b507f000000000000000000000000000000000000000000000000000000000000000061039a565b348015610478575f80fd5b5061034d611341565b34801561048c575f80fd5b5061034d611579565b3480156104a0575f80fd5b5061031260995481565b3480156104b5575f80fd5b506104be61158b565b60405161031c9190613e94565b3480156104d6575f80fd5b506103126104e5366004613dd5565b6115de565b3480156104f5575f80fd5b5061031260985481565b34801561050a575f80fd5b50610312609a5481565b34801561051f575f80fd5b5061042b61052e366004613db5565b61199a565b34801561053e575f80fd5b5061042b61054d366004613dd5565b6101a46020525f908152604090205460ff1681565b34801561056d575f80fd5b5061042b61057c366004613db5565b611a69565b34801561058c575f80fd5b5061034d611b09565b3480156105a0575f80fd5b5061042b6105af366004613f23565b60019695505050505050565b3480156105c6575f80fd5b5061039a6105d5366004613dd5565b611b1a565b3480156105e5575f80fd5b5061042b6105f4366004613fc9565b80516020818301810180516101a38252928201919093012091525460ff1681565b348015610620575f80fd5b5061031261062f366004613db5565b6101a56020525f908152604090205481565b34801561064c575f80fd5b5061034d61065b366004614003565b611b50565b34801561066b575f80fd5b5061039a7f000000000000000000000000000000000000000000000000000000000000000081565b34801561069e575f80fd5b5061034d6106ad366004613dd5565b61211a565b3480156106bd575f80fd5b5060335473ffffffffffffffffffffffffffffffffffffffff1661039a565b3480156106e7575f80fd5b506106fb6106f6366004613db5565b6121d7565b60405161031c939291906140bc565b348015610715575f80fd5b5061039a7f000000000000000000000000000000000000000000000000000000000000000081565b348015610748575f80fd5b5061042b610757366004613db5565b609e6020525f908152604090205460ff1681565b348015610776575f80fd5b5061078a610785366004613dd5565b612297565b60405161031c91906140f9565b3480156107a2575f80fd5b5061078a6123ce565b3480156107b6575f80fd5b5061034d6107c5366004613db5565b6125b0565b3480156107d5575f80fd5b5061034d6107e4366004613dd5565b612721565b3480156107f4575f80fd5b50610312609d5481565b348015610809575f80fd5b5061034d610818366004613dd5565b6127eb565b348015610828575f80fd5b5060975461039a9073ffffffffffffffffffffffffffffffffffffffff1681565b348015610854575f80fd5b5061034d610863366004614152565b6128a8565b348015610873575f80fd5b5061034d610882366004613db5565b612ac6565b348015610892575f80fd5b506103126108a1366004613db5565b612b41565b3480156108b1575f80fd5b50610312609b5481565b3480156108c6575f80fd5b506108ea6108d5366004613db5565b61019f6020525f908152604090205460ff1681565b60405160ff909116815260200161031c565b348015610907575f80fd5b5061042b610916366004613db5565b73ffffffffffffffffffffffffffffffffffffffff165f9081526101a16020526040902054151590565b34801561094b575f80fd5b5061031261095a3660046141b9565b612be2565b34801561096a575f80fd5b5061034d610979366004613db5565b612d55565b348015610989575f80fd5b5061034d610998366004613dd5565b612e09565b335f818152609e602052604090205460ff16610a1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f6e6f7420696e2077686974656c6973740000000000000000000000000000000060448201526064015b60405180910390fd5b335f9081526101a2602052604090205473ffffffffffffffffffffffffffffffffffffffff1615610aa7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f616c7265616479207265676973746572656400000000000000000000000000006044820152606401610a11565b8215801590610ac557505f8381526101a4602052604090205460ff16155b610b2b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f696e76616c69642074656e6465726d696e74207075626b6579000000000000006044820152606401610a11565b8151610100148015610b5e57506101a382604051610b4991906141f8565b9081526040519081900360200190205460ff16155b610bc4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e76616c696420626c73207075626b657900000000000000000000000000006044820152606401610a11565b6098543414610c2f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c6964207374616b696e672076616c756500000000000000000000006044820152606401610a11565b6040518060600160405280610c413390565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083018790526040928301869052335f9081526101a28252839020845181547fffffffffffffffffffffffff00000000000000000000000000000000000000001693169290921782558301516001820155908201516002820190610cc190826142a8565b50905050610cd4610ccf3390565b612ec6565b60016101a383604051610ce791906141f8565b9081526040805191829003602090810190922080549315157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff009485161790555f8681526101a49092529020805490911660011790557fb9c7babb56df9f2da4a30811a6c778e4e68af88b72712d56cf62c5516e20e199610d643390565b8484604051610d75939291906140bc565b60405180910390a1335f9081526101a260209081526040918290208251606081018452815473ffffffffffffffffffffffffffffffffffffffff168152600182015492810192909252600281018054610e5a9484019190610dd590614213565b80601f0160208091040260200160405190810160405280929190818152602001828054610e0190614213565b8015610e4c5780601f10610e2357610100808354040283529160200191610e4c565b820191905f5260205f20905b815481529060010190602001808311610e2f57829003601f168201915b505050505081525050613033565b505050565b60a08160ff8110610e6e575f80fd5b015473ffffffffffffffffffffffffffffffffffffffff16905081565b610e93613186565b5f5b815181101561123657610ec0828281518110610eb357610eb36143c4565b602002602001015161199a565b610f4c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f6f6e6c7920616374697665207374616b65722063616e2062652072656d6f766560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610a11565b6101a55f838381518110610f6257610f626143c4565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20545f1461100c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f7769746864726177696e670000000000000000000000000000000000000000006044820152606401610a11565b609954611019904361441e565b6101a55f84848151811061102f5761102f6143c4565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2081905550611096828281518110611089576110896143c4565b6020026020010151613207565b8181815181106110a8576110a86143c4565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d56101a55f8585815181106110fd576110fd6143c4565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460405161114e91815260200190565b60405180910390a2609e5f83838151811061116b5761116b6143c4565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81549060ff02191690556001609f5f8484815181106111d2576111d26143c4565b60209081029190910181015173ffffffffffffffffffffffffffffffffffffffff1682528101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016911515919091179055600101610e95565b507f3f446646c03e618be8238a586960d6d625f35c653cdca1ef59609993e8ed2c848160405161126691906140f9565b60405180910390a16112778161333a565b50565b611282613186565b5f8111801561129457506101a6548114155b6112fa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f696e76616c6964206368616c6c656e6765206465706f7369742076616c7565006044820152606401610a11565b6101a680549082905560408051828152602081018490527f36f971a40478225aeb80cfbf5e80306e8cb76d3bf7d56fdc5e490945cddb7d5591015b60405180910390a15050565b61134a3361199a565b6113b0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f6f6e6c7920616374697665207374616b657200000000000000000000000000006044820152606401610a11565b335f9081526101a5602052604090205415611427576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f7769746864726177696e670000000000000000000000000000000000000000006044820152606401610a11565b609954611434904361441e565b335f8181526101a5602052604090209190915561145090613207565b335f8181526101a560209081526040918290205491519182527f7084f5476618d8e60b11ef0d7d3f06914655adb8793e28ff7f018d4c76d505d5910160405180910390a2335f908152609e6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00908116909155609f83528184208054909116600190811790915581518181528083019092529091828101908036833701905050905033815f81518110611510576115106143c4565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff16815250507f3f446646c03e618be8238a586960d6d625f35c653cdca1ef59609993e8ed2c848160405161126691906140f9565b611581613186565b61158961345d565b565b611593613bdf565b60408051611fe08101918290529060a09060ff9082845b815473ffffffffffffffffffffffffffffffffffffffff1681526001909101906020018083116115aa575050505050905090565b6097545f9073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611677576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f6f6e6c7920726f6c6c757020636f6e74726163740000000000000000000000006044820152606401610a11565b61167f6137ae565b5f61168983612297565b90505f805b82518110156118b0575f6101a55f8584815181106116ae576116ae6143c4565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541115611765576101a55f84838151811061170c5761170c6143c4565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f90556098548261175e919061441e565b91506118a8565b6117ac83828151811061177a5761177a6143c4565b602002602001015173ffffffffffffffffffffffffffffffffffffffff165f9081526101a16020526040902054151590565b6118a8576098546117bd908361441e565b91506117d4838281518110611089576110896143c4565b609e5f8483815181106117e9576117e96143c4565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81549060ff02191690556001609f5f858481518110611850576118506143c4565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff0219169083151502179055505b60010161168e565b505f6064609a54836118c29190614431565b6118cc9190614448565b90506118d88183614480565b609d5f8282546118e8919061441e565b90915550506097546119109073ffffffffffffffffffffffffffffffffffffffff1682613821565b7f654f4a61849f1b3ad10abb283d27f02d5fece7b820acc5a3b874713b58748b5a8360405161193f91906140f9565b60405180910390a17f3f446646c03e618be8238a586960d6d625f35c653cdca1ef59609993e8ed2c848360405161197691906140f9565b60405180910390a16119878361333a565b925050506119956001606555565b919050565b73ffffffffffffffffffffffffffffffffffffffff81165f90815261019f602052604081205460ff1681036119d057505f919050565b73ffffffffffffffffffffffffffffffffffffffff82165f81815261019f602052604090205460a090611a089060019060ff16614493565b60ff1660ff8110611a1b57611a1b6143c4565b015473ffffffffffffffffffffffffffffffffffffffff16148015611a63575073ffffffffffffffffffffffffffffffffffffffff82165f9081526101a16020526040902054155b92915050565b73ffffffffffffffffffffffffffffffffffffffff81165f90815261019f602052604081205460ff168103611a9f57505f919050565b73ffffffffffffffffffffffffffffffffffffffff82165f81815261019f602052604090205460a090611ad79060019060ff16614493565b60ff1660ff8110611aea57611aea6143c4565b015473ffffffffffffffffffffffffffffffffffffffff161492915050565b611b11613186565b6115895f6138f8565b6101a08181548110611b2a575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b5f54610100900460ff1615808015611b6e57505f54600160ff909116105b80611b875750303b158015611b8757505f5460ff166001145b611c13576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a11565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611c6f575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff8816611cec576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f696e76616c696420726f6c6c757020636f6e74726163740000000000000000006044820152606401610a11565b5f8711611d55576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c6964207374616b696e672076616c756500000000000000000000006044820152606401610a11565b5f8611611dbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f696e76616c6964206368616c6c656e6765206465706f7369742076616c7565006044820152606401610a11565b5f8511611e27576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601e60248201527f696e76616c6964207769746864726177616c206c6f636b20626c6f636b7300006044820152606401610a11565b5f8311611e90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f696e76616c696420676173206c696d697420616464207374616b6572000000006044820152606401610a11565b5f8211611ef9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f696e76616c696420676173206c696d69742072656d6f7665207374616b6572736044820152606401610a11565b5f84118015611f09575060648411155b611f94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f696e76616c6964206368616c6c656e676572207265776172642070657263656e60448201527f74616765000000000000000000000000000000000000000000000000000000006064820152608401610a11565b611f9c61396e565b611fa4613a0c565b609780547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8a16179055609a84905560988790556101a68690556099859055609b839055609c829055604080515f8152602081018590527f0ef80fb82bf5439b8591744c0fde771f5d93dce7a7970b1e9b7828cdc3970e9c910160405180910390a1604080515f8152602081018490527fdd4b37d1f14888147fe4be2cfaedcbf148fd07ececc856d0433241b8b6e4a7f7910160405180910390a1604080515f8152602081018690527fa46de936426e045703b2d34a292a19fde92b329018db8e0da750033876b655ba910160405180910390a18015612110575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050505050505050565b612122613186565b5f811180156121335750609c548114155b612199576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c6964206e657720676173206c696d697400000000000000000000006044820152606401610a11565b609c80549082905560408051828152602081018490527fdd4b37d1f14888147fe4be2cfaedcbf148fd07ececc856d0433241b8b6e4a7f79101611335565b6101a26020525f908152604090208054600182015460028301805473ffffffffffffffffffffffffffffffffffffffff90931693919261221690614213565b80601f016020809104026020016040519081016040528092919081815260200182805461224290614213565b801561228d5780601f106122645761010080835404028352916020019161228d565b820191905f5260205f20905b81548152906001019060200180831161227057829003601f168201915b5050505050905083565b6060600182901c5f5b81156122c7576122b181600161441e565b90506122be600183614480565b821691506122a0565b8067ffffffffffffffff8111156122e0576122e0613c48565b604051908082528060200260200182016040528015612309578160200160208202803683370190505b5092505f60015b60ff8160ff16116123c557600160ff82161b8616156123b35760a0612336600183614493565b60ff1660ff8110612349576123496143c4565b0154855173ffffffffffffffffffffffffffffffffffffffff90911690869084908110612378576123786143c4565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101526123a882600161441e565b9150828210156123c5575b806123bd816144ac565b915050612310565b50505050919050565b6040805160ff80825261200082019092526060915f91829160208201611fe0803683370190505090505f5b60ff8110156124b7575f60a08260ff8110612416576124166143c4565b015473ffffffffffffffffffffffffffffffffffffffff161480159061247857506101a15f60a08360ff811061244e5761244e6143c4565b015473ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f2054155b156124af5782612487816144ca565b935050600182828151811061249e5761249e6143c4565b911515602092830291909101909101525b6001016123f9565b505f8267ffffffffffffffff8111156124d2576124d2613c48565b6040519080825280602002602001820160405280156124fb578160200160208202803683370190505b5090505f805b60ff8110156125a65783818151811061251c5761251c6143c4565b60200260200101511561259e5760a08160ff811061253c5761253c6143c4565b0154835173ffffffffffffffffffffffffffffffffffffffff9091169084908490811061256b5761256b6143c4565b73ffffffffffffffffffffffffffffffffffffffff909216602092830291909101909101528161259a816144ca565b9250505b600101612501565b5090949350505050565b6125b86137ae565b335f9081526101a5602052604090205461262e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f7769746864726177616c206e6f742065786973740000000000000000000000006044820152606401610a11565b335f9081526101a560205260409020544310156126a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f7769746864726177616c206c6f636b65640000000000000000000000000000006044820152606401610a11565b335f9081526101a560205260408120556126bf61345d565b6040805173ffffffffffffffffffffffffffffffffffffffff83168152905133917f89309c9b2aeaffbdce717113df9427298b20448c05919bf889e05f8c3094254b919081900360200190a261271781609854613821565b6112776001606555565b612729613186565b5f81118015612739575060648111155b80156127475750609a548114155b6127ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f696e76616c6964207265776172642070657263656e74616765000000000000006044820152606401610a11565b609a80549082905560408051828152602081018490527fa46de936426e045703b2d34a292a19fde92b329018db8e0da750033876b655ba9101611335565b6127f3613186565b5f811180156128045750609b548114155b61286a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c6964206e657720676173206c696d697400000000000000000000006044820152606401610a11565b609b80549082905560408051828152602081018490527f0ef80fb82bf5439b8591744c0fde771f5d93dce7a7970b1e9b7828cdc3970e9c9101611335565b6128b0613186565b5f5b838110156129fa57609f5f8686848181106128cf576128cf6143c4565b90506020020160208101906128e49190613db5565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f205460ff1615612974576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e2072656d6f766564206c69737400000000000000000000000000000000006044820152606401610a11565b6001609e5f87878581811061298b5761298b6143c4565b90506020020160208101906129a09190613db5565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169115159190911790556001016128b2565b505f5b81811015612a8257609e5f848484818110612a1a57612a1a6143c4565b9050602002016020810190612a2f9190613db5565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556001016129fd565b507fe375867e538b40218c1b3db2ccceaf875eb073e38b510449e6088c1539ac862284848484604051612ab89493929190614553565b60405180910390a150505050565b612ace613186565b612ad66137ae565b609d54612ae38282613821565b5f609d556040805173ffffffffffffffffffffffffffffffffffffffff84168152602081018390527fa1fefb6c5328a92a416e321ed50997303fe7135fd88c28b0592b21ce42b5cdd9910160405180910390a1506112776001606555565b5f612b4b82611a69565b612bb1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f696e76616c6964207374616b65720000000000000000000000000000000000006044820152606401610a11565b5073ffffffffffffffffffffffffffffffffffffffff165f90815261019f6020526040902054600160ff9091161b90565b5f60ff821115612c4e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f7374616b657273206c656e677468206f7574206f6620626f756e6473000000006044820152606401610a11565b5f5b82811015612d4e57612c82848483818110612c6d57612c6d6143c4565b905060200201602081019061057c9190613db5565b612ce8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f696e76616c6964207374616b65720000000000000000000000000000000000006044820152606401610a11565b61019f5f858584818110612cfe57612cfe6143c4565b9050602002016020810190612d139190613db5565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f2054600160ff90911681901b929092179101612c50565b5092915050565b612d5d613186565b73ffffffffffffffffffffffffffffffffffffffff8116612e00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a11565b611277816138f8565b612e11613186565b5f81118015612e2257506098548114155b612e88576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c6964207374616b696e672076616c756500000000000000000000006044820152606401610a11565b609880549082905560408051828152602081018490527f91e3ed304d49776a78bbe0df6bf7156f5433763621e5e728a3c2adfe7de743689101611335565b5f5b60ff8160ff161015612fd0575f60a060ff808416908110612eeb57612eeb6143c4565b015473ffffffffffffffffffffffffffffffffffffffff1603612fc8578160a08260ff1660ff8110612f1f57612f1f6143c4565b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055612f6e816001614584565b73ffffffffffffffffffffffffffffffffffffffff929092165f90815261019f6020526040902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660ff9093169290921790915550565b600101612ec8565b506040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600960248201527f736c6f742066756c6c00000000000000000000000000000000000000000000006044820152606401610a11565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b2267a7b7f00000000000000000000000000000000000000000000000000000000000000005f846040516024016130a2919061459d565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f6d454d5100000000000000000000000000000000000000000000000000000000179052609b5490517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815261315694939291906004016145e1565b5f604051808303815f87803b15801561316d575f80fd5b505af115801561317f573d5f803e3d5ffd5b5050505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314611589576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a11565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526101a1602052604090205415613294576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f616c726561647920696e2064656c6574654c69737400000000000000000000006044820152606401610a11565b6101a080546001810182555f919091527f7980fe0f714a613298681d64b7b8ffa7b148338dd52429f307d72798d5c317c40180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff8316179055609954613311904361441e565b73ffffffffffffffffffffffffffffffffffffffff9091165f9081526101a16020526040902055565b7f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff1663b2267a7b7f00000000000000000000000000000000000000000000000000000000000000005f846040516024016133a991906140f9565b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529181526020820180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167f0be67fcc00000000000000000000000000000000000000000000000000000000179052609c5490517fffffffff0000000000000000000000000000000000000000000000000000000060e087901b16815261315694939291906004016145e1565b5f5b6101a05481101561127757436101a15f6101a08481548110613483576134836143c4565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040019020541161379c5760a0600161019f5f6101a085815481106134d5576134d56143c4565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902054613513919060ff16614493565b60ff1660ff8110613526576135266143c4565b0180547fffffffffffffffffffffffff00000000000000000000000000000000000000001690556101a0805461019f915f9184908110613568576135686143c4565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001812080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556101a080546101a2929190849081106135d9576135d96143c4565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001812080547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560018101829055906136446002830182613bfe565b50506101a15f6101a0838154811061365e5761365e6143c4565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040018120556101a080546136a090600190614480565b815481106136b0576136b06143c4565b5f918252602090912001546101a0805473ffffffffffffffffffffffffffffffffffffffff90921691839081106136e9576136e96143c4565b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506101a080548061374057613740614626565b5f8281526020902081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff000000000000000000000000000000000000000016905501905561345f565b806137a6816144ca565b91505061345f565b60026065540361381a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a11565b6002606555565b80156138ed575f8273ffffffffffffffffffffffffffffffffffffffff16826040515f6040518083038185875af1925050503d805f811461387d576040519150601f19603f3d011682016040523d82523d5f602084013e613882565b606091505b5050905080610e5a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c656400000000006044820152606401610a11565b5050565b6001606555565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff16613a04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a11565b611589613aaa565b5f54610100900460ff16613aa2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a11565b611589613b49565b5f54610100900460ff16613b40576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a11565b611589336138f8565b5f54610100900460ff166138f1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a11565b60405180611fe0016040528060ff906020820280368337509192915050565b508054613c0a90614213565b5f825580601f10613c19575050565b601f0160209004905f5260205f209081019061127791905b80821115613c44575f8155600101613c31565b5090565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715613cbc57613cbc613c48565b604052919050565b5f82601f830112613cd3575f80fd5b813567ffffffffffffffff811115613ced57613ced613c48565b613d1e60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f84011601613c75565b818152846020838601011115613d32575f80fd5b816020850160208301375f918101602001919091529392505050565b5f8060408385031215613d5f575f80fd5b82359150602083013567ffffffffffffffff811115613d7c575f80fd5b613d8885828601613cc4565b9150509250929050565b803573ffffffffffffffffffffffffffffffffffffffff81168114611995575f80fd5b5f60208284031215613dc5575f80fd5b613dce82613d92565b9392505050565b5f60208284031215613de5575f80fd5b5035919050565b5f6020808385031215613dfd575f80fd5b823567ffffffffffffffff80821115613e14575f80fd5b818501915085601f830112613e27575f80fd5b813581811115613e3957613e39613c48565b8060051b9150613e4a848301613c75565b8181529183018401918481019088841115613e63575f80fd5b938501935b83851015613e8857613e7985613d92565b82529385019390850190613e68565b98975050505050505050565b611fe0810181835f5b60ff811015613ed257815173ffffffffffffffffffffffffffffffffffffffff16835260209283019290910190600101613e9d565b50505092915050565b5f8083601f840112613eeb575f80fd5b50813567ffffffffffffffff811115613f02575f80fd5b6020830191508360208260051b8501011115613f1c575f80fd5b9250929050565b5f805f805f8060808789031215613f38575f80fd5b86359550602087013567ffffffffffffffff80821115613f56575f80fd5b613f628a838b01613edb565b9097509550604089013594506060890135915080821115613f81575f80fd5b818901915089601f830112613f94575f80fd5b813581811115613fa2575f80fd5b8a6020828501011115613fb3575f80fd5b6020830194508093505050509295509295509295565b5f60208284031215613fd9575f80fd5b813567ffffffffffffffff811115613fef575f80fd5b613ffb84828501613cc4565b949350505050565b5f805f805f805f60e0888a031215614019575f80fd5b61402288613d92565b9960208901359950604089013598606081013598506080810135975060a0810135965060c00135945092505050565b5f5b8381101561406b578181015183820152602001614053565b50505f910152565b5f815180845261408a816020860160208601614051565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169290920160200192915050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f6140f06060830184614073565b95945050505050565b602080825282518282018190525f9190848201906040850190845b8181101561414657835173ffffffffffffffffffffffffffffffffffffffff1683529284019291840191600101614114565b50909695505050505050565b5f805f8060408587031215614165575f80fd5b843567ffffffffffffffff8082111561417c575f80fd5b61418888838901613edb565b909650945060208701359150808211156141a0575f80fd5b506141ad87828801613edb565b95989497509550505050565b5f80602083850312156141ca575f80fd5b823567ffffffffffffffff8111156141e0575f80fd5b6141ec85828601613edb565b90969095509350505050565b5f8251614209818460208701614051565b9190910192915050565b600181811c9082168061422757607f821691505b60208210810361425e577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b601f821115610e5a57805f5260205f20601f840160051c810160208510156142895750805b601f840160051c820191505b8181101561317f575f8155600101614295565b815167ffffffffffffffff8111156142c2576142c2613c48565b6142d6816142d08454614213565b84614264565b602080601f831160018114614328575f84156142f25750858301515b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600386901b1c1916600185901b1785556143bc565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08616915b8281101561437457888601518255948401946001909101908401614355565b50858210156143b057878501517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600388901b60f8161c191681555b505060018460011b0185555b505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115611a6357611a636143f1565b8082028115828204841417611a6357611a636143f1565b5f8261447b577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b81810381811115611a6357611a636143f1565b60ff8281168282160390811115611a6357611a636143f1565b5f60ff821660ff81036144c1576144c16143f1565b60010192915050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036144fa576144fa6143f1565b5060010190565b8183525f60208085019450825f5b858110156145485773ffffffffffffffffffffffffffffffffffffffff61453583613d92565b168752958201959082019060010161450f565b509495945050505050565b604081525f614566604083018688614501565b8281036020840152614579818587614501565b979650505050505050565b60ff8181168382160190811115611a6357611a636143f1565b6020815273ffffffffffffffffffffffffffffffffffffffff8251166020820152602082015160408201525f6040830151606080840152613ffb6080840182614073565b73ffffffffffffffffffffffffffffffffffffffff85168152836020820152608060408201525f6146156080830185614073565b905082606083015295945050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea164736f6c6343000818000a" func init() { if err := json.Unmarshal([]byte(L1StakingStorageLayoutJSON), L1StakingStorageLayout); err != nil { diff --git a/bindings/bindings/l2staking.go b/bindings/bindings/l2staking.go index 759e66a57..6889a94ad 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\":[{\"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: "0x61012060405234801562000011575f80fd5b50604051620050b5380380620050b58339810160408190526200003491620000a7565b7353000000000000000000000000000000000000076080526001600160a01b031660a05273530000000000000000000000000000000000001360c05273530000000000000000000000000000000000001760e05273530000000000000000000000000000000000001461010052620000d6565b5f60208284031215620000b8575f80fd5b81516001600160a01b0381168114620000cf575f80fd5b9392505050565b60805160a05160c05160e05161010051614f15620001a05f395f818161044501528181610a7c01528181610b240152818161140f01528181611b29015281816135ce0152613d5e01525f818161055a0152613bae01525f818161067c01528181613e1f01528181613ed401528181613f7b015281816141720152818161421f01526142c601525f81816104ff015281816124a30152612a5001525f8181610408015281816105c201528181612479015281816124cd01528181612a260152612a7a0152614f155ff3fe608060405234801561000f575f80fd5b50600436106102ec575f3560e01c8063746c8ae111610192578063affed0e0116100e8578063e10911b111610093578063f2fde38b1161006e578063f2fde38b146106cf578063fad99f98146106e2578063fc6facc6146106ea575f80fd5b8063e10911b11461069e578063ed70b343146106a6578063f0261bc2146106c6575f80fd5b8063cce6cf9f116100c3578063cce6cf9f14610643578063d31d83d914610656578063d557714114610677575f80fd5b8063affed0e0146105f1578063b5d2e0dc146105fa578063c64814dd14610619575f80fd5b80638da5cb5b1161014857806391bd43a41161012357806391bd43a41461059e578063927ede2d146105bd57806396ab994d146105e4575f80fd5b80638da5cb5b146105445780638e21d5fb146105555780639168ae721461057c575f80fd5b80637b05afb5116101785780637b05afb5146104db578063831cfb58146104fa57806384d7d1d414610521575f80fd5b8063746c8ae1146104cb57806376671808146104d3575f80fd5b80633b8024211161024757806343352d61116101fd57806346cdc18a116101d857806346cdc18a146104a85780637046529b146104b0578063715018a6146104c3575f80fd5b806343352d611461047a578063439162b514610482578063459598a214610495575f80fd5b80633cb747bf1161022d5780633cb747bf146104065780633d9353fe1461044057806340b5c83714610467575f80fd5b80633b802421146103ea5780633c323a1b146103f3575f80fd5b8063174e31c4116102a75780632e787be3116102825780632e787be3146103ae57806330158eea146103b75780633385ccc2146103d7575f80fd5b8063174e31c41461037f57806319fac8fd146103925780632cc138be146103a5575f80fd5b80630eb573af116102d75780630eb573af1461032b5780630f3b70591461033e57806312a3e94714610376575f80fd5b806243b758146102f05780629c6f0c14610316575b5f80fd5b6103036102fe3660046145c5565b6106fd565b6040519081526020015b60405180910390f35b6103296103243660046145e0565b610723565b005b61032961033936600461462a565b610901565b61035161034c366004614641565b610a14565b604080516001600160a01b03909416845260208401929092529082015260600161030d565b610303609a5481565b61032961038d366004614641565b610a5c565b6103296103a036600461462a565b610bd4565b61030360985481565b61030360995481565b6103ca6103c53660046146b3565b610cf6565b60405161030d9190614753565b6103296103e53660046145c5565b610f1d565b610303609c5481565b610329610401366004614641565b611557565b7f00000000000000000000000000000000000000000000000000000000000000005b6040516001600160a01b03909116815260200161030d565b6104287f000000000000000000000000000000000000000000000000000000000000000081565b61032961047536600461462a565b611be6565b6103ca611cf9565b6103296104903660046147f9565b611f15565b6104286104a336600461462a565b612446565b609d54610303565b6103296104be3660046145e0565b61246e565b6103296125c8565b6103296125db565b6103036128cb565b6103036104e93660046145c5565b60a06020525f908152604090205481565b6104287f000000000000000000000000000000000000000000000000000000000000000081565b61053461052f3660046145c5565b61293f565b604051901515815260200161030d565b6033546001600160a01b0316610428565b6104287f000000000000000000000000000000000000000000000000000000000000000081565b61058f61058a3660046145c5565b612969565b60405161030d93929190614867565b6103036105ac3660046145c5565b60a16020525f908152604090205481565b6104287f000000000000000000000000000000000000000000000000000000000000000081565b6097546105349060ff1681565b61030360a55481565b6103036106083660046145c5565b609e6020525f908152604090205481565b610303610627366004614897565b60a360209081525f928352604080842090915290825290205481565b6103296106513660046148c3565b612a1b565b61066961066436600461490b565b612f87565b60405161030d929190614980565b6104287f000000000000000000000000000000000000000000000000000000000000000081565b610329613115565b6106b96106b43660046145c5565b613499565b60405161030d91906149a0565b610303609b5481565b6103296106dd3660046145c5565b61352f565b6103296135bc565b6103296106f83660046148c3565b61366a565b6001600160a01b0381165f90815260a26020526040812061071d90613a35565b92915050565b61072b613a3e565b8160a55481146107825760405162461bcd60e51b815260206004820152600d60248201527f696e76616c6964206e6f6e63650000000000000000000000000000000000000060448201526064015b60405180910390fd5b61078d836001614a2e565b60a555609e5f6107a060208501856145c5565b6001600160a01b03166001600160a01b031681526020019081526020015f20545f0361084257609d6107d560208401846145c5565b81546001810183555f9283526020808420909101805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039390931692909217909155609d5491609e91610828908601866145c5565b6001600160a01b0316815260208101919091526040015f20555b81609f5f61085360208401846145c5565b6001600160a01b0316815260208101919091526040015f206108758282614b5e565b50610885905060208301836145c5565b6001600160a01b03167f058ecb29c230cd5df283c89e996187ed521393fe4546cd1b097921c4b2de293d60208401356108c16040860186614a41565b6040516108d093929190614cc5565b60405180910390a260975460ff161580156108ef5750609954609d5411155b156108fc576108fc613a98565b505050565b610909613a3e565b5f8111801561091a57506099548114155b61098c5760405162461bcd60e51b815260206004820152602260248201527f696e76616c6964206e65772073657175656e63657220736574206d617820736960448201527f7a650000000000000000000000000000000000000000000000000000000000006064820152608401610779565b609980549082905560408051828152602081018490527f98b982a120d9be7d9c68d85a1aed8158d1d52e517175bfb3eb4280692f19b1ed910160405180910390a16097545f9060ff166109e157609d546109e5565b609c545b90505f60995482106109f9576099546109fb565b815b9050609b548114610a0e57610a0e613a98565b50505050565b60a4602052815f5260405f208181548110610a2d575f80fd5b5f9182526020909120600390910201805460018201546002909201546001600160a01b03909116935090915083565b610a64613c18565b6001600160a01b038216610b1a576001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016635cf20c7b336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602481018490526044015f604051808303815f87803b158015610aff575f80fd5b505af1158015610b11573d5f803e3d5ffd5b50505050610bc6565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663996cba6883336040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b1681526001600160a01b03928316600482015291166024820152604481018490526064015f604051808303815f87803b158015610baf575f80fd5b505af1158015610bc1573d5f803e3d5ffd5b505050505b610bd06001606555565b5050565b335f908152609e6020526040902054610c2f5760405162461bcd60e51b815260206004820152601360248201527f6f6e6c79207374616b657220616c6c6f776564000000000000000000000000006044820152606401610779565b6014811115610c805760405162461bcd60e51b815260206004820152601260248201527f696e76616c696420636f6d6d697373696f6e00000000000000000000000000006044820152606401610779565b335f90815260a06020526040812082905560975460ff16610ca1575f610cb4565b610ca96128cb565b610cb4906001614a2e565b604080518481526020810183905291925033917f6e500db30ce535d38852e318f333e9be41a3fec6c65d234ebb06203c896db9a5910160405180910390a25050565b60605f8267ffffffffffffffff811115610d1257610d12614aa2565b604051908082528060200260200182016040528015610d5e57816020015b60408051606080820183525f808352602083015291810191909152815260200190600190039081610d305790505b5090505f5b83811015610f15576040518060600160405280609f5f888886818110610d8b57610d8b614d18565b9050602002016020810190610da091906145c5565b6001600160a01b03908116825260208083019390935260409091015f908120549091168352910190609f90888886818110610ddd57610ddd614d18565b9050602002016020810190610df291906145c5565b6001600160a01b03166001600160a01b031681526020019081526020015f20600101548152602001609f5f888886818110610e2f57610e2f614d18565b9050602002016020810190610e4491906145c5565b6001600160a01b03166001600160a01b031681526020019081526020015f206002018054610e7190614acf565b80601f0160208091040260200160405190810160405280929190818152602001828054610e9d90614acf565b8015610ee85780601f10610ebf57610100808354040283529160200191610ee8565b820191905f5260205f20905b815481529060010190602001808311610ecb57829003601f168201915b5050505050815250828281518110610f0257610f02614d18565b6020908102919091010152600101610d63565b509392505050565b610f25613c18565b6001600160a01b0381165f90815260a360209081526040808320338452909152902054610f945760405162461bcd60e51b815260206004820152601660248201527f7374616b696e6720616d6f756e74206973207a65726f000000000000000000006044820152606401610779565b6001600160a01b0381165f908152609e60205260408120546097549015919060ff16610fc0575f610fd3565b610fc86128cb565b610fd3906001614a2e565b6097549091505f9060ff168015610fe8575082155b610ff25781610fff565b609a54610fff9083614a2e565b604080516060810182526001600160a01b038781168083525f81815260a36020908152858220338084528183528784208054848901908152888a018b815283875260a486528a87208054600180820183559189528789208c51600390920201805473ffffffffffffffffffffffffffffffffffffffff191691909b16178a558251908a015551600290980197909755908452908252829055925191815260a1909252928120805494955091936110b6908490614d45565b90915550506001600160a01b0385165f90815260a2602052604090206110dc9033613c78565b506001600160a01b0385165f908152609e602052604090205484158015611105575060975460ff165b80156111125750609c5481105b15611373576001600160a01b0386165f908152609e602052604081205461113b90600190614d45565b90505b6001609c5461114d9190614d45565b8110156113715760a15f609d838154811061116a5761116a614d18565b5f9182526020808320909101546001600160a01b031683528201929092526040018120549060a190609d61119f856001614a2e565b815481106111af576111af614d18565b5f9182526020808320909101546001600160a01b031683528201929092526040019020541115611369575f609d82815481106111ed576111ed614d18565b5f918252602090912001546001600160a01b03169050609d611210836001614a2e565b8154811061122057611220614d18565b5f91825260209091200154609d80546001600160a01b03909216918490811061124b5761124b614d18565b5f918252602090912001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b039290921691909117905580609d61128e846001614a2e565b8154811061129e5761129e614d18565b5f918252602090912001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03929092169190911790556112de826001614a2e565b609e5f609d85815481106112f4576112f4614d18565b5f9182526020808320909101546001600160a01b03168352820192909252604001902055611323826002614a2e565b609e5f609d611333866001614a2e565b8154811061134357611343614d18565b5f9182526020808320909101546001600160a01b03168352820192909252604001902055505b60010161113e565b505b8415801561139657506001600160a01b0386165f90815260a16020526040902054155b156113b3576001609c5f8282546113ad9190614d45565b90915550505b6001600160a01b038681165f81815260a160205260408082205481517f7f683ee30000000000000000000000000000000000000000000000000000000081526004810194909452336024850152604484018990526064840152517f000000000000000000000000000000000000000000000000000000000000000090931692637f683ee392608480820193929182900301818387803b158015611454575f80fd5b505af1158015611466573d5f803e3d5ffd5b505050506114713390565b6001600160a01b0316866001600160a01b03167f92039db29d8c0a1aa1433fe109c69488c8c5e51b23c9de7d303ad80c1fef778c846020015187876040516114cc939291909283526020830191909152604082015260600190565b60405180910390a3841580156114e4575060975460ff165b80156114f25750609b548111155b80156115385750609b546001600160a01b0387165f908152609e602052604090205411806115385750609c546001600160a01b0387165f908152609e6020526040902054115b1561154557611545613a98565b50505050506115546001606555565b50565b6001600160a01b0382165f908152609e602052604090205482906115bd5760405162461bcd60e51b815260206004820152600a60248201527f6e6f74207374616b6572000000000000000000000000000000000000000000006044820152606401610779565b6115c5613c18565b5f82116116145760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964207374616b6520616d6f756e740000000000000000000000006044820152606401610779565b61161e3384613c93565b1561166b5760405162461bcd60e51b815260206004820152601660248201527f756e64656c65676174696f6e20756e636c61696d6564000000000000000000006044820152606401610779565b6001600160a01b0383165f90815260a3602090815260408083203384529091529020546116e95761169c3384613d1c565b156116e95760405162461bcd60e51b815260206004820152601060248201527f72657761726420756e636c61696d6564000000000000000000000000000000006044820152606401610779565b6001600160a01b0383165f90815260a1602052604081208054849290611710908490614a2e565b90915550506001600160a01b0383165f90815260a36020908152604080832033845290915281208054849290611747908490614a2e565b90915550506001600160a01b0383165f90815260a26020526040902061176d9033613dd1565b506001600160a01b0383165f90815260a160205260409020548290036117a5576001609c5f82825461179f9190614a2e565b90915550505b6001600160a01b0383165f908152609e602052604090205460975460ff1680156117cf5750600181115b15611a15575f6117e0600183614d45565b90505b8015611a135760a15f609d6117f9600185614d45565b8154811061180957611809614d18565b905f5260205f20015f9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020015f205460a15f609d848154811061185a5761185a614d18565b5f9182526020808320909101546001600160a01b031683528201929092526040019020541115611a01575f609d611892600184614d45565b815481106118a2576118a2614d18565b5f91825260209091200154609d80546001600160a01b03909216925090839081106118cf576118cf614d18565b5f918252602090912001546001600160a01b0316609d6118f0600185614d45565b8154811061190057611900614d18565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555080609d838154811061193f5761193f614d18565b5f9182526020822001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0393909316929092179091558290609e90609d611986600185614d45565b8154811061199657611996614d18565b5f9182526020808320909101546001600160a01b031683528201929092526040019020556119c5826001614a2e565b609e5f609d85815481106119db576119db614d18565b5f9182526020808320909101546001600160a01b03168352820192909252604001902055505b80611a0b81614d58565b9150506117e3565b505b6097545f9060ff16611a27575f611a3a565b611a2f6128cb565b611a3a906001614a2e565b6001600160a01b0386165f81815260a36020908152604080832033808552908352928190205481519081529182018990528181018590525193945090927fc4ad67bad2c1f682946a406d840f1b273f5cd5a53fcc1a03d078d92bfa2e07d09181900360600190a36001600160a01b038581165f81815260a360209081526040808320338085528184528285205486865260a18552838620548287529290945282517fb809af0f000000000000000000000000000000000000000000000000000000008152600481019690965260248601526044850187905260648501839052608485015290881460a4840152517f00000000000000000000000000000000000000000000000000000000000000009093169263b809af0f9260c480820193929182900301818387803b158015611b6e575f80fd5b505af1158015611b80573d5f803e3d5ffd5b50505050611b95611b8e3390565b3086613de5565b60975460ff168015611ba85750609b5482115b8015611bcd57506099546001600160a01b0386165f908152609e602052604090205411155b15611bda57611bda613a98565b50506108fc6001606555565b611bee613a3e565b60975460ff1615611c415760405162461bcd60e51b815260206004820152601660248201527f72657761726420616c72656164792073746172746564000000000000000000006044820152606401610779565b4281118015611c5a5750611c586201518082614d9a565b155b8015611c6857506098548114155b611cb45760405162461bcd60e51b815260206004820152601960248201527f696e76616c6964207265776172642073746172742074696d65000000000000006044820152606401610779565b609880549082905560408051828152602081018490527f91c38708087fb4ba51bd0e6a106cc1fbaf340479a2e81d18f2341e8c78f97555910160405180910390a15050565b609d546060905f9067ffffffffffffffff811115611d1957611d19614aa2565b604051908082528060200260200182016040528015611d6557816020015b60408051606080820183525f808352602083015291810191909152815260200190600190039081611d375790505b5090505f5b609d54811015611f0f576040518060600160405280609f5f609d8581548110611d9557611d95614d18565b5f9182526020808320909101546001600160a01b0390811684528382019490945260409092018120549092168352609d80549390910192609f92919086908110611de157611de1614d18565b905f5260205f20015f9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020015f20600101548152602001609f5f609d8581548110611e3a57611e3a614d18565b5f9182526020808320909101546001600160a01b0316835282019290925260400190206002018054611e6b90614acf565b80601f0160208091040260200160405190810160405280929190818152602001828054611e9790614acf565b8015611ee25780601f10611eb957610100808354040283529160200191611ee2565b820191905f5260205f20905b815481529060010190602001808311611ec557829003601f168201915b5050505050815250828281518110611efc57611efc614d18565b6020908102919091010152600101611d6a565b50919050565b5f54610100900460ff1615808015611f3357505f54600160ff909116105b80611f4c5750303b158015611f4c57505f5460ff166001145b611fbe5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610779565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561201a575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b0387166120705760405162461bcd60e51b815260206004820152601560248201527f696e76616c6964206f776e6572206164647265737300000000000000000000006044820152606401610779565b5f86116120e55760405162461bcd60e51b815260206004820152602260248201527f73657175656e6365727353697a65206d7573742067726561746572207468616e60448201527f20300000000000000000000000000000000000000000000000000000000000006064820152608401610779565b5f85116121345760405162461bcd60e51b815260206004820152601c60248201527f696e76616c696420756e64656c65676174654c6f636b45706f636873000000006044820152606401610779565b428411801561214d575061214b6201518085614d9a565b155b6121995760405162461bcd60e51b815260206004820152601960248201527f696e76616c6964207265776172642073746172742074696d65000000000000006044820152606401610779565b816121e65760405162461bcd60e51b815260206004820152601760248201527f696e76616c696420696e697469616c207374616b6572730000000000000000006044820152606401610779565b6121ef8761404b565b6121f76140a9565b6099869055609a8590556098849055609b8290555f5b609b548110156123685783838281811061222957612229614d18565b905060200281019061223b9190614dad565b609f5f86868581811061225057612250614d18565b90506020028101906122629190614dad565b6122709060208101906145c5565b6001600160a01b0316815260208101919091526040015f206122928282614b5e565b905050609d8484838181106122a9576122a9614d18565b90506020028101906122bb9190614dad565b6122c99060208101906145c5565b8154600180820184555f938452602090932001805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b0392909216919091179055612312908290614a2e565b609e5f86868581811061232757612327614d18565b90506020028101906123399190614dad565b6123479060208101906145c5565b6001600160a01b0316815260208101919091526040015f205560010161220d565b50604080515f8152602081018890527f98b982a120d9be7d9c68d85a1aed8158d1d52e517175bfb3eb4280692f19b1ed910160405180910390a1604080515f8152602081018690527f91c38708087fb4ba51bd0e6a106cc1fbaf340479a2e81d18f2341e8c78f97555910160405180910390a1801561243d575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b609d8181548110612455575f80fd5b5f918252602090912001546001600160a01b0316905081565b336001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001614801561255657507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015612527573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061254b9190614de9565b6001600160a01b0316145b61072b5760405162461bcd60e51b815260206004820152602c60248201527f7374616b696e673a206f6e6c79206f74686572207374616b696e6720636f6e7460448201527f7261637420616c6c6f77656400000000000000000000000000000000000000006064820152608401610779565b6125d0613a3e565b6125d95f61404b565b565b6125e3613a3e565b60985442101561265a5760405162461bcd60e51b8152602060048201526024808201527f63616e2774207374617274206265666f7265207265776172642073746172742060448201527f74696d65000000000000000000000000000000000000000000000000000000006064820152608401610779565b5f609c54116126ab5760405162461bcd60e51b815260206004820152600e60248201527f6e6f6e652063616e6469646174650000000000000000000000000000000000006044820152606401610779565b609780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091555b609d54811015612868575f5b8181101561285f5760a15f609d838154811061270457612704614d18565b905f5260205f20015f9054906101000a90046001600160a01b03166001600160a01b03166001600160a01b031681526020019081526020015f205460a15f609d858154811061275557612755614d18565b5f9182526020808320909101546001600160a01b031683528201929092526040019020541115612857575f609d828154811061279357612793614d18565b5f91825260209091200154609d80546001600160a01b03909216925090849081106127c0576127c0614d18565b5f91825260209091200154609d80546001600160a01b0390921691849081106127eb576127eb614d18565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b0316021790555080609d848154811061282a5761282a614d18565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b03160217905550505b6001016126e6565b506001016126da565b505f5b609d548110156128c257612880816001614a2e565b609e5f609d848154811061289657612896614d18565b5f9182526020808320909101546001600160a01b0316835282019290925260400190205560010161286b565b506125d9613a98565b5f60985442101561291e5760405162461bcd60e51b815260206004820152601960248201527f726577617264206973206e6f74207374617274656420796574000000000000006044820152606401610779565b62015180609854426129309190614d45565b61293a9190614e04565b905090565b6001600160a01b0381165f90815260a360209081526040808320338452909152812054151561071d565b609f6020525f90815260409020805460018201546002830180546001600160a01b0390931693919261299a90614acf565b80601f01602080910402602001604051908101604052809291908181526020018280546129c690614acf565b8015612a115780601f106129e857610100808354040283529160200191612a11565b820191905f5260205f20905b8154815290600101906020018083116129f457829003601f168201915b5050505050905083565b336001600160a01b037f000000000000000000000000000000000000000000000000000000000000000016148015612b0357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b03167f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ad4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612af89190614de9565b6001600160a01b0316145b612b755760405162461bcd60e51b815260206004820152602c60248201527f7374616b696e673a206f6e6c79206f74686572207374616b696e6720636f6e7460448201527f7261637420616c6c6f77656400000000000000000000000000000000000000006064820152608401610779565b8260a5548114612bc75760405162461bcd60e51b815260206004820152600d60248201527f696e76616c6964206e6f6e6365000000000000000000000000000000000000006044820152606401610779565b612bd2846001614a2e565b60a5555f805b83811015612f3857609b54609e5f878785818110612bf857612bf8614d18565b9050602002016020810190612c0d91906145c5565b6001600160a01b03166001600160a01b031681526020019081526020015f205411612c3757600191505b5f609e5f878785818110612c4d57612c4d614d18565b9050602002016020810190612c6291906145c5565b6001600160a01b03166001600160a01b031681526020019081526020015f20541115612eba575f6001609e5f888886818110612ca057612ca0614d18565b9050602002016020810190612cb591906145c5565b6001600160a01b03166001600160a01b031681526020019081526020015f2054612cdf9190614d45565b90505b609d54612cf190600190614d45565b811015612dc357609d612d05826001614a2e565b81548110612d1557612d15614d18565b5f91825260209091200154609d80546001600160a01b039092169183908110612d4057612d40614d18565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506001609e5f609d8481548110612d8357612d83614d18565b5f9182526020808320909101546001600160a01b0316835282019290925260400181208054909190612db6908490614d45565b9091555050600101612ce2565b50609d805480612dd557612dd5614e17565b5f8281526020812082015f19908101805473ffffffffffffffffffffffffffffffffffffffff19169055909101909155609e90868684818110612e1a57612e1a614d18565b9050602002016020810190612e2f91906145c5565b6001600160a01b03166001600160a01b031681526020019081526020015f205f90555f60a15f878785818110612e6757612e67614d18565b9050602002016020810190612e7c91906145c5565b6001600160a01b03166001600160a01b031681526020019081526020015f20541115612eba576001609c5f828254612eb49190614d45565b90915550505b609f5f868684818110612ecf57612ecf614d18565b9050602002016020810190612ee491906145c5565b6001600160a01b0316815260208101919091526040015f908120805473ffffffffffffffffffffffffffffffffffffffff191681556001810182905590612f2e6002830182614567565b5050600101612bd8565b507f3511bf213f9290ba907e91e12a43e8471251e1879580ae5509292a3514c23f618484604051612f6a929190614e44565b60405180910390a18015612f8057612f80613a98565b5050505050565b5f60605f8411612fd95760405162461bcd60e51b815260206004820152601160248201527f696e76616c696420706167652073697a650000000000000000000000000000006044820152606401610779565b6001600160a01b0385165f90815260a260205260409020612ff990613a35565b91508367ffffffffffffffff81111561301457613014614aa2565b60405190808252806020026020018201604052801561303d578160200160208202803683370190505b5090505f61304b8486614e91565b90505f600161305a8682614a2e565b6130649088614e91565b61306e9190614d45565b905061307b600185614d45565b8111156130905761308d600185614d45565b90505b815f5b828211613109576130c7826130a781614ea8565b6001600160a01b038c165f90815260a2602052604090209094509061412d565b85826130d281614ea8565b9350815181106130e4576130e4614d18565b60200260200101906001600160a01b031690816001600160a01b031681525050613093565b50505050935093915050565b61311d613c18565b335f90815260a46020526040812054815b818110156134335760975460ff16158061317e575061314b6128cb565b335f90815260a46020526040902080548390811061316b5761316b614d18565b905f5260205f2090600302016002015411155b1561342157335f90815260a4602052604090208054829081106131a3576131a3614d18565b905f5260205f20906003020160010154836131be9190614a2e565b335f90815260a46020526040812080549295509091839081106131e3576131e3614d18565b5f91825260208220600390910201546001600160a01b0316915060a4816132073390565b6001600160a01b03166001600160a01b031681526020019081526020015f20838154811061323757613237614d18565b905f5260205f2090600302016002015490505f60a45f6132543390565b6001600160a01b03166001600160a01b031681526020019081526020015f20848154811061328457613284614d18565b905f5260205f2090600302016001015490506001856132a39190614d45565b84101561336857335f90815260a4602052604090206132c3600187614d45565b815481106132d3576132d3614d18565b905f5260205f20906003020160a45f6132e93390565b6001600160a01b03166001600160a01b031681526020019081526020015f20858154811061331957613319614d18565b5f91825260209091208254600390920201805473ffffffffffffffffffffffffffffffffffffffff19166001600160a01b03909216919091178155600180830154908201556002918201549101555b335f90815260a46020526040902080548061338557613385614e17565b5f8281526020812060035f1990930192830201805473ffffffffffffffffffffffffffffffffffffffff19168155600181810183905560029091019190915591556133d09086614d45565b604080518481526020810184905291965033916001600160a01b038616917f921046659ea3b3b3f8e8fefd2bece3121b2d929ead94c696a75beedee477fdb6910160405180910390a350505061312e565b61342c816001614a2e565b905061312e565b505f82116134835760405162461bcd60e51b815260206004820152601760248201527f6e6f204d6f72706820746f6b656e20746f20636c61696d0000000000000000006044820152606401610779565b61348d3383614138565b50506125d96001606555565b6001600160a01b0381165f90815260a460209081526040808320805482518185028101850190935280835260609492939192909184015b82821015613524575f848152602090819020604080516060810182526003860290920180546001600160a01b03168352600180820154848601526002909101549183019190915290835290920191016134d0565b505050509050919050565b613537613a3e565b6001600160a01b0381166135b35760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610779565b6115548161404b565b6135c4613c18565b6001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001663ac2ac640336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b0390911660048201526024015f604051808303815f87803b15801561364a575f80fd5b505af115801561365c573d5f803e3d5ffd5b505050506125d96001606555565b613672613a3e565b8260a55481146136c45760405162461bcd60e51b815260206004820152600d60248201527f696e76616c6964206e6f6e6365000000000000000000000000000000000000006044820152606401610779565b6136cf846001614a2e565b60a5555f805b83811015612f3857609b54609e5f8787858181106136f5576136f5614d18565b905060200201602081019061370a91906145c5565b6001600160a01b03166001600160a01b031681526020019081526020015f20541161373457600191505b5f609e5f87878581811061374a5761374a614d18565b905060200201602081019061375f91906145c5565b6001600160a01b03166001600160a01b031681526020019081526020015f205411156139b7575f6001609e5f88888681811061379d5761379d614d18565b90506020020160208101906137b291906145c5565b6001600160a01b03166001600160a01b031681526020019081526020015f20546137dc9190614d45565b90505b609d546137ee90600190614d45565b8110156138c057609d613802826001614a2e565b8154811061381257613812614d18565b5f91825260209091200154609d80546001600160a01b03909216918390811061383d5761383d614d18565b905f5260205f20015f6101000a8154816001600160a01b0302191690836001600160a01b031602179055506001609e5f609d848154811061388057613880614d18565b5f9182526020808320909101546001600160a01b03168352820192909252604001812080549091906138b3908490614d45565b90915550506001016137df565b50609d8054806138d2576138d2614e17565b5f8281526020812082015f19908101805473ffffffffffffffffffffffffffffffffffffffff19169055909101909155609e9086868481811061391757613917614d18565b905060200201602081019061392c91906145c5565b6001600160a01b03166001600160a01b031681526020019081526020015f205f90555f60a15f87878581811061396457613964614d18565b905060200201602081019061397991906145c5565b6001600160a01b03166001600160a01b031681526020019081526020015f205411156139b7576001609c5f8282546139b19190614d45565b90915550505b609f5f8686848181106139cc576139cc614d18565b90506020020160208101906139e191906145c5565b6001600160a01b0316815260208101919091526040015f908120805473ffffffffffffffffffffffffffffffffffffffff191681556001810182905590613a2b6002830182614567565b50506001016136d5565b5f61071d825490565b6033546001600160a01b031633146125d95760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610779565b60995460975460ff1615613abc57609954609c541015613ab75750609c545b613acd565b609954609d541015613acd5750609d545b5f8167ffffffffffffffff811115613ae757613ae7614aa2565b604051908082528060200260200182016040528015613b10578160200160208202803683370190505b5090505f5b82811015613b7d57609d8181548110613b3057613b30614d18565b905f5260205f20015f9054906101000a90046001600160a01b0316828281518110613b5d57613b5d614d18565b6001600160a01b0390921660209283029190910190910152600101613b15565b506040517f9b8201a40000000000000000000000000000000000000000000000000000000081526001600160a01b037f00000000000000000000000000000000000000000000000000000000000000001690639b8201a490613be3908490600401614ec0565b5f604051808303815f87803b158015613bfa575f80fd5b505af1158015613c0c573d5f803e3d5ffd5b50509151609b55505050565b600260655403613c6a5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610779565b6002606555565b6001606555565b5f613c8c836001600160a01b038416614396565b9392505050565b5f805b6001600160a01b0384165f90815260a46020526040902054811015613d13576001600160a01b038481165f90815260a46020526040902080549185169183908110613ce357613ce3614d18565b5f9182526020909120600390910201546001600160a01b031603613d0b57600191505061071d565b600101613c96565b505f9392505050565b6040517fde6ac9330000000000000000000000000000000000000000000000000000000081526001600160a01b03838116600483015282811660248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063de6ac93390604401602060405180830381865afa158015613da5573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613dc99190614ed2565b159392505050565b5f613c8c836001600160a01b038416614479565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015613e66573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613e8a9190614ef1565b6040517f23b872dd0000000000000000000000000000000000000000000000000000000081526001600160a01b0386811660048301528581166024830152604482018590529192507f0000000000000000000000000000000000000000000000000000000000000000909116906323b872dd906064016020604051808303815f875af1158015613f1c573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f409190614ed2565b506040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015613fc2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613fe69190614ef1565b90505f83118015613fff575082613ffd8383614d45565b145b612f805760405162461bcd60e51b815260206004820152601b60248201527f6d6f72706820746f6b656e207472616e73666572206661696c656400000000006044820152606401610779565b603380546001600160a01b0383811673ffffffffffffffffffffffffffffffffffffffff19831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff166141255760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610779565b6125d96144c5565b5f613c8c8383614541565b6040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0383811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa1580156141b9573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906141dd9190614ef1565b6040517fa9059cbb0000000000000000000000000000000000000000000000000000000081526001600160a01b038581166004830152602482018590529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303815f875af1158015614267573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061428b9190614ed2565b506040517f70a082310000000000000000000000000000000000000000000000000000000081526001600160a01b0384811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa15801561430d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143319190614ef1565b90505f8311801561434a5750826143488383614d45565b145b610a0e5760405162461bcd60e51b815260206004820152601b60248201527f6d6f72706820746f6b656e207472616e73666572206661696c656400000000006044820152606401610779565b5f8181526001830160205260408120548015614470575f6143b8600183614d45565b85549091505f906143cb90600190614d45565b905081811461442a575f865f0182815481106143e9576143e9614d18565b905f5260205f200154905080875f01848154811061440957614409614d18565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061443b5761443b614e17565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f90556001935050505061071d565b5f91505061071d565b5f8181526001830160205260408120546144be57508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561071d565b505f61071d565b5f54610100900460ff16613c715760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610779565b5f825f01828154811061455657614556614d18565b905f5260205f200154905092915050565b50805461457390614acf565b5f825580601f10614582575050565b601f0160209004905f5260205f209081019061155491905b808211156145ad575f815560010161459a565b5090565b6001600160a01b0381168114611554575f80fd5b5f602082840312156145d5575f80fd5b8135613c8c816145b1565b5f80604083850312156145f1575f80fd5b82359150602083013567ffffffffffffffff81111561460e575f80fd5b83016060818603121561461f575f80fd5b809150509250929050565b5f6020828403121561463a575f80fd5b5035919050565b5f8060408385031215614652575f80fd5b823561465d816145b1565b946020939093013593505050565b5f8083601f84011261467b575f80fd5b50813567ffffffffffffffff811115614692575f80fd5b6020830191508360208260051b85010111156146ac575f80fd5b9250929050565b5f80602083850312156146c4575f80fd5b823567ffffffffffffffff8111156146da575f80fd5b6146e68582860161466b565b90969095509350505050565b5f81518084525f5b81811015614716576020818501810151868301820152016146fa565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b838110156147eb578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc0018552815180516001600160a01b03168452878101518885015286015160608785018190526147d7818601836146f2565b96890196945050509086019060010161477a565b509098975050505050505050565b5f805f805f8060a0878903121561480e575f80fd5b8635614819816145b1565b9550602087013594506040870135935060608701359250608087013567ffffffffffffffff811115614849575f80fd5b61485589828a0161466b565b979a9699509497509295939492505050565b6001600160a01b0384168152826020820152606060408201525f61488e60608301846146f2565b95945050505050565b5f80604083850312156148a8575f80fd5b82356148b3816145b1565b9150602083013561461f816145b1565b5f805f604084860312156148d5575f80fd5b83359250602084013567ffffffffffffffff8111156148f2575f80fd5b6148fe8682870161466b565b9497909650939450505050565b5f805f6060848603121561491d575f80fd5b8335614928816145b1565b95602085013595506040909401359392505050565b5f815180845260208085019450602084015f5b838110156149755781516001600160a01b031687529582019590820190600101614950565b509495945050505050565b828152604060208201525f614998604083018461493d565b949350505050565b602080825282518282018190525f919060409081850190868401855b828110156149f457815180516001600160a01b03168552868101518786015285015185850152606090930192908501906001016149bc565b5091979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561071d5761071d614a01565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614a74575f80fd5b83018035915067ffffffffffffffff821115614a8e575f80fd5b6020019150368190038213156146ac575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b600181811c90821680614ae357607f821691505b602082108103611f0f577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b601f8211156108fc57805f5260205f20601f840160051c81016020851015614b3f5750805b601f840160051c820191505b81811015612f80575f8155600101614b4b565b8135614b69816145b1565b6001600160a01b03811673ffffffffffffffffffffffffffffffffffffffff1983541617825550600160208084013560018401556002830160408501357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1863603018112614bd5575f80fd5b8501803567ffffffffffffffff811115614bed575f80fd5b8036038483011315614bfd575f80fd5b614c1181614c0b8554614acf565b85614b1a565b5f601f821160018114614c44575f8315614c2d57508382018601355b5f19600385901b1c1916600184901b178555614cba565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08516915b82811015614c9057868501890135825593880193908901908801614c71565b5084821015614cae575f1960f88660031b161c198885880101351681555b505060018360011b0185555b505050505050505050565b83815260406020820152816040820152818360608301375f818301606090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010192915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b8181038181111561071d5761071d614a01565b5f81614d6657614d66614a01565b505f190190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82614da857614da8614d6d565b500690565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112614ddf575f80fd5b9190910192915050565b5f60208284031215614df9575f80fd5b8151613c8c816145b1565b5f82614e1257614e12614d6d565b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b60208082528181018390525f908460408401835b86811015614e86578235614e6b816145b1565b6001600160a01b031682529183019190830190600101614e58565b509695505050505050565b808202811582820484141761071d5761071d614a01565b5f5f198203614eb957614eb9614a01565b5060010190565b602081525f613c8c602083018461493d565b5f60208284031215614ee2575f80fd5b81518015158114613c8c575f80fd5b5f60208284031215614f01575f80fd5b505191905056fea164736f6c6343000818000a", + 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", } // L2StakingABI is the input ABI used to generate the binding from. @@ -788,37 +788,6 @@ 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) @@ -1167,25 +1136,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 0x7046529b. +// AddStaker is a paid mutator transaction binding the contract method 0x6d454d51. // -// 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) +// 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) } -// AddStaker is a paid mutator transaction binding the contract method 0x7046529b. +// AddStaker is a paid mutator transaction binding the contract method 0x6d454d51. // -// 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) +// Solidity: function addStaker((address,bytes32,bytes) add) returns() +func (_L2Staking *L2StakingSession) AddStaker(add TypesStakerInfo) (*types.Transaction, error) { + return _L2Staking.Contract.AddStaker(&_L2Staking.TransactOpts, add) } -// AddStaker is a paid mutator transaction binding the contract method 0x7046529b. +// AddStaker is a paid mutator transaction binding the contract method 0x6d454d51. // -// 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) +// Solidity: function addStaker((address,bytes32,bytes) add) returns() +func (_L2Staking *L2StakingTransactorSession) AddStaker(add TypesStakerInfo) (*types.Transaction, error) { + return _L2Staking.Contract.AddStaker(&_L2Staking.TransactOpts, add) } // ClaimCommission is a paid mutator transaction binding the contract method 0xfad99f98. @@ -1272,48 +1241,6 @@ 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() @@ -1335,25 +1262,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 0xcce6cf9f. +// RemoveStakers is a paid mutator transaction binding the contract method 0x0be67fcc. // -// 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) +// 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) } -// RemoveStakers is a paid mutator transaction binding the contract method 0xcce6cf9f. +// RemoveStakers is a paid mutator transaction binding the contract method 0x0be67fcc. // -// 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) +// Solidity: function removeStakers(address[] remove) returns() +func (_L2Staking *L2StakingSession) RemoveStakers(remove []common.Address) (*types.Transaction, error) { + return _L2Staking.Contract.RemoveStakers(&_L2Staking.TransactOpts, remove) } -// RemoveStakers is a paid mutator transaction binding the contract method 0xcce6cf9f. +// RemoveStakers is a paid mutator transaction binding the contract method 0x0be67fcc. // -// 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) +// Solidity: function removeStakers(address[] remove) returns() +func (_L2Staking *L2StakingTransactorSession) RemoveStakers(remove []common.Address) (*types.Transaction, error) { + return _L2Staking.Contract.RemoveStakers(&_L2Staking.TransactOpts, 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 c2af631bf..9488720ab 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)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\"}}}" +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\"}}}" var L2StakingStorageLayout = new(solc.StorageLayout) -var L2StakingDeployedBin = "0x608060405234801561000f575f80fd5b50600436106102ec575f3560e01c8063746c8ae111610192578063affed0e0116100e8578063e10911b111610093578063f2fde38b1161006e578063f2fde38b146106f6578063fad99f9814610709578063fc6facc614610711575f80fd5b8063e10911b1146106c5578063ed70b343146106cd578063f0261bc2146106ed575f80fd5b8063cce6cf9f116100c3578063cce6cf9f1461066a578063d31d83d91461067d578063d55771411461069e575f80fd5b8063affed0e014610618578063b5d2e0dc14610621578063c64814dd14610640575f80fd5b80638da5cb5b1161014857806391bd43a41161012357806391bd43a4146105c5578063927ede2d146105e457806396ab994d1461060b575f80fd5b80638da5cb5b1461055e5780638e21d5fb1461057c5780639168ae72146105a3575f80fd5b80637b05afb5116101785780637b05afb5146104f5578063831cfb581461051457806384d7d1d41461053b575f80fd5b8063746c8ae1146104e557806376671808146104ed575f80fd5b80633b8024211161024757806343352d61116101fd57806346cdc18a116101d857806346cdc18a146104c25780637046529b146104ca578063715018a6146104dd575f80fd5b806343352d6114610494578063439162b51461049c578063459598a2146104af575f80fd5b80633cb747bf1161022d5780633cb747bf146104135780633d9353fe1461045a57806340b5c83714610481575f80fd5b80633b802421146103f75780633c323a1b14610400575f80fd5b8063174e31c4116102a75780632e787be3116102825780632e787be3146103bb57806330158eea146103c45780633385ccc2146103e4575f80fd5b8063174e31c41461038c57806319fac8fd1461039f5780632cc138be146103b2575f80fd5b80630eb573af116102d75780630eb573af1461032b5780630f3b70591461033e57806312a3e94714610383575f80fd5b806243b758146102f05780629c6f0c14610316575b5f80fd5b6103036102fe36600461521e565b610724565b6040519081526020015b60405180910390f35b610329610324366004615239565b610757565b005b610329610339366004615283565b6109a8565b61035161034c36600461529a565b610ad5565b6040805173ffffffffffffffffffffffffffffffffffffffff909416845260208401929092529082015260600161030d565b610303609a5481565b61032961039a36600461529a565b610b2a565b6103296103ad366004615283565b610ce3565b61030360985481565b61030360995481565b6103d76103d236600461530c565b610e39565b60405161030d91906153ac565b6103296103f236600461521e565b6110a1565b610303609c5481565b61032961040e36600461529a565b61181a565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161030d565b6104357f000000000000000000000000000000000000000000000000000000000000000081565b61032961048f366004615283565b61202d565b6103d7612174565b6103296104aa36600461545f565b6123d1565b6104356104bd366004615283565b6129dd565b609d54610303565b6103296104d8366004615239565b612a12565b610329612bba565b610329612bcd565b610303612f80565b61030361050336600461521e565b60a06020525f908152604090205481565b6104357f000000000000000000000000000000000000000000000000000000000000000081565b61054e61054936600461521e565b61300e565b604051901515815260200161030d565b60335473ffffffffffffffffffffffffffffffffffffffff16610435565b6104357f000000000000000000000000000000000000000000000000000000000000000081565b6105b66105b136600461521e565b613045565b60405161030d939291906154cd565b6103036105d336600461521e565b60a16020525f908152604090205481565b6104357f000000000000000000000000000000000000000000000000000000000000000081565b60975461054e9060ff1681565b61030360a55481565b61030361062f36600461521e565b609e6020525f908152604090205481565b61030361064e36600461550a565b60a360209081525f928352604080842090915290825290205481565b610329610678366004615536565b613104565b61069061068b36600461557e565b6137d0565b60405161030d929190615600565b6104357f000000000000000000000000000000000000000000000000000000000000000081565b6103296139ac565b6106e06106db36600461521e565b613df4565b60405161030d9190615620565b610303609b5481565b61032961070436600461521e565b613ea4565b610329613f58565b61032961071f366004615536565b614020565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260a260205260408120610751906144fd565b92915050565b61075f614506565b8160a55481146107d0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f696e76616c6964206e6f6e63650000000000000000000000000000000000000060448201526064015b60405180910390fd5b6107db8360016156bb565b60a555609e5f6107ee602085018561521e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20545f036108cf57609d61083d602084018461521e565b81546001810183555f928352602080842090910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9390931692909217909155609d5491609e916108a89086018661521e565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f20555b81609f5f6108e0602084018461521e565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f2061090f82826157eb565b5061091f9050602083018361521e565b73ffffffffffffffffffffffffffffffffffffffff167f058ecb29c230cd5df283c89e996187ed521393fe4546cd1b097921c4b2de293d602084013561096860408601866156ce565b604051610977939291906159a8565b60405180910390a260975460ff161580156109965750609954609d5411155b156109a3576109a3614587565b505050565b6109b0614506565b5f811180156109c157506099548114155b610a4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f696e76616c6964206e65772073657175656e63657220736574206d617820736960448201527f7a6500000000000000000000000000000000000000000000000000000000000060648201526084016107c7565b609980549082905560408051828152602081018490527f98b982a120d9be7d9c68d85a1aed8158d1d52e517175bfb3eb4280692f19b1ed910160405180910390a16097545f9060ff16610aa257609d54610aa6565b609c545b90505f6099548210610aba57609954610abc565b815b9050609b548114610acf57610acf614587565b50505050565b60a4602052815f5260405f208181548110610aee575f80fd5b5f91825260209091206003909102018054600182015460029092015473ffffffffffffffffffffffffffffffffffffffff909116935090915083565b610b3261472e565b73ffffffffffffffffffffffffffffffffffffffff8216610c0f5773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016635cf20c7b336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018490526044015f604051808303815f87803b158015610bf4575f80fd5b505af1158015610c06573d5f803e3d5ffd5b50505050610cd5565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663996cba6883336040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff928316600482015291166024820152604481018490526064015f604051808303815f87803b158015610cbe575f80fd5b505af1158015610cd0573d5f803e3d5ffd5b505050505b610cdf6001606555565b5050565b335f908152609e6020526040902054610d58576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f6f6e6c79207374616b657220616c6c6f7765640000000000000000000000000060448201526064016107c7565b6014811115610dc3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e76616c696420636f6d6d697373696f6e000000000000000000000000000060448201526064016107c7565b335f90815260a06020526040812082905560975460ff16610de4575f610df7565b610dec612f80565b610df79060016156bb565b604080518481526020810183905291925033917f6e500db30ce535d38852e318f333e9be41a3fec6c65d234ebb06203c896db9a5910160405180910390a25050565b60605f8267ffffffffffffffff811115610e5557610e5561572f565b604051908082528060200260200182016040528015610ea157816020015b60408051606080820183525f808352602083015291810191909152815260200190600190039081610e735790505b5090505f5b83811015611099576040518060600160405280609f5f888886818110610ece57610ece6159fb565b9050602002016020810190610ee3919061521e565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409091015f908120549091168352910190609f90888886818110610f2d57610f2d6159fb565b9050602002016020810190610f42919061521e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101548152602001609f5f888886818110610f9957610f996159fb565b9050602002016020810190610fae919061521e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f206002018054610ff59061575c565b80601f01602080910402602001604051908101604052809291908181526020018280546110219061575c565b801561106c5780601f106110435761010080835404028352916020019161106c565b820191905f5260205f20905b81548152906001019060200180831161104f57829003601f168201915b5050505050815250828281518110611086576110866159fb565b6020908102919091010152600101610ea6565b509392505050565b6110a961472e565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260a36020908152604080832033845290915290205461113f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f7374616b696e6720616d6f756e74206973207a65726f0000000000000000000060448201526064016107c7565b73ffffffffffffffffffffffffffffffffffffffff81165f908152609e60205260408120546097549015919060ff16611178575f61118b565b611180612f80565b61118b9060016156bb565b6097549091505f9060ff1680156111a0575082155b6111aa57816111b7565b609a546111b790836156bb565b6040805160608101825273ffffffffffffffffffffffffffffffffffffffff8781168083525f81815260a36020908152858220338084528183528784208054848901908152888a018b815283875260a486528a87208054600180820183559189528789208c5160039092020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001691909b16178a558251908a015551600290980197909755908452908252829055925191815260a190925292812080549495509193611286908490615a28565b909155505073ffffffffffffffffffffffffffffffffffffffff85165f90815260a2602052604090206112b990336147a8565b5073ffffffffffffffffffffffffffffffffffffffff85165f908152609e6020526040902054841580156112ef575060975460ff165b80156112fc5750609c5481105b156115e85773ffffffffffffffffffffffffffffffffffffffff86165f908152609e602052604081205461133290600190615a28565b90505b6001609c546113449190615a28565b8110156115e65760a15f609d8381548110611361576113616159fb565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040018120549060a190609d6113a38560016156bb565b815481106113b3576113b36159fb565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205411156115de575f609d82815481106113fe576113fe6159fb565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff169050609d61142e8360016156bb565b8154811061143e5761143e6159fb565b5f91825260209091200154609d805473ffffffffffffffffffffffffffffffffffffffff9092169184908110611476576114766159fb565b5f91825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905580609d6114d18460016156bb565b815481106114e1576114e16159fb565b5f91825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169190911790556115398260016156bb565b609e5f609d858154811061154f5761154f6159fb565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205561158b8260026156bb565b609e5f609d61159b8660016156bb565b815481106115ab576115ab6159fb565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902055505b600101611335565b505b84158015611618575073ffffffffffffffffffffffffffffffffffffffff86165f90815260a16020526040902054155b15611635576001609c5f82825461162f9190615a28565b90915550505b73ffffffffffffffffffffffffffffffffffffffff8681165f81815260a160205260408082205481517f7f683ee30000000000000000000000000000000000000000000000000000000081526004810194909452336024850152604484018990526064840152517f000000000000000000000000000000000000000000000000000000000000000090931692637f683ee392608480820193929182900301818387803b1580156116e3575f80fd5b505af11580156116f5573d5f803e3d5ffd5b505050506117003390565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f92039db29d8c0a1aa1433fe109c69488c8c5e51b23c9de7d303ad80c1fef778c84602001518787604051611775939291909283526020830191909152604082015260600190565b60405180910390a38415801561178d575060975460ff165b801561179b5750609b548111155b80156117fb5750609b5473ffffffffffffffffffffffffffffffffffffffff87165f908152609e602052604090205411806117fb5750609c5473ffffffffffffffffffffffffffffffffffffffff87165f908152609e6020526040902054115b1561180857611808614587565b50505050506118176001606555565b50565b73ffffffffffffffffffffffffffffffffffffffff82165f908152609e602052604090205482906118a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b65720000000000000000000000000000000000000000000060448201526064016107c7565b6118af61472e565b5f8211611918576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e76616c6964207374616b6520616d6f756e7400000000000000000000000060448201526064016107c7565b61192233846147d0565b15611989576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f756e64656c65676174696f6e20756e636c61696d65640000000000000000000060448201526064016107c7565b73ffffffffffffffffffffffffffffffffffffffff83165f90815260a360209081526040808320338452909152902054611a2e576119c73384614880565b15611a2e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f72657761726420756e636c61696d65640000000000000000000000000000000060448201526064016107c7565b73ffffffffffffffffffffffffffffffffffffffff83165f90815260a1602052604081208054849290611a629084906156bb565b909155505073ffffffffffffffffffffffffffffffffffffffff83165f90815260a36020908152604080832033845290915281208054849290611aa69084906156bb565b909155505073ffffffffffffffffffffffffffffffffffffffff83165f90815260a260205260409020611ad99033614942565b5073ffffffffffffffffffffffffffffffffffffffff83165f90815260a16020526040902054829003611b1e576001609c5f828254611b1891906156bb565b90915550505b73ffffffffffffffffffffffffffffffffffffffff83165f908152609e602052604090205460975460ff168015611b555750600181115b15611e35575f611b66600183615a28565b90505b8015611e335760a15f609d611b7f600185615a28565b81548110611b8f57611b8f6159fb565b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460a15f609d8481548110611c0757611c076159fb565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040019020541115611e21575f609d611c4c600184615a28565b81548110611c5c57611c5c6159fb565b5f91825260209091200154609d805473ffffffffffffffffffffffffffffffffffffffff90921692509083908110611c9657611c966159fb565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16609d611cc4600185615a28565b81548110611cd457611cd46159fb565b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080609d8381548110611d2d57611d2d6159fb565b5f918252602082200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff93909316929092179091558290609e90609d611d8c600185615a28565b81548110611d9c57611d9c6159fb565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902055611dd88260016156bb565b609e5f609d8581548110611dee57611dee6159fb565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902055505b80611e2b81615a3b565b915050611b69565b505b6097545f9060ff16611e47575f611e5a565b611e4f612f80565b611e5a9060016156bb565b73ffffffffffffffffffffffffffffffffffffffff86165f81815260a36020908152604080832033808552908352928190205481519081529182018990528181018590525193945090927fc4ad67bad2c1f682946a406d840f1b273f5cd5a53fcc1a03d078d92bfa2e07d09181900360600190a373ffffffffffffffffffffffffffffffffffffffff8581165f81815260a360209081526040808320338085528184528285205486865260a18552838620548287529290945282517fb809af0f000000000000000000000000000000000000000000000000000000008152600481019690965260248601526044850187905260648501839052608485015290881460a4840152517f00000000000000000000000000000000000000000000000000000000000000009093169263b809af0f9260c480820193929182900301818387803b158015611fa8575f80fd5b505af1158015611fba573d5f803e3d5ffd5b50505050611fcf611fc83390565b3086614963565b60975460ff168015611fe25750609b5482115b8015612014575060995473ffffffffffffffffffffffffffffffffffffffff86165f908152609e602052604090205411155b1561202157612021614587565b50506109a36001606555565b612035614506565b60975460ff16156120a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f72657761726420616c726561647920737461727465640000000000000000000060448201526064016107c7565b42811180156120bb57506120b96201518082615a9c565b155b80156120c957506098548114155b61212f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f696e76616c6964207265776172642073746172742074696d650000000000000060448201526064016107c7565b609880549082905560408051828152602081018490527f91c38708087fb4ba51bd0e6a106cc1fbaf340479a2e81d18f2341e8c78f97555910160405180910390a15050565b609d546060905f9067ffffffffffffffff8111156121945761219461572f565b6040519080825280602002602001820160405280156121e057816020015b60408051606080820183525f8083526020830152918101919091528152602001906001900390816121b25790505b5090505f5b609d548110156123cb576040518060600160405280609f5f609d8581548110612210576122106159fb565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff90811684528382019490945260409092018120549092168352609d80549390910192609f92919086908110612269576122696159fb565b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101548152602001609f5f609d85815481106122e9576122e96159fb565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902060020180546123279061575c565b80601f01602080910402602001604051908101604052809291908181526020018280546123539061575c565b801561239e5780601f106123755761010080835404028352916020019161239e565b820191905f5260205f20905b81548152906001019060200180831161238157829003601f168201915b50505050508152508282815181106123b8576123b86159fb565b60209081029190910101526001016121e5565b50919050565b5f54610100900460ff16158080156123ef57505f54600160ff909116105b806124085750303b15801561240857505f5460ff166001145b612494576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016107c7565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156124f0575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff871661256d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c6964206f776e65722061646472657373000000000000000000000060448201526064016107c7565b5f86116125fc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f73657175656e6365727353697a65206d7573742067726561746572207468616e60448201527f203000000000000000000000000000000000000000000000000000000000000060648201526084016107c7565b5f8511612665576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f696e76616c696420756e64656c65676174654c6f636b45706f6368730000000060448201526064016107c7565b428411801561267e575061267c6201518085615a9c565b155b6126e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f696e76616c6964207265776172642073746172742074696d650000000000000060448201526064016107c7565b8161274b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f696e76616c696420696e697469616c207374616b65727300000000000000000060448201526064016107c7565b61275487614c0a565b61275c614c80565b6099869055609a8590556098849055609b8290555f5b609b548110156128ff5783838281811061278e5761278e6159fb565b90506020028101906127a09190615aaf565b609f5f8686858181106127b5576127b56159fb565b90506020028101906127c79190615aaf565b6127d590602081019061521e565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f2061280482826157eb565b905050609d84848381811061281b5761281b6159fb565b905060200281019061282d9190615aaf565b61283b90602081019061521e565b8154600180820184555f93845260209093200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905561289c9082906156bb565b609e5f8686858181106128b1576128b16159fb565b90506020028101906128c39190615aaf565b6128d190602081019061521e565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f2055600101612772565b50604080515f8152602081018890527f98b982a120d9be7d9c68d85a1aed8158d1d52e517175bfb3eb4280692f19b1ed910160405180910390a1604080515f8152602081018690527f91c38708087fb4ba51bd0e6a106cc1fbaf340479a2e81d18f2341e8c78f97555910160405180910390a180156129d4575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b609d81815481106129ec575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016148015612b2e57507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015612af2573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612b169190615aeb565b73ffffffffffffffffffffffffffffffffffffffff16145b61075f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f7374616b696e673a206f6e6c79206f74686572207374616b696e6720636f6e7460448201527f7261637420616c6c6f776564000000000000000000000000000000000000000060648201526084016107c7565b612bc2614506565b612bcb5f614c0a565b565b612bd5614506565b609854421015612c66576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f63616e2774207374617274206265666f7265207265776172642073746172742060448201527f74696d650000000000000000000000000000000000000000000000000000000060648201526084016107c7565b5f609c5411612cd1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f6e6f6e652063616e64696461746500000000000000000000000000000000000060448201526064016107c7565b609780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091555b609d54811015612f10575f5b81811015612f075760a15f609d8381548110612d2a57612d2a6159fb565b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460a15f609d8581548110612da257612da26159fb565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040019020541115612eff575f609d8281548110612ded57612ded6159fb565b5f91825260209091200154609d805473ffffffffffffffffffffffffffffffffffffffff90921692509084908110612e2757612e276159fb565b5f91825260209091200154609d805473ffffffffffffffffffffffffffffffffffffffff9092169184908110612e5f57612e5f6159fb565b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080609d8481548110612eb857612eb86159fb565b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b600101612d0c565b50600101612d00565b505f5b609d54811015612f7757612f288160016156bb565b609e5f609d8481548110612f3e57612f3e6159fb565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902055600101612f13565b50612bcb614587565b5f609854421015612fed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f726577617264206973206e6f742073746172746564207965740000000000000060448201526064016107c7565b6201518060985442612fff9190615a28565b6130099190615b06565b905090565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260a3602090815260408083203384529091528120541515610751565b609f6020525f908152604090208054600182015460028301805473ffffffffffffffffffffffffffffffffffffffff9093169391926130839061575c565b80601f01602080910402602001604051908101604052809291908181526020018280546130af9061575c565b80156130fa5780601f106130d1576101008083540402835291602001916130fa565b820191905f5260205f20905b8154815290600101906020018083116130dd57829003601f168201915b5050505050905083565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614801561322057507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa1580156131e4573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906132089190615aeb565b73ffffffffffffffffffffffffffffffffffffffff16145b6132ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f7374616b696e673a206f6e6c79206f74686572207374616b696e6720636f6e7460448201527f7261637420616c6c6f776564000000000000000000000000000000000000000060648201526084016107c7565b8260a5548114613318576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f696e76616c6964206e6f6e63650000000000000000000000000000000000000060448201526064016107c7565b6133238460016156bb565b60a5555f805b8381101561378157609b54609e5f878785818110613349576133496159fb565b905060200201602081019061335e919061521e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054116133a257600191505b5f609e5f8787858181106133b8576133b86159fb565b90506020020160208101906133cd919061521e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205411156136eb575f6001609e5f888886818110613425576134256159fb565b905060200201602081019061343a919061521e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205461347e9190615a28565b90505b609d5461349090600190615a28565b81101561359657609d6134a48260016156bb565b815481106134b4576134b46159fb565b5f91825260209091200154609d805473ffffffffffffffffffffffffffffffffffffffff90921691839081106134ec576134ec6159fb565b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001609e5f609d8481548110613549576135496159fb565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400181208054909190613589908490615a28565b9091555050600101613481565b50609d8054806135a8576135a8615b19565b5f8281526020812082017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055909101909155609e90868684818110613617576136176159fb565b905060200201602081019061362c919061521e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f90555f60a15f87878581811061367e5761367e6159fb565b9050602002016020810190613693919061521e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205411156136eb576001609c5f8282546136e59190615a28565b90915550505b609f5f868684818110613700576137006159fb565b9050602002016020810190613715919061521e565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f90812080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168155600181018290559061377760028301826151b3565b5050600101613329565b507f3511bf213f9290ba907e91e12a43e8471251e1879580ae5509292a3514c23f6184846040516137b3929190615b46565b60405180910390a180156137c9576137c9614587565b5050505050565b5f60605f841161383c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f696e76616c696420706167652073697a6500000000000000000000000000000060448201526064016107c7565b73ffffffffffffffffffffffffffffffffffffffff85165f90815260a260205260409020613869906144fd565b91508367ffffffffffffffff8111156138845761388461572f565b6040519080825280602002602001820160405280156138ad578160200160208202803683370190505b5090505f6138bb8486615ba0565b90505f60016138ca86826156bb565b6138d49088615ba0565b6138de9190615a28565b90506138eb600185615a28565b811115613900576138fd600185615a28565b90505b815f5b8282116139a0576139448261391781615bb7565b73ffffffffffffffffffffffffffffffffffffffff8c165f90815260a26020526040902090945090614d1e565b858261394f81615bb7565b935081518110613961576139616159fb565b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050613903565b50505050935093915050565b6139b461472e565b335f90815260a46020526040812054815b81811015613d745760975460ff161580613a1557506139e2612f80565b335f90815260a460205260409020805483908110613a0257613a026159fb565b905f5260205f2090600302016002015411155b15613d6257335f90815260a460205260409020805482908110613a3a57613a3a6159fb565b905f5260205f2090600302016001015483613a5591906156bb565b335f90815260a4602052604081208054929550909183908110613a7a57613a7a6159fb565b5f918252602082206003909102015473ffffffffffffffffffffffffffffffffffffffff16915060a481613aab3390565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208381548110613af557613af56159fb565b905f5260205f2090600302016002015490505f60a45f613b123390565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208481548110613b5c57613b5c6159fb565b905f5260205f209060030201600101549050600185613b7b9190615a28565b841015613c7257335f90815260a460205260409020613b9b600187615a28565b81548110613bab57613bab6159fb565b905f5260205f20906003020160a45f613bc13390565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208581548110613c0b57613c0b6159fb565b5f9182526020909120825460039092020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091178155600180830154908201556002918201549101555b335f90815260a460205260409020805480613c8f57613c8f615b19565b5f8281526020812060037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019283020180547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560018181018390556002909101919091559155613d049086615a28565b6040805184815260208101849052919650339173ffffffffffffffffffffffffffffffffffffffff8616917f921046659ea3b3b3f8e8fefd2bece3121b2d929ead94c696a75beedee477fdb6910160405180910390a35050506139c5565b613d6d8160016156bb565b90506139c5565b505f8211613dde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f6e6f204d6f72706820746f6b656e20746f20636c61696d00000000000000000060448201526064016107c7565b613de83383614d29565b5050612bcb6001606555565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260a460209081526040808320805482518185028101850190935280835260609492939192909184015b82821015613e99575f8481526020908190206040805160608101825260038602909201805473ffffffffffffffffffffffffffffffffffffffff16835260018082015484860152600290910154918301919091529083529092019101613e38565b505050509050919050565b613eac614506565b73ffffffffffffffffffffffffffffffffffffffff8116613f4f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016107c7565b61181781614c0a565b613f6061472e565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663ac2ac640336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024015f604051808303815f87803b158015614000575f80fd5b505af1158015614012573d5f803e3d5ffd5b50505050612bcb6001606555565b614028614506565b8260a5548114614094576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f696e76616c6964206e6f6e63650000000000000000000000000000000000000060448201526064016107c7565b61409f8460016156bb565b60a5555f805b8381101561378157609b54609e5f8787858181106140c5576140c56159fb565b90506020020160208101906140da919061521e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541161411e57600191505b5f609e5f878785818110614134576141346159fb565b9050602002016020810190614149919061521e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541115614467575f6001609e5f8888868181106141a1576141a16159fb565b90506020020160208101906141b6919061521e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20546141fa9190615a28565b90505b609d5461420c90600190615a28565b81101561431257609d6142208260016156bb565b81548110614230576142306159fb565b5f91825260209091200154609d805473ffffffffffffffffffffffffffffffffffffffff9092169183908110614268576142686159fb565b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001609e5f609d84815481106142c5576142c56159fb565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400181208054909190614305908490615a28565b90915550506001016141fd565b50609d80548061432457614324615b19565b5f8281526020812082017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055909101909155609e90868684818110614393576143936159fb565b90506020020160208101906143a8919061521e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f90555f60a15f8787858181106143fa576143fa6159fb565b905060200201602081019061440f919061521e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541115614467576001609c5f8282546144619190615a28565b90915550505b609f5f86868481811061447c5761447c6159fb565b9050602002016020810190614491919061521e565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f90812080547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560018101829055906144f360028301826151b3565b50506001016140a5565b5f610751825490565b60335473ffffffffffffffffffffffffffffffffffffffff163314612bcb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016107c7565b60995460975460ff16156145ab57609954609c5410156145a65750609c545b6145bc565b609954609d5410156145bc5750609d545b5f8167ffffffffffffffff8111156145d6576145d661572f565b6040519080825280602002602001820160405280156145ff578160200160208202803683370190505b5090505f5b8281101561468657609d818154811061461f5761461f6159fb565b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828281518110614659576146596159fb565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152600101614604565b506040517f9b8201a400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639b8201a4906146f9908490600401615bee565b5f604051808303815f87803b158015614710575f80fd5b505af1158015614722573d5f803e3d5ffd5b50509151609b55505050565b60026065540361479a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107c7565b6002606555565b6001606555565b5f6147c98373ffffffffffffffffffffffffffffffffffffffff8416614fc8565b9392505050565b5f805b73ffffffffffffffffffffffffffffffffffffffff84165f90815260a460205260409020548110156148775773ffffffffffffffffffffffffffffffffffffffff8481165f90815260a4602052604090208054918516918390811061483a5761483a6159fb565b5f91825260209091206003909102015473ffffffffffffffffffffffffffffffffffffffff160361486f576001915050610751565b6001016147d3565b505f9392505050565b6040517fde6ac93300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015282811660248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063de6ac93390604401602060405180830381865afa158015614916573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061493a9190615c00565b159392505050565b5f6147c98373ffffffffffffffffffffffffffffffffffffffff84166150ab565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa1580156149f1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614a159190615c1f565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528581166024830152604482018590529192507f0000000000000000000000000000000000000000000000000000000000000000909116906323b872dd906064016020604051808303815f875af1158015614ab4573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ad89190615c00565b506040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015614b67573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614b8b9190615c1f565b90505f83118015614ba4575082614ba28383615a28565b145b6137c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6d6f72706820746f6b656e207472616e73666572206661696c6564000000000060448201526064016107c7565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff16614d16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107c7565b612bcb6150f7565b5f6147c9838361518d565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015614db7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614ddb9190615c1f565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303815f875af1158015614e72573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614e969190615c00565b506040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015614f25573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614f499190615c1f565b90505f83118015614f62575082614f608383615a28565b145b610acf576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6d6f72706820746f6b656e207472616e73666572206661696c6564000000000060448201526064016107c7565b5f81815260018301602052604081205480156150a2575f614fea600183615a28565b85549091505f90614ffd90600190615a28565b905081811461505c575f865f01828154811061501b5761501b6159fb565b905f5260205f200154905080875f01848154811061503b5761503b6159fb565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061506d5761506d615b19565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610751565b5f915050610751565b5f8181526001830160205260408120546150f057508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610751565b505f610751565b5f54610100900460ff166147a1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016107c7565b5f825f0182815481106151a2576151a26159fb565b905f5260205f200154905092915050565b5080546151bf9061575c565b5f825580601f106151ce575050565b601f0160209004905f5260205f209081019061181791905b808211156151f9575f81556001016151e6565b5090565b73ffffffffffffffffffffffffffffffffffffffff81168114611817575f80fd5b5f6020828403121561522e575f80fd5b81356147c9816151fd565b5f806040838503121561524a575f80fd5b82359150602083013567ffffffffffffffff811115615267575f80fd5b830160608186031215615278575f80fd5b809150509250929050565b5f60208284031215615293575f80fd5b5035919050565b5f80604083850312156152ab575f80fd5b82356152b6816151fd565b946020939093013593505050565b5f8083601f8401126152d4575f80fd5b50813567ffffffffffffffff8111156152eb575f80fd5b6020830191508360208260051b8501011115615305575f80fd5b9250929050565b5f806020838503121561531d575f80fd5b823567ffffffffffffffff811115615333575f80fd5b61533f858286016152c4565b90969095509350505050565b5f81518084525f5b8181101561536f57602081850181015186830182015201615353565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b83811015615451578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00185528151805173ffffffffffffffffffffffffffffffffffffffff1684528781015188850152860151606087850181905261543d8186018361534b565b9689019694505050908601906001016153d3565b509098975050505050505050565b5f805f805f8060a08789031215615474575f80fd5b863561547f816151fd565b9550602087013594506040870135935060608701359250608087013567ffffffffffffffff8111156154af575f80fd5b6154bb89828a016152c4565b979a9699509497509295939492505050565b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f615501606083018461534b565b95945050505050565b5f806040838503121561551b575f80fd5b8235615526816151fd565b91506020830135615278816151fd565b5f805f60408486031215615548575f80fd5b83359250602084013567ffffffffffffffff811115615565575f80fd5b615571868287016152c4565b9497909650939450505050565b5f805f60608486031215615590575f80fd5b833561559b816151fd565b95602085013595506040909401359392505050565b5f815180845260208085019450602084015f5b838110156155f557815173ffffffffffffffffffffffffffffffffffffffff16875295820195908201906001016155c3565b509495945050505050565b828152604060208201525f61561860408301846155b0565b949350505050565b602080825282518282018190525f919060409081850190868401855b82811015615681578151805173ffffffffffffffffffffffffffffffffffffffff1685528681015187860152850151858501526060909301929085019060010161563c565b5091979650505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156107515761075161568e565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615701575f80fd5b83018035915067ffffffffffffffff82111561571b575f80fd5b602001915036819003821315615305575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b600181811c9082168061577057607f821691505b6020821081036123cb577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b601f8211156109a357805f5260205f20601f840160051c810160208510156157cc5750805b601f840160051c820191505b818110156137c9575f81556001016157d8565b81356157f6816151fd565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550600160208084013560018401556002830160408501357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe186360301811261587a575f80fd5b8501803567ffffffffffffffff811115615892575f80fd5b80360384830113156158a2575f80fd5b6158b6816158b0855461575c565b856157a7565b5f601f821160018114615908575f83156158d257508382018601355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600385901b1c1916600184901b17855561599d565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08516915b8281101561595457868501890135825593880193908901908801615935565b5084821015615991577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88660031b161c198885880101351681555b505060018360011b0185555b505050505050505050565b83815260406020820152816040820152818360608301375f818301606090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010192915050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b818103818111156107515761075161568e565b5f81615a4957615a4961568e565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f82615aaa57615aaa615a6f565b500690565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112615ae1575f80fd5b9190910192915050565b5f60208284031215615afb575f80fd5b81516147c9816151fd565b5f82615b1457615b14615a6f565b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b60208082528181018390525f908460408401835b86811015615b95578235615b6d816151fd565b73ffffffffffffffffffffffffffffffffffffffff1682529183019190830190600101615b5a565b509695505050505050565b80820281158282048414176107515761075161568e565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203615be757615be761568e565b5060010190565b602081525f6147c960208301846155b0565b5f60208284031215615c10575f80fd5b815180151581146147c9575f80fd5b5f60208284031215615c2f575f80fd5b505191905056fea164736f6c6343000818000a" +var L2StakingDeployedBin = "0x608060405234801561000f575f80fd5b50600436106102cc575f3560e01c8063715018a61161017c578063927ede2d116100dd578063d557714111610093578063f0261bc21161006e578063f0261bc2146106b1578063f2fde38b146106ba578063fad99f98146106cd575f80fd5b8063d557714114610662578063e10911b114610689578063ed70b34314610691575f80fd5b8063b5d2e0dc116100c3578063b5d2e0dc146105f8578063c64814dd14610617578063d31d83d914610641575f80fd5b8063927ede2d146105c457806396ab994d146105eb575f80fd5b806384d7d1d4116101325780638e21d5fb116101185780638e21d5fb1461055c5780639168ae721461058357806391bd43a4146105a5575f80fd5b806384d7d1d41461051b5780638da5cb5b1461053e575f80fd5b8063766718081161016257806376671808146104cd5780637b05afb5146104d5578063831cfb58146104f4575f80fd5b8063715018a6146104bd578063746c8ae1146104c5575f80fd5b80633385ccc21161023157806340b5c837116101e7578063459598a2116101c2578063459598a21461048f57806346cdc18a146104a25780636d454d51146104aa575f80fd5b806340b5c8371461046157806343352d6114610474578063439162b51461047c575f80fd5b80633c323a1b116102175780633c323a1b146103e05780633cb747bf146103f35780633d9353fe1461043a575f80fd5b80633385ccc2146103c45780633b802421146103d7575f80fd5b8063174e31c4116102865780632cc138be1161026c5780632cc138be146103925780632e787be31461039b57806330158eea146103a4575f80fd5b8063174e31c41461036c57806319fac8fd1461037f575f80fd5b80630eb573af116102b65780630eb573af1461030b5780630f3b70591461031e57806312a3e94714610363575f80fd5b806243b758146102d05780630be67fcc146102f6575b5f80fd5b6102e36102de366004614bd5565b6106d5565b6040519081526020015b60405180910390f35b610309610304366004614c38565b610708565b005b610309610319366004614c77565b610d5d565b61033161032c366004614c8e565b610e8a565b6040805173ffffffffffffffffffffffffffffffffffffffff90941684526020840192909252908201526060016102ed565b6102e3609a5481565b61030961037a366004614c8e565b610edf565b61030961038d366004614c77565b611098565b6102e360985481565b6102e360995481565b6103b76103b2366004614c38565b6111ee565b6040516102ed9190614d19565b6103096103d2366004614bd5565b611456565b6102e3609c5481565b6103096103ee366004614c8e565b611bcf565b7f00000000000000000000000000000000000000000000000000000000000000005b60405173ffffffffffffffffffffffffffffffffffffffff90911681526020016102ed565b6104157f000000000000000000000000000000000000000000000000000000000000000081565b61030961046f366004614c77565b6123e2565b6103b7612529565b61030961048a366004614dcc565b612786565b61041561049d366004614c77565b612d92565b609d546102e3565b6103096104b8366004614e3a565b612dc7565b610309613134565b610309613147565b6102e36134fa565b6102e36104e3366004614bd5565b60a06020525f908152604090205481565b6104157f000000000000000000000000000000000000000000000000000000000000000081565b61052e610529366004614bd5565b613588565b60405190151581526020016102ed565b60335473ffffffffffffffffffffffffffffffffffffffff16610415565b6104157f000000000000000000000000000000000000000000000000000000000000000081565b610596610591366004614bd5565b6135bf565b6040516102ed93929190614e71565b6102e36105b3366004614bd5565b60a16020525f908152604090205481565b6104157f000000000000000000000000000000000000000000000000000000000000000081565b60975461052e9060ff1681565b6102e3610606366004614bd5565b609e6020525f908152604090205481565b6102e3610625366004614eae565b60a360209081525f928352604080842090915290825290205481565b61065461064f366004614ee5565b61367e565b6040516102ed929190614f67565b6104157f000000000000000000000000000000000000000000000000000000000000000081565b610309613839565b6106a461069f366004614bd5565b613c81565b6040516102ed9190614f87565b6102e3609b5481565b6103096106c8366004614bd5565b613d31565b610309613de5565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260a26020526040812061070290613ead565b92915050565b3373ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001614801561082457507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa1580156107e8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061080c9190614ff5565b73ffffffffffffffffffffffffffffffffffffffff16145b6108b5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f7374616b696e673a206f6e6c79206f74686572207374616b696e6720636f6e7460448201527f7261637420616c6c6f776564000000000000000000000000000000000000000060648201526084015b60405180910390fd5b5f805b82811015610d1057609b54609e5f8686858181106108d8576108d8615010565b90506020020160208101906108ed9190614bd5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541161093157600191505b5f609e5f86868581811061094757610947615010565b905060200201602081019061095c9190614bd5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541115610c7a575f6001609e5f8787868181106109b4576109b4615010565b90506020020160208101906109c99190614bd5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2054610a0d919061506a565b90505b609d54610a1f9060019061506a565b811015610b2557609d610a3382600161507d565b81548110610a4357610a43615010565b5f91825260209091200154609d805473ffffffffffffffffffffffffffffffffffffffff9092169183908110610a7b57610a7b615010565b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001609e5f609d8481548110610ad857610ad8615010565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400181208054909190610b1890849061506a565b9091555050600101610a10565b50609d805480610b3757610b37615090565b5f8281526020812082017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90810180547fffffffffffffffffffffffff0000000000000000000000000000000000000000169055909101909155609e90858584818110610ba657610ba6615010565b9050602002016020810190610bbb9190614bd5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f90555f60a15f868685818110610c0d57610c0d615010565b9050602002016020810190610c229190614bd5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20541115610c7a576001609c5f828254610c74919061506a565b90915550505b609f5f858584818110610c8f57610c8f615010565b9050602002016020810190610ca49190614bd5565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f90812080547fffffffffffffffffffffffff00000000000000000000000000000000000000001681556001810182905590610d066002830182614b6a565b50506001016108b8565b507f3511bf213f9290ba907e91e12a43e8471251e1879580ae5509292a3514c23f618383604051610d429291906150bd565b60405180910390a18015610d5857610d58613eb6565b505050565b610d6561405d565b5f81118015610d7657506099548114155b610e02576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f696e76616c6964206e65772073657175656e63657220736574206d617820736960448201527f7a6500000000000000000000000000000000000000000000000000000000000060648201526084016108ac565b609980549082905560408051828152602081018490527f98b982a120d9be7d9c68d85a1aed8158d1d52e517175bfb3eb4280692f19b1ed910160405180910390a16097545f9060ff16610e5757609d54610e5b565b609c545b90505f6099548210610e6f57609954610e71565b815b9050609b548114610e8457610e84613eb6565b50505050565b60a4602052815f5260405f208181548110610ea3575f80fd5b5f91825260209091206003909102018054600182015460029092015473ffffffffffffffffffffffffffffffffffffffff909116935090915083565b610ee76140de565b73ffffffffffffffffffffffffffffffffffffffff8216610fc45773ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016635cf20c7b336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602481018490526044015f604051808303815f87803b158015610fa9575f80fd5b505af1158015610fbb573d5f803e3d5ffd5b5050505061108a565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663996cba6883336040517fffffffff0000000000000000000000000000000000000000000000000000000060e085901b16815273ffffffffffffffffffffffffffffffffffffffff928316600482015291166024820152604481018490526064015f604051808303815f87803b158015611073575f80fd5b505af1158015611085573d5f803e3d5ffd5b505050505b6110946001606555565b5050565b335f908152609e602052604090205461110d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f6f6e6c79207374616b657220616c6c6f7765640000000000000000000000000060448201526064016108ac565b6014811115611178576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e76616c696420636f6d6d697373696f6e000000000000000000000000000060448201526064016108ac565b335f90815260a06020526040812082905560975460ff16611199575f6111ac565b6111a16134fa565b6111ac90600161507d565b604080518481526020810183905291925033917f6e500db30ce535d38852e318f333e9be41a3fec6c65d234ebb06203c896db9a5910160405180910390a25050565b60605f8267ffffffffffffffff81111561120a5761120a615117565b60405190808252806020026020018201604052801561125657816020015b60408051606080820183525f8083526020830152918101919091528152602001906001900390816112285790505b5090505f5b8381101561144e576040518060600160405280609f5f88888681811061128357611283615010565b90506020020160208101906112989190614bd5565b73ffffffffffffffffffffffffffffffffffffffff908116825260208083019390935260409091015f908120549091168352910190609f908888868181106112e2576112e2615010565b90506020020160208101906112f79190614bd5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101548152602001609f5f88888681811061134e5761134e615010565b90506020020160208101906113639190614bd5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2060020180546113aa90615144565b80601f01602080910402602001604051908101604052809291908181526020018280546113d690615144565b80156114215780601f106113f857610100808354040283529160200191611421565b820191905f5260205f20905b81548152906001019060200180831161140457829003601f168201915b505050505081525082828151811061143b5761143b615010565b602090810291909101015260010161125b565b509392505050565b61145e6140de565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260a3602090815260408083203384529091529020546114f4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f7374616b696e6720616d6f756e74206973207a65726f0000000000000000000060448201526064016108ac565b73ffffffffffffffffffffffffffffffffffffffff81165f908152609e60205260408120546097549015919060ff1661152d575f611540565b6115356134fa565b61154090600161507d565b6097549091505f9060ff168015611555575082155b61155f578161156c565b609a5461156c908361507d565b6040805160608101825273ffffffffffffffffffffffffffffffffffffffff8781168083525f81815260a36020908152858220338084528183528784208054848901908152888a018b815283875260a486528a87208054600180820183559189528789208c5160039092020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001691909b16178a558251908a015551600290980197909755908452908252829055925191815260a19092529281208054949550919361163b90849061506a565b909155505073ffffffffffffffffffffffffffffffffffffffff85165f90815260a26020526040902061166e9033614158565b5073ffffffffffffffffffffffffffffffffffffffff85165f908152609e6020526040902054841580156116a4575060975460ff165b80156116b15750609c5481105b1561199d5773ffffffffffffffffffffffffffffffffffffffff86165f908152609e60205260408120546116e79060019061506a565b90505b6001609c546116f9919061506a565b81101561199b5760a15f609d838154811061171657611716615010565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040018120549060a190609d61175885600161507d565b8154811061176857611768615010565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040019020541115611993575f609d82815481106117b3576117b3615010565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff169050609d6117e383600161507d565b815481106117f3576117f3615010565b5f91825260209091200154609d805473ffffffffffffffffffffffffffffffffffffffff909216918490811061182b5761182b615010565b5f91825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905580609d61188684600161507d565b8154811061189657611896615010565b5f91825260209091200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff929092169190911790556118ee82600161507d565b609e5f609d858154811061190457611904615010565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205561194082600261507d565b609e5f609d61195086600161507d565b8154811061196057611960615010565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902055505b6001016116ea565b505b841580156119cd575073ffffffffffffffffffffffffffffffffffffffff86165f90815260a16020526040902054155b156119ea576001609c5f8282546119e4919061506a565b90915550505b73ffffffffffffffffffffffffffffffffffffffff8681165f81815260a160205260408082205481517f7f683ee30000000000000000000000000000000000000000000000000000000081526004810194909452336024850152604484018990526064840152517f000000000000000000000000000000000000000000000000000000000000000090931692637f683ee392608480820193929182900301818387803b158015611a98575f80fd5b505af1158015611aaa573d5f803e3d5ffd5b50505050611ab53390565b73ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167f92039db29d8c0a1aa1433fe109c69488c8c5e51b23c9de7d303ad80c1fef778c84602001518787604051611b2a939291909283526020830191909152604082015260600190565b60405180910390a384158015611b42575060975460ff165b8015611b505750609b548111155b8015611bb05750609b5473ffffffffffffffffffffffffffffffffffffffff87165f908152609e60205260409020541180611bb05750609c5473ffffffffffffffffffffffffffffffffffffffff87165f908152609e6020526040902054115b15611bbd57611bbd613eb6565b5050505050611bcc6001606555565b50565b73ffffffffffffffffffffffffffffffffffffffff82165f908152609e60205260409020548290611c5c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f6e6f74207374616b65720000000000000000000000000000000000000000000060448201526064016108ac565b611c646140de565b5f8211611ccd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e76616c6964207374616b6520616d6f756e7400000000000000000000000060448201526064016108ac565b611cd73384614180565b15611d3e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f756e64656c65676174696f6e20756e636c61696d65640000000000000000000060448201526064016108ac565b73ffffffffffffffffffffffffffffffffffffffff83165f90815260a360209081526040808320338452909152902054611de357611d7c3384614230565b15611de3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f72657761726420756e636c61696d65640000000000000000000000000000000060448201526064016108ac565b73ffffffffffffffffffffffffffffffffffffffff83165f90815260a1602052604081208054849290611e1790849061507d565b909155505073ffffffffffffffffffffffffffffffffffffffff83165f90815260a36020908152604080832033845290915281208054849290611e5b90849061507d565b909155505073ffffffffffffffffffffffffffffffffffffffff83165f90815260a260205260409020611e8e90336142f2565b5073ffffffffffffffffffffffffffffffffffffffff83165f90815260a16020526040902054829003611ed3576001609c5f828254611ecd919061507d565b90915550505b73ffffffffffffffffffffffffffffffffffffffff83165f908152609e602052604090205460975460ff168015611f0a5750600181115b156121ea575f611f1b60018361506a565b90505b80156121e85760a15f609d611f3460018561506a565b81548110611f4457611f44615010565b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460a15f609d8481548110611fbc57611fbc615010565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205411156121d6575f609d61200160018461506a565b8154811061201157612011615010565b5f91825260209091200154609d805473ffffffffffffffffffffffffffffffffffffffff9092169250908390811061204b5761204b615010565b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16609d61207960018561506a565b8154811061208957612089615010565b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080609d83815481106120e2576120e2615010565b5f918252602082200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff93909316929092179091558290609e90609d61214160018561506a565b8154811061215157612151615010565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205561218d82600161507d565b609e5f609d85815481106121a3576121a3615010565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902055505b806121e08161518f565b915050611f1e565b505b6097545f9060ff166121fc575f61220f565b6122046134fa565b61220f90600161507d565b73ffffffffffffffffffffffffffffffffffffffff86165f81815260a36020908152604080832033808552908352928190205481519081529182018990528181018590525193945090927fc4ad67bad2c1f682946a406d840f1b273f5cd5a53fcc1a03d078d92bfa2e07d09181900360600190a373ffffffffffffffffffffffffffffffffffffffff8581165f81815260a360209081526040808320338085528184528285205486865260a18552838620548287529290945282517fb809af0f000000000000000000000000000000000000000000000000000000008152600481019690965260248601526044850187905260648501839052608485015290881460a4840152517f00000000000000000000000000000000000000000000000000000000000000009093169263b809af0f9260c480820193929182900301818387803b15801561235d575f80fd5b505af115801561236f573d5f803e3d5ffd5b5050505061238461237d3390565b3086614313565b60975460ff1680156123975750609b5482115b80156123c9575060995473ffffffffffffffffffffffffffffffffffffffff86165f908152609e602052604090205411155b156123d6576123d6613eb6565b5050610d586001606555565b6123ea61405d565b60975460ff1615612457576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f72657761726420616c726561647920737461727465640000000000000000000060448201526064016108ac565b4281118015612470575061246e62015180826151f0565b155b801561247e57506098548114155b6124e4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f696e76616c6964207265776172642073746172742074696d650000000000000060448201526064016108ac565b609880549082905560408051828152602081018490527f91c38708087fb4ba51bd0e6a106cc1fbaf340479a2e81d18f2341e8c78f97555910160405180910390a15050565b609d546060905f9067ffffffffffffffff81111561254957612549615117565b60405190808252806020026020018201604052801561259557816020015b60408051606080820183525f8083526020830152918101919091528152602001906001900390816125675790505b5090505f5b609d54811015612780576040518060600160405280609f5f609d85815481106125c5576125c5615010565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff90811684528382019490945260409092018120549092168352609d80549390910192609f9291908690811061261e5761261e615010565b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20600101548152602001609f5f609d858154811061269e5761269e615010565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff168352820192909252604001902060020180546126dc90615144565b80601f016020809104026020016040519081016040528092919081815260200182805461270890615144565b80156127535780601f1061272a57610100808354040283529160200191612753565b820191905f5260205f20905b81548152906001019060200180831161273657829003601f168201915b505050505081525082828151811061276d5761276d615010565b602090810291909101015260010161259a565b50919050565b5f54610100900460ff16158080156127a457505f54600160ff909116105b806127bd5750303b1580156127bd57505f5460ff166001145b612849576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084016108ac565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156128a5575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff8716612922576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e76616c6964206f776e65722061646472657373000000000000000000000060448201526064016108ac565b5f86116129b1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602260248201527f73657175656e6365727353697a65206d7573742067726561746572207468616e60448201527f203000000000000000000000000000000000000000000000000000000000000060648201526084016108ac565b5f8511612a1a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f696e76616c696420756e64656c65676174654c6f636b45706f6368730000000060448201526064016108ac565b4284118015612a335750612a3162015180856151f0565b155b612a99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f696e76616c6964207265776172642073746172742074696d650000000000000060448201526064016108ac565b81612b00576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f696e76616c696420696e697469616c207374616b65727300000000000000000060448201526064016108ac565b612b09876145c1565b612b11614637565b6099869055609a8590556098849055609b8290555f5b609b54811015612cb457838382818110612b4357612b43615010565b9050602002810190612b559190615203565b609f5f868685818110612b6a57612b6a615010565b9050602002810190612b7c9190615203565b612b8a906020810190614bd5565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f20612bb982826152e4565b905050609d848483818110612bd057612bd0615010565b9050602002810190612be29190615203565b612bf0906020810190614bd5565b8154600180820184555f93845260209093200180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff92909216919091179055612c5190829061507d565b609e5f868685818110612c6657612c66615010565b9050602002810190612c789190615203565b612c86906020810190614bd5565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f2055600101612b27565b50604080515f8152602081018890527f98b982a120d9be7d9c68d85a1aed8158d1d52e517175bfb3eb4280692f19b1ed910160405180910390a1604080515f8152602081018690527f91c38708087fb4ba51bd0e6a106cc1fbaf340479a2e81d18f2341e8c78f97555910160405180910390a18015612d89575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b609d8181548110612da1575f80fd5b5f9182526020909120015473ffffffffffffffffffffffffffffffffffffffff16905081565b3373ffffffffffffffffffffffffffffffffffffffff7f000000000000000000000000000000000000000000000000000000000000000016148015612ee357507f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff167f000000000000000000000000000000000000000000000000000000000000000073ffffffffffffffffffffffffffffffffffffffff16636e296e456040518163ffffffff1660e01b8152600401602060405180830381865afa158015612ea7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ecb9190614ff5565b73ffffffffffffffffffffffffffffffffffffffff16145b612f6f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602c60248201527f7374616b696e673a206f6e6c79206f74686572207374616b696e6720636f6e7460448201527f7261637420616c6c6f776564000000000000000000000000000000000000000060648201526084016108ac565b609e5f612f7f6020840184614bd5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20545f0361306057609d612fce6020830183614bd5565b81546001810183555f928352602080842090910180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9390931692909217909155609d5491609e9161303990850185614bd5565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f20555b80609f5f6130716020840184614bd5565b73ffffffffffffffffffffffffffffffffffffffff16815260208101919091526040015f206130a082826152e4565b506130b090506020820182614bd5565b73ffffffffffffffffffffffffffffffffffffffff167f058ecb29c230cd5df283c89e996187ed521393fe4546cd1b097921c4b2de293d60208301356130f9604085018561523f565b604051613108939291906154a1565b60405180910390a260975460ff161580156131275750609954609d5411155b15611bcc57611bcc613eb6565b61313c61405d565b6131455f6145c1565b565b61314f61405d565b6098544210156131e0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f63616e2774207374617274206265666f7265207265776172642073746172742060448201527f74696d650000000000000000000000000000000000000000000000000000000060648201526084016108ac565b5f609c541161324b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f6e6f6e652063616e64696461746500000000000000000000000000000000000060448201526064016108ac565b609780547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660019081179091555b609d5481101561348a575f5b818110156134815760a15f609d83815481106132a4576132a4615010565b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205460a15f609d858154811061331c5761331c615010565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff1683528201929092526040019020541115613479575f609d828154811061336757613367615010565b5f91825260209091200154609d805473ffffffffffffffffffffffffffffffffffffffff909216925090849081106133a1576133a1615010565b5f91825260209091200154609d805473ffffffffffffffffffffffffffffffffffffffff90921691849081106133d9576133d9615010565b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080609d848154811061343257613432615010565b905f5260205f20015f6101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550505b600101613286565b5060010161327a565b505f5b609d548110156134f1576134a281600161507d565b609e5f609d84815481106134b8576134b8615010565b5f91825260208083209091015473ffffffffffffffffffffffffffffffffffffffff16835282019290925260400190205560010161348d565b50613145613eb6565b5f609854421015613567576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f726577617264206973206e6f742073746172746564207965740000000000000060448201526064016108ac565b6201518060985442613579919061506a565b61358391906154f4565b905090565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260a3602090815260408083203384529091528120541515610702565b609f6020525f908152604090208054600182015460028301805473ffffffffffffffffffffffffffffffffffffffff9093169391926135fd90615144565b80601f016020809104026020016040519081016040528092919081815260200182805461362990615144565b80156136745780601f1061364b57610100808354040283529160200191613674565b820191905f5260205f20905b81548152906001019060200180831161365757829003601f168201915b5050505050905083565b5f60605f84116136ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f696e76616c696420706167652073697a6500000000000000000000000000000060448201526064016108ac565b73ffffffffffffffffffffffffffffffffffffffff85165f90815260a26020526040902061371790613ead565b91508367ffffffffffffffff81111561373257613732615117565b60405190808252806020026020018201604052801561375b578160200160208202803683370190505b5090505f6137698486615507565b90505f6001613778868261507d565b6137829088615507565b61378c919061506a565b905061379960018561506a565b8111156137ae576137ab60018561506a565b90505b815b81811161382e5773ffffffffffffffffffffffffffffffffffffffff88165f90815260a2602052604090206137e590826146d5565b8482815181106137f7576137f7615010565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152806138268161551e565b9150506137b0565b505050935093915050565b6138416140de565b335f90815260a46020526040812054815b81811015613c015760975460ff1615806138a2575061386f6134fa565b335f90815260a46020526040902080548390811061388f5761388f615010565b905f5260205f2090600302016002015411155b15613bef57335f90815260a4602052604090208054829081106138c7576138c7615010565b905f5260205f20906003020160010154836138e2919061507d565b335f90815260a460205260408120805492955090918390811061390757613907615010565b5f918252602082206003909102015473ffffffffffffffffffffffffffffffffffffffff16915060a4816139383390565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f20838154811061398257613982615010565b905f5260205f2090600302016002015490505f60a45f61399f3390565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f2084815481106139e9576139e9615010565b905f5260205f209060030201600101549050600185613a08919061506a565b841015613aff57335f90815260a460205260409020613a2860018761506a565b81548110613a3857613a38615010565b905f5260205f20906003020160a45f613a4e3390565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f208581548110613a9857613a98615010565b5f9182526020909120825460039092020180547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff909216919091178155600180830154908201556002918201549101555b335f90815260a460205260409020805480613b1c57613b1c615090565b5f8281526020812060037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff9093019283020180547fffffffffffffffffffffffff000000000000000000000000000000000000000016815560018181018390556002909101919091559155613b91908661506a565b6040805184815260208101849052919650339173ffffffffffffffffffffffffffffffffffffffff8616917f921046659ea3b3b3f8e8fefd2bece3121b2d929ead94c696a75beedee477fdb6910160405180910390a3505050613852565b613bfa81600161507d565b9050613852565b505f8211613c6b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f6e6f204d6f72706820746f6b656e20746f20636c61696d00000000000000000060448201526064016108ac565b613c7533836146e0565b50506131456001606555565b73ffffffffffffffffffffffffffffffffffffffff81165f90815260a460209081526040808320805482518185028101850190935280835260609492939192909184015b82821015613d26575f8481526020908190206040805160608101825260038602909201805473ffffffffffffffffffffffffffffffffffffffff16835260018082015484860152600290910154918301919091529083529092019101613cc5565b505050509050919050565b613d3961405d565b73ffffffffffffffffffffffffffffffffffffffff8116613ddc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f646472657373000000000000000000000000000000000000000000000000000060648201526084016108ac565b611bcc816145c1565b613ded6140de565b73ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001663ac2ac640336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff90911660048201526024015f604051808303815f87803b158015613e8d575f80fd5b505af1158015613e9f573d5f803e3d5ffd5b505050506131456001606555565b5f610702825490565b60995460975460ff1615613eda57609954609c541015613ed55750609c545b613eeb565b609954609d541015613eeb5750609d545b5f8167ffffffffffffffff811115613f0557613f05615117565b604051908082528060200260200182016040528015613f2e578160200160208202803683370190505b5090505f5b82811015613fb557609d8181548110613f4e57613f4e615010565b905f5260205f20015f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff16828281518110613f8857613f88615010565b73ffffffffffffffffffffffffffffffffffffffff90921660209283029190910190910152600101613f33565b506040517f9b8201a400000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff7f00000000000000000000000000000000000000000000000000000000000000001690639b8201a490614028908490600401615555565b5f604051808303815f87803b15801561403f575f80fd5b505af1158015614051573d5f803e3d5ffd5b50509151609b55505050565b60335473ffffffffffffffffffffffffffffffffffffffff163314613145576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016108ac565b60026065540361414a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016108ac565b6002606555565b6001606555565b5f6141798373ffffffffffffffffffffffffffffffffffffffff841661497f565b9392505050565b5f805b73ffffffffffffffffffffffffffffffffffffffff84165f90815260a460205260409020548110156142275773ffffffffffffffffffffffffffffffffffffffff8481165f90815260a460205260409020805491851691839081106141ea576141ea615010565b5f91825260209091206003909102015473ffffffffffffffffffffffffffffffffffffffff160361421f576001915050610702565b600101614183565b505f9392505050565b6040517fde6ac93300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff838116600483015282811660248301525f917f00000000000000000000000000000000000000000000000000000000000000009091169063de6ac93390604401602060405180830381865afa1580156142c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142ea9190615567565b159392505050565b5f6141798373ffffffffffffffffffffffffffffffffffffffff8416614a62565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa1580156143a1573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906143c59190615586565b6040517f23b872dd00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff86811660048301528581166024830152604482018590529192507f0000000000000000000000000000000000000000000000000000000000000000909116906323b872dd906064016020604051808303815f875af1158015614464573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906144889190615567565b506040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa158015614517573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061453b9190615586565b90505f83118015614554575082614552838361506a565b145b6145ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6d6f72706820746f6b656e207472616e73666572206661696c6564000000000060448201526064016108ac565b5050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff166146cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108ac565b613145614aae565b5f6141798383614b44565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff83811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa15801561476e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906147929190615586565b6040517fa9059cbb00000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8581166004830152602482018590529192507f00000000000000000000000000000000000000000000000000000000000000009091169063a9059cbb906044016020604051808303815f875af1158015614829573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061484d9190615567565b506040517f70a0823100000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff84811660048301525f917f0000000000000000000000000000000000000000000000000000000000000000909116906370a0823190602401602060405180830381865afa1580156148dc573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906149009190615586565b90505f83118015614919575082614917838361506a565b145b610e84576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6d6f72706820746f6b656e207472616e73666572206661696c6564000000000060448201526064016108ac565b5f8181526001830160205260408120548015614a59575f6149a160018361506a565b85549091505f906149b49060019061506a565b9050818114614a13575f865f0182815481106149d2576149d2615010565b905f5260205f200154905080875f0184815481106149f2576149f2615010565b5f918252602080832090910192909255918252600188019052604090208390555b8554869080614a2457614a24615090565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610702565b5f915050610702565b5f818152600183016020526040812054614aa757508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610702565b505f610702565b5f54610100900460ff16614151576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e6700000000000000000000000000000000000000000060648201526084016108ac565b5f825f018281548110614b5957614b59615010565b905f5260205f200154905092915050565b508054614b7690615144565b5f825580601f10614b85575050565b601f0160209004905f5260205f2090810190611bcc91905b80821115614bb0575f8155600101614b9d565b5090565b73ffffffffffffffffffffffffffffffffffffffff81168114611bcc575f80fd5b5f60208284031215614be5575f80fd5b813561417981614bb4565b5f8083601f840112614c00575f80fd5b50813567ffffffffffffffff811115614c17575f80fd5b6020830191508360208260051b8501011115614c31575f80fd5b9250929050565b5f8060208385031215614c49575f80fd5b823567ffffffffffffffff811115614c5f575f80fd5b614c6b85828601614bf0565b90969095509350505050565b5f60208284031215614c87575f80fd5b5035919050565b5f8060408385031215614c9f575f80fd5b8235614caa81614bb4565b946020939093013593505050565b5f81518084525f5b81811015614cdc57602081850181015186830182015201614cc0565b505f6020828601015260207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f83011685010191505092915050565b5f60208083018184528085518083526040925060408601915060408160051b8701018488015f5b83811015614dbe578883037fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffc00185528151805173ffffffffffffffffffffffffffffffffffffffff16845287810151888501528601516060878501819052614daa81860183614cb8565b968901969450505090860190600101614d40565b509098975050505050505050565b5f805f805f8060a08789031215614de1575f80fd5b8635614dec81614bb4565b9550602087013594506040870135935060608701359250608087013567ffffffffffffffff811115614e1c575f80fd5b614e2889828a01614bf0565b979a9699509497509295939492505050565b5f60208284031215614e4a575f80fd5b813567ffffffffffffffff811115614e60575f80fd5b820160608185031215614179575f80fd5b73ffffffffffffffffffffffffffffffffffffffff84168152826020820152606060408201525f614ea56060830184614cb8565b95945050505050565b5f8060408385031215614ebf575f80fd5b8235614eca81614bb4565b91506020830135614eda81614bb4565b809150509250929050565b5f805f60608486031215614ef7575f80fd5b8335614f0281614bb4565b95602085013595506040909401359392505050565b5f815180845260208085019450602084015f5b83811015614f5c57815173ffffffffffffffffffffffffffffffffffffffff1687529582019590820190600101614f2a565b509495945050505050565b828152604060208201525f614f7f6040830184614f17565b949350505050565b602080825282518282018190525f919060409081850190868401855b82811015614fe8578151805173ffffffffffffffffffffffffffffffffffffffff16855286810151878601528501518585015260609093019290850190600101614fa3565b5091979650505050505050565b5f60208284031215615005575f80fd5b815161417981614bb4565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b818103818111156107025761070261503d565b808201808211156107025761070261503d565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffd5b60208082528181018390525f908460408401835b8681101561510c5782356150e481614bb4565b73ffffffffffffffffffffffffffffffffffffffff16825291830191908301906001016150d1565b509695505050505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b600181811c9082168061515857607f821691505b602082108103612780577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b5f8161519d5761519d61503d565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b5f826151fe576151fe6151c3565b500690565b5f82357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffa1833603018112615235575f80fd5b9190910192915050565b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615272575f80fd5b83018035915067ffffffffffffffff82111561528c575f80fd5b602001915036819003821315614c31575f80fd5b601f821115610d5857805f5260205f20601f840160051c810160208510156152c55750805b601f840160051c820191505b818110156145ba575f81556001016152d1565b81356152ef81614bb4565b73ffffffffffffffffffffffffffffffffffffffff81167fffffffffffffffffffffffff000000000000000000000000000000000000000083541617825550600160208084013560018401556002830160408501357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1863603018112615373575f80fd5b8501803567ffffffffffffffff81111561538b575f80fd5b803603848301131561539b575f80fd5b6153af816153a98554615144565b856152a0565b5f601f821160018114615401575f83156153cb57508382018601355b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff600385901b1c1916600184901b178555615496565b5f858152602081207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08516915b8281101561544d5786850189013582559388019390890190880161542e565b508482101561548a577fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff60f88660031b161c198885880101351681555b505060018360011b0185555b505050505050505050565b83815260406020820152816040820152818360608301375f818301606090810191909152601f9092017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016010192915050565b5f82615502576155026151c3565b500490565b80820281158282048414176107025761070261503d565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361554e5761554e61503d565b5060010190565b602081525f6141796020830184614f17565b5f60208284031215615577575f80fd5b81518015158114614179575f80fd5b5f60208284031215615596575f80fd5b505191905056fea164736f6c6343000818000a" func init() { if err := json.Unmarshal([]byte(L2StakingStorageLayoutJSON), L2StakingStorageLayout); err != nil { diff --git a/bindings/bindings/l2tokenregistry.go b/bindings/bindings/l2tokenregistry.go new file mode 100644 index 000000000..b8609f24c --- /dev/null +++ b/bindings/bindings/l2tokenregistry.go @@ -0,0 +1,2641 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package bindings + +import ( + "errors" + "math/big" + "strings" + + ethereum "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/core/types" + "github.com/morph-l2/go-ethereum/event" +) + +// Reference imports to suppress errors if they are not otherwise used. +var ( + _ = errors.New + _ = big.NewInt + _ = strings.NewReader + _ = ethereum.NotFound + _ = bind.Bind + _ = common.Big1 + _ = types.BloomLookup + _ = event.NewSubscription + _ = abi.ConvertType +) + +// IL2TokenRegistryTokenEntry is an auto generated low-level Go binding around an user-defined struct. +type IL2TokenRegistryTokenEntry struct { + TokenID uint16 + TokenAddress common.Address +} + +// IL2TokenRegistryTokenInfo is an auto generated low-level Go binding around an user-defined struct. +type IL2TokenRegistryTokenInfo struct { + TokenAddress common.Address + BalanceSlot [32]byte + IsActive bool + Decimals uint8 + Scale *big.Int +} + +// L2TokenRegistryMetaData contains all meta data concerning the L2TokenRegistry contract. +var L2TokenRegistryMetaData = &bind.MetaData{ + ABI: "[{\"inputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"CallerNotAllowed\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"DifferentLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidArrayLength\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidBalanceSlot\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidPrice\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidScale\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTokenAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"InvalidTokenID\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TokenAddressAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TokenIDAlreadyRegistered\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TokenNotFound\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ZeroTokenAmount\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isEnabled\",\"type\":\"bool\"}],\"name\":\"AllowListEnabledUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"val\",\"type\":\"bool\"}],\"name\":\"AllowListSet\",\"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\":\"uint16\",\"name\":\"tokenID\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPrice\",\"type\":\"uint256\"}],\"name\":\"PriceRatioUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint16\",\"name\":\"tokenID\",\"type\":\"uint16\"}],\"name\":\"TokenActivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint16\",\"name\":\"tokenID\",\"type\":\"uint16\"}],\"name\":\"TokenDeactivated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint16\",\"name\":\"tokenID\",\"type\":\"uint16\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"balanceSlot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"scale\",\"type\":\"uint256\"}],\"name\":\"TokenInfoUpdated\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint16\",\"name\":\"tokenID\",\"type\":\"uint16\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bytes32\",\"name\":\"balanceSlot\",\"type\":\"bytes32\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"},{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"scale\",\"type\":\"uint256\"}],\"name\":\"TokenRegistered\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint16\",\"name\":\"tokenID\",\"type\":\"uint16\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"TokenRemoved\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"uint16\",\"name\":\"tokenID\",\"type\":\"uint16\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newScale\",\"type\":\"uint256\"}],\"name\":\"TokenScaleUpdated\",\"type\":\"event\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"user\",\"type\":\"address\"}],\"name\":\"allowList\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"allowed\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"allowListEnabled\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16[]\",\"name\":\"_tokenIDs\",\"type\":\"uint16[]\"},{\"internalType\":\"uint256[]\",\"name\":\"_prices\",\"type\":\"uint256[]\"}],\"name\":\"batchUpdatePrices\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16[]\",\"name\":\"_tokenIDs\",\"type\":\"uint16[]\"},{\"internalType\":\"bool[]\",\"name\":\"_isActives\",\"type\":\"bool[]\"}],\"name\":\"batchUpdateTokenStatus\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_tokenID\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"_ethAmount\",\"type\":\"uint256\"}],\"name\":\"calculateTokenAmount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedIDList\",\"outputs\":[{\"internalType\":\"uint16[]\",\"name\":\"\",\"type\":\"uint16[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedTokenCount\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getSupportedTokenList\",\"outputs\":[{\"components\":[{\"internalType\":\"uint16\",\"name\":\"tokenID\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"internalType\":\"structIL2TokenRegistry.TokenEntry[]\",\"name\":\"\",\"type\":\"tuple[]\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"getTokenIdByAddress\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_tokenID\",\"type\":\"uint16\"}],\"name\":\"getTokenInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"balanceSlot\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"scale\",\"type\":\"uint256\"}],\"internalType\":\"structIL2TokenRegistry.TokenInfo\",\"name\":\"info\",\"type\":\"tuple\"},{\"internalType\":\"bool\",\"name\":\"hasBalanceSlot\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_tokenID\",\"type\":\"uint16\"}],\"name\":\"getTokenPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_tokenID\",\"type\":\"uint16\"}],\"name\":\"getTokenScale\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner_\",\"type\":\"address\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_tokenID\",\"type\":\"uint16\"}],\"name\":\"isTokenActive\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_tokenID\",\"type\":\"uint16\"}],\"name\":\"isTokenSupported\",\"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\":\"uint16\",\"name\":\"tokenID\",\"type\":\"uint16\"}],\"name\":\"priceRatio\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"priceRatio\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_tokenID\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"_tokenAddress\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"_balanceSlot\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"_needBalanceSlot\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"_scale\",\"type\":\"uint256\"}],\"name\":\"registerToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16[]\",\"name\":\"_tokenIDs\",\"type\":\"uint16[]\"},{\"internalType\":\"address[]\",\"name\":\"_tokenAddresses\",\"type\":\"address[]\"},{\"internalType\":\"bytes32[]\",\"name\":\"_balanceSlots\",\"type\":\"bytes32[]\"},{\"internalType\":\"bool[]\",\"name\":\"_needBalanceSlots\",\"type\":\"bool[]\"},{\"internalType\":\"uint256[]\",\"name\":\"_scales\",\"type\":\"uint256[]\"}],\"name\":\"registerTokens\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_tokenID\",\"type\":\"uint16\"}],\"name\":\"removeToken\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"renounceOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"user\",\"type\":\"address[]\"},{\"internalType\":\"bool[]\",\"name\":\"val\",\"type\":\"bool[]\"}],\"name\":\"setAllowList\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bool\",\"name\":\"_allowListEnabled\",\"type\":\"bool\"}],\"name\":\"setAllowListEnabled\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"}],\"name\":\"tokenRegistration\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"tokenID\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"tokenID\",\"type\":\"uint16\"}],\"name\":\"tokenRegistry\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"tokenAddress\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"balanceSlot\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"isActive\",\"type\":\"bool\"},{\"internalType\":\"uint8\",\"name\":\"decimals\",\"type\":\"uint8\"},{\"internalType\":\"uint256\",\"name\":\"scale\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_tokenID\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"_newPrice\",\"type\":\"uint256\"}],\"name\":\"updatePriceRatio\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_tokenID\",\"type\":\"uint16\"},{\"internalType\":\"address\",\"name\":\"_tokenAddress\",\"type\":\"address\"},{\"internalType\":\"bytes32\",\"name\":\"_balanceSlot\",\"type\":\"bytes32\"},{\"internalType\":\"bool\",\"name\":\"_needBalanceSlot\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"_isActive\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"_scale\",\"type\":\"uint256\"}],\"name\":\"updateTokenInfo\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint16\",\"name\":\"_tokenID\",\"type\":\"uint16\"},{\"internalType\":\"uint256\",\"name\":\"_newScale\",\"type\":\"uint256\"}],\"name\":\"updateTokenScale\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}]", + Bin: "0x608060405234801562000010575f80fd5b506200001b62000021565b620000df565b5f54610100900460ff16156200008d5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff90811614620000dd575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b612d3d80620000ed5f395ff3fe608060405234801561000f575f80fd5b50600436106101c6575f3560e01c80638cbab7e4116100fe578063ce67be261161009e578063ef0fde0f1161006e578063ef0fde0f146104bf578063efeadb6d146104d2578063f2fde38b146104e5578063fce40489146104f8575f80fd5b8063ce67be261461047e578063dbbb2faa14610486578063dddc98be14610499578063e3de72a5146104ac575f80fd5b8063a1218001116100d9578063a121800114610432578063a313d00714610445578063b10b69ee14610458578063c4d66de81461046b575f80fd5b80638cbab7e4146103f15780638da5cb5b146104045780639190202e1461041f575f80fd5b80635c45246b11610169578063724f91ce11610144578063724f91ce146103105780637304880c1461034657806385519c36146103595780638c399691146103de575f80fd5b80635c45246b146102de5780636f6d6cc1146102f3578063715018a614610308575f80fd5b806322bd5c1c116101a457806322bd5c1c146102795780632848aeaf146102965780632a1ea5a2146102b85780634cbcdd13146102cb575f80fd5b80631585458c146101ca57806319904c33146101e85780631c58e79314610215575b5f80fd5b6101d261050b565b6040516101df91906125af565b60405180910390f35b6102076101f6366004612620565b60996020525f908152604090205481565b6040519081526020016101df565b610228610223366004612620565b61060a565b6040805183516001600160a01b03168152602080850151908201528382015115159181019190915260608084015160ff169082015260809283015192810192909252151560a082015260c0016101df565b609b546102869060ff1681565b60405190151581526020016101df565b6102866102a436600461264f565b609a6020525f908152604090205460ff1681565b6102076102c6366004612620565b610700565b6102866102d9366004612620565b610768565b6102f16102ec366004612677565b61077e565b005b6102fb6107ac565b6040516101df91906126c8565b6102f1610854565b61033361031e36600461264f565b60986020525f908152604090205461ffff1681565b60405161ffff90911681526020016101df565b6102f161035436600461270f565b610867565b6103a4610367366004612620565b60976020525f908152604090208054600182015460028301546003909301546001600160a01b0390921692909160ff808316926101009004169085565b604080516001600160a01b03909616865260208601949094529115159284019290925260ff9091166060830152608082015260a0016101df565b6102f16103ec3660046128df565b610c46565b6103336103ff36600461264f565b610e4b565b6033546040516001600160a01b0390911681526020016101df565b6102f161042d366004612987565b610eb4565b6102f1610440366004612ab4565b611055565b610207610453366004612620565b611171565b6102f1610466366004612b7d565b6111dc565b6102f161047936600461264f565b611345565b610207611513565b6102f1610494366004612620565b611523565b6102076104a7366004612b7d565b6116a5565b6102f16104ba366004612ba5565b61180d565b6102f16104cd366004612b7d565b61194b565b6102f16104e0366004612bfb565b611ab3565b6102f16104f336600461264f565b611b20565b610286610506366004612620565b611bca565b60605f610518609c611c0d565b90505f815167ffffffffffffffff81111561053557610535612771565b60405190808252806020026020018201604052801561057957816020015b604080518082019091525f80825260208201528152602001906001900390816105535790505b5090505f5b8251811015610603575f83828151811061059a5761059a612c14565b60209081029190910181015161ffff81165f818152609784526040908190205481518083019092529181526001600160a01b039091169281018390528551919350908590859081106105ee576105ee612c14565b6020908102919091010152505060010161057e565b5092915050565b6040805160a0810182525f8082526020820181905291810182905260608101829052608081019190915261ffff82165f908152609760205260408120546001600160a01b0316610686576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505061ffff81165f90815260976020908152604091829020825160a08101845281546001600160a01b031681526001820154928101839052600282015460ff80821615159583019590955261010090049093166060840152600301546080830152801515906106f490611c20565b60208301529092909150565b61ffff81165f908152609760205260408120546001600160a01b0316610752576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5061ffff165f9081526099602052604090205490565b5f610778609c61ffff8416611c53565b92915050565b610786611c6a565b61078e611cde565b61079b8585858585611d51565b6107a56001606555565b5050505050565b60605f6107b9609c611c0d565b90505f815167ffffffffffffffff8111156107d6576107d6612771565b6040519080825280602002602001820160405280156107ff578160200160208202803683370190505b5090505f5b82518110156106035782818151811061081f5761081f612c14565b602002602001015182828151811061083957610839612c14565b61ffff90921660209283029190910190910152600101610804565b61085c611c6a565b6108655f6120c1565b565b61086f611c6a565b610877611cde565b61ffff86165f908152609760205260409020546001600160a01b03166108c9576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038516610909576040517f1eb00b0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f03610942576040517f70ce14bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0385165f9081526098602052604090205461ffff16801580159061097557508661ffff168161ffff1614155b156109ac576040517fe4476a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60129050866001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610a29575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610a2691810190612c41565b60015b15610a315790505b61ffff88165f9081526097602090815260409182902054825160a081019093526001600160a01b038a811684521691908101610a6d898961212a565b815286151560208083019190915260ff808616604080850191909152606093840189905261ffff8e165f90815260978452819020855181546001600160a01b039182167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161782559386015160018201559085015160028201805495870151909316610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff911515919091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009095169490941793909317905560809092015160039091015581811690891614610bb9576001600160a01b038181165f9081526098602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000908116909155928b1682529020805490911661ffff8b161790555b61ffff89165f8181526099602052604080822091909155516001600160a01b038a1691907f60281b1abf645864e8443ca11a3c3b51a6a9203a376da58db7919f7cfebc4aa990610c29908b908a9088908b90938452911515602084015260ff166040830152606082015260800190565b60405180910390a3505050610c3e6001606555565b505050505050565b5f610c596033546001600160a01b031690565b609b546001600160a01b0391909116331491505f9060ff168015610c8b5750335f908152609a602052604090205460ff165b905081158015610c99575080155b15610cd0576040517f2af07d2000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8251845114610d0b576040517f9d89020a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b84518110156107a5575f6001600160a01b031660975f878481518110610d3557610d35612c14565b60209081029190910181015161ffff1682528101919091526040015f20546001600160a01b031614610e4357838181518110610d7357610d73612c14565b60200260200101515f0315610e4357838181518110610d9457610d94612c14565b602002602001015160995f878481518110610db157610db1612c14565b602002602001015161ffff1661ffff1681526020019081526020015f2081905550848181518110610de457610de4612c14565b602002602001015161ffff167fd73999ac164146908368455e72209122b67c149b37aab024e2707394a2c70467858381518110610e2357610e23612c14565b6020026020010151604051610e3a91815260200190565b60405180910390a25b600101610d0d565b6001600160a01b0381165f9081526098602052604081205461ffff1680158015610e7d57506001600160a01b03831615155b15610778576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610ebc611c6a565b828114610ef5576040517f9d89020a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b838110156107a5575f858583818110610f1257610f12612c14565b9050602002016020810190610f279190612620565b90505f848484818110610f3c57610f3c612c14565b9050602002016020810190610f519190612bfb565b61ffff83165f908152609760205260409020549091506001600160a01b0316610f7b57505061104d565b61ffff82165f9081526097602052604090206002015460ff16801515821515146110495761ffff83165f90815260976020526040902060020180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016831580159190911790915561101a5760405161ffff8416907fba78a86bd882b78fb95715a0d827188ec0a8ad3f500310d33a39b94c9ff677b8905f90a2611049565b60405161ffff8416907fa625871090c2595895650b8e9222d1a3267cedf9de819bf446400962ce1357ef905f90a25b5050505b600101610ef7565b61105d611c6a565b611065611cde565b8351855114158061107857508251855114155b8061108557508151855114155b8061109257508051855114155b156110c9576040517f9d89020a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b85518110156111665761115e8682815181106110e9576110e9612c14565b602002602001015186838151811061110357611103612c14565b602002602001015186848151811061111d5761111d612c14565b602002602001015186858151811061113757611137612c14565b602002602001015186868151811061115157611151612c14565b6020026020010151611d51565b6001016110cb565b506107a56001606555565b61ffff81165f908152609760205260408120546001600160a01b03166111c3576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5061ffff165f9081526097602052604090206003015490565b5f6111ef6033546001600160a01b031690565b609b546001600160a01b0391909116331491505f9060ff1680156112215750335f908152609a602052604090205460ff165b90508115801561122f575080155b15611266576040517f2af07d2000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff84165f908152609760205260409020546001600160a01b03166112b8576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f036112f0576040517ebfc92100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff84165f8181526099602052604090819020859055517fd73999ac164146908368455e72209122b67c149b37aab024e2707394a2c70467906113379086815260200190565b60405180910390a250505050565b5f54610100900460ff161580801561136357505f54600160ff909116105b8061137c5750303b15801561137c57505f5460ff166001145b61140d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611469575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b611471612179565b611479612217565b611482826120c1565b609b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561150f575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b5f61151e609c6122b5565b905090565b61152b611c6a565b61ffff81165f908152609760205260409020546001600160a01b03168061157e576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61158d609c61ffff8416611c53565b6115c3576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff82165f81815260976020908152604080832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168155600181018490556002810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090811690915560039091018490556001600160a01b038616845260988352818420805490911690559282526099905290812055611668826122be565b6040516001600160a01b0382169061ffff8416907f330282f89b53f03dfc62130ddb33062a147ad25d691915b575732f62fb6fce9a905f90a35050565b61ffff82165f908152609760205260408120546001600160a01b03166116f7576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff83165f818152609760209081526040808320815160a08101835281546001600160a01b03168152600182015481850152600282015460ff8082161515838601526101009091041660608201526003909101546080820152938352609990915281205490819003611795576040517ebfc92100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8260800151856117a69190612c8e565b90508160016117b58284612ca5565b6117bf9190612cb8565b6117c99190612ccb565b9350835f03611804576040517f82c4a8c900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505092915050565b611815611c6a565b8051825114611850576040517fd9183d2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b82518110156119465781818151811061186d5761186d612c14565b6020026020010151609a5f85848151811061188a5761188a612c14565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff0219169083151502179055508281815181106118d9576118d9612c14565b60200260200101516001600160a01b03167f6dad0aed33f4b7f07095619b668698e17943fd9f4c83e7cfcc7f6dd880a1158883838151811061191d5761191d612c14565b6020026020010151604051611936911515815260200190565b60405180910390a2600101611852565b505050565b5f61195e6033546001600160a01b031690565b609b546001600160a01b0391909116331491505f9060ff1680156119905750335f908152609a602052604090205460ff165b90508115801561199e575080155b156119d5576040517f2af07d2000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff84165f908152609760205260409020546001600160a01b0316611a27576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f03611a60576040517f70ce14bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff84165f818152609760209081526040808320600301879055609982528083209290925590518581527f7b614d0c690ae942aec30d9378eb72c3678dd8cb74a55343c87baf8dfe078e749101611337565b611abb611c6a565b609b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215159081179091556040519081527f16435b45f7482047f839a6a19d291442627200f52cad2803c595150d0d440eb39060200160405180910390a150565b611b28611c6a565b6001600160a01b038116611bbe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401611404565b611bc7816120c1565b50565b61ffff81165f908152609760205260408120546001600160a01b0316611bf157505f919050565b5061ffff165f9081526097602052604090206002015460ff1690565b60605f611c19836122cd565b9392505050565b5f81611c2d57505f919050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b5f8181526001830160205260408120541515611c19565b6033546001600160a01b03163314610865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611404565b600260655403611d4a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611404565b6002606555565b6001600160a01b038416611d91576040517f1eb00b0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8461ffff165f03611dce576040517f6aa2a93700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff85165f908152609760205260409020546001600160a01b031615611e21576040517fc9b3c8a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384165f9081526098602052604090205461ffff1615611e74576040517fe4476a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f03611ead576040517f70ce14bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60129050846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611f2a575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611f2791810190612c41565b60015b15611f325790505b6040518060a00160405280866001600160a01b03168152602001611f56868661212a565b81525f602080830182905260ff808616604080860191909152606094850188905261ffff8c1680855260978452818520875181546001600160a01b039182167fffffffffffffffffffffffff000000000000000000000000000000000000000090911617825588860151600183015588840151600283018054998b0151909616610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff911515919091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000998a161717909455608090970151600390970196909655908a168352609890915290208054909116909117905561205986612326565b604080518581525f602082015260ff8316818301526060810184905290516001600160a01b0387169161ffff8916917fb9d0acb419ab21384716fbeaa0bcbc172f6347c9bf4fc0614c4e79fc47b36e119181900360800190a3505050505050565b6001606555565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f8161213757505f610778565b60018301612171576040517feab9612d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505060010190565b5f54610100900460ff1661220f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401611404565b610865612335565b5f54610100900460ff166122ad576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401611404565b6108656123d4565b5f610778825490565b61150f609c61ffff831661246a565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561231a57602002820191905f5260205f20905b815481526020019060010190808311612306575b50505050509050919050565b61150f609c61ffff8316612475565b5f54610100900460ff166123cb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401611404565b610865336120c1565b5f54610100900460ff166120ba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401611404565b5f611c198383612480565b5f611c198383612563565b5f818152600183016020526040812054801561255a575f6124a2600183612cb8565b85549091505f906124b590600190612cb8565b9050818114612514575f865f0182815481106124d3576124d3612c14565b905f5260205f200154905080875f0184815481106124f3576124f3612c14565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061252557612525612d03565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f905560019350505050610778565b5f915050610778565b5f8181526001830160205260408120546125a857508154600181810184555f848152602080822090930184905584548482528286019093526040902091909155610778565b505f610778565b602080825282518282018190525f919060409081850190868401855b828110156125fd578151805161ffff1685528601516001600160a01b03168685015292840192908501906001016125cb565b5091979650505050505050565b803561ffff8116811461261b575f80fd5b919050565b5f60208284031215612630575f80fd5b611c198261260a565b80356001600160a01b038116811461261b575f80fd5b5f6020828403121561265f575f80fd5b611c1982612639565b8035801515811461261b575f80fd5b5f805f805f60a0868803121561268b575f80fd5b6126948661260a565b94506126a260208701612639565b9350604086013592506126b760608701612668565b949793965091946080013592915050565b602080825282518282018190525f9190848201906040850190845b8181101561270357835161ffff16835292840192918401916001016126e3565b50909695505050505050565b5f805f805f8060c08789031215612724575f80fd5b61272d8761260a565b955061273b60208801612639565b94506040870135935061275060608801612668565b925061275e60808801612668565b915060a087013590509295509295509295565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff811182821017156127e5576127e5612771565b604052919050565b5f67ffffffffffffffff82111561280657612806612771565b5060051b60200190565b5f82601f83011261281f575f80fd5b8135602061283461282f836127ed565b61279e565b8083825260208201915060208460051b870101935086841115612855575f80fd5b602086015b848110156128785761286b8161260a565b835291830191830161285a565b509695505050505050565b5f82601f830112612892575f80fd5b813560206128a261282f836127ed565b8083825260208201915060208460051b8701019350868411156128c3575f80fd5b602086015b8481101561287857803583529183019183016128c8565b5f80604083850312156128f0575f80fd5b823567ffffffffffffffff80821115612907575f80fd5b61291386838701612810565b93506020850135915080821115612928575f80fd5b5061293585828601612883565b9150509250929050565b5f8083601f84011261294f575f80fd5b50813567ffffffffffffffff811115612966575f80fd5b6020830191508360208260051b8501011115612980575f80fd5b9250929050565b5f805f806040858703121561299a575f80fd5b843567ffffffffffffffff808211156129b1575f80fd5b6129bd8883890161293f565b909650945060208701359150808211156129d5575f80fd5b506129e28782880161293f565b95989497509550505050565b5f82601f8301126129fd575f80fd5b81356020612a0d61282f836127ed565b8083825260208201915060208460051b870101935086841115612a2e575f80fd5b602086015b8481101561287857612a4481612639565b8352918301918301612a33565b5f82601f830112612a60575f80fd5b81356020612a7061282f836127ed565b8083825260208201915060208460051b870101935086841115612a91575f80fd5b602086015b8481101561287857612aa781612668565b8352918301918301612a96565b5f805f805f60a08688031215612ac8575f80fd5b853567ffffffffffffffff80821115612adf575f80fd5b612aeb89838a01612810565b96506020880135915080821115612b00575f80fd5b612b0c89838a016129ee565b95506040880135915080821115612b21575f80fd5b612b2d89838a01612883565b94506060880135915080821115612b42575f80fd5b612b4e89838a01612a51565b93506080880135915080821115612b63575f80fd5b50612b7088828901612883565b9150509295509295909350565b5f8060408385031215612b8e575f80fd5b612b978361260a565b946020939093013593505050565b5f8060408385031215612bb6575f80fd5b823567ffffffffffffffff80821115612bcd575f80fd5b612bd9868387016129ee565b93506020850135915080821115612bee575f80fd5b5061293585828601612a51565b5f60208284031215612c0b575f80fd5b611c1982612668565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215612c51575f80fd5b815160ff81168114611c19575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808202811582820484141761077857610778612c61565b8082018082111561077857610778612c61565b8181038181111561077857610778612c61565b5f82612cfe577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea164736f6c6343000818000a", +} + +// L2TokenRegistryABI is the input ABI used to generate the binding from. +// Deprecated: Use L2TokenRegistryMetaData.ABI instead. +var L2TokenRegistryABI = L2TokenRegistryMetaData.ABI + +// L2TokenRegistryBin is the compiled bytecode used for deploying new contracts. +// Deprecated: Use L2TokenRegistryMetaData.Bin instead. +var L2TokenRegistryBin = L2TokenRegistryMetaData.Bin + +// DeployL2TokenRegistry deploys a new Ethereum contract, binding an instance of L2TokenRegistry to it. +func DeployL2TokenRegistry(auth *bind.TransactOpts, backend bind.ContractBackend) (common.Address, *types.Transaction, *L2TokenRegistry, error) { + parsed, err := L2TokenRegistryMetaData.GetAbi() + if err != nil { + return common.Address{}, nil, nil, err + } + if parsed == nil { + return common.Address{}, nil, nil, errors.New("GetABI returned nil") + } + + address, tx, contract, err := bind.DeployContract(auth, *parsed, common.FromHex(L2TokenRegistryBin), backend) + if err != nil { + return common.Address{}, nil, nil, err + } + return address, tx, &L2TokenRegistry{L2TokenRegistryCaller: L2TokenRegistryCaller{contract: contract}, L2TokenRegistryTransactor: L2TokenRegistryTransactor{contract: contract}, L2TokenRegistryFilterer: L2TokenRegistryFilterer{contract: contract}}, nil +} + +// L2TokenRegistry is an auto generated Go binding around an Ethereum contract. +type L2TokenRegistry struct { + L2TokenRegistryCaller // Read-only binding to the contract + L2TokenRegistryTransactor // Write-only binding to the contract + L2TokenRegistryFilterer // Log filterer for contract events +} + +// L2TokenRegistryCaller is an auto generated read-only Go binding around an Ethereum contract. +type L2TokenRegistryCaller struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// L2TokenRegistryTransactor is an auto generated write-only Go binding around an Ethereum contract. +type L2TokenRegistryTransactor struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// L2TokenRegistryFilterer is an auto generated log filtering Go binding around an Ethereum contract events. +type L2TokenRegistryFilterer struct { + contract *bind.BoundContract // Generic contract wrapper for the low level calls +} + +// L2TokenRegistrySession is an auto generated Go binding around an Ethereum contract, +// with pre-set call and transact options. +type L2TokenRegistrySession struct { + Contract *L2TokenRegistry // Generic contract binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// L2TokenRegistryCallerSession is an auto generated read-only Go binding around an Ethereum contract, +// with pre-set call options. +type L2TokenRegistryCallerSession struct { + Contract *L2TokenRegistryCaller // Generic contract caller binding to set the session for + CallOpts bind.CallOpts // Call options to use throughout this session +} + +// L2TokenRegistryTransactorSession is an auto generated write-only Go binding around an Ethereum contract, +// with pre-set transact options. +type L2TokenRegistryTransactorSession struct { + Contract *L2TokenRegistryTransactor // Generic contract transactor binding to set the session for + TransactOpts bind.TransactOpts // Transaction auth options to use throughout this session +} + +// L2TokenRegistryRaw is an auto generated low-level Go binding around an Ethereum contract. +type L2TokenRegistryRaw struct { + Contract *L2TokenRegistry // Generic contract binding to access the raw methods on +} + +// L2TokenRegistryCallerRaw is an auto generated low-level read-only Go binding around an Ethereum contract. +type L2TokenRegistryCallerRaw struct { + Contract *L2TokenRegistryCaller // Generic read-only contract binding to access the raw methods on +} + +// L2TokenRegistryTransactorRaw is an auto generated low-level write-only Go binding around an Ethereum contract. +type L2TokenRegistryTransactorRaw struct { + Contract *L2TokenRegistryTransactor // Generic write-only contract binding to access the raw methods on +} + +// NewL2TokenRegistry creates a new instance of L2TokenRegistry, bound to a specific deployed contract. +func NewL2TokenRegistry(address common.Address, backend bind.ContractBackend) (*L2TokenRegistry, error) { + contract, err := bindL2TokenRegistry(address, backend, backend, backend) + if err != nil { + return nil, err + } + return &L2TokenRegistry{L2TokenRegistryCaller: L2TokenRegistryCaller{contract: contract}, L2TokenRegistryTransactor: L2TokenRegistryTransactor{contract: contract}, L2TokenRegistryFilterer: L2TokenRegistryFilterer{contract: contract}}, nil +} + +// NewL2TokenRegistryCaller creates a new read-only instance of L2TokenRegistry, bound to a specific deployed contract. +func NewL2TokenRegistryCaller(address common.Address, caller bind.ContractCaller) (*L2TokenRegistryCaller, error) { + contract, err := bindL2TokenRegistry(address, caller, nil, nil) + if err != nil { + return nil, err + } + return &L2TokenRegistryCaller{contract: contract}, nil +} + +// NewL2TokenRegistryTransactor creates a new write-only instance of L2TokenRegistry, bound to a specific deployed contract. +func NewL2TokenRegistryTransactor(address common.Address, transactor bind.ContractTransactor) (*L2TokenRegistryTransactor, error) { + contract, err := bindL2TokenRegistry(address, nil, transactor, nil) + if err != nil { + return nil, err + } + return &L2TokenRegistryTransactor{contract: contract}, nil +} + +// NewL2TokenRegistryFilterer creates a new log filterer instance of L2TokenRegistry, bound to a specific deployed contract. +func NewL2TokenRegistryFilterer(address common.Address, filterer bind.ContractFilterer) (*L2TokenRegistryFilterer, error) { + contract, err := bindL2TokenRegistry(address, nil, nil, filterer) + if err != nil { + return nil, err + } + return &L2TokenRegistryFilterer{contract: contract}, nil +} + +// bindL2TokenRegistry binds a generic wrapper to an already deployed contract. +func bindL2TokenRegistry(address common.Address, caller bind.ContractCaller, transactor bind.ContractTransactor, filterer bind.ContractFilterer) (*bind.BoundContract, error) { + parsed, err := L2TokenRegistryMetaData.GetAbi() + if err != nil { + return nil, err + } + return bind.NewBoundContract(address, *parsed, caller, transactor, filterer), nil +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_L2TokenRegistry *L2TokenRegistryRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _L2TokenRegistry.Contract.L2TokenRegistryCaller.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_L2TokenRegistry *L2TokenRegistryRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _L2TokenRegistry.Contract.L2TokenRegistryTransactor.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_L2TokenRegistry *L2TokenRegistryRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _L2TokenRegistry.Contract.L2TokenRegistryTransactor.contract.Transact(opts, method, params...) +} + +// Call invokes the (constant) contract method with params as input values and +// sets the output to result. The result type might be a single field for simple +// returns, a slice of interfaces for anonymous returns and a struct for named +// returns. +func (_L2TokenRegistry *L2TokenRegistryCallerRaw) Call(opts *bind.CallOpts, result *[]interface{}, method string, params ...interface{}) error { + return _L2TokenRegistry.Contract.contract.Call(opts, result, method, params...) +} + +// Transfer initiates a plain transaction to move funds to the contract, calling +// its default method if one is available. +func (_L2TokenRegistry *L2TokenRegistryTransactorRaw) Transfer(opts *bind.TransactOpts) (*types.Transaction, error) { + return _L2TokenRegistry.Contract.contract.Transfer(opts) +} + +// Transact invokes the (paid) contract method with params as input values. +func (_L2TokenRegistry *L2TokenRegistryTransactorRaw) Transact(opts *bind.TransactOpts, method string, params ...interface{}) (*types.Transaction, error) { + return _L2TokenRegistry.Contract.contract.Transact(opts, method, params...) +} + +// AllowList is a free data retrieval call binding the contract method 0x2848aeaf. +// +// Solidity: function allowList(address user) view returns(bool allowed) +func (_L2TokenRegistry *L2TokenRegistryCaller) AllowList(opts *bind.CallOpts, user common.Address) (bool, error) { + var out []interface{} + err := _L2TokenRegistry.contract.Call(opts, &out, "allowList", user) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// AllowList is a free data retrieval call binding the contract method 0x2848aeaf. +// +// Solidity: function allowList(address user) view returns(bool allowed) +func (_L2TokenRegistry *L2TokenRegistrySession) AllowList(user common.Address) (bool, error) { + return _L2TokenRegistry.Contract.AllowList(&_L2TokenRegistry.CallOpts, user) +} + +// AllowList is a free data retrieval call binding the contract method 0x2848aeaf. +// +// Solidity: function allowList(address user) view returns(bool allowed) +func (_L2TokenRegistry *L2TokenRegistryCallerSession) AllowList(user common.Address) (bool, error) { + return _L2TokenRegistry.Contract.AllowList(&_L2TokenRegistry.CallOpts, user) +} + +// AllowListEnabled is a free data retrieval call binding the contract method 0x22bd5c1c. +// +// Solidity: function allowListEnabled() view returns(bool) +func (_L2TokenRegistry *L2TokenRegistryCaller) AllowListEnabled(opts *bind.CallOpts) (bool, error) { + var out []interface{} + err := _L2TokenRegistry.contract.Call(opts, &out, "allowListEnabled") + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// AllowListEnabled is a free data retrieval call binding the contract method 0x22bd5c1c. +// +// Solidity: function allowListEnabled() view returns(bool) +func (_L2TokenRegistry *L2TokenRegistrySession) AllowListEnabled() (bool, error) { + return _L2TokenRegistry.Contract.AllowListEnabled(&_L2TokenRegistry.CallOpts) +} + +// AllowListEnabled is a free data retrieval call binding the contract method 0x22bd5c1c. +// +// Solidity: function allowListEnabled() view returns(bool) +func (_L2TokenRegistry *L2TokenRegistryCallerSession) AllowListEnabled() (bool, error) { + return _L2TokenRegistry.Contract.AllowListEnabled(&_L2TokenRegistry.CallOpts) +} + +// CalculateTokenAmount is a free data retrieval call binding the contract method 0xdddc98be. +// +// Solidity: function calculateTokenAmount(uint16 _tokenID, uint256 _ethAmount) view returns(uint256 tokenAmount) +func (_L2TokenRegistry *L2TokenRegistryCaller) CalculateTokenAmount(opts *bind.CallOpts, _tokenID uint16, _ethAmount *big.Int) (*big.Int, error) { + var out []interface{} + err := _L2TokenRegistry.contract.Call(opts, &out, "calculateTokenAmount", _tokenID, _ethAmount) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// CalculateTokenAmount is a free data retrieval call binding the contract method 0xdddc98be. +// +// Solidity: function calculateTokenAmount(uint16 _tokenID, uint256 _ethAmount) view returns(uint256 tokenAmount) +func (_L2TokenRegistry *L2TokenRegistrySession) CalculateTokenAmount(_tokenID uint16, _ethAmount *big.Int) (*big.Int, error) { + return _L2TokenRegistry.Contract.CalculateTokenAmount(&_L2TokenRegistry.CallOpts, _tokenID, _ethAmount) +} + +// CalculateTokenAmount is a free data retrieval call binding the contract method 0xdddc98be. +// +// Solidity: function calculateTokenAmount(uint16 _tokenID, uint256 _ethAmount) view returns(uint256 tokenAmount) +func (_L2TokenRegistry *L2TokenRegistryCallerSession) CalculateTokenAmount(_tokenID uint16, _ethAmount *big.Int) (*big.Int, error) { + return _L2TokenRegistry.Contract.CalculateTokenAmount(&_L2TokenRegistry.CallOpts, _tokenID, _ethAmount) +} + +// GetSupportedIDList is a free data retrieval call binding the contract method 0x6f6d6cc1. +// +// Solidity: function getSupportedIDList() view returns(uint16[]) +func (_L2TokenRegistry *L2TokenRegistryCaller) GetSupportedIDList(opts *bind.CallOpts) ([]uint16, error) { + var out []interface{} + err := _L2TokenRegistry.contract.Call(opts, &out, "getSupportedIDList") + + if err != nil { + return *new([]uint16), err + } + + out0 := *abi.ConvertType(out[0], new([]uint16)).(*[]uint16) + + return out0, err + +} + +// GetSupportedIDList is a free data retrieval call binding the contract method 0x6f6d6cc1. +// +// Solidity: function getSupportedIDList() view returns(uint16[]) +func (_L2TokenRegistry *L2TokenRegistrySession) GetSupportedIDList() ([]uint16, error) { + return _L2TokenRegistry.Contract.GetSupportedIDList(&_L2TokenRegistry.CallOpts) +} + +// GetSupportedIDList is a free data retrieval call binding the contract method 0x6f6d6cc1. +// +// Solidity: function getSupportedIDList() view returns(uint16[]) +func (_L2TokenRegistry *L2TokenRegistryCallerSession) GetSupportedIDList() ([]uint16, error) { + return _L2TokenRegistry.Contract.GetSupportedIDList(&_L2TokenRegistry.CallOpts) +} + +// GetSupportedTokenCount is a free data retrieval call binding the contract method 0xce67be26. +// +// Solidity: function getSupportedTokenCount() view returns(uint256) +func (_L2TokenRegistry *L2TokenRegistryCaller) GetSupportedTokenCount(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _L2TokenRegistry.contract.Call(opts, &out, "getSupportedTokenCount") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetSupportedTokenCount is a free data retrieval call binding the contract method 0xce67be26. +// +// Solidity: function getSupportedTokenCount() view returns(uint256) +func (_L2TokenRegistry *L2TokenRegistrySession) GetSupportedTokenCount() (*big.Int, error) { + return _L2TokenRegistry.Contract.GetSupportedTokenCount(&_L2TokenRegistry.CallOpts) +} + +// GetSupportedTokenCount is a free data retrieval call binding the contract method 0xce67be26. +// +// Solidity: function getSupportedTokenCount() view returns(uint256) +func (_L2TokenRegistry *L2TokenRegistryCallerSession) GetSupportedTokenCount() (*big.Int, error) { + return _L2TokenRegistry.Contract.GetSupportedTokenCount(&_L2TokenRegistry.CallOpts) +} + +// GetSupportedTokenList is a free data retrieval call binding the contract method 0x1585458c. +// +// Solidity: function getSupportedTokenList() view returns((uint16,address)[]) +func (_L2TokenRegistry *L2TokenRegistryCaller) GetSupportedTokenList(opts *bind.CallOpts) ([]IL2TokenRegistryTokenEntry, error) { + var out []interface{} + err := _L2TokenRegistry.contract.Call(opts, &out, "getSupportedTokenList") + + if err != nil { + return *new([]IL2TokenRegistryTokenEntry), err + } + + out0 := *abi.ConvertType(out[0], new([]IL2TokenRegistryTokenEntry)).(*[]IL2TokenRegistryTokenEntry) + + return out0, err + +} + +// GetSupportedTokenList is a free data retrieval call binding the contract method 0x1585458c. +// +// Solidity: function getSupportedTokenList() view returns((uint16,address)[]) +func (_L2TokenRegistry *L2TokenRegistrySession) GetSupportedTokenList() ([]IL2TokenRegistryTokenEntry, error) { + return _L2TokenRegistry.Contract.GetSupportedTokenList(&_L2TokenRegistry.CallOpts) +} + +// GetSupportedTokenList is a free data retrieval call binding the contract method 0x1585458c. +// +// Solidity: function getSupportedTokenList() view returns((uint16,address)[]) +func (_L2TokenRegistry *L2TokenRegistryCallerSession) GetSupportedTokenList() ([]IL2TokenRegistryTokenEntry, error) { + return _L2TokenRegistry.Contract.GetSupportedTokenList(&_L2TokenRegistry.CallOpts) +} + +// GetTokenIdByAddress is a free data retrieval call binding the contract method 0x8cbab7e4. +// +// Solidity: function getTokenIdByAddress(address tokenAddress) view returns(uint16) +func (_L2TokenRegistry *L2TokenRegistryCaller) GetTokenIdByAddress(opts *bind.CallOpts, tokenAddress common.Address) (uint16, error) { + var out []interface{} + err := _L2TokenRegistry.contract.Call(opts, &out, "getTokenIdByAddress", tokenAddress) + + if err != nil { + return *new(uint16), err + } + + out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16) + + return out0, err + +} + +// GetTokenIdByAddress is a free data retrieval call binding the contract method 0x8cbab7e4. +// +// Solidity: function getTokenIdByAddress(address tokenAddress) view returns(uint16) +func (_L2TokenRegistry *L2TokenRegistrySession) GetTokenIdByAddress(tokenAddress common.Address) (uint16, error) { + return _L2TokenRegistry.Contract.GetTokenIdByAddress(&_L2TokenRegistry.CallOpts, tokenAddress) +} + +// GetTokenIdByAddress is a free data retrieval call binding the contract method 0x8cbab7e4. +// +// Solidity: function getTokenIdByAddress(address tokenAddress) view returns(uint16) +func (_L2TokenRegistry *L2TokenRegistryCallerSession) GetTokenIdByAddress(tokenAddress common.Address) (uint16, error) { + return _L2TokenRegistry.Contract.GetTokenIdByAddress(&_L2TokenRegistry.CallOpts, tokenAddress) +} + +// GetTokenInfo is a free data retrieval call binding the contract method 0x1c58e793. +// +// Solidity: function getTokenInfo(uint16 _tokenID) view returns((address,bytes32,bool,uint8,uint256) info, bool hasBalanceSlot) +func (_L2TokenRegistry *L2TokenRegistryCaller) GetTokenInfo(opts *bind.CallOpts, _tokenID uint16) (struct { + Info IL2TokenRegistryTokenInfo + HasBalanceSlot bool +}, error) { + var out []interface{} + err := _L2TokenRegistry.contract.Call(opts, &out, "getTokenInfo", _tokenID) + + outstruct := new(struct { + Info IL2TokenRegistryTokenInfo + HasBalanceSlot bool + }) + if err != nil { + return *outstruct, err + } + + outstruct.Info = *abi.ConvertType(out[0], new(IL2TokenRegistryTokenInfo)).(*IL2TokenRegistryTokenInfo) + outstruct.HasBalanceSlot = *abi.ConvertType(out[1], new(bool)).(*bool) + + return *outstruct, err + +} + +// GetTokenInfo is a free data retrieval call binding the contract method 0x1c58e793. +// +// Solidity: function getTokenInfo(uint16 _tokenID) view returns((address,bytes32,bool,uint8,uint256) info, bool hasBalanceSlot) +func (_L2TokenRegistry *L2TokenRegistrySession) GetTokenInfo(_tokenID uint16) (struct { + Info IL2TokenRegistryTokenInfo + HasBalanceSlot bool +}, error) { + return _L2TokenRegistry.Contract.GetTokenInfo(&_L2TokenRegistry.CallOpts, _tokenID) +} + +// GetTokenInfo is a free data retrieval call binding the contract method 0x1c58e793. +// +// Solidity: function getTokenInfo(uint16 _tokenID) view returns((address,bytes32,bool,uint8,uint256) info, bool hasBalanceSlot) +func (_L2TokenRegistry *L2TokenRegistryCallerSession) GetTokenInfo(_tokenID uint16) (struct { + Info IL2TokenRegistryTokenInfo + HasBalanceSlot bool +}, error) { + return _L2TokenRegistry.Contract.GetTokenInfo(&_L2TokenRegistry.CallOpts, _tokenID) +} + +// GetTokenPrice is a free data retrieval call binding the contract method 0x2a1ea5a2. +// +// Solidity: function getTokenPrice(uint16 _tokenID) view returns(uint256) +func (_L2TokenRegistry *L2TokenRegistryCaller) GetTokenPrice(opts *bind.CallOpts, _tokenID uint16) (*big.Int, error) { + var out []interface{} + err := _L2TokenRegistry.contract.Call(opts, &out, "getTokenPrice", _tokenID) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetTokenPrice is a free data retrieval call binding the contract method 0x2a1ea5a2. +// +// Solidity: function getTokenPrice(uint16 _tokenID) view returns(uint256) +func (_L2TokenRegistry *L2TokenRegistrySession) GetTokenPrice(_tokenID uint16) (*big.Int, error) { + return _L2TokenRegistry.Contract.GetTokenPrice(&_L2TokenRegistry.CallOpts, _tokenID) +} + +// GetTokenPrice is a free data retrieval call binding the contract method 0x2a1ea5a2. +// +// Solidity: function getTokenPrice(uint16 _tokenID) view returns(uint256) +func (_L2TokenRegistry *L2TokenRegistryCallerSession) GetTokenPrice(_tokenID uint16) (*big.Int, error) { + return _L2TokenRegistry.Contract.GetTokenPrice(&_L2TokenRegistry.CallOpts, _tokenID) +} + +// GetTokenScale is a free data retrieval call binding the contract method 0xa313d007. +// +// Solidity: function getTokenScale(uint16 _tokenID) view returns(uint256) +func (_L2TokenRegistry *L2TokenRegistryCaller) GetTokenScale(opts *bind.CallOpts, _tokenID uint16) (*big.Int, error) { + var out []interface{} + err := _L2TokenRegistry.contract.Call(opts, &out, "getTokenScale", _tokenID) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// GetTokenScale is a free data retrieval call binding the contract method 0xa313d007. +// +// Solidity: function getTokenScale(uint16 _tokenID) view returns(uint256) +func (_L2TokenRegistry *L2TokenRegistrySession) GetTokenScale(_tokenID uint16) (*big.Int, error) { + return _L2TokenRegistry.Contract.GetTokenScale(&_L2TokenRegistry.CallOpts, _tokenID) +} + +// GetTokenScale is a free data retrieval call binding the contract method 0xa313d007. +// +// Solidity: function getTokenScale(uint16 _tokenID) view returns(uint256) +func (_L2TokenRegistry *L2TokenRegistryCallerSession) GetTokenScale(_tokenID uint16) (*big.Int, error) { + return _L2TokenRegistry.Contract.GetTokenScale(&_L2TokenRegistry.CallOpts, _tokenID) +} + +// IsTokenActive is a free data retrieval call binding the contract method 0xfce40489. +// +// Solidity: function isTokenActive(uint16 _tokenID) view returns(bool) +func (_L2TokenRegistry *L2TokenRegistryCaller) IsTokenActive(opts *bind.CallOpts, _tokenID uint16) (bool, error) { + var out []interface{} + err := _L2TokenRegistry.contract.Call(opts, &out, "isTokenActive", _tokenID) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsTokenActive is a free data retrieval call binding the contract method 0xfce40489. +// +// Solidity: function isTokenActive(uint16 _tokenID) view returns(bool) +func (_L2TokenRegistry *L2TokenRegistrySession) IsTokenActive(_tokenID uint16) (bool, error) { + return _L2TokenRegistry.Contract.IsTokenActive(&_L2TokenRegistry.CallOpts, _tokenID) +} + +// IsTokenActive is a free data retrieval call binding the contract method 0xfce40489. +// +// Solidity: function isTokenActive(uint16 _tokenID) view returns(bool) +func (_L2TokenRegistry *L2TokenRegistryCallerSession) IsTokenActive(_tokenID uint16) (bool, error) { + return _L2TokenRegistry.Contract.IsTokenActive(&_L2TokenRegistry.CallOpts, _tokenID) +} + +// IsTokenSupported is a free data retrieval call binding the contract method 0x4cbcdd13. +// +// Solidity: function isTokenSupported(uint16 _tokenID) view returns(bool) +func (_L2TokenRegistry *L2TokenRegistryCaller) IsTokenSupported(opts *bind.CallOpts, _tokenID uint16) (bool, error) { + var out []interface{} + err := _L2TokenRegistry.contract.Call(opts, &out, "isTokenSupported", _tokenID) + + if err != nil { + return *new(bool), err + } + + out0 := *abi.ConvertType(out[0], new(bool)).(*bool) + + return out0, err + +} + +// IsTokenSupported is a free data retrieval call binding the contract method 0x4cbcdd13. +// +// Solidity: function isTokenSupported(uint16 _tokenID) view returns(bool) +func (_L2TokenRegistry *L2TokenRegistrySession) IsTokenSupported(_tokenID uint16) (bool, error) { + return _L2TokenRegistry.Contract.IsTokenSupported(&_L2TokenRegistry.CallOpts, _tokenID) +} + +// IsTokenSupported is a free data retrieval call binding the contract method 0x4cbcdd13. +// +// Solidity: function isTokenSupported(uint16 _tokenID) view returns(bool) +func (_L2TokenRegistry *L2TokenRegistryCallerSession) IsTokenSupported(_tokenID uint16) (bool, error) { + return _L2TokenRegistry.Contract.IsTokenSupported(&_L2TokenRegistry.CallOpts, _tokenID) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_L2TokenRegistry *L2TokenRegistryCaller) Owner(opts *bind.CallOpts) (common.Address, error) { + var out []interface{} + err := _L2TokenRegistry.contract.Call(opts, &out, "owner") + + if err != nil { + return *new(common.Address), err + } + + out0 := *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + + return out0, err + +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_L2TokenRegistry *L2TokenRegistrySession) Owner() (common.Address, error) { + return _L2TokenRegistry.Contract.Owner(&_L2TokenRegistry.CallOpts) +} + +// Owner is a free data retrieval call binding the contract method 0x8da5cb5b. +// +// Solidity: function owner() view returns(address) +func (_L2TokenRegistry *L2TokenRegistryCallerSession) Owner() (common.Address, error) { + return _L2TokenRegistry.Contract.Owner(&_L2TokenRegistry.CallOpts) +} + +// PriceRatio is a free data retrieval call binding the contract method 0x19904c33. +// +// Solidity: function priceRatio(uint16 tokenID) view returns(uint256 priceRatio) +func (_L2TokenRegistry *L2TokenRegistryCaller) PriceRatio(opts *bind.CallOpts, tokenID uint16) (*big.Int, error) { + var out []interface{} + err := _L2TokenRegistry.contract.Call(opts, &out, "priceRatio", tokenID) + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// PriceRatio is a free data retrieval call binding the contract method 0x19904c33. +// +// Solidity: function priceRatio(uint16 tokenID) view returns(uint256 priceRatio) +func (_L2TokenRegistry *L2TokenRegistrySession) PriceRatio(tokenID uint16) (*big.Int, error) { + return _L2TokenRegistry.Contract.PriceRatio(&_L2TokenRegistry.CallOpts, tokenID) +} + +// PriceRatio is a free data retrieval call binding the contract method 0x19904c33. +// +// Solidity: function priceRatio(uint16 tokenID) view returns(uint256 priceRatio) +func (_L2TokenRegistry *L2TokenRegistryCallerSession) PriceRatio(tokenID uint16) (*big.Int, error) { + return _L2TokenRegistry.Contract.PriceRatio(&_L2TokenRegistry.CallOpts, tokenID) +} + +// TokenRegistration is a free data retrieval call binding the contract method 0x724f91ce. +// +// Solidity: function tokenRegistration(address tokenAddress) view returns(uint16 tokenID) +func (_L2TokenRegistry *L2TokenRegistryCaller) TokenRegistration(opts *bind.CallOpts, tokenAddress common.Address) (uint16, error) { + var out []interface{} + err := _L2TokenRegistry.contract.Call(opts, &out, "tokenRegistration", tokenAddress) + + if err != nil { + return *new(uint16), err + } + + out0 := *abi.ConvertType(out[0], new(uint16)).(*uint16) + + return out0, err + +} + +// TokenRegistration is a free data retrieval call binding the contract method 0x724f91ce. +// +// Solidity: function tokenRegistration(address tokenAddress) view returns(uint16 tokenID) +func (_L2TokenRegistry *L2TokenRegistrySession) TokenRegistration(tokenAddress common.Address) (uint16, error) { + return _L2TokenRegistry.Contract.TokenRegistration(&_L2TokenRegistry.CallOpts, tokenAddress) +} + +// TokenRegistration is a free data retrieval call binding the contract method 0x724f91ce. +// +// Solidity: function tokenRegistration(address tokenAddress) view returns(uint16 tokenID) +func (_L2TokenRegistry *L2TokenRegistryCallerSession) TokenRegistration(tokenAddress common.Address) (uint16, error) { + return _L2TokenRegistry.Contract.TokenRegistration(&_L2TokenRegistry.CallOpts, tokenAddress) +} + +// TokenRegistry is a free data retrieval call binding the contract method 0x85519c36. +// +// Solidity: function tokenRegistry(uint16 tokenID) view returns(address tokenAddress, bytes32 balanceSlot, bool isActive, uint8 decimals, uint256 scale) +func (_L2TokenRegistry *L2TokenRegistryCaller) TokenRegistry(opts *bind.CallOpts, tokenID uint16) (struct { + TokenAddress common.Address + BalanceSlot [32]byte + IsActive bool + Decimals uint8 + Scale *big.Int +}, error) { + var out []interface{} + err := _L2TokenRegistry.contract.Call(opts, &out, "tokenRegistry", tokenID) + + outstruct := new(struct { + TokenAddress common.Address + BalanceSlot [32]byte + IsActive bool + Decimals uint8 + Scale *big.Int + }) + if err != nil { + return *outstruct, err + } + + outstruct.TokenAddress = *abi.ConvertType(out[0], new(common.Address)).(*common.Address) + outstruct.BalanceSlot = *abi.ConvertType(out[1], new([32]byte)).(*[32]byte) + outstruct.IsActive = *abi.ConvertType(out[2], new(bool)).(*bool) + outstruct.Decimals = *abi.ConvertType(out[3], new(uint8)).(*uint8) + outstruct.Scale = *abi.ConvertType(out[4], new(*big.Int)).(**big.Int) + + return *outstruct, err + +} + +// TokenRegistry is a free data retrieval call binding the contract method 0x85519c36. +// +// Solidity: function tokenRegistry(uint16 tokenID) view returns(address tokenAddress, bytes32 balanceSlot, bool isActive, uint8 decimals, uint256 scale) +func (_L2TokenRegistry *L2TokenRegistrySession) TokenRegistry(tokenID uint16) (struct { + TokenAddress common.Address + BalanceSlot [32]byte + IsActive bool + Decimals uint8 + Scale *big.Int +}, error) { + return _L2TokenRegistry.Contract.TokenRegistry(&_L2TokenRegistry.CallOpts, tokenID) +} + +// TokenRegistry is a free data retrieval call binding the contract method 0x85519c36. +// +// Solidity: function tokenRegistry(uint16 tokenID) view returns(address tokenAddress, bytes32 balanceSlot, bool isActive, uint8 decimals, uint256 scale) +func (_L2TokenRegistry *L2TokenRegistryCallerSession) TokenRegistry(tokenID uint16) (struct { + TokenAddress common.Address + BalanceSlot [32]byte + IsActive bool + Decimals uint8 + Scale *big.Int +}, error) { + return _L2TokenRegistry.Contract.TokenRegistry(&_L2TokenRegistry.CallOpts, tokenID) +} + +// BatchUpdatePrices is a paid mutator transaction binding the contract method 0x8c399691. +// +// Solidity: function batchUpdatePrices(uint16[] _tokenIDs, uint256[] _prices) returns() +func (_L2TokenRegistry *L2TokenRegistryTransactor) BatchUpdatePrices(opts *bind.TransactOpts, _tokenIDs []uint16, _prices []*big.Int) (*types.Transaction, error) { + return _L2TokenRegistry.contract.Transact(opts, "batchUpdatePrices", _tokenIDs, _prices) +} + +// BatchUpdatePrices is a paid mutator transaction binding the contract method 0x8c399691. +// +// Solidity: function batchUpdatePrices(uint16[] _tokenIDs, uint256[] _prices) returns() +func (_L2TokenRegistry *L2TokenRegistrySession) BatchUpdatePrices(_tokenIDs []uint16, _prices []*big.Int) (*types.Transaction, error) { + return _L2TokenRegistry.Contract.BatchUpdatePrices(&_L2TokenRegistry.TransactOpts, _tokenIDs, _prices) +} + +// BatchUpdatePrices is a paid mutator transaction binding the contract method 0x8c399691. +// +// Solidity: function batchUpdatePrices(uint16[] _tokenIDs, uint256[] _prices) returns() +func (_L2TokenRegistry *L2TokenRegistryTransactorSession) BatchUpdatePrices(_tokenIDs []uint16, _prices []*big.Int) (*types.Transaction, error) { + return _L2TokenRegistry.Contract.BatchUpdatePrices(&_L2TokenRegistry.TransactOpts, _tokenIDs, _prices) +} + +// BatchUpdateTokenStatus is a paid mutator transaction binding the contract method 0x9190202e. +// +// Solidity: function batchUpdateTokenStatus(uint16[] _tokenIDs, bool[] _isActives) returns() +func (_L2TokenRegistry *L2TokenRegistryTransactor) BatchUpdateTokenStatus(opts *bind.TransactOpts, _tokenIDs []uint16, _isActives []bool) (*types.Transaction, error) { + return _L2TokenRegistry.contract.Transact(opts, "batchUpdateTokenStatus", _tokenIDs, _isActives) +} + +// BatchUpdateTokenStatus is a paid mutator transaction binding the contract method 0x9190202e. +// +// Solidity: function batchUpdateTokenStatus(uint16[] _tokenIDs, bool[] _isActives) returns() +func (_L2TokenRegistry *L2TokenRegistrySession) BatchUpdateTokenStatus(_tokenIDs []uint16, _isActives []bool) (*types.Transaction, error) { + return _L2TokenRegistry.Contract.BatchUpdateTokenStatus(&_L2TokenRegistry.TransactOpts, _tokenIDs, _isActives) +} + +// BatchUpdateTokenStatus is a paid mutator transaction binding the contract method 0x9190202e. +// +// Solidity: function batchUpdateTokenStatus(uint16[] _tokenIDs, bool[] _isActives) returns() +func (_L2TokenRegistry *L2TokenRegistryTransactorSession) BatchUpdateTokenStatus(_tokenIDs []uint16, _isActives []bool) (*types.Transaction, error) { + return _L2TokenRegistry.Contract.BatchUpdateTokenStatus(&_L2TokenRegistry.TransactOpts, _tokenIDs, _isActives) +} + +// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. +// +// Solidity: function initialize(address owner_) returns() +func (_L2TokenRegistry *L2TokenRegistryTransactor) Initialize(opts *bind.TransactOpts, owner_ common.Address) (*types.Transaction, error) { + return _L2TokenRegistry.contract.Transact(opts, "initialize", owner_) +} + +// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. +// +// Solidity: function initialize(address owner_) returns() +func (_L2TokenRegistry *L2TokenRegistrySession) Initialize(owner_ common.Address) (*types.Transaction, error) { + return _L2TokenRegistry.Contract.Initialize(&_L2TokenRegistry.TransactOpts, owner_) +} + +// Initialize is a paid mutator transaction binding the contract method 0xc4d66de8. +// +// Solidity: function initialize(address owner_) returns() +func (_L2TokenRegistry *L2TokenRegistryTransactorSession) Initialize(owner_ common.Address) (*types.Transaction, error) { + return _L2TokenRegistry.Contract.Initialize(&_L2TokenRegistry.TransactOpts, owner_) +} + +// RegisterToken is a paid mutator transaction binding the contract method 0x5c45246b. +// +// Solidity: function registerToken(uint16 _tokenID, address _tokenAddress, bytes32 _balanceSlot, bool _needBalanceSlot, uint256 _scale) returns() +func (_L2TokenRegistry *L2TokenRegistryTransactor) RegisterToken(opts *bind.TransactOpts, _tokenID uint16, _tokenAddress common.Address, _balanceSlot [32]byte, _needBalanceSlot bool, _scale *big.Int) (*types.Transaction, error) { + return _L2TokenRegistry.contract.Transact(opts, "registerToken", _tokenID, _tokenAddress, _balanceSlot, _needBalanceSlot, _scale) +} + +// RegisterToken is a paid mutator transaction binding the contract method 0x5c45246b. +// +// Solidity: function registerToken(uint16 _tokenID, address _tokenAddress, bytes32 _balanceSlot, bool _needBalanceSlot, uint256 _scale) returns() +func (_L2TokenRegistry *L2TokenRegistrySession) RegisterToken(_tokenID uint16, _tokenAddress common.Address, _balanceSlot [32]byte, _needBalanceSlot bool, _scale *big.Int) (*types.Transaction, error) { + return _L2TokenRegistry.Contract.RegisterToken(&_L2TokenRegistry.TransactOpts, _tokenID, _tokenAddress, _balanceSlot, _needBalanceSlot, _scale) +} + +// RegisterToken is a paid mutator transaction binding the contract method 0x5c45246b. +// +// Solidity: function registerToken(uint16 _tokenID, address _tokenAddress, bytes32 _balanceSlot, bool _needBalanceSlot, uint256 _scale) returns() +func (_L2TokenRegistry *L2TokenRegistryTransactorSession) RegisterToken(_tokenID uint16, _tokenAddress common.Address, _balanceSlot [32]byte, _needBalanceSlot bool, _scale *big.Int) (*types.Transaction, error) { + return _L2TokenRegistry.Contract.RegisterToken(&_L2TokenRegistry.TransactOpts, _tokenID, _tokenAddress, _balanceSlot, _needBalanceSlot, _scale) +} + +// RegisterTokens is a paid mutator transaction binding the contract method 0xa1218001. +// +// Solidity: function registerTokens(uint16[] _tokenIDs, address[] _tokenAddresses, bytes32[] _balanceSlots, bool[] _needBalanceSlots, uint256[] _scales) returns() +func (_L2TokenRegistry *L2TokenRegistryTransactor) RegisterTokens(opts *bind.TransactOpts, _tokenIDs []uint16, _tokenAddresses []common.Address, _balanceSlots [][32]byte, _needBalanceSlots []bool, _scales []*big.Int) (*types.Transaction, error) { + return _L2TokenRegistry.contract.Transact(opts, "registerTokens", _tokenIDs, _tokenAddresses, _balanceSlots, _needBalanceSlots, _scales) +} + +// RegisterTokens is a paid mutator transaction binding the contract method 0xa1218001. +// +// Solidity: function registerTokens(uint16[] _tokenIDs, address[] _tokenAddresses, bytes32[] _balanceSlots, bool[] _needBalanceSlots, uint256[] _scales) returns() +func (_L2TokenRegistry *L2TokenRegistrySession) RegisterTokens(_tokenIDs []uint16, _tokenAddresses []common.Address, _balanceSlots [][32]byte, _needBalanceSlots []bool, _scales []*big.Int) (*types.Transaction, error) { + return _L2TokenRegistry.Contract.RegisterTokens(&_L2TokenRegistry.TransactOpts, _tokenIDs, _tokenAddresses, _balanceSlots, _needBalanceSlots, _scales) +} + +// RegisterTokens is a paid mutator transaction binding the contract method 0xa1218001. +// +// Solidity: function registerTokens(uint16[] _tokenIDs, address[] _tokenAddresses, bytes32[] _balanceSlots, bool[] _needBalanceSlots, uint256[] _scales) returns() +func (_L2TokenRegistry *L2TokenRegistryTransactorSession) RegisterTokens(_tokenIDs []uint16, _tokenAddresses []common.Address, _balanceSlots [][32]byte, _needBalanceSlots []bool, _scales []*big.Int) (*types.Transaction, error) { + return _L2TokenRegistry.Contract.RegisterTokens(&_L2TokenRegistry.TransactOpts, _tokenIDs, _tokenAddresses, _balanceSlots, _needBalanceSlots, _scales) +} + +// RemoveToken is a paid mutator transaction binding the contract method 0xdbbb2faa. +// +// Solidity: function removeToken(uint16 _tokenID) returns() +func (_L2TokenRegistry *L2TokenRegistryTransactor) RemoveToken(opts *bind.TransactOpts, _tokenID uint16) (*types.Transaction, error) { + return _L2TokenRegistry.contract.Transact(opts, "removeToken", _tokenID) +} + +// RemoveToken is a paid mutator transaction binding the contract method 0xdbbb2faa. +// +// Solidity: function removeToken(uint16 _tokenID) returns() +func (_L2TokenRegistry *L2TokenRegistrySession) RemoveToken(_tokenID uint16) (*types.Transaction, error) { + return _L2TokenRegistry.Contract.RemoveToken(&_L2TokenRegistry.TransactOpts, _tokenID) +} + +// RemoveToken is a paid mutator transaction binding the contract method 0xdbbb2faa. +// +// Solidity: function removeToken(uint16 _tokenID) returns() +func (_L2TokenRegistry *L2TokenRegistryTransactorSession) RemoveToken(_tokenID uint16) (*types.Transaction, error) { + return _L2TokenRegistry.Contract.RemoveToken(&_L2TokenRegistry.TransactOpts, _tokenID) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_L2TokenRegistry *L2TokenRegistryTransactor) RenounceOwnership(opts *bind.TransactOpts) (*types.Transaction, error) { + return _L2TokenRegistry.contract.Transact(opts, "renounceOwnership") +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_L2TokenRegistry *L2TokenRegistrySession) RenounceOwnership() (*types.Transaction, error) { + return _L2TokenRegistry.Contract.RenounceOwnership(&_L2TokenRegistry.TransactOpts) +} + +// RenounceOwnership is a paid mutator transaction binding the contract method 0x715018a6. +// +// Solidity: function renounceOwnership() returns() +func (_L2TokenRegistry *L2TokenRegistryTransactorSession) RenounceOwnership() (*types.Transaction, error) { + return _L2TokenRegistry.Contract.RenounceOwnership(&_L2TokenRegistry.TransactOpts) +} + +// SetAllowList is a paid mutator transaction binding the contract method 0xe3de72a5. +// +// Solidity: function setAllowList(address[] user, bool[] val) returns() +func (_L2TokenRegistry *L2TokenRegistryTransactor) SetAllowList(opts *bind.TransactOpts, user []common.Address, val []bool) (*types.Transaction, error) { + return _L2TokenRegistry.contract.Transact(opts, "setAllowList", user, val) +} + +// SetAllowList is a paid mutator transaction binding the contract method 0xe3de72a5. +// +// Solidity: function setAllowList(address[] user, bool[] val) returns() +func (_L2TokenRegistry *L2TokenRegistrySession) SetAllowList(user []common.Address, val []bool) (*types.Transaction, error) { + return _L2TokenRegistry.Contract.SetAllowList(&_L2TokenRegistry.TransactOpts, user, val) +} + +// SetAllowList is a paid mutator transaction binding the contract method 0xe3de72a5. +// +// Solidity: function setAllowList(address[] user, bool[] val) returns() +func (_L2TokenRegistry *L2TokenRegistryTransactorSession) SetAllowList(user []common.Address, val []bool) (*types.Transaction, error) { + return _L2TokenRegistry.Contract.SetAllowList(&_L2TokenRegistry.TransactOpts, user, val) +} + +// SetAllowListEnabled is a paid mutator transaction binding the contract method 0xefeadb6d. +// +// Solidity: function setAllowListEnabled(bool _allowListEnabled) returns() +func (_L2TokenRegistry *L2TokenRegistryTransactor) SetAllowListEnabled(opts *bind.TransactOpts, _allowListEnabled bool) (*types.Transaction, error) { + return _L2TokenRegistry.contract.Transact(opts, "setAllowListEnabled", _allowListEnabled) +} + +// SetAllowListEnabled is a paid mutator transaction binding the contract method 0xefeadb6d. +// +// Solidity: function setAllowListEnabled(bool _allowListEnabled) returns() +func (_L2TokenRegistry *L2TokenRegistrySession) SetAllowListEnabled(_allowListEnabled bool) (*types.Transaction, error) { + return _L2TokenRegistry.Contract.SetAllowListEnabled(&_L2TokenRegistry.TransactOpts, _allowListEnabled) +} + +// SetAllowListEnabled is a paid mutator transaction binding the contract method 0xefeadb6d. +// +// Solidity: function setAllowListEnabled(bool _allowListEnabled) returns() +func (_L2TokenRegistry *L2TokenRegistryTransactorSession) SetAllowListEnabled(_allowListEnabled bool) (*types.Transaction, error) { + return _L2TokenRegistry.Contract.SetAllowListEnabled(&_L2TokenRegistry.TransactOpts, _allowListEnabled) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_L2TokenRegistry *L2TokenRegistryTransactor) TransferOwnership(opts *bind.TransactOpts, newOwner common.Address) (*types.Transaction, error) { + return _L2TokenRegistry.contract.Transact(opts, "transferOwnership", newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_L2TokenRegistry *L2TokenRegistrySession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _L2TokenRegistry.Contract.TransferOwnership(&_L2TokenRegistry.TransactOpts, newOwner) +} + +// TransferOwnership is a paid mutator transaction binding the contract method 0xf2fde38b. +// +// Solidity: function transferOwnership(address newOwner) returns() +func (_L2TokenRegistry *L2TokenRegistryTransactorSession) TransferOwnership(newOwner common.Address) (*types.Transaction, error) { + return _L2TokenRegistry.Contract.TransferOwnership(&_L2TokenRegistry.TransactOpts, newOwner) +} + +// UpdatePriceRatio is a paid mutator transaction binding the contract method 0xb10b69ee. +// +// Solidity: function updatePriceRatio(uint16 _tokenID, uint256 _newPrice) returns() +func (_L2TokenRegistry *L2TokenRegistryTransactor) UpdatePriceRatio(opts *bind.TransactOpts, _tokenID uint16, _newPrice *big.Int) (*types.Transaction, error) { + return _L2TokenRegistry.contract.Transact(opts, "updatePriceRatio", _tokenID, _newPrice) +} + +// UpdatePriceRatio is a paid mutator transaction binding the contract method 0xb10b69ee. +// +// Solidity: function updatePriceRatio(uint16 _tokenID, uint256 _newPrice) returns() +func (_L2TokenRegistry *L2TokenRegistrySession) UpdatePriceRatio(_tokenID uint16, _newPrice *big.Int) (*types.Transaction, error) { + return _L2TokenRegistry.Contract.UpdatePriceRatio(&_L2TokenRegistry.TransactOpts, _tokenID, _newPrice) +} + +// UpdatePriceRatio is a paid mutator transaction binding the contract method 0xb10b69ee. +// +// Solidity: function updatePriceRatio(uint16 _tokenID, uint256 _newPrice) returns() +func (_L2TokenRegistry *L2TokenRegistryTransactorSession) UpdatePriceRatio(_tokenID uint16, _newPrice *big.Int) (*types.Transaction, error) { + return _L2TokenRegistry.Contract.UpdatePriceRatio(&_L2TokenRegistry.TransactOpts, _tokenID, _newPrice) +} + +// UpdateTokenInfo is a paid mutator transaction binding the contract method 0x7304880c. +// +// Solidity: function updateTokenInfo(uint16 _tokenID, address _tokenAddress, bytes32 _balanceSlot, bool _needBalanceSlot, bool _isActive, uint256 _scale) returns() +func (_L2TokenRegistry *L2TokenRegistryTransactor) UpdateTokenInfo(opts *bind.TransactOpts, _tokenID uint16, _tokenAddress common.Address, _balanceSlot [32]byte, _needBalanceSlot bool, _isActive bool, _scale *big.Int) (*types.Transaction, error) { + return _L2TokenRegistry.contract.Transact(opts, "updateTokenInfo", _tokenID, _tokenAddress, _balanceSlot, _needBalanceSlot, _isActive, _scale) +} + +// UpdateTokenInfo is a paid mutator transaction binding the contract method 0x7304880c. +// +// Solidity: function updateTokenInfo(uint16 _tokenID, address _tokenAddress, bytes32 _balanceSlot, bool _needBalanceSlot, bool _isActive, uint256 _scale) returns() +func (_L2TokenRegistry *L2TokenRegistrySession) UpdateTokenInfo(_tokenID uint16, _tokenAddress common.Address, _balanceSlot [32]byte, _needBalanceSlot bool, _isActive bool, _scale *big.Int) (*types.Transaction, error) { + return _L2TokenRegistry.Contract.UpdateTokenInfo(&_L2TokenRegistry.TransactOpts, _tokenID, _tokenAddress, _balanceSlot, _needBalanceSlot, _isActive, _scale) +} + +// UpdateTokenInfo is a paid mutator transaction binding the contract method 0x7304880c. +// +// Solidity: function updateTokenInfo(uint16 _tokenID, address _tokenAddress, bytes32 _balanceSlot, bool _needBalanceSlot, bool _isActive, uint256 _scale) returns() +func (_L2TokenRegistry *L2TokenRegistryTransactorSession) UpdateTokenInfo(_tokenID uint16, _tokenAddress common.Address, _balanceSlot [32]byte, _needBalanceSlot bool, _isActive bool, _scale *big.Int) (*types.Transaction, error) { + return _L2TokenRegistry.Contract.UpdateTokenInfo(&_L2TokenRegistry.TransactOpts, _tokenID, _tokenAddress, _balanceSlot, _needBalanceSlot, _isActive, _scale) +} + +// UpdateTokenScale is a paid mutator transaction binding the contract method 0xef0fde0f. +// +// Solidity: function updateTokenScale(uint16 _tokenID, uint256 _newScale) returns() +func (_L2TokenRegistry *L2TokenRegistryTransactor) UpdateTokenScale(opts *bind.TransactOpts, _tokenID uint16, _newScale *big.Int) (*types.Transaction, error) { + return _L2TokenRegistry.contract.Transact(opts, "updateTokenScale", _tokenID, _newScale) +} + +// UpdateTokenScale is a paid mutator transaction binding the contract method 0xef0fde0f. +// +// Solidity: function updateTokenScale(uint16 _tokenID, uint256 _newScale) returns() +func (_L2TokenRegistry *L2TokenRegistrySession) UpdateTokenScale(_tokenID uint16, _newScale *big.Int) (*types.Transaction, error) { + return _L2TokenRegistry.Contract.UpdateTokenScale(&_L2TokenRegistry.TransactOpts, _tokenID, _newScale) +} + +// UpdateTokenScale is a paid mutator transaction binding the contract method 0xef0fde0f. +// +// Solidity: function updateTokenScale(uint16 _tokenID, uint256 _newScale) returns() +func (_L2TokenRegistry *L2TokenRegistryTransactorSession) UpdateTokenScale(_tokenID uint16, _newScale *big.Int) (*types.Transaction, error) { + return _L2TokenRegistry.Contract.UpdateTokenScale(&_L2TokenRegistry.TransactOpts, _tokenID, _newScale) +} + +// L2TokenRegistryAllowListEnabledUpdatedIterator is returned from FilterAllowListEnabledUpdated and is used to iterate over the raw logs and unpacked data for AllowListEnabledUpdated events raised by the L2TokenRegistry contract. +type L2TokenRegistryAllowListEnabledUpdatedIterator struct { + Event *L2TokenRegistryAllowListEnabledUpdated // 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 *L2TokenRegistryAllowListEnabledUpdatedIterator) 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(L2TokenRegistryAllowListEnabledUpdated) + 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(L2TokenRegistryAllowListEnabledUpdated) + 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 *L2TokenRegistryAllowListEnabledUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *L2TokenRegistryAllowListEnabledUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// L2TokenRegistryAllowListEnabledUpdated represents a AllowListEnabledUpdated event raised by the L2TokenRegistry contract. +type L2TokenRegistryAllowListEnabledUpdated struct { + IsEnabled bool + Raw types.Log // Blockchain specific contextual infos +} + +// FilterAllowListEnabledUpdated is a free log retrieval operation binding the contract event 0x16435b45f7482047f839a6a19d291442627200f52cad2803c595150d0d440eb3. +// +// Solidity: event AllowListEnabledUpdated(bool isEnabled) +func (_L2TokenRegistry *L2TokenRegistryFilterer) FilterAllowListEnabledUpdated(opts *bind.FilterOpts) (*L2TokenRegistryAllowListEnabledUpdatedIterator, error) { + + logs, sub, err := _L2TokenRegistry.contract.FilterLogs(opts, "AllowListEnabledUpdated") + if err != nil { + return nil, err + } + return &L2TokenRegistryAllowListEnabledUpdatedIterator{contract: _L2TokenRegistry.contract, event: "AllowListEnabledUpdated", logs: logs, sub: sub}, nil +} + +// WatchAllowListEnabledUpdated is a free log subscription operation binding the contract event 0x16435b45f7482047f839a6a19d291442627200f52cad2803c595150d0d440eb3. +// +// Solidity: event AllowListEnabledUpdated(bool isEnabled) +func (_L2TokenRegistry *L2TokenRegistryFilterer) WatchAllowListEnabledUpdated(opts *bind.WatchOpts, sink chan<- *L2TokenRegistryAllowListEnabledUpdated) (event.Subscription, error) { + + logs, sub, err := _L2TokenRegistry.contract.WatchLogs(opts, "AllowListEnabledUpdated") + 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(L2TokenRegistryAllowListEnabledUpdated) + if err := _L2TokenRegistry.contract.UnpackLog(event, "AllowListEnabledUpdated", 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 +} + +// ParseAllowListEnabledUpdated is a log parse operation binding the contract event 0x16435b45f7482047f839a6a19d291442627200f52cad2803c595150d0d440eb3. +// +// Solidity: event AllowListEnabledUpdated(bool isEnabled) +func (_L2TokenRegistry *L2TokenRegistryFilterer) ParseAllowListEnabledUpdated(log types.Log) (*L2TokenRegistryAllowListEnabledUpdated, error) { + event := new(L2TokenRegistryAllowListEnabledUpdated) + if err := _L2TokenRegistry.contract.UnpackLog(event, "AllowListEnabledUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// L2TokenRegistryAllowListSetIterator is returned from FilterAllowListSet and is used to iterate over the raw logs and unpacked data for AllowListSet events raised by the L2TokenRegistry contract. +type L2TokenRegistryAllowListSetIterator struct { + Event *L2TokenRegistryAllowListSet // 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 *L2TokenRegistryAllowListSetIterator) 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(L2TokenRegistryAllowListSet) + 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(L2TokenRegistryAllowListSet) + 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 *L2TokenRegistryAllowListSetIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *L2TokenRegistryAllowListSetIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// L2TokenRegistryAllowListSet represents a AllowListSet event raised by the L2TokenRegistry contract. +type L2TokenRegistryAllowListSet struct { + User common.Address + Val bool + Raw types.Log // Blockchain specific contextual infos +} + +// FilterAllowListSet is a free log retrieval operation binding the contract event 0x6dad0aed33f4b7f07095619b668698e17943fd9f4c83e7cfcc7f6dd880a11588. +// +// Solidity: event AllowListSet(address indexed user, bool val) +func (_L2TokenRegistry *L2TokenRegistryFilterer) FilterAllowListSet(opts *bind.FilterOpts, user []common.Address) (*L2TokenRegistryAllowListSetIterator, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _L2TokenRegistry.contract.FilterLogs(opts, "AllowListSet", userRule) + if err != nil { + return nil, err + } + return &L2TokenRegistryAllowListSetIterator{contract: _L2TokenRegistry.contract, event: "AllowListSet", logs: logs, sub: sub}, nil +} + +// WatchAllowListSet is a free log subscription operation binding the contract event 0x6dad0aed33f4b7f07095619b668698e17943fd9f4c83e7cfcc7f6dd880a11588. +// +// Solidity: event AllowListSet(address indexed user, bool val) +func (_L2TokenRegistry *L2TokenRegistryFilterer) WatchAllowListSet(opts *bind.WatchOpts, sink chan<- *L2TokenRegistryAllowListSet, user []common.Address) (event.Subscription, error) { + + var userRule []interface{} + for _, userItem := range user { + userRule = append(userRule, userItem) + } + + logs, sub, err := _L2TokenRegistry.contract.WatchLogs(opts, "AllowListSet", userRule) + 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(L2TokenRegistryAllowListSet) + if err := _L2TokenRegistry.contract.UnpackLog(event, "AllowListSet", 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 +} + +// ParseAllowListSet is a log parse operation binding the contract event 0x6dad0aed33f4b7f07095619b668698e17943fd9f4c83e7cfcc7f6dd880a11588. +// +// Solidity: event AllowListSet(address indexed user, bool val) +func (_L2TokenRegistry *L2TokenRegistryFilterer) ParseAllowListSet(log types.Log) (*L2TokenRegistryAllowListSet, error) { + event := new(L2TokenRegistryAllowListSet) + if err := _L2TokenRegistry.contract.UnpackLog(event, "AllowListSet", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// L2TokenRegistryInitializedIterator is returned from FilterInitialized and is used to iterate over the raw logs and unpacked data for Initialized events raised by the L2TokenRegistry contract. +type L2TokenRegistryInitializedIterator struct { + Event *L2TokenRegistryInitialized // 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 *L2TokenRegistryInitializedIterator) 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(L2TokenRegistryInitialized) + 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(L2TokenRegistryInitialized) + 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 *L2TokenRegistryInitializedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *L2TokenRegistryInitializedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// L2TokenRegistryInitialized represents a Initialized event raised by the L2TokenRegistry contract. +type L2TokenRegistryInitialized struct { + Version uint8 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterInitialized is a free log retrieval operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_L2TokenRegistry *L2TokenRegistryFilterer) FilterInitialized(opts *bind.FilterOpts) (*L2TokenRegistryInitializedIterator, error) { + + logs, sub, err := _L2TokenRegistry.contract.FilterLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return &L2TokenRegistryInitializedIterator{contract: _L2TokenRegistry.contract, event: "Initialized", logs: logs, sub: sub}, nil +} + +// WatchInitialized is a free log subscription operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_L2TokenRegistry *L2TokenRegistryFilterer) WatchInitialized(opts *bind.WatchOpts, sink chan<- *L2TokenRegistryInitialized) (event.Subscription, error) { + + logs, sub, err := _L2TokenRegistry.contract.WatchLogs(opts, "Initialized") + if err != nil { + return nil, err + } + return event.NewSubscription(func(quit <-chan struct{}) error { + defer sub.Unsubscribe() + for { + select { + case log := <-logs: + // New log arrived, parse the event and forward to the user + event := new(L2TokenRegistryInitialized) + if err := _L2TokenRegistry.contract.UnpackLog(event, "Initialized", log); err != nil { + return err + } + event.Raw = log + + select { + case sink <- event: + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + case err := <-sub.Err(): + return err + case <-quit: + return nil + } + } + }), nil +} + +// ParseInitialized is a log parse operation binding the contract event 0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498. +// +// Solidity: event Initialized(uint8 version) +func (_L2TokenRegistry *L2TokenRegistryFilterer) ParseInitialized(log types.Log) (*L2TokenRegistryInitialized, error) { + event := new(L2TokenRegistryInitialized) + if err := _L2TokenRegistry.contract.UnpackLog(event, "Initialized", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// L2TokenRegistryOwnershipTransferredIterator is returned from FilterOwnershipTransferred and is used to iterate over the raw logs and unpacked data for OwnershipTransferred events raised by the L2TokenRegistry contract. +type L2TokenRegistryOwnershipTransferredIterator struct { + Event *L2TokenRegistryOwnershipTransferred // 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 *L2TokenRegistryOwnershipTransferredIterator) 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(L2TokenRegistryOwnershipTransferred) + 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(L2TokenRegistryOwnershipTransferred) + 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 *L2TokenRegistryOwnershipTransferredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *L2TokenRegistryOwnershipTransferredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// L2TokenRegistryOwnershipTransferred represents a OwnershipTransferred event raised by the L2TokenRegistry contract. +type L2TokenRegistryOwnershipTransferred struct { + PreviousOwner common.Address + NewOwner common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterOwnershipTransferred is a free log retrieval operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_L2TokenRegistry *L2TokenRegistryFilterer) FilterOwnershipTransferred(opts *bind.FilterOpts, previousOwner []common.Address, newOwner []common.Address) (*L2TokenRegistryOwnershipTransferredIterator, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _L2TokenRegistry.contract.FilterLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + if err != nil { + return nil, err + } + return &L2TokenRegistryOwnershipTransferredIterator{contract: _L2TokenRegistry.contract, event: "OwnershipTransferred", logs: logs, sub: sub}, nil +} + +// WatchOwnershipTransferred is a free log subscription operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_L2TokenRegistry *L2TokenRegistryFilterer) WatchOwnershipTransferred(opts *bind.WatchOpts, sink chan<- *L2TokenRegistryOwnershipTransferred, previousOwner []common.Address, newOwner []common.Address) (event.Subscription, error) { + + var previousOwnerRule []interface{} + for _, previousOwnerItem := range previousOwner { + previousOwnerRule = append(previousOwnerRule, previousOwnerItem) + } + var newOwnerRule []interface{} + for _, newOwnerItem := range newOwner { + newOwnerRule = append(newOwnerRule, newOwnerItem) + } + + logs, sub, err := _L2TokenRegistry.contract.WatchLogs(opts, "OwnershipTransferred", previousOwnerRule, newOwnerRule) + 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(L2TokenRegistryOwnershipTransferred) + if err := _L2TokenRegistry.contract.UnpackLog(event, "OwnershipTransferred", 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 +} + +// ParseOwnershipTransferred is a log parse operation binding the contract event 0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0. +// +// Solidity: event OwnershipTransferred(address indexed previousOwner, address indexed newOwner) +func (_L2TokenRegistry *L2TokenRegistryFilterer) ParseOwnershipTransferred(log types.Log) (*L2TokenRegistryOwnershipTransferred, error) { + event := new(L2TokenRegistryOwnershipTransferred) + if err := _L2TokenRegistry.contract.UnpackLog(event, "OwnershipTransferred", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// L2TokenRegistryPriceRatioUpdatedIterator is returned from FilterPriceRatioUpdated and is used to iterate over the raw logs and unpacked data for PriceRatioUpdated events raised by the L2TokenRegistry contract. +type L2TokenRegistryPriceRatioUpdatedIterator struct { + Event *L2TokenRegistryPriceRatioUpdated // 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 *L2TokenRegistryPriceRatioUpdatedIterator) 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(L2TokenRegistryPriceRatioUpdated) + 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(L2TokenRegistryPriceRatioUpdated) + 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 *L2TokenRegistryPriceRatioUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *L2TokenRegistryPriceRatioUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// L2TokenRegistryPriceRatioUpdated represents a PriceRatioUpdated event raised by the L2TokenRegistry contract. +type L2TokenRegistryPriceRatioUpdated struct { + TokenID uint16 + NewPrice *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterPriceRatioUpdated is a free log retrieval operation binding the contract event 0xd73999ac164146908368455e72209122b67c149b37aab024e2707394a2c70467. +// +// Solidity: event PriceRatioUpdated(uint16 indexed tokenID, uint256 newPrice) +func (_L2TokenRegistry *L2TokenRegistryFilterer) FilterPriceRatioUpdated(opts *bind.FilterOpts, tokenID []uint16) (*L2TokenRegistryPriceRatioUpdatedIterator, error) { + + var tokenIDRule []interface{} + for _, tokenIDItem := range tokenID { + tokenIDRule = append(tokenIDRule, tokenIDItem) + } + + logs, sub, err := _L2TokenRegistry.contract.FilterLogs(opts, "PriceRatioUpdated", tokenIDRule) + if err != nil { + return nil, err + } + return &L2TokenRegistryPriceRatioUpdatedIterator{contract: _L2TokenRegistry.contract, event: "PriceRatioUpdated", logs: logs, sub: sub}, nil +} + +// WatchPriceRatioUpdated is a free log subscription operation binding the contract event 0xd73999ac164146908368455e72209122b67c149b37aab024e2707394a2c70467. +// +// Solidity: event PriceRatioUpdated(uint16 indexed tokenID, uint256 newPrice) +func (_L2TokenRegistry *L2TokenRegistryFilterer) WatchPriceRatioUpdated(opts *bind.WatchOpts, sink chan<- *L2TokenRegistryPriceRatioUpdated, tokenID []uint16) (event.Subscription, error) { + + var tokenIDRule []interface{} + for _, tokenIDItem := range tokenID { + tokenIDRule = append(tokenIDRule, tokenIDItem) + } + + logs, sub, err := _L2TokenRegistry.contract.WatchLogs(opts, "PriceRatioUpdated", tokenIDRule) + 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(L2TokenRegistryPriceRatioUpdated) + if err := _L2TokenRegistry.contract.UnpackLog(event, "PriceRatioUpdated", 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 +} + +// ParsePriceRatioUpdated is a log parse operation binding the contract event 0xd73999ac164146908368455e72209122b67c149b37aab024e2707394a2c70467. +// +// Solidity: event PriceRatioUpdated(uint16 indexed tokenID, uint256 newPrice) +func (_L2TokenRegistry *L2TokenRegistryFilterer) ParsePriceRatioUpdated(log types.Log) (*L2TokenRegistryPriceRatioUpdated, error) { + event := new(L2TokenRegistryPriceRatioUpdated) + if err := _L2TokenRegistry.contract.UnpackLog(event, "PriceRatioUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// L2TokenRegistryTokenActivatedIterator is returned from FilterTokenActivated and is used to iterate over the raw logs and unpacked data for TokenActivated events raised by the L2TokenRegistry contract. +type L2TokenRegistryTokenActivatedIterator struct { + Event *L2TokenRegistryTokenActivated // 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 *L2TokenRegistryTokenActivatedIterator) 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(L2TokenRegistryTokenActivated) + 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(L2TokenRegistryTokenActivated) + 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 *L2TokenRegistryTokenActivatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *L2TokenRegistryTokenActivatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// L2TokenRegistryTokenActivated represents a TokenActivated event raised by the L2TokenRegistry contract. +type L2TokenRegistryTokenActivated struct { + TokenID uint16 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterTokenActivated is a free log retrieval operation binding the contract event 0xba78a86bd882b78fb95715a0d827188ec0a8ad3f500310d33a39b94c9ff677b8. +// +// Solidity: event TokenActivated(uint16 indexed tokenID) +func (_L2TokenRegistry *L2TokenRegistryFilterer) FilterTokenActivated(opts *bind.FilterOpts, tokenID []uint16) (*L2TokenRegistryTokenActivatedIterator, error) { + + var tokenIDRule []interface{} + for _, tokenIDItem := range tokenID { + tokenIDRule = append(tokenIDRule, tokenIDItem) + } + + logs, sub, err := _L2TokenRegistry.contract.FilterLogs(opts, "TokenActivated", tokenIDRule) + if err != nil { + return nil, err + } + return &L2TokenRegistryTokenActivatedIterator{contract: _L2TokenRegistry.contract, event: "TokenActivated", logs: logs, sub: sub}, nil +} + +// WatchTokenActivated is a free log subscription operation binding the contract event 0xba78a86bd882b78fb95715a0d827188ec0a8ad3f500310d33a39b94c9ff677b8. +// +// Solidity: event TokenActivated(uint16 indexed tokenID) +func (_L2TokenRegistry *L2TokenRegistryFilterer) WatchTokenActivated(opts *bind.WatchOpts, sink chan<- *L2TokenRegistryTokenActivated, tokenID []uint16) (event.Subscription, error) { + + var tokenIDRule []interface{} + for _, tokenIDItem := range tokenID { + tokenIDRule = append(tokenIDRule, tokenIDItem) + } + + logs, sub, err := _L2TokenRegistry.contract.WatchLogs(opts, "TokenActivated", tokenIDRule) + 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(L2TokenRegistryTokenActivated) + if err := _L2TokenRegistry.contract.UnpackLog(event, "TokenActivated", 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 +} + +// ParseTokenActivated is a log parse operation binding the contract event 0xba78a86bd882b78fb95715a0d827188ec0a8ad3f500310d33a39b94c9ff677b8. +// +// Solidity: event TokenActivated(uint16 indexed tokenID) +func (_L2TokenRegistry *L2TokenRegistryFilterer) ParseTokenActivated(log types.Log) (*L2TokenRegistryTokenActivated, error) { + event := new(L2TokenRegistryTokenActivated) + if err := _L2TokenRegistry.contract.UnpackLog(event, "TokenActivated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// L2TokenRegistryTokenDeactivatedIterator is returned from FilterTokenDeactivated and is used to iterate over the raw logs and unpacked data for TokenDeactivated events raised by the L2TokenRegistry contract. +type L2TokenRegistryTokenDeactivatedIterator struct { + Event *L2TokenRegistryTokenDeactivated // 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 *L2TokenRegistryTokenDeactivatedIterator) 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(L2TokenRegistryTokenDeactivated) + 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(L2TokenRegistryTokenDeactivated) + 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 *L2TokenRegistryTokenDeactivatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *L2TokenRegistryTokenDeactivatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// L2TokenRegistryTokenDeactivated represents a TokenDeactivated event raised by the L2TokenRegistry contract. +type L2TokenRegistryTokenDeactivated struct { + TokenID uint16 + Raw types.Log // Blockchain specific contextual infos +} + +// FilterTokenDeactivated is a free log retrieval operation binding the contract event 0xa625871090c2595895650b8e9222d1a3267cedf9de819bf446400962ce1357ef. +// +// Solidity: event TokenDeactivated(uint16 indexed tokenID) +func (_L2TokenRegistry *L2TokenRegistryFilterer) FilterTokenDeactivated(opts *bind.FilterOpts, tokenID []uint16) (*L2TokenRegistryTokenDeactivatedIterator, error) { + + var tokenIDRule []interface{} + for _, tokenIDItem := range tokenID { + tokenIDRule = append(tokenIDRule, tokenIDItem) + } + + logs, sub, err := _L2TokenRegistry.contract.FilterLogs(opts, "TokenDeactivated", tokenIDRule) + if err != nil { + return nil, err + } + return &L2TokenRegistryTokenDeactivatedIterator{contract: _L2TokenRegistry.contract, event: "TokenDeactivated", logs: logs, sub: sub}, nil +} + +// WatchTokenDeactivated is a free log subscription operation binding the contract event 0xa625871090c2595895650b8e9222d1a3267cedf9de819bf446400962ce1357ef. +// +// Solidity: event TokenDeactivated(uint16 indexed tokenID) +func (_L2TokenRegistry *L2TokenRegistryFilterer) WatchTokenDeactivated(opts *bind.WatchOpts, sink chan<- *L2TokenRegistryTokenDeactivated, tokenID []uint16) (event.Subscription, error) { + + var tokenIDRule []interface{} + for _, tokenIDItem := range tokenID { + tokenIDRule = append(tokenIDRule, tokenIDItem) + } + + logs, sub, err := _L2TokenRegistry.contract.WatchLogs(opts, "TokenDeactivated", tokenIDRule) + 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(L2TokenRegistryTokenDeactivated) + if err := _L2TokenRegistry.contract.UnpackLog(event, "TokenDeactivated", 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 +} + +// ParseTokenDeactivated is a log parse operation binding the contract event 0xa625871090c2595895650b8e9222d1a3267cedf9de819bf446400962ce1357ef. +// +// Solidity: event TokenDeactivated(uint16 indexed tokenID) +func (_L2TokenRegistry *L2TokenRegistryFilterer) ParseTokenDeactivated(log types.Log) (*L2TokenRegistryTokenDeactivated, error) { + event := new(L2TokenRegistryTokenDeactivated) + if err := _L2TokenRegistry.contract.UnpackLog(event, "TokenDeactivated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// L2TokenRegistryTokenInfoUpdatedIterator is returned from FilterTokenInfoUpdated and is used to iterate over the raw logs and unpacked data for TokenInfoUpdated events raised by the L2TokenRegistry contract. +type L2TokenRegistryTokenInfoUpdatedIterator struct { + Event *L2TokenRegistryTokenInfoUpdated // 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 *L2TokenRegistryTokenInfoUpdatedIterator) 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(L2TokenRegistryTokenInfoUpdated) + 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(L2TokenRegistryTokenInfoUpdated) + 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 *L2TokenRegistryTokenInfoUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *L2TokenRegistryTokenInfoUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// L2TokenRegistryTokenInfoUpdated represents a TokenInfoUpdated event raised by the L2TokenRegistry contract. +type L2TokenRegistryTokenInfoUpdated struct { + TokenID uint16 + TokenAddress common.Address + BalanceSlot [32]byte + IsActive bool + Decimals uint8 + Scale *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterTokenInfoUpdated is a free log retrieval operation binding the contract event 0x60281b1abf645864e8443ca11a3c3b51a6a9203a376da58db7919f7cfebc4aa9. +// +// Solidity: event TokenInfoUpdated(uint16 indexed tokenID, address indexed tokenAddress, bytes32 balanceSlot, bool isActive, uint8 decimals, uint256 scale) +func (_L2TokenRegistry *L2TokenRegistryFilterer) FilterTokenInfoUpdated(opts *bind.FilterOpts, tokenID []uint16, tokenAddress []common.Address) (*L2TokenRegistryTokenInfoUpdatedIterator, error) { + + var tokenIDRule []interface{} + for _, tokenIDItem := range tokenID { + tokenIDRule = append(tokenIDRule, tokenIDItem) + } + var tokenAddressRule []interface{} + for _, tokenAddressItem := range tokenAddress { + tokenAddressRule = append(tokenAddressRule, tokenAddressItem) + } + + logs, sub, err := _L2TokenRegistry.contract.FilterLogs(opts, "TokenInfoUpdated", tokenIDRule, tokenAddressRule) + if err != nil { + return nil, err + } + return &L2TokenRegistryTokenInfoUpdatedIterator{contract: _L2TokenRegistry.contract, event: "TokenInfoUpdated", logs: logs, sub: sub}, nil +} + +// WatchTokenInfoUpdated is a free log subscription operation binding the contract event 0x60281b1abf645864e8443ca11a3c3b51a6a9203a376da58db7919f7cfebc4aa9. +// +// Solidity: event TokenInfoUpdated(uint16 indexed tokenID, address indexed tokenAddress, bytes32 balanceSlot, bool isActive, uint8 decimals, uint256 scale) +func (_L2TokenRegistry *L2TokenRegistryFilterer) WatchTokenInfoUpdated(opts *bind.WatchOpts, sink chan<- *L2TokenRegistryTokenInfoUpdated, tokenID []uint16, tokenAddress []common.Address) (event.Subscription, error) { + + var tokenIDRule []interface{} + for _, tokenIDItem := range tokenID { + tokenIDRule = append(tokenIDRule, tokenIDItem) + } + var tokenAddressRule []interface{} + for _, tokenAddressItem := range tokenAddress { + tokenAddressRule = append(tokenAddressRule, tokenAddressItem) + } + + logs, sub, err := _L2TokenRegistry.contract.WatchLogs(opts, "TokenInfoUpdated", tokenIDRule, tokenAddressRule) + 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(L2TokenRegistryTokenInfoUpdated) + if err := _L2TokenRegistry.contract.UnpackLog(event, "TokenInfoUpdated", 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 +} + +// ParseTokenInfoUpdated is a log parse operation binding the contract event 0x60281b1abf645864e8443ca11a3c3b51a6a9203a376da58db7919f7cfebc4aa9. +// +// Solidity: event TokenInfoUpdated(uint16 indexed tokenID, address indexed tokenAddress, bytes32 balanceSlot, bool isActive, uint8 decimals, uint256 scale) +func (_L2TokenRegistry *L2TokenRegistryFilterer) ParseTokenInfoUpdated(log types.Log) (*L2TokenRegistryTokenInfoUpdated, error) { + event := new(L2TokenRegistryTokenInfoUpdated) + if err := _L2TokenRegistry.contract.UnpackLog(event, "TokenInfoUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// L2TokenRegistryTokenRegisteredIterator is returned from FilterTokenRegistered and is used to iterate over the raw logs and unpacked data for TokenRegistered events raised by the L2TokenRegistry contract. +type L2TokenRegistryTokenRegisteredIterator struct { + Event *L2TokenRegistryTokenRegistered // 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 *L2TokenRegistryTokenRegisteredIterator) 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(L2TokenRegistryTokenRegistered) + 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(L2TokenRegistryTokenRegistered) + 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 *L2TokenRegistryTokenRegisteredIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *L2TokenRegistryTokenRegisteredIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// L2TokenRegistryTokenRegistered represents a TokenRegistered event raised by the L2TokenRegistry contract. +type L2TokenRegistryTokenRegistered struct { + TokenID uint16 + TokenAddress common.Address + BalanceSlot [32]byte + IsActive bool + Decimals uint8 + Scale *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterTokenRegistered is a free log retrieval operation binding the contract event 0xb9d0acb419ab21384716fbeaa0bcbc172f6347c9bf4fc0614c4e79fc47b36e11. +// +// Solidity: event TokenRegistered(uint16 indexed tokenID, address indexed tokenAddress, bytes32 balanceSlot, bool isActive, uint8 decimals, uint256 scale) +func (_L2TokenRegistry *L2TokenRegistryFilterer) FilterTokenRegistered(opts *bind.FilterOpts, tokenID []uint16, tokenAddress []common.Address) (*L2TokenRegistryTokenRegisteredIterator, error) { + + var tokenIDRule []interface{} + for _, tokenIDItem := range tokenID { + tokenIDRule = append(tokenIDRule, tokenIDItem) + } + var tokenAddressRule []interface{} + for _, tokenAddressItem := range tokenAddress { + tokenAddressRule = append(tokenAddressRule, tokenAddressItem) + } + + logs, sub, err := _L2TokenRegistry.contract.FilterLogs(opts, "TokenRegistered", tokenIDRule, tokenAddressRule) + if err != nil { + return nil, err + } + return &L2TokenRegistryTokenRegisteredIterator{contract: _L2TokenRegistry.contract, event: "TokenRegistered", logs: logs, sub: sub}, nil +} + +// WatchTokenRegistered is a free log subscription operation binding the contract event 0xb9d0acb419ab21384716fbeaa0bcbc172f6347c9bf4fc0614c4e79fc47b36e11. +// +// Solidity: event TokenRegistered(uint16 indexed tokenID, address indexed tokenAddress, bytes32 balanceSlot, bool isActive, uint8 decimals, uint256 scale) +func (_L2TokenRegistry *L2TokenRegistryFilterer) WatchTokenRegistered(opts *bind.WatchOpts, sink chan<- *L2TokenRegistryTokenRegistered, tokenID []uint16, tokenAddress []common.Address) (event.Subscription, error) { + + var tokenIDRule []interface{} + for _, tokenIDItem := range tokenID { + tokenIDRule = append(tokenIDRule, tokenIDItem) + } + var tokenAddressRule []interface{} + for _, tokenAddressItem := range tokenAddress { + tokenAddressRule = append(tokenAddressRule, tokenAddressItem) + } + + logs, sub, err := _L2TokenRegistry.contract.WatchLogs(opts, "TokenRegistered", tokenIDRule, tokenAddressRule) + 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(L2TokenRegistryTokenRegistered) + if err := _L2TokenRegistry.contract.UnpackLog(event, "TokenRegistered", 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 +} + +// ParseTokenRegistered is a log parse operation binding the contract event 0xb9d0acb419ab21384716fbeaa0bcbc172f6347c9bf4fc0614c4e79fc47b36e11. +// +// Solidity: event TokenRegistered(uint16 indexed tokenID, address indexed tokenAddress, bytes32 balanceSlot, bool isActive, uint8 decimals, uint256 scale) +func (_L2TokenRegistry *L2TokenRegistryFilterer) ParseTokenRegistered(log types.Log) (*L2TokenRegistryTokenRegistered, error) { + event := new(L2TokenRegistryTokenRegistered) + if err := _L2TokenRegistry.contract.UnpackLog(event, "TokenRegistered", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// L2TokenRegistryTokenRemovedIterator is returned from FilterTokenRemoved and is used to iterate over the raw logs and unpacked data for TokenRemoved events raised by the L2TokenRegistry contract. +type L2TokenRegistryTokenRemovedIterator struct { + Event *L2TokenRegistryTokenRemoved // 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 *L2TokenRegistryTokenRemovedIterator) 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(L2TokenRegistryTokenRemoved) + 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(L2TokenRegistryTokenRemoved) + 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 *L2TokenRegistryTokenRemovedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *L2TokenRegistryTokenRemovedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// L2TokenRegistryTokenRemoved represents a TokenRemoved event raised by the L2TokenRegistry contract. +type L2TokenRegistryTokenRemoved struct { + TokenID uint16 + TokenAddress common.Address + Raw types.Log // Blockchain specific contextual infos +} + +// FilterTokenRemoved is a free log retrieval operation binding the contract event 0x330282f89b53f03dfc62130ddb33062a147ad25d691915b575732f62fb6fce9a. +// +// Solidity: event TokenRemoved(uint16 indexed tokenID, address indexed tokenAddress) +func (_L2TokenRegistry *L2TokenRegistryFilterer) FilterTokenRemoved(opts *bind.FilterOpts, tokenID []uint16, tokenAddress []common.Address) (*L2TokenRegistryTokenRemovedIterator, error) { + + var tokenIDRule []interface{} + for _, tokenIDItem := range tokenID { + tokenIDRule = append(tokenIDRule, tokenIDItem) + } + var tokenAddressRule []interface{} + for _, tokenAddressItem := range tokenAddress { + tokenAddressRule = append(tokenAddressRule, tokenAddressItem) + } + + logs, sub, err := _L2TokenRegistry.contract.FilterLogs(opts, "TokenRemoved", tokenIDRule, tokenAddressRule) + if err != nil { + return nil, err + } + return &L2TokenRegistryTokenRemovedIterator{contract: _L2TokenRegistry.contract, event: "TokenRemoved", logs: logs, sub: sub}, nil +} + +// WatchTokenRemoved is a free log subscription operation binding the contract event 0x330282f89b53f03dfc62130ddb33062a147ad25d691915b575732f62fb6fce9a. +// +// Solidity: event TokenRemoved(uint16 indexed tokenID, address indexed tokenAddress) +func (_L2TokenRegistry *L2TokenRegistryFilterer) WatchTokenRemoved(opts *bind.WatchOpts, sink chan<- *L2TokenRegistryTokenRemoved, tokenID []uint16, tokenAddress []common.Address) (event.Subscription, error) { + + var tokenIDRule []interface{} + for _, tokenIDItem := range tokenID { + tokenIDRule = append(tokenIDRule, tokenIDItem) + } + var tokenAddressRule []interface{} + for _, tokenAddressItem := range tokenAddress { + tokenAddressRule = append(tokenAddressRule, tokenAddressItem) + } + + logs, sub, err := _L2TokenRegistry.contract.WatchLogs(opts, "TokenRemoved", tokenIDRule, tokenAddressRule) + 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(L2TokenRegistryTokenRemoved) + if err := _L2TokenRegistry.contract.UnpackLog(event, "TokenRemoved", 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 +} + +// ParseTokenRemoved is a log parse operation binding the contract event 0x330282f89b53f03dfc62130ddb33062a147ad25d691915b575732f62fb6fce9a. +// +// Solidity: event TokenRemoved(uint16 indexed tokenID, address indexed tokenAddress) +func (_L2TokenRegistry *L2TokenRegistryFilterer) ParseTokenRemoved(log types.Log) (*L2TokenRegistryTokenRemoved, error) { + event := new(L2TokenRegistryTokenRemoved) + if err := _L2TokenRegistry.contract.UnpackLog(event, "TokenRemoved", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + +// L2TokenRegistryTokenScaleUpdatedIterator is returned from FilterTokenScaleUpdated and is used to iterate over the raw logs and unpacked data for TokenScaleUpdated events raised by the L2TokenRegistry contract. +type L2TokenRegistryTokenScaleUpdatedIterator struct { + Event *L2TokenRegistryTokenScaleUpdated // 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 *L2TokenRegistryTokenScaleUpdatedIterator) 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(L2TokenRegistryTokenScaleUpdated) + 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(L2TokenRegistryTokenScaleUpdated) + 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 *L2TokenRegistryTokenScaleUpdatedIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *L2TokenRegistryTokenScaleUpdatedIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// L2TokenRegistryTokenScaleUpdated represents a TokenScaleUpdated event raised by the L2TokenRegistry contract. +type L2TokenRegistryTokenScaleUpdated struct { + TokenID uint16 + NewScale *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterTokenScaleUpdated is a free log retrieval operation binding the contract event 0x7b614d0c690ae942aec30d9378eb72c3678dd8cb74a55343c87baf8dfe078e74. +// +// Solidity: event TokenScaleUpdated(uint16 indexed tokenID, uint256 newScale) +func (_L2TokenRegistry *L2TokenRegistryFilterer) FilterTokenScaleUpdated(opts *bind.FilterOpts, tokenID []uint16) (*L2TokenRegistryTokenScaleUpdatedIterator, error) { + + var tokenIDRule []interface{} + for _, tokenIDItem := range tokenID { + tokenIDRule = append(tokenIDRule, tokenIDItem) + } + + logs, sub, err := _L2TokenRegistry.contract.FilterLogs(opts, "TokenScaleUpdated", tokenIDRule) + if err != nil { + return nil, err + } + return &L2TokenRegistryTokenScaleUpdatedIterator{contract: _L2TokenRegistry.contract, event: "TokenScaleUpdated", logs: logs, sub: sub}, nil +} + +// WatchTokenScaleUpdated is a free log subscription operation binding the contract event 0x7b614d0c690ae942aec30d9378eb72c3678dd8cb74a55343c87baf8dfe078e74. +// +// Solidity: event TokenScaleUpdated(uint16 indexed tokenID, uint256 newScale) +func (_L2TokenRegistry *L2TokenRegistryFilterer) WatchTokenScaleUpdated(opts *bind.WatchOpts, sink chan<- *L2TokenRegistryTokenScaleUpdated, tokenID []uint16) (event.Subscription, error) { + + var tokenIDRule []interface{} + for _, tokenIDItem := range tokenID { + tokenIDRule = append(tokenIDRule, tokenIDItem) + } + + logs, sub, err := _L2TokenRegistry.contract.WatchLogs(opts, "TokenScaleUpdated", tokenIDRule) + 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(L2TokenRegistryTokenScaleUpdated) + if err := _L2TokenRegistry.contract.UnpackLog(event, "TokenScaleUpdated", 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 +} + +// ParseTokenScaleUpdated is a log parse operation binding the contract event 0x7b614d0c690ae942aec30d9378eb72c3678dd8cb74a55343c87baf8dfe078e74. +// +// Solidity: event TokenScaleUpdated(uint16 indexed tokenID, uint256 newScale) +func (_L2TokenRegistry *L2TokenRegistryFilterer) ParseTokenScaleUpdated(log types.Log) (*L2TokenRegistryTokenScaleUpdated, error) { + event := new(L2TokenRegistryTokenScaleUpdated) + if err := _L2TokenRegistry.contract.UnpackLog(event, "TokenScaleUpdated", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} diff --git a/bindings/bindings/l2tokenregistry_more.go b/bindings/bindings/l2tokenregistry_more.go new file mode 100644 index 000000000..2281a04a9 --- /dev/null +++ b/bindings/bindings/l2tokenregistry_more.go @@ -0,0 +1,25 @@ +// Code generated - DO NOT EDIT. +// This file is a generated binding and any manual changes will be lost. + +package bindings + +import ( + "encoding/json" + + "morph-l2/bindings/solc" +) + +const L2TokenRegistryStorageLayoutJSON = "{\"storage\":[{\"astId\":1000,\"contract\":\"contracts/l2/system/L2TokenRegistry.sol:L2TokenRegistry\",\"label\":\"_initialized\",\"offset\":0,\"slot\":\"0\",\"type\":\"t_uint8\"},{\"astId\":1001,\"contract\":\"contracts/l2/system/L2TokenRegistry.sol:L2TokenRegistry\",\"label\":\"_initializing\",\"offset\":1,\"slot\":\"0\",\"type\":\"t_bool\"},{\"astId\":1002,\"contract\":\"contracts/l2/system/L2TokenRegistry.sol:L2TokenRegistry\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"1\",\"type\":\"t_array(t_uint256)1015_storage\"},{\"astId\":1003,\"contract\":\"contracts/l2/system/L2TokenRegistry.sol:L2TokenRegistry\",\"label\":\"_owner\",\"offset\":0,\"slot\":\"51\",\"type\":\"t_address\"},{\"astId\":1004,\"contract\":\"contracts/l2/system/L2TokenRegistry.sol:L2TokenRegistry\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"52\",\"type\":\"t_array(t_uint256)1014_storage\"},{\"astId\":1005,\"contract\":\"contracts/l2/system/L2TokenRegistry.sol:L2TokenRegistry\",\"label\":\"_status\",\"offset\":0,\"slot\":\"101\",\"type\":\"t_uint256\"},{\"astId\":1006,\"contract\":\"contracts/l2/system/L2TokenRegistry.sol:L2TokenRegistry\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"102\",\"type\":\"t_array(t_uint256)1014_storage\"},{\"astId\":1007,\"contract\":\"contracts/l2/system/L2TokenRegistry.sol:L2TokenRegistry\",\"label\":\"tokenRegistry\",\"offset\":0,\"slot\":\"151\",\"type\":\"t_mapping(t_uint16,t_struct(TokenInfo)1017_storage)\"},{\"astId\":1008,\"contract\":\"contracts/l2/system/L2TokenRegistry.sol:L2TokenRegistry\",\"label\":\"tokenRegistration\",\"offset\":0,\"slot\":\"152\",\"type\":\"t_mapping(t_address,t_uint16)\"},{\"astId\":1009,\"contract\":\"contracts/l2/system/L2TokenRegistry.sol:L2TokenRegistry\",\"label\":\"priceRatio\",\"offset\":0,\"slot\":\"153\",\"type\":\"t_mapping(t_uint16,t_uint256)\"},{\"astId\":1010,\"contract\":\"contracts/l2/system/L2TokenRegistry.sol:L2TokenRegistry\",\"label\":\"allowList\",\"offset\":0,\"slot\":\"154\",\"type\":\"t_mapping(t_address,t_bool)\"},{\"astId\":1011,\"contract\":\"contracts/l2/system/L2TokenRegistry.sol:L2TokenRegistry\",\"label\":\"allowListEnabled\",\"offset\":0,\"slot\":\"155\",\"type\":\"t_bool\"},{\"astId\":1012,\"contract\":\"contracts/l2/system/L2TokenRegistry.sol:L2TokenRegistry\",\"label\":\"supportedTokenSet\",\"offset\":0,\"slot\":\"156\",\"type\":\"t_struct(UintSet)1018_storage\"},{\"astId\":1013,\"contract\":\"contracts/l2/system/L2TokenRegistry.sol:L2TokenRegistry\",\"label\":\"__gap\",\"offset\":0,\"slot\":\"158\",\"type\":\"t_array(t_uint256)1015_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)1014_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\"},\"t_array(t_uint256)1015_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_uint16)\":{\"encoding\":\"mapping\",\"label\":\"mapping(address =\u003e uint16)\",\"numberOfBytes\":\"32\",\"key\":\"t_address\",\"value\":\"t_uint16\"},\"t_mapping(t_bytes32,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(bytes32 =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_bytes32\",\"value\":\"t_uint256\"},\"t_mapping(t_uint16,t_struct(TokenInfo)1017_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint16 =\u003e struct IL2TokenRegistry.TokenInfo)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint16\",\"value\":\"t_struct(TokenInfo)1017_storage\"},\"t_mapping(t_uint16,t_uint256)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint16 =\u003e uint256)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint16\",\"value\":\"t_uint256\"},\"t_struct(Set)1016_storage\":{\"encoding\":\"inplace\",\"label\":\"struct EnumerableSetUpgradeable.Set\",\"numberOfBytes\":\"64\"},\"t_struct(TokenInfo)1017_storage\":{\"encoding\":\"inplace\",\"label\":\"struct IL2TokenRegistry.TokenInfo\",\"numberOfBytes\":\"128\"},\"t_struct(UintSet)1018_storage\":{\"encoding\":\"inplace\",\"label\":\"struct EnumerableSetUpgradeable.UintSet\",\"numberOfBytes\":\"64\"},\"t_uint16\":{\"encoding\":\"inplace\",\"label\":\"uint16\",\"numberOfBytes\":\"2\"},\"t_uint256\":{\"encoding\":\"inplace\",\"label\":\"uint256\",\"numberOfBytes\":\"32\"},\"t_uint8\":{\"encoding\":\"inplace\",\"label\":\"uint8\",\"numberOfBytes\":\"1\"}}}" + +var L2TokenRegistryStorageLayout = new(solc.StorageLayout) + +var L2TokenRegistryDeployedBin = "0x608060405234801561000f575f80fd5b50600436106101c6575f3560e01c80638cbab7e4116100fe578063ce67be261161009e578063ef0fde0f1161006e578063ef0fde0f146104f3578063efeadb6d14610506578063f2fde38b14610519578063fce404891461052c575f80fd5b8063ce67be26146104b2578063dbbb2faa146104ba578063dddc98be146104cd578063e3de72a5146104e0575f80fd5b8063a1218001116100d9578063a121800114610466578063a313d00714610479578063b10b69ee1461048c578063c4d66de81461049f575f80fd5b80638cbab7e4146104185780638da5cb5b1461042b5780639190202e14610453575f80fd5b80635c45246b11610169578063724f91ce11610144578063724f91ce1461031d5780637304880c1461035357806385519c36146103665780638c39969114610405575f80fd5b80635c45246b146102eb5780636f6d6cc114610300578063715018a614610315575f80fd5b806322bd5c1c116101a457806322bd5c1c146102865780632848aeaf146102a35780632a1ea5a2146102c55780634cbcdd13146102d8575f80fd5b80631585458c146101ca57806319904c33146101e85780631c58e79314610215575b5f80fd5b6101d261053f565b6040516101df919061282c565b60405180910390f35b6102076101f63660046128aa565b60996020525f908152604090205481565b6040519081526020016101df565b6102286102233660046128aa565b61064b565b60408051835173ffffffffffffffffffffffffffffffffffffffff168152602080850151908201528382015115159181019190915260608084015160ff169082015260809283015192810192909252151560a082015260c0016101df565b609b546102939060ff1681565b60405190151581526020016101df565b6102936102b13660046128e6565b609a6020525f908152604090205460ff1681565b6102076102d33660046128aa565b61075b565b6102936102e63660046128aa565b6107d0565b6102fe6102f936600461290e565b6107e6565b005b610308610814565b6040516101df919061295f565b6102fe6108bc565b61034061032b3660046128e6565b60986020525f908152604090205461ffff1681565b60405161ffff90911681526020016101df565b6102fe6103613660046129a6565b6108cf565b6103be6103743660046128aa565b60976020525f9081526040902080546001820154600283015460039093015473ffffffffffffffffffffffffffffffffffffffff90921692909160ff808316926101009004169085565b6040805173ffffffffffffffffffffffffffffffffffffffff909616865260208601949094529115159284019290925260ff9091166060830152608082015260a0016101df565b6102fe610413366004612b76565b610d16565b6103406104263660046128e6565b610f4f565b60335460405173ffffffffffffffffffffffffffffffffffffffff90911681526020016101df565b6102fe610461366004612c1e565b610fd2565b6102fe610474366004612d4b565b611180565b6102076104873660046128aa565b61129c565b6102fe61049a366004612e14565b611314565b6102fe6104ad3660046128e6565b6114a4565b610207611672565b6102fe6104c83660046128aa565b611682565b6102076104db366004612e14565b61182b565b6102fe6104ee366004612e3c565b6119ad565b6102fe610501366004612e14565b611b12565b6102fe610514366004612e92565b611ca1565b6102fe6105273660046128e6565b611d0e565b61029361053a3660046128aa565b611dc5565b60605f61054c609c611e15565b90505f815167ffffffffffffffff81111561056957610569612a08565b6040519080825280602002602001820160405280156105ad57816020015b604080518082019091525f80825260208201528152602001906001900390816105875790505b5090505f5b8251811015610644575f8382815181106105ce576105ce612eab565b60209081029190910181015161ffff81165f8181526097845260409081902054815180830190925291815273ffffffffffffffffffffffffffffffffffffffff90911692810183905285519193509085908590811061062f5761062f612eab565b602090810291909101015250506001016105b2565b5092915050565b6040805160a0810182525f8082526020820181905291810182905260608101829052608081019190915261ffff82165f9081526097602052604081205473ffffffffffffffffffffffffffffffffffffffff166106d4576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505061ffff81165f90815260976020908152604091829020825160a081018452815473ffffffffffffffffffffffffffffffffffffffff1681526001820154928101839052600282015460ff808216151595830195909552610100900490931660608401526003015460808301528015159061074f90611e28565b60208301529092909150565b61ffff81165f9081526097602052604081205473ffffffffffffffffffffffffffffffffffffffff166107ba576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5061ffff165f9081526099602052604090205490565b5f6107e0609c61ffff8416611e5b565b92915050565b6107ee611e72565b6107f6611ef3565b6108038585858585611f66565b61080d6001606555565b5050505050565b60605f610821609c611e15565b90505f815167ffffffffffffffff81111561083e5761083e612a08565b604051908082528060200260200182016040528015610867578160200160208202803683370190505b5090505f5b82518110156106445782818151811061088757610887612eab565b60200260200101518282815181106108a1576108a1612eab565b61ffff9092166020928302919091019091015260010161086c565b6108c4611e72565b6108cd5f612331565b565b6108d7611e72565b6108df611ef3565b61ffff86165f9081526097602052604090205473ffffffffffffffffffffffffffffffffffffffff1661093e576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff851661098b576040517f1eb00b0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f036109c4576040517f70ce14bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff85165f9081526098602052604090205461ffff168015801590610a0457508661ffff168161ffff1614155b15610a3b576040517fe4476a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f601290508673ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015610ac5575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252610ac291810190612ed8565b60015b15610acd5790505b61ffff88165f9081526097602090815260409182902054825160a0810190935273ffffffffffffffffffffffffffffffffffffffff8a811684521691908101610b1689896123a7565b815286151560208083019190915260ff808616604080850191909152606093840189905261ffff8e165f908152609784528190208551815473ffffffffffffffffffffffffffffffffffffffff9182167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161782559386015160018201559085015160028201805495870151909316610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff911515919091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009095169490941793909317905560809092015160039091015581811690891614610c7c5773ffffffffffffffffffffffffffffffffffffffff8181165f9081526098602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000908116909155928b1682529020805490911661ffff8b161790555b61ffff89165f81815260996020526040808220919091555173ffffffffffffffffffffffffffffffffffffffff8a1691907f60281b1abf645864e8443ca11a3c3b51a6a9203a376da58db7919f7cfebc4aa990610cf9908b908a9088908b90938452911515602084015260ff166040830152606082015260800190565b60405180910390a3505050610d0e6001606555565b505050505050565b5f610d3660335473ffffffffffffffffffffffffffffffffffffffff1690565b609b5473ffffffffffffffffffffffffffffffffffffffff91909116331491505f9060ff168015610d755750335f908152609a602052604090205460ff165b905081158015610d83575080155b15610dba576040517f2af07d2000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8251845114610df5576040517f9d89020a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b845181101561080d575f73ffffffffffffffffffffffffffffffffffffffff1660975f878481518110610e2c57610e2c612eab565b60209081029190910181015161ffff1682528101919091526040015f205473ffffffffffffffffffffffffffffffffffffffff1614610f4757838181518110610e7757610e77612eab565b60200260200101515f0315610f4757838181518110610e9857610e98612eab565b602002602001015160995f878481518110610eb557610eb5612eab565b602002602001015161ffff1661ffff1681526020019081526020015f2081905550848181518110610ee857610ee8612eab565b602002602001015161ffff167fd73999ac164146908368455e72209122b67c149b37aab024e2707394a2c70467858381518110610f2757610f27612eab565b6020026020010151604051610f3e91815260200190565b60405180910390a25b600101610df7565b73ffffffffffffffffffffffffffffffffffffffff81165f9081526098602052604081205461ffff1680158015610f9b575073ffffffffffffffffffffffffffffffffffffffff831615155b156107e0576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610fda611e72565b828114611013576040517f9d89020a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8381101561080d575f85858381811061103057611030612eab565b905060200201602081019061104591906128aa565b90505f84848481811061105a5761105a612eab565b905060200201602081019061106f9190612e92565b61ffff83165f9081526097602052604090205490915073ffffffffffffffffffffffffffffffffffffffff166110a6575050611178565b61ffff82165f9081526097602052604090206002015460ff16801515821515146111745761ffff83165f90815260976020526040902060020180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001683158015919091179091556111455760405161ffff8416907fba78a86bd882b78fb95715a0d827188ec0a8ad3f500310d33a39b94c9ff677b8905f90a2611174565b60405161ffff8416907fa625871090c2595895650b8e9222d1a3267cedf9de819bf446400962ce1357ef905f90a25b5050505b600101611015565b611188611e72565b611190611ef3565b835185511415806111a357508251855114155b806111b057508151855114155b806111bd57508051855114155b156111f4576040517f9d89020a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b85518110156112915761128986828151811061121457611214612eab565b602002602001015186838151811061122e5761122e612eab565b602002602001015186848151811061124857611248612eab565b602002602001015186858151811061126257611262612eab565b602002602001015186868151811061127c5761127c612eab565b6020026020010151611f66565b6001016111f6565b5061080d6001606555565b61ffff81165f9081526097602052604081205473ffffffffffffffffffffffffffffffffffffffff166112fb576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5061ffff165f9081526097602052604090206003015490565b5f61133460335473ffffffffffffffffffffffffffffffffffffffff1690565b609b5473ffffffffffffffffffffffffffffffffffffffff91909116331491505f9060ff1680156113735750335f908152609a602052604090205460ff165b905081158015611381575080155b156113b8576040517f2af07d2000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff84165f9081526097602052604090205473ffffffffffffffffffffffffffffffffffffffff16611417576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f0361144f576040517ebfc92100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff84165f8181526099602052604090819020859055517fd73999ac164146908368455e72209122b67c149b37aab024e2707394a2c70467906114969086815260200190565b60405180910390a250505050565b5f54610100900460ff16158080156114c257505f54600160ff909116105b806114db5750303b1580156114db57505f5460ff166001145b61156c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156115c8575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6115d06123f6565b6115d8612494565b6115e182612331565b609b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00166001179055801561166e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b5f61167d609c612532565b905090565b61168a611e72565b61ffff81165f9081526097602052604090205473ffffffffffffffffffffffffffffffffffffffff16806116ea576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116f9609c61ffff8416611e5b565b61172f576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff82165f81815260976020908152604080832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168155600181018490556002810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000908116909155600390910184905573ffffffffffffffffffffffffffffffffffffffff86168452609883528184208054909116905592825260999052908120556117e18261253b565b60405173ffffffffffffffffffffffffffffffffffffffff82169061ffff8416907f330282f89b53f03dfc62130ddb33062a147ad25d691915b575732f62fb6fce9a905f90a35050565b61ffff82165f9081526097602052604081205473ffffffffffffffffffffffffffffffffffffffff1661188a576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff83165f818152609760209081526040808320815160a081018352815473ffffffffffffffffffffffffffffffffffffffff168152600182015481850152600282015460ff8082161515838601526101009091041660608201526003909101546080820152938352609990915281205490819003611935576040517ebfc92100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f8260800151856119469190612f25565b90508160016119558284612f3c565b61195f9190612f4f565b6119699190612f62565b9350835f036119a4576040517f82c4a8c900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505092915050565b6119b5611e72565b80518251146119f0576040517fd9183d2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8251811015611b0d57818181518110611a0d57611a0d612eab565b6020026020010151609a5f858481518110611a2a57611a2a612eab565b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020015f205f6101000a81548160ff021916908315150217905550828181518110611a9357611a93612eab565b602002602001015173ffffffffffffffffffffffffffffffffffffffff167f6dad0aed33f4b7f07095619b668698e17943fd9f4c83e7cfcc7f6dd880a11588838381518110611ae457611ae4612eab565b6020026020010151604051611afd911515815260200190565b60405180910390a26001016119f2565b505050565b5f611b3260335473ffffffffffffffffffffffffffffffffffffffff1690565b609b5473ffffffffffffffffffffffffffffffffffffffff91909116331491505f9060ff168015611b715750335f908152609a602052604090205460ff165b905081158015611b7f575080155b15611bb6576040517f2af07d2000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff84165f9081526097602052604090205473ffffffffffffffffffffffffffffffffffffffff16611c15576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b825f03611c4e576040517f70ce14bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff84165f818152609760209081526040808320600301879055609982528083209290925590518581527f7b614d0c690ae942aec30d9378eb72c3678dd8cb74a55343c87baf8dfe078e749101611496565b611ca9611e72565b609b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215159081179091556040519081527f16435b45f7482047f839a6a19d291442627200f52cad2803c595150d0d440eb39060200160405180910390a150565b611d16611e72565b73ffffffffffffffffffffffffffffffffffffffff8116611db9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401611563565b611dc281612331565b50565b61ffff81165f9081526097602052604081205473ffffffffffffffffffffffffffffffffffffffff16611df957505f919050565b5061ffff165f9081526097602052604090206002015460ff1690565b60605f611e218361254a565b9392505050565b5f81611e3557505f919050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b5f8181526001830160205260408120541515611e21565b60335473ffffffffffffffffffffffffffffffffffffffff1633146108cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611563565b600260655403611f5f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611563565b6002606555565b73ffffffffffffffffffffffffffffffffffffffff8416611fb3576040517f1eb00b0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8461ffff165f03611ff0576040517f6aa2a93700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff85165f9081526097602052604090205473ffffffffffffffffffffffffffffffffffffffff1615612050576040517fc9b3c8a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff84165f9081526098602052604090205461ffff16156120b0576040517fe4476a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f036120e9576040517f70ce14bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f601290508473ffffffffffffffffffffffffffffffffffffffff1663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015612173575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016820190925261217091810190612ed8565b60015b1561217b5790505b6040518060a001604052808673ffffffffffffffffffffffffffffffffffffffff1681526020016121ac86866123a7565b81525f602080830182905260ff808616604080860191909152606094850188905261ffff8c16808552609784528185208751815473ffffffffffffffffffffffffffffffffffffffff9182167fffffffffffffffffffffffff000000000000000000000000000000000000000090911617825588860151600183015588840151600283018054998b0151909616610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff911515919091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000998a161717909455608090970151600390970196909655908a16835260989091529020805490911690911790556122bc866125a3565b604080518581525f602082015260ff83168183015260608101849052905173ffffffffffffffffffffffffffffffffffffffff87169161ffff8916917fb9d0acb419ab21384716fbeaa0bcbc172f6347c9bf4fc0614c4e79fc47b36e119181900360800190a3505050505050565b6001606555565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f816123b457505f6107e0565b600183016123ee576040517feab9612d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505060010190565b5f54610100900460ff1661248c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401611563565b6108cd6125b2565b5f54610100900460ff1661252a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401611563565b6108cd612651565b5f6107e0825490565b61166e609c61ffff83166126e7565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561259757602002820191905f5260205f20905b815481526020019060010190808311612583575b50505050509050919050565b61166e609c61ffff83166126f2565b5f54610100900460ff16612648576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401611563565b6108cd33612331565b5f54610100900460ff1661232a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401611563565b5f611e2183836126fd565b5f611e2183836127e0565b5f81815260018301602052604081205480156127d7575f61271f600183612f4f565b85549091505f9061273290600190612f4f565b9050818114612791575f865f01828154811061275057612750612eab565b905f5260205f200154905080875f01848154811061277057612770612eab565b5f918252602080832090910192909255918252600188019052604090208390555b85548690806127a2576127a2612f9a565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f9055600193505050506107e0565b5f9150506107e0565b5f81815260018301602052604081205461282557508154600181810184555f8481526020808220909301849055845484825282860190935260409020919091556107e0565b505f6107e0565b602080825282518282018190525f919060409081850190868401855b82811015612887578151805161ffff16855286015173ffffffffffffffffffffffffffffffffffffffff16868501529284019290850190600101612848565b5091979650505050505050565b803561ffff811681146128a5575f80fd5b919050565b5f602082840312156128ba575f80fd5b611e2182612894565b803573ffffffffffffffffffffffffffffffffffffffff811681146128a5575f80fd5b5f602082840312156128f6575f80fd5b611e21826128c3565b803580151581146128a5575f80fd5b5f805f805f60a08688031215612922575f80fd5b61292b86612894565b9450612939602087016128c3565b93506040860135925061294e606087016128ff565b949793965091946080013592915050565b602080825282518282018190525f9190848201906040850190845b8181101561299a57835161ffff168352928401929184019160010161297a565b50909695505050505050565b5f805f805f8060c087890312156129bb575f80fd5b6129c487612894565b95506129d2602088016128c3565b9450604087013593506129e7606088016128ff565b92506129f5608088016128ff565b915060a087013590509295509295509295565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612a7c57612a7c612a08565b604052919050565b5f67ffffffffffffffff821115612a9d57612a9d612a08565b5060051b60200190565b5f82601f830112612ab6575f80fd5b81356020612acb612ac683612a84565b612a35565b8083825260208201915060208460051b870101935086841115612aec575f80fd5b602086015b84811015612b0f57612b0281612894565b8352918301918301612af1565b509695505050505050565b5f82601f830112612b29575f80fd5b81356020612b39612ac683612a84565b8083825260208201915060208460051b870101935086841115612b5a575f80fd5b602086015b84811015612b0f5780358352918301918301612b5f565b5f8060408385031215612b87575f80fd5b823567ffffffffffffffff80821115612b9e575f80fd5b612baa86838701612aa7565b93506020850135915080821115612bbf575f80fd5b50612bcc85828601612b1a565b9150509250929050565b5f8083601f840112612be6575f80fd5b50813567ffffffffffffffff811115612bfd575f80fd5b6020830191508360208260051b8501011115612c17575f80fd5b9250929050565b5f805f8060408587031215612c31575f80fd5b843567ffffffffffffffff80821115612c48575f80fd5b612c5488838901612bd6565b90965094506020870135915080821115612c6c575f80fd5b50612c7987828801612bd6565b95989497509550505050565b5f82601f830112612c94575f80fd5b81356020612ca4612ac683612a84565b8083825260208201915060208460051b870101935086841115612cc5575f80fd5b602086015b84811015612b0f57612cdb816128c3565b8352918301918301612cca565b5f82601f830112612cf7575f80fd5b81356020612d07612ac683612a84565b8083825260208201915060208460051b870101935086841115612d28575f80fd5b602086015b84811015612b0f57612d3e816128ff565b8352918301918301612d2d565b5f805f805f60a08688031215612d5f575f80fd5b853567ffffffffffffffff80821115612d76575f80fd5b612d8289838a01612aa7565b96506020880135915080821115612d97575f80fd5b612da389838a01612c85565b95506040880135915080821115612db8575f80fd5b612dc489838a01612b1a565b94506060880135915080821115612dd9575f80fd5b612de589838a01612ce8565b93506080880135915080821115612dfa575f80fd5b50612e0788828901612b1a565b9150509295509295909350565b5f8060408385031215612e25575f80fd5b612e2e83612894565b946020939093013593505050565b5f8060408385031215612e4d575f80fd5b823567ffffffffffffffff80821115612e64575f80fd5b612e7086838701612c85565b93506020850135915080821115612e85575f80fd5b50612bcc85828601612ce8565b5f60208284031215612ea2575f80fd5b611e21826128ff565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215612ee8575f80fd5b815160ff81168114611e21575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820281158282048414176107e0576107e0612ef8565b808201808211156107e0576107e0612ef8565b818103818111156107e0576107e0612ef8565b5f82612f95577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea164736f6c6343000818000a" + +func init() { + if err := json.Unmarshal([]byte(L2TokenRegistryStorageLayoutJSON), L2TokenRegistryStorageLayout); err != nil { + panic(err) + } + + layouts["L2TokenRegistry"] = L2TokenRegistryStorageLayout + deployedBytecodes["L2TokenRegistry"] = L2TokenRegistryDeployedBin +} diff --git a/bindings/bindings/rollup.go b/bindings/bindings/rollup.go index 755d06fc3..81d257d11 100644 --- a/bindings/bindings/rollup.go +++ b/bindings/bindings/rollup.go @@ -33,7 +33,8 @@ var ( type IRollupBatchDataInput struct { Version uint8 ParentBatchHeader []byte - BlockContexts []byte + LastBlockNumber uint64 + NumL1Messages uint16 PrevStateRoot [32]byte PostStateRoot [32]byte WithdrawalRoot [32]byte @@ -48,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\":\"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: "0x60a060405234801562000010575f80fd5b506040516200493f3803806200493f83398101604081905262000033916200010f565b6001600160401b0381166080526200004a62000051565b506200013e565b5f54610100900460ff1615620000bd5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146200010d575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f6020828403121562000120575f80fd5b81516001600160401b038116811462000137575f80fd5b9392505050565b6080516147e16200015e5f395f81816105ec0152613a7b01526147e15ff3fe608060405260043610610306575f3560e01c8063728cdbca11610191578063b35dac4e116100dc578063ddd8a3dc11610087578063e3fff1dd11610062578063e3fff1dd146109b1578063f2fde38b146109d0578063fb1e8b04146109ef575f80fd5b8063ddd8a3dc1461095e578063de8b30351461097d578063dff7827e1461099c575f80fd5b8063cd4edc69116100b7578063cd4edc6914610917578063ce5db8d61461092a578063d279c1911461093f575f80fd5b8063b35dac4e146108ba578063b3e0a509146108d9578063bedb86fb146108f8575f80fd5b8063a415d8dc1161013c578063abc8d68d11610117578063abc8d68d1461085b578063b31a77d314610886578063b34844251461089b575f80fd5b8063a415d8dc146107f9578063a479265d14610827578063a4f209b01461083c575f80fd5b80638f1d37761161016c5780638f1d3776146106f9578063910129d4146107a957806397fc007c146107da575f80fd5b8063728cdbca146106a457806388b1ea09146106c35780638da5cb5b146106dc575f80fd5b80632b7ac3f3116102515780635ef7a94a116101fc57806368589dfa116101d757806368589dfa146106465780636c578c1d14610671578063715018a614610690575f80fd5b80635ef7a94a1461057b5780635f77cf1d146105db5780636126729014610627575f80fd5b80634a8d544f1161022c5780634a8d544f1461053257806357e0af6c146105455780635c975abb14610564575f80fd5b80632b7ac3f3146104c75780633b70c18a146104fe5780633e001b661461051d575f80fd5b806313361101116102b157806321e2f9e01161028c57806321e2f9e0146104525780632362f03e146104715780632571098d1461049c575f80fd5b806313361101146103ee57806318463fb01461040d57806318af3b2b14610422575f80fd5b806310d44583116102e157806310d4458314610398578063116a1f42146103b7578063121dcd50146103d9575f80fd5b806304d7721514610311578063059def61146103545780630ceb678014610377575f80fd5b3661030d57005b5f80fd5b34801561031c575f80fd5b5061033f61032b3660046140f4565b60a36020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561035f575f80fd5b50610369609d5481565b60405190815260200161034b565b348015610382575f80fd5b50610396610391366004614126565b610a04565b005b3480156103a3575f80fd5b506103966103b2366004614184565b610ad6565b3480156103c2575f80fd5b5061033f6103d13660046140f4565b609d54101590565b3480156103e4575f80fd5b50610369609e5481565b3480156103f9575f80fd5b506103966104083660046141cc565b610e2f565b348015610418575f80fd5b5061036960a75481565b34801561042d575f80fd5b5061033f61043c3660046140f4565b5f90815260a26020526040902060010154421090565b34801561045d575f80fd5b5061033f61046c3660046140f4565b611326565b34801561047c575f80fd5b5061036961048b3660046140f4565b60a16020525f908152604090205481565b3480156104a7575f80fd5b506103696104b63660046140f4565b60a06020525f908152604090205481565b3480156104d2575f80fd5b50609c546104e6906001600160a01b031681565b6040516001600160a01b03909116815260200161034b565b348015610509575f80fd5b50609b546104e6906001600160a01b031681565b348015610528575f80fd5b5061036960aa5481565b61039661054036600461420b565b611354565b348015610550575f80fd5b5061039661055f3660046140f4565b611bd7565b34801561056f575f80fd5b5060655460ff1661033f565b348015610586575f80fd5b506105bb6105953660046140f4565b60a26020525f908152604090208054600182015460028301546003909301549192909184565b60408051948552602085019390935291830152606082015260800161034b565b3480156105e6575f80fd5b5061060e7f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff909116815260200161034b565b348015610632575f80fd5b506103966106413660046140f4565b611c82565b348015610651575f80fd5b506103696106603660046140f4565b60ab6020525f908152604090205481565b34801561067c575f80fd5b5061039661068b366004614126565b611e97565b34801561069b575f80fd5b50610396611f54565b3480156106af575f80fd5b506103966106be366004614278565b611f67565b3480156106ce575f80fd5b5060a65461033f9060ff1681565b3480156106e7575f80fd5b506033546001600160a01b03166104e6565b348015610704575f80fd5b506107656107133660046140f4565b60a46020525f9081526040902080546001820154600283015460039093015467ffffffffffffffff831693680100000000000000009093046001600160a01b0316929060ff8082169161010090041686565b6040805167ffffffffffffffff90971687526001600160a01b03909516602087015293850192909252606084015215156080830152151560a082015260c00161034b565b3480156107b4575f80fd5b5061033f6107c33660046140f4565b5f90815260a4602052604090206003015460ff1690565b3480156107e5575f80fd5b506103966107f4366004614126565b6122aa565b348015610804575f80fd5b5061033f610813366004614126565b609f6020525f908152604090205460ff1681565b348015610832575f80fd5b5061036960995481565b348015610847575f80fd5b506103966108563660046140f4565b61238d565b348015610866575f80fd5b50610369610875366004614126565b60a56020525f908152604090205481565b348015610891575f80fd5b5061036960a85481565b3480156108a6575f80fd5b506103966108b53660046142d3565b61243d565b3480156108c5575f80fd5b506103966108d4366004614126565b612682565b3480156108e4575f80fd5b506103966108f33660046141cc565b6126db565b348015610903575f80fd5b50610396610912366004614347565b612a2b565b610396610925366004614362565b612b86565b348015610935575f80fd5b5061036960985481565b34801561094a575f80fd5b50610396610959366004614126565b613152565b348015610969575f80fd5b506097546104e6906001600160a01b031681565b348015610988575f80fd5b5061033f6109973660046140f4565b613211565b3480156109a7575f80fd5b50610369609a5481565b3480156109bc575f80fd5b506103966109cb3660046140f4565b61325b565b3480156109db575f80fd5b506103966109ea366004614126565b6132fe565b3480156109fa575f80fd5b5061036960a95481565b610a0c61338b565b6001600160a01b0381165f908152609f602052604090205460ff1615610a795760405162461bcd60e51b815260206004820152601f60248201527f6163636f756e7420697320616c72656164792061206368616c6c656e6765720060448201526064015b60405180910390fd5b6001600160a01b0381165f818152609f6020908152604091829020805460ff1916600190811790915591519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc00991015b60405180910390a250565b610ade61338b565b5f8111610b2d5760405162461bcd60e51b815260206004820152601560248201527f636f756e74206d757374206265206e6f6e7a65726f00000000000000000000006044820152606401610a70565b5f80610b3985856133e5565b915091505f610b4c836001015160c01c90565b5f81815260a160205260409020549091508214610bab5760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b5f60a181610bb987856143c5565b81526020019081526020015f205414610c395760405162461bcd60e51b8152602060048201526024808201527f726576657274696e67206d7573742073746172742066726f6d2074686520656e60448201527f64696e67000000000000000000000000000000000000000000000000000000006064820152608401610a70565b609d548111610cb05760405162461bcd60e51b815260206004820152602160248201527f63616e206f6e6c792072657665727420756e46696e616c697a6564206261746360448201527f68000000000000000000000000000000000000000000000000000000000000006064820152608401610a70565b610cbb6001826143d8565b609e555b8315610e2757604051829082907ecae2739091badfd91c373f0a16cede691e0cd25bb80cff77dd5caeb4710146905f90a35f81815260a16020526040812055610d0781613211565b15610d62575f81815260a460209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a59092528220805491929091610d529084906143c5565b909155505060a6805460ff191690555b5f81815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a85415801590610ddf575060a85481145b15610de9575f60a8555b6001015f81815260a160205260409020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90940193915081610cbf575b505050505050565b60a85415610e7f5760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b610e87613400565b5f80610e9384846133e5565b915091505f610ea6836001015160c01c90565b5f81815260a160205260409020549091508214610f055760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b610f0e81611326565b610f5a5760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610a70565b610f6381613211565b15610fb05760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610a70565b5f81815260a4602052604090206003015460ff16156110115760405162461bcd60e51b815260206004820152601660248201527f62617463682073686f756c6420626520726576657274000000000000000000006044820152606401610a70565b5f81815260a260205260409020600101544210156110715760405162461bcd60e51b815260206004820152601960248201527f626174636820696e206368616c6c656e67652077696e646f77000000000000006044820152606401610a70565b605983015160a05f6110846001856143d8565b81526020019081526020015f2054146110df5760405162461bcd60e51b815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610a70565b5f81815260a060205260409020541561113a5760405162461bcd60e51b815260206004820152601660248201527f626174636820616c7265616479207665726966696564000000000000000000006044820152606401610a70565b80609d546001011461118e5760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610a70565b609d819055600160a35f6111a3866099015190565b815260208101919091526040015f20805460ff191691151591909117905560798301515f82815260a060205260409020556111f26111e5846011015160c01c90565b600985015160c01c613453565b60a25f6112006001846143d8565b815260208101919091526040015f908120818155600180820183905560028201839055600390910182905560ab919061123990846143d8565b81526020019081526020015f205f905560a45f60018361125991906143d8565b815260208082019290925260409081015f90812080547fffffffff00000000000000000000000000000000000000000000000000000000168155600181018290556002810182905560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905583815260a1909252902054817f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d611302866079015190565b60998701516040805192835260208301919091520160405180910390a35050505050565b5f81815260a260205260408120541580159061134e57505f82815260a1602052604090205415155b92915050565b6097546001600160a01b03166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa1580156113c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906113e491906143eb565b6114305760405162461bcd60e51b815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f7765640000000000006044820152606401610a70565b60a854156114805760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b611488613400565b6114956020830183614406565b60ff16156114e55760405162461bcd60e51b815260206004820152600f60248201527f696e76616c69642076657273696f6e00000000000000000000000000000000006044820152606401610a70565b5f6114f36040840184614426565b915050806115435760405162461bcd60e51b815260206004820152600e60248201527f626174636820697320656d7074790000000000000000000000000000000000006044820152606401610a70565b60608301356115945760405162461bcd60e51b815260206004820152601b60248201527f70726576696f757320737461746520726f6f74206973207a65726f00000000006044820152606401610a70565b60808301356115e55760405162461bcd60e51b815260206004820152601660248201527f6e657720737461746520726f6f74206973207a65726f000000000000000000006044820152606401610a70565b5f806115fc6115f76020870187614426565b6133e5565b915091505f61160f836001015160c01c90565b90505f60a1816116208460016143c5565b81526020019081526020015f20541461167b5760405162461bcd60e51b815260206004820152601760248201527f626174636820616c726561647920636f6d6d69747465640000000000000000006044820152606401610a70565b609e5481146116cc5760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610a70565b5f81815260a1602052604090205482146117285760405162461bcd60e51b815260206004820152601b60248201527f696e636f727265637420706172656e74206261746368206861736800000000006044820152606401610a70565b5f81815260ab60205260409020546060870135146117885760405162461bcd60e51b815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610a70565b5f611797846011015160c01c90565b90505f80806117e96117ac60408c018c614426565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f920191909152508792508891506135109050565b600196909601959485019493840193925090505f80491561180b575f4961182d565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440145b60408051611f2081019091529850905060f96118588961185060208f018f614406565b60ff1661368d565b60c087811b60018b015285811b60098b015286901b60118a01526019890183905260608c013560598a015260808c013560798a015260a08c013560998a01526118c7896118a860208e018e614426565b6040516118b6929190614487565b604051809103902060b99190910152565b60d98901889052603989018290528089205f88815260a1602090815260408083209390935560ab905290812060808e0135905560a65460ff16156119345760a7545f90815260a460205260409020600201546099544291611927916143c5565b61193191906143d8565b90505b6040518060800160405280428152602001826098544261195491906143c5565b61195e91906143c5565b81526020016119af8f80604001906119769190614426565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f9201919091525061369492505050565b81526097546020909101906001600160a01b031663d096c3c6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611a23573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a479190614496565b90525f89815260a2602090815260409182902083518155838201516001820155918301516002830155606090920151600390910155609e8990556097546001600160a01b031692506374fe27b791508c3590611aaf90611aa9908f018f614426565b5f6136eb565b5f8e8060400190611ac09190614426565b6040518663ffffffff1660e01b8152600401611ae09594939291906144f4565b602060405180830381865afa158015611afb573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611b1f91906143eb565b611b915760405162461bcd60e51b815260206004820152602160248201527f746865207369676e617475726520766572696669636174696f6e206661696c6560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610a70565b5f86815260a16020526040808220549051909188917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a35050505050505050505050565b611bdf61338b565b5f81118015611bf057506099548114155b611c3c5760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964206e65772070726f6f662077696e646f7700000000000000006044820152606401610a70565b609980549082905560408051828152602081018490527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a6191015b60405180910390a15050565b5f54600290610100900460ff16158015611ca257505f5460ff8083169116105b611d145760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a70565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055611d4f5f5460ff1690565b60ff16600214611da15760405162461bcd60e51b815260206004820152601660248201527f6d757374206861766520696e697469616c697a656421000000000000000000006044820152606401610a70565b81611e145760405162461bcd60e51b815260206004820152602760248201527f63616e206e6f742073657420737461746520726f6f742077697468206279746560448201527f73333228302921000000000000000000000000000000000000000000000000006064820152608401610a70565b609e545f90815260ab6020526040902054611e3d57609e545f90815260ab602052604090208290555b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611c76565b611e9f61338b565b6001600160a01b0381165f908152609f602052604090205460ff16611f065760405162461bcd60e51b815260206004820152601b60248201527f6163636f756e74206973206e6f742061206368616c6c656e67657200000000006044820152606401610a70565b6001600160a01b0381165f818152609f60209081526040808320805460ff19169055519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc0099101610acb565b611f5c61338b565b611f655f61373f565b565b5f54610100900460ff1615808015611f8557505f54600160ff909116105b80611f9e5750303b158015611f9e57505f5460ff166001145b6120105760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610a70565b5f805460ff19166001179055801561204e575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6001600160a01b038616158061206b57506001600160a01b038516155b156120a2576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0387166120f85760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206c31207374616b696e6720636f6e747261637400000000006044820152606401610a70565b6121006137a8565b61210861382c565b609780546001600160a01b03808a167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255609b8054898416908316179055609c805492881692909116821790556098859055609984905560a98390556040515f907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96908290a3604080515f8152602081018690527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a437910160405180910390a1604080515f8152602081018590527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a61910160405180910390a1604080515f8152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b0223910160405180910390a180156122a1575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b6122b261338b565b6001600160a01b038116158015906122d85750609c546001600160a01b03828116911614155b6123245760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964206e65772076657269666965720000000000000000000000006044820152606401610a70565b609c80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96905f90a35050565b61239561338b565b5f811180156123a5575060648111155b80156123b3575060a9548114155b6123ff5760405162461bcd60e51b815260206004820152601f60248201527f696e76616c69642070726f6f66207265776172642070657263656e74616765006044820152606401610a70565b60a980549082905560408051828152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b02239101611c76565b60a8541561248d5760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b612495613400565b5f806124a186866133e5565b915091505f6124b4836001015160c01c90565b5f81815260a1602052604090205490915082146125135760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b61251c81613211565b6125685760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610a70565b5f81815260a4602052604090206003810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560a6805460ff1916905560995460029091015442916125c1916143c5565b11612637575f81815260a4602090815260408083206003908101805460ff1916600117905560a2835292819020909201548251808401909352600783527f54696d656f75740000000000000000000000000000000000000000000000000091830191909152612632918391906138b0565b6122a1565b612642838686613a0c565b6122a181336040518060400160405280600d81526020017f50726f6f66207375636365737300000000000000000000000000000000000000815250613bbf565b61268a61338b565b60aa80545f90915561269c8282613c8b565b604080516001600160a01b0384168152602081018390527fb1b2058a6969e2d25e47bcaebe8ae21c29a23b2752429315b75e2f4f285f3d879101611c76565b6126e361338b565b5f805260a06020527fb84a74ec6ef4d0e83b6006dfaa014ab4026f9f3b97d186e604d29998a4e808ea541561275a5760405162461bcd60e51b815260206004820152601660248201527f67656e6573697320626174636820696d706f72746564000000000000000000006044820152606401610a70565b5f8061276684846133e5565b915091505f612779836001015160c01c90565b905080156127c95760405162461bcd60e51b815260206004820152601360248201527f696e76616c696420626174636820696e646578000000000000000000000000006044820152606401610a70565b5f6127d5846079015190565b9050806128245760405162461bcd60e51b815260206004820152600f60248201527f7a65726f20737461746520726f6f7400000000000000000000000000000000006044820152606401610a70565b600984015160c01c156128795760405162461bcd60e51b815260206004820152601d60248201527f6c31206d65737361676520706f707065642073686f756c6420626520300000006044820152606401610a70565b5f612885856019015190565b036128d25760405162461bcd60e51b815260206004820152600e60248201527f7a65726f206461746120686173680000000000000000000000000000000000006044820152606401610a70565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440146128fe856039015190565b1461294b5760405162461bcd60e51b815260206004820152601660248201527f696e76616c69642076657273696f6e65642068617368000000000000000000006044820152606401610a70565b5f82815260a1602090815260408083208690558051608081018252428082528184019081528183018581526060830186815288875260a2865284872093518455915160018401555160028301555160039091015560ab825280832084905560a0909152808220839055609e849055609d84905551849184917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a3604080518281525f6020820152849184917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d910160405180910390a3505050505050565b612a3361338b565b8015612b5457612a41613d36565b60a65460ff1615612b135760a7545f90815260a460209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a59092528220805491929091612a959084906143c5565b909155505060a7545f90815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a6805460ff191690555b7f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b6040516001600160a01b03909116815260200160405180910390a150565b612b5c613d90565b7f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33612b36565b50565b335f908152609f602052604090205460ff16612be45760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206368616c6c656e67657220616c6c6f776564000000000000006044820152606401610a70565b60a85415612c345760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610a70565b612c3c613400565b60a65460ff1615612c8f5760405162461bcd60e51b815260206004820152601460248201527f616c726561647920696e206368616c6c656e67650000000000000000000000006044820152606401610a70565b8167ffffffffffffffff16609d5410612cea5760405162461bcd60e51b815260206004820152601760248201527f626174636820616c72656164792066696e616c697a65640000000000000000006044820152606401610a70565b67ffffffffffffffff82165f90815260a160205260409020548114612d515760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610a70565b612d648267ffffffffffffffff16611326565b612db05760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610a70565b67ffffffffffffffff82165f90815260a460205260409020546801000000000000000090046001600160a01b031615612e2b5760405162461bcd60e51b815260206004820152601860248201527f626174636820616c7265616479206368616c6c656e67656400000000000000006044820152606401610a70565b67ffffffffffffffff82165f90815260a260205260409020600101544210612ebb5760405162461bcd60e51b815260206004820152603360248201527f63616e6e6f74206368616c6c656e6765206261746368206f757473696465207460448201527f6865206368616c6c656e67652077696e646f77000000000000000000000000006064820152608401610a70565b60975f9054906101000a90046001600160a01b03166001600160a01b0316630d13fd7b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612f0b573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612f2f9190614496565b341015612f7e5760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742076616c756500000000000000000000000000006044820152606401610a70565b67ffffffffffffffff82811660a78190556040805160c0810182528281523360208083018281523484860190815242606086019081525f6080870181815260a0880182815299825260a4909552969096209451855492516001600160a01b031668010000000000000000027fffffffff00000000000000000000000000000000000000000000000000000000909316981697909717178355945160018301559151600282015592516003909301805492511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff941515949094167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000909316929092179290921790556001600160a01b03168267ffffffffffffffff167f3a6ea19df25b49e7624e313ce7c1ab23984238e93727260db56a81735b1b9976346040516130d091815260200190565b60405180910390a35f609d5460016130e891906143c5565b90505b609e548111613140578267ffffffffffffffff16811461312e576099545f82815260a26020526040812060010180549091906131289084906143c5565b90915550505b8061313881614567565b9150506130eb565b505060a6805460ff1916600117905550565b335f90815260a56020526040812054908190036131b15760405162461bcd60e51b815260206004820152601c60248201527f696e76616c69642062617463684368616c6c656e6765526577617264000000006044820152606401610a70565b335f90815260a560205260408120556131ca8282613c8b565b816001600160a01b03167f9c25fa83f414ed363c8d39c98fb3e17567b3431cede71eb062c49d2a63ce247a8260405161320591815260200190565b60405180910390a25050565b5f81815260a460205260408120546801000000000000000090046001600160a01b03161580159061134e5750505f90815260a46020526040902060030154610100900460ff161590565b61326361338b565b5f8111801561327457506098548114155b6132c05760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206e65772066696e616c697a6520706572696f6400000000006044820152606401610a70565b609880549082905560408051828152602081018490527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a4379101611c76565b61330661338b565b6001600160a01b0381166133825760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610a70565b612b838161373f565b6033546001600160a01b03163314611f655760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610a70565b5f805f6133f28585613dc9565b812090969095509350505050565b60655460ff1615611f655760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610a70565b805f0361345e575050565b8082035f5b8281101561350a5761010081840381111561347d57508083035b609b546040517f3c7f528300000000000000000000000000000000000000000000000000000000815260048101859052602481018390526001600160a01b0390911690633c7f5283906044015f604051808303815f87803b1580156134e0575f80fd5b505af11580156134f2573d5f803e3d5ffd5b50505050610100830192505061010081019050613463565b50505050565b60405183515f9182916020870191908190849061352e908590613e32565b90506002840193505f5b818110156135b257603c81028501805184526020908101517fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000001690840152603a830192505f613588603c8361459e565b61359290876143c5565b90505f6135a382603a015160f01c90565b97909701965050600101613538565b506020850282016040525b801561367b575f6135d285603a015160f01c90565b90506135e083828b8b613ec7565b92505f6135f1866038015160f01c90565b9050818110156136435760405162461bcd60e51b815260206004820152601d60248201527f6e756d20747873206c657373207468616e206e756d204c31206d7367730000006044820152606401610a70565b50978801979690960195603c93909301927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff016135bd565b50819003902096919550909350505050565b8082535050565b5f805f6020840190506002810191505f6136af828651613e32565b90505f5b6136be6001836143d8565b8110156136d457603c93909301926001016136b3565b505f6136e1845160c01c90565b9695505050505050565b60605f808080806136fe888a018a6146a2565b955095509550955095505081871061371c5794506137389350505050565b838710613730578295505050505050613738565b509293505050505b9392505050565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff166138245760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b611f65613f95565b5f54610100900460ff166138a85760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b611f6561401d565b60a88390555f83815260a460205260408082205460975491517f45bc4d1000000000000000000000000000000000000000000000000000000000815260048101869052680100000000000000009091046001600160a01b03908116939216906345bc4d10906024016020604051808303815f875af1158015613934573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906139589190614496565b5f86815260a460205260409020600101549091506139779082906143c5565b5f86815260a460209081526040808320546801000000000000000090046001600160a01b0316835260a5909152812080549091906139b69084906143c5565b90915550506040516139c990849061473f565b604051908190038120906001600160a01b0384169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b80613a595760405162461bcd60e51b815260206004820152601360248201527f496e76616c69642062617463682070726f6f66000000000000000000000000006044820152606401610a70565b5f613a68846001015160c01c90565b90505f613a76856039015190565b90505f7f0000000000000000000000000000000000000000000000000000000000000000613aa5876059015190565b6079880151609989015160b98a015160198b015160405160c09690961b7fffffffffffffffff000000000000000000000000000000000000000000000000166020870152602886019490945260488501929092526068840152608883015260a882015260c8810183905260e801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120609c549091506001600160a01b0316632c09a848613b67885160f81c90565b858888866040518663ffffffff1660e01b8152600401613b8b95949392919061476b565b5f6040518083038186803b158015613ba1575f80fd5b505afa158015613bb3573d5f803e3d5ffd5b50505050505050505050565b5f83815260a4602052604081206001015460a954909190606490613be3908461459e565b613bed919061479c565b9050613bf981836143d8565b60aa5f828254613c0991906143c5565b90915550506001600160a01b0384165f90815260a5602052604081208054839290613c359084906143c5565b9091555050604051613c4890849061473f565b604051908190038120906001600160a01b0386169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b8015613d32575f826001600160a01b0316826040515f6040518083038185875af1925050503d805f8114613cda576040519150601f19603f3d011682016040523d82523d5f602084013e613cdf565b606091505b5050905080613d305760405162461bcd60e51b815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c656400000000006044820152606401610a70565b505b5050565b613d3e613400565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258613d733390565b6040516001600160a01b03909116815260200160405180910390a1565b613d986140a2565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33613d73565b5f8160f9811015613e1c5760405162461bcd60e51b815260206004820152601d60248201527f626174636820686561646572206c656e67746820746f6f20736d616c6c0000006044820152606401610a70565b6040519150808483378082016040529250929050565b5f613e3e835160f01c90565b9050805f03613e79576040517f5168407700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b613e84603c8261459e565b613e8f9060026143c5565b821461134e576040517f4a969e2d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f835f03613ed6575083613f8d565b609b546001600160a01b03165f5b85811015613f87576040517fae453cd5000000000000000000000000000000000000000000000000000000008152600481018590525f906001600160a01b0384169063ae453cd590602401602060405180830381865afa158015613f4a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f6e9190614496565b8852506020909601956001948501949384019301613ee4565b50859150505b949350505050565b5f54610100900460ff166140115760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b6065805460ff19169055565b5f54610100900460ff166140995760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610a70565b611f653361373f565b60655460ff16611f655760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610a70565b5f60208284031215614104575f80fd5b5035919050565b80356001600160a01b0381168114614121575f80fd5b919050565b5f60208284031215614136575f80fd5b6137388261410b565b5f8083601f84011261414f575f80fd5b50813567ffffffffffffffff811115614166575f80fd5b60208301915083602082850101111561417d575f80fd5b9250929050565b5f805f60408486031215614196575f80fd5b833567ffffffffffffffff8111156141ac575f80fd5b6141b88682870161413f565b909790965060209590950135949350505050565b5f80602083850312156141dd575f80fd5b823567ffffffffffffffff8111156141f3575f80fd5b6141ff8582860161413f565b90969095509350505050565b5f806040838503121561421c575f80fd5b823567ffffffffffffffff80821115614233575f80fd5b9084019060c08287031215614246575f80fd5b9092506020840135908082111561425b575f80fd5b5083016060818603121561426d575f80fd5b809150509250929050565b5f805f805f8060c0878903121561428d575f80fd5b6142968761410b565b95506142a46020880161410b565b94506142b26040880161410b565b9350606087013592506080870135915060a087013590509295509295509295565b5f805f80604085870312156142e6575f80fd5b843567ffffffffffffffff808211156142fd575f80fd5b6143098883890161413f565b90965094506020870135915080821115614321575f80fd5b5061432e8782880161413f565b95989497509550505050565b8015158114612b83575f80fd5b5f60208284031215614357575f80fd5b81356137388161433a565b5f8060408385031215614373575f80fd5b823567ffffffffffffffff8116811461438a575f80fd5b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561134e5761134e614398565b8181038181111561134e5761134e614398565b5f602082840312156143fb575f80fd5b81516137388161433a565b5f60208284031215614416575f80fd5b813560ff81168114613738575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614459575f80fd5b83018035915067ffffffffffffffff821115614473575f80fd5b60200191503681900382131561417d575f80fd5b818382375f9101908152919050565b5f602082840312156144a6575f80fd5b5051919050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f6080820187835260206080602085015281885180845260a08601915060208a0193505f5b8181101561453e5784516001600160a01b031683529383019391830191600101614519565b505087604086015284810360608601526145598187896144ad565b9a9950505050505050505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361459757614597614398565b5060010190565b808202811582820484141761134e5761134e614398565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f8301126145f1575f80fd5b8135602067ffffffffffffffff8083111561460e5761460e6145b5565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108482111715614651576146516145b5565b6040529384526020818701810194908101925087851115614670575f80fd5b6020870191505b84821015614697576146888261410b565b83529183019190830190614677565b979650505050505050565b5f805f805f8060c087890312156146b7575f80fd5b86359550602087013567ffffffffffffffff808211156146d5575f80fd5b6146e18a838b016145e2565b96506040890135955060608901359150808211156146fd575f80fd5b6147098a838b016145e2565b94506080890135935060a0890135915080821115614725575f80fd5b5061473289828a016145e2565b9150509295509295509295565b5f82515f5b8181101561475e5760208186018101518583015201614744565b505f920191825250919050565b858152846020820152608060408201525f61478a6080830185876144ad565b90508260608301529695505050505050565b5f826147cf577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b50049056fea164736f6c6343000818000a", + 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\":false,\"internalType\":\"uint256\",\"name\":\"oldPeriod\",\"type\":\"uint256\"},{\"indexed\":false,\"internalType\":\"uint256\",\"name\":\"newPeriod\",\"type\":\"uint256\"}],\"name\":\"UpdateRollupDelayPeriod\",\"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\":[{\"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\"},{\"internalType\":\"bytes\",\"name\":\"_batchHeader\",\"type\":\"bytes\"},{\"internalType\":\"bytes\",\"name\":\"_batchProof\",\"type\":\"bytes\"}],\"name\":\"commitBatchWithProof\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"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\":\"_rollupDelayPeriod\",\"type\":\"uint256\"}],\"name\":\"initialize3\",\"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\":[],\"name\":\"rollupDelayPeriod\",\"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\":\"uint256\",\"name\":\"_newPeriod\",\"type\":\"uint256\"}],\"name\":\"updateRollupDelayPeriod\",\"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: "0x60a060405234801562000010575f80fd5b5060405162004fb038038062004fb083398101604081905262000033916200010f565b6001600160401b0381166080526200004a62000051565b506200013e565b5f54610100900460ff1615620000bd5760405162461bcd60e51b815260206004820152602760248201527f496e697469616c697a61626c653a20636f6e747261637420697320696e697469604482015266616c697a696e6760c81b606482015260840160405180910390fd5b5f5460ff908116146200010d575f805460ff191660ff9081179091556040519081527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b565b5f6020828403121562000120575f80fd5b81516001600160401b038116811462000137575f80fd5b9392505050565b608051614e526200015e5f395f81816106370152613c210152614e525ff3fe608060405260043610610332575f3560e01c806388b1ea09116101a7578063bedb86fb116100e7578063d8dc99d211610092578063dff7827e1161006d578063dff7827e14610a3a578063e3fff1dd14610a4f578063f2fde38b14610a6e578063fb1e8b0414610a8d575f80fd5b8063d8dc99d2146109e7578063ddd8a3dc146109fc578063de8b303514610a1b575f80fd5b8063ce5db8d6116100c2578063ce5db8d614610994578063cf9a6745146109a9578063d279c191146109c8575f80fd5b8063bedb86fb14610943578063c555389214610962578063cd4edc6914610981575f80fd5b8063a479265d11610152578063b31a77d31161012d578063b31a77d3146108d1578063b3484425146108e6578063b35dac4e14610905578063b3e0a50914610924575f80fd5b8063a479265d14610872578063a4f209b014610887578063abc8d68d146108a6575f80fd5b8063910129d411610182578063910129d4146107f457806397fc007c14610825578063a415d8dc14610844575f80fd5b806388b1ea091461070e5780638da5cb5b146107275780638f1d377614610744575f80fd5b80633b70c18a116102725780635ef7a94a1161021d57806368589dfa116101f857806368589dfa146106915780636c578c1d146106bc578063715018a6146106db578063728cdbca146106ef575f80fd5b80635ef7a94a146105c65780635f77cf1d146106265780636126729014610672575f80fd5b80634e8f1d671161024d5780634e8f1d671461057157806357e0af6c146105905780635c975abb146105af575f80fd5b80633b70c18a1461052a5780633e001b6614610549578063428868b51461055e575f80fd5b806313361101116102dd57806321e2f9e0116102b857806321e2f9e01461047e5780632362f03e1461049d5780632571098d146104c85780632b7ac3f3146104f3575f80fd5b8063133611011461041a57806318463fb01461043957806318af3b2b1461044e575f80fd5b806310d445831161030d57806310d44583146103c4578063116a1f42146103e3578063121dcd5014610405575f80fd5b806304d772151461033d578063059def61146103805780630ceb6780146103a3575f80fd5b3661033957005b5f80fd5b348015610348575f80fd5b5061036b61035736600461462b565b60a36020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561038b575f80fd5b50610395609d5481565b604051908152602001610377565b3480156103ae575f80fd5b506103c26103bd36600461465d565b610aa2565b005b3480156103cf575f80fd5b506103c26103de3660046146bb565b610b74565b3480156103ee575f80fd5b5061036b6103fd36600461462b565b609d54101590565b348015610410575f80fd5b50610395609e5481565b348015610425575f80fd5b506103c2610434366004614703565b610eb0565b348015610444575f80fd5b5061039560a75481565b348015610459575f80fd5b5061036b61046836600461462b565b5f90815260a26020526040902060010154421090565b348015610489575f80fd5b5061036b61049836600461462b565b61138a565b3480156104a8575f80fd5b506103956104b736600461462b565b60a16020525f908152604090205481565b3480156104d3575f80fd5b506103956104e236600461462b565b60a06020525f908152604090205481565b3480156104fe575f80fd5b50609c54610512906001600160a01b031681565b6040516001600160a01b039091168152602001610377565b348015610535575f80fd5b50609b54610512906001600160a01b031681565b348015610554575f80fd5b5061039560aa5481565b6103c261056c366004614768565b6113b8565b34801561057c575f80fd5b506103c261058b3660046147c8565b6115f4565b34801561059b575f80fd5b506103c26105aa36600461462b565b6118c2565b3480156105ba575f80fd5b5060655460ff1661036b565b3480156105d1575f80fd5b506106066105e036600461462b565b60a26020525f908152604090208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001610377565b348015610631575f80fd5b506106597f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610377565b34801561067d575f80fd5b506103c261068c36600461462b565b61196d565b34801561069c575f80fd5b506103956106ab36600461462b565b60ab6020525f908152604090205481565b3480156106c7575f80fd5b506103c26106d636600461465d565b611b48565b3480156106e6575f80fd5b506103c2611c05565b3480156106fa575f80fd5b506103c2610709366004614879565b611c18565b348015610719575f80fd5b5060a65461036b9060ff1681565b348015610732575f80fd5b506033546001600160a01b0316610512565b34801561074f575f80fd5b506107b061075e36600461462b565b60a46020525f9081526040902080546001820154600283015460039093015467ffffffffffffffff831693680100000000000000009093046001600160a01b0316929060ff8082169161010090041686565b6040805167ffffffffffffffff90971687526001600160a01b03909516602087015293850192909252606084015215156080830152151560a082015260c001610377565b3480156107ff575f80fd5b5061036b61080e36600461462b565b5f90815260a4602052604090206003015460ff1690565b348015610830575f80fd5b506103c261083f36600461465d565b611f21565b34801561084f575f80fd5b5061036b61085e36600461465d565b609f6020525f908152604090205460ff1681565b34801561087d575f80fd5b5061039560995481565b348015610892575f80fd5b506103c26108a136600461462b565b612004565b3480156108b1575f80fd5b506103956108c036600461465d565b60a56020525f908152604090205481565b3480156108dc575f80fd5b5061039560a85481565b3480156108f1575f80fd5b506103c26109003660046148d4565b6120b4565b348015610910575f80fd5b506103c261091f36600461465d565b6123b8565b34801561092f575f80fd5b506103c261093e366004614703565b612411565b34801561094e575f80fd5b506103c261095d366004614948565b612761565b34801561096d575f80fd5b506103c261097c36600461462b565b61289f565b6103c261098f36600461497a565b612942565b34801561099f575f80fd5b5061039560985481565b3480156109b4575f80fd5b506103c26109c336600461462b565b612ed4565b3480156109d3575f80fd5b506103c26109e236600461465d565b613043565b3480156109f2575f80fd5b5061039560ac5481565b348015610a07575f80fd5b50609754610512906001600160a01b031681565b348015610a26575f80fd5b5061036b610a3536600461462b565b613102565b348015610a45575f80fd5b50610395609a5481565b348015610a5a575f80fd5b506103c2610a6936600461462b565b61314c565b348015610a79575f80fd5b506103c2610a8836600461465d565b6131ef565b348015610a98575f80fd5b5061039560a95481565b610aaa61327c565b6001600160a01b0381165f908152609f602052604090205460ff1615610b175760405162461bcd60e51b815260206004820152601f60248201527f6163636f756e7420697320616c72656164792061206368616c6c656e6765720060448201526064015b60405180910390fd5b6001600160a01b0381165f818152609f6020908152604091829020805460ff1916600190811790915591519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc00991015b60405180910390a250565b610b7c61327c565b5f8111610bcb5760405162461bcd60e51b815260206004820152601560248201527f636f756e74206d757374206265206e6f6e7a65726f00000000000000000000006044820152606401610b0e565b5f80610bd785856132d6565b915091505f610bea836001015160c01c90565b5f81815260a160205260409020549091508214610c495760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610b0e565b5f60a181610c5787856149cf565b81526020019081526020015f205414610cd75760405162461bcd60e51b8152602060048201526024808201527f726576657274696e67206d7573742073746172742066726f6d2074686520656e60448201527f64696e67000000000000000000000000000000000000000000000000000000006064820152608401610b0e565b609d548111610d4e5760405162461bcd60e51b815260206004820152602160248201527f63616e206f6e6c792072657665727420756e46696e616c697a6564206261746360448201527f68000000000000000000000000000000000000000000000000000000000000006064820152608401610b0e565b610d596001826149e2565b609e555b8315610ea857604051829082907ecae2739091badfd91c373f0a16cede691e0cd25bb80cff77dd5caeb4710146905f90a35f81815260a16020526040812055610da581613102565b15610e00575f81815260a460209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a59092528220805491929091610df09084906149cf565b909155505060a6805460ff191690555b5f81815260a46020526040812080547fffffffff00000000000000000000000000000000000000000000000000000000168155600181018290556002810191909155600301805461ffff1916905560a85415801590610e60575060a85481145b15610e6a575f60a8555b6001015f81815260a160205260409020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90940193915081610d5d575b505050505050565b60a85415610f005760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610b0e565b610f0861336f565b5f80610f1484846132d6565b915091505f610f27836001015160c01c90565b5f81815260a160205260409020549091508214610f865760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610b0e565b610f8f8161138a565b610fdb5760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610b0e565b610fe481613102565b156110315760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610b0e565b5f81815260a4602052604090206003015460ff16156110925760405162461bcd60e51b815260206004820152601660248201527f62617463682073686f756c6420626520726576657274000000000000000000006044820152606401610b0e565b5f81815260a260205260409020600101544210156110f25760405162461bcd60e51b815260206004820152601960248201527f626174636820696e206368616c6c656e67652077696e646f77000000000000006044820152606401610b0e565b605983015160a05f6111056001856149e2565b81526020019081526020015f2054146111605760405162461bcd60e51b815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610b0e565b5f81815260a06020526040902054156111bb5760405162461bcd60e51b815260206004820152601660248201527f626174636820616c7265616479207665726966696564000000000000000000006044820152606401610b0e565b80609d546001011461120f5760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610b0e565b609d819055600160a35f611224866099015190565b815260208101919091526040015f20805460ff191691151591909117905560798301515f82815260a06020526040902055611273611266846011015160c01c90565b600985015160c01c6133c2565b60a25f6112816001846149e2565b815260208101919091526040015f908120818155600180820183905560028201839055600390910182905560ab91906112ba90846149e2565b81526020019081526020015f205f905560a45f6001836112da91906149e2565b815260208082019290925260409081015f90812080547fffffffff000000000000000000000000000000000000000000000000000000001681556001810182905560028101829055600301805461ffff1916905583815260a1909252902054817f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d611366866079015190565b60998701516040805192835260208301919091520160405180910390a35050505050565b5f81815260a26020526040812054158015906113b257505f82815260a1602052604090205415155b92915050565b6097546001600160a01b03166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015611424573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061144891906149f5565b6114945760405162461bcd60e51b815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f7765640000000000006044820152606401610b0e565b60a854156114e45760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610b0e565b6114ec61336f565b60ac54609b54604080517fb59b1a7800000000000000000000000000000000000000000000000000000000815290514293926001600160a01b03169163b59b1a789160048083019260209291908290030181865afa158015611550573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906115749190614a10565b61157e91906149cf565b10156115e6575f6115956080840160608501614a27565b61ffff16116115e65760405162461bcd60e51b815260206004820152600b60248201527f6c316d73672064656c61790000000000000000000000000000000000000000006044820152606401610b0e565b6115f0828261347f565b5050565b60a854156116445760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610b0e565b61164c61336f565b60ac54609e545f90815260a260205260408120549091429161166e91906149cf565b1090505f4260ac54609b5f9054906101000a90046001600160a01b03166001600160a01b031663b59b1a786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156116c6573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116ea9190614a10565b6116f491906149cf565b109050811580156117025750805b15611769575f61171860808a0160608b01614a27565b61ffff16116117695760405162461bcd60e51b815260206004820152600b60248201527f6c316d73672064656c61790000000000000000000000000000000000000000006044820152606401610b0e565b81806117725750805b6117be5760405162461bcd60e51b815260206004820152600e60248201527f696e76616c69642074696d696e670000000000000000000000000000000000006044820152606401610b0e565b6117c8888861347f565b5f806117d488886132d6565b915091505f6117e7836001015160c01c90565b905080609e541461183a5760405162461bcd60e51b815260206004820152601660248201527f696e636f727265637420626174636820686561646572000000000000000000006044820152606401610b0e565b5f81815260a1602052604090205482146118965760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610b0e565b5f81815260a260205260409020426001909101556118b5838888613bb2565b5050505050505050505050565b6118ca61327c565b5f811180156118db57506099548114155b6119275760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964206e65772070726f6f662077696e646f7700000000000000006044820152606401610b0e565b609980549082905560408051828152602081018490527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a6191015b60405180910390a15050565b5f54600290610100900460ff1615801561198d57505f5460ff8083169116105b6119ff5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610b0e565b5f805461ffff191660ff831617610100179055611a1d5f5460ff1690565b60ff16600214611a6f5760405162461bcd60e51b815260206004820152601660248201527f6d757374206861766520696e697469616c697a656421000000000000000000006044820152606401610b0e565b81611ae25760405162461bcd60e51b815260206004820152602760248201527f63616e206e6f742073657420737461746520726f6f742077697468206279746560448201527f73333228302921000000000000000000000000000000000000000000000000006064820152608401610b0e565b609e545f90815260ab6020526040902054611b0b57609e545f90815260ab602052604090208290555b5f805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611961565b611b5061327c565b6001600160a01b0381165f908152609f602052604090205460ff16611bb75760405162461bcd60e51b815260206004820152601b60248201527f6163636f756e74206973206e6f742061206368616c6c656e67657200000000006044820152606401610b0e565b6001600160a01b0381165f818152609f60209081526040808320805460ff19169055519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc0099101610b69565b611c0d61327c565b611c165f613d65565b565b5f54610100900460ff1615808015611c3657505f54600160ff909116105b80611c4f5750303b158015611c4f57505f5460ff166001145b611cc15760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610b0e565b5f805460ff191660011790558015611ce2575f805461ff0019166101001790555b6001600160a01b0386161580611cff57506001600160a01b038516155b15611d36576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b038716611d8c5760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206c31207374616b696e6720636f6e747261637400000000006044820152606401610b0e565b611d94613dce565b611d9c613e52565b609780546001600160a01b03808a167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255609b8054898416908316179055609c805492881692909116821790556098859055609984905560a98390556040515f907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96908290a3604080515f8152602081018690527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a437910160405180910390a1604080515f8152602081018590527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a61910160405180910390a1604080515f8152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b0223910160405180910390a18015611f18575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b611f2961327c565b6001600160a01b03811615801590611f4f5750609c546001600160a01b03828116911614155b611f9b5760405162461bcd60e51b815260206004820152601460248201527f696e76616c6964206e65772076657269666965720000000000000000000000006044820152606401610b0e565b609c80546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96905f90a35050565b61200c61327c565b5f8111801561201c575060648111155b801561202a575060a9548114155b6120765760405162461bcd60e51b815260206004820152601f60248201527f696e76616c69642070726f6f66207265776172642070657263656e74616765006044820152606401610b0e565b60a980549082905560408051828152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b02239101611961565b60a854156121045760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610b0e565b61210c61336f565b6097546001600160a01b03166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015612178573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061219c91906149f5565b6121e85760405162461bcd60e51b815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f7765640000000000006044820152606401610b0e565b5f806121f486866132d6565b915091505f612207836001015160c01c90565b5f81815260a1602052604090205490915082146122665760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610b0e565b61226f81613102565b6122bb5760405162461bcd60e51b815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610b0e565b5f81815260a46020526040902060038101805461ff00191661010017905560a6805460ff1916905560995460029091015442916122f7916149cf565b1161236d575f81815260a4602090815260408083206003908101805460ff1916600117905560a2835292819020909201548251808401909352600783527f54696d656f7574000000000000000000000000000000000000000000000000009183019190915261236891839190613ed6565b611f18565b612378838686613bb2565b611f1881336040518060400160405280600d81526020017f50726f6f66207375636365737300000000000000000000000000000000000000815250614032565b6123c061327c565b60aa80545f9091556123d282826140fe565b604080516001600160a01b0384168152602081018390527fb1b2058a6969e2d25e47bcaebe8ae21c29a23b2752429315b75e2f4f285f3d879101611961565b61241961327c565b5f805260a06020527fb84a74ec6ef4d0e83b6006dfaa014ab4026f9f3b97d186e604d29998a4e808ea54156124905760405162461bcd60e51b815260206004820152601660248201527f67656e6573697320626174636820696d706f72746564000000000000000000006044820152606401610b0e565b5f8061249c84846132d6565b915091505f6124af836001015160c01c90565b905080156124ff5760405162461bcd60e51b815260206004820152601360248201527f696e76616c696420626174636820696e646578000000000000000000000000006044820152606401610b0e565b5f61250b846079015190565b90508061255a5760405162461bcd60e51b815260206004820152600f60248201527f7a65726f20737461746520726f6f7400000000000000000000000000000000006044820152606401610b0e565b600984015160c01c156125af5760405162461bcd60e51b815260206004820152601d60248201527f6c31206d65737361676520706f707065642073686f756c6420626520300000006044820152606401610b0e565b5f6125bb856019015190565b036126085760405162461bcd60e51b815260206004820152600e60248201527f7a65726f206461746120686173680000000000000000000000000000000000006044820152606401610b0e565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014612634856039015190565b146126815760405162461bcd60e51b815260206004820152601660248201527f696e76616c69642076657273696f6e65642068617368000000000000000000006044820152606401610b0e565b5f82815260a1602090815260408083208690558051608081018252428082528184019081528183018581526060830186815288875260a2865284872093518455915160018401555160028301555160039091015560ab825280832084905560a0909152808220839055609e849055609d84905551849184917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a3604080518281525f6020820152849184917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d910160405180910390a3505050505050565b61276961327c565b801561286d576127776141a8565b60a65460ff161561282c5760a7545f90815260a460209081526040808320600181015490546801000000000000000090046001600160a01b0316845260a590925282208054919290916127cb9084906149cf565b909155505060a7545f90815260a46020526040812080547fffffffff00000000000000000000000000000000000000000000000000000000168155600181018290556002810191909155600301805461ffff1916905560a6805460ff191690555b7f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b6040516001600160a01b03909116815260200160405180910390a150565b612875614202565b7f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa3361284f565b50565b6128a761327c565b5f811180156128b8575060ac548114155b6129045760405162461bcd60e51b815260206004820152601f60248201527f696e76616c6964206e657720726f6c6c75702064656c617920706572696f64006044820152606401610b0e565b60ac80549082905560408051828152602081018490527f624e47dc9fb8f8cfeaf4ead4710277cc1757136cfa885e465514cf6d510f0ad19101611961565b335f908152609f602052604090205460ff166129a05760405162461bcd60e51b815260206004820152601960248201527f63616c6c6572206368616c6c656e67657220616c6c6f776564000000000000006044820152606401610b0e565b60a854156129f05760405162461bcd60e51b815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610b0e565b6129f861336f565b60a65460ff1615612a4b5760405162461bcd60e51b815260206004820152601460248201527f616c726561647920696e206368616c6c656e67650000000000000000000000006044820152606401610b0e565b8167ffffffffffffffff16609d5410612aa65760405162461bcd60e51b815260206004820152601760248201527f626174636820616c72656164792066696e616c697a65640000000000000000006044820152606401610b0e565b67ffffffffffffffff82165f90815260a160205260409020548114612b0d5760405162461bcd60e51b815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610b0e565b612b208267ffffffffffffffff1661138a565b612b6c5760405162461bcd60e51b815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610b0e565b67ffffffffffffffff82165f90815260a460205260409020546801000000000000000090046001600160a01b031615612be75760405162461bcd60e51b815260206004820152601860248201527f626174636820616c7265616479206368616c6c656e67656400000000000000006044820152606401610b0e565b67ffffffffffffffff82165f90815260a260205260409020600101544210612c775760405162461bcd60e51b815260206004820152603360248201527f63616e6e6f74206368616c6c656e6765206261746368206f757473696465207460448201527f6865206368616c6c656e67652077696e646f77000000000000000000000000006064820152608401610b0e565b60975f9054906101000a90046001600160a01b03166001600160a01b0316630d13fd7b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015612cc7573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612ceb9190614a10565b341015612d3a5760405162461bcd60e51b815260206004820152601260248201527f696e73756666696369656e742076616c756500000000000000000000000000006044820152606401610b0e565b67ffffffffffffffff82811660a78190556040805160c0810182528281523360208083018281523484860190815242606086019081525f6080870181815260a0880182815299825260a4909552969096209451855492516001600160a01b031668010000000000000000027fffffffff000000000000000000000000000000000000000000000000000000009093169816979097171783559451600183015591516002820155925160039093018054925115156101000261ff00199415159490941661ffff19909316929092179290921790556001600160a01b03168267ffffffffffffffff167f3a6ea19df25b49e7624e313ce7c1ab23984238e93727260db56a81735b1b997634604051612e5291815260200190565b60405180910390a35f609d546001612e6a91906149cf565b90505b609e548111612ec2578267ffffffffffffffff168114612eb0576099545f82815260a2602052604081206001018054909190612eaa9084906149cf565b90915550505b80612eba81614a48565b915050612e6d565b505060a6805460ff1916600117905550565b5f54600390610100900460ff16158015612ef457505f5460ff8083169116105b612f665760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610b0e565b5f805461ffff191660ff831617610100178155829003612fc85760405162461bcd60e51b815260206004820152601b60248201527f696e76616c696420726f6c6c75702064656c617920706572696f6400000000006044820152606401610b0e565b60ac829055604080515f8152602081018490527f624e47dc9fb8f8cfeaf4ead4710277cc1757136cfa885e465514cf6d510f0ad1910160405180910390a15f805461ff001916905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611961565b335f90815260a56020526040812054908190036130a25760405162461bcd60e51b815260206004820152601c60248201527f696e76616c69642062617463684368616c6c656e6765526577617264000000006044820152606401610b0e565b335f90815260a560205260408120556130bb82826140fe565b816001600160a01b03167f9c25fa83f414ed363c8d39c98fb3e17567b3431cede71eb062c49d2a63ce247a826040516130f691815260200190565b60405180910390a25050565b5f81815260a460205260408120546801000000000000000090046001600160a01b0316158015906113b25750505f90815260a46020526040902060030154610100900460ff161590565b61315461327c565b5f8111801561316557506098548114155b6131b15760405162461bcd60e51b815260206004820152601b60248201527f696e76616c6964206e65772066696e616c697a6520706572696f6400000000006044820152606401610b0e565b609880549082905560408051828152602081018490527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a4379101611961565b6131f761327c565b6001600160a01b0381166132735760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b0e565b61289c81613d65565b6033546001600160a01b03163314611c165760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b0e565b5f805f6132e3858561423b565b90505f8160ff165f03613304576132fa86866142ab565b9094509050613361565b8160ff16600103613319576132fa8686614314565b60405162461bcd60e51b815260206004820152601960248201527f556e737570706f727465642062617463682076657273696f6e000000000000006044820152606401610b0e565b808420925050509250929050565b60655460ff1615611c165760405162461bcd60e51b815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610b0e565b805f036133cd575050565b8082035f5b82811015613479576101008184038111156133ec57508083035b609b546040517f3c7f528300000000000000000000000000000000000000000000000000000000815260048101859052602481018390526001600160a01b0390911690633c7f5283906044015f604051808303815f87803b15801561344f575f80fd5b505af1158015613461573d5f803e3d5ffd5b505050506101008301925050610100810190506133d2565b50505050565b61348c6020830183614a7f565b60ff1615806134aa57506134a36020830183614a7f565b60ff166001145b6134f65760405162461bcd60e51b815260206004820152600f60248201527f696e76616c69642076657273696f6e00000000000000000000000000000000006044820152606401610b0e565b60808201356135475760405162461bcd60e51b815260206004820152601b60248201527f70726576696f757320737461746520726f6f74206973207a65726f00000000006044820152606401610b0e565b60a08201356135985760405162461bcd60e51b815260206004820152601660248201527f6e657720737461746520726f6f74206973207a65726f000000000000000000006044820152606401610b0e565b5f806135af6135aa6020860186614a9f565b6132d6565b915091505f6135c2836001015160c01c90565b90505f60a1816135d38460016149cf565b81526020019081526020015f20541461362e5760405162461bcd60e51b815260206004820152601760248201527f626174636820616c726561647920636f6d6d69747465640000000000000000006044820152606401610b0e565b609e54811461367f5760405162461bcd60e51b815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610b0e565b5f81815260a1602052604090205482146136db5760405162461bcd60e51b815260206004820152601b60248201527f696e636f727265637420706172656e74206261746368206861736800000000006044820152606401610b0e565b5f81815260ab602052604090205460808601351461373b5760405162461bcd60e51b815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610b0e565b5f61374a846011015160c01c90565b90505f6137766137606060890160408a01614b00565b61377060808a0160608b01614a27565b84614367565b90506137886080880160608901614a27565b6001939093019261ffff1691909101905f8049156137a7575f496137c9565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440145b905060f96137da60208a018a614a7f565b60ff166001036137e957506101015b60408051828101909152965061380e8761380660208c018c614a7f565b60ff166143ab565b60c085901b600188015261383c8761382c60808c0160608d01614a27565b61ffff1660c01b60099190910152565b60c084811b6011890152601988018490526039880183905260808a0135605989015260a08a0135607989015289013560998801526138a08761388160208b018b614a9f565b60405161388f929190614b19565b604051809103902060b99190910152565b60d9870186905260016138b660208b018b614a7f565b60ff16106138e8576138e8876138d260608c0160408d01614b00565b67ffffffffffffffff1660c01b60f99190910152565b8087205f86815260a1602090815260408083209390935560ab905290812060a08b0135905560a65460ff16156139475760a7545f90815260a46020526040902060020154609954429161393a916149cf565b61394491906149e2565b90505b6040518060800160405280428152602001826098544261396791906149cf565b61397191906149cf565b815260200161398660608d0160408e01614b00565b67ffffffffffffffff1681526097546020909101906001600160a01b031663d096c3c6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b1681526001600160a01b039091166004820152602401602060405180830381865afa158015613a04573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613a289190614a10565b90525f87815260a2602090815260409182902083518155838201516001820155918301516002830155606090920151600390910155609e8790556097546001600160a01b031692506374fe27b79150893590613a9090613a8a908c018c614a9f565b5f6143b2565b5f613a9e60408d018d614a9f565b6040518663ffffffff1660e01b8152600401613abe959493929190614b6f565b602060405180830381865afa158015613ad9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613afd91906149f5565b613b6f5760405162461bcd60e51b815260206004820152602160248201527f746865207369676e617475726520766572696669636174696f6e206661696c6560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610b0e565b5f84815260a16020526040808220549051909186917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a35050505050505050565b80613bff5760405162461bcd60e51b815260206004820152601360248201527f496e76616c69642062617463682070726f6f66000000000000000000000000006044820152606401610b0e565b5f613c0e846001015160c01c90565b90505f613c1c856039015190565b90505f7f0000000000000000000000000000000000000000000000000000000000000000613c4b876059015190565b6079880151609989015160b98a015160198b015160405160c09690961b7fffffffffffffffff000000000000000000000000000000000000000000000000166020870152602886019490945260488501929092526068840152608883015260a882015260c8810183905260e801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120609c549091506001600160a01b0316632c09a848613d0d885160f81c90565b858888866040518663ffffffff1660e01b8152600401613d31959493929190614be2565b5f6040518083038186803b158015613d47575f80fd5b505afa158015613d59573d5f803e3d5ffd5b50505050505050505050565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff16613e4a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610b0e565b611c16614406565b5f54610100900460ff16613ece5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610b0e565b611c1661448e565b60a88390555f83815260a460205260408082205460975491517f45bc4d1000000000000000000000000000000000000000000000000000000000815260048101869052680100000000000000009091046001600160a01b03908116939216906345bc4d10906024016020604051808303815f875af1158015613f5a573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f7e9190614a10565b5f86815260a46020526040902060010154909150613f9d9082906149cf565b5f86815260a460209081526040808320546801000000000000000090046001600160a01b0316835260a590915281208054909190613fdc9084906149cf565b9091555050604051613fef908490614c13565b604051908190038120906001600160a01b0384169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b5f83815260a4602052604081206001015460a9549091906064906140569084614c3f565b6140609190614c56565b905061406c81836149e2565b60aa5f82825461407c91906149cf565b90915550506001600160a01b0384165f90815260a56020526040812080548392906140a89084906149cf565b90915550506040516140bb908490614c13565b604051908190038120906001600160a01b0386169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b80156115f0575f826001600160a01b0316826040515f6040518083038185875af1925050503d805f811461414d576040519150601f19603f3d011682016040523d82523d5f602084013e614152565b606091505b50509050806141a35760405162461bcd60e51b815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c656400000000006044820152606401610b0e565b505050565b6141b061336f565b6065805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586141e53390565b6040516001600160a01b03909116815260200160405180910390a1565b61420a614513565b6065805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336141e5565b5f816142895760405162461bcd60e51b815260206004820152601260248201527f456d7074792062617463682068656164657200000000000000000000000000006044820152606401610b0e565b82825f81811061429b5761429b614c8e565b919091013560f81c949350505050565b5f8160f98110156142fe5760405162461bcd60e51b815260206004820152601d60248201527f626174636820686561646572206c656e67746820746f6f20736d616c6c0000006044820152606401610b0e565b6040519150808483378082016040529250929050565b5f8161010181146142fe5760405162461bcd60e51b815260206004820181905260248201527f626174636820686561646572206c656e67746820697320696e636f72726563746044820152606401610b0e565b6040805160c085901b815260f084901b6008820152600a60208502820181019092525f91810161439c8161ffff871686614565565b82900390912095945050505050565b8082535050565b60605f808080806143c5888a018a614da8565b95509550955095509550508187106143e35794506143ff9350505050565b8387106143f75782955050505050506143ff565b509293505050505b9392505050565b5f54610100900460ff166144825760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610b0e565b6065805460ff19169055565b5f54610100900460ff1661450a5760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610b0e565b611c1633613d65565b60655460ff16611c165760405162461bcd60e51b815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610b0e565b5f825f036145745750826143ff565b609b546001600160a01b03165f5b84811015614621576040517fae453cd5000000000000000000000000000000000000000000000000000000008152600481018590525f906001600160a01b0384169063ae453cd590602401602060405180830381865afa1580156145e8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061460c9190614a10565b87525060209095019460019384019301614582565b5093949350505050565b5f6020828403121561463b575f80fd5b5035919050565b80356001600160a01b0381168114614658575f80fd5b919050565b5f6020828403121561466d575f80fd5b6143ff82614642565b5f8083601f840112614686575f80fd5b50813567ffffffffffffffff81111561469d575f80fd5b6020830191508360208285010111156146b4575f80fd5b9250929050565b5f805f604084860312156146cd575f80fd5b833567ffffffffffffffff8111156146e3575f80fd5b6146ef86828701614676565b909790965060209590950135949350505050565b5f8060208385031215614714575f80fd5b823567ffffffffffffffff81111561472a575f80fd5b61473685828601614676565b90969095509350505050565b5f60e08284031215614752575f80fd5b50919050565b5f60608284031215614752575f80fd5b5f8060408385031215614779575f80fd5b823567ffffffffffffffff80821115614790575f80fd5b61479c86838701614742565b935060208501359150808211156147b1575f80fd5b506147be85828601614758565b9150509250929050565b5f805f805f80608087890312156147dd575f80fd5b863567ffffffffffffffff808211156147f4575f80fd5b6148008a838b01614742565b97506020890135915080821115614815575f80fd5b6148218a838b01614758565b96506040890135915080821115614836575f80fd5b6148428a838b01614676565b9096509450606089013591508082111561485a575f80fd5b5061486789828a01614676565b979a9699509497509295939492505050565b5f805f805f8060c0878903121561488e575f80fd5b61489787614642565b95506148a560208801614642565b94506148b360408801614642565b9350606087013592506080870135915060a087013590509295509295509295565b5f805f80604085870312156148e7575f80fd5b843567ffffffffffffffff808211156148fe575f80fd5b61490a88838901614676565b90965094506020870135915080821115614922575f80fd5b5061492f87828801614676565b95989497509550505050565b801515811461289c575f80fd5b5f60208284031215614958575f80fd5b81356143ff8161493b565b803567ffffffffffffffff81168114614658575f80fd5b5f806040838503121561498b575f80fd5b61499483614963565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808201808211156113b2576113b26149a2565b818103818111156113b2576113b26149a2565b5f60208284031215614a05575f80fd5b81516143ff8161493b565b5f60208284031215614a20575f80fd5b5051919050565b5f60208284031215614a37575f80fd5b813561ffff811681146143ff575f80fd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203614a7857614a786149a2565b5060010190565b5f60208284031215614a8f575f80fd5b813560ff811681146143ff575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614ad2575f80fd5b83018035915067ffffffffffffffff821115614aec575f80fd5b6020019150368190038213156146b4575f80fd5b5f60208284031215614b10575f80fd5b6143ff82614963565b818382375f9101908152919050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f6080820187835260206080602085015281885180845260a08601915060208a0193505f5b81811015614bb95784516001600160a01b031683529383019391830191600101614b94565b50508760408601528481036060860152614bd4818789614b28565b9a9950505050505050505050565b858152846020820152608060408201525f614c01608083018587614b28565b90508260608301529695505050505050565b5f82515f5b81811015614c325760208186018101518583015201614c18565b505f920191825250919050565b80820281158282048414176113b2576113b26149a2565b5f82614c89577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112614cf7575f80fd5b8135602067ffffffffffffffff80831115614d1457614d14614cbb565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108482111715614d5757614d57614cbb565b6040529384526020818701810194908101925087851115614d76575f80fd5b6020870191505b84821015614d9d57614d8e82614642565b83529183019190830190614d7d565b979650505050505050565b5f805f805f8060c08789031215614dbd575f80fd5b86359550602087013567ffffffffffffffff80821115614ddb575f80fd5b614de78a838b01614ce8565b9650604089013595506060890135915080821115614e03575f80fd5b614e0f8a838b01614ce8565b94506080890135935060a0890135915080821115614e2b575f80fd5b50614e3889828a01614ce8565b915050929550929550929556fea164736f6c6343000818000a", } // RollupABI is the input ABI used to generate the binding from. @@ -1114,6 +1115,37 @@ func (_Rollup *RollupCallerSession) RevertReqIndex() (*big.Int, error) { return _Rollup.Contract.RevertReqIndex(&_Rollup.CallOpts) } +// RollupDelayPeriod is a free data retrieval call binding the contract method 0xd8dc99d2. +// +// Solidity: function rollupDelayPeriod() view returns(uint256) +func (_Rollup *RollupCaller) RollupDelayPeriod(opts *bind.CallOpts) (*big.Int, error) { + var out []interface{} + err := _Rollup.contract.Call(opts, &out, "rollupDelayPeriod") + + if err != nil { + return *new(*big.Int), err + } + + out0 := *abi.ConvertType(out[0], new(*big.Int)).(**big.Int) + + return out0, err + +} + +// RollupDelayPeriod is a free data retrieval call binding the contract method 0xd8dc99d2. +// +// Solidity: function rollupDelayPeriod() view returns(uint256) +func (_Rollup *RollupSession) RollupDelayPeriod() (*big.Int, error) { + return _Rollup.Contract.RollupDelayPeriod(&_Rollup.CallOpts) +} + +// RollupDelayPeriod is a free data retrieval call binding the contract method 0xd8dc99d2. +// +// Solidity: function rollupDelayPeriod() view returns(uint256) +func (_Rollup *RollupCallerSession) RollupDelayPeriod() (*big.Int, error) { + return _Rollup.Contract.RollupDelayPeriod(&_Rollup.CallOpts) +} + // Verifier is a free data retrieval call binding the contract method 0x2b7ac3f3. // // Solidity: function verifier() view returns(address) @@ -1260,27 +1292,48 @@ 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 0x4a8d544f. +// CommitBatch is a paid mutator transaction binding the contract method 0x428868b5. // -// Solidity: function commitBatch((uint8,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 0x4a8d544f. +// CommitBatch is a paid mutator transaction binding the contract method 0x428868b5. // -// Solidity: function commitBatch((uint8,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 0x4a8d544f. +// CommitBatch is a paid mutator transaction binding the contract method 0x428868b5. // -// Solidity: function commitBatch((uint8,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) } +// CommitBatchWithProof is a paid mutator transaction binding the contract method 0x4e8f1d67. +// +// Solidity: function commitBatchWithProof((uint8,bytes,uint64,uint16,bytes32,bytes32,bytes32) batchDataInput, (uint256,bytes,bytes) batchSignatureInput, bytes _batchHeader, bytes _batchProof) returns() +func (_Rollup *RollupTransactor) CommitBatchWithProof(opts *bind.TransactOpts, batchDataInput IRollupBatchDataInput, batchSignatureInput IRollupBatchSignatureInput, _batchHeader []byte, _batchProof []byte) (*types.Transaction, error) { + return _Rollup.contract.Transact(opts, "commitBatchWithProof", batchDataInput, batchSignatureInput, _batchHeader, _batchProof) +} + +// CommitBatchWithProof is a paid mutator transaction binding the contract method 0x4e8f1d67. +// +// Solidity: function commitBatchWithProof((uint8,bytes,uint64,uint16,bytes32,bytes32,bytes32) batchDataInput, (uint256,bytes,bytes) batchSignatureInput, bytes _batchHeader, bytes _batchProof) returns() +func (_Rollup *RollupSession) CommitBatchWithProof(batchDataInput IRollupBatchDataInput, batchSignatureInput IRollupBatchSignatureInput, _batchHeader []byte, _batchProof []byte) (*types.Transaction, error) { + return _Rollup.Contract.CommitBatchWithProof(&_Rollup.TransactOpts, batchDataInput, batchSignatureInput, _batchHeader, _batchProof) +} + +// CommitBatchWithProof is a paid mutator transaction binding the contract method 0x4e8f1d67. +// +// Solidity: function commitBatchWithProof((uint8,bytes,uint64,uint16,bytes32,bytes32,bytes32) batchDataInput, (uint256,bytes,bytes) batchSignatureInput, bytes _batchHeader, bytes _batchProof) returns() +func (_Rollup *RollupTransactorSession) CommitBatchWithProof(batchDataInput IRollupBatchDataInput, batchSignatureInput IRollupBatchSignatureInput, _batchHeader []byte, _batchProof []byte) (*types.Transaction, error) { + return _Rollup.Contract.CommitBatchWithProof(&_Rollup.TransactOpts, batchDataInput, batchSignatureInput, _batchHeader, _batchProof) +} + // FinalizeBatch is a paid mutator transaction binding the contract method 0x13361101. // // Solidity: function finalizeBatch(bytes _batchHeader) returns() @@ -1365,6 +1418,27 @@ func (_Rollup *RollupTransactorSession) Initialize2(_prevStateRoot [32]byte) (*t return _Rollup.Contract.Initialize2(&_Rollup.TransactOpts, _prevStateRoot) } +// Initialize3 is a paid mutator transaction binding the contract method 0xcf9a6745. +// +// Solidity: function initialize3(uint256 _rollupDelayPeriod) returns() +func (_Rollup *RollupTransactor) Initialize3(opts *bind.TransactOpts, _rollupDelayPeriod *big.Int) (*types.Transaction, error) { + return _Rollup.contract.Transact(opts, "initialize3", _rollupDelayPeriod) +} + +// Initialize3 is a paid mutator transaction binding the contract method 0xcf9a6745. +// +// Solidity: function initialize3(uint256 _rollupDelayPeriod) returns() +func (_Rollup *RollupSession) Initialize3(_rollupDelayPeriod *big.Int) (*types.Transaction, error) { + return _Rollup.Contract.Initialize3(&_Rollup.TransactOpts, _rollupDelayPeriod) +} + +// Initialize3 is a paid mutator transaction binding the contract method 0xcf9a6745. +// +// Solidity: function initialize3(uint256 _rollupDelayPeriod) returns() +func (_Rollup *RollupTransactorSession) Initialize3(_rollupDelayPeriod *big.Int) (*types.Transaction, error) { + return _Rollup.Contract.Initialize3(&_Rollup.TransactOpts, _rollupDelayPeriod) +} + // ProveState is a paid mutator transaction binding the contract method 0xb3484425. // // Solidity: function proveState(bytes _batchHeader, bytes _batchProof) returns() @@ -1554,6 +1628,27 @@ func (_Rollup *RollupTransactorSession) UpdateRewardPercentage(_newProofRewardPe return _Rollup.Contract.UpdateRewardPercentage(&_Rollup.TransactOpts, _newProofRewardPercent) } +// UpdateRollupDelayPeriod is a paid mutator transaction binding the contract method 0xc5553892. +// +// Solidity: function updateRollupDelayPeriod(uint256 _newPeriod) returns() +func (_Rollup *RollupTransactor) UpdateRollupDelayPeriod(opts *bind.TransactOpts, _newPeriod *big.Int) (*types.Transaction, error) { + return _Rollup.contract.Transact(opts, "updateRollupDelayPeriod", _newPeriod) +} + +// UpdateRollupDelayPeriod is a paid mutator transaction binding the contract method 0xc5553892. +// +// Solidity: function updateRollupDelayPeriod(uint256 _newPeriod) returns() +func (_Rollup *RollupSession) UpdateRollupDelayPeriod(_newPeriod *big.Int) (*types.Transaction, error) { + return _Rollup.Contract.UpdateRollupDelayPeriod(&_Rollup.TransactOpts, _newPeriod) +} + +// UpdateRollupDelayPeriod is a paid mutator transaction binding the contract method 0xc5553892. +// +// Solidity: function updateRollupDelayPeriod(uint256 _newPeriod) returns() +func (_Rollup *RollupTransactorSession) UpdateRollupDelayPeriod(_newPeriod *big.Int) (*types.Transaction, error) { + return _Rollup.Contract.UpdateRollupDelayPeriod(&_Rollup.TransactOpts, _newPeriod) +} + // UpdateVerifier is a paid mutator transaction binding the contract method 0x97fc007c. // // Solidity: function updateVerifier(address _newVerifier) returns() @@ -3758,6 +3853,141 @@ func (_Rollup *RollupFilterer) ParseUpdateProofWindow(log types.Log) (*RollupUpd return event, nil } +// RollupUpdateRollupDelayPeriodIterator is returned from FilterUpdateRollupDelayPeriod and is used to iterate over the raw logs and unpacked data for UpdateRollupDelayPeriod events raised by the Rollup contract. +type RollupUpdateRollupDelayPeriodIterator struct { + Event *RollupUpdateRollupDelayPeriod // 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 *RollupUpdateRollupDelayPeriodIterator) 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(RollupUpdateRollupDelayPeriod) + 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(RollupUpdateRollupDelayPeriod) + 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 *RollupUpdateRollupDelayPeriodIterator) Error() error { + return it.fail +} + +// Close terminates the iteration process, releasing any pending underlying +// resources. +func (it *RollupUpdateRollupDelayPeriodIterator) Close() error { + it.sub.Unsubscribe() + return nil +} + +// RollupUpdateRollupDelayPeriod represents a UpdateRollupDelayPeriod event raised by the Rollup contract. +type RollupUpdateRollupDelayPeriod struct { + OldPeriod *big.Int + NewPeriod *big.Int + Raw types.Log // Blockchain specific contextual infos +} + +// FilterUpdateRollupDelayPeriod is a free log retrieval operation binding the contract event 0x624e47dc9fb8f8cfeaf4ead4710277cc1757136cfa885e465514cf6d510f0ad1. +// +// Solidity: event UpdateRollupDelayPeriod(uint256 oldPeriod, uint256 newPeriod) +func (_Rollup *RollupFilterer) FilterUpdateRollupDelayPeriod(opts *bind.FilterOpts) (*RollupUpdateRollupDelayPeriodIterator, error) { + + logs, sub, err := _Rollup.contract.FilterLogs(opts, "UpdateRollupDelayPeriod") + if err != nil { + return nil, err + } + return &RollupUpdateRollupDelayPeriodIterator{contract: _Rollup.contract, event: "UpdateRollupDelayPeriod", logs: logs, sub: sub}, nil +} + +// WatchUpdateRollupDelayPeriod is a free log subscription operation binding the contract event 0x624e47dc9fb8f8cfeaf4ead4710277cc1757136cfa885e465514cf6d510f0ad1. +// +// Solidity: event UpdateRollupDelayPeriod(uint256 oldPeriod, uint256 newPeriod) +func (_Rollup *RollupFilterer) WatchUpdateRollupDelayPeriod(opts *bind.WatchOpts, sink chan<- *RollupUpdateRollupDelayPeriod) (event.Subscription, error) { + + logs, sub, err := _Rollup.contract.WatchLogs(opts, "UpdateRollupDelayPeriod") + 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(RollupUpdateRollupDelayPeriod) + if err := _Rollup.contract.UnpackLog(event, "UpdateRollupDelayPeriod", 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 +} + +// ParseUpdateRollupDelayPeriod is a log parse operation binding the contract event 0x624e47dc9fb8f8cfeaf4ead4710277cc1757136cfa885e465514cf6d510f0ad1. +// +// Solidity: event UpdateRollupDelayPeriod(uint256 oldPeriod, uint256 newPeriod) +func (_Rollup *RollupFilterer) ParseUpdateRollupDelayPeriod(log types.Log) (*RollupUpdateRollupDelayPeriod, error) { + event := new(RollupUpdateRollupDelayPeriod) + if err := _Rollup.contract.UnpackLog(event, "UpdateRollupDelayPeriod", log); err != nil { + return nil, err + } + event.Raw = log + return event, nil +} + // RollupUpdateVerifierIterator is returned from FilterUpdateVerifier and is used to iterate over the raw logs and unpacked data for UpdateVerifier events raised by the Rollup contract. type RollupUpdateVerifierIterator struct { Event *RollupUpdateVerifier // Event containing the contract specifics and raw log diff --git a/bindings/bindings/rollup_more.go b/bindings/bindings/rollup_more.go index 3581703c1..fc6e626f1 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)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\"}}}" +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)1030_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)1029_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)1029_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)1032_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)1031_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)\"},{\"astId\":1028,\"contract\":\"contracts/l1/rollup/Rollup.sol:Rollup\",\"label\":\"rollupDelayPeriod\",\"offset\":0,\"slot\":\"172\",\"type\":\"t_uint256\"}],\"types\":{\"t_address\":{\"encoding\":\"inplace\",\"label\":\"address\",\"numberOfBytes\":\"20\"},\"t_array(t_uint256)1029_storage\":{\"encoding\":\"inplace\",\"label\":\"uint256[49]\",\"numberOfBytes\":\"1568\"},\"t_array(t_uint256)1030_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)1031_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e struct IRollup.BatchChallenge)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_struct(BatchChallenge)1031_storage\"},\"t_mapping(t_uint256,t_struct(BatchData)1032_storage)\":{\"encoding\":\"mapping\",\"label\":\"mapping(uint256 =\u003e struct IRollup.BatchData)\",\"numberOfBytes\":\"32\",\"key\":\"t_uint256\",\"value\":\"t_struct(BatchData)1032_storage\"},\"t_struct(BatchChallenge)1031_storage\":{\"encoding\":\"inplace\",\"label\":\"struct IRollup.BatchChallenge\",\"numberOfBytes\":\"128\"},\"t_struct(BatchData)1032_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 = "0x608060405260043610610306575f3560e01c8063728cdbca11610191578063b35dac4e116100dc578063ddd8a3dc11610087578063e3fff1dd11610062578063e3fff1dd14610a0c578063f2fde38b14610a2b578063fb1e8b0414610a4a575f80fd5b8063ddd8a3dc146109ac578063de8b3035146109d8578063dff7827e146109f7575f80fd5b8063cd4edc69116100b7578063cd4edc6914610965578063ce5db8d614610978578063d279c1911461098d575f80fd5b8063b35dac4e14610908578063b3e0a50914610927578063bedb86fb14610946575f80fd5b8063a415d8dc1161013c578063abc8d68d11610117578063abc8d68d146108a9578063b31a77d3146108d4578063b3484425146108e9575f80fd5b8063a415d8dc14610847578063a479265d14610875578063a4f209b01461088a575f80fd5b80638f1d37761161016c5780638f1d37761461072d578063910129d4146107f757806397fc007c14610828575f80fd5b8063728cdbca146106cb57806388b1ea09146106ea5780638da5cb5b14610703575f80fd5b80632b7ac3f3116102515780635ef7a94a116101fc57806368589dfa116101d757806368589dfa1461066d5780636c578c1d14610698578063715018a6146106b7575f80fd5b80635ef7a94a146105a25780635f77cf1d14610602578063612672901461064e575f80fd5b80634a8d544f1161022c5780634a8d544f1461055957806357e0af6c1461056c5780635c975abb1461058b575f80fd5b80632b7ac3f3146104c75780633b70c18a146105185780633e001b6614610544575f80fd5b806313361101116102b157806321e2f9e01161028c57806321e2f9e0146104525780632362f03e146104715780632571098d1461049c575f80fd5b806313361101146103ee57806318463fb01461040d57806318af3b2b14610422575f80fd5b806310d44583116102e157806310d4458314610398578063116a1f42146103b7578063121dcd50146103d9575f80fd5b806304d7721514610311578063059def61146103545780630ceb678014610377575f80fd5b3661030d57005b5f80fd5b34801561031c575f80fd5b5061033f61032b366004614b80565b60a36020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561035f575f80fd5b50610369609d5481565b60405190815260200161034b565b348015610382575f80fd5b50610396610391366004614bbf565b610a5f565b005b3480156103a3575f80fd5b506103966103b2366004614c1d565b610b83565b3480156103c2575f80fd5b5061033f6103d1366004614b80565b609d54101590565b3480156103e4575f80fd5b50610369609e5481565b3480156103f9575f80fd5b50610396610408366004614c65565b610f6f565b348015610418575f80fd5b5061036960a75481565b34801561042d575f80fd5b5061033f61043c366004614b80565b5f90815260a26020526040902060010154421090565b34801561045d575f80fd5b5061033f61046c366004614b80565b61156e565b34801561047c575f80fd5b5061036961048b366004614b80565b60a16020525f908152604090205481565b3480156104a7575f80fd5b506103696104b6366004614b80565b60a06020525f908152604090205481565b3480156104d2575f80fd5b50609c546104f39073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200161034b565b348015610523575f80fd5b50609b546104f39073ffffffffffffffffffffffffffffffffffffffff1681565b34801561054f575f80fd5b5061036960aa5481565b610396610567366004614ca4565b61159c565b348015610577575f80fd5b50610396610586366004614b80565b611f7e565b348015610596575f80fd5b5060655460ff1661033f565b3480156105ad575f80fd5b506105e26105bc366004614b80565b60a26020525f908152604090208054600182015460028301546003909301549192909184565b60408051948552602085019390935291830152606082015260800161034b565b34801561060d575f80fd5b506106357f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff909116815260200161034b565b348015610659575f80fd5b50610396610668366004614b80565b612043565b348015610678575f80fd5b50610369610687366004614b80565b60ab6020525f908152604090205481565b3480156106a3575f80fd5b506103966106b2366004614bbf565b6122a6565b3480156106c2575f80fd5b506103966123b5565b3480156106d6575f80fd5b506103966106e5366004614d11565b6123c8565b3480156106f5575f80fd5b5060a65461033f9060ff1681565b34801561070e575f80fd5b5060335473ffffffffffffffffffffffffffffffffffffffff166104f3565b348015610738575f80fd5b506107a6610747366004614b80565b60a46020525f9081526040902080546001820154600283015460039093015467ffffffffffffffff8316936801000000000000000090930473ffffffffffffffffffffffffffffffffffffffff16929060ff8082169161010090041686565b6040805167ffffffffffffffff909716875273ffffffffffffffffffffffffffffffffffffffff909516602087015293850192909252606084015215156080830152151560a082015260c00161034b565b348015610802575f80fd5b5061033f610811366004614b80565b5f90815260a4602052604090206003015460ff1690565b348015610833575f80fd5b50610396610842366004614bbf565b612791565b348015610852575f80fd5b5061033f610861366004614bbf565b609f6020525f908152604090205460ff1681565b348015610880575f80fd5b5061036960995481565b348015610895575f80fd5b506103966108a4366004614b80565b6128b5565b3480156108b4575f80fd5b506103696108c3366004614bbf565b60a56020525f908152604090205481565b3480156108df575f80fd5b5061036960a85481565b3480156108f4575f80fd5b50610396610903366004614d6c565b61297f565b348015610913575f80fd5b50610396610922366004614bbf565b612c4e565b348015610932575f80fd5b50610396610941366004614c65565b612cb4565b348015610951575f80fd5b50610396610960366004614de0565b6130a0565b610396610973366004614dfb565b613233565b348015610983575f80fd5b5061036960985481565b348015610998575f80fd5b506103966109a7366004614bbf565b613948565b3480156109b7575f80fd5b506097546104f39073ffffffffffffffffffffffffffffffffffffffff1681565b3480156109e3575f80fd5b5061033f6109f2366004614b80565b613a2e565b348015610a02575f80fd5b50610369609a5481565b348015610a17575f80fd5b50610396610a26366004614b80565b613a85565b348015610a36575f80fd5b50610396610a45366004614bbf565b613b42565b348015610a55575f80fd5b5061036960a95481565b610a67613bf6565b73ffffffffffffffffffffffffffffffffffffffff81165f908152609f602052604090205460ff1615610afb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f6163636f756e7420697320616c72656164792061206368616c6c656e6765720060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f818152609f602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915591519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc00991015b60405180910390a250565b610b8b613bf6565b5f8111610bf4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f636f756e74206d757374206265206e6f6e7a65726f00000000000000000000006044820152606401610af2565b5f80610c008585613c77565b915091505f610c13836001015160c01c90565b5f81815260a160205260409020549091508214610c8c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610af2565b5f60a181610c9a8785614e5e565b81526020019081526020015f205414610d34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f726576657274696e67206d7573742073746172742066726f6d2074686520656e60448201527f64696e67000000000000000000000000000000000000000000000000000000006064820152608401610af2565b609d548111610dc5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f63616e206f6e6c792072657665727420756e46696e616c697a6564206261746360448201527f68000000000000000000000000000000000000000000000000000000000000006064820152608401610af2565b610dd0600182614e71565b609e555b8315610f6757604051829082907ecae2739091badfd91c373f0a16cede691e0cd25bb80cff77dd5caeb4710146905f90a35f81815260a16020526040812055610e1c81613a2e565b15610ea2575f81815260a4602090815260408083206001810154905468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16845260a59092528220805491929091610e74908490614e5e565b909155505060a680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b5f81815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a85415801590610f1f575060a85481145b15610f29575f60a8555b6001015f81815260a160205260409020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90940193915081610dd4575b505050505050565b60a85415610fd9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610af2565b610fe1613c92565b5f80610fed8484613c77565b915091505f611000836001015160c01c90565b5f81815260a160205260409020549091508214611079576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610af2565b6110828161156e565b6110e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610af2565b6110f181613a2e565b15611158576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610af2565b5f81815260a4602052604090206003015460ff16156111d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f62617463682073686f756c6420626520726576657274000000000000000000006044820152606401610af2565b5f81815260a2602052604090206001015442101561124d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f626174636820696e206368616c6c656e67652077696e646f77000000000000006044820152606401610af2565b605983015160a05f611260600185614e71565b81526020019081526020015f2054146112d5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610af2565b5f81815260a060205260409020541561134a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f626174636820616c7265616479207665726966696564000000000000000000006044820152606401610af2565b80609d54600101146113b8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610af2565b609d819055600160a35f6113cd866099015190565b815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905560798301515f82815260a0602052604090205561143a61142d846011015160c01c90565b600985015160c01c613cff565b60a25f611448600184614e71565b815260208101919091526040015f908120818155600180820183905560028201839055600390910182905560ab91906114819084614e71565b81526020019081526020015f205f905560a45f6001836114a19190614e71565b815260208082019290925260409081015f90812080547fffffffff00000000000000000000000000000000000000000000000000000000168155600181018290556002810182905560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905583815260a1909252902054817f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d61154a866079015190565b60998701516040805192835260208301919091520160405180910390a35050505050565b5f81815260a260205260408120541580159061159657505f82815260a1602052604090205415155b92915050565b60975473ffffffffffffffffffffffffffffffffffffffff166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015611622573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116469190614e84565b6116ac576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f7765640000000000006044820152606401610af2565b60a85415611716576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610af2565b61171e613c92565b61172b6020830183614e9f565b60ff1615611795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e76616c69642076657273696f6e00000000000000000000000000000000006044820152606401610af2565b5f6117a36040840184614ebf565b9150508061180d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f626174636820697320656d7074790000000000000000000000000000000000006044820152606401610af2565b6060830135611878576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f70726576696f757320737461746520726f6f74206973207a65726f00000000006044820152606401610af2565b60808301356118e3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6e657720737461746520726f6f74206973207a65726f000000000000000000006044820152606401610af2565b5f806118fa6118f56020870187614ebf565b613c77565b915091505f61190d836001015160c01c90565b90505f60a18161191e846001614e5e565b81526020019081526020015f205414611993576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f626174636820616c726561647920636f6d6d69747465640000000000000000006044820152606401610af2565b609e5481146119fe576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610af2565b5f81815260a160205260409020548214611a74576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e636f727265637420706172656e74206261746368206861736800000000006044820152606401610af2565b5f81815260ab6020526040902054606087013514611aee576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610af2565b5f611afd846011015160c01c90565b90505f8080611b4f611b1260408c018c614ebf565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250879250889150613dc99050565b600196909601959485019493840193925090505f804915611b71575f49611b93565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440145b60408051611f2081019091529850905060f9611bbe89611bb660208f018f614e9f565b60ff16613f60565b60c087811b60018b015285811b60098b015286901b60118a01526019890183905260608c013560598a015260808c013560798a015260a08c013560998a0152611c2d89611c0e60208e018e614ebf565b604051611c1c929190614f20565b604051809103902060b99190910152565b60d98901889052603989018290528089205f88815260a1602090815260408083209390935560ab905290812060808e0135905560a65460ff1615611c9a5760a7545f90815260a460205260409020600201546099544291611c8d91614e5e565b611c979190614e71565b90505b60405180608001604052804281526020018260985442611cba9190614e5e565b611cc49190614e5e565b8152602001611d158f8060400190611cdc9190614ebf565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250613f6792505050565b815260975460209091019073ffffffffffffffffffffffffffffffffffffffff1663d096c3c6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015611da3573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611dc79190614f2f565b90525f89815260a2602090815260409182902083518155838201516001820155918301516002830155606090920151600390910155609e89905560975473ffffffffffffffffffffffffffffffffffffffff1692506374fe27b791508c3590611e3c90611e36908f018f614ebf565b5f613fbe565b5f8e8060400190611e4d9190614ebf565b6040518663ffffffff1660e01b8152600401611e6d959493929190614f8d565b602060405180830381865afa158015611e88573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611eac9190614e84565b611f38576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f746865207369676e617475726520766572696669636174696f6e206661696c6560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610af2565b5f86815260a16020526040808220549051909188917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a35050505050505050505050565b611f86613bf6565b5f81118015611f9757506099548114155b611ffd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f696e76616c6964206e65772070726f6f662077696e646f7700000000000000006044820152606401610af2565b609980549082905560408051828152602081018490527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a6191015b60405180910390a15050565b5f54600290610100900460ff1615801561206357505f5460ff8083169116105b6120ef576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610af2565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff83161761010017905561212a5f5460ff1690565b60ff16600214612196576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6d757374206861766520696e697469616c697a656421000000000000000000006044820152606401610af2565b81612223576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f63616e206e6f742073657420737461746520726f6f742077697468206279746560448201527f73333228302921000000000000000000000000000000000000000000000000006064820152608401610af2565b609e545f90815260ab602052604090205461224c57609e545f90815260ab602052604090208290555b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001612037565b6122ae613bf6565b73ffffffffffffffffffffffffffffffffffffffff81165f908152609f602052604090205460ff1661233c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6163636f756e74206973206e6f742061206368616c6c656e67657200000000006044820152606401610af2565b73ffffffffffffffffffffffffffffffffffffffff81165f818152609f6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc0099101610b78565b6123bd613bf6565b6123c65f614012565b565b5f54610100900460ff16158080156123e657505f54600160ff909116105b806123ff5750303b1580156123ff57505f5460ff166001145b61248b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610af2565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156124e7575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff8616158061251e575073ffffffffffffffffffffffffffffffffffffffff8516155b15612555576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87166125d2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e76616c6964206c31207374616b696e6720636f6e747261637400000000006044820152606401610af2565b6125da614088565b6125e2614126565b6097805473ffffffffffffffffffffffffffffffffffffffff808a167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255609b8054898416908316179055609c805492881692909116821790556098859055609984905560a98390556040515f907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96908290a3604080515f8152602081018690527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a437910160405180910390a1604080515f8152602081018590527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a61910160405180910390a1604080515f8152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b0223910160405180910390a18015612788575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b612799613bf6565b73ffffffffffffffffffffffffffffffffffffffff8116158015906127d95750609c5473ffffffffffffffffffffffffffffffffffffffff828116911614155b61283f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e76616c6964206e65772076657269666965720000000000000000000000006044820152606401610af2565b609c805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96905f90a35050565b6128bd613bf6565b5f811180156128cd575060648111155b80156128db575060a9548114155b612941576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f696e76616c69642070726f6f66207265776172642070657263656e74616765006044820152606401610af2565b60a980549082905560408051828152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b02239101612037565b60a854156129e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610af2565b6129f1613c92565b5f806129fd8686613c77565b915091505f612a10836001015160c01c90565b5f81815260a160205260409020549091508214612a89576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610af2565b612a9281613a2e565b612af8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610af2565b5f81815260a4602052604090206003810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560a680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690556099546002909101544291612b6f91614e5e565b11612c03575f81815260a460209081526040808320600390810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560a2835292819020909201548251808401909352600783527f54696d656f75740000000000000000000000000000000000000000000000000091830191909152612bfe918391906141c4565b612788565b612c0e838686614347565b61278881336040518060400160405280600d81526020017f50726f6f66207375636365737300000000000000000000000000000000000000815250614521565b612c56613bf6565b60aa80545f909155612c688282614607565b6040805173ffffffffffffffffffffffffffffffffffffffff84168152602081018390527fb1b2058a6969e2d25e47bcaebe8ae21c29a23b2752429315b75e2f4f285f3d879101612037565b612cbc613bf6565b5f805260a06020527fb84a74ec6ef4d0e83b6006dfaa014ab4026f9f3b97d186e604d29998a4e808ea5415612d4d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f67656e6573697320626174636820696d706f72746564000000000000000000006044820152606401610af2565b5f80612d598484613c77565b915091505f612d6c836001015160c01c90565b90508015612dd6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c696420626174636820696e646578000000000000000000000000006044820152606401610af2565b5f612de2846079015190565b905080612e4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f7a65726f20737461746520726f6f7400000000000000000000000000000000006044820152606401610af2565b600984015160c01c15612eba576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6c31206d65737361676520706f707065642073686f756c6420626520300000006044820152606401610af2565b5f612ec6856019015190565b03612f2d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7a65726f206461746120686173680000000000000000000000000000000000006044820152606401610af2565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014612f59856039015190565b14612fc0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f696e76616c69642076657273696f6e65642068617368000000000000000000006044820152606401610af2565b5f82815260a1602090815260408083208690558051608081018252428082528184019081528183018581526060830186815288875260a2865284872093518455915160018401555160028301555160039091015560ab825280832084905560a0909152808220839055609e849055609d84905551849184917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a3604080518281525f6020820152849184917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d910160405180910390a3505050505050565b6130a8613bf6565b8015613201576130b66146d9565b60a65460ff16156131b35760a7545f90815260a4602090815260408083206001810154905468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16845260a59092528220805491929091613117908490614e5e565b909155505060a7545f90815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b7f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a150565b61320961475e565b7f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa336131d6565b50565b335f908152609f602052604090205460ff166132ab576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f63616c6c6572206368616c6c656e67657220616c6c6f776564000000000000006044820152606401610af2565b60a85415613315576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610af2565b61331d613c92565b60a65460ff161561338a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f616c726561647920696e206368616c6c656e67650000000000000000000000006044820152606401610af2565b8167ffffffffffffffff16609d54106133ff576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f626174636820616c72656164792066696e616c697a65640000000000000000006044820152606401610af2565b67ffffffffffffffff82165f90815260a160205260409020548114613480576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610af2565b6134938267ffffffffffffffff1661156e565b6134f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610af2565b67ffffffffffffffff82165f90815260a4602052604090205468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff161561359b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f626174636820616c7265616479206368616c6c656e67656400000000000000006044820152606401610af2565b67ffffffffffffffff82165f90815260a260205260409020600101544210613645576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f63616e6e6f74206368616c6c656e6765206261746368206f757473696465207460448201527f6865206368616c6c656e67652077696e646f77000000000000000000000000006064820152608401610af2565b60975f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d13fd7b6040518163ffffffff1660e01b8152600401602060405180830381865afa1580156136af573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906136d39190614f2f565b34101561373c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e73756666696369656e742076616c756500000000000000000000000000006044820152606401610af2565b67ffffffffffffffff82811660a78190556040805160c0810182528281523360208083018281523484860190815242606086019081525f6080870181815260a0880182815299825260a49095529690962094518554925173ffffffffffffffffffffffffffffffffffffffff1668010000000000000000027fffffffff00000000000000000000000000000000000000000000000000000000909316981697909717178355945160018301559151600282015592516003909301805492511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff941515949094167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009093169290921792909217905573ffffffffffffffffffffffffffffffffffffffff168267ffffffffffffffff167f3a6ea19df25b49e7624e313ce7c1ab23984238e93727260db56a81735b1b9976346040516138a891815260200190565b60405180910390a35f609d5460016138c09190614e5e565b90505b609e548111613918578267ffffffffffffffff168114613906576099545f82815260a2602052604081206001018054909190613900908490614e5e565b90915550505b806139108161500d565b9150506138c3565b505060a680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905550565b335f90815260a56020526040812054908190036139c1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f696e76616c69642062617463684368616c6c656e6765526577617264000000006044820152606401610af2565b335f90815260a560205260408120556139da8282614607565b8173ffffffffffffffffffffffffffffffffffffffff167f9c25fa83f414ed363c8d39c98fb3e17567b3431cede71eb062c49d2a63ce247a82604051613a2291815260200190565b60405180910390a25050565b5f81815260a4602052604081205468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16158015906115965750505f90815260a46020526040902060030154610100900460ff161590565b613a8d613bf6565b5f81118015613a9e57506098548114155b613b04576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e76616c6964206e65772066696e616c697a6520706572696f6400000000006044820152606401610af2565b609880549082905560408051828152602081018490527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a4379101612037565b613b4a613bf6565b73ffffffffffffffffffffffffffffffffffffffff8116613bed576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610af2565b61323081614012565b60335473ffffffffffffffffffffffffffffffffffffffff1633146123c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610af2565b5f805f613c8485856147b5565b812090969095509350505050565b60655460ff16156123c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610af2565b805f03613d0a575050565b8082035f5b82811015613dc357610100818403811115613d2957508083035b609b546040517f3c7f5283000000000000000000000000000000000000000000000000000000008152600481018590526024810183905273ffffffffffffffffffffffffffffffffffffffff90911690633c7f5283906044015f604051808303815f87803b158015613d99575f80fd5b505af1158015613dab573d5f803e3d5ffd5b50505050610100830192505061010081019050613d0f565b50505050565b60405183515f91829160208701919081908490613de7908590614838565b90506002840193505f5b81811015613e6b57603c81028501805184526020908101517fffffffffffffffffffffffffffffffffffffffffffffffffffff0000000000001690840152603a830192505f613e41603c83615044565b613e4b9087614e5e565b90505f613e5c82603a015160f01c90565b97909701965050600101613df1565b506020850282016040525b8015613f4e575f613e8b85603a015160f01c90565b9050613e9983828b8b6148cd565b92505f613eaa866038015160f01c90565b905081811015613f16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6e756d20747873206c657373207468616e206e756d204c31206d7367730000006044820152606401610af2565b50978801979690960195603c93909301927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff01613e76565b50819003902096919550909350505050565b8082535050565b5f805f6020840190506002810191505f613f82828651614838565b90505f5b613f91600183614e71565b811015613fa757603c9390930192600101613f86565b505f613fb4845160c01c90565b9695505050505050565b60605f80808080613fd1888a018a615148565b9550955095509550955050818710613fef57945061400b9350505050565b83871061400357829550505050505061400b565b509293505050505b9392505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff1661411e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610af2565b6123c66149b5565b5f54610100900460ff166141bc576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610af2565b6123c6614a75565b60a88390555f83815260a460205260408082205460975491517f45bc4d10000000000000000000000000000000000000000000000000000000008152600481018690526801000000000000000090910473ffffffffffffffffffffffffffffffffffffffff908116939216906345bc4d10906024016020604051808303815f875af1158015614255573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906142799190614f2f565b5f86815260a46020526040902060010154909150614298908290614e5e565b5f86815260a4602090815260408083205468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16835260a5909152812080549091906142e4908490614e5e565b90915550506040516142f79084906151e5565b6040519081900381209073ffffffffffffffffffffffffffffffffffffffff84169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b806143ae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496e76616c69642062617463682070726f6f66000000000000000000000000006044820152606401610af2565b5f6143bd846001015160c01c90565b90505f6143cb856039015190565b90505f7f00000000000000000000000000000000000000000000000000000000000000006143fa876059015190565b6079880151609989015160b98a015160198b015160405160c09690961b7fffffffffffffffff000000000000000000000000000000000000000000000000166020870152602886019490945260488501929092526068840152608883015260a882015260c8810183905260e801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120609c5490915073ffffffffffffffffffffffffffffffffffffffff16632c09a8486144c9885160f81c90565b858888866040518663ffffffff1660e01b81526004016144ed959493929190615211565b5f6040518083038186803b158015614503575f80fd5b505afa158015614515573d5f803e3d5ffd5b50505050505050505050565b5f83815260a4602052604081206001015460a9549091906064906145459084615044565b61454f9190615242565b905061455b8183614e71565b60aa5f82825461456b9190614e5e565b909155505073ffffffffffffffffffffffffffffffffffffffff84165f90815260a56020526040812080548392906145a4908490614e5e565b90915550506040516145b79084906151e5565b6040519081900381209073ffffffffffffffffffffffffffffffffffffffff86169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b80156146d5575f8273ffffffffffffffffffffffffffffffffffffffff16826040515f6040518083038185875af1925050503d805f8114614663576040519150601f19603f3d011682016040523d82523d5f602084013e614668565b606091505b50509050806146d3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c656400000000006044820152606401610af2565b505b5050565b6146e1613c92565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586147343390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b614766614b14565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33614734565b5f8160f9811015614822576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f626174636820686561646572206c656e67746820746f6f20736d616c6c0000006044820152606401610af2565b6040519150808483378082016040529250929050565b5f614844835160f01c90565b9050805f0361487f576040517f5168407700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61488a603c82615044565b614895906002614e5e565b8214611596576040517f4a969e2d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f835f036148dc5750836149ad565b609b5473ffffffffffffffffffffffffffffffffffffffff165f5b858110156149a7576040517fae453cd5000000000000000000000000000000000000000000000000000000008152600481018590525f9073ffffffffffffffffffffffffffffffffffffffff84169063ae453cd590602401602060405180830381865afa15801561496a573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061498e9190614f2f565b88525060209096019560019485019493840193016148f7565b50859150505b949350505050565b5f54610100900460ff16614a4b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610af2565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b5f54610100900460ff16614b0b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610af2565b6123c633614012565b60655460ff166123c6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610af2565b5f60208284031215614b90575f80fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff81168114614bba575f80fd5b919050565b5f60208284031215614bcf575f80fd5b61400b82614b97565b5f8083601f840112614be8575f80fd5b50813567ffffffffffffffff811115614bff575f80fd5b602083019150836020828501011115614c16575f80fd5b9250929050565b5f805f60408486031215614c2f575f80fd5b833567ffffffffffffffff811115614c45575f80fd5b614c5186828701614bd8565b909790965060209590950135949350505050565b5f8060208385031215614c76575f80fd5b823567ffffffffffffffff811115614c8c575f80fd5b614c9885828601614bd8565b90969095509350505050565b5f8060408385031215614cb5575f80fd5b823567ffffffffffffffff80821115614ccc575f80fd5b9084019060c08287031215614cdf575f80fd5b90925060208401359080821115614cf4575f80fd5b50830160608186031215614d06575f80fd5b809150509250929050565b5f805f805f8060c08789031215614d26575f80fd5b614d2f87614b97565b9550614d3d60208801614b97565b9450614d4b60408801614b97565b9350606087013592506080870135915060a087013590509295509295509295565b5f805f8060408587031215614d7f575f80fd5b843567ffffffffffffffff80821115614d96575f80fd5b614da288838901614bd8565b90965094506020870135915080821115614dba575f80fd5b50614dc787828801614bd8565b95989497509550505050565b8015158114613230575f80fd5b5f60208284031215614df0575f80fd5b813561400b81614dd3565b5f8060408385031215614e0c575f80fd5b823567ffffffffffffffff81168114614e23575f80fd5b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8082018082111561159657611596614e31565b8181038181111561159657611596614e31565b5f60208284031215614e94575f80fd5b815161400b81614dd3565b5f60208284031215614eaf575f80fd5b813560ff8116811461400b575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112614ef2575f80fd5b83018035915067ffffffffffffffff821115614f0c575f80fd5b602001915036819003821315614c16575f80fd5b818382375f9101908152919050565b5f60208284031215614f3f575f80fd5b5051919050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f6080820187835260206080602085015281885180845260a08601915060208a0193505f5b81811015614fe457845173ffffffffffffffffffffffffffffffffffffffff1683529383019391830191600101614fb2565b50508760408601528481036060860152614fff818789614f46565b9a9950505050505050505050565b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361503d5761503d614e31565b5060010190565b808202811582820484141761159657611596614e31565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112615097575f80fd5b8135602067ffffffffffffffff808311156150b4576150b461505b565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f830116810181811084821117156150f7576150f761505b565b6040529384526020818701810194908101925087851115615116575f80fd5b6020870191505b8482101561513d5761512e82614b97565b8352918301919083019061511d565b979650505050505050565b5f805f805f8060c0878903121561515d575f80fd5b86359550602087013567ffffffffffffffff8082111561517b575f80fd5b6151878a838b01615088565b96506040890135955060608901359150808211156151a3575f80fd5b6151af8a838b01615088565b94506080890135935060a08901359150808211156151cb575f80fd5b506151d889828a01615088565b9150509295509295509295565b5f82515f5b8181101561520457602081860181015185830152016151ea565b505f920191825250919050565b858152846020820152608060408201525f615230608083018587614f46565b90508260608301529695505050505050565b5f82615275577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b50049056fea164736f6c6343000818000a" +var RollupDeployedBin = "0x608060405260043610610332575f3560e01c806388b1ea09116101a7578063bedb86fb116100e7578063d8dc99d211610092578063dff7827e1161006d578063dff7827e14610a95578063e3fff1dd14610aaa578063f2fde38b14610ac9578063fb1e8b0414610ae8575f80fd5b8063d8dc99d214610a35578063ddd8a3dc14610a4a578063de8b303514610a76575f80fd5b8063ce5db8d6116100c2578063ce5db8d6146109e2578063cf9a6745146109f7578063d279c19114610a16575f80fd5b8063bedb86fb14610991578063c5553892146109b0578063cd4edc69146109cf575f80fd5b8063a479265d11610152578063b31a77d31161012d578063b31a77d31461091f578063b348442514610934578063b35dac4e14610953578063b3e0a50914610972575f80fd5b8063a479265d146108c0578063a4f209b0146108d5578063abc8d68d146108f4575f80fd5b8063910129d411610182578063910129d41461084257806397fc007c14610873578063a415d8dc14610892575f80fd5b806388b1ea09146107355780638da5cb5b1461074e5780638f1d377614610778575f80fd5b80633b70c18a116102725780635ef7a94a1161021d57806368589dfa116101f857806368589dfa146106b85780636c578c1d146106e3578063715018a614610702578063728cdbca14610716575f80fd5b80635ef7a94a146105ed5780635f77cf1d1461064d5780636126729014610699575f80fd5b80634e8f1d671161024d5780634e8f1d671461059857806357e0af6c146105b75780635c975abb146105d6575f80fd5b80633b70c18a146105445780633e001b6614610570578063428868b514610585575f80fd5b806313361101116102dd57806321e2f9e0116102b857806321e2f9e01461047e5780632362f03e1461049d5780632571098d146104c85780632b7ac3f3146104f3575f80fd5b8063133611011461041a57806318463fb01461043957806318af3b2b1461044e575f80fd5b806310d445831161030d57806310d44583146103c4578063116a1f42146103e3578063121dcd5014610405575f80fd5b806304d772151461033d578063059def61146103805780630ceb6780146103a3575f80fd5b3661033957005b5f80fd5b348015610348575f80fd5b5061036b610357366004615372565b60a36020525f908152604090205460ff1681565b60405190151581526020015b60405180910390f35b34801561038b575f80fd5b50610395609d5481565b604051908152602001610377565b3480156103ae575f80fd5b506103c26103bd3660046153b1565b610afd565b005b3480156103cf575f80fd5b506103c26103de36600461540f565b610c21565b3480156103ee575f80fd5b5061036b6103fd366004615372565b609d54101590565b348015610410575f80fd5b50610395609e5481565b348015610425575f80fd5b506103c2610434366004615457565b61100d565b348015610444575f80fd5b5061039560a75481565b348015610459575f80fd5b5061036b610468366004615372565b5f90815260a26020526040902060010154421090565b348015610489575f80fd5b5061036b610498366004615372565b61160c565b3480156104a8575f80fd5b506103956104b7366004615372565b60a16020525f908152604090205481565b3480156104d3575f80fd5b506103956104e2366004615372565b60a06020525f908152604090205481565b3480156104fe575f80fd5b50609c5461051f9073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610377565b34801561054f575f80fd5b50609b5461051f9073ffffffffffffffffffffffffffffffffffffffff1681565b34801561057b575f80fd5b5061039560aa5481565b6103c26105933660046154bc565b61163a565b3480156105a3575f80fd5b506103c26105b236600461551c565b6118eb565b3480156105c2575f80fd5b506103c26105d1366004615372565b611c55565b3480156105e1575f80fd5b5060655460ff1661036b565b3480156105f8575f80fd5b5061062d610607366004615372565b60a26020525f908152604090208054600182015460028301546003909301549192909184565b604080519485526020850193909352918301526060820152608001610377565b348015610658575f80fd5b506106807f000000000000000000000000000000000000000000000000000000000000000081565b60405167ffffffffffffffff9091168152602001610377565b3480156106a4575f80fd5b506103c26106b3366004615372565b611d1a565b3480156106c3575f80fd5b506103956106d2366004615372565b60ab6020525f908152604090205481565b3480156106ee575f80fd5b506103c26106fd3660046153b1565b611f7d565b34801561070d575f80fd5b506103c261208c565b348015610721575f80fd5b506103c26107303660046155cd565b61209f565b348015610740575f80fd5b5060a65461036b9060ff1681565b348015610759575f80fd5b5060335473ffffffffffffffffffffffffffffffffffffffff1661051f565b348015610783575f80fd5b506107f1610792366004615372565b60a46020525f9081526040902080546001820154600283015460039093015467ffffffffffffffff8316936801000000000000000090930473ffffffffffffffffffffffffffffffffffffffff16929060ff8082169161010090041686565b6040805167ffffffffffffffff909716875273ffffffffffffffffffffffffffffffffffffffff909516602087015293850192909252606084015215156080830152151560a082015260c001610377565b34801561084d575f80fd5b5061036b61085c366004615372565b5f90815260a4602052604090206003015460ff1690565b34801561087e575f80fd5b506103c261088d3660046153b1565b612468565b34801561089d575f80fd5b5061036b6108ac3660046153b1565b609f6020525f908152604090205460ff1681565b3480156108cb575f80fd5b5061039560995481565b3480156108e0575f80fd5b506103c26108ef366004615372565b61258c565b3480156108ff575f80fd5b5061039561090e3660046153b1565b60a56020525f908152604090205481565b34801561092a575f80fd5b5061039560a85481565b34801561093f575f80fd5b506103c261094e366004615628565b612656565b34801561095e575f80fd5b506103c261096d3660046153b1565b612a35565b34801561097d575f80fd5b506103c261098c366004615457565b612a9b565b34801561099c575f80fd5b506103c26109ab36600461569c565b612e87565b3480156109bb575f80fd5b506103c26109ca366004615372565b61301a565b6103c26109dd3660046156ce565b6130d7565b3480156109ed575f80fd5b5061039560985481565b348015610a02575f80fd5b506103c2610a11366004615372565b6137ec565b348015610a21575f80fd5b506103c2610a303660046153b1565b6139c9565b348015610a40575f80fd5b5061039560ac5481565b348015610a55575f80fd5b5060975461051f9073ffffffffffffffffffffffffffffffffffffffff1681565b348015610a81575f80fd5b5061036b610a90366004615372565b613aaf565b348015610aa0575f80fd5b50610395609a5481565b348015610ab5575f80fd5b506103c2610ac4366004615372565b613b06565b348015610ad4575f80fd5b506103c2610ae33660046153b1565b613bc3565b348015610af3575f80fd5b5061039560a95481565b610b05613c77565b73ffffffffffffffffffffffffffffffffffffffff81165f908152609f602052604090205460ff1615610b99576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f6163636f756e7420697320616c72656164792061206368616c6c656e6765720060448201526064015b60405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff81165f818152609f602090815260409182902080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600190811790915591519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc00991015b60405180910390a250565b610c29613c77565b5f8111610c92576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f636f756e74206d757374206265206e6f6e7a65726f00000000000000000000006044820152606401610b90565b5f80610c9e8585613cf8565b915091505f610cb1836001015160c01c90565b5f81815260a160205260409020549091508214610d2a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610b90565b5f60a181610d388785615723565b81526020019081526020015f205414610dd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152602060048201526024808201527f726576657274696e67206d7573742073746172742066726f6d2074686520656e60448201527f64696e67000000000000000000000000000000000000000000000000000000006064820152608401610b90565b609d548111610e63576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f63616e206f6e6c792072657665727420756e46696e616c697a6564206261746360448201527f68000000000000000000000000000000000000000000000000000000000000006064820152608401610b90565b610e6e600182615736565b609e555b831561100557604051829082907ecae2739091badfd91c373f0a16cede691e0cd25bb80cff77dd5caeb4710146905f90a35f81815260a16020526040812055610eba81613aaf565b15610f40575f81815260a4602090815260408083206001810154905468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16845260a59092528220805491929091610f12908490615723565b909155505060a680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b5f81815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a85415801590610fbd575060a85481145b15610fc7575f60a8555b6001015f81815260a160205260409020547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90940193915081610e72575b505050505050565b60a85415611077576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610b90565b61107f613dab565b5f8061108b8484613cf8565b915091505f61109e836001015160c01c90565b5f81815260a160205260409020549091508214611117576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610b90565b6111208161160c565b611186576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610b90565b61118f81613aaf565b156111f6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610b90565b5f81815260a4602052604090206003015460ff1615611271576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f62617463682073686f756c6420626520726576657274000000000000000000006044820152606401610b90565b5f81815260a260205260409020600101544210156112eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f626174636820696e206368616c6c656e67652077696e646f77000000000000006044820152606401610b90565b605983015160a05f6112fe600185615736565b81526020019081526020015f205414611373576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610b90565b5f81815260a06020526040902054156113e8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f626174636820616c7265616479207665726966696564000000000000000000006044820152606401610b90565b80609d5460010114611456576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610b90565b609d819055600160a35f61146b866099015190565b815260208101919091526040015f2080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001691151591909117905560798301515f82815260a060205260409020556114d86114cb846011015160c01c90565b600985015160c01c613e18565b60a25f6114e6600184615736565b815260208101919091526040015f908120818155600180820183905560028201839055600390910182905560ab919061151f9084615736565b81526020019081526020015f205f905560a45f60018361153f9190615736565b815260208082019290925260409081015f90812080547fffffffff00000000000000000000000000000000000000000000000000000000168155600181018290556002810182905560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905583815260a1909252902054817f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d6115e8866079015190565b60998701516040805192835260208301919091520160405180910390a35050505050565b5f81815260a260205260408120541580159061163457505f82815260a1602052604090205415155b92915050565b60975473ffffffffffffffffffffffffffffffffffffffff166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa1580156116c0573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906116e49190615749565b61174a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f7765640000000000006044820152606401610b90565b60a854156117b4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610b90565b6117bc613dab565b60ac54609b54604080517fb59b1a78000000000000000000000000000000000000000000000000000000008152905142939273ffffffffffffffffffffffffffffffffffffffff169163b59b1a789160048083019260209291908290030181865afa15801561182d573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906118519190615764565b61185b9190615723565b10156118dd575f611872608084016060850161577b565b61ffff16116118dd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6c316d73672064656c61790000000000000000000000000000000000000000006044820152606401610b90565b6118e78282613ee2565b5050565b60a85415611955576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610b90565b61195d613dab565b60ac54609e545f90815260a260205260408120549091429161197f9190615723565b1090505f4260ac54609b5f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663b59b1a786040518163ffffffff1660e01b8152600401602060405180830381865afa1580156119f1573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190611a159190615764565b611a1f9190615723565b10905081158015611a2d5750805b15611aae575f611a4360808a0160608b0161577b565b61ffff1611611aae576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6c316d73672064656c61790000000000000000000000000000000000000000006044820152606401610b90565b8180611ab75750805b611b1d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f696e76616c69642074696d696e670000000000000000000000000000000000006044820152606401610b90565b611b278888613ee2565b5f80611b338888613cf8565b915091505f611b46836001015160c01c90565b905080609e5414611bb3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f696e636f727265637420626174636820686561646572000000000000000000006044820152606401610b90565b5f81815260a160205260409020548214611c29576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610b90565b5f81815260a26020526040902042600190910155611c4883888861470c565b5050505050505050505050565b611c5d613c77565b5f81118015611c6e57506099548114155b611cd4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f696e76616c6964206e65772070726f6f662077696e646f7700000000000000006044820152606401610b90565b609980549082905560408051828152602081018490527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a6191015b60405180910390a15050565b5f54600290610100900460ff16158015611d3a57505f5460ff8083169116105b611dc6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610b90565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100179055611e015f5460ff1690565b60ff16600214611e6d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6d757374206861766520696e697469616c697a656421000000000000000000006044820152606401610b90565b81611efa576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602760248201527f63616e206e6f742073657420737461746520726f6f742077697468206279746560448201527f73333228302921000000000000000000000000000000000000000000000000006064820152608401610b90565b609e545f90815260ab6020526040902054611f2357609e545f90815260ab602052604090208290555b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611d0e565b611f85613c77565b73ffffffffffffffffffffffffffffffffffffffff81165f908152609f602052604090205460ff16612013576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f6163636f756e74206973206e6f742061206368616c6c656e67657200000000006044820152606401610b90565b73ffffffffffffffffffffffffffffffffffffffff81165f818152609f6020908152604080832080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055519182527f7feb653c7b1f0d23daeed494225b3f28851cdc8973fcc653866d9b6e205fc0099101610c16565b612094613c77565b61209d5f6148e6565b565b5f54610100900460ff16158080156120bd57505f54600160ff909116105b806120d65750303b1580156120d657505f5460ff166001145b612162576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610b90565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156121be575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b73ffffffffffffffffffffffffffffffffffffffff861615806121f5575073ffffffffffffffffffffffffffffffffffffffff8516155b1561222c576040517fecc6fdf000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b73ffffffffffffffffffffffffffffffffffffffff87166122a9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e76616c6964206c31207374616b696e6720636f6e747261637400000000006044820152606401610b90565b6122b161495c565b6122b96149fa565b6097805473ffffffffffffffffffffffffffffffffffffffff808a167fffffffffffffffffffffffff000000000000000000000000000000000000000092831617909255609b8054898416908316179055609c805492881692909116821790556098859055609984905560a98390556040515f907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96908290a3604080515f8152602081018690527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a437910160405180910390a1604080515f8152602081018590527f1e3a2094feb4b696dd3d7caea38ad2f41dbdcac3fa3943c7a693aff8a64b0a61910160405180910390a1604080515f8152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b0223910160405180910390a1801561245f575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050505050565b612470613c77565b73ffffffffffffffffffffffffffffffffffffffff8116158015906124b05750609c5473ffffffffffffffffffffffffffffffffffffffff828116911614155b612516576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e76616c6964206e65772076657269666965720000000000000000000000006044820152606401610b90565b609c805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f728af3d16a5760405e27a082c98ab272e9f0a1d02f0085d41532a26093aedd96905f90a35050565b612594613c77565b5f811180156125a4575060648111155b80156125b2575060a9548114155b612618576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f696e76616c69642070726f6f66207265776172642070657263656e74616765006044820152606401610b90565b60a980549082905560408051828152602081018490527ffb81bce17f015797e11949d3c332e2bf9453faf68f728447426803138f2b02239101611d0e565b60a854156126c0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610b90565b6126c8613dab565b60975473ffffffffffffffffffffffffffffffffffffffff166368015791336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa15801561274e573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906127729190615749565b6127d8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601a60248201527f6f6e6c7920616374697665207374616b657220616c6c6f7765640000000000006044820152606401610b90565b5f806127e48686613cf8565b915091505f6127f7836001015160c01c90565b5f81815260a160205260409020549091508214612870576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610b90565b61287981613aaf565b6128df576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f626174636820696e206368616c6c656e676500000000000000000000000000006044820152606401610b90565b5f81815260a4602052604090206003810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff1661010017905560a680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055609954600290910154429161295691615723565b116129ea575f81815260a460209081526040808320600390810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905560a2835292819020909201548251808401909352600783527f54696d656f757400000000000000000000000000000000000000000000000000918301919091526129e591839190614a98565b61245f565b6129f583868661470c565b61245f81336040518060400160405280600d81526020017f50726f6f66207375636365737300000000000000000000000000000000000000815250614c1b565b612a3d613c77565b60aa80545f909155612a4f8282614d01565b6040805173ffffffffffffffffffffffffffffffffffffffff84168152602081018390527fb1b2058a6969e2d25e47bcaebe8ae21c29a23b2752429315b75e2f4f285f3d879101611d0e565b612aa3613c77565b5f805260a06020527fb84a74ec6ef4d0e83b6006dfaa014ab4026f9f3b97d186e604d29998a4e808ea5415612b34576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f67656e6573697320626174636820696d706f72746564000000000000000000006044820152606401610b90565b5f80612b408484613cf8565b915091505f612b53836001015160c01c90565b90508015612bbd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f696e76616c696420626174636820696e646578000000000000000000000000006044820152606401610b90565b5f612bc9846079015190565b905080612c32576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f7a65726f20737461746520726f6f7400000000000000000000000000000000006044820152606401610b90565b600984015160c01c15612ca1576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f6c31206d65737361676520706f707065642073686f756c6420626520300000006044820152606401610b90565b5f612cad856019015190565b03612d14576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f7a65726f206461746120686173680000000000000000000000000000000000006044820152606401610b90565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014612d40856039015190565b14612da7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f696e76616c69642076657273696f6e65642068617368000000000000000000006044820152606401610b90565b5f82815260a1602090815260408083208690558051608081018252428082528184019081528183018581526060830186815288875260a2865284872093518455915160018401555160028301555160039091015560ab825280832084905560a0909152808220839055609e849055609d84905551849184917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a3604080518281525f6020820152849184917f26ba82f907317eedc97d0cbef23de76a43dd6edb563bdb6e9407645b950a7a2d910160405180910390a3505050505050565b612e8f613c77565b8015612fe857612e9d614dd2565b60a65460ff1615612f9a5760a7545f90815260a4602090815260408083206001810154905468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16845260a59092528220805491929091612efe908490615723565b909155505060a7545f90815260a46020526040812080547fffffffff0000000000000000000000000000000000000000000000000000000016815560018101829055600281019190915560030180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000016905560a680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690555b7f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258335b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a150565b612ff0614e57565b7f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33612fbd565b50565b613022613c77565b5f81118015613033575060ac548114155b613099576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f696e76616c6964206e657720726f6c6c75702064656c617920706572696f64006044820152606401610b90565b60ac80549082905560408051828152602081018490527f624e47dc9fb8f8cfeaf4ead4710277cc1757136cfa885e465514cf6d510f0ad19101611d0e565b335f908152609f602052604090205460ff1661314f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f63616c6c6572206368616c6c656e67657220616c6c6f776564000000000000006044820152606401610b90565b60a854156131b9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600b60248201527f6e656564207265766572740000000000000000000000000000000000000000006044820152606401610b90565b6131c1613dab565b60a65460ff161561322e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f616c726561647920696e206368616c6c656e67650000000000000000000000006044820152606401610b90565b8167ffffffffffffffff16609d54106132a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f626174636820616c72656164792066696e616c697a65640000000000000000006044820152606401610b90565b67ffffffffffffffff82165f90815260a160205260409020548114613324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f696e636f727265637420626174636820686173680000000000000000000000006044820152606401610b90565b6133378267ffffffffffffffff1661160c565b61339d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f6261746368206e6f7420657869737400000000000000000000000000000000006044820152606401610b90565b67ffffffffffffffff82165f90815260a4602052604090205468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff161561343f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f626174636820616c7265616479206368616c6c656e67656400000000000000006044820152606401610b90565b67ffffffffffffffff82165f90815260a2602052604090206001015442106134e9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152603360248201527f63616e6e6f74206368616c6c656e6765206261746368206f757473696465207460448201527f6865206368616c6c656e67652077696e646f77000000000000000000000000006064820152608401610b90565b60975f9054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16630d13fd7b6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613553573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906135779190615764565b3410156135e0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f696e73756666696369656e742076616c756500000000000000000000000000006044820152606401610b90565b67ffffffffffffffff82811660a78190556040805160c0810182528281523360208083018281523484860190815242606086019081525f6080870181815260a0880182815299825260a49095529690962094518554925173ffffffffffffffffffffffffffffffffffffffff1668010000000000000000027fffffffff00000000000000000000000000000000000000000000000000000000909316981697909717178355945160018301559151600282015592516003909301805492511515610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff941515949094167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009093169290921792909217905573ffffffffffffffffffffffffffffffffffffffff168267ffffffffffffffff167f3a6ea19df25b49e7624e313ce7c1ab23984238e93727260db56a81735b1b99763460405161374c91815260200190565b60405180910390a35f609d5460016137649190615723565b90505b609e5481116137bc578267ffffffffffffffff1681146137aa576099545f82815260a26020526040812060010180549091906137a4908490615723565b90915550505b806137b48161579c565b915050613767565b505060a680547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905550565b5f54600390610100900460ff1615801561380c57505f5460ff8083169116105b613898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a65640000000000000000000000000000000000006064820152608401610b90565b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00001660ff831617610100178155829003613931576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e76616c696420726f6c6c75702064656c617920706572696f6400000000006044820152606401610b90565b60ac829055604080515f8152602081018490527f624e47dc9fb8f8cfeaf4ead4710277cc1757136cfa885e465514cf6d510f0ad1910160405180910390a15f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff16905560405160ff821681527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb384740249890602001611d0e565b335f90815260a5602052604081205490819003613a42576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601c60248201527f696e76616c69642062617463684368616c6c656e6765526577617264000000006044820152606401610b90565b335f90815260a56020526040812055613a5b8282614d01565b8173ffffffffffffffffffffffffffffffffffffffff167f9c25fa83f414ed363c8d39c98fb3e17567b3431cede71eb062c49d2a63ce247a82604051613aa391815260200190565b60405180910390a25050565b5f81815260a4602052604081205468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16158015906116345750505f90815260a46020526040902060030154610100900460ff161590565b613b0e613c77565b5f81118015613b1f57506098548114155b613b85576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e76616c6964206e65772066696e616c697a6520706572696f6400000000006044820152606401610b90565b609880549082905560408051828152602081018490527fa577f4223f91f74e2dad65bbb8c30807587ae95d0d34288057bb3ec0d398a4379101611d0e565b613bcb613c77565b73ffffffffffffffffffffffffffffffffffffffff8116613c6e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610b90565b613017816148e6565b60335473ffffffffffffffffffffffffffffffffffffffff16331461209d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401610b90565b5f805f613d058585614eae565b90505f8160ff165f03613d2657613d1c8686614f38565b9094509050613d9d565b8160ff16600103613d3b57613d1c8686614fbb565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f556e737570706f727465642062617463682076657273696f6e000000000000006044820152606401610b90565b808420925050509250929050565b60655460ff161561209d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601060248201527f5061757361626c653a20706175736564000000000000000000000000000000006044820152606401610b90565b805f03613e23575050565b8082035f5b82811015613edc57610100818403811115613e4257508083035b609b546040517f3c7f5283000000000000000000000000000000000000000000000000000000008152600481018590526024810183905273ffffffffffffffffffffffffffffffffffffffff90911690633c7f5283906044015f604051808303815f87803b158015613eb2575f80fd5b505af1158015613ec4573d5f803e3d5ffd5b50505050610100830192505061010081019050613e28565b50505050565b613eef60208301836157d3565b60ff161580613f0d5750613f0660208301836157d3565b60ff166001145b613f73576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f696e76616c69642076657273696f6e00000000000000000000000000000000006044820152606401610b90565b6080820135613fde576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f70726576696f757320737461746520726f6f74206973207a65726f00000000006044820152606401610b90565b60a0820135614049576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601660248201527f6e657720737461746520726f6f74206973207a65726f000000000000000000006044820152606401610b90565b5f8061406061405b60208601866157f3565b613cf8565b915091505f614073836001015160c01c90565b90505f60a181614084846001615723565b81526020019081526020015f2054146140f9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f626174636820616c726561647920636f6d6d69747465640000000000000000006044820152606401610b90565b609e548114614164576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f696e636f727265637420626174636820696e64657800000000000000000000006044820152606401610b90565b5f81815260a1602052604090205482146141da576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f696e636f727265637420706172656e74206261746368206861736800000000006044820152606401610b90565b5f81815260ab6020526040902054608086013514614254576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f696e636f72726563742070726576696f757320737461746520726f6f740000006044820152606401610b90565b5f614263846011015160c01c90565b90505f61428f6142796060890160408a01615854565b61428960808a0160608b0161577b565b84615028565b90506142a1608088016060890161577b565b6001939093019261ffff1691909101905f8049156142c0575f496142e2565b7f010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c4440145b905060f96142f360208a018a6157d3565b60ff1660010361430257506101015b6040805182810190915296506143278761431f60208c018c6157d3565b60ff1661506c565b60c085901b60018801526143558761434560808c0160608d0161577b565b61ffff1660c01b60099190910152565b60c084811b6011890152601988018490526039880183905260808a0135605989015260a08a0135607989015289013560998801526143b98761439a60208b018b6157f3565b6040516143a892919061586d565b604051809103902060b99190910152565b60d9870186905260016143cf60208b018b6157d3565b60ff161061440157614401876143eb60608c0160408d01615854565b67ffffffffffffffff1660c01b60f99190910152565b8087205f86815260a1602090815260408083209390935560ab905290812060a08b0135905560a65460ff16156144605760a7545f90815260a46020526040902060020154609954429161445391615723565b61445d9190615736565b90505b604051806080016040528042815260200182609854426144809190615723565b61448a9190615723565b815260200161449f60608d0160408e01615854565b67ffffffffffffffff16815260975460209091019073ffffffffffffffffffffffffffffffffffffffff1663d096c3c6336040517fffffffff0000000000000000000000000000000000000000000000000000000060e084901b16815273ffffffffffffffffffffffffffffffffffffffff9091166004820152602401602060405180830381865afa158015614537573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061455b9190615764565b90525f87815260a2602090815260409182902083518155838201516001820155918301516002830155606090920151600390910155609e87905560975473ffffffffffffffffffffffffffffffffffffffff1692506374fe27b791508935906145d0906145ca908c018c6157f3565b5f615073565b5f6145de60408d018d6157f3565b6040518663ffffffff1660e01b81526004016145fe9594939291906158c3565b602060405180830381865afa158015614619573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061463d9190615749565b6146c9576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602160248201527f746865207369676e617475726520766572696669636174696f6e206661696c6560448201527f64000000000000000000000000000000000000000000000000000000000000006064820152608401610b90565b5f84815260a16020526040808220549051909186917f2c32d4ae151744d0bf0b9464a3e897a1d17ed2f1af71f7c9a75f12ce0d28238f9190a35050505050505050565b80614773576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f496e76616c69642062617463682070726f6f66000000000000000000000000006044820152606401610b90565b5f614782846001015160c01c90565b90505f614790856039015190565b90505f7f00000000000000000000000000000000000000000000000000000000000000006147bf876059015190565b6079880151609989015160b98a015160198b015160405160c09690961b7fffffffffffffffff000000000000000000000000000000000000000000000000166020870152602886019490945260488501929092526068840152608883015260a882015260c8810183905260e801604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190528051602090910120609c5490915073ffffffffffffffffffffffffffffffffffffffff16632c09a84861488e885160f81c90565b858888866040518663ffffffff1660e01b81526004016148b2959493929190615943565b5f6040518083038186803b1580156148c8575f80fd5b505afa1580156148da573d5f803e3d5ffd5b50505050505050505050565b6033805473ffffffffffffffffffffffffffffffffffffffff8381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f54610100900460ff166149f2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610b90565b61209d6150c7565b5f54610100900460ff16614a90576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610b90565b61209d615187565b60a88390555f83815260a460205260408082205460975491517f45bc4d10000000000000000000000000000000000000000000000000000000008152600481018690526801000000000000000090910473ffffffffffffffffffffffffffffffffffffffff908116939216906345bc4d10906024016020604051808303815f875af1158015614b29573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190614b4d9190615764565b5f86815260a46020526040902060010154909150614b6c908290615723565b5f86815260a4602090815260408083205468010000000000000000900473ffffffffffffffffffffffffffffffffffffffff16835260a590915281208054909190614bb8908490615723565b9091555050604051614bcb908490615974565b6040519081900381209073ffffffffffffffffffffffffffffffffffffffff84169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b5f83815260a4602052604081206001015460a954909190606490614c3f90846159a0565b614c4991906159b7565b9050614c558183615736565b60aa5f828254614c659190615723565b909155505073ffffffffffffffffffffffffffffffffffffffff84165f90815260a5602052604081208054839290614c9e908490615723565b9091555050604051614cb1908490615974565b6040519081900381209073ffffffffffffffffffffffffffffffffffffffff86169087907fe70d3820e244d5f71d1a6395db24f3460e8dca966edc1fd3625b6292880a877a905f90a45050505050565b80156118e7575f8273ffffffffffffffffffffffffffffffffffffffff16826040515f6040518083038185875af1925050503d805f8114614d5d576040519150601f19603f3d011682016040523d82523d5f602084013e614d62565b606091505b5050905080614dcd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f526f6c6c75703a20455448207472616e73666572206661696c656400000000006044820152606401610b90565b505050565b614dda613dab565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258614e2d3390565b60405173ffffffffffffffffffffffffffffffffffffffff909116815260200160405180910390a1565b614e5f615226565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa33614e2d565b5f81614f16576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601260248201527f456d7074792062617463682068656164657200000000000000000000000000006044820152606401610b90565b82825f818110614f2857614f286159ef565b919091013560f81c949350505050565b5f8160f9811015614fa5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f626174636820686561646572206c656e67746820746f6f20736d616c6c0000006044820152606401610b90565b6040519150808483378082016040529250929050565b5f816101018114614fa5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f626174636820686561646572206c656e67746820697320696e636f72726563746044820152606401610b90565b6040805160c085901b815260f084901b6008820152600a60208502820181019092525f91810161505d8161ffff871686615292565b82900390912095945050505050565b8082535050565b60605f80808080615086888a018a615b09565b95509550955095509550508187106150a45794506150c09350505050565b8387106150b85782955050505050506150c0565b509293505050505b9392505050565b5f54610100900460ff1661515d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610b90565b606580547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00169055565b5f54610100900460ff1661521d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401610b90565b61209d336148e6565b60655460ff1661209d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f5061757361626c653a206e6f74207061757365640000000000000000000000006044820152606401610b90565b5f825f036152a15750826150c0565b609b5473ffffffffffffffffffffffffffffffffffffffff165f5b84811015615368576040517fae453cd5000000000000000000000000000000000000000000000000000000008152600481018590525f9073ffffffffffffffffffffffffffffffffffffffff84169063ae453cd590602401602060405180830381865afa15801561532f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906153539190615764565b875250602090950194600193840193016152bc565b5093949350505050565b5f60208284031215615382575f80fd5b5035919050565b803573ffffffffffffffffffffffffffffffffffffffff811681146153ac575f80fd5b919050565b5f602082840312156153c1575f80fd5b6150c082615389565b5f8083601f8401126153da575f80fd5b50813567ffffffffffffffff8111156153f1575f80fd5b602083019150836020828501011115615408575f80fd5b9250929050565b5f805f60408486031215615421575f80fd5b833567ffffffffffffffff811115615437575f80fd5b615443868287016153ca565b909790965060209590950135949350505050565b5f8060208385031215615468575f80fd5b823567ffffffffffffffff81111561547e575f80fd5b61548a858286016153ca565b90969095509350505050565b5f60e082840312156154a6575f80fd5b50919050565b5f606082840312156154a6575f80fd5b5f80604083850312156154cd575f80fd5b823567ffffffffffffffff808211156154e4575f80fd5b6154f086838701615496565b93506020850135915080821115615505575f80fd5b50615512858286016154ac565b9150509250929050565b5f805f805f8060808789031215615531575f80fd5b863567ffffffffffffffff80821115615548575f80fd5b6155548a838b01615496565b97506020890135915080821115615569575f80fd5b6155758a838b016154ac565b9650604089013591508082111561558a575f80fd5b6155968a838b016153ca565b909650945060608901359150808211156155ae575f80fd5b506155bb89828a016153ca565b979a9699509497509295939492505050565b5f805f805f8060c087890312156155e2575f80fd5b6155eb87615389565b95506155f960208801615389565b945061560760408801615389565b9350606087013592506080870135915060a087013590509295509295509295565b5f805f806040858703121561563b575f80fd5b843567ffffffffffffffff80821115615652575f80fd5b61565e888389016153ca565b90965094506020870135915080821115615676575f80fd5b50615683878288016153ca565b95989497509550505050565b8015158114613017575f80fd5b5f602082840312156156ac575f80fd5b81356150c08161568f565b803567ffffffffffffffff811681146153ac575f80fd5b5f80604083850312156156df575f80fd5b6156e8836156b7565b946020939093013593505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b80820180821115611634576116346156f6565b81810381811115611634576116346156f6565b5f60208284031215615759575f80fd5b81516150c08161568f565b5f60208284031215615774575f80fd5b5051919050565b5f6020828403121561578b575f80fd5b813561ffff811681146150c0575f80fd5b5f7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036157cc576157cc6156f6565b5060010190565b5f602082840312156157e3575f80fd5b813560ff811681146150c0575f80fd5b5f8083357fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe1843603018112615826575f80fd5b83018035915067ffffffffffffffff821115615840575f80fd5b602001915036819003821315615408575f80fd5b5f60208284031215615864575f80fd5b6150c0826156b7565b818382375f9101908152919050565b81835281816020850137505f602082840101525f60207fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f840116840101905092915050565b5f6080820187835260206080602085015281885180845260a08601915060208a0193505f5b8181101561591a57845173ffffffffffffffffffffffffffffffffffffffff16835293830193918301916001016158e8565b5050876040860152848103606086015261593581878961587c565b9a9950505050505050505050565b858152846020820152608060408201525f61596260808301858761587c565b90508260608301529695505050505050565b5f82515f5b818110156159935760208186018101518583015201615979565b505f920191825250919050565b8082028115828204841417611634576116346156f6565b5f826159ea577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f82601f830112615a58575f80fd5b8135602067ffffffffffffffff80831115615a7557615a75615a1c565b8260051b6040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0603f83011681018181108482111715615ab857615ab8615a1c565b6040529384526020818701810194908101925087851115615ad7575f80fd5b6020870191505b84821015615afe57615aef82615389565b83529183019190830190615ade565b979650505050505050565b5f805f805f8060c08789031215615b1e575f80fd5b86359550602087013567ffffffffffffffff80821115615b3c575f80fd5b615b488a838b01615a49565b9650604089013595506060890135915080821115615b64575f80fd5b615b708a838b01615a49565b94506080890135935060a0890135915080821115615b8c575f80fd5b50615b9989828a01615a49565b915050929550929550929556fea164736f6c6343000818000a" func init() { if err := json.Unmarshal([]byte(RollupStorageLayoutJSON), RollupStorageLayout); err != nil { diff --git a/bindings/go.mod b/bindings/go.mod index af66cc697..a509930b7 100644 --- a/bindings/go.mod +++ b/bindings/go.mod @@ -1,23 +1,24 @@ module morph-l2/bindings -go 1.22 +go 1.24.0 -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.3 -require github.com/morph-l2/go-ethereum v1.10.14-0.20241224100051-1582a364edc0 +require github.com/morph-l2/go-ethereum v1.10.14-0.20260211074551-4f0f6e6bd141 require ( github.com/VictoriaMetrics/fastcache v1.12.2 // indirect - github.com/bits-and-blooms/bitset v1.7.0 // indirect + github.com/bits-and-blooms/bitset v1.20.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.2.1 // indirect - github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.12.1 // indirect - github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect + github.com/consensys/bavard v0.1.27 // indirect + github.com/consensys/gnark-crypto v0.16.0 // indirect + github.com/crate-crypto/go-eth-kzg v1.4.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/deckarep/golang-set v1.8.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect github.com/edsrzf/mmap-go v1.1.0 // indirect - github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4 // indirect + github.com/ethereum/c-kzg-4844/v2 v2.1.5 // indirect + github.com/ethereum/go-ethereum v1.10.26 // indirect github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-stack/stack v1.8.1 // indirect @@ -26,25 +27,22 @@ require ( github.com/hashicorp/golang-lru v1.0.2 // indirect github.com/holiman/uint256 v1.2.4 // indirect github.com/iden3/go-iden3-crypto v0.0.16 // indirect - github.com/mattn/go-runewidth v0.0.15 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/tsdb v0.10.0 // indirect - github.com/rivo/uniseg v0.4.3 // indirect github.com/rjeczalik/notify v0.9.3 // indirect 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/testify v1.9.0 // indirect - github.com/supranational/blst v0.3.11 // indirect + github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe // 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/yusufpapurcu/wmi v1.2.3 // indirect - golang.org/x/crypto v0.23.0 // indirect + golang.org/x/crypto v0.35.0 // indirect golang.org/x/net v0.25.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.20.0 // indirect + golang.org/x/sync v0.11.0 // indirect + golang.org/x/sys v0.30.0 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/bindings/go.sum b/bindings/go.sum index df09b475f..bb71a7769 100644 --- a/bindings/go.sum +++ b/bindings/go.sum @@ -6,8 +6,8 @@ github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRF github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo= -github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bits-and-blooms/bitset v1.20.0 h1:2F+rfL86jE2d/bmw7OhqUg2Sj/1rURkBn3MdfoPyRVU= +github.com/bits-and-blooms/bitset v1.20.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/btcsuite/btcd/btcec/v2 v2.2.1 h1:xP60mv8fvp+0khmrN0zTdPC3cNm24rfeE6lh2R/Yv3E= github.com/btcsuite/btcd/btcec/v2 v2.2.1/go.mod h1:9/CSmJxmuvqzX9Wh2fXMWToLOHhPd11lSPuIupwTkI8= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= @@ -21,12 +21,12 @@ github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= -github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= -github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= -github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= -github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/consensys/bavard v0.1.27 h1:j6hKUrGAy/H+gpNrpLU3I26n1yc+VMGmd6ID5+gAhOs= +github.com/consensys/bavard v0.1.27/go.mod h1:k/zVjHHC4B+PQy1Pg7fgvG3ALicQw540Crag8qx+dZs= +github.com/consensys/gnark-crypto v0.16.0 h1:8Dl4eYmUWK9WmlP1Bj6je688gBRJCJbT8Mw4KoTAawo= +github.com/consensys/gnark-crypto v0.16.0/go.mod h1:Ke3j06ndtPTVvo++PhGNgvm+lgpLvzbcE2MqljY7diU= +github.com/crate-crypto/go-eth-kzg v1.4.0 h1:WzDGjHk4gFg6YzV0rJOAsTK4z3Qkz5jd4RE3DAvPFkg= +github.com/crate-crypto/go-eth-kzg v1.4.0/go.mod h1:J9/u5sWfznSObptgfa92Jq8rTswn6ahQWEuiLHOjCUI= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -40,8 +40,10 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3 github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= -github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4 h1:B2mpK+MNqgPqk2/KNi1LbqwtZDy5F7iy0mynQiBr8VA= -github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4/go.mod h1:y4GA2JbAUama1S4QwYjC2hefgGLU8Ul0GMtL/ADMF1c= +github.com/ethereum/c-kzg-4844/v2 v2.1.5 h1:aVtoLK5xwJ6c5RiqO8g8ptJ5KU+2Hdquf6G3aXiHh5s= +github.com/ethereum/c-kzg-4844/v2 v2.1.5/go.mod h1:u59hRTTah4Co6i9fDWtiCjTrblJv0UwsqZKCc0GfgUs= +github.com/ethereum/go-ethereum v1.10.26 h1:i/7d9RBBwiXCEuyduBQzJw/mKmnvzsN14jqBmytw72s= +github.com/ethereum/go-ethereum v1.10.26/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= @@ -99,18 +101,18 @@ github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCV github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= -github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= -github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= -github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/leanovate/gopter v0.2.11 h1:vRjThO1EKPb/1NsDXuDrzldR28RLkBflWYcU9CvzWu4= +github.com/leanovate/gopter v0.2.11/go.mod h1:aK3tzZP/C+p1m3SPRE4SYZFGP7jjkuSI4f7Xvpt0S9c= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= 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.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.20260211074551-4f0f6e6bd141 h1:A8eygErKU6WKMipGWIemzwLeYkIGLd9yb/Ry3x+J9PQ= +github.com/morph-l2/go-ethereum v1.10.14-0.20260211074551-4f0f6e6bd141/go.mod h1:nkVzHjQWCOjvukQW8ittlwX+Xz9gmVHrP7mUi7zoHTs= 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= @@ -141,9 +143,8 @@ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/tsdb v0.10.0 h1:If5rVCMTp6W2SiRAQFlbpJNgVlgMEd+U2GZckwK38ic= github.com/prometheus/tsdb v0.10.0/go.mod h1:oi49uRhEe9dPUTlS3JRZOwJuVi6tmh10QSgwXEyGCt4= -github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= -github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rjeczalik/notify v0.9.3 h1:6rJAzHTGKXGj76sbRgDiDcYj/HniypXmSJo1SWakZeY= github.com/rjeczalik/notify v0.9.3/go.mod h1:gF3zSOrafR9DQEWSE8TjfI9NkooDxbyT4UgRGKZA0lc= github.com/scroll-tech/zktrie v0.8.4 h1:UagmnZ4Z3ITCk+aUq9NQZJNAwnWl4gSxsLb2Nl7IgRE= @@ -160,10 +161,10 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf 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= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= -github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe h1:nbdqkIGOGfUAD54q1s2YBcBz/WcsxCO9HUQ4aGV5hUw= +github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4= @@ -179,8 +180,8 @@ golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs= +golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -198,8 +199,8 @@ golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180926160741-c2ed4eda69e7/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -222,16 +223,16 @@ golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= diff --git a/bindings/predeploys/addresses.go b/bindings/predeploys/addresses.go index dc8a1b39b..061c61d6a 100644 --- a/bindings/predeploys/addresses.go +++ b/bindings/predeploys/addresses.go @@ -29,6 +29,7 @@ const ( L2ReverseCustomGateway = "0x5300000000000000000000000000000000000018" L2WithdrawLockERC20Gateway = "0x5300000000000000000000000000000000000019" L2USDCGateway = "0x5300000000000000000000000000000000000020" + L2TokenRegistry = "0x5300000000000000000000000000000000000021" ) var ( @@ -56,6 +57,7 @@ var ( L2ReverseCustomGatewayAddr = common.HexToAddress(L2ReverseCustomGateway) L2WithdrawLockERC20GatewayAddr = common.HexToAddress(L2WithdrawLockERC20Gateway) L2USDCGatewayAddr = common.HexToAddress(L2USDCGateway) + L2TokenRegistryAddr = common.HexToAddress(L2TokenRegistry) Predeploys = make(map[string]*common.Address) ) @@ -85,4 +87,5 @@ func init() { Predeploys["L2ReverseCustomGateway"] = &L2ReverseCustomGatewayAddr Predeploys["L2WithdrawLockERC20Gateway"] = &L2WithdrawLockERC20GatewayAddr Predeploys["L2USDCGateway"] = &L2USDCGatewayAddr + Predeploys["L2TokenRegistry"] = &L2TokenRegistryAddr } diff --git a/build/.golangci.yml b/build/.golangci.yml index 4a04787be..0ea077e1f 100644 --- a/build/.golangci.yml +++ b/build/.golangci.yml @@ -140,7 +140,6 @@ linters: - goprintffuncname - depguard - gocyclo - - exportloopref - sqlclosecheck - rowserrcheck - durationcheck @@ -176,6 +175,10 @@ issues: - staticcheck text: "SA9003:" + - linters: + - staticcheck + text: "SA1019:" + # Exclude lll issues for long lines with go:generate - linters: - lll @@ -199,6 +202,10 @@ issues: - gosec text: "G404" + - linters: + - gosec + text: "G115" + - linters: - wsl text: "return statements should not be cuddled if block has more than two lines" diff --git a/build/lint.go b/build/lint.go index f80814519..e12ac1cc0 100644 --- a/build/lint.go +++ b/build/lint.go @@ -15,7 +15,7 @@ import ( const ( // GolangCIVersion to be used for linting. - GolangCIVersion = "github.com/golangci/golangci-lint/cmd/golangci-lint@v1.58.1" + GolangCIVersion = "github.com/golangci/golangci-lint/cmd/golangci-lint@latest" ) // GOBIN environment variable. @@ -51,13 +51,18 @@ func main() { func lint(depth int64) { v := flag.Bool("v", false, "log verbosely") + // Ensure we use the correct Go toolchain + env := os.Environ() + env = append(env, "GOTOOLCHAIN=auto") + // Make sure GOLANGCI is downloaded and available. argsGet := []string{"install", GolangCIVersion} cmd := exec.Command(filepath.Join(runtime.GOROOT(), "bin", "go"), argsGet...) + cmd.Env = env out, err := cmd.CombinedOutput() if err != nil { - log.Fatalf("could not list pkgs: %v\n%s", err, string(out)) + log.Fatalf("could not install golangci-lint: %v\n%s", err, string(out)) } cmd = exec.Command(filepath.Join(goBin(), "golangci-lint")) @@ -72,10 +77,13 @@ func lint(depth int64) { cmd.Args = append(cmd.Args, "-v") } + // Set environment for golangci-lint + cmd.Env = env + fmt.Println("Linting...") cmd.Stderr, cmd.Stdout = os.Stderr, os.Stdout if err := cmd.Run(); err != nil { - log.Fatal("Error: Could not Lint ", "error: ", err, ", cmd: ", cmd) + log.Fatal("Error: Could not Lint ", "error", err, ", cmd", cmd) } } diff --git a/contracts/contracts/l1/rollup/IL1MessageQueue.sol b/contracts/contracts/l1/rollup/IL1MessageQueue.sol index 8f33381f5..e06a4df30 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 { /********** @@ -57,6 +57,11 @@ interface IL1MessageQueue { /// @notice The start index of all pending inclusion messages. function pendingQueueIndex() external view returns (uint256); + /// @notice Return the enqueue timestamp of the first unfinalized message. + /// @dev Used for checking if L1 messages are being processed within acceptable time. + /// @return timestamp The block.timestamp when the first unfinalized message was enqueued. + function getFirstUnfinalizedMessageEnqueueTime() external view returns (uint256 timestamp); + /// @notice Return the index of next appended message. /// @dev Also the total number of appended messages. function nextCrossDomainMessageIndex() external view returns (uint256); diff --git a/contracts/contracts/l1/rollup/IL1MessageQueueWithGasPriceOracle.sol b/contracts/contracts/l1/rollup/IL1MessageQueueWithGasPriceOracle.sol index a4f043ed4..275b2b017 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 680a550d1..02150042e 100644 --- a/contracts/contracts/l1/rollup/IRollup.sol +++ b/contracts/contracts/l1/rollup/IRollup.sol @@ -8,14 +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 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; + uint64 lastBlockNumber; + uint16 numL1Messages; bytes32 prevStateRoot; bytes32 postStateRoot; bytes32 withdrawalRoot; @@ -116,6 +118,11 @@ interface IRollup { /// @param newPercent The new proofRewardPercent. event UpdateProofRewardPercent(uint256 oldPercent, uint256 newPercent); + /// @notice Emitted when the rollup delay period is updated. + /// @param oldPeriod The old rollupDelayPeriod. + /// @param newPeriod The new rollupDelayPeriod. + event UpdateRollupDelayPeriod(uint256 oldPeriod, uint256 newPeriod); + /// @notice Emit when prove remaining claimed. /// @param receiver receiver address. /// @param amount claimed amount. @@ -180,6 +187,20 @@ interface IRollup { BatchSignatureInput calldata batchSignatureInput ) external payable; + /// @notice Commit a batch with ZKP proof for permissionless submission. + /// @dev This function allows anyone to submit batches when the sequencer is offline or censoring. + /// + /// @param batchDataInput The BatchDataInput struct + /// @param batchSignatureInput The BatchSignatureInput struct + /// @param batchHeader The batch header for ZKP verification + /// @param batchProof The ZKP proof data + function commitBatchWithProof( + BatchDataInput calldata batchDataInput, + BatchSignatureInput calldata batchSignatureInput, + bytes calldata batchHeader, + bytes calldata batchProof + ) external; + /// @notice Revert a pending batch. /// @dev one can only revert unfinalized batches. /// @param batchHeader The header of current batch, see the encoding in comments of `commitBatch`. diff --git a/contracts/contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol b/contracts/contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol index 3d86a753c..c345d4a32 100644 --- a/contracts/contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol +++ b/contracts/contracts/l1/rollup/L1MessageQueueWithGasPriceOracle.sol @@ -57,6 +57,8 @@ contract L1MessageQueueWithGasPriceOracle is OwnableUpgradeable, IL1MessageQueue /// @inheritdoc IL1MessageQueueWithGasPriceOracle address public whitelistChecker; + mapping(uint256 => uint256) public messageEnqueueTime; + /********************** * Function Modifiers * **********************/ @@ -149,11 +151,7 @@ contract L1MessageQueueWithGasPriceOracle is OwnableUpgradeable, IL1MessageQueue len := 1 leave } - for { - - } gt(v, 0) { - - } { + for {} gt(v, 0) {} { len := add(len, 1) v := shr(8, v) } @@ -260,6 +258,19 @@ contract L1MessageQueueWithGasPriceOracle is OwnableUpgradeable, IL1MessageQueue return hash; } + function getFirstUnfinalizedMessageEnqueueTime() external view returns (uint256 timestamp) { + if (pendingQueueIndex < messageQueue.length && messageEnqueueTime[pendingQueueIndex] != 0) { + // has pending messages and return enqueue time + return messageEnqueueTime[pendingQueueIndex]; + } + // no pending messages, return current timestamp + return block.timestamp; + } + + function getMessageEnqueueTimestamp(uint256 index) external view returns (uint256 timestamp) { + return messageEnqueueTime[index]; + } + /***************************** * Public Mutating Functions * *****************************/ @@ -363,6 +374,7 @@ contract L1MessageQueueWithGasPriceOracle is OwnableUpgradeable, IL1MessageQueue uint256 _queueIndex = messageQueue.length; bytes32 _hash = computeTransactionHash(_sender, _queueIndex, _value, _target, _gasLimit, _data); messageQueue.push(_hash); + messageEnqueueTime[_queueIndex] = block.timestamp; // emit event emit QueueTransaction(_sender, _target, _value, uint64(_queueIndex), _gasLimit, _data); diff --git a/contracts/contracts/l1/rollup/Rollup.sol b/contracts/contracts/l1/rollup/Rollup.sol index 905913f94..2148bb60e 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"; @@ -100,6 +100,10 @@ contract Rollup is IRollup, OwnableUpgradeable, PausableUpgradeable { /// @notice committedStateRoots mapping(uint256 batchIndex => bytes32 stateRoot) public committedStateRoots; + /// @notice The delay period for permissionless batch submission. + /// @dev After this period, anyone can submit batches if sequencers are offline or censoring. + uint256 public rollupDelayPeriod; + /********************** * Function Modifiers * **********************/ @@ -183,6 +187,14 @@ contract Rollup is IRollup, OwnableUpgradeable, PausableUpgradeable { } } + /// @notice Initializer for upgrade to version 3. + /// @param _rollupDelayPeriod The delay period for permissionless batch submission. + function initialize3(uint256 _rollupDelayPeriod) external reinitializer(3) { + require(_rollupDelayPeriod != 0, "invalid rollup delay period"); + rollupDelayPeriod = _rollupDelayPeriod; + emit UpdateRollupDelayPeriod(0, _rollupDelayPeriod); + } + /************************ * Restricted Functions * ************************/ @@ -220,10 +232,20 @@ 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"); + // check l1msg delay - sequencer must process L1 messages when delayed + if ( + IL1MessageQueue(messageQueue).getFirstUnfinalizedMessageEnqueueTime() + rollupDelayPeriod < block.timestamp + ) { + require(batchDataInput.numL1Messages > 0, "l1msg delay"); + } + _commitBatchWithBatchData(batchDataInput, batchSignatureInput); + } + + function _commitBatchWithBatchData( + BatchDataInput calldata batchDataInput, + BatchSignatureInput calldata batchSignatureInput + ) internal { + 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"); @@ -248,17 +270,14 @@ 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, + bytes32 dataHash = _commitBatch( + batchDataInput.lastBlockNumber, + batchDataInput.numL1Messages, _totalL1MessagesPoppedOverall ); + unchecked { - _totalL1MessagesPoppedInBatch += _totalNumL1Messages; - _totalL1MessagesPoppedOverall += _totalNumL1Messages; + _totalL1MessagesPoppedOverall += batchDataInput.numL1Messages; } assembly { _batchIndex := add(_batchIndex, 1) // increase batch index @@ -267,22 +286,30 @@ contract Rollup is IRollup, OwnableUpgradeable, PausableUpgradeable { { 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.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; @@ -294,7 +321,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 @@ -316,6 +343,46 @@ contract Rollup is IRollup, OwnableUpgradeable, PausableUpgradeable { emit CommitBatch(_batchIndex, committedBatches[_batchIndex]); } + /// @inheritdoc IRollup + /// @dev Allows permissionless batch submission when sequencers are offline or censoring. + /// Entry conditions: rollup delay OR L1 message queue delay must be met. + function commitBatchWithProof( + BatchDataInput calldata batchDataInput, + BatchSignatureInput calldata batchSignatureInput, + bytes calldata _batchHeader, + bytes calldata _batchProof + ) external override nonReqRevert whenNotPaused { + // check delay timing - allow if EITHER batch submission OR L1 message processing is stalled + // This enables permissionless batch submission when sequencers are offline or censoring + bool rollupDelay = batchDataStore[lastCommittedBatchIndex].originTimestamp + rollupDelayPeriod < + block.timestamp; + + // Check if L1 message queue is delayed + bool l1MsgQueueDelayed = IL1MessageQueue(messageQueue).getFirstUnfinalizedMessageEnqueueTime() + + rollupDelayPeriod < + block.timestamp; + + if (!rollupDelay && l1MsgQueueDelayed) { + require(batchDataInput.numL1Messages > 0, "l1msg delay"); + } + require(rollupDelay || l1MsgQueueDelayed, "invalid timing"); + + _commitBatchWithBatchData(batchDataInput, batchSignatureInput); + + // get batch data from batch header + (uint256 memPtr, bytes32 _batchHash) = _loadBatchHeader(_batchHeader); + // check batch hash + uint256 _batchIndex = BatchHeaderCodecV0.getBatchIndex(memPtr); + require(lastCommittedBatchIndex == _batchIndex, "incorrect batch header"); + require(committedBatches[_batchIndex] == _batchHash, "incorrect batch hash"); + + // Override finalizeTimestamp for ZKP-backed immediate finality + batchDataStore[_batchIndex].finalizeTimestamp = block.timestamp; + + // verify proof + _verifyProof(memPtr, _batchProof); + } + /// @inheritdoc IRollup /// @dev If the owner wants to revert a sequence of batches by sending multiple transactions, /// make sure to revert recent batches first. @@ -405,6 +472,15 @@ contract Rollup is IRollup, OwnableUpgradeable, PausableUpgradeable { emit UpdateFinalizationPeriodSeconds(_oldFinalizationPeriodSeconds, finalizationPeriodSeconds); } + /// @notice Update rollupDelayPeriod. + /// @param _newPeriod New rollup delay period. + function updateRollupDelayPeriod(uint256 _newPeriod) external onlyOwner { + require(_newPeriod > 0 && _newPeriod != rollupDelayPeriod, "invalid new rollup delay period"); + uint256 _oldRollupDelayPeriod = rollupDelayPeriod; + rollupDelayPeriod = _newPeriod; + emit UpdateRollupDelayPeriod(_oldRollupDelayPeriod, rollupDelayPeriod); + } + /// @notice Add an account to the challenger list. /// @param _account The address of account to add. function addChallenger(address _account) external onlyOwner { @@ -475,7 +551,10 @@ 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 @@ -705,96 +784,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. /// @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, + uint64 _lastBlockNumber, + uint16 _numL1Messages, uint256 _totalL1MessagesPoppedOverall - ) internal view returns (bytes32 _dataHash, uint256 _totalNumL1MessagesInBatch) { - uint256 batchPtr; + ) 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 - ); - 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 { @@ -805,13 +852,11 @@ 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. /// @return uint256 The new memory offset after loading. function _loadL1MessageHashes( uint256 _ptr, uint256 _numL1Messages, - uint256 _totalL1MessagesPoppedInBatch, uint256 _totalL1MessagesPoppedOverall ) internal view returns (uint256) { if (_numL1Messages == 0) { @@ -826,8 +871,6 @@ contract Rollup is IRollup, OwnableUpgradeable, PausableUpgradeable { mstore(_ptr, _hash) _ptr := add(_ptr, 0x20) } - - _totalL1MessagesPoppedInBatch += 1; _totalL1MessagesPoppedOverall += 1; } } diff --git a/contracts/contracts/l1/staking/L1Staking.sol b/contracts/contracts/l1/staking/L1Staking.sol index 9f8af443a..165fec18d 100644 --- a/contracts/contracts/l1/staking/L1Staking.sol +++ b/contracts/contracts/l1/staking/L1Staking.sol @@ -69,9 +69,6 @@ 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 * **********************/ @@ -222,9 +219,6 @@ 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; @@ -481,10 +475,9 @@ contract L1Staking is IL1Staking, Staking, OwnableUpgradeable, ReentrancyGuardUp MESSENGER.sendMessage( address(OTHER_STAKING), 0, - abi.encodeCall(IL2Staking.addStaker, (nonce, add)), + abi.encodeCall(IL2Staking.addStaker, (add)), gasLimitAddStaker ); - nonce = nonce + 1; } /// @notice remove stakers @@ -493,22 +486,16 @@ contract L1Staking is IL1Staking, Staking, OwnableUpgradeable, ReentrancyGuardUp MESSENGER.sendMessage( address(OTHER_STAKING), 0, - abi.encodeCall(IL2Staking.removeStakers, (nonce, remove)), + abi.encodeCall(IL2Staking.removeStakers, (remove)), gasLimitRemoveStakers ); - nonce = nonce + 1; } /// @notice clean staker store function _cleanStakerStore() internal { uint256 i = 0; while (i < deleteList.length) { - 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) { + 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 c7b132cad..71f6b4acd 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,19 +217,13 @@ contract Distribute is IDistribute, OwnableUpgradeable { ? mintedEpochCount - 1 : targetEpochIndex; uint256 reward; - for (uint256 i = 0; i < unclaimed[delegator].delegatees.length(); ) { - bool removed = false; + for (uint256 i = 0; i < unclaimed[delegator].delegatees.length(); i++) { address delegatee = unclaimed[delegator].delegatees.at(i); if ( unclaimed[delegator].delegatees.contains(delegatee) && unclaimed[delegator].unclaimedStart[delegatee] <= endEpochIndex ) { - (uint256 rewardTmp, bool removedTmp) = _claim(delegatee, delegator, endEpochIndex); - reward += rewardTmp; - removed = removedTmp; - } - if (!removed) { - i++; + reward += _claim(delegatee, delegator, endEpochIndex); } } if (reward > 0) { @@ -360,11 +354,7 @@ contract Distribute is IDistribute, OwnableUpgradeable { } /// @notice claim delegator morph reward - function _claim( - address delegatee, - address delegator, - uint256 endEpochIndex - ) internal returns (uint256 reward, bool removed) { + function _claim(address delegatee, address delegator, uint256 endEpochIndex) internal returns (uint256 reward) { require(unclaimed[delegator].delegatees.contains(delegatee), "no remaining reward"); require(unclaimed[delegator].unclaimedStart[delegatee] <= endEpochIndex, "all reward claimed"); @@ -381,7 +371,6 @@ 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 7edf13a07..af0170971 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 public undeletedProposalStart; + uint256 private undeletedProposalStart; /// @notice proposal data mapping(uint256 proposalID => ProposalData) public proposalData; @@ -61,9 +61,6 @@ 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 * **********************/ @@ -149,7 +146,6 @@ 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( @@ -164,7 +160,6 @@ 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; @@ -185,19 +180,6 @@ 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 * *************************/ @@ -205,13 +187,7 @@ 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 ( @@ -234,8 +210,6 @@ 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; @@ -254,6 +228,14 @@ 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 39ac3da90..5bb84d0f0 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 793da06bc..8e9ef0475 100644 --- a/contracts/contracts/l2/staking/IL2Staking.sol +++ b/contracts/contracts/l2/staking/IL2Staking.sol @@ -140,14 +140,12 @@ interface IL2Staking { *****************************/ /// @notice add staker, sync from L1 - /// @param nonce msg nonce - /// @param add staker to add. {addr, tmKey, blsKey} - function addStaker(uint256 nonce, Types.StakerInfo calldata add) external; + /// @param add staker to add. {addr, tmKey, blsKey} + function addStaker(Types.StakerInfo calldata add) external; /// @notice remove stakers, sync from L1 - /// @param nonce msg nonce - /// @param remove staker to remove - function removeStakers(uint256 nonce, address[] calldata remove) external; + /// @param remove staker to remove + function removeStakers(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 38b1671b1..e63367adc 100644 --- a/contracts/contracts/l2/staking/L2Staking.sol +++ b/contracts/contracts/l2/staking/L2Staking.sol @@ -78,9 +78,6 @@ 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 * **********************/ @@ -97,12 +94,6 @@ contract L2Staking is IL2Staking, Staking, OwnableUpgradeable, ReentrancyGuardUp _; } - /// @notice check nonce - modifier checkNonce(uint256 _nonce) { - require(_nonce == nonce, "invalid nonce"); - _; - } - /*************** * Constructor * ***************/ @@ -163,10 +154,8 @@ contract L2Staking is IL2Staking, Staking, OwnableUpgradeable, ReentrancyGuardUp ************************/ /// @notice add staker, sync from L1 - /// @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; + /// @param add staker to add. {addr, tmKey, blsKey} + function addStaker(Types.StakerInfo calldata add) external onlyOtherStaking { if (stakerRankings[add.addr] == 0) { stakerAddresses.push(add.addr); stakerRankings[add.addr] = stakerAddresses.length; @@ -180,62 +169,8 @@ 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 _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; + /// @param remove staker to remove + function removeStakers(address[] calldata remove) external onlyOtherStaking { bool updateSequencerSet = false; for (uint256 i = 0; i < remove.length; i++) { if (stakerRankings[remove[i]] <= latestSequencerSetSize) { @@ -552,10 +487,8 @@ contract L2Staking is IL2Staking, Staking, OwnableUpgradeable, ReentrancyGuardUp if (end > (delegatorsTotalNumber - 1)) { end = delegatorsTotalNumber - 1; } - uint256 i = start; - uint256 j = 0; - while (i <= end) { - delegatorsInPage[j++] = delegators[staker].at(i++); + for (uint256 i = start; i <= end; i++) { + delegatorsInPage[i] = delegators[staker].at(i); } return (delegatorsTotalNumber, delegatorsInPage); } @@ -604,7 +537,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); - require(IMorphToken(MORPH_TOKEN_CONTRACT).transfer(_to, _amount), "transfer failed"); + IMorphToken(MORPH_TOKEN_CONTRACT).transfer(_to, _amount); uint256 balanceAfter = IMorphToken(MORPH_TOKEN_CONTRACT).balanceOf(_to); require(_amount > 0 && balanceAfter - balanceBefore == _amount, "morph token transfer failed"); } @@ -612,7 +545,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); - require(IMorphToken(MORPH_TOKEN_CONTRACT).transferFrom(_from, _to, _amount), "transferFrom failed"); + IMorphToken(MORPH_TOKEN_CONTRACT).transferFrom(_from, _to, _amount); 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/IL2TokenRegistry.sol b/contracts/contracts/l2/system/IL2TokenRegistry.sol new file mode 100644 index 000000000..38db77a4e --- /dev/null +++ b/contracts/contracts/l2/system/IL2TokenRegistry.sol @@ -0,0 +1,261 @@ +// SPDX-License-Identifier: MIT +pragma solidity =0.8.24; + +/** + * @title IL2TokenRegistry + * @dev Interface for L2TokenRegistry contract + * @notice Interface defining all external functions for ERC20 price oracle and token registry + */ +interface IL2TokenRegistry { + /*////////////////////////////////////////////////////////////// + Structs + //////////////////////////////////////////////////////////////*/ + + /// @notice Token information structure + struct TokenInfo { + address tokenAddress; // ERC20 token contract address + bytes32 balanceSlot; // Token balance storage slot + bool isActive; // Whether the token is active + uint8 decimals; // Token decimals + uint256 scale; // Core convention: rateScaled = tokenScale * (tokenPrice / ethPrice) * 10^(ethDecimals - tokenDecimals) + } + + /// @notice Token entry structure containing ID and address + struct TokenEntry { + uint16 tokenID; // Token ID + address tokenAddress; // ERC20 token contract address + } + + /*////////////////////////////////////////////////////////////// + Events + //////////////////////////////////////////////////////////////*/ + + event TokenRegistered( + uint16 indexed tokenID, + address indexed tokenAddress, + bytes32 balanceSlot, + bool isActive, + uint8 decimals, + uint256 scale + ); + event TokenInfoUpdated( + uint16 indexed tokenID, + address indexed tokenAddress, + bytes32 balanceSlot, + bool isActive, + uint8 decimals, + uint256 scale + ); + event TokenActivated(uint16 indexed tokenID); + event TokenDeactivated(uint16 indexed tokenID); + event TokenRemoved(uint16 indexed tokenID, address indexed tokenAddress); + event PriceRatioUpdated(uint16 indexed tokenID, uint256 newPrice); + event TokenScaleUpdated(uint16 indexed tokenID, uint256 newScale); + event AllowListSet(address indexed user, bool val); + event AllowListEnabledUpdated(bool isEnabled); + + /*////////////////////////////////////////////////////////////// + Errors + //////////////////////////////////////////////////////////////*/ + + error TokenIDAlreadyRegistered(); + error TokenAddressAlreadyRegistered(); + error TokenNotFound(); + error InvalidTokenID(); + error InvalidTokenAddress(); + error InvalidBalanceSlot(); + error InvalidScale(); + error InvalidPrice(); + error CallerNotAllowed(); + error InvalidArrayLength(); + error DifferentLength(); + error ZeroTokenAmount(); + + /*////////////////////////////////////////////////////////////// + Allow List Functions + //////////////////////////////////////////////////////////////*/ + + /** + * @notice Set Allow List + * @param user Array of user addresses + * @param val Array of permission values + */ + function setAllowList(address[] memory user, bool[] memory val) external; + + /** + * @notice Set whether Allow List is enabled + * @param _allowListEnabled Whether to enable + */ + function setAllowListEnabled(bool _allowListEnabled) external; + + /*////////////////////////////////////////////////////////////// + Token Registration Functions + //////////////////////////////////////////////////////////////*/ + + /** + * @notice Batch register tokens + * @param _tokenIDs Array of token IDs + * @param _tokenAddresses Array of token addresses + * @param _balanceSlots Array of balance storage slots + * @param _needBalanceSlots Array of boolean flags indicating whether balanceSlot is needed + * @param _scales Array of scale values + */ + function registerTokens( + uint16[] memory _tokenIDs, + address[] memory _tokenAddresses, + bytes32[] memory _balanceSlots, + bool[] memory _needBalanceSlots, + uint256[] memory _scales + ) external; + + /** + * @notice Register a single token + * @param _tokenID Token ID + * @param _tokenAddress Token contract address + * @param _balanceSlot Balance storage slot + * @param _needBalanceSlot Whether balanceSlot is needed (if false, stores 0; if true, stores balanceSlot+1) + * @param _scale Scale value + */ + function registerToken( + uint16 _tokenID, + address _tokenAddress, + bytes32 _balanceSlot, + bool _needBalanceSlot, + uint256 _scale + ) external; + + /** + * @notice Update token information + * @param _tokenID Token ID + * @param _tokenAddress New token contract address + * @param _balanceSlot New balance storage slot + * @param _needBalanceSlot Whether balanceSlot is needed (if false, stores 0; if true, stores balanceSlot+1) + * @param _isActive Whether to activate + * @param _scale Scale value + */ + function updateTokenInfo( + uint16 _tokenID, + address _tokenAddress, + bytes32 _balanceSlot, + bool _needBalanceSlot, + bool _isActive, + uint256 _scale + ) external; + + /** + * @notice Remove a token from registry + * @param _tokenID Token ID to remove + */ + function removeToken(uint16 _tokenID) external; + + /** + * @notice Batch update token activation status + * @param _tokenIDs Array of token IDs + * @param _isActives Array of activation statuses + */ + function batchUpdateTokenStatus(uint16[] memory _tokenIDs, bool[] memory _isActives) external; + + /*////////////////////////////////////////////////////////////// + Price Management Functions + //////////////////////////////////////////////////////////////*/ + + /** + * @notice Update price ratio + * @param _tokenID Token ID + * @param _newPrice New price ratio (relative to ETH) + * @dev priceRatio should follow: priceRatio = tokenScale * (tokenPrice / ethPrice) * 10^(ethDecimals - tokenDecimals) + */ + function updatePriceRatio(uint16 _tokenID, uint256 _newPrice) external; + + /** + * @notice Batch update price ratios + * @param _tokenIDs Array of token IDs + * @param _prices Array of price ratios + */ + function batchUpdatePrices(uint16[] memory _tokenIDs, uint256[] memory _prices) external; + + /** + * @notice Get token price + * @param _tokenID Token ID + * @return price Price ratio + */ + function getTokenPrice(uint16 _tokenID) external view returns (uint256); + + /** + * @notice Calculate the corresponding token amount for a given ETH amount + * @param _tokenID Token ID of the ERC20 token + * @param _ethAmount ETH amount (unit: wei) + * @return tokenAmount Corresponding token amount (unit: token's smallest unit) + */ + function calculateTokenAmount(uint16 _tokenID, uint256 _ethAmount) external view returns (uint256 tokenAmount); + + /** + * @notice Get token information + * @param _tokenID Token ID + * @return info TokenInfo structure with actual balanceSlot (automatically -1 from stored value) + * @return hasBalanceSlot Whether balanceSlot was stored with +1 offset (true = slot was adjusted) + */ + function getTokenInfo(uint16 _tokenID) external view returns (TokenInfo memory info, bool hasBalanceSlot); + + /** + * @notice Get token ID by address + * @param tokenAddress Token address + * @return tokenID Token ID + */ + function getTokenIdByAddress(address tokenAddress) external view returns (uint16); + + /*////////////////////////////////////////////////////////////// + Scale Management Functions + //////////////////////////////////////////////////////////////*/ + + /** + * @notice Update token scale + * @param _tokenID Token ID + * @param _newScale New scale value + */ + function updateTokenScale(uint16 _tokenID, uint256 _newScale) external; + + /** + * @notice Get token scale + * @param _tokenID Token ID + * @return scale Token scale value + */ + function getTokenScale(uint16 _tokenID) external view returns (uint256); + + /*////////////////////////////////////////////////////////////// + View Functions + //////////////////////////////////////////////////////////////*/ + + /** + * @notice Check if token is active + * @param _tokenID Token ID + * @return Whether the token is active + */ + function isTokenActive(uint16 _tokenID) external view returns (bool); + + /** + * @notice Check if a token ID is in the supported list + * @param _tokenID Token ID to check + * @return Whether the token ID is registered + */ + function isTokenSupported(uint16 _tokenID) external view returns (bool); + + /** + * @notice Get all supported token IDs and their addresses + * @return Array of TokenEntry containing token ID and address pairs + */ + function getSupportedTokenList() external view returns (TokenEntry[] memory); + + /** + * @notice Get all supported token IDs + * @return Array of all registered token IDs + */ + function getSupportedIDList() external view returns (uint16[] memory); + + /** + * @notice Get the count of supported tokens + * @return The number of registered tokens + */ + function getSupportedTokenCount() external view returns (uint256); +} + diff --git a/contracts/contracts/l2/system/IMorphToken.sol b/contracts/contracts/l2/system/IMorphToken.sol index 2c95581d1..e4ae59a4e 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/L2TokenRegistry.sol b/contracts/contracts/l2/system/L2TokenRegistry.sol new file mode 100644 index 000000000..3ea5ac4b1 --- /dev/null +++ b/contracts/contracts/l2/system/L2TokenRegistry.sol @@ -0,0 +1,578 @@ +// SPDX-License-Identifier: MIT +pragma solidity =0.8.24; + +import {OwnableUpgradeable} from "@openzeppelin/contracts-upgradeable/access/OwnableUpgradeable.sol"; +import {ReentrancyGuardUpgradeable} from "@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol"; +import {EnumerableSetUpgradeable} from "@openzeppelin/contracts-upgradeable/utils/structs/EnumerableSetUpgradeable.sol"; +import {IL2TokenRegistry} from "./IL2TokenRegistry.sol"; + +interface IERC20Infos { + function decimals() external view returns (uint8); +} + +/** + * @title L2TokenRegistry + * @dev TokenRegistry contract - Used for registering tokenID and managing token information and prices + * @notice In the transaction scenario where ERC20 is used as gas fee payment, used for storing prices and token registration functionality + */ +contract L2TokenRegistry is IL2TokenRegistry, OwnableUpgradeable, ReentrancyGuardUpgradeable { + using EnumerableSetUpgradeable for EnumerableSetUpgradeable.UintSet; + + /// @notice Mapping from tokenID to TokenInfo + mapping(uint16 tokenID => TokenInfo tokenInfo) public tokenRegistry; + + /// @notice Mapping from token address to tokenID + mapping(address tokenAddress => uint16 tokenID) public tokenRegistration; + + /// @notice Mapping from tokenID to price ratio (relative to ETH) + /// @dev priceRatio = tokenScale * (tokenPrice / ethPrice) * 10^(ethDecimals - tokenDecimals) + mapping(uint16 tokenID => uint256 priceRatio) public priceRatio; + + /// @notice Allow List whitelist + mapping(address user => bool allowed) public allowList; + + /// @notice Whether whitelist is enabled + bool public allowListEnabled; + + /// @notice Set of supported token IDs + EnumerableSetUpgradeable.UintSet private supportedTokenSet; + + /*////////////////////////////////////////////////////////////// + Modifier + //////////////////////////////////////////////////////////////*/ + + /** + * @notice Check if caller is in Allow List + */ + modifier onlyAllowed() { + bool isOwner = msg.sender == owner(); + bool isAllowedByList = allowListEnabled && allowList[msg.sender]; + + // Owner always has access + // When allowList is enabled, allowList users can access + // When allowList is disabled, only owner can access + if (!isOwner && !isAllowedByList) { + revert CallerNotAllowed(); + } + _; + } + + /*////////////////////////////////////////////////////////////// + Initializer + //////////////////////////////////////////////////////////////*/ + + /// @custom:oz-upgrades-unsafe-allow constructor + constructor() { + _disableInitializers(); + } + + /** + * @notice Initialize function for proxy deployment + * @param owner_ Contract owner address + */ + function initialize(address owner_) external initializer { + __Ownable_init(); + __ReentrancyGuard_init(); + + _transferOwnership(owner_); + allowListEnabled = true; + } + + /*////////////////////////////////////////////////////////////// + Allow List + //////////////////////////////////////////////////////////////*/ + + /** + * @notice Set Allow List + * @param user Array of user addresses + * @param val Array of permission values + */ + function setAllowList(address[] memory user, bool[] memory val) external onlyOwner { + if (user.length != val.length) revert DifferentLength(); + + for (uint256 i = 0; i < user.length; i++) { + allowList[user[i]] = val[i]; + emit AllowListSet(user[i], val[i]); + } + } + + /** + * @notice Set whether Allow List is enabled + * @param _allowListEnabled Whether to enable + */ + function setAllowListEnabled(bool _allowListEnabled) external onlyOwner { + allowListEnabled = _allowListEnabled; + emit AllowListEnabledUpdated(_allowListEnabled); + } + + /*////////////////////////////////////////////////////////////// + Token Registration + //////////////////////////////////////////////////////////////*/ + + /** + * @notice Batch register tokens + * @param _tokenIDs Array of token IDs + * @param _tokenAddresses Array of token addresses + * @param _balanceSlots Array of balance storage slots + * @param _needBalanceSlots Array of boolean flags indicating whether balanceSlot is needed + * @param _scales Array of scale values + */ + function registerTokens( + uint16[] memory _tokenIDs, + address[] memory _tokenAddresses, + bytes32[] memory _balanceSlots, + bool[] memory _needBalanceSlots, + uint256[] memory _scales + ) external onlyOwner nonReentrant { + if ( + _tokenIDs.length != _tokenAddresses.length || + _tokenIDs.length != _balanceSlots.length || + _tokenIDs.length != _needBalanceSlots.length || + _tokenIDs.length != _scales.length + ) { + revert InvalidArrayLength(); + } + + for (uint256 i = 0; i < _tokenIDs.length; i++) { + _registerSingleToken(_tokenIDs[i], _tokenAddresses[i], _balanceSlots[i], _needBalanceSlots[i], _scales[i]); + } + } + + /** + * @notice Register a single token + * @param _tokenID Token ID + * @param _tokenAddress Token contract address + * @param _balanceSlot Balance storage slot + * @param _needBalanceSlot Whether balanceSlot is needed (if false, stores 0; if true, stores balanceSlot+1) + * @param _scale Scale value + */ + function registerToken( + uint16 _tokenID, + address _tokenAddress, + bytes32 _balanceSlot, + bool _needBalanceSlot, + uint256 _scale + ) external onlyOwner nonReentrant { + _registerSingleToken(_tokenID, _tokenAddress, _balanceSlot, _needBalanceSlot, _scale); + } + + /** + * @notice Internal function: Add token ID to supported list + * @param _tokenID Token ID to add + */ + function _addTokenToList(uint16 _tokenID) internal { + supportedTokenSet.add(uint256(_tokenID)); + } + + /** + * @notice Internal function: Remove token ID from supported list + * @param _tokenID Token ID to remove + */ + function _removeTokenFromList(uint16 _tokenID) internal { + supportedTokenSet.remove(uint256(_tokenID)); + } + + /** + * @notice Internal function: Convert actual balanceSlot to stored value (adds 1 if needed) + * @param _actualSlot The actual balance slot value + * @param _needBalanceSlot Whether balanceSlot is needed + * @return The stored balance slot value (actualSlot + 1 if needed, otherwise 0) + */ + function _toStoredBalanceSlot(bytes32 _actualSlot, bool _needBalanceSlot) internal pure returns (bytes32) { + if (!_needBalanceSlot) { + return bytes32(0); // Don't store balanceSlot + } + if (_actualSlot == bytes32(type(uint256).max)) revert InvalidBalanceSlot(); + bytes32 storedSlot; + assembly { + storedSlot := add(_actualSlot, 1) + } + return storedSlot; + } + + /** + * @notice Internal function: Convert stored balanceSlot to actual value (subtracts 1 if non-zero) + * @param _storedSlot The stored balance slot value + * @return The actual balance slot value (storedSlot - 1 if non-zero, otherwise 0) + */ + function _toActualBalanceSlot(bytes32 _storedSlot) internal pure returns (bytes32) { + if (_storedSlot == bytes32(0)) { + return bytes32(0); // No balanceSlot stored + } + bytes32 actualSlot; + assembly { + actualSlot := sub(_storedSlot, 1) + } + return actualSlot; + } + + /** + * @notice Internal function: Register a single token + */ + function _registerSingleToken( + uint16 _tokenID, + address _tokenAddress, + bytes32 _balanceSlot, + bool _needBalanceSlot, + uint256 _scale + ) internal { + // Check token address + if (_tokenAddress == address(0)) revert InvalidTokenAddress(); + + // Forbid zero ID and enforce uniqueness for both ID and address + if (_tokenID == 0) revert InvalidTokenID(); + if (tokenRegistry[_tokenID].tokenAddress != address(0)) revert TokenIDAlreadyRegistered(); + if (tokenRegistration[_tokenAddress] != 0) revert TokenAddressAlreadyRegistered(); + + // Validate scale is non-zero + if (_scale == 0) revert InvalidScale(); + + // Get decimals from contract + uint8 decimals = 18; // Default value + try IERC20Infos(_tokenAddress).decimals() returns (uint8 v) { + decimals = v; + } catch { + // If call fails, use default value 18 + } + + // Register token (isActive defaults to false) + // Note: balanceSlot is stored as actualSlot + 1 if needBalanceSlot is true, otherwise 0 + tokenRegistry[_tokenID] = TokenInfo({ + tokenAddress: _tokenAddress, + balanceSlot: _toStoredBalanceSlot(_balanceSlot, _needBalanceSlot), + isActive: false, + decimals: decimals, + scale: _scale + }); + tokenRegistration[_tokenAddress] = _tokenID; + _addTokenToList(_tokenID); + emit TokenRegistered(_tokenID, _tokenAddress, _balanceSlot, false, decimals, _scale); + } + + /** + * @notice Update token information + * @param _tokenID Token ID + * @param _tokenAddress New token contract address + * @param _balanceSlot New balance storage slot + * @param _needBalanceSlot Whether balanceSlot is needed (if false, stores 0; if true, stores balanceSlot+1) + * @param _isActive Whether to activate + * @param _scale Scale value + */ + function updateTokenInfo( + uint16 _tokenID, + address _tokenAddress, + bytes32 _balanceSlot, + bool _needBalanceSlot, + bool _isActive, + uint256 _scale + ) external onlyOwner nonReentrant { + // Check if token exists + if (tokenRegistry[_tokenID].tokenAddress == address(0)) revert TokenNotFound(); + + // Check new information + if (_tokenAddress == address(0)) revert InvalidTokenAddress(); + + // Check new scale + if (_scale == 0) revert InvalidScale(); + + // Prevent address being shared across different tokenIDs + uint16 existing = tokenRegistration[_tokenAddress]; + if (existing != 0 && existing != _tokenID) revert TokenAddressAlreadyRegistered(); + + // Get decimals from contract + uint8 decimals = 18; // Default value + try IERC20Infos(_tokenAddress).decimals() returns (uint8 v) { + decimals = v; + } catch { + // If call fails, use default value 18 + } + // Update registration information + // Note: balanceSlot is stored as actualSlot + 1 if needBalanceSlot is true, otherwise 0 + address oldAddress = tokenRegistry[_tokenID].tokenAddress; + tokenRegistry[_tokenID] = TokenInfo({ + tokenAddress: _tokenAddress, + balanceSlot: _toStoredBalanceSlot(_balanceSlot, _needBalanceSlot), + isActive: _isActive, + decimals: decimals, + scale: _scale + }); + + // Update address mapping + if (oldAddress != _tokenAddress) { + delete tokenRegistration[oldAddress]; + tokenRegistration[_tokenAddress] = _tokenID; + } + + // Reset priceRatio to 0 to ensure consistency + // priceRatio depends on scale and decimals, so it must be recalculated after tokenInfo changes + priceRatio[_tokenID] = 0; + + // Note: tokenID should already be in supportedTokenSet from registration + // No need to add again as EnumerableSet.add() is idempotent but wastes gas + + emit TokenInfoUpdated(_tokenID, _tokenAddress, _balanceSlot, _isActive, decimals, _scale); + } + + /** + * @notice Remove a token from registry + * @param _tokenID Token ID to remove + */ + function removeToken(uint16 _tokenID) external onlyOwner { + // Check if token exists + address tokenAddress = tokenRegistry[_tokenID].tokenAddress; + if (tokenAddress == address(0)) revert TokenNotFound(); + + // Check if token is in supported list + if (!supportedTokenSet.contains(uint256(_tokenID))) revert TokenNotFound(); + + // Remove from mappings + delete tokenRegistry[_tokenID]; + delete tokenRegistration[tokenAddress]; + delete priceRatio[_tokenID]; + + // Remove from supported list + _removeTokenFromList(_tokenID); + + emit TokenRemoved(_tokenID, tokenAddress); + } + + /** + * @notice Batch update token activation status + * @param _tokenIDs Array of token IDs + * @param _isActives Array of activation statuses + */ + function batchUpdateTokenStatus(uint16[] calldata _tokenIDs, bool[] calldata _isActives) external onlyOwner { + if (_tokenIDs.length != _isActives.length) revert InvalidArrayLength(); + + for (uint256 i = 0; i < _tokenIDs.length; i++) { + uint16 tokenId = _tokenIDs[i]; + bool newStatus = _isActives[i]; + + if (tokenRegistry[tokenId].tokenAddress == address(0)) continue; + bool oldStatus = tokenRegistry[tokenId].isActive; + + if (oldStatus != newStatus) { + tokenRegistry[tokenId].isActive = newStatus; + if (newStatus) { + emit TokenActivated(tokenId); + } else { + emit TokenDeactivated(tokenId); + } + } + } + } + + /*////////////////////////////////////////////////////////////// + Price Management + //////////////////////////////////////////////////////////////*/ + + /** + * @notice Update price ratio + * @param _tokenID Token ID + * @param _newPrice New price ratio (relative to ETH) + * @dev priceRatio should follow: priceRatio = tokenScale * (tokenPrice / ethPrice) * 10^(ethDecimals - tokenDecimals) + */ + function updatePriceRatio(uint16 _tokenID, uint256 _newPrice) external onlyAllowed { + // Check if token exists + if (tokenRegistry[_tokenID].tokenAddress == address(0)) revert TokenNotFound(); + + if (_newPrice == 0) revert InvalidPrice(); + + priceRatio[_tokenID] = _newPrice; + + emit PriceRatioUpdated(_tokenID, _newPrice); + } + + /** + * @notice Batch update price ratios + * @param _tokenIDs Array of token IDs + * @param _prices Array of price ratios + */ + function batchUpdatePrices(uint16[] memory _tokenIDs, uint256[] memory _prices) external onlyAllowed { + if (_tokenIDs.length != _prices.length) revert InvalidArrayLength(); + + for (uint256 i = 0; i < _tokenIDs.length; i++) { + if (tokenRegistry[_tokenIDs[i]].tokenAddress == address(0)) continue; + if (_prices[i] == 0) continue; + + priceRatio[_tokenIDs[i]] = _prices[i]; + emit PriceRatioUpdated(_tokenIDs[i], _prices[i]); + } + } + + /** + * @notice Get token price + * @param _tokenID Token ID + * @return price Price ratio + */ + function getTokenPrice(uint16 _tokenID) external view returns (uint256) { + // Check if token exists + if (tokenRegistry[_tokenID].tokenAddress == address(0)) revert TokenNotFound(); + + return priceRatio[_tokenID]; + } + + /** + * @notice Calculate the corresponding token amount for a given ETH amount + * @dev Calculation formula: + * - ratio = tokenScale * (tokenPrice / ethPrice) * 10^(ethDecimals - tokenDecimals) + * - tokenAmount = ⌈(ethAmount × tokenScale) / tokenRate⌉ + * - Note: Uses ceiling division to ensure users receive fair token amounts + * @param _tokenID Token ID of the ERC20 token + * @param _ethAmount ETH amount (unit: wei) + * @return tokenAmount Corresponding token amount (unit: token's smallest unit) + * - ratio follows: ratio = tokenScale * (tokenPrice / ethPrice) * 10^(ethDecimals - tokenDecimals) + * - Will revert if token is not registered or priceRatio is not set + */ + function calculateTokenAmount(uint16 _tokenID, uint256 _ethAmount) external view returns (uint256 tokenAmount) { + // Validate: token must be registered + if (tokenRegistry[_tokenID].tokenAddress == address(0)) revert TokenNotFound(); + + // Get token information + TokenInfo memory info = tokenRegistry[_tokenID]; + + // Get priceRatio which follows: + // ratio = tokenScale * (tokenPrice / ethPrice) * 10^(ethDecimals - tokenDecimals) + uint256 ratio = priceRatio[_tokenID]; + if (ratio == 0) revert InvalidPrice(); + + // Calculate token amount with ceiling division: + // tokenAmount = ceil((ethAmount * tokenScale) / ratio) + // Using formula: ceil(a/b) = (a + b - 1) / b + uint256 numerator = _ethAmount * uint256(info.scale); + tokenAmount = (numerator + ratio - 1) / ratio; + + if (tokenAmount == 0) revert ZeroTokenAmount(); + + return tokenAmount; + } + + /** + * @notice Get token information + * @param _tokenID Token ID + * @return info TokenInfo structure with actual balanceSlot (automatically -1 from stored value) + * @return hasBalanceSlot Whether balanceSlot was stored with +1 offset (true = slot was adjusted) + */ + function getTokenInfo(uint16 _tokenID) external view returns (TokenInfo memory info, bool hasBalanceSlot) { + if (tokenRegistry[_tokenID].tokenAddress == address(0)) revert TokenNotFound(); + + info = tokenRegistry[_tokenID]; + // Check if balanceSlot was stored (non-zero means it was stored with +1 offset) + hasBalanceSlot = info.balanceSlot != bytes32(0); + // Convert stored balanceSlot to actual value + info.balanceSlot = _toActualBalanceSlot(info.balanceSlot); + + return (info, hasBalanceSlot); + } + + /** + * @notice Get token ID by address + * @param tokenAddress Token address + * @return tokenID Token ID + */ + function getTokenIdByAddress(address tokenAddress) external view returns (uint16) { + uint16 tokenID = tokenRegistration[tokenAddress]; + if (tokenID == 0 && tokenAddress != address(0)) revert TokenNotFound(); + return tokenID; + } + + /*////////////////////////////////////////////////////////////// + Scale Management + //////////////////////////////////////////////////////////////*/ + + /** + * @notice Update token scale + * @param _tokenID Token ID + * @param _newScale New scale value + * @dev Core convention: rateScaled = tokenScale * (tokenPrice / ethPrice) * 10^(ethDecimals - tokenDecimals) + */ + function updateTokenScale(uint16 _tokenID, uint256 _newScale) external onlyAllowed { + // Check if token exists + if (tokenRegistry[_tokenID].tokenAddress == address(0)) revert TokenNotFound(); + + // Validate scale is non-zero + if (_newScale == 0) revert InvalidScale(); + tokenRegistry[_tokenID].scale = _newScale; + + // Reset priceRatio to 0 to ensure consistency + // priceRatio depends on scale, so it must be recalculated after scale changes + priceRatio[_tokenID] = 0; + + emit TokenScaleUpdated(_tokenID, _newScale); + } + + /** + * @notice Get token scale + * @param _tokenID Token ID + * @return scale Token scale value + */ + function getTokenScale(uint16 _tokenID) external view returns (uint256) { + if (tokenRegistry[_tokenID].tokenAddress == address(0)) revert TokenNotFound(); + return tokenRegistry[_tokenID].scale; + } + + /*////////////////////////////////////////////////////////////// + View Functions + //////////////////////////////////////////////////////////////*/ + /** + * @notice Check if token is active + * @param _tokenID Token ID + * @return Whether the token is active + */ + function isTokenActive(uint16 _tokenID) external view returns (bool) { + if (tokenRegistry[_tokenID].tokenAddress == address(0)) return false; + return tokenRegistry[_tokenID].isActive; + } + + /** + * @notice Check if a token ID is in the supported list + * @param _tokenID Token ID to check + * @return Whether the token ID is registered + */ + function isTokenSupported(uint16 _tokenID) external view returns (bool) { + return supportedTokenSet.contains(uint256(_tokenID)); + } + + /** + * @notice Get all supported token IDs and their addresses + * @return Array of TokenEntry containing token ID and address pairs + */ + function getSupportedTokenList() external view returns (TokenEntry[] memory) { + uint256[] memory values = supportedTokenSet.values(); + TokenEntry[] memory tokenList = new TokenEntry[](values.length); + + for (uint256 i = 0; i < values.length; ++i) { + uint16 tokenID = uint16(values[i]); + address tokenAddress = tokenRegistry[tokenID].tokenAddress; + tokenList[i] = TokenEntry({tokenID: tokenID, tokenAddress: tokenAddress}); + } + + return tokenList; + } + + /** + * @notice Get all supported token IDs + * @return Array of all registered token IDs + */ + function getSupportedIDList() external view returns (uint16[] memory) { + uint256[] memory values = supportedTokenSet.values(); + uint16[] memory tokenIDs = new uint16[](values.length); + + for (uint256 i = 0; i < values.length; ++i) { + tokenIDs[i] = uint16(values[i]); + } + + return tokenIDs; + } + + /** + * @notice Get the count of supported tokens + * @return The number of registered tokens + */ + function getSupportedTokenCount() external view returns (uint256) { + return supportedTokenSet.length(); + } + + // Reserve storage space to allow future layout changes + uint256[50] private __gap; +} diff --git a/contracts/contracts/l2/system/MorphToken.sol b/contracts/contracts/l2/system/MorphToken.sol index d2a98933a..2665d7d9b 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 64aa269fd..84e37863d 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 9ec8f339d..8d0ee03f8 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 fba8d1c9e..2eed96281 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 c138ca636..0a44f01f1 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 52925e8e4..53961f85e 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 bc2254068..000000000 --- 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 1c80a4b25..e043816a3 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 diff --git a/contracts/contracts/libraries/codec/BatchHeaderCodecV1.sol b/contracts/contracts/libraries/codec/BatchHeaderCodecV1.sol new file mode 100644 index 000000000..5bda27769 --- /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 b3278aff1..ed28c3be0 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 new file mode 100644 index 000000000..ed3d19d81 --- /dev/null +++ b/contracts/contracts/libraries/token/FiatTokenV1.sol @@ -0,0 +1,959 @@ +// 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 43e3f8047..03a8387ed 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 ee3be77e9..b549be91d 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 555048c1f..20ce19c20 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/verifier/IRollupVerifier.sol b/contracts/contracts/libraries/verifier/IRollupVerifier.sol index 29473e6f5..de9e56098 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 d2f99aec4..8c1bccf54 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. diff --git a/contracts/contracts/libraries/verifier/IZkEvmVerifier.sol b/contracts/contracts/libraries/verifier/IZkEvmVerifier.sol index 40d5bab18..07f0bad8f 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 087c25f88..cae70f262 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 70326e601..b0db9018c 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 7fd8f3ee2..ee2ae0a0d 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"; diff --git a/contracts/contracts/mock/TestUpgrade.sol b/contracts/contracts/mock/TestUpgrade.sol index b814e62ad..8904035c2 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 e0b5482de..0fec646fa 100644 --- a/contracts/contracts/test/Gov.t.sol +++ b/contracts/contracts/test/Gov.t.sol @@ -6,8 +6,6 @@ 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(); @@ -116,7 +114,6 @@ 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); @@ -179,7 +176,7 @@ contract GovTest is L2StakingBaseTest { assertTrue(passed); assertTrue(executed); - hevm.expectRevert("expired proposalID"); + hevm.expectRevert("voting has ended"); hevm.prank(address(user)); gov.vote(proposalID); hevm.stopPrank(); @@ -233,12 +230,10 @@ 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(nonce, stakerInfo); - nonce++; + l2Staking.addStaker(stakerInfo); } // remove old sequencer @@ -247,7 +242,7 @@ contract GovTest is L2StakingBaseTest { address staker = address(uint160(beginSeq + i)); removed[i] = staker; } - l2Staking.removeStakers(nonce, removed); + l2Staking.removeStakers(removed); hevm.stopPrank(); (, executed) = gov.proposalInfos(proposalID); @@ -438,56 +433,6 @@ 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 */ @@ -529,13 +474,12 @@ contract GovTest is L2StakingBaseTest { assertEq(gov.batchBlockInterval(), 0); assertEq(gov.batchTimeout(), finalizationPeriodSeconds); assertEq(gov.rollupEpoch(), ROLLUP_EPOCH); - assertEq(gov.undeletedProposalStart(), 0); - hevm.prank(address(user)); - gov.cleanUpExpiredProposals(gov.latestExecutedProposalID() - 1); - hevm.stopPrank(); + // undeletedProposalStart slot value is 109 + bytes32 undeletedProposalStartBytes32 = hevm.load(address(gov), bytes32(uint256(109))); + uint256 undeletedProposalStart = uint256(undeletedProposalStartBytes32); - assertEq(gov.undeletedProposalStart(), 1); + assertEq(undeletedProposalStart, gov.currentProposalID()); IGov.ProposalData memory proposal1 = IGov.ProposalData( 100, // batchBlockInterval @@ -566,12 +510,11 @@ contract GovTest is L2StakingBaseTest { assertTrue(passed); assertTrue(executed); - hevm.prank(address(user)); - gov.cleanUpExpiredProposals(gov.latestExecutedProposalID() - 1); - hevm.stopPrank(); + // undeletedProposalStart slot value is 109 + undeletedProposalStartBytes32 = hevm.load(address(gov), bytes32(uint256(109))); + undeletedProposalStart = uint256(undeletedProposalStartBytes32); - assertEq(gov.undeletedProposalStart(), gov.currentProposalID()); - assertEq(gov.undeletedProposalStart(), 2); + assertEq(undeletedProposalStart, gov.currentProposalID()); // test old data uint256 preProposalID = 1; diff --git a/contracts/contracts/test/L1Staking.t.sol b/contracts/contracts/test/L1Staking.t.sol index 3324aa578..825e5040f 100644 --- a/contracts/contracts/test/L1Staking.t.sol +++ b/contracts/contracts/test/L1Staking.t.sol @@ -387,6 +387,12 @@ 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/L2Staking.t.sol b/contracts/contracts/test/L2Staking.t.sol index bd9288372..d2a854cc3 100644 --- a/contracts/contracts/test/L2Staking.t.sol +++ b/contracts/contracts/test/L2Staking.t.sol @@ -156,27 +156,7 @@ contract L2StakingTest is L2StakingBaseTest { // Expect revert due to unauthorized call. hevm.expectRevert("staking: only other staking contract allowed"); - 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); + l2Staking.addStaker(stakerInfo); } /** @@ -190,7 +170,6 @@ 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); @@ -198,8 +177,7 @@ 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(nonce, stakerInfo); - nonce++; + l2Staking.addStaker(stakerInfo); } assertEq(7, l2Staking.getStakerAddressesLength()); hevm.stopPrank(); @@ -237,12 +215,10 @@ 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(nonce, stakerInfo); - nonce++; + l2Staking.addStaker(stakerInfo); } hevm.stopPrank(); for (uint256 i = 0; i < SEQUENCER_SIZE * 2; i++) { @@ -276,11 +252,11 @@ contract L2StakingTest is L2StakingBaseTest { hevm.startPrank(address(l2CrossDomainMessenger)); // Add the staker to the L2Staking contract. - l2Staking.addStaker(0, stakerInfo); + l2Staking.addStaker(stakerInfo); uint256 initialLength = l2Staking.getStakerAddressesLength(); // Add the same staker again to the L2Staking contract. - l2Staking.addStaker(1, stakerInfo); + l2Staking.addStaker(stakerInfo); uint256 finalLength = l2Staking.getStakerAddressesLength(); // Assert that the initial length and the final length are equal. @@ -297,37 +273,7 @@ contract L2StakingTest is L2StakingBaseTest { // Expect revert due to unauthorized call. hevm.expectRevert("staking: only other staking contract allowed"); - 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); + l2Staking.removeStakers(removed); } /** @@ -341,19 +287,17 @@ 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(nonce, stakerInfo); - nonce++; + l2Staking.addStaker(stakerInfo); } address[] memory removed = new address[](2); removed[0] = address(uint160(beginSeq + 1)); removed[1] = address(uint160(beginSeq + 4)); - l2Staking.removeStakers(nonce, removed); + l2Staking.removeStakers(removed); assertEq(sequencer.getSequencerSet2Size(), 4); hevm.stopPrank(); @@ -384,12 +328,10 @@ 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(nonce, stakerInfo); - nonce++; + l2Staking.addStaker(stakerInfo); } // Create an array of addresses that do not exist in the staker set. @@ -398,7 +340,7 @@ contract L2StakingTest is L2StakingBaseTest { removed[1] = address(uint160(2)); uint256 initialLength = l2Staking.getStakerAddressesLength(); - l2Staking.removeStakers(nonce, removed); + l2Staking.removeStakers(removed); uint256 finalLength = l2Staking.getStakerAddressesLength(); // Assert that the initial length and the final length are equal. @@ -420,12 +362,10 @@ 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(nonce, stakerInfo); - nonce++; + l2Staking.addStaker(stakerInfo); } // Create an array of addresses to be removed. @@ -433,10 +373,9 @@ contract L2StakingTest is L2StakingBaseTest { removed[0] = address(uint160(beginSeq + 1)); removed[1] = address(uint160(beginSeq + 4)); - l2Staking.removeStakers(nonce, removed); - nonce++; + l2Staking.removeStakers(removed); uint256 initialLength = l2Staking.getStakerAddressesLength(); - l2Staking.removeStakers(nonce, removed); + l2Staking.removeStakers(removed); uint256 finalLength = l2Staking.getStakerAddressesLength(); // Assert that the initial length and the final length are equal. @@ -696,7 +635,7 @@ contract L2StakingTest is L2StakingBaseTest { hevm.startPrank(address(l2CrossDomainMessenger)); address[] memory removed = new address[](1); removed[0] = firstStaker; - l2Staking.removeStakers(0, removed); + l2Staking.removeStakers(removed); hevm.stopPrank(); // sequenser size decrease @@ -1239,7 +1178,7 @@ contract L2StakingTest is L2StakingBaseTest { l2Staking.claimReward(secondStaker, 2); uint256 balanceAfter = morphToken.balanceOf(bob); - // sequencer size = 3 + // sequncer size = 3 // proposal same blocks in epoch 2 // commission = 1 // alice delegate 5 ether morph token @@ -1331,6 +1270,12 @@ 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); @@ -1341,11 +1286,22 @@ 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(); } @@ -1418,6 +1374,9 @@ 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); @@ -1430,44 +1389,16 @@ 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); @@ -1481,7 +1412,9 @@ 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); @@ -1494,6 +1427,8 @@ 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 ******************** // @@ -1515,7 +1450,9 @@ 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); @@ -1528,6 +1465,8 @@ 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(); } @@ -1585,6 +1524,7 @@ contract L2StakingTest is L2StakingBaseTest { hevm.roll(blocksCountOfEpoch * (3)); hevm.warp(time); _updateDistribute(1); + // console.logUint(morphToken.inflationMintedEpochs()); // *********************************** // uint256 aliceReward1 = distribute.queryUnclaimed(firstStaker, alice); @@ -1592,6 +1532,11 @@ 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"); @@ -1602,6 +1547,8 @@ 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(); @@ -1610,6 +1557,7 @@ contract L2StakingTest is L2StakingBaseTest { hevm.roll(blocksCountOfEpoch * (4)); hevm.warp(time); _updateDistribute(2); + // console.logUint(morphToken.inflationMintedEpochs()); // *********************************** // hevm.startPrank(alice); @@ -1618,15 +1566,23 @@ 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()); // *********************************** // // *********************************** // @@ -1634,6 +1590,7 @@ contract L2StakingTest is L2StakingBaseTest { hevm.roll(blocksCountOfEpoch * (6)); hevm.warp(time); _updateDistribute(4); + // console.logUint(morphToken.inflationMintedEpochs()); // *********************************** // // *********************************** // @@ -1641,6 +1598,7 @@ contract L2StakingTest is L2StakingBaseTest { hevm.roll(blocksCountOfEpoch * (7)); hevm.warp(time); _updateDistribute(5); + // console.logUint(morphToken.inflationMintedEpochs()); // *********************************** // // *********************************** // @@ -1648,6 +1606,7 @@ contract L2StakingTest is L2StakingBaseTest { hevm.roll(blocksCountOfEpoch * (8)); hevm.warp(time); _updateDistribute(6); + // console.logUint(morphToken.inflationMintedEpochs()); // *********************************** // uint256 aliceRewardNew1 = distribute.queryUnclaimed(firstStaker, alice); @@ -1655,124 +1614,50 @@ contract L2StakingTest is L2StakingBaseTest { uint256 aliceRewardNew3 = distribute.queryUnclaimed(thirdStaker, alice); hevm.startPrank(alice); + // console.logString("......................"); balanceBefore = morphToken.balanceOf(alice); uint256 balanceBeforeTmp = balanceBefore; - balanceBeforeTmp = morphToken.balanceOf(alice); + // 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); - - 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(); - } - - /** - * @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); + // console.logString("......................"); - hevm.startPrank(alice); - l2Staking.claimReward(address(0), 0); + assertEq(balanceAfter, balanceBefore + aliceRewardNew1 + aliceRewardNew2 + aliceRewardNew3); hevm.expectRevert("invalid delegator or no remaining reward"); distribute.queryUnclaimed(firstStaker, alice); @@ -1780,16 +1665,6 @@ 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(); } @@ -1897,12 +1772,13 @@ 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(); @@ -1975,6 +1851,11 @@ 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); @@ -1990,6 +1871,11 @@ 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); @@ -1999,12 +1885,22 @@ 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(); } @@ -2097,7 +1993,7 @@ contract L2StakingTest is L2StakingBaseTest { l2Staking.claimReward(firstStaker, 0); uint256 balanceAfter = morphToken.balanceOf(alice); - // sequencer size = 3 + // sequncer 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 @@ -2196,120 +2092,17 @@ contract L2StakingTest is L2StakingBaseTest { l2Staking.delegateStake(thirdStaker, 5 ether); hevm.stopPrank(); - hevm.startPrank(alice1); - morphToken.approve(address(l2Staking), type(uint256).max); - l2Staking.delegateStake(firstStaker, 5 ether); - l2Staking.delegateStake(secondStaker, 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(alice2); - 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(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)); - } + assertEq(delegator0[0], alice); + assertEq(delegator1[0], alice); + assertEq(delegator2[0], alice); } /** diff --git a/contracts/contracts/test/L2TokenRegistry.t.sol b/contracts/contracts/test/L2TokenRegistry.t.sol new file mode 100644 index 000000000..ddefe5165 --- /dev/null +++ b/contracts/contracts/test/L2TokenRegistry.t.sol @@ -0,0 +1,1622 @@ +// SPDX-License-Identifier: MIT +pragma solidity =0.8.24; + +import "forge-std/Test.sol"; + +import {L2TokenRegistry} from "../l2/system/L2TokenRegistry.sol"; +import {IL2TokenRegistry} from "../l2/system/IL2TokenRegistry.sol"; +import {MockERC20} from "@rari-capital/solmate/src/test/utils/mocks/MockERC20.sol"; +import {TransparentUpgradeableProxy} from "@openzeppelin/contracts/proxy/transparent/TransparentUpgradeableProxy.sol"; +import {ProxyAdmin} from "@openzeppelin/contracts/proxy/transparent/ProxyAdmin.sol"; + +contract L2TokenRegistryTest is Test { + L2TokenRegistry internal priceOracle; + L2TokenRegistry internal priceOracleImpl; + ProxyAdmin internal proxyAdmin; + + address internal multisig = address(512); + address internal owner = address(64); + address internal alice = address(128); + address internal bob = address(256); + + MockERC20 internal usdc; + MockERC20 internal usdt; + MockERC20 internal dai; + + uint16 constant TOKEN_ID_USDC = 1; + uint16 constant TOKEN_ID_USDT = 2; + uint16 constant TOKEN_ID_DAI = 3; + + bytes32 constant BALANCE_SLOT_USDC = bytes32(uint256(9)); + bytes32 constant BALANCE_SLOT_USDT = bytes32(uint256(10)); + bytes32 constant BALANCE_SLOT_DAI = bytes32(uint256(11)); + + uint256 constant SCALE_USDC = 1e6; // 10^6 + uint256 constant SCALE_USDT = 1e6; // 10^6 + uint256 constant SCALE_DAI = 1e18; // 10^18 + + function setUp() public { + // Deploy proxy admin + vm.prank(multisig); + proxyAdmin = new ProxyAdmin(); + + // Deploy implementation contract + priceOracleImpl = new L2TokenRegistry(); + + // Deploy proxy and initialize + vm.prank(multisig); + TransparentUpgradeableProxy proxy = new TransparentUpgradeableProxy( + address(priceOracleImpl), + address(proxyAdmin), + abi.encodeWithSelector(L2TokenRegistry.initialize.selector, owner) + ); + + priceOracle = L2TokenRegistry(payable(address(proxy))); + + // Deploy Mock ERC20 tokens + usdc = new MockERC20("USD Coin", "USDC", 6); + usdt = new MockERC20("Tether USD", "USDT", 6); + dai = new MockERC20("Dai Stablecoin", "DAI", 18); + + vm.label(address(usdc), "USDC"); + vm.label(address(usdt), "USDT"); + vm.label(address(dai), "DAI"); + vm.label(address(priceOracle), "L2TokenRegistry"); + vm.label(multisig, "multisig"); + vm.label(alice, "alice"); + vm.label(bob, "bob"); + } + + /*////////////////////////////////////////////////////////////// + Initialization Tests + //////////////////////////////////////////////////////////////*/ + + function test_initialize_succeeds() public { + assertEq(priceOracle.owner(), owner); + assertTrue(priceOracle.allowListEnabled()); + } + + function test_initialize_reverts_when_not_called_via_proxy() public { + L2TokenRegistry impl = new L2TokenRegistry(); + vm.expectRevert(); + impl.initialize(owner); + } + + /*////////////////////////////////////////////////////////////// + Token Registration Tests + //////////////////////////////////////////////////////////////*/ + + function test_registerToken_succeeds() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + (L2TokenRegistry.TokenInfo memory info, bool hasBalanceSlot) = priceOracle.getTokenInfo(TOKEN_ID_USDC); + assertEq(info.tokenAddress, address(usdc)); + assertEq(info.balanceSlot, BALANCE_SLOT_USDC); + assertEq(info.isActive, false); + assertEq(info.decimals, 6); + assertTrue(hasBalanceSlot); + } + + function test_registerToken_reverts_when_tokenID_is_zero() public { + vm.expectRevert(bytes4(keccak256("InvalidTokenID()"))); + vm.prank(owner); + priceOracle.registerToken(0, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + } + + function test_registerToken_reverts_when_tokenID_already_registered() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + vm.expectRevert(bytes4(keccak256("TokenIDAlreadyRegistered()"))); + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdt), BALANCE_SLOT_USDT, true, SCALE_USDT); + } + + function test_registerToken_reverts_when_address_already_registered() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + vm.expectRevert(bytes4(keccak256("TokenAddressAlreadyRegistered()"))); + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDT, address(usdc), BALANCE_SLOT_USDT, true, SCALE_USDT); + } + + function test_registerToken_autoFetchesDecimals() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + (L2TokenRegistry.TokenInfo memory info, ) = priceOracle.getTokenInfo(TOKEN_ID_USDC); + assertEq(info.decimals, 6); // USDC has 6 decimals + + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_DAI, address(dai), BALANCE_SLOT_DAI, true, SCALE_DAI); + + (info, ) = priceOracle.getTokenInfo(TOKEN_ID_DAI); + assertEq(info.decimals, 18); // DAI has 18 decimals + } + + function test_registerToken_setsIsActiveToFalse() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + (L2TokenRegistry.TokenInfo memory info, ) = priceOracle.getTokenInfo(TOKEN_ID_USDC); + assertFalse(info.isActive); + } + + function test_registerToken_reverts_when_not_owner() public { + vm.expectRevert("Ownable: caller is not the owner"); + vm.prank(alice); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + } + + function test_registerToken_reverts_when_tokenAddress_zero() public { + vm.expectRevert(bytes4(keccak256("InvalidTokenAddress()"))); + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(0), BALANCE_SLOT_USDC, true, SCALE_USDC); + } + + function test_registerTokens_succeeds() public { + uint16[] memory tokenIDs = new uint16[](3); + address[] memory tokenAddresses = new address[](3); + bytes32[] memory balanceSlots = new bytes32[](3); + + tokenIDs[0] = TOKEN_ID_USDC; + tokenIDs[1] = TOKEN_ID_USDT; + tokenIDs[2] = TOKEN_ID_DAI; + + tokenAddresses[0] = address(usdc); + tokenAddresses[1] = address(usdt); + tokenAddresses[2] = address(dai); + + balanceSlots[0] = BALANCE_SLOT_USDC; + balanceSlots[1] = BALANCE_SLOT_USDT; + balanceSlots[2] = BALANCE_SLOT_DAI; + + bool[] memory needBalanceSlots = new bool[](3); + needBalanceSlots[0] = true; + needBalanceSlots[1] = true; + needBalanceSlots[2] = true; + + uint256[] memory scales = new uint256[](3); + scales[0] = SCALE_USDC; + scales[1] = SCALE_USDT; + scales[2] = SCALE_DAI; + + vm.prank(owner); + priceOracle.registerTokens(tokenIDs, tokenAddresses, balanceSlots, needBalanceSlots, scales); + + (L2TokenRegistry.TokenInfo memory infoUSDC, ) = priceOracle.getTokenInfo(TOKEN_ID_USDC); + (L2TokenRegistry.TokenInfo memory infoUSDT, ) = priceOracle.getTokenInfo(TOKEN_ID_USDT); + (L2TokenRegistry.TokenInfo memory infoDAI, ) = priceOracle.getTokenInfo(TOKEN_ID_DAI); + assertEq(infoUSDC.tokenAddress, address(usdc)); + assertEq(infoUSDT.tokenAddress, address(usdt)); + assertEq(infoDAI.tokenAddress, address(dai)); + } + + function test_registerTokens_reverts_when_arrayLength_mismatch() public { + uint16[] memory tokenIDs = new uint16[](2); + address[] memory tokenAddresses = new address[](3); + bytes32[] memory balanceSlots = new bytes32[](2); + bool[] memory needBalanceSlots = new bool[](2); + uint256[] memory scales = new uint256[](2); + + vm.expectRevert(bytes4(keccak256("InvalidArrayLength()"))); + vm.prank(owner); + priceOracle.registerTokens(tokenIDs, tokenAddresses, balanceSlots, needBalanceSlots, scales); + } + + function test_getTokenIdByAddress_succeeds() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + uint16 tokenID = priceOracle.getTokenIdByAddress(address(usdc)); + assertEq(tokenID, TOKEN_ID_USDC); + } + + function test_getTokenIdByAddress_reverts_when_not_registered() public { + vm.expectRevert(bytes4(keccak256("TokenNotFound()"))); + priceOracle.getTokenIdByAddress(address(usdc)); + } + + /*////////////////////////////////////////////////////////////// + BalanceSlot Storage Tests + //////////////////////////////////////////////////////////////*/ + + function test_balanceSlot_storage_query_with_minus_one() public { + // Register token with balanceSlot = 9 + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + // Get balanceSlot through getTokenInfo (should return actual value = 9) + (L2TokenRegistry.TokenInfo memory info, bool hasBalanceSlot) = priceOracle.getTokenInfo(TOKEN_ID_USDC); + assertEq(info.balanceSlot, BALANCE_SLOT_USDC); + assertTrue(hasBalanceSlot); + + // Read balanceSlot directly from storage + // tokenRegistry is at slot 151 + // TokenInfo struct layout: + // - slot 0: tokenAddress (20 bytes) + // - slot 1: balanceSlot (32 bytes) + // - slot 2: isActive (1 byte) + decimals (1 byte) + scale (32 bytes packed) + uint256 mappingSlot = 151; + + // Calculate storage location: keccak256(tokenID || mappingSlot) + bytes32 key = keccak256(abi.encode(TOKEN_ID_USDC, mappingSlot)); + + // balanceSlot is stored in key + 1 + bytes32 balanceSlotStorageLocation = bytes32(uint256(key) + 1); + + // Read stored value from storage + bytes32 storedBalanceSlot = vm.load(address(priceOracle), balanceSlotStorageLocation); + + // Stored value should be actualSlot + 1 = 9 + 1 = 10 + assertEq(uint256(storedBalanceSlot), uint256(BALANCE_SLOT_USDC) + 1); + + // Apply -1 to get actual value + bytes32 actualBalanceSlot = bytes32(uint256(storedBalanceSlot) - 1); + + // Verify that manual -1 gives us the same value as getTokenInfo + assertEq(actualBalanceSlot, BALANCE_SLOT_USDC); + assertEq(actualBalanceSlot, info.balanceSlot); + } + + function test_balanceSlot_storage_query_with_slot_zero() public { + // Test with balanceSlot = 0 (edge case) + bytes32 balanceSlot0 = bytes32(uint256(0)); + + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDT, address(usdt), balanceSlot0, true, SCALE_USDT); + + // Get balanceSlot through getTokenInfo (should return actual value = 0) + (L2TokenRegistry.TokenInfo memory info, bool hasBalanceSlot) = priceOracle.getTokenInfo(TOKEN_ID_USDT); + assertEq(info.balanceSlot, balanceSlot0); + assertTrue(hasBalanceSlot); // Even slot 0 is a valid stored slot + + // Read balanceSlot directly from storage + uint256 mappingSlot = 151; + bytes32 key = keccak256(abi.encode(TOKEN_ID_USDT, mappingSlot)); + bytes32 balanceSlotStorageLocation = bytes32(uint256(key) + 1); + bytes32 storedBalanceSlot = vm.load(address(priceOracle), balanceSlotStorageLocation); + + // Stored value should be actualSlot + 1 = 0 + 1 = 1 + assertEq(uint256(storedBalanceSlot), 1); + + // Apply -1 to get actual value + bytes32 actualBalanceSlot = bytes32(uint256(storedBalanceSlot) - 1); + + // Verify that manual -1 gives us 0 + assertEq(actualBalanceSlot, balanceSlot0); + assertEq(uint256(actualBalanceSlot), 0); + assertEq(actualBalanceSlot, info.balanceSlot); + } + + function test_balanceSlot_storage_query_multiple_tokens() public { + // Register multiple tokens with different balanceSlots + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), bytes32(uint256(9)), true, SCALE_USDC); + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDT, address(usdt), bytes32(uint256(10)), true, SCALE_USDT); + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_DAI, address(dai), bytes32(uint256(11)), true, SCALE_DAI); + + uint256 mappingSlot = 151; + + // Verify USDC: stored=10, actual=9 + bytes32 key = keccak256(abi.encode(TOKEN_ID_USDC, mappingSlot)); + bytes32 storedValue = vm.load(address(priceOracle), bytes32(uint256(key) + 1)); + assertEq(uint256(storedValue), 10); + (L2TokenRegistry.TokenInfo memory infoUSDC, ) = priceOracle.getTokenInfo(TOKEN_ID_USDC); + assertEq(bytes32(uint256(storedValue) - 1), infoUSDC.balanceSlot); + + // Verify USDT: stored=11, actual=10 + key = keccak256(abi.encode(TOKEN_ID_USDT, mappingSlot)); + storedValue = vm.load(address(priceOracle), bytes32(uint256(key) + 1)); + assertEq(uint256(storedValue), 11); + (L2TokenRegistry.TokenInfo memory infoUSDT, ) = priceOracle.getTokenInfo(TOKEN_ID_USDT); + assertEq(bytes32(uint256(storedValue) - 1), infoUSDT.balanceSlot); + + // Verify DAI: stored=12, actual=11 + key = keccak256(abi.encode(TOKEN_ID_DAI, mappingSlot)); + storedValue = vm.load(address(priceOracle), bytes32(uint256(key) + 1)); + assertEq(uint256(storedValue), 12); + (L2TokenRegistry.TokenInfo memory infoDAI, ) = priceOracle.getTokenInfo(TOKEN_ID_DAI); + assertEq(bytes32(uint256(storedValue) - 1), infoDAI.balanceSlot); + } + + function test_balanceSlot_storage_query_needBalanceSlot_false() public { + // Test with needBalanceSlot = false (token doesn't need balanceSlot) + bytes32 anySlot = bytes32(uint256(999)); // Value doesn't matter when needBalanceSlot = false + uint16 tokenID = 100; + + vm.prank(owner); + priceOracle.registerToken(tokenID, address(usdc), anySlot, false, SCALE_USDC); + + // Get balanceSlot through getTokenInfo (should return 0 because needBalanceSlot was false) + (L2TokenRegistry.TokenInfo memory info, bool hasBalanceSlot) = priceOracle.getTokenInfo(tokenID); + assertEq(info.balanceSlot, bytes32(0)); + assertFalse(hasBalanceSlot); // No balanceSlot was stored + + // Read balanceSlot directly from storage + uint256 mappingSlot = 151; + bytes32 key = keccak256(abi.encode(tokenID, mappingSlot)); + bytes32 balanceSlotStorageLocation = bytes32(uint256(key) + 1); + bytes32 storedBalanceSlot = vm.load(address(priceOracle), balanceSlotStorageLocation); + + // When needBalanceSlot = false, stored value should be 0 (no +1) + assertEq(uint256(storedBalanceSlot), 0); + + // getTokenInfo should return 0 (no -1 conversion needed) + assertEq(info.balanceSlot, bytes32(0)); + } + + function test_balanceSlot_reverts_when_max_uint256() public { + // Test that registering with max uint256 as balanceSlot reverts + bytes32 maxSlot = bytes32(type(uint256).max); + uint16 tokenID = 101; + + vm.expectRevert(bytes4(keccak256("InvalidBalanceSlot()"))); + vm.prank(owner); + priceOracle.registerToken(tokenID, address(usdc), maxSlot, true, SCALE_USDC); + } + + function test_registerToken_reverts_when_scale_is_zero() public { + // Test that registering with scale = 0 reverts + bytes32 balanceSlot = bytes32(uint256(9)); + uint16 tokenID = 102; + + vm.expectRevert(bytes4(keccak256("InvalidScale()"))); + vm.prank(owner); + priceOracle.registerToken(tokenID, address(usdc), balanceSlot, true, 0); + } + + /*////////////////////////////////////////////////////////////// + Token Update Tests + //////////////////////////////////////////////////////////////*/ + + function test_updateTokenInfo_succeeds() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + bytes32 newBalanceSlot = bytes32(uint256(99)); + vm.prank(owner); + priceOracle.updateTokenInfo(TOKEN_ID_USDC, address(usdc), newBalanceSlot, true, true, SCALE_USDC); + + (L2TokenRegistry.TokenInfo memory info, bool hasBalanceSlot) = priceOracle.getTokenInfo(TOKEN_ID_USDC); + assertEq(info.balanceSlot, newBalanceSlot); + assertTrue(info.isActive); + assertTrue(hasBalanceSlot); + } + + function test_updateTokenInfo_reverts_when_address_collision() public { + // Register two tokens + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDT, address(usdt), BALANCE_SLOT_USDT, true, SCALE_USDT); + + // Try to update USDT to use USDC's address - should revert + vm.expectRevert(bytes4(keccak256("TokenAddressAlreadyRegistered()"))); + vm.prank(owner); + priceOracle.updateTokenInfo(TOKEN_ID_USDT, address(usdc), BALANCE_SLOT_USDT, true, true, SCALE_USDT); + } + + function test_updateTokenInfo_autoFetchesDecimals() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + // Update to DAI address + vm.prank(owner); + priceOracle.updateTokenInfo(TOKEN_ID_USDC, address(dai), BALANCE_SLOT_USDC, true, true, SCALE_DAI); + + (L2TokenRegistry.TokenInfo memory info, ) = priceOracle.getTokenInfo(TOKEN_ID_USDC); + assertEq(info.tokenAddress, address(dai)); + assertEq(info.decimals, 18); // Should fetch DAI's decimals + } + + function test_updateTokenInfo_reverts_when_scale_is_zero() public { + // First register a token + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + // Try to update with scale = 0 + vm.expectRevert(bytes4(keccak256("InvalidScale()"))); + vm.prank(owner); + priceOracle.updateTokenInfo(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, true, 0); + } + + function test_deactivateToken_succeeds() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + vm.prank(owner); + priceOracle.updateTokenInfo(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, true, SCALE_USDC); + + (L2TokenRegistry.TokenInfo memory infoActive, ) = priceOracle.getTokenInfo(TOKEN_ID_USDC); + assertTrue(infoActive.isActive); + + // Use batchUpdateTokenStatus to deactivate token + uint16[] memory tokenIDs = new uint16[](1); + bool[] memory isActives = new bool[](1); + tokenIDs[0] = TOKEN_ID_USDC; + isActives[0] = false; + + vm.prank(owner); + priceOracle.batchUpdateTokenStatus(tokenIDs, isActives); + + (L2TokenRegistry.TokenInfo memory infoDeactivated, ) = priceOracle.getTokenInfo(TOKEN_ID_USDC); + assertFalse(infoDeactivated.isActive); + } + + /*////////////////////////////////////////////////////////////// + Price Management Tests + //////////////////////////////////////////////////////////////*/ + + function test_updatePriceRatio_succeeds() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + // Set price: 1 USDC = 0.000001 ETH = 1e12 wei + uint256 priceRatio = 1e12; + + vm.prank(owner); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, priceRatio); + + assertEq(priceOracle.getTokenPrice(TOKEN_ID_USDC), priceRatio); + } + + function test_updatePriceRatio_reverts_when_not_allowed() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + vm.expectRevert(bytes4(keccak256("CallerNotAllowed()"))); + vm.prank(alice); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 1e12); + } + + function test_updatePriceRatio_reverts_when_allowListDisabled_and_not_owner() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + vm.prank(owner); + priceOracle.setAllowListEnabled(false); + + // When allowList is disabled, only owner can access + vm.expectRevert(bytes4(keccak256("CallerNotAllowed()"))); + vm.prank(alice); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 1e12); + } + + function test_updatePriceRatio_succeeds_when_allowListDisabled_and_owner() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + vm.prank(owner); + priceOracle.setAllowListEnabled(false); + + // Owner can still access when allowList is disabled + vm.prank(owner); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 1e12); + + assertEq(priceOracle.getTokenPrice(TOKEN_ID_USDC), 1e12); + } + + function test_updatePriceRatio_succeeds_when_in_allowList() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + address[] memory users = new address[](1); + bool[] memory allowed = new bool[](1); + users[0] = alice; + allowed[0] = true; + + vm.prank(owner); + priceOracle.setAllowList(users, allowed); + + vm.prank(alice); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 1e12); + + assertEq(priceOracle.getTokenPrice(TOKEN_ID_USDC), 1e12); + } + + function test_updatePriceRatio_reverts_when_invalid_price() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + vm.expectRevert(bytes4(keccak256("InvalidPrice()"))); + vm.prank(owner); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 0); + } + + function test_batchUpdatePrices_succeeds() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDT, address(usdt), BALANCE_SLOT_USDT, true, SCALE_USDT); + + uint16[] memory tokenIDs = new uint16[](2); + uint256[] memory prices = new uint256[](2); + + tokenIDs[0] = TOKEN_ID_USDC; + tokenIDs[1] = TOKEN_ID_USDT; + prices[0] = 1e12; + prices[1] = 1e12; + + vm.prank(owner); + priceOracle.batchUpdatePrices(tokenIDs, prices); + + assertEq(priceOracle.getTokenPrice(TOKEN_ID_USDC), 1e12); + assertEq(priceOracle.getTokenPrice(TOKEN_ID_USDT), 1e12); + } + + /*////////////////////////////////////////////////////////////// + Gas Price Calculation Tests + //////////////////////////////////////////////////////////////*/ + + function test_calculateTokenGasPrice_succeeds() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + // Set price: 1 USDC = 0.000001 ETH = 1e12 wei + vm.prank(owner); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 1e12); + + // ETH gas price = 1 gwei = 1e9 wei + uint256 ethGasPrice = 1 gwei; + uint256 expectedTokenAmount = (ethGasPrice * SCALE_USDC) / 1e12; // (1e9 * 1e6) / 1e12 = 1e3 + + uint256 tokenGasAmount = priceOracle.calculateTokenAmount(TOKEN_ID_USDC, ethGasPrice); + assertEq(tokenGasAmount, expectedTokenAmount); + } + + function test_calculateEthGasPrice_succeeds() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + // Set price: 1 USDC = 0.000001 ETH = 1e12 wei + vm.prank(owner); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 1e12); + + // Token gas price = 1000 USDC + uint256 tokenGasPrice = 1000; + uint256 expectedEthGasPrice = (tokenGasPrice * 1e12) / SCALE_USDC; // (1000 * 1e12) / 1e6 = 1e9 + + // Inverse using on-chain values + uint256 ratio = priceOracle.getTokenPrice(TOKEN_ID_USDC); + (L2TokenRegistry.TokenInfo memory info, ) = priceOracle.getTokenInfo(TOKEN_ID_USDC); + uint256 ethGasPrice = (tokenGasPrice * ratio) / info.scale; + assertEq(ethGasPrice, expectedEthGasPrice); + } + + function test_calculateTokenGasPrice_withDAI() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_DAI, address(dai), BALANCE_SLOT_DAI, true, SCALE_DAI); + + // Set price: 1 DAI = 0.001 ETH = 1e15 wei + vm.prank(owner); + priceOracle.updatePriceRatio(TOKEN_ID_DAI, 1e15); + + // ETH gas price = 1 gwei = 1e9 wei + uint256 ethGasPrice = 1 gwei; + uint256 expectedTokenGasPrice = (ethGasPrice * SCALE_DAI) / 1e15; // (1e9 * 1e18) / 1e15 = 1e12 + + uint256 tokenGasPrice = priceOracle.calculateTokenAmount(TOKEN_ID_DAI, ethGasPrice); + assertEq(tokenGasPrice, expectedTokenGasPrice); + } + + function test_calculateTokenAmount_ceiling_division() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + // Set price ratio that will result in a remainder + vm.prank(owner); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 7e11); // Custom ratio for testing + + // Test case 1: Division with remainder + // numerator = 10 * 1e6 = 1e7 + // ratio = 7e11 + // Floor division: 1e7 / 7e11 = 0 (rounds down) + // Ceiling division: ceil(1e7 / 7e11) = 1 (rounds up) + uint256 ethAmount1 = 10; + uint256 tokenAmount1 = priceOracle.calculateTokenAmount(TOKEN_ID_USDC, ethAmount1); + uint256 numerator1 = ethAmount1 * SCALE_USDC; + uint256 expectedCeiling1 = (numerator1 + 7e11 - 1) / 7e11; + assertEq(tokenAmount1, expectedCeiling1); + assertGt(tokenAmount1, numerator1 / 7e11); // Should be greater than floor division + + // Test case 2: Exact division (no remainder) + // numerator = 7e11 * 1e6 = 7e17 + // ratio = 7e11 + // Division: 7e17 / 7e11 = 1e6 + uint256 ethAmount2 = 7e11; + uint256 tokenAmount2 = priceOracle.calculateTokenAmount(TOKEN_ID_USDC, ethAmount2); + assertEq(tokenAmount2, 1e6); + + // Test case 3: Large amount with small remainder + // numerator = 1e15 * 1e6 = 1e21 + // ratio = 7e11 + // Floor: 1e21 / 7e11 = 1428571428571 (approximately 1.43e12) + // Ceiling: ceil(1e21 / 7e11) = 1428571428572 + uint256 ethAmount3 = 1e15; + uint256 tokenAmount3 = priceOracle.calculateTokenAmount(TOKEN_ID_USDC, ethAmount3); + uint256 numerator3 = ethAmount3 * SCALE_USDC; + uint256 expectedCeiling3 = (numerator3 + 7e11 - 1) / 7e11; + assertEq(tokenAmount3, expectedCeiling3); + + // Verify ceiling behavior: result should be greater than floor when there's a remainder + if (numerator3 % 7e11 > 0) { + assertGt(tokenAmount3, numerator3 / 7e11); + } + } + + function test_calculateTokenAmount_reverts_when_ethAmount_is_zero() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + vm.prank(owner); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 1e12); + + // Try to calculate with ethAmount = 0, should revert with ZeroTokenAmount + vm.expectRevert(bytes4(keccak256("ZeroTokenAmount()"))); + priceOracle.calculateTokenAmount(TOKEN_ID_USDC, 0); + } + + /*////////////////////////////////////////////////////////////// + Allow List Tests + //////////////////////////////////////////////////////////////*/ + + /*////////////////////////////////////////////////////////////// + onlyAllowed Modifier Tests + //////////////////////////////////////////////////////////////*/ + + /// @notice Test: Owner always has access regardless of allowList status + function test_onlyAllowed_owner_always_has_access() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + // Case 1: allowListEnabled = true, owner not in allowList + assertTrue(priceOracle.allowListEnabled()); + assertFalse(priceOracle.allowList(owner)); + + vm.prank(owner); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 1e12); + assertEq(priceOracle.getTokenPrice(TOKEN_ID_USDC), 1e12); + + // Case 2: allowListEnabled = false + vm.prank(owner); + priceOracle.setAllowListEnabled(false); + + vm.prank(owner); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 2e12); + assertEq(priceOracle.getTokenPrice(TOKEN_ID_USDC), 2e12); + } + + /// @notice Test: AllowList user can access when allowList is enabled + function test_onlyAllowed_allowListUser_succeeds_when_enabled() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + // Add alice to allowList + address[] memory users = new address[](1); + bool[] memory allowed = new bool[](1); + users[0] = alice; + allowed[0] = true; + + vm.prank(owner); + priceOracle.setAllowList(users, allowed); + + // allowListEnabled = true, alice in allowList -> should succeed + vm.prank(alice); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 1e12); + assertEq(priceOracle.getTokenPrice(TOKEN_ID_USDC), 1e12); + } + + /// @notice Test: Non-allowList user cannot access when allowList is enabled + function test_onlyAllowed_nonAllowListUser_reverts_when_enabled() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + // allowListEnabled = true, bob not in allowList -> should revert + assertTrue(priceOracle.allowListEnabled()); + assertFalse(priceOracle.allowList(bob)); + + vm.expectRevert(bytes4(keccak256("CallerNotAllowed()"))); + vm.prank(bob); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 1e12); + } + + /// @notice Test: Only owner can access when allowList is disabled + function test_onlyAllowed_onlyOwner_when_disabled() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + // Add alice to allowList first + address[] memory users = new address[](1); + bool[] memory allowed = new bool[](1); + users[0] = alice; + allowed[0] = true; + + vm.prank(owner); + priceOracle.setAllowList(users, allowed); + + // Disable allowList + vm.prank(owner); + priceOracle.setAllowListEnabled(false); + + // Even though alice is in allowList, she cannot access when allowList is disabled + vm.expectRevert(bytes4(keccak256("CallerNotAllowed()"))); + vm.prank(alice); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 1e12); + + // Bob (not in allowList) also cannot access + vm.expectRevert(bytes4(keccak256("CallerNotAllowed()"))); + vm.prank(bob); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 1e12); + + // Only owner can access + vm.prank(owner); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 1e12); + assertEq(priceOracle.getTokenPrice(TOKEN_ID_USDC), 1e12); + } + + /// @notice Test: User removed from allowList cannot access anymore + function test_onlyAllowed_removedUser_reverts() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + // Add alice to allowList + address[] memory users = new address[](1); + bool[] memory allowed = new bool[](1); + users[0] = alice; + allowed[0] = true; + + vm.prank(owner); + priceOracle.setAllowList(users, allowed); + + // alice can access + vm.prank(alice); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 1e12); + assertEq(priceOracle.getTokenPrice(TOKEN_ID_USDC), 1e12); + + // Remove alice from allowList + allowed[0] = false; + vm.prank(owner); + priceOracle.setAllowList(users, allowed); + + // alice cannot access anymore + vm.expectRevert(bytes4(keccak256("CallerNotAllowed()"))); + vm.prank(alice); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 2e12); + } + + /// @notice Test: Multiple users in allowList can all access + function test_onlyAllowed_multipleUsers_succeed() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + // Add both alice and bob to allowList + address[] memory users = new address[](2); + bool[] memory allowed = new bool[](2); + users[0] = alice; + users[1] = bob; + allowed[0] = true; + allowed[1] = true; + + vm.prank(owner); + priceOracle.setAllowList(users, allowed); + + // Both alice and bob can access + vm.prank(alice); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 1e12); + assertEq(priceOracle.getTokenPrice(TOKEN_ID_USDC), 1e12); + + vm.prank(bob); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 2e12); + assertEq(priceOracle.getTokenPrice(TOKEN_ID_USDC), 2e12); + } + + /// @notice Test: onlyAllowed modifier logic summary table + /// | isOwner | allowListEnabled | inAllowList | Result | + /// |---------|------------------|-------------|---------| + /// | true | true | true | ALLOWED | + /// | true | true | false | ALLOWED | + /// | true | false | true | ALLOWED | + /// | true | false | false | ALLOWED | + /// | false | true | true | ALLOWED | + /// | false | true | false | REVERT | + /// | false | false | true | REVERT | + /// | false | false | false | REVERT | + function test_onlyAllowed_comprehensive_logic() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + // Setup: add alice to allowList, bob is not in allowList + address[] memory users = new address[](1); + bool[] memory allowed = new bool[](1); + users[0] = alice; + allowed[0] = true; + vm.prank(owner); + priceOracle.setAllowList(users, allowed); + + // Case: allowListEnabled = true + assertTrue(priceOracle.allowListEnabled()); + + // Owner (not in list) -> ALLOWED + vm.prank(owner); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 1e12); + + // Alice (in list) -> ALLOWED + vm.prank(alice); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 2e12); + + // Bob (not in list) -> REVERT + vm.expectRevert(bytes4(keccak256("CallerNotAllowed()"))); + vm.prank(bob); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 3e12); + + // Case: allowListEnabled = false + vm.prank(owner); + priceOracle.setAllowListEnabled(false); + + // Owner -> ALLOWED + vm.prank(owner); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 4e12); + + // Alice (even in list) -> REVERT (allowList disabled means only owner) + vm.expectRevert(bytes4(keccak256("CallerNotAllowed()"))); + vm.prank(alice); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 5e12); + + // Bob -> REVERT + vm.expectRevert(bytes4(keccak256("CallerNotAllowed()"))); + vm.prank(bob); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 6e12); + } + + function test_setAllowList_succeeds() public { + address[] memory users = new address[](2); + bool[] memory allowed = new bool[](2); + + users[0] = alice; + users[1] = bob; + allowed[0] = true; + allowed[1] = false; + + vm.prank(owner); + priceOracle.setAllowList(users, allowed); + + assertTrue(priceOracle.allowList(alice)); + assertFalse(priceOracle.allowList(bob)); + } + + function test_setAllowList_reverts_when_different_length() public { + address[] memory users = new address[](2); + bool[] memory allowed = new bool[](1); + + vm.expectRevert(bytes4(keccak256("DifferentLength()"))); + vm.prank(owner); + priceOracle.setAllowList(users, allowed); + } + + function test_setAllowListEnabled_succeeds() public { + vm.prank(owner); + priceOracle.setAllowListEnabled(false); + + assertFalse(priceOracle.allowListEnabled()); + + vm.prank(owner); + priceOracle.setAllowListEnabled(true); + + assertTrue(priceOracle.allowListEnabled()); + } + + /*////////////////////////////////////////////////////////////// + View Functions Tests + //////////////////////////////////////////////////////////////*/ + + function test_isTokenActive_succeeds() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + assertFalse(priceOracle.isTokenActive(TOKEN_ID_USDC)); + + vm.prank(owner); + priceOracle.updateTokenInfo(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, true, SCALE_USDC); + + assertTrue(priceOracle.isTokenActive(TOKEN_ID_USDC)); + } + + function test_isTokenActive_returns_false_for_nonexistent_token() public { + assertFalse(priceOracle.isTokenActive(TOKEN_ID_USDC)); + } + + /*////////////////////////////////////////////////////////////// + Supported Token List Tests + //////////////////////////////////////////////////////////////*/ + + function test_isTokenSupported_returns_false_when_not_registered() public { + assertFalse(priceOracle.isTokenSupported(TOKEN_ID_USDC)); + } + + function test_isTokenSupported_returns_true_when_registered() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + assertTrue(priceOracle.isTokenSupported(TOKEN_ID_USDC)); + } + + function test_getSupportedTokenCount_returns_zero_initially() public { + assertEq(priceOracle.getSupportedTokenCount(), 0); + } + + function test_getSupportedTokenCount_increments_on_register() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + assertEq(priceOracle.getSupportedTokenCount(), 1); + + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDT, address(usdt), BALANCE_SLOT_USDT, true, SCALE_USDT); + assertEq(priceOracle.getSupportedTokenCount(), 2); + + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_DAI, address(dai), BALANCE_SLOT_DAI, true, SCALE_DAI); + assertEq(priceOracle.getSupportedTokenCount(), 3); + } + + function test_getSupportedIDList_returns_empty_when_no_tokens() public { + uint16[] memory tokenIDs = priceOracle.getSupportedIDList(); + assertEq(tokenIDs.length, 0); + } + + function test_getSupportedIDList_returns_all_registered_tokenIDs() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDT, address(usdt), BALANCE_SLOT_USDT, true, SCALE_USDT); + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_DAI, address(dai), BALANCE_SLOT_DAI, true, SCALE_DAI); + + uint16[] memory tokenIDs = priceOracle.getSupportedIDList(); + assertEq(tokenIDs.length, 3); + + // Check that all token IDs are present (order may vary) + bool foundUSDC = false; + bool foundUSDT = false; + bool foundDAI = false; + + for (uint256 i = 0; i < tokenIDs.length; ++i) { + if (tokenIDs[i] == TOKEN_ID_USDC) foundUSDC = true; + if (tokenIDs[i] == TOKEN_ID_USDT) foundUSDT = true; + if (tokenIDs[i] == TOKEN_ID_DAI) foundDAI = true; + } + + assertTrue(foundUSDC); + assertTrue(foundUSDT); + assertTrue(foundDAI); + } + + function test_getSupportedTokenList_returns_empty_when_no_tokens() public { + L2TokenRegistry.TokenEntry[] memory tokenList = priceOracle.getSupportedTokenList(); + assertEq(tokenList.length, 0); + } + + function test_getSupportedTokenList_returns_all_registered_tokens() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDT, address(usdt), BALANCE_SLOT_USDT, true, SCALE_USDT); + + L2TokenRegistry.TokenEntry[] memory tokenList = priceOracle.getSupportedTokenList(); + assertEq(tokenList.length, 2); + + // Check that all tokens are present with correct addresses + bool foundUSDC = false; + bool foundUSDT = false; + + for (uint256 i = 0; i < tokenList.length; ++i) { + if (tokenList[i].tokenID == TOKEN_ID_USDC) { + assertEq(tokenList[i].tokenAddress, address(usdc)); + foundUSDC = true; + } + if (tokenList[i].tokenID == TOKEN_ID_USDT) { + assertEq(tokenList[i].tokenAddress, address(usdt)); + foundUSDT = true; + } + } + + assertTrue(foundUSDC); + assertTrue(foundUSDT); + } + + function test_getSupportedTokenList_includes_correct_tokenAddress() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + L2TokenRegistry.TokenEntry[] memory tokenList = priceOracle.getSupportedTokenList(); + assertEq(tokenList.length, 1); + assertEq(tokenList[0].tokenID, TOKEN_ID_USDC); + assertEq(tokenList[0].tokenAddress, address(usdc)); + } + + function test_registerToken_adds_to_supported_list() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + assertTrue(priceOracle.isTokenSupported(TOKEN_ID_USDC)); + assertEq(priceOracle.getSupportedTokenCount(), 1); + } + + function test_registerTokens_adds_all_to_supported_list() public { + uint16[] memory tokenIDs = new uint16[](3); + address[] memory tokenAddresses = new address[](3); + bytes32[] memory balanceSlots = new bytes32[](3); + uint256[] memory scales = new uint256[](3); + + tokenIDs[0] = TOKEN_ID_USDC; + tokenIDs[1] = TOKEN_ID_USDT; + tokenIDs[2] = TOKEN_ID_DAI; + + tokenAddresses[0] = address(usdc); + tokenAddresses[1] = address(usdt); + tokenAddresses[2] = address(dai); + + balanceSlots[0] = BALANCE_SLOT_USDC; + balanceSlots[1] = BALANCE_SLOT_USDT; + balanceSlots[2] = BALANCE_SLOT_DAI; + + bool[] memory needBalanceSlots = new bool[](3); + needBalanceSlots[0] = true; + needBalanceSlots[1] = true; + needBalanceSlots[2] = true; + + scales[0] = SCALE_USDC; + scales[1] = SCALE_USDT; + scales[2] = SCALE_DAI; + + vm.prank(owner); + priceOracle.registerTokens(tokenIDs, tokenAddresses, balanceSlots, needBalanceSlots, scales); + + assertEq(priceOracle.getSupportedTokenCount(), 3); + assertTrue(priceOracle.isTokenSupported(TOKEN_ID_USDC)); + assertTrue(priceOracle.isTokenSupported(TOKEN_ID_USDT)); + assertTrue(priceOracle.isTokenSupported(TOKEN_ID_DAI)); + } + + function test_removeToken_removes_from_supported_list() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDT, address(usdt), BALANCE_SLOT_USDT, true, SCALE_USDT); + + assertEq(priceOracle.getSupportedTokenCount(), 2); + assertTrue(priceOracle.isTokenSupported(TOKEN_ID_USDC)); + + vm.prank(owner); + priceOracle.removeToken(TOKEN_ID_USDC); + + assertEq(priceOracle.getSupportedTokenCount(), 1); + assertFalse(priceOracle.isTokenSupported(TOKEN_ID_USDC)); + assertTrue(priceOracle.isTokenSupported(TOKEN_ID_USDT)); + } + + function test_removeToken_removes_from_tokenList() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDT, address(usdt), BALANCE_SLOT_USDT, true, SCALE_USDT); + + vm.prank(owner); + priceOracle.removeToken(TOKEN_ID_USDC); + + uint16[] memory tokenIDs = priceOracle.getSupportedIDList(); + assertEq(tokenIDs.length, 1); + assertEq(tokenIDs[0], TOKEN_ID_USDT); + + L2TokenRegistry.TokenEntry[] memory tokenList = priceOracle.getSupportedTokenList(); + assertEq(tokenList.length, 1); + assertEq(tokenList[0].tokenID, TOKEN_ID_USDT); + assertEq(tokenList[0].tokenAddress, address(usdt)); + } + + function test_removeToken_cleans_up_all_mappings() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + vm.prank(owner); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 1e12); + + vm.prank(owner); + priceOracle.removeToken(TOKEN_ID_USDC); + + // Token should be removed from registry + vm.expectRevert(bytes4(keccak256("TokenNotFound()"))); + priceOracle.getTokenInfo(TOKEN_ID_USDC); + + // Token address mapping should be cleared + vm.expectRevert(bytes4(keccak256("TokenNotFound()"))); + priceOracle.getTokenIdByAddress(address(usdc)); + + // Price should be cleared + vm.expectRevert(bytes4(keccak256("TokenNotFound()"))); + priceOracle.getTokenPrice(TOKEN_ID_USDC); + } + + function test_removeToken_reverts_when_not_owner() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + vm.expectRevert("Ownable: caller is not the owner"); + vm.prank(alice); + priceOracle.removeToken(TOKEN_ID_USDC); + } + + function test_removeToken_reverts_when_token_not_found() public { + vm.expectRevert(bytes4(keccak256("TokenNotFound()"))); + vm.prank(owner); + priceOracle.removeToken(TOKEN_ID_USDC); + } + + function test_updateTokenScale_reverts_when_scale_is_zero() public { + // First register a token + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + // Try to update scale to 0 + vm.expectRevert(bytes4(keccak256("InvalidScale()"))); + vm.prank(owner); + priceOracle.updateTokenScale(TOKEN_ID_USDC, 0); + } + + function test_removeToken_emits_TokenRemoved_event() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + vm.expectEmit(true, true, false, false); + emit IL2TokenRegistry.TokenRemoved(TOKEN_ID_USDC, address(usdc)); + + vm.prank(owner); + priceOracle.removeToken(TOKEN_ID_USDC); + } + + function test_updateTokenInfo_keeps_token_in_supported_list() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + assertTrue(priceOracle.isTokenSupported(TOKEN_ID_USDC)); + assertEq(priceOracle.getSupportedTokenCount(), 1); + + // Update token info + vm.prank(owner); + priceOracle.updateTokenInfo(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, true, SCALE_USDC); + + // Token should still be in supported list + assertTrue(priceOracle.isTokenSupported(TOKEN_ID_USDC)); + assertEq(priceOracle.getSupportedTokenCount(), 1); + } + + /*////////////////////////////////////////////////////////////// + hasBalanceSlot Return Value Tests + //////////////////////////////////////////////////////////////*/ + + /// @notice Test: hasBalanceSlot returns true when needBalanceSlot was true + function test_hasBalanceSlot_returns_true_when_slot_stored() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + (L2TokenRegistry.TokenInfo memory info, bool hasBalanceSlot) = priceOracle.getTokenInfo(TOKEN_ID_USDC); + + assertTrue(hasBalanceSlot); + assertEq(info.balanceSlot, BALANCE_SLOT_USDC); + } + + /// @notice Test: hasBalanceSlot returns false when needBalanceSlot was false + function test_hasBalanceSlot_returns_false_when_slot_not_stored() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, false, SCALE_USDC); + + (L2TokenRegistry.TokenInfo memory info, bool hasBalanceSlot) = priceOracle.getTokenInfo(TOKEN_ID_USDC); + + assertFalse(hasBalanceSlot); + assertEq(info.balanceSlot, bytes32(0)); + } + + /// @notice Test: hasBalanceSlot returns true even when balanceSlot is 0 + function test_hasBalanceSlot_returns_true_when_slot_is_zero() public { + bytes32 slotZero = bytes32(uint256(0)); + + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), slotZero, true, SCALE_USDC); + + (L2TokenRegistry.TokenInfo memory info, bool hasBalanceSlot) = priceOracle.getTokenInfo(TOKEN_ID_USDC); + + // Even though the actual slot is 0, hasBalanceSlot should be true + // because the stored value is 0 + 1 = 1 (non-zero) + assertTrue(hasBalanceSlot); + assertEq(info.balanceSlot, slotZero); + } + + /// @notice Test: hasBalanceSlot after updateTokenInfo with needBalanceSlot true + function test_hasBalanceSlot_after_updateTokenInfo_with_slot() public { + // Register without balanceSlot + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, false, SCALE_USDC); + + (, bool hasBalanceSlotBefore) = priceOracle.getTokenInfo(TOKEN_ID_USDC); + assertFalse(hasBalanceSlotBefore); + + // Update to have balanceSlot + vm.prank(owner); + priceOracle.updateTokenInfo(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, false, SCALE_USDC); + + (L2TokenRegistry.TokenInfo memory info, bool hasBalanceSlotAfter) = priceOracle.getTokenInfo(TOKEN_ID_USDC); + assertTrue(hasBalanceSlotAfter); + assertEq(info.balanceSlot, BALANCE_SLOT_USDC); + } + + /// @notice Test: hasBalanceSlot after updateTokenInfo removing slot + function test_hasBalanceSlot_after_updateTokenInfo_removing_slot() public { + // Register with balanceSlot + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + (, bool hasBalanceSlotBefore) = priceOracle.getTokenInfo(TOKEN_ID_USDC); + assertTrue(hasBalanceSlotBefore); + + // Update to remove balanceSlot + vm.prank(owner); + priceOracle.updateTokenInfo(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, false, false, SCALE_USDC); + + (L2TokenRegistry.TokenInfo memory info, bool hasBalanceSlotAfter) = priceOracle.getTokenInfo(TOKEN_ID_USDC); + assertFalse(hasBalanceSlotAfter); + assertEq(info.balanceSlot, bytes32(0)); + } + + /// @notice Test: Multiple tokens with different hasBalanceSlot values + function test_hasBalanceSlot_multiple_tokens() public { + // USDC with balanceSlot + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + // USDT without balanceSlot + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDT, address(usdt), BALANCE_SLOT_USDT, false, SCALE_USDT); + + // DAI with balanceSlot + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_DAI, address(dai), BALANCE_SLOT_DAI, true, SCALE_DAI); + + (, bool hasUSDC) = priceOracle.getTokenInfo(TOKEN_ID_USDC); + (, bool hasUSDT) = priceOracle.getTokenInfo(TOKEN_ID_USDT); + (, bool hasDAI) = priceOracle.getTokenInfo(TOKEN_ID_DAI); + + assertTrue(hasUSDC); + assertFalse(hasUSDT); + assertTrue(hasDAI); + } + + /*////////////////////////////////////////////////////////////// + Price Reset on Update Tests + //////////////////////////////////////////////////////////////*/ + + /// @notice Test: updateTokenScale resets priceRatio to 0 + function test_updateTokenScale_resets_priceRatio() public { + // Register token and set price + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + vm.prank(owner); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 1e12); + assertEq(priceOracle.priceRatio(TOKEN_ID_USDC), 1e12); + + // Update scale - should reset priceRatio to 0 + vm.prank(owner); + priceOracle.updateTokenScale(TOKEN_ID_USDC, 1e18); + + // priceRatio should now be 0 + assertEq(priceOracle.priceRatio(TOKEN_ID_USDC), 0); + + // calculateTokenAmount should revert with InvalidPrice + vm.expectRevert(bytes4(keccak256("InvalidPrice()"))); + priceOracle.calculateTokenAmount(TOKEN_ID_USDC, 1 ether); + + // After setting new priceRatio, it should work again + vm.prank(owner); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 1e15); + assertEq(priceOracle.priceRatio(TOKEN_ID_USDC), 1e15); + + // Now calculation should succeed + uint256 tokenAmount = priceOracle.calculateTokenAmount(TOKEN_ID_USDC, 1 ether); + assertGt(tokenAmount, 0); + } + + /// @notice Test: updateTokenInfo resets priceRatio to 0 + function test_updateTokenInfo_resets_priceRatio() public { + // Register token and set price + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + vm.prank(owner); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 1e12); + assertEq(priceOracle.priceRatio(TOKEN_ID_USDC), 1e12); + + // Update token info - should reset priceRatio to 0 + vm.prank(owner); + priceOracle.updateTokenInfo(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, true, SCALE_USDC); + + // priceRatio should now be 0 + assertEq(priceOracle.priceRatio(TOKEN_ID_USDC), 0); + + // calculateTokenAmount should revert with InvalidPrice + vm.expectRevert(bytes4(keccak256("InvalidPrice()"))); + priceOracle.calculateTokenAmount(TOKEN_ID_USDC, 1 ether); + } + + /// @notice Test: updateTokenInfo resets priceRatio when changing tokenAddress + function test_updateTokenInfo_resets_priceRatio_on_address_change() public { + // Register token and set price + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + vm.prank(owner); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 1e12); + assertEq(priceOracle.priceRatio(TOKEN_ID_USDC), 1e12); + + // Update token info with new address (DAI) - should reset priceRatio to 0 + vm.prank(owner); + priceOracle.updateTokenInfo(TOKEN_ID_USDC, address(dai), BALANCE_SLOT_DAI, true, true, SCALE_DAI); + + // priceRatio should now be 0 + assertEq(priceOracle.priceRatio(TOKEN_ID_USDC), 0); + + // Token info should be updated + (L2TokenRegistry.TokenInfo memory info, ) = priceOracle.getTokenInfo(TOKEN_ID_USDC); + assertEq(info.tokenAddress, address(dai)); + assertEq(info.decimals, 18); + } + + /// @notice Test: Ensures data consistency after scale update + function test_data_consistency_after_scale_update() public { + // Register token + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + // Set initial price based on scale = 1e6 + // ratio = scale * (tokenPrice / ethPrice) * 10^(18-6) + // For 1 USDC = 0.001 ETH: ratio = 1e6 * 0.001 * 1e12 = 1e15 + vm.prank(owner); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 1e15); + + // Calculate token amount: (1 ether * 1e6) / 1e15 = 1e9 (smallest units) + // For 6 decimal token, 1e9 = 1000 USDC + uint256 amount1 = priceOracle.calculateTokenAmount(TOKEN_ID_USDC, 1 ether); + assertEq(amount1, 1e9); + + // Now update scale to 1e18 + vm.prank(owner); + priceOracle.updateTokenScale(TOKEN_ID_USDC, 1e18); + + // priceRatio is now 0, must set new consistent value + // New ratio for scale = 1e18: ratio = 1e18 * 0.001 * 1e12 = 1e27 + vm.prank(owner); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 1e27); + + // Calculate token amount: (1 ether * 1e18) / 1e27 = 1e9 + // Same result as before - this demonstrates consistency + uint256 amount2 = priceOracle.calculateTokenAmount(TOKEN_ID_USDC, 1 ether); + assertEq(amount2, 1e9); + + // Both calculations return the same value, proving data consistency + assertEq(amount1, amount2); + } + + /// @notice Test: Multiple scale updates reset priceRatio each time + function test_multiple_scale_updates_reset_priceRatio() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + // First update: set price + vm.prank(owner); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 1e12); + assertEq(priceOracle.priceRatio(TOKEN_ID_USDC), 1e12); + + // Update scale first time + vm.prank(owner); + priceOracle.updateTokenScale(TOKEN_ID_USDC, 1e8); + assertEq(priceOracle.priceRatio(TOKEN_ID_USDC), 0); + + // Set new price + vm.prank(owner); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 2e12); + assertEq(priceOracle.priceRatio(TOKEN_ID_USDC), 2e12); + + // Update scale second time + vm.prank(owner); + priceOracle.updateTokenScale(TOKEN_ID_USDC, 1e10); + assertEq(priceOracle.priceRatio(TOKEN_ID_USDC), 0); + + // Set new price again + vm.prank(owner); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 3e12); + assertEq(priceOracle.priceRatio(TOKEN_ID_USDC), 3e12); + } + + /// @notice Test: updateTokenInfo resets priceRatio even when only changing isActive + function test_updateTokenInfo_resets_priceRatio_on_isActive_change() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + vm.prank(owner); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 1e12); + assertEq(priceOracle.priceRatio(TOKEN_ID_USDC), 1e12); + + // Update only isActive to true (keeping everything else the same) + vm.prank(owner); + priceOracle.updateTokenInfo(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, true, SCALE_USDC); + + // priceRatio should still be reset to 0 + assertEq(priceOracle.priceRatio(TOKEN_ID_USDC), 0); + } + + /// @notice Test: updateTokenInfo resets priceRatio when changing scale + function test_updateTokenInfo_resets_priceRatio_on_scale_change() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + vm.prank(owner); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 1e12); + assertEq(priceOracle.priceRatio(TOKEN_ID_USDC), 1e12); + + // Update scale via updateTokenInfo + vm.prank(owner); + priceOracle.updateTokenInfo(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, false, 1e18); + + // priceRatio should be reset to 0 + assertEq(priceOracle.priceRatio(TOKEN_ID_USDC), 0); + + // Scale should be updated + (L2TokenRegistry.TokenInfo memory infoUpdated, ) = priceOracle.getTokenInfo(TOKEN_ID_USDC); + assertEq(infoUpdated.scale, 1e18); + } + + /// @notice Test: getTokenPrice returns 0 after scale update + function test_getTokenPrice_returns_zero_after_scale_update() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + vm.prank(owner); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 1e12); + + // getTokenPrice should work + assertEq(priceOracle.getTokenPrice(TOKEN_ID_USDC), 1e12); + + // Update scale + vm.prank(owner); + priceOracle.updateTokenScale(TOKEN_ID_USDC, 1e18); + + // getTokenPrice returns 0 (priceRatio is reset) + assertEq(priceOracle.getTokenPrice(TOKEN_ID_USDC), 0); + + // But calculateTokenAmount should revert since priceRatio is 0 + vm.expectRevert(bytes4(keccak256("InvalidPrice()"))); + priceOracle.calculateTokenAmount(TOKEN_ID_USDC, 1 ether); + } + + /// @notice Test: Batch operations after tokenInfo update + function test_batch_operations_after_tokenInfo_update() public { + // Register multiple tokens + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDT, address(usdt), BALANCE_SLOT_USDT, true, SCALE_USDT); + + // Set prices for both + uint16[] memory tokenIDs = new uint16[](2); + uint256[] memory prices = new uint256[](2); + tokenIDs[0] = TOKEN_ID_USDC; + tokenIDs[1] = TOKEN_ID_USDT; + prices[0] = 1e12; + prices[1] = 2e12; + + vm.prank(owner); + priceOracle.batchUpdatePrices(tokenIDs, prices); + + assertEq(priceOracle.priceRatio(TOKEN_ID_USDC), 1e12); + assertEq(priceOracle.priceRatio(TOKEN_ID_USDT), 2e12); + + // Update USDC tokenInfo - only USDC's priceRatio should be reset + vm.prank(owner); + priceOracle.updateTokenInfo(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, true, SCALE_USDC); + + // USDC priceRatio should be 0, USDT should remain unchanged + assertEq(priceOracle.priceRatio(TOKEN_ID_USDC), 0); + assertEq(priceOracle.priceRatio(TOKEN_ID_USDT), 2e12); + } + + /// @notice Test: updateTokenScale by allowList user also resets priceRatio + function test_updateTokenScale_by_allowList_user_resets_priceRatio() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + // Add alice to allowList + address[] memory users = new address[](1); + bool[] memory allowed = new bool[](1); + users[0] = alice; + allowed[0] = true; + vm.prank(owner); + priceOracle.setAllowList(users, allowed); + + // Set price by owner + vm.prank(owner); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 1e12); + assertEq(priceOracle.priceRatio(TOKEN_ID_USDC), 1e12); + + // Alice updates scale - should reset priceRatio + vm.prank(alice); + priceOracle.updateTokenScale(TOKEN_ID_USDC, 1e18); + + assertEq(priceOracle.priceRatio(TOKEN_ID_USDC), 0); + } + + /// @notice Test: Recovery workflow after accidental scale update + function test_recovery_workflow_after_scale_update() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + // Set initial price + vm.prank(owner); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 1e12); + + // Token is active and working + vm.prank(owner); + priceOracle.updateTokenInfo(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, true, SCALE_USDC); + + // Oops! Someone updated scale, now priceRatio is 0 + // Token calculations will fail + vm.expectRevert(bytes4(keccak256("InvalidPrice()"))); + priceOracle.calculateTokenAmount(TOKEN_ID_USDC, 1 ether); + + // Recovery: set the correct priceRatio + vm.prank(owner); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 1e12); + + // Now it works again + uint256 amount = priceOracle.calculateTokenAmount(TOKEN_ID_USDC, 1 ether); + assertGt(amount, 0); + } + + /// @notice Test: priceRatio reset does not affect other token data + function test_priceRatio_reset_preserves_other_data() public { + vm.prank(owner); + priceOracle.registerToken(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, SCALE_USDC); + + vm.prank(owner); + priceOracle.updatePriceRatio(TOKEN_ID_USDC, 1e12); + + // Activate token + vm.prank(owner); + priceOracle.updateTokenInfo(TOKEN_ID_USDC, address(usdc), BALANCE_SLOT_USDC, true, true, SCALE_USDC); + + // Get info before scale update + (L2TokenRegistry.TokenInfo memory infoBefore, ) = priceOracle.getTokenInfo(TOKEN_ID_USDC); + + // Update scale + vm.prank(owner); + priceOracle.updateTokenScale(TOKEN_ID_USDC, 2e6); + + // Get info after scale update + (L2TokenRegistry.TokenInfo memory infoAfter, ) = priceOracle.getTokenInfo(TOKEN_ID_USDC); + + // priceRatio should be 0 + assertEq(priceOracle.priceRatio(TOKEN_ID_USDC), 0); + + // Other data should be preserved + assertEq(infoAfter.tokenAddress, infoBefore.tokenAddress); + assertEq(infoAfter.balanceSlot, infoBefore.balanceSlot); + assertEq(infoAfter.isActive, infoBefore.isActive); + assertEq(infoAfter.decimals, infoBefore.decimals); + + // Only scale changed + assertEq(infoAfter.scale, 2e6); + assertTrue(infoAfter.scale != infoBefore.scale); + } +} diff --git a/contracts/contracts/test/Rollup.t.sol b/contracts/contracts/test/Rollup.t.sol index 8f093c673..c7fd2ae33 100644 --- a/contracts/contracts/test/Rollup.t.sol +++ b/contracts/contracts/test/Rollup.t.sol @@ -1,11 +1,593 @@ // 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 RollupCommitBatchWithProofTest is L1MessageBaseTest { + /// @dev Test contract for commitBatchWithProof function + /// This function allows permissionless batch submission when sequencers are stalled. + /// Key checks: inChallenge, parent batch finalized, timing delay, proof verification + + bytes public batchHeader0; + bytes32 public batchHash0; + IRollup.BatchSignatureInput public batchSignatureInput; + + // Slot constants for storage manipulation (from forge inspect Rollup storageLayout) + uint256 constant ROLLUP_DELAY_PERIOD_SLOT = 172; // slot for rollupDelayPeriod + + // ZERO_VERSIONED_HASH constant from Rollup contract + bytes32 constant ZERO_VERSIONED_HASH = 0x010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014; + + function setUp() public virtual override { + super.setUp(); + + // Setup batch signature input + batchSignatureInput = IRollup.BatchSignatureInput( + uint256(0), + abi.encode(uint256(0), new address[](0), uint256(0), new address[](0), uint256(0), new address[](0)), + bytes("0x") + ); + + // Import genesis batch + bytes memory _batchHeader0 = new bytes(249); + bytes32 bytesData0 = bytes32(uint256(0)); + bytes32 bytesData1 = bytes32(uint256(1)); + + assembly { + mstore(add(_batchHeader0, add(0x20, 25)), 1) + mstore(add(_batchHeader0, add(0x20, 57)), 0x010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c444014) + mstore(add(_batchHeader0, add(0x20, 89)), bytesData0) + mstore(add(_batchHeader0, add(0x20, 121)), bytesData1) + } + + batchHeader0 = _batchHeader0; + + hevm.prank(multisig); + rollup.importGenesisBatch(batchHeader0); + batchHash0 = rollup.committedBatches(0); + + // Setup staker + hevm.deal(alice, 5 * STAKING_VALUE); + Types.StakerInfo memory stakerInfo = ffi.generateStakerInfo(alice); + address[] memory addrs = new address[](1); + addrs[0] = alice; + hevm.prank(multisig); + l1Staking.updateWhitelist(addrs, new address[](0)); + hevm.prank(alice); + l1Staking.register{value: STAKING_VALUE}(stakerInfo.tmKey, stakerInfo.blsKey); + + // Set rollupDelayPeriod (e.g., 1 hour) - no prank needed for hevm.store + hevm.store(address(rollup), bytes32(ROLLUP_DELAY_PERIOD_SLOT), bytes32(uint256(3600))); + } + + /// @dev Helper to compute dataHash for a batch with no L1 messages + /// dataHash = keccak256(lastBlockNumber || numL1Messages) + function _computeDataHash(uint64 lastBlockNumber, uint16 numL1Messages) internal pure returns (bytes32) { + // Construct the data: 8 bytes lastBlockNumber + 2 bytes numL1Messages + bytes memory data = new bytes(10); + assembly { + mstore(add(data, 0x20), shl(192, lastBlockNumber)) // 8 bytes + mstore(add(data, 0x28), shl(240, numL1Messages)) // 2 bytes at offset 8 + } + return keccak256(data); + } + + /// @dev Helper to compute sequencerSetVerifyHash from sequencerSets + function _getSequencerSetVerifyHash() internal view returns (bytes32) { + return keccak256(batchSignatureInput.sequencerSets); + } + + /// @dev Helper to create batch header that matches what _commitBatchWithBatchData produces + function _createMatchingBatchHeader( + uint64 lastBlockNumber, + uint16 numL1Messages, + bytes32 prevStateRoot, + bytes32 postStateRoot, + bytes32 withdrawalRoot + ) internal view returns (bytes memory batchHeader1) { + batchHeader1 = new bytes(BatchHeaderCodecV0.BATCH_HEADER_LENGTH); + bytes32 _parentBatchHash = batchHash0; + bytes32 dataHash = _computeDataHash(lastBlockNumber, numL1Messages); + bytes32 sequencerSetVerifyHash = _getSequencerSetVerifyHash(); + + assembly { + mstore(add(batchHeader1, 0x20), 0) // version = 0 + mstore(add(batchHeader1, add(0x20, 1)), shl(192, 1)) // batchIndex = 1 + mstore(add(batchHeader1, add(0x20, 9)), shl(192, numL1Messages)) // l1MessagePopped + mstore(add(batchHeader1, add(0x20, 17)), shl(192, numL1Messages)) // totalL1MessagePopped + mstore(add(batchHeader1, add(0x20, 25)), dataHash) // dataHash + mstore(add(batchHeader1, add(0x20, 57)), ZERO_VERSIONED_HASH) // l2TxBlobVersionedHash (no blob in test) + mstore(add(batchHeader1, add(0x20, 89)), prevStateRoot) // prevStateHash + mstore(add(batchHeader1, add(0x20, 121)), postStateRoot) // postStateHash + mstore(add(batchHeader1, add(0x20, 153)), withdrawalRoot) // withdrawRootHash + mstore(add(batchHeader1, add(0x20, 185)), sequencerSetVerifyHash) // sequencerSetVerifyHash = keccak256(sequencerSets) + mstore(add(batchHeader1, add(0x20, 217)), _parentBatchHash) // parentBatchHash + } + } + + /// @dev Helper to mock verifier call + /// Note: The actual call is to verifyAggregateProof(uint256,uint256,bytes,bytes32) + function _mockVerifierCall() internal { + hevm.mockCall( + rollup.verifier(), + abi.encodeWithSignature("verifyAggregateProof(uint256,uint256,bytes,bytes32)"), + abi.encode() + ); + } + + /// @dev Helper to mock L1 message queue calls for stalled state + function _mockMessageQueueStalled() internal { + hevm.mockCall( + address(l1MessageQueueWithGasPriceOracle), + abi.encodeWithSignature("getFirstUnfinalizedMessageEnqueueTime()"), + abi.encode(1) // Very old timestamp - stalled + ); + hevm.mockCall( + address(l1MessageQueueWithGasPriceOracle), + abi.encodeWithSignature("popCrossDomainMessage(uint256,uint256)"), + abi.encode() + ); + } + + /// @notice Test: commitBatchWithProof reverts when timing requirements not met + function test_commitBatchWithProof_reverts_when_timing_not_met() public { + // Mock message queue to return a recent timestamp (not stalled) + hevm.mockCall( + address(l1MessageQueueWithGasPriceOracle), + abi.encodeWithSignature("getFirstUnfinalizedMessageEnqueueTime()"), + abi.encode(block.timestamp) // Recent timestamp - not stalled + ); + + IRollup.BatchDataInput memory batchDataInput = IRollup.BatchDataInput({ + version: 0, + parentBatchHeader: batchHeader0, + lastBlockNumber: 1, + numL1Messages: 0, + prevStateRoot: bytes32(uint256(1)), + postStateRoot: bytes32(uint256(2)), + withdrawalRoot: getTreeRoot() + }); + + bytes memory batchHeader1 = _createMatchingBatchHeader(1, 0, bytes32(uint256(1)), bytes32(uint256(2)), getTreeRoot()); + + // Don't warp time - both conditions should fail: batch not stalled and L1 messages not stalled + hevm.prank(alice); + hevm.expectRevert("invalid timing"); + rollup.commitBatchWithProof( + batchDataInput, + batchSignatureInput, + batchHeader1, + bytes("") + ); + } + + /// @notice Test: commitBatchWithProof reverts on version mismatch in consistency check + /// Note: Version 1 requires different header length, so this tests the "invalid version" error from _commitBatchWithBatchData + function test_commitBatchWithProof_reverts_on_invalid_version() public { + _mockMessageQueueStalled(); + hevm.warp(block.timestamp + 7200); + + // Create batchDataInput with version 2 (invalid) + IRollup.BatchDataInput memory batchDataInput = IRollup.BatchDataInput({ + version: 2, // Invalid version + parentBatchHeader: batchHeader0, + lastBlockNumber: 1, + numL1Messages: 0, + prevStateRoot: bytes32(uint256(1)), + postStateRoot: bytes32(uint256(2)), + withdrawalRoot: getTreeRoot() + }); + + bytes memory batchHeader1 = _createMatchingBatchHeader(1, 0, bytes32(uint256(1)), bytes32(uint256(2)), getTreeRoot()); + + hevm.prank(alice); + hevm.expectRevert("invalid version"); + rollup.commitBatchWithProof( + batchDataInput, + batchSignatureInput, + batchHeader1, + bytes("") + ); + } + + /// @notice Test: commitBatchWithProof reverts when paused + function test_commitBatchWithProof_reverts_when_paused() public { + // Pause the rollup contract + hevm.prank(multisig); + rollup.setPause(true); + + IRollup.BatchDataInput memory batchDataInput = IRollup.BatchDataInput({ + version: 0, + parentBatchHeader: batchHeader0, + lastBlockNumber: 1, + numL1Messages: 0, + prevStateRoot: bytes32(uint256(1)), + postStateRoot: bytes32(uint256(2)), + withdrawalRoot: getTreeRoot() + }); + + bytes memory batchHeader1 = _createMatchingBatchHeader(1, 0, bytes32(uint256(1)), bytes32(uint256(2)), getTreeRoot()); + + hevm.prank(alice); + hevm.expectRevert("Pausable: paused"); + rollup.commitBatchWithProof( + batchDataInput, + batchSignatureInput, + batchHeader1, + bytes("") + ); + } + + /// @notice Test: commitBatchWithProof reverts on zero previous state root + function test_commitBatchWithProof_reverts_on_zero_prevStateRoot() public { + _mockMessageQueueStalled(); + hevm.warp(block.timestamp + 7200); + + // Create batchDataInput with zero prevStateRoot + IRollup.BatchDataInput memory batchDataInput = IRollup.BatchDataInput({ + version: 0, + parentBatchHeader: batchHeader0, + lastBlockNumber: 1, + numL1Messages: 0, + prevStateRoot: bytes32(0), // Zero! + postStateRoot: bytes32(uint256(2)), + withdrawalRoot: getTreeRoot() + }); + + bytes memory batchHeader1 = _createMatchingBatchHeader(1, 0, bytes32(0), bytes32(uint256(2)), getTreeRoot()); + + hevm.prank(alice); + hevm.expectRevert("previous state root is zero"); + rollup.commitBatchWithProof( + batchDataInput, + batchSignatureInput, + batchHeader1, + bytes("") + ); + } + + /// @notice Test: commitBatchWithProof reverts on zero post state root + function test_commitBatchWithProof_reverts_on_zero_postStateRoot() public { + _mockMessageQueueStalled(); + hevm.warp(block.timestamp + 7200); + + // Create batchDataInput with zero postStateRoot + IRollup.BatchDataInput memory batchDataInput = IRollup.BatchDataInput({ + version: 0, + parentBatchHeader: batchHeader0, + lastBlockNumber: 1, + numL1Messages: 0, + prevStateRoot: bytes32(uint256(1)), + postStateRoot: bytes32(0), // Zero! + withdrawalRoot: getTreeRoot() + }); + + bytes memory batchHeader1 = _createMatchingBatchHeader(1, 0, bytes32(uint256(1)), bytes32(0), getTreeRoot()); + + hevm.prank(alice); + hevm.expectRevert("new state root is zero"); + rollup.commitBatchWithProof( + batchDataInput, + batchSignatureInput, + batchHeader1, + bytes("") + ); + } + + /// @notice Test: commitBatchWithProof reverts on incorrect parent batch hash + function test_commitBatchWithProof_reverts_on_incorrect_parent_batch_hash() public { + _mockMessageQueueStalled(); + hevm.warp(block.timestamp + 7200); + + // Create a fake parent batch header with wrong data + bytes memory fakeBatchHeader0 = new bytes(249); + assembly { + mstore(add(fakeBatchHeader0, add(0x20, 25)), 999) // Wrong data + } + + IRollup.BatchDataInput memory batchDataInput = IRollup.BatchDataInput({ + version: 0, + parentBatchHeader: fakeBatchHeader0, // Using fake parent + lastBlockNumber: 1, + numL1Messages: 0, + prevStateRoot: bytes32(uint256(1)), + postStateRoot: bytes32(uint256(2)), + withdrawalRoot: getTreeRoot() + }); + + bytes memory batchHeader1 = _createMatchingBatchHeader(1, 0, bytes32(uint256(1)), bytes32(uint256(2)), getTreeRoot()); + + hevm.prank(alice); + hevm.expectRevert("incorrect parent batch hash"); + rollup.commitBatchWithProof( + batchDataInput, + batchSignatureInput, + batchHeader1, + bytes("") + ); + } + + /// @notice Test: commitBatchWithProof reverts on incorrect previous state root (doesn't match parent) + function test_commitBatchWithProof_reverts_on_incorrect_previous_state_root() public { + _mockMessageQueueStalled(); + hevm.warp(block.timestamp + 7200); + + // Genesis batch has stateRoot = 1, so using 999 should fail + IRollup.BatchDataInput memory batchDataInput = IRollup.BatchDataInput({ + version: 0, + parentBatchHeader: batchHeader0, + lastBlockNumber: 1, + numL1Messages: 0, + prevStateRoot: bytes32(uint256(999)), // Doesn't match genesis state root + postStateRoot: bytes32(uint256(2)), + withdrawalRoot: getTreeRoot() + }); + + bytes memory batchHeader1 = _createMatchingBatchHeader(1, 0, bytes32(uint256(999)), bytes32(uint256(2)), getTreeRoot()); + + hevm.prank(alice); + hevm.expectRevert("incorrect previous state root"); + rollup.commitBatchWithProof( + batchDataInput, + batchSignatureInput, + batchHeader1, + bytes("") + ); + } + + /// @notice Test: commitBatchWithProof succeeds when system is stalled + function test_commitBatchWithProof_succeeds_when_stalled() public { + _mockVerifierCall(); + _mockMessageQueueStalled(); + + // Warp time to simulate stall (> rollupDelayPeriod) + hevm.warp(block.timestamp + 7200); + + bytes32 prevStateRoot = bytes32(uint256(1)); + bytes32 postStateRoot = bytes32(uint256(2)); + bytes32 withdrawalRoot = getTreeRoot(); + + IRollup.BatchDataInput memory batchDataInput = IRollup.BatchDataInput({ + version: 0, + parentBatchHeader: batchHeader0, + lastBlockNumber: 1, + numL1Messages: 0, + prevStateRoot: prevStateRoot, + postStateRoot: postStateRoot, + withdrawalRoot: withdrawalRoot + }); + + bytes memory batchHeader1 = _createMatchingBatchHeader(1, 0, prevStateRoot, postStateRoot, withdrawalRoot); + + hevm.prank(alice); + rollup.commitBatchWithProof( + batchDataInput, + batchSignatureInput, + batchHeader1, + hex"deadbeef" // Non-empty proof required + ); + + // Verify batch was committed (finalization happens separately via finalizeBatch) + assertEq(rollup.lastCommittedBatchIndex(), 1); + // finalizeTimestamp is set to block.timestamp, allowing immediate finalization + // but lastFinalizedBatchIndex is not updated until finalizeBatch is called + assertEq(rollup.lastFinalizedBatchIndex(), 0); + } + + /// @notice Test: commitBatchWithProof emits CommitBatch event + function test_commitBatchWithProof_emits_events() public { + _mockVerifierCall(); + _mockMessageQueueStalled(); + hevm.warp(block.timestamp + 7200); + + bytes32 prevStateRoot = bytes32(uint256(1)); + bytes32 postStateRoot = bytes32(uint256(2)); + bytes32 withdrawalRoot = getTreeRoot(); + + IRollup.BatchDataInput memory batchDataInput = IRollup.BatchDataInput({ + version: 0, + parentBatchHeader: batchHeader0, + lastBlockNumber: 1, + numL1Messages: 0, + prevStateRoot: prevStateRoot, + postStateRoot: postStateRoot, + withdrawalRoot: withdrawalRoot + }); + + bytes memory batchHeader1 = _createMatchingBatchHeader(1, 0, prevStateRoot, postStateRoot, withdrawalRoot); + + // Expect CommitBatch event (check batchIndex only) + hevm.expectEmit(true, false, false, false); + emit IRollup.CommitBatch(1, bytes32(0)); + + hevm.prank(alice); + rollup.commitBatchWithProof( + batchDataInput, + batchSignatureInput, + batchHeader1, + hex"deadbeef" // Non-empty proof required + ); + } + + /// @notice Test: commitBatchWithProof calls verifier with proof + function test_commitBatchWithProof_calls_verifier() public { + _mockMessageQueueStalled(); + hevm.warp(block.timestamp + 7200); + + bytes32 prevStateRoot = bytes32(uint256(1)); + bytes32 postStateRoot = bytes32(uint256(2)); + bytes32 withdrawalRoot = getTreeRoot(); + + IRollup.BatchDataInput memory batchDataInput = IRollup.BatchDataInput({ + version: 0, + parentBatchHeader: batchHeader0, + lastBlockNumber: 1, + numL1Messages: 0, + prevStateRoot: prevStateRoot, + postStateRoot: postStateRoot, + withdrawalRoot: withdrawalRoot + }); + + bytes memory batchHeader1 = _createMatchingBatchHeader(1, 0, prevStateRoot, postStateRoot, withdrawalRoot); + bytes memory mockProof = hex"deadbeef"; + + // Mock the verifier - it should be called with the proof + _mockVerifierCall(); + + hevm.prank(alice); + rollup.commitBatchWithProof( + batchDataInput, + batchSignatureInput, + batchHeader1, + mockProof + ); + + // Verify batch was committed and proof verification passed + assertEq(rollup.lastCommittedBatchIndex(), 1); + } + + /// @notice Test: commitBatchWithProof sets finalizeTimestamp for immediate finalization + function test_commitBatchWithProof_sets_finalizeTimestamp() public { + _mockVerifierCall(); + _mockMessageQueueStalled(); + hevm.warp(block.timestamp + 7200); + + bytes32 prevStateRoot = bytes32(uint256(1)); + bytes32 postStateRoot = bytes32(uint256(2)); + bytes32 withdrawalRoot = getTreeRoot(); + + IRollup.BatchDataInput memory batchDataInput = IRollup.BatchDataInput({ + version: 0, + parentBatchHeader: batchHeader0, + lastBlockNumber: 1, + numL1Messages: 0, + prevStateRoot: prevStateRoot, + postStateRoot: postStateRoot, + withdrawalRoot: withdrawalRoot + }); + + // Create batch header with matching data + bytes memory batchHeader1 = _createMatchingBatchHeader(1, 0, prevStateRoot, postStateRoot, withdrawalRoot); + + hevm.prank(alice); + rollup.commitBatchWithProof( + batchDataInput, + batchSignatureInput, + batchHeader1, + hex"deadbeef" // Non-empty proof required + ); + + // Verify batch was committed + assertEq(rollup.lastCommittedBatchIndex(), 1); + // finalizeTimestamp is set to block.timestamp, so batch can be finalized immediately + assertFalse(rollup.batchInsideChallengeWindow(1)); + } + + /// @notice Test: commitBatchWithProof reverts when L1 message delayed but no L1 messages provided + function test_commitBatchWithProof_reverts_when_l1msg_delayed_no_messages() public { + // To trigger "l1msg delay" error, we need: + // 1. rollupDelay = false: originTs + period >= block.timestamp + // 2. l1MsgQueueDelayed = true: enqueueTime + period < block.timestamp + // 3. numL1Messages = 0 + // + // Genesis batch originTimestamp ≈ 1 (from setUp) + // rollupDelayPeriod = 3600 + // + // Setup: enqueueTime = 0, block.timestamp = 3601 + // - rollupDelay = 1 + 3600 < 3601 => 3601 < 3601 => false ✓ + // - l1MsgQueueDelayed = 0 + 3600 < 3601 => 3600 < 3601 => true ✓ + + // Mock L1 message enqueue time to 0 (simulates old unfinalized messages) + hevm.mockCall( + address(l1MessageQueueWithGasPriceOracle), + abi.encodeWithSignature("getFirstUnfinalizedMessageEnqueueTime()"), + abi.encode(0) + ); + + // Warp to exactly 3601 to trigger the condition + hevm.warp(3601); + + bytes32 prevStateRoot = bytes32(uint256(1)); + bytes32 postStateRoot = bytes32(uint256(2)); + bytes32 withdrawalRoot = getTreeRoot(); + + IRollup.BatchDataInput memory batchDataInput = IRollup.BatchDataInput({ + version: 0, + parentBatchHeader: batchHeader0, + lastBlockNumber: 1, + numL1Messages: 0, // No L1 messages! + prevStateRoot: prevStateRoot, + postStateRoot: postStateRoot, + withdrawalRoot: withdrawalRoot + }); + + bytes memory batchHeader1 = _createMatchingBatchHeader(1, 0, prevStateRoot, postStateRoot, withdrawalRoot); + + // Should revert because L1 messages are delayed but no L1 messages provided + hevm.prank(alice); + hevm.expectRevert("l1msg delay"); + rollup.commitBatchWithProof( + batchDataInput, + batchSignatureInput, + batchHeader1, + hex"deadbeef" + ); + } + + /// @notice Test: commitBatchWithProof succeeds when queue is empty (no unfinalized messages) + function test_commitBatchWithProof_succeeds_when_queue_empty() public { + _mockVerifierCall(); + + // When queue is empty, L1MessageQueueWithGasPriceOracle.getFirstUnfinalizedMessageEnqueueTime() + // returns block.timestamp, which makes l1MsgQueueDelayed = false + // (because block.timestamp + rollupDelayPeriod >= block.timestamp is always true) + + // Warp first so we have a stable timestamp to mock + hevm.warp(block.timestamp + 7200); + + // Mock getFirstUnfinalizedMessageEnqueueTime to return block.timestamp (queue empty behavior) + hevm.mockCall( + address(l1MessageQueueWithGasPriceOracle), + abi.encodeWithSignature("getFirstUnfinalizedMessageEnqueueTime()"), + abi.encode(block.timestamp) + ); + + bytes32 prevStateRoot = bytes32(uint256(1)); + bytes32 postStateRoot = bytes32(uint256(2)); + bytes32 withdrawalRoot = getTreeRoot(); + + IRollup.BatchDataInput memory batchDataInput = IRollup.BatchDataInput({ + version: 0, + parentBatchHeader: batchHeader0, + lastBlockNumber: 1, + numL1Messages: 0, // No L1 messages - OK because queue is empty (l1MsgQueueDelayed = false) + prevStateRoot: prevStateRoot, + postStateRoot: postStateRoot, + withdrawalRoot: withdrawalRoot + }); + + bytes memory batchHeader1 = _createMatchingBatchHeader(1, 0, prevStateRoot, postStateRoot, withdrawalRoot); + + // Should succeed: + // - rollupDelay = true (7200 > 3600) + // - l1MsgQueueDelayed = false (block.timestamp + 3600 >= block.timestamp) + // Entry condition satisfied, no L1 message requirement triggered + hevm.prank(alice); + rollup.commitBatchWithProof( + batchDataInput, + batchSignatureInput, + batchHeader1, + hex"deadbeef" + ); + + assertEq(rollup.lastCommittedBatchIndex(), 1); + } +} contract RollupCommitBatchTest is L1MessageBaseTest { address public caller = address(0xb4c79daB8f259C7Aee6E5b2Aa729821864227e84); @@ -56,9 +638,7 @@ contract RollupCommitBatchTest is L1MessageBaseTest { rollup.importGenesisBatch(batchHeader0); bytes32 batchHash0 = rollup.committedBatches(0); - 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 @@ -75,13 +655,13 @@ contract RollupCommitBatchTest is L1MessageBaseTest { // f1f58308e98844ec99e2990d88bfb36e1a30f0e6591e62af90ae6f8498a1b067 // => hash for parent batch header // 00847173b29b238cf319cde79512b7c213e5a8b4138daa7051914c4592b6dfc7 - bytes memory batchHeader1 = new bytes(249); + 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,12 +672,8 @@ contract RollupCommitBatchTest is L1MessageBaseTest { ) // sequencerSetVerifyHash mstore(add(batchHeader1, add(0x20, 217)), batchHash0) // parentBatchHash } - 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 - } + uint64 lastBlockNumber = 1; + uint16 numL1Messages = 1; hevm.mockCall( address(rollup.l1StakingContract()), abi.encodeCall(IL1Staking.isActiveStaker, (address(0))), @@ -110,14 +686,22 @@ contract RollupCommitBatchTest is L1MessageBaseTest { ); hevm.startPrank(address(0)); hevm.expectEmit(true, true, false, true); - emit IRollup.CommitBatch(1, bytes32(0x7764891041982c1f3abd964616bf5c777e752e327779f980a0881ef2bc994324)); - batchDataInput = IRollup.BatchDataInput(0, batchHeader0, batch, 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(0x7764891041982c1f3abd964616bf5c777e752e327779f980a0881ef2bc994324)); + assertEq(batchHash1, bytes32(0xc1862b08d265f073817a8ce0d7cbb426c16d58a86b93464244ab1d027318642e)); bytes32 stateRoot1 = rollup.committedStateRoots(1); assertEq(stateRoot1, bytesData1); @@ -134,18 +718,20 @@ contract RollupCommitBatchTest is L1MessageBaseTest { 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); + 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)), 0x81e7e4ffa69f7496f9377a1e4140fbb16fcc81d8086b44a1316fc77cc2b9a63b) // 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 @@ -155,18 +741,7 @@ contract RollupCommitBatchTest is L1MessageBaseTest { 0xf1f58308e98844ec99e2990d88bfb36e1a30f0e6591e62af90ae6f8498a1b067 ) // sequencerSetVerifyHash mstore(add(batchHeader2, add(0x20, 217)), batchHash1) // parentBatchHash - } - 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 + mstore(add(batchHeader2, add(0x20, 249)), shl(192, lastBlockNumber)) // lastBlockNumber } hevm.prank(multisig); @@ -182,15 +757,23 @@ contract RollupCommitBatchTest is L1MessageBaseTest { ); hevm.startPrank(address(0)); hevm.expectEmit(true, true, false, true); - emit IRollup.CommitBatch(2, bytes32(0x0389812d59b1230ba183f27cbe53955d98a1bce20512048a9b9e062b71403c94)); + emit IRollup.CommitBatch(2, bytes32(0x772132c2e12f21bfc5f2792838e480830f2c1dd2be0f3207b159905a9f321038)); - batchDataInput = IRollup.BatchDataInput(0, batchHeader1, batch, 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(0x0389812d59b1230ba183f27cbe53955d98a1bce20512048a9b9e062b71403c94)); + assertEq(batchHash2, bytes32(0x772132c2e12f21bfc5f2792838e480830f2c1dd2be0f3207b159905a9f321038)); bytes32 stateRoot2 = rollup.committedStateRoots(2); assertEq(stateRoot2, bytesData1); @@ -270,28 +853,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), 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), 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), stateRoot, stateRoot, getTreeRoot()); + batchDataInput = IRollup.BatchDataInput(2, batchHeader0, 0, 0, stateRoot, stateRoot, getTreeRoot()); rollup.commitBatch(batchDataInput, batchSignatureInput); hevm.stopPrank(); // 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), stateRoot, stateRoot, getTreeRoot()); + batchDataInput = IRollup.BatchDataInput(0, new bytes(120), 0, 0, stateRoot, stateRoot, getTreeRoot()); rollup.commitBatch(batchDataInput, batchSignatureInput); hevm.stopPrank(); @@ -301,7 +877,7 @@ contract RollupTest is L1MessageBaseTest { } hevm.startPrank(alice); hevm.expectRevert("incorrect batch index"); - batchDataInput = IRollup.BatchDataInput(0, batchHeader0, new bytes(1), stateRoot, stateRoot, getTreeRoot()); + batchDataInput = IRollup.BatchDataInput(0, batchHeader0, 0, 0, stateRoot, stateRoot, getTreeRoot()); rollup.commitBatch(batchDataInput, batchSignatureInput); hevm.stopPrank(); assembly { @@ -314,7 +890,7 @@ contract RollupTest is L1MessageBaseTest { } hevm.startPrank(alice); hevm.expectRevert("incorrect parent batch hash"); - batchDataInput = IRollup.BatchDataInput(0, batchHeader0, new bytes(1), stateRoot, stateRoot, getTreeRoot()); + batchDataInput = IRollup.BatchDataInput(0, batchHeader0, 0, 0, stateRoot, stateRoot, getTreeRoot()); rollup.commitBatch(batchDataInput, batchSignatureInput); hevm.stopPrank(); assembly { @@ -325,66 +901,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), - bytes32(uint256(2)), - stateRoot, - getTreeRoot() - ); + batchDataInput = IRollup.BatchDataInput(0, batchHeader0, 0, 0, bytes32(uint256(2)), stateRoot, getTreeRoot()); rollup.commitBatch(batchDataInput, batchSignatureInput); hevm.stopPrank(); // incorrect batch header length, revert hevm.startPrank(alice); hevm.expectRevert("batch header length too small"); - batchDataInput = IRollup.BatchDataInput(0, new bytes(248), new bytes(1), stateRoot, stateRoot, getTreeRoot()); - rollup.commitBatch(batchDataInput, batchSignatureInput); - hevm.stopPrank(); - - // no block in batch, revert - bytes memory batch = new bytes(2); - hevm.startPrank(alice); - hevm.expectRevert(BatchCodecV0.ErrorNoBlockInBatch.selector); - batchDataInput = IRollup.BatchDataInput(0, batchHeader0, batch, 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, stateRoot, stateRoot, getTreeRoot()); - rollup.commitBatch(batchDataInput, batchSignatureInput); - hevm.stopPrank(); - - // num txs less than num L1 msgs, revert - batch = new bytes(2 + 60); - batch[1] = bytes1(uint8(1)); // one block in this batch - batch[59] = bytes1(uint8(1)); // numTransactions = 1 - batch[61] = bytes1(uint8(3)); // numL1Messages = 3 - hevm.startPrank(alice); - hevm.expectRevert("num txs less than num L1 msgs"); - batchDataInput = IRollup.BatchDataInput(0, batchHeader0, batch, 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, stateRoot, stateRoot, getTreeRoot()); + 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, 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(); @@ -393,7 +923,7 @@ contract RollupTest is L1MessageBaseTest { // batch is already committed, revert hevm.startPrank(alice); hevm.expectRevert("batch already committed"); - batchDataInput = IRollup.BatchDataInput(0, batchHeader0, batch, stateRoot, stateRoot, getTreeRoot()); + batchDataInput = IRollup.BatchDataInput(0, batchHeader0, 1, 0, stateRoot, stateRoot, getTreeRoot()); rollup.commitBatch(batchDataInput, batchSignatureInput); hevm.stopPrank(); } @@ -420,20 +950,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, 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 @@ -448,7 +976,7 @@ contract RollupTest is L1MessageBaseTest { // commit another batch hevm.startPrank(alice); - batchDataInput = IRollup.BatchDataInput(0, batchHeader1, batch, 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(); @@ -460,9 +988,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"); @@ -504,14 +1032,7 @@ contract RollupTest is L1MessageBaseTest { hevm.startPrank(alice); hevm.expectRevert("Pausable: paused"); - batchDataInput = IRollup.BatchDataInput( - 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"); diff --git a/contracts/contracts/test/ZkEvmVerifierV1.t.sol b/contracts/contracts/test/ZkEvmVerifierV1.t.sol index 7891058e8..9ff08b2de 100644 --- a/contracts/contracts/test/ZkEvmVerifierV1.t.sol +++ b/contracts/contracts/test/ZkEvmVerifierV1.t.sol @@ -33,13 +33,14 @@ 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; diff --git a/contracts/deploy/016-RollupInit.ts b/contracts/deploy/016-RollupInit.ts index b403642e9..82036f186 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/go.mod b/contracts/go.mod index a0850903b..514d63ee1 100644 --- a/contracts/go.mod +++ b/contracts/go.mod @@ -1,30 +1,76 @@ module morph-l2/contract -go 1.22 +go 1.24.0 -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.3 require ( github.com/iden3/go-iden3-crypto v0.0.16 - github.com/morph-l2/go-ethereum v1.10.14-0.20241224100051-1582a364edc0 - github.com/stretchr/testify v1.9.0 + github.com/morph-l2/go-ethereum v1.10.14-0.20260211074551-4f0f6e6bd141 + github.com/stretchr/testify v1.10.0 ) require ( + github.com/VictoriaMetrics/fastcache v1.12.2 // indirect + github.com/bits-and-blooms/bitset v1.20.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.2.1 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/consensys/bavard v0.1.27 // indirect + github.com/consensys/gnark-crypto v0.16.0 // indirect + github.com/crate-crypto/go-eth-kzg v1.4.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/deckarep/golang-set v1.8.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect + github.com/edsrzf/mmap-go v1.1.0 // indirect + github.com/ethereum/c-kzg-4844/v2 v2.1.5 // indirect + github.com/ethereum/go-ethereum v1.10.26 // indirect + github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect + github.com/go-kit/kit v0.12.0 // indirect + github.com/go-kit/log v0.2.1 // indirect + github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-stack/stack v1.8.1 // indirect + github.com/golang-jwt/jwt/v4 v4.5.0 // indirect + github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/websocket v1.5.1 // indirect + github.com/hashicorp/go-bexpr v0.1.13 // indirect + github.com/hashicorp/golang-lru v1.0.2 // indirect + github.com/holiman/bloomfilter/v2 v2.0.3 // indirect github.com/holiman/uint256 v1.2.4 // indirect - github.com/kr/pretty v0.3.1 // indirect + github.com/huin/goupnp v1.3.0 // indirect + github.com/jackpal/go-nat-pmp v1.0.2 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mitchellh/pointerstructure v1.2.1 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect + github.com/prometheus/tsdb v0.10.0 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + github.com/rjeczalik/notify v0.9.3 // indirect + github.com/rs/cors v1.11.0 // indirect + 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/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe // 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 github.com/yusufpapurcu/wmi v1.2.3 // indirect - golang.org/x/crypto v0.23.0 // indirect - golang.org/x/sys v0.20.0 // indirect - gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // indirect + golang.org/x/crypto v0.35.0 // indirect + golang.org/x/net v0.25.0 // indirect + golang.org/x/sync v0.11.0 // indirect + golang.org/x/sys v0.30.0 // indirect + golang.org/x/text v0.22.0 // indirect + golang.org/x/time v0.5.0 // indirect + gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect + gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect + gopkg.in/urfave/cli.v1 v1.20.0 // indirect gopkg.in/yaml.v3 v3.0.1 // indirect + rsc.io/tmplfunc v0.0.3 // indirect ) diff --git a/contracts/go.sum b/contracts/go.sum index b4ac2ad1c..d0f44f830 100644 --- a/contracts/go.sum +++ b/contracts/go.sum @@ -1,56 +1,314 @@ +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= +github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/bits-and-blooms/bitset v1.20.0 h1:2F+rfL86jE2d/bmw7OhqUg2Sj/1rURkBn3MdfoPyRVU= +github.com/bits-and-blooms/bitset v1.20.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/btcsuite/btcd/btcec/v2 v2.2.1 h1:xP60mv8fvp+0khmrN0zTdPC3cNm24rfeE6lh2R/Yv3E= github.com/btcsuite/btcd/btcec/v2 v2.2.1/go.mod h1:9/CSmJxmuvqzX9Wh2fXMWToLOHhPd11lSPuIupwTkI8= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= +github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/consensys/bavard v0.1.27 h1:j6hKUrGAy/H+gpNrpLU3I26n1yc+VMGmd6ID5+gAhOs= +github.com/consensys/bavard v0.1.27/go.mod h1:k/zVjHHC4B+PQy1Pg7fgvG3ALicQw540Crag8qx+dZs= +github.com/consensys/gnark-crypto v0.16.0 h1:8Dl4eYmUWK9WmlP1Bj6je688gBRJCJbT8Mw4KoTAawo= +github.com/consensys/gnark-crypto v0.16.0/go.mod h1:Ke3j06ndtPTVvo++PhGNgvm+lgpLvzbcE2MqljY7diU= +github.com/crate-crypto/go-eth-kzg v1.4.0 h1:WzDGjHk4gFg6YzV0rJOAsTK4z3Qkz5jd4RE3DAvPFkg= +github.com/crate-crypto/go-eth-kzg v1.4.0/go.mod h1:J9/u5sWfznSObptgfa92Jq8rTswn6ahQWEuiLHOjCUI= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= +github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= +github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= +github.com/ethereum/c-kzg-4844/v2 v2.1.5 h1:aVtoLK5xwJ6c5RiqO8g8ptJ5KU+2Hdquf6G3aXiHh5s= +github.com/ethereum/c-kzg-4844/v2 v2.1.5/go.mod h1:u59hRTTah4Co6i9fDWtiCjTrblJv0UwsqZKCc0GfgUs= +github.com/ethereum/go-ethereum v1.10.26 h1:i/7d9RBBwiXCEuyduBQzJw/mKmnvzsN14jqBmytw72s= +github.com/ethereum/go-ethereum v1.10.26/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= +github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= +github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= +github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= +github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= +github.com/hashicorp/go-bexpr v0.1.13 h1:HNwp7vZrMpRq8VZXj8VF90LbZpRjQQpim1oJF0DgSwg= +github.com/hashicorp/go-bexpr v0.1.13/go.mod h1:gN7hRKB3s7yT+YvTdnhZVLTENejvhlkZ8UE4YVBS+Q8= +github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= +github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/iden3/go-iden3-crypto v0.0.16 h1:zN867xiz6HgErXVIV/6WyteGcOukE9gybYTorBMEdsk= github.com/iden3/go-iden3-crypto v0.0.16/go.mod h1:dLpM4vEPJ3nDHzhWFXDjzkn1qHoBeOT/3UEhXsEsP3E= -github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= -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.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/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= +github.com/leanovate/gopter v0.2.11 h1:vRjThO1EKPb/1NsDXuDrzldR28RLkBflWYcU9CvzWu4= +github.com/leanovate/gopter v0.2.11/go.mod h1:aK3tzZP/C+p1m3SPRE4SYZFGP7jjkuSI4f7Xvpt0S9c= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/pointerstructure v1.2.1 h1:ZhBBeX8tSlRpu/FFhXH4RC4OJzFlqsQhoHZAz4x7TIw= +github.com/mitchellh/pointerstructure v1.2.1/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +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.20260211074551-4f0f6e6bd141 h1:A8eygErKU6WKMipGWIemzwLeYkIGLd9yb/Ry3x+J9PQ= +github.com/morph-l2/go-ethereum v1.10.14-0.20260211074551-4f0f6e6bd141/go.mod h1:nkVzHjQWCOjvukQW8ittlwX+Xz9gmVHrP7mUi7zoHTs= +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= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 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= -github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/tsdb v0.10.0 h1:If5rVCMTp6W2SiRAQFlbpJNgVlgMEd+U2GZckwK38ic= +github.com/prometheus/tsdb v0.10.0/go.mod h1:oi49uRhEe9dPUTlS3JRZOwJuVi6tmh10QSgwXEyGCt4= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rjeczalik/notify v0.9.3 h1:6rJAzHTGKXGj76sbRgDiDcYj/HniypXmSJo1SWakZeY= +github.com/rjeczalik/notify v0.9.3/go.mod h1:gF3zSOrafR9DQEWSE8TjfI9NkooDxbyT4UgRGKZA0lc= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= github.com/rogpeppe/go-internal v1.12.0/go.mod h1:E+RYuTGaKKdloAfM02xzb0FW3Paa99yedzYV+kq4uf4= +github.com/rs/cors v1.11.0 h1:0B9GE/r9Bc2UxRMMtymBkHTenPkHDv0CW4Y98GBY+po= +github.com/rs/cors v1.11.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/scroll-tech/zktrie v0.8.4 h1:UagmnZ4Z3ITCk+aUq9NQZJNAwnWl4gSxsLb2Nl7IgRE= +github.com/scroll-tech/zktrie v0.8.4/go.mod h1:XvNo7vAk8yxNyTjBDj5WIiFzYW4bx/gJ78+NK6Zn6Uk= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/status-im/keycard-go v0.3.2 h1:YusIF/bHx6YZis8UTOJrpZFnTs4IkRBdmJXqdiXkpFE= +github.com/status-im/keycard-go v0.3.2/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +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= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe h1:nbdqkIGOGfUAD54q1s2YBcBz/WcsxCO9HUQ4aGV5hUw= +github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= +github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4= github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0= github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4= github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs= +golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20180926160741-c2ed4eda69e7/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20181116152217-5ac8a444bdc5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= +golang.org/x/sys v0.0.0-20190412213103-97732733099d/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20190904154756-749cb33beabd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= golang.org/x/sys v0.0.0-20190916202348-b4ddaad3f8a3/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191005200804-aed5e4c7ecf9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191120155948-bd437916bb0e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20191204072324-ce4227a45e2e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200323222414-85ca7c5b95cd/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20200930185726-fdedc70b468f/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210112080510-489259a85091/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210423082822-04245dca01da/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= +golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220412211240-33da011f77ad/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c h1:Hei/4ADfdWqJk1ZMxUNpqntNwaWcugrBjAiHlqqRiVk= gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c/go.mod h1:JHkPIbrfpd72SG/EVd6muEfDQjcINNoR0C8j2r3qZ4Q= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/urfave/cli.v1 v1.20.0 h1:NdAVW6RYxDif9DhDHaAortIu956m2c0v+09AZBPTbE0= +gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/contracts/hardhat.config.ts b/contracts/hardhat.config.ts index 51e3875fa..c60bf6ec7 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" @@ -39,6 +40,7 @@ const DEPLOYER_PK = process.env.DEPLOYER_PRIVATE_KEY || '0xac0974bec39a17e36ba4a const QA_URL = process.env.QA_RPC_URL || 'http://127.0.0.1:8545' const SEPOLIA_URL = process.env.SEPOLIA_RPC_URL || 'http://127.0.0.1:8545' const HOLESKY_URL = process.env.HOLESKY_RPC_URL || 'http://127.0.0.1:8545' +const HOODI_URL = process.env.HOODI_RPC_URL || 'http://127.0.0.1:8545' module.exports = { defaultNetwork: 'hardhat', @@ -97,6 +99,13 @@ module.exports = { gas: 'auto', gasPrice: 'auto', accounts: [DEPLOYER_PK] + }, + hoodi: { + url: HOODI_URL, + chainId: 560048, + gas: 'auto', + gasPrice: 'auto', + accounts: [DEPLOYER_PK] } }, foundry: { diff --git a/contracts/package.json b/contracts/package.json index 706dcc87a..810c56de1 100644 --- a/contracts/package.json +++ b/contracts/package.json @@ -1,6 +1,6 @@ { "name": "@morph-l2/contracts", - "version": "0.1.0", + "version": "0.0.9", "main": "dist/index", "types": "dist/index", "license": "MIT", @@ -35,6 +35,11 @@ "deploy:holesky": "rm -f holesky.json && hardhat deploy --network holesky --storagepath holesky.json", "initialize:holesky": "hardhat initialize --network holesky --storagepath holesky.json", "register:holesky": "hardhat register --network holesky --storagepath holesky.json", + + "deploy:hoodi": "rm -f hoodi.json && hardhat deploy --network hoodi --storagepath hoodi.json", + "initialize:hoodi": "hardhat initialize --network hoodi --storagepath hoodi.json", + "register:hoodi": "hardhat register --network hoodi --storagepath hoodi.json", + "deploy:qanetL1": "rm -f qanetL1.json && hardhat deploy --network qanetl1 --storagepath qanetL1.json", "initialize:qanetL1": "hardhat initialize --network qanetl1 --storagepath qanetL1.json", "register:qanetL1": "hardhat register --network qanetl1 --storagepath qanetL1.json" diff --git a/contracts/scripts/oracle-testing/token.go b/contracts/scripts/oracle-testing/token.go new file mode 100644 index 000000000..783e7126e --- /dev/null +++ b/contracts/scripts/oracle-testing/token.go @@ -0,0 +1,153 @@ +package oracle_testing + +import ( + "math/big" + + "github.com/morph-l2/go-ethereum/common" + "github.com/morph-l2/go-ethereum/crypto" +) + +// TokenConfig represents token configuration from JSON file +type TokenConfig struct { + Name string `json:"name"` + Symbol string `json:"symbol"` + Decimals uint8 `json:"decimals"` + TokenID uint16 `json:"tokenID"` + BalanceSlot uint64 `json:"balanceSlot"` + Scale string `json:"scale"` + PriceRatio string `json:"priceRatio"` +} + +var TokenRegistryAddress = common.HexToAddress("0x9fE46736679d2D9a65F0992F2272dE9f3c7fa6e0") + +var ( + // TokenRegistrySlot is the storage slot for mapping(uint16 => TokenInfo) + // TokenInfo struct layout: + // - tokenAddress: address (offset 0) + // - balanceSlot: bytes32 (offset 1) + // - isActive: bool (offset 2, byte 0) + // - decimals: uint8 (offset 2, byte 1) + // - scale: uint256 (offset 3) + // Based on L2TokenRegistryStorageLayout: slot 151 + TokenRegistrySlot = common.BigToHash(big.NewInt(151)) + // TokenRegistrationSlot is the storage slot for mapping(address => uint16) + // Based on L2TokenRegistryStorageLayout: slot 152 + TokenRegistrationSlot = common.BigToHash(big.NewInt(152)) + // PriceRatioSlot is the storage slot for mapping(uint16 => uint256) + // Based on L2TokenRegistryStorageLayout: slot 153 + PriceRatioSlot = common.BigToHash(big.NewInt(153)) + // AllowListSlot is the storage slot for mapping(address => bool) + // Based on L2TokenRegistryStorageLayout: slot 154 + AllowListSlot = common.BigToHash(big.NewInt(154)) + // AllowListEnabledSlot is the storage slot for bool allowListEnabled + // Based on L2TokenRegistryStorageLayout: slot 155 + AllowListEnabledSlot = common.BigToHash(big.NewInt(155)) +) + +// TokenInfo represents the token information structure +type TokenInfo struct { + TokenAddress common.Address + BalanceSlot common.Hash + IsActive bool + Decimals uint8 + Scale *big.Int +} + +// CalculateUint16MappingSlot calculates the storage slot for a mapping key +// For mapping(key => value), the slot is: keccak256(abi.encode(key, mappingSlot)) +func CalculateUint16MappingSlot(key uint16, mappingSlot common.Hash) common.Hash { + // Convert key to 32 bytes (right-padded) + keyBytes := make([]byte, 32) + keyBytes[30] = byte(key >> 8) // high byte + keyBytes[31] = byte(key) // low byte + + // Convert mapping slot to 32 bytes (left-padded) + slotBytes := mappingSlot.Bytes() + paddedSlot := make([]byte, 32) + copy(paddedSlot[32-len(slotBytes):], slotBytes) + + // Concatenate key and slot + data := append(keyBytes, paddedSlot...) + + // Calculate keccak256 hash + hash := crypto.Keccak256(data) + + return common.BytesToHash(hash) +} + +// CalculateStructFieldSlot calculates the storage slot for a struct field within a mapping +// For a struct at baseSlot, fieldOffset is the offset within the struct +func CalculateStructFieldSlot(baseSlot common.Hash, fieldOffset uint64) common.Hash { + // Add fieldOffset to baseSlot + baseInt := new(big.Int).SetBytes(baseSlot[:]) + fieldInt := big.NewInt(int64(fieldOffset)) + result := new(big.Int).Add(baseInt, fieldInt) + return common.BigToHash(result) +} + +// CalculateAddressMappingSlot calculates the storage slot for a mapping key (address type) +// For mapping(address => value), the slot is: keccak256(abi.encode(key, mappingSlot)) +func CalculateAddressMappingSlot(key common.Address, mappingSlot common.Hash) common.Hash { + // Convert address to 32 bytes (left-padded) + keyBytes := make([]byte, 32) + copy(keyBytes[12:], key.Bytes()) + + // Convert mapping slot to 32 bytes (left-padded) + slotBytes := mappingSlot.Bytes() + paddedSlot := make([]byte, 32) + copy(paddedSlot[32-len(slotBytes):], slotBytes) + + // Concatenate key and slot + data := append(keyBytes, paddedSlot...) + + // Calculate keccak256 hash + hash := crypto.Keccak256(data) + + return common.BytesToHash(hash) +} + +// ParseTokenInfoFromStorage parses TokenInfo from storage slots +// baseSlot is the base slot for the TokenInfo struct in the mapping +func ParseTokenInfoFromStorage( + storageAt func(common.Hash) ([]byte, error), + baseSlot common.Hash, +) (*TokenInfo, error) { + // Read tokenAddress (offset 0) + tokenAddrSlot := CalculateStructFieldSlot(baseSlot, 0) + tokenAddrData, err := storageAt(tokenAddrSlot) + if err != nil { + return nil, err + } + tokenAddress := common.BytesToAddress(tokenAddrData[12:32]) + + // Read balanceSlot (offset 1) + balanceSlotField := CalculateStructFieldSlot(baseSlot, 1) + balanceSlotData, err := storageAt(balanceSlotField) + if err != nil { + return nil, err + } + // Read isActive and decimals (offset 2, packed together) + isActiveSlot := CalculateStructFieldSlot(baseSlot, 2) + isActiveData, err := storageAt(isActiveSlot) + if err != nil { + return nil, err + } + isActive := isActiveData[31] != 0 + decimals := isActiveData[30] + + // Read scale (offset 3) + scaleSlot := CalculateStructFieldSlot(baseSlot, 3) + scaleData, err := storageAt(scaleSlot) + if err != nil { + return nil, err + } + scale := new(big.Int).SetBytes(scaleData) + + return &TokenInfo{ + TokenAddress: tokenAddress, + BalanceSlot: common.BytesToHash(balanceSlotData), + IsActive: isActive, + Decimals: decimals, + Scale: scale, + }, nil +} diff --git a/contracts/scripts/oracle-testing/token_test.go b/contracts/scripts/oracle-testing/token_test.go new file mode 100644 index 000000000..8dc7146dd --- /dev/null +++ b/contracts/scripts/oracle-testing/token_test.go @@ -0,0 +1,276 @@ +package oracle_testing + +import ( + "context" + "encoding/json" + "math/big" + "os" + "path/filepath" + "runtime" + "testing" + + "github.com/morph-l2/go-ethereum/common" + "github.com/morph-l2/go-ethereum/ethclient" +) + +func TestGetStorageAtL2TokenRegistry(t *testing.T) { + TokenRegistryAddress = common.HexToAddress("0x5300000000000000000000000000000000000021") + // Connect to Ethereum node + rpcURL := "http://localhost:8545" + client, err := ethclient.Dial(rpcURL) + if err != nil { + t.Fatalf("Failed to connect to Ethereum node: %v", err) + } + defer client.Close() + + ctx := context.Background() + + // Read allowListEnabled (slot 105, bool) + allowListEnabledSlot := AllowListEnabledSlot + allowListEnabledData, err := client.StorageAt(ctx, TokenRegistryAddress, allowListEnabledSlot, nil) + if err != nil { + t.Fatalf("Failed to read allowListEnabled: %v", err) + } + allowListEnabled := allowListEnabledData[31] != 0 + t.Logf("allowListEnabled: %v", allowListEnabled) + + for tokenID := uint16(1); tokenID <= 10; tokenID++ { + t.Logf("---------- Querying tokenID: %d ----------", tokenID) + + // Calculate baseSlot + baseSlot := CalculateUint16MappingSlot(tokenID, TokenRegistrySlot) + t.Logf("TokenID %d base slot: %s", tokenID, baseSlot.Hex()) + + // Create storage reader + storageReader := func(slot common.Hash) ([]byte, error) { + return client.StorageAt(ctx, TokenRegistryAddress, slot, nil) + } + + // Parse TokenInfo + tokenInfo, err := ParseTokenInfoFromStorage(storageReader, baseSlot) + if err != nil { + t.Logf(" [WARN] Failed to parse TokenInfo: %v", err) + continue + } + + t.Logf("TokenInfo for tokenID %d:", tokenID) + t.Logf(" TokenAddress: %s", tokenInfo.TokenAddress.Hex()) + t.Logf(" BalanceSlot: %s", tokenInfo.BalanceSlot.Hex()) + t.Logf(" IsActive: %v", tokenInfo.IsActive) + t.Logf(" Decimals: %d", tokenInfo.Decimals) + t.Logf(" Scale: %s", tokenInfo.Scale.String()) + + // Query tokenRegistration mapping (address => uint16) + if tokenInfo.TokenAddress != (common.Address{}) { + tokenRegistrationSlot := CalculateAddressMappingSlot(tokenInfo.TokenAddress, TokenRegistrationSlot) + tokenRegistrationData, err := client.StorageAt(ctx, TokenRegistryAddress, tokenRegistrationSlot, nil) + if err != nil { + t.Logf(" [WARN] Failed to read tokenRegistration: %v", err) + } else { + registeredTokenID := uint16(tokenRegistrationData[30])<<8 | uint16(tokenRegistrationData[31]) + t.Logf(" TokenID for address %s: %d", tokenInfo.TokenAddress.Hex(), registeredTokenID) + if registeredTokenID != tokenID { + t.Errorf(" [ERR] Mismatch: expected tokenID %d, got %d", tokenID, registeredTokenID) + } + } + } + + // Query priceRatio mapping (uint16 => uint256) + priceRatioSlot := CalculateUint16MappingSlot(tokenID, PriceRatioSlot) + priceRatioData, err := client.StorageAt(ctx, TokenRegistryAddress, priceRatioSlot, nil) + if err != nil { + t.Logf(" [WARN] Failed to read priceRatio: %v", err) + } else { + priceRatio := new(big.Int).SetBytes(priceRatioData) + t.Logf(" PriceRatio: %s", priceRatio.String()) + } + } + + // Test allowList mapping (address => bool) + testAddress := common.HexToAddress("0x1234567890123456789012345678901234567890") + allowListSlot := CalculateAddressMappingSlot(testAddress, AllowListSlot) + allowListData, err := client.StorageAt(ctx, TokenRegistryAddress, allowListSlot, nil) + if err != nil { + t.Fatalf("Failed to read allowList: %v", err) + } + isAllowed := allowListData[31] != 0 + t.Logf("Address %s in allowList: %v", testAddress.Hex(), isAllowed) +} + +// TestCalculateStorageSlots tests the storage slot calculation functions +func TestCalculateStorageSlots(t *testing.T) { + tokenID := uint16(1) + baseSlot := CalculateUint16MappingSlot(tokenID, TokenRegistrySlot) + t.Logf("Base slot for tokenID %d: %s", tokenID, baseSlot.Hex()) + + // Test struct field slots + tokenAddrSlot := CalculateStructFieldSlot(baseSlot, 0) + t.Logf("TokenAddress slot: %s", tokenAddrSlot.Hex()) + + balanceSlotField := CalculateStructFieldSlot(baseSlot, 1) + t.Logf("BalanceSlot field slot: %s", balanceSlotField.Hex()) + + isActiveSlot := CalculateStructFieldSlot(baseSlot, 2) + t.Logf("IsActive slot: %s", isActiveSlot.Hex()) + + scaleSlot := CalculateStructFieldSlot(baseSlot, 3) + t.Logf("Scale slot: %s", scaleSlot.Hex()) + + // Test address mapping slot + testAddress := common.HexToAddress("0x1234567890123456789012345678901234567890") + addressMappingSlot := CalculateAddressMappingSlot(testAddress, TokenRegistrationSlot) + t.Logf("Address mapping slot for %s: %s", testAddress.Hex(), addressMappingSlot.Hex()) + + // Test priceRatio slot + priceRatioSlot := CalculateUint16MappingSlot(tokenID, PriceRatioSlot) + t.Logf("PriceRatio slot for tokenID %d: %s", tokenID, priceRatioSlot.Hex()) +} + +// TestCompareTokensFromJSON compares token configurations from JSON file with contract data +func TestCompareTokensFromJSON(t *testing.T) { + TokenRegistryAddress = common.HexToAddress("0x5300000000000000000000000000000000000021") + // Connect to Ethereum node + rpcURL := "http://localhost:8545" + client, err := ethclient.Dial(rpcURL) + if err != nil { + t.Fatalf("Failed to connect to Ethereum node: %v", err) + } + defer client.Close() + + ctx := context.Background() + + // Load token configurations from JSON file + // Get absolute path relative to the test file location + _, testFile, _, ok := runtime.Caller(0) + if !ok { + t.Fatalf("Failed to get test file path") + } + testDir := filepath.Dir(testFile) + // Navigate from scripts/oracle-testing to contracts/src/tokens/tokens.json + tokensFilePath := filepath.Join(testDir, "..", "..", "src", "tokens", "tokens.json") + absTokensPath, err := filepath.Abs(tokensFilePath) + if err != nil { + t.Fatalf("Failed to resolve absolute path: %v", err) + } + + t.Logf("Loading tokens from: %s", absTokensPath) + + tokensData, err := os.ReadFile(absTokensPath) + if err != nil { + t.Fatalf("Failed to read tokens.json: %v", err) + } + + var tokenConfigs []TokenConfig + if err := json.Unmarshal(tokensData, &tokenConfigs); err != nil { + t.Fatalf("Failed to parse tokens.json: %v", err) + } + + t.Logf("Loaded %d token configurations from JSON file", len(tokenConfigs)) + + // Create storage reader + storageReader := func(slot common.Hash) ([]byte, error) { + return client.StorageAt(ctx, TokenRegistryAddress, slot, nil) + } + + // Compare each token + mismatches := 0 + notRegistered := 0 + checked := 0 + + for _, config := range tokenConfigs { + t.Logf("\n---------- Comparing tokenID %d: %s (%s) ----------", config.TokenID, config.Name, config.Symbol) + + // Calculate baseSlot + baseSlot := CalculateUint16MappingSlot(config.TokenID, TokenRegistrySlot) + + // Parse TokenInfo from contract + contractTokenInfo, err := ParseTokenInfoFromStorage(storageReader, baseSlot) + if err != nil { + t.Logf(" [WARN] Failed to parse TokenInfo from contract: %v", err) + notRegistered++ + continue + } + + // Check if token is registered (non-zero address) + if contractTokenInfo.TokenAddress == (common.Address{}) { + t.Logf(" [SKIP] TokenID %d is not registered in contract", config.TokenID) + notRegistered++ + continue + } + + checked++ + hasMismatch := false + + // Compare decimals + if contractTokenInfo.Decimals != config.Decimals { + t.Errorf(" [MISMATCH] TokenID %d Decimals: contract=%d, JSON=%d", config.TokenID, contractTokenInfo.Decimals, config.Decimals) + hasMismatch = true + } else { + t.Logf(" ✓ Decimals: %d", contractTokenInfo.Decimals) + } + + // Compare balanceSlot + expectedBalanceSlot := common.BigToHash(big.NewInt(int64(config.BalanceSlot))) + if contractTokenInfo.BalanceSlot != expectedBalanceSlot { + t.Errorf(" [MISMATCH] TokenID %d BalanceSlot: contract=%s, JSON=%s", config.TokenID, contractTokenInfo.BalanceSlot.Hex(), expectedBalanceSlot.Hex()) + hasMismatch = true + } else { + t.Logf(" ✓ BalanceSlot: %s", contractTokenInfo.BalanceSlot.Hex()) + } + + // Compare scale + expectedScale, ok := new(big.Int).SetString(config.Scale, 10) + if !ok { + t.Errorf(" [ERROR] TokenID %d: Invalid scale in JSON: %s", config.TokenID, config.Scale) + hasMismatch = true + } else if contractTokenInfo.Scale.Cmp(expectedScale) != 0 { + t.Errorf(" [MISMATCH] TokenID %d Scale: contract=%s, JSON=%s", config.TokenID, contractTokenInfo.Scale.String(), expectedScale.String()) + hasMismatch = true + } else { + t.Logf(" ✓ Scale: %s", contractTokenInfo.Scale.String()) + } + + // Read and compare priceRatio + priceRatioSlot := CalculateUint16MappingSlot(config.TokenID, PriceRatioSlot) + priceRatioData, err := client.StorageAt(ctx, TokenRegistryAddress, priceRatioSlot, nil) + if err != nil { + t.Logf(" [WARN] Failed to read priceRatio: %v", err) + } else { + contractPriceRatio := new(big.Int).SetBytes(priceRatioData) + expectedPriceRatio, ok := new(big.Int).SetString(config.PriceRatio, 10) + if !ok { + t.Errorf(" [ERROR] TokenID %d: Invalid priceRatio in JSON: %s", config.TokenID, config.PriceRatio) + hasMismatch = true + } else if contractPriceRatio.Cmp(expectedPriceRatio) != 0 { + t.Errorf(" [MISMATCH] TokenID %d PriceRatio: contract=%s, JSON=%s", config.TokenID, contractPriceRatio.String(), expectedPriceRatio.String()) + hasMismatch = true + } else { + t.Logf(" ✓ PriceRatio: %s", contractPriceRatio.String()) + } + } + + // Log token address + t.Logf(" TokenAddress: %s", contractTokenInfo.TokenAddress.Hex()) + + if hasMismatch { + mismatches++ + } else { + t.Logf(" ✓ All fields match for tokenID %d", config.TokenID) + } + } + + // Summary + t.Logf("\n==========================================") + t.Logf("Comparison Summary:") + t.Logf("==========================================") + t.Logf("Total tokens in JSON: %d", len(tokenConfigs)) + t.Logf("Tokens checked: %d", checked) + t.Logf("Tokens not registered: %d", notRegistered) + t.Logf("Tokens with mismatches: %d", mismatches) + t.Logf("Tokens matching: %d", checked-mismatches) + t.Logf("==========================================") + + if mismatches > 0 { + t.Errorf("Found %d token(s) with mismatches", mismatches) + } +} diff --git a/contracts/src/deploy-config/holesky.ts b/contracts/src/deploy-config/holesky.ts index 4e3601cb4..25b92d66b 100644 --- a/contracts/src/deploy-config/holesky.ts +++ b/contracts/src/deploy-config/holesky.ts @@ -14,7 +14,7 @@ const config = { l2BaseFee: 0.1, // Gwei // verify contract config - programVkey: '0x001bdbe2a0f4839f3e7ca3b42ab1ca9d012e23249d17564c953d3557aede919c', + programVkey: '0x00ad538a51c761c06f5075d11f3ee64d5d00c272a741ccf098e1d9f062fee13d', // rollup contract config // initialize config finalizationPeriodSeconds: 600, diff --git a/contracts/src/deploy-config/hoodi.ts b/contracts/src/deploy-config/hoodi.ts new file mode 100644 index 000000000..6fdeca383 --- /dev/null +++ b/contracts/src/deploy-config/hoodi.ts @@ -0,0 +1,64 @@ +const config = { + // Global configuration + l1FeeVaultRecipient: '0x291046850908e59B33b1758045882e9FDcfcBD1E', + contractAdmin: '0x291046850908e59B33b1758045882e9FDcfcBD1E', + + l1WETHAddress: "", + l1USDCAddress: "", + + // chainID config + l1ChainID: 560048, + l2ChainID: 2910, + + // L1MessageQueue config + l1MessageQueueMaxGasLimit: 30000000, + + // gasPriceOracle config + l2BaseFee: 0.1, // Gwei + + // verify contract config + programVkey: '0x00ad538a51c761c06f5075d11f3ee64d5d00c272a741ccf098e1d9f062fee13d', + // rollup contract config + // initialize config + finalizationPeriodSeconds: 600, + rollupProofWindow: 86400, + proofRewardPercent: 70, + // challenge config + rollupProposer: '0x48446b07A04307F320fa34790116d73aD4A51810', + rollupChallenger: '0x2910DB00C9537B90337b40D9732f4c356cbb84D0', + // genesis config + batchHeader: '00000000000000000000000000000000000000000000000000aa0feb482ae04f2a6b6b422932b5a2d537cd657ceb83008e87fce6ed6d290031010657f37554c781402a22917dee2f75def7ab966d7b770905398eba3c44401400000000000000000000000000000000000000000000000000000000000000000a31941eb1853862c0c38f378eb0c519e9e66f0942e39b47dca38c0437ab6b3e000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000', + + + // staking config + // staking Cross-Chain config + stakingCrossChainGaslimitAdd: 1000000, + stakingCrossChainGaslimitRemove: 8000000, + + // staking initialize config + stakingLockNumber: 3, + stakingChallengeDeposit: 1, // 1 ether + stakingMinDeposit: 1, // 1 ether + stakingChallengerRewardPercentage: 100, + // register sequencers + l2SequencerAddresses: [ + "0x48446b07A04307F320fa34790116d73aD4A51810", + "0x48447a9d66D8eAE067e59E3F9f7E6B5f1b5E7581", + "0x4844631425Ed76D79164c37CA9d558bd5FB12662", + "0x4844ede12C743845dfae266A6BE891F114702583" + ], + l2SequencerTmKeys: [ + "0xa4f3a7fb882c3159398f520e3c89a39dc9818235fea07789995a9ce7b4aba31d", + "0x0535824f72998615ac8265c12c9cfc63d315d8f3e849aa1857f42b11cfc5d72c", + "0x3a50197cbfdbe5bbd85ff13b0d55ddc08ecd5dbddbc012880ba1358562e192bd", + "0x814ce757e9727768f25ead4619efa552d9f8facad85236c0a774d0b21fae28ea" + ], + l2SequencerBlsKeys: [ + "0x0000000000000000000000000000000017c22eb22cfacc028f8556a10ed0dcf56f4189c03c57103498bebc38df3f04202a1bf2ae6361bd0fd0c606e5a5d1122500000000000000000000000000000000115359ea50bb5e0bc9a72d5d96dbe5425aad06b7c4f9b18c30534d8237de9f3d94df3fd38e2e19bf572cda4e76dfd7200000000000000000000000000000000001584eb7275c2678f41b1649c4de05acecffa73f998c30995e934b01029257a6466964b68d4ea34c64ac1807f57bad0c0000000000000000000000000000000016d8f19d0fb3f0428c5fe338ca6bdb4b93e49f106267a106b11bde1bc4b795a119cbd8bfcd21d5be79b83fabc43c1d1e", + "0x0000000000000000000000000000000018ca6c24a492491ccbc97b0743c52e188ccbf4c42fe858a22ece10c96d99af4c80a3c73b2b199f1bc35adf2b42be86e700000000000000000000000000000000028ebe1896404b3a9f3609d61b55c8a13aed4c2ba951fb081d0982bebcd072ea2fa5a90bd581565e4277be1b86b201c80000000000000000000000000000000009f5d61b5b90288ba4650db5865235935447e4999ed773965db1cc663d14bd30e364244f8f97cbdb9483591366d11db00000000000000000000000000000000015d1d71cb633e1a33b7e7432b268d94453704f0fcd54dbf223d294c969c4ea9285d807a42d785d6198d3a361be98fdf7", + "0x000000000000000000000000000000000c666fbafcde1b34ac662d6edd8ddaca29fb406c27bdb4b45114409d1d6b3a1415efcb88a9adf94a925f255a7e3b4cb300000000000000000000000000000000097f204c34019966d2f1f2e57572e534d51f93f5c2e372bf15bdb031eefa72398fb5c773c217365df980c9c6b3480962000000000000000000000000000000000b1d419b65cf9d415ae3dc213f41296623517efeea8a6b97ed31aacfd75a9d0c15b1b59091fa185981ce1b45b85291240000000000000000000000000000000007085c7d37c0b2ac925b75b1f86ea93cbfc60909ddabbc7a1d89cc24b1766e4bdfc3e88cf405a7cd8e8137050777a8e7", + "0x0000000000000000000000000000000017cb2706bf579e0043486627a62d7b4b9f868585bab1eb584253e54d57cc6e8d5851d4260df693f2e671eadf5daac13b000000000000000000000000000000001176bb97fd0c8d1ecec2d240ffe9db99305ef00fdd2341590970dde0e34f26c672b5bb3ecd2e91fa66c349cba9f2f77a000000000000000000000000000000000220ff827a48e8a21e7ec9c73432fa47453d275de48fbc1988dad49e58123a91ba1e8f0463c2f6913a5efff41f3100a2000000000000000000000000000000000219da2bc157d03525b20e6ec00d2edb312ab654c107465dfe9c2b19e2c07639c02bbbe19ba5ab0202110ba7b7d72c90" + ] +} + +export default config diff --git a/contracts/src/deploy-config/l1.ts b/contracts/src/deploy-config/l1.ts index 60827a8ef..ee9f7b653 100644 --- a/contracts/src/deploy-config/l1.ts +++ b/contracts/src/deploy-config/l1.ts @@ -17,7 +17,7 @@ const config = { l2BaseFee: 0.1, // Gwei // verify contract config - programVkey: '0x001bdbe2a0f4839f3e7ca3b42ab1ca9d012e23249d17564c953d3557aede919c', + programVkey: '0x00ad538a51c761c06f5075d11f3ee64d5d00c272a741ccf098e1d9f062fee13d', // rollup contract config // initialize config finalizationPeriodSeconds: 10, diff --git a/contracts/src/deploy-config/qanetl1.ts b/contracts/src/deploy-config/qanetl1.ts index ea5ddab73..e24843144 100644 --- a/contracts/src/deploy-config/qanetl1.ts +++ b/contracts/src/deploy-config/qanetl1.ts @@ -6,8 +6,6 @@ const config = { // chainID config l1ChainID: 900, l2ChainID: 53077, - l1WETHAddress: "", - l1USDCAddress: "", // L1MessageQueue config l1MessageQueueMaxGasLimit: 30000000, @@ -16,7 +14,7 @@ const config = { l2BaseFee: 0.1, // Gwei // verify contract config - programVkey: '0x001bdbe2a0f4839f3e7ca3b42ab1ca9d012e23249d17564c953d3557aede919c', + programVkey: '0x00ad538a51c761c06f5075d11f3ee64d5d00c272a741ccf098e1d9f062fee13d', // rollup contract config // initialize config finalizationPeriodSeconds: 600, @@ -40,10 +38,10 @@ const config = { stakingChallengerRewardPercentage: 50, // register sequencers l2SequencerAddresses: [ - "0x675cfc328f9f2e79a51e499b2be44462270572fe", - "0xb096665645994775eeba8aa114752d569734dcb4", - "0x3a587733d38e5487d2a7e81d84625f25c99ab3a1", - "0xb6346ded94fc61b637763610d0c59846b7781080" + "0x25d36d94b64165f72a817ae0ff9bad2ce6914c70", + "0x4a1f64dec538835c125874e275edca367bf6022a", + "0xbb8605961105bb3dcd0e86ef94a1bf9fb2270a29", + "0x7d7201ad7da2b9b9ab9a36c454a3c2d55c4fbdd8" ], l2SequencerTmKeys: [ "0x5280d0eee2a64d3ad29480d15ffd1b048ce5908f180b5ccd65cc3dcf00941abb", diff --git a/contracts/src/deploy-config/sepolia.ts b/contracts/src/deploy-config/sepolia.ts index cd02472d6..97fa061d8 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: '0x001bdbe2a0f4839f3e7ca3b42ab1ca9d012e23249d17564c953d3557aede919c', + programVkey: '0x00ad538a51c761c06f5075d11f3ee64d5d00c272a741ccf098e1d9f062fee13d', rollupMinDeposit: 0.0001, rollupProofWindow: 86400, rollupGenesisBlockNumber: 0, diff --git a/contracts/src/deploy-config/testnetl1.ts b/contracts/src/deploy-config/testnetl1.ts index 9e91e1162..16fbd9ea1 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: '0x001bdbe2a0f4839f3e7ca3b42ab1ca9d012e23249d17564c953d3557aede919c', + programVkey: '0x00ad538a51c761c06f5075d11f3ee64d5d00c272a741ccf098e1d9f062fee13d', rollupMinDeposit: 1, rollupProofWindow: 100, rollupGenesisBlockNumber: 0, diff --git a/contracts/src/tokens/tokens.json b/contracts/src/tokens/tokens.json new file mode 100644 index 000000000..10ae476fd --- /dev/null +++ b/contracts/src/tokens/tokens.json @@ -0,0 +1,902 @@ +[ + { + "name": "Test USDC", + "symbol": "USDC", + "decimals": 6, + "tokenID": 1, + "balanceSlot": 0, + "scale": "1000000", + "priceRatio": "68951948644506307210" + }, + { + "name": "Test USDT", + "symbol": "USDT", + "decimals": 6, + "tokenID": 2, + "balanceSlot": 0, + "scale": "1000000", + "priceRatio": "14995514838432569260" + }, + { + "name": "Test DAI", + "symbol": "DAI", + "decimals": 18, + "tokenID": 3, + "balanceSlot": 0, + "scale": "1000000000000000000", + "priceRatio": "87820606474325069614" + }, + { + "name": "Test Token 4", + "symbol": "T4", + "decimals": 6, + "tokenID": 4, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "84750141244838638522" + }, + { + "name": "Test Token 5", + "symbol": "T5", + "decimals": 6, + "tokenID": 5, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "43629115832236572446" + }, + { + "name": "Test Token 6", + "symbol": "T6", + "decimals": 18, + "tokenID": 6, + "balanceSlot": 3, + "scale": "1000000000000000000", + "priceRatio": "96894773153476152362" + }, + { + "name": "Test Token 7", + "symbol": "T7", + "decimals": 6, + "tokenID": 7, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "38164714107336114906" + }, + { + "name": "Test Token 8", + "symbol": "T8", + "decimals": 6, + "tokenID": 8, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "53692298236958224075" + }, + { + "name": "Test Token 9", + "symbol": "T9", + "decimals": 18, + "tokenID": 9, + "balanceSlot": 3, + "scale": "1000000000000000000", + "priceRatio": "95420241524621205786" + }, + { + "name": "Test Token 10", + "symbol": "T10", + "decimals": 6, + "tokenID": 10, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "25756632947890861072" + }, + { + "name": "Test Token 11", + "symbol": "T11", + "decimals": 6, + "tokenID": 11, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "18028138931330557088" + }, + { + "name": "Test Token 12", + "symbol": "T12", + "decimals": 18, + "tokenID": 12, + "balanceSlot": 3, + "scale": "1000000000000000000", + "priceRatio": "63796417708902213793" + }, + { + "name": "Test Token 13", + "symbol": "T13", + "decimals": 6, + "tokenID": 13, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "39665915062604805218" + }, + { + "name": "Test Token 14", + "symbol": "T14", + "decimals": 6, + "tokenID": 14, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "12722947968931732842" + }, + { + "name": "Test Token 15", + "symbol": "T15", + "decimals": 18, + "tokenID": 15, + "balanceSlot": 3, + "scale": "1000000000000000000", + "priceRatio": "70109502462455629135" + }, + { + "name": "Test Token 16", + "symbol": "T16", + "decimals": 6, + "tokenID": 16, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "18907807359378053203" + }, + { + "name": "Test Token 17", + "symbol": "T17", + "decimals": 6, + "tokenID": 17, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "46657969304715671332" + }, + { + "name": "Test Token 18", + "symbol": "T18", + "decimals": 18, + "tokenID": 18, + "balanceSlot": 3, + "scale": "1000000000000000000", + "priceRatio": "69472509895868806232" + }, + { + "name": "Test Token 19", + "symbol": "T19", + "decimals": 6, + "tokenID": 19, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "17144409117624266298" + }, + { + "name": "Test Token 20", + "symbol": "T20", + "decimals": 6, + "tokenID": 20, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "33540571034713903643" + }, + { + "name": "Test Token 21", + "symbol": "T21", + "decimals": 18, + "tokenID": 21, + "balanceSlot": 3, + "scale": "1000000000000000000", + "priceRatio": "95273826990777214944" + }, + { + "name": "Test Token 22", + "symbol": "T22", + "decimals": 6, + "tokenID": 22, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "56197288434640708771" + }, + { + "name": "Test Token 23", + "symbol": "T23", + "decimals": 6, + "tokenID": 23, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "73915582533826057379" + }, + { + "name": "Test Token 24", + "symbol": "T24", + "decimals": 18, + "tokenID": 24, + "balanceSlot": 3, + "scale": "1000000000000000000", + "priceRatio": "57444700001693072686" + }, + { + "name": "Test Token 25", + "symbol": "T25", + "decimals": 6, + "tokenID": 25, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "44083880254436672476" + }, + { + "name": "Test Token 26", + "symbol": "T26", + "decimals": 6, + "tokenID": 26, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "21542592563162243546" + }, + { + "name": "Test Token 27", + "symbol": "T27", + "decimals": 18, + "tokenID": 27, + "balanceSlot": 3, + "scale": "1000000000000000000", + "priceRatio": "67535878324713623818" + }, + { + "name": "Test Token 28", + "symbol": "T28", + "decimals": 6, + "tokenID": 28, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "20476599673874955789" + }, + { + "name": "Test Token 29", + "symbol": "T29", + "decimals": 6, + "tokenID": 29, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "34314726040826715299" + }, + { + "name": "Test Token 30", + "symbol": "T30", + "decimals": 18, + "tokenID": 30, + "balanceSlot": 3, + "scale": "1000000000000000000", + "priceRatio": "21515084768582046722" + }, + { + "name": "Test Token 31", + "symbol": "T31", + "decimals": 6, + "tokenID": 31, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "59149159565705288392" + }, + { + "name": "Test Token 32", + "symbol": "T32", + "decimals": 6, + "tokenID": 32, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "114024078846613525" + }, + { + "name": "Test Token 33", + "symbol": "T33", + "decimals": 18, + "tokenID": 33, + "balanceSlot": 3, + "scale": "1000000000000000000", + "priceRatio": "74803508987509964087" + }, + { + "name": "Test Token 34", + "symbol": "T34", + "decimals": 6, + "tokenID": 34, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "36235819884926901790" + }, + { + "name": "Test Token 35", + "symbol": "T35", + "decimals": 6, + "tokenID": 35, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "11259023081896722323" + }, + { + "name": "Test Token 36", + "symbol": "T36", + "decimals": 18, + "tokenID": 36, + "balanceSlot": 3, + "scale": "1000000000000000000", + "priceRatio": "6797200384632383830" + }, + { + "name": "Test Token 37", + "symbol": "T37", + "decimals": 6, + "tokenID": 37, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "49549145671692485507" + }, + { + "name": "Test Token 38", + "symbol": "T38", + "decimals": 6, + "tokenID": 38, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "14375967477826844936" + }, + { + "name": "Test Token 39", + "symbol": "T39", + "decimals": 18, + "tokenID": 39, + "balanceSlot": 3, + "scale": "1000000000000000000", + "priceRatio": "36684899225139230696" + }, + { + "name": "Test Token 40", + "symbol": "T40", + "decimals": 6, + "tokenID": 40, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "67546404948665609945" + }, + { + "name": "Test Token 41", + "symbol": "T41", + "decimals": 6, + "tokenID": 41, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "86898616623323813058" + }, + { + "name": "Test Token 42", + "symbol": "T42", + "decimals": 18, + "tokenID": 42, + "balanceSlot": 3, + "scale": "1000000000000000000", + "priceRatio": "21162735980144258529" + }, + { + "name": "Test Token 43", + "symbol": "T43", + "decimals": 6, + "tokenID": 43, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "98248981425952840663" + }, + { + "name": "Test Token 44", + "symbol": "T44", + "decimals": 6, + "tokenID": 44, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "18661589584463400613" + }, + { + "name": "Test Token 45", + "symbol": "T45", + "decimals": 18, + "tokenID": 45, + "balanceSlot": 3, + "scale": "1000000000000000000", + "priceRatio": "67521340213232829917" + }, + { + "name": "Test Token 46", + "symbol": "T46", + "decimals": 6, + "tokenID": 46, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "26348461062687680656" + }, + { + "name": "Test Token 47", + "symbol": "T47", + "decimals": 6, + "tokenID": 47, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "55822156776537032907" + }, + { + "name": "Test Token 48", + "symbol": "T48", + "decimals": 18, + "tokenID": 48, + "balanceSlot": 3, + "scale": "1000000000000000000", + "priceRatio": "5938247499186059222" + }, + { + "name": "Test Token 49", + "symbol": "T49", + "decimals": 6, + "tokenID": 49, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "7714200568135586056" + }, + { + "name": "Test Token 50", + "symbol": "T50", + "decimals": 6, + "tokenID": 50, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "282993314835393582" + }, + { + "name": "Test Token 51", + "symbol": "T51", + "decimals": 18, + "tokenID": 51, + "balanceSlot": 3, + "scale": "1000000000000000000", + "priceRatio": "90982183814912910049" + }, + { + "name": "Test Token 52", + "symbol": "T52", + "decimals": 6, + "tokenID": 52, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "47773786324994763609" + }, + { + "name": "Test Token 53", + "symbol": "T53", + "decimals": 6, + "tokenID": 53, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "38386985766663882935" + }, + { + "name": "Test Token 54", + "symbol": "T54", + "decimals": 18, + "tokenID": 54, + "balanceSlot": 3, + "scale": "1000000000000000000", + "priceRatio": "99142548748920614516" + }, + { + "name": "Test Token 55", + "symbol": "T55", + "decimals": 6, + "tokenID": 55, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "80945713604301844697" + }, + { + "name": "Test Token 56", + "symbol": "T56", + "decimals": 6, + "tokenID": 56, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "3497343514449409628" + }, + { + "name": "Test Token 57", + "symbol": "T57", + "decimals": 18, + "tokenID": 57, + "balanceSlot": 3, + "scale": "1000000000000000000", + "priceRatio": "83803739592343936212" + }, + { + "name": "Test Token 58", + "symbol": "T58", + "decimals": 6, + "tokenID": 58, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "83120121084834127225" + }, + { + "name": "Test Token 59", + "symbol": "T59", + "decimals": 6, + "tokenID": 59, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "44278989089138351113" + }, + { + "name": "Test Token 60", + "symbol": "T60", + "decimals": 18, + "tokenID": 60, + "balanceSlot": 3, + "scale": "1000000000000000000", + "priceRatio": "79082132030160042260" + }, + { + "name": "Test Token 61", + "symbol": "T61", + "decimals": 6, + "tokenID": 61, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "82052674753343665473" + }, + { + "name": "Test Token 62", + "symbol": "T62", + "decimals": 6, + "tokenID": 62, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "15967944088369769094" + }, + { + "name": "Test Token 63", + "symbol": "T63", + "decimals": 18, + "tokenID": 63, + "balanceSlot": 3, + "scale": "1000000000000000000", + "priceRatio": "65006456314535872445" + }, + { + "name": "Test Token 64", + "symbol": "T64", + "decimals": 6, + "tokenID": 64, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "70520767419421375318" + }, + { + "name": "Test Token 65", + "symbol": "T65", + "decimals": 6, + "tokenID": 65, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "6418782493958243076" + }, + { + "name": "Test Token 66", + "symbol": "T66", + "decimals": 18, + "tokenID": 66, + "balanceSlot": 3, + "scale": "1000000000000000000", + "priceRatio": "37094069467125718529" + }, + { + "name": "Test Token 67", + "symbol": "T67", + "decimals": 6, + "tokenID": 67, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "85658122830627743284" + }, + { + "name": "Test Token 68", + "symbol": "T68", + "decimals": 6, + "tokenID": 68, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "12202753127902304368" + }, + { + "name": "Test Token 69", + "symbol": "T69", + "decimals": 18, + "tokenID": 69, + "balanceSlot": 3, + "scale": "1000000000000000000", + "priceRatio": "39979769689563927951" + }, + { + "name": "Test Token 70", + "symbol": "T70", + "decimals": 6, + "tokenID": 70, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "57765328107123254693" + }, + { + "name": "Test Token 71", + "symbol": "T71", + "decimals": 6, + "tokenID": 71, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "17800617434043947362" + }, + { + "name": "Test Token 72", + "symbol": "T72", + "decimals": 18, + "tokenID": 72, + "balanceSlot": 3, + "scale": "1000000000000000000", + "priceRatio": "23168484743796278493" + }, + { + "name": "Test Token 73", + "symbol": "T73", + "decimals": 6, + "tokenID": 73, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "60051481566495718257" + }, + { + "name": "Test Token 74", + "symbol": "T74", + "decimals": 6, + "tokenID": 74, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "87119605615965973989" + }, + { + "name": "Test Token 75", + "symbol": "T75", + "decimals": 18, + "tokenID": 75, + "balanceSlot": 3, + "scale": "1000000000000000000", + "priceRatio": "69451746761265096178" + }, + { + "name": "Test Token 76", + "symbol": "T76", + "decimals": 6, + "tokenID": 76, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "21847218206971654028" + }, + { + "name": "Test Token 77", + "symbol": "T77", + "decimals": 6, + "tokenID": 77, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "59989885872654629531" + }, + { + "name": "Test Token 78", + "symbol": "T78", + "decimals": 18, + "tokenID": 78, + "balanceSlot": 3, + "scale": "1000000000000000000", + "priceRatio": "12555986186913082249" + }, + { + "name": "Test Token 79", + "symbol": "T79", + "decimals": 6, + "tokenID": 79, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "41014237982409985856" + }, + { + "name": "Test Token 80", + "symbol": "T80", + "decimals": 6, + "tokenID": 80, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "13611242082460003467" + }, + { + "name": "Test Token 81", + "symbol": "T81", + "decimals": 18, + "tokenID": 81, + "balanceSlot": 3, + "scale": "1000000000000000000", + "priceRatio": "44643771504283841241" + }, + { + "name": "Test Token 82", + "symbol": "T82", + "decimals": 6, + "tokenID": 82, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "86137359472213748299" + }, + { + "name": "Test Token 83", + "symbol": "T83", + "decimals": 6, + "tokenID": 83, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "55065485716187332069" + }, + { + "name": "Test Token 84", + "symbol": "T84", + "decimals": 18, + "tokenID": 84, + "balanceSlot": 3, + "scale": "1000000000000000000", + "priceRatio": "38607368716591348773" + }, + { + "name": "Test Token 85", + "symbol": "T85", + "decimals": 6, + "tokenID": 85, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "52603793233934805909" + }, + { + "name": "Test Token 86", + "symbol": "T86", + "decimals": 6, + "tokenID": 86, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "87944642393323176020" + }, + { + "name": "Test Token 87", + "symbol": "T87", + "decimals": 18, + "tokenID": 87, + "balanceSlot": 3, + "scale": "1000000000000000000", + "priceRatio": "32455093939053299619" + }, + { + "name": "Test Token 88", + "symbol": "T88", + "decimals": 6, + "tokenID": 88, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "60482997517815130643" + }, + { + "name": "Test Token 89", + "symbol": "T89", + "decimals": 6, + "tokenID": 89, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "87218564072108661464" + }, + { + "name": "Test Token 90", + "symbol": "T90", + "decimals": 18, + "tokenID": 90, + "balanceSlot": 3, + "scale": "1000000000000000000", + "priceRatio": "81696708175157151135" + }, + { + "name": "Test Token 91", + "symbol": "T91", + "decimals": 6, + "tokenID": 91, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "79132703575151181660" + }, + { + "name": "Test Token 92", + "symbol": "T92", + "decimals": 6, + "tokenID": 92, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "49301528187395195799" + }, + { + "name": "Test Token 93", + "symbol": "T93", + "decimals": 18, + "tokenID": 93, + "balanceSlot": 3, + "scale": "1000000000000000000", + "priceRatio": "65927982334011591895" + }, + { + "name": "Test Token 94", + "symbol": "T94", + "decimals": 6, + "tokenID": 94, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "18486727103065851735" + }, + { + "name": "Test Token 95", + "symbol": "T95", + "decimals": 6, + "tokenID": 95, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "78428131473826940537" + }, + { + "name": "Test Token 96", + "symbol": "T96", + "decimals": 18, + "tokenID": 96, + "balanceSlot": 3, + "scale": "1000000000000000000", + "priceRatio": "35059782306886091423" + }, + { + "name": "Test Token 97", + "symbol": "T97", + "decimals": 6, + "tokenID": 97, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "44048066582413268213" + }, + { + "name": "Test Token 98", + "symbol": "T98", + "decimals": 6, + "tokenID": 98, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "33671922684403215026" + }, + { + "name": "Test Token 99", + "symbol": "T99", + "decimals": 18, + "tokenID": 99, + "balanceSlot": 3, + "scale": "1000000000000000000", + "priceRatio": "21384849698979504579" + }, + { + "name": "Test Token 100", + "symbol": "T100", + "decimals": 6, + "tokenID": 100, + "balanceSlot": 3, + "scale": "1000000", + "priceRatio": "39080747780290942674" + } +] diff --git a/contracts/tasks/overflow_test.ts b/contracts/tasks/overflow_test.ts index b674dfabd..2ad741f3d 100644 --- a/contracts/tasks/overflow_test.ts +++ b/contracts/tasks/overflow_test.ts @@ -81,57 +81,39 @@ task("crossHash") .addParam("message") .addParam("count") .setAction(async (taskArgs, hre) => { - 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; - } - }); + 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) + + }) task("updateLimit") .addParam("contractaddr") .addParam("gaslimit") .setAction(async (taskArgs, hre) => { - 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; - } - }); + 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); + }) task("printResult") .addParam("contractaddr") diff --git a/contracts/tasks/staking_upgrade.ts b/contracts/tasks/staking_upgrade.ts index d9f5e2e7b..9a237e62d 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 implementation failed ${err}`) + console.log(`deploy L1Staking implemention 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 b942b243b..326b2077f 100644 --- a/contracts/tasks/token_deploy.ts +++ b/contracts/tasks/token_deploy.ts @@ -4,6 +4,8 @@ import "@nomiclabs/hardhat-waffle"; import { task } from "hardhat/config"; import { ethers } from "ethers"; +import * as fs from "fs"; +import * as path from "path"; const V2_1ABI = `[ { @@ -610,4 +612,410 @@ task("deploy-l2-MigrationUSDC") const oldtoken = await migrationProxy.OLD_USDC() const newtoken = await migrationProxy.NEW_USDC() console.log(`owner ${owner}, oldtoken ${oldtoken}, newtoken ${newtoken}`) + }) + +task("deploy-l2-token-registry") + .addParam("proxyadmin","Proxy admin address","0x530000000000000000000000000000000000000B") + .addOptionalParam("proxy", "Existing proxy address (if upgrading)","0x5300000000000000000000000000000000000021") + .addParam("owner") + .setAction(async (taskArgs, hre) => { + // params check + if (!ethers.utils.isAddress(taskArgs.proxyadmin) || + !ethers.utils.isAddress(taskArgs.owner) + ) { + console.error(`address params check failed, proxyadmin: ${taskArgs.proxyadmin}, owner: ${taskArgs.owner}`) + return + } + + // deploy L2TokenRegistry impl + const TokenRegistryFactory = await hre.ethers.getContractFactory("L2TokenRegistry") + const tokenRegistry = await TokenRegistryFactory.deploy() + await tokenRegistry.deployed() + console.log(`L2TokenRegistry impl deployed at ${tokenRegistry.address}`) + + let proxyAddress; + + // Check if proxy parameter exists for upgrade + if (taskArgs.proxy && ethers.utils.isAddress(taskArgs.proxy)) { + console.log(`\nUpgrading existing proxy at ${taskArgs.proxy}`) + + // Get ProxyAdmin contract + const ProxyAdminFactory = await hre.ethers.getContractFactory("ProxyAdmin") + const proxyAdmin = ProxyAdminFactory.attach(taskArgs.proxyadmin) + + // Upgrade the proxy to new implementation + const upgradeTx = await proxyAdmin.upgrade( + taskArgs.proxy, + tokenRegistry.address + ) + await upgradeTx.wait() + console.log(`Proxy upgraded to new implementation: ${tokenRegistry.address}`) + // Check if a call to initialize is needed after upgrading the implementation. + // Read the proxy contract's storage slot to see if already initialized. + const tokenRegistryProxyInstance = TokenRegistryFactory.attach(taskArgs.proxy) + const isInitialized = await tokenRegistryProxyInstance.owner().then(owner => { + // Owner should not be address(0) if initialized. + return owner && owner !== ethers.constants.AddressZero + }).catch(() => false) + + if (!isInitialized) { + console.log(`Proxy not initialized. Calling initialize...`) + const tx = await tokenRegistryProxyInstance.initialize(taskArgs.owner) + await tx.wait() + console.log(`Initialization completed.`) + } else { + console.log(`Proxy already initialized, skipping initialize() call.`) + } + proxyAddress = taskArgs.proxy + } else { + console.log(`\nDeploying new proxy`) + + // deploy proxy with initialize + const TransparentProxyFactory = await hre.ethers.getContractFactory("TransparentUpgradeableProxy") + const proxy = await TransparentProxyFactory.deploy( + tokenRegistry.address, //logic + taskArgs.proxyadmin, //admin + TokenRegistryFactory.interface.encodeFunctionData('initialize', [ + taskArgs.owner // owner + ]) // data + ) + await proxy.deployed() + console.log(`L2TokenRegistry proxy deployed at ${proxy.address}`) + + proxyAddress = proxy.address + } + + // Verify deployment + const tokenRegistryProxy = TokenRegistryFactory.attach(proxyAddress) + const registryOwner = await tokenRegistryProxy.owner() + const allowListEnabled = await tokenRegistryProxy.allowListEnabled() + console.log(`\nL2TokenRegistry proxy address: ${proxyAddress}`) + console.log(`L2TokenRegistry proxy owner: ${registryOwner}`) + console.log(`L2TokenRegistry allowListEnabled: ${allowListEnabled}`) + }) + +task("deploy-test-tokens-and-register") + .addParam("tokenregistry","Contract address","0x5300000000000000000000000000000000000021") + .addOptionalParam("count", "Number of test tokens to deploy", "10") + .setAction(async (taskArgs, hre) => { + // params check + if (!ethers.utils.isAddress(taskArgs.tokenregistry)) { + console.error(`tokenregistry address check failed: ${taskArgs.tokenregistry}`) + return + } + + const tokenCount = parseInt(taskArgs.count || "10") + if (tokenCount < 1) { + console.error(`token count should be at least 1, got: ${tokenCount}`) + return + } + + // Load token configurations from JSON file + const tokensFilePath = path.join(__dirname, "../src/tokens/tokens.json") + if (!fs.existsSync(tokensFilePath)) { + console.error(`Tokens file not found: ${tokensFilePath}`) + return + } + + const allTokensData = JSON.parse(fs.readFileSync(tokensFilePath, "utf8")) + if (!Array.isArray(allTokensData) || allTokensData.length === 0) { + console.error(`Invalid tokens file format or empty tokens array`) + return + } + + console.log(`\n========================================`) + console.log(`Connecting to L2TokenRegistry...`) + console.log(`========================================\n`) + + // Connect to L2TokenRegistry + const TokenRegistryFactory = await hre.ethers.getContractFactory("L2TokenRegistry") + const tokenRegistry = TokenRegistryFactory.attach(taskArgs.tokenregistry) + + // Verify registry + try { + const registryOwner = await tokenRegistry.owner() + console.log(`L2TokenRegistry address: ${taskArgs.tokenregistry}`) + console.log(`L2TokenRegistry owner: ${registryOwner}`) + } catch (error) { + console.error(`Failed to connect to L2TokenRegistry: ${error}`) + return + } + + // Check which tokenIDs are already registered + console.log(`\n========================================`) + console.log(`Checking registered tokenIDs...`) + console.log(`========================================\n`) + + const registeredTokenIDs = new Set() + const maxTokenID = Math.min(100, allTokensData.length) + + for (let tokenID = 1; tokenID <= maxTokenID; tokenID++) { + try { + const tokenInfo = await tokenRegistry.tokenRegistry(tokenID) + if (tokenInfo.tokenAddress !== ethers.constants.AddressZero) { + registeredTokenIDs.add(tokenID) + } + } catch (error) { + // If tokenID is not registered, tokenAddress will be zero address + } + } + + console.log(`Found ${registeredTokenIDs.size} already registered tokenIDs: ${Array.from(registeredTokenIDs).sort((a, b) => a - b).join(", ")}`) + + // Find the next available tokenID to start from + let startTokenID = 1 + for (let i = 1; i <= maxTokenID; i++) { + if (!registeredTokenIDs.has(i)) { + startTokenID = i + break + } + } + + if (registeredTokenIDs.size >= maxTokenID) { + console.log(`\nAll ${maxTokenID} token slots are already registered. Nothing to deploy.`) + return + } + + // Check if total registered tokens would exceed 100 + if (registeredTokenIDs.size >= 100) { + console.log(`\n⚠ Warning: Already have ${registeredTokenIDs.size} registered tokens. Cannot register more than 100 tokens.`) + return + } + + // Calculate how many tokens we can deploy (max 100 total) + const availableSlots = Math.min(100 - registeredTokenIDs.size, maxTokenID - registeredTokenIDs.size) + const tokensToDeployCount = Math.min(tokenCount, availableSlots) + + if (tokensToDeployCount === 0) { + console.log(`No available token slots to deploy.`) + return + } + + console.log(`\nWill deploy ${tokensToDeployCount} tokens starting from tokenID ${startTokenID}`) + console.log(`Total registered after deployment: ${registeredTokenIDs.size + tokensToDeployCount}/100`) + + // Get tokens to deploy + const tokensToDeploy = [] + let currentTokenID = startTokenID + let deployedCount = 0 + + while (deployedCount < tokensToDeployCount && currentTokenID <= maxTokenID && registeredTokenIDs.size + deployedCount < 100) { + if (!registeredTokenIDs.has(currentTokenID)) { + const tokenData = allTokensData.find((t: any) => t.tokenID === currentTokenID) + if (tokenData) { + tokensToDeploy.push({ + ...tokenData, + tokenID: currentTokenID, + scale: ethers.BigNumber.from(tokenData.scale), + priceRatio: ethers.BigNumber.from(tokenData.priceRatio) + }) + deployedCount++ + } + } + currentTokenID++ + } + + if (tokensToDeploy.length === 0) { + console.log(`No tokens available to deploy.`) + return + } + + // Final check: ensure we don't exceed 100 tokens + if (registeredTokenIDs.size + tokensToDeploy.length > 100) { + const maxCanDeploy = 100 - registeredTokenIDs.size + console.log(`\n⚠ Warning: Can only deploy ${maxCanDeploy} tokens to stay within 100 token limit.`) + console.log(`Requested: ${tokensToDeploy.length}, Will deploy: ${maxCanDeploy}`) + tokensToDeploy.splice(maxCanDeploy) + } + + console.log(`\n========================================`) + console.log(`Deploying ${tokensToDeploy.length} test tokens...`) + console.log(`========================================\n`) + + const deployedTokens = [] + const TokenFactory = await hre.ethers.getContractFactory("MockERC20") + + // Deploy tokens + for (let i = 0; i < tokensToDeploy.length; i++) { + const config = tokensToDeploy[i] + console.log(`[${i + 1}/${tokensToDeploy.length}] Deploying ${config.name} (${config.symbol}) - TokenID: ${config.tokenID}...`) + + const token = await TokenFactory.deploy( + config.name, + config.symbol, + config.decimals + ) + await token.deployed() + + console.log(` ✓ Token deployed at: ${token.address}`) + console.log(` - Name: ${config.name}`) + console.log(` - Symbol: ${config.symbol}`) + console.log(` - Decimals: ${config.decimals}`) + + deployedTokens.push({ + ...config, + address: token.address, + contract: token + }) + } + + console.log(`\n========================================`) + console.log(`Registering tokens to L2TokenRegistry...`) + console.log(`========================================\n`) + + // Prepare arrays for batch registration + const tokenIDs: number[] = [] + const tokenAddresses: string[] = [] + const balanceSlots: string[] = [] + const needBalanceSlots: boolean[] = [] + const scales: string[] = [] + + for (const token of deployedTokens) { + tokenIDs.push(token.tokenID) + tokenAddresses.push(token.address) + // Calculate balance slot for mapping(address => uint256) at slot 0 + // For MockERC20, balance mapping is typically at slot 0 + // The actual slot for a user's balance is keccak256(abi.encode(userAddress, slot)) + // Here we use slot 0 as the base slot + const balanceSlotValue = ethers.BigNumber.from(token.balanceSlot) + balanceSlots.push(ethers.utils.hexZeroPad(balanceSlotValue.toHexString(), 32)) + // Only set needBalanceSlot to true if balanceSlot is not 0 + needBalanceSlots.push(!balanceSlotValue.isZero()) + scales.push(token.scale.toString()) + } + + console.log(`Registering ${tokenIDs.length} tokens in batch...`) + console.log(`Token IDs: ${tokenIDs.join(", ")}`) + console.log(`Token Addresses: ${tokenAddresses.join(", ")}`) + + try { + // Batch register tokens + const tx = await tokenRegistry.registerTokens( + tokenIDs, + tokenAddresses, + balanceSlots, + needBalanceSlots, + scales + ) + console.log(`\n ✓ Registration transaction sent: ${tx.hash}`) + + const receipt = await tx.wait() + console.log(` ✓ Transaction confirmed in block: ${receipt.blockNumber}`) + console.log(` ✓ Gas used: ${receipt.gasUsed.toString()}`) + + // Set prices for registered tokens + console.log(`\n========================================`) + console.log(`Setting prices for registered tokens...`) + console.log(`========================================\n`) + + try { + const priceTokenIDs: number[] = [] + const prices: string[] = [] + + for (const token of deployedTokens) { + priceTokenIDs.push(token.tokenID) + prices.push(token.priceRatio.toString()) + } + + console.log(`Setting prices for ${priceTokenIDs.length} tokens...`) + const priceTx = await tokenRegistry.batchUpdatePrices(priceTokenIDs, prices) + console.log(` ✓ Price update transaction sent: ${priceTx.hash}`) + + const priceReceipt = await priceTx.wait() + console.log(` ✓ Prices confirmed in block: ${priceReceipt.blockNumber}`) + console.log(` ✓ Gas used: ${priceReceipt.gasUsed.toString()}`) + + // Display price information + console.log(`\nPrice information:`) + for (const token of deployedTokens) { + const price = await tokenRegistry.priceRatio(token.tokenID) + console.log(` ${token.symbol} (ID: ${token.tokenID}): ${price.toString()}`) + } + } catch (priceError) { + console.error(`\n⚠ Failed to set prices: ${priceError}`) + console.log(`Attempting individual price updates...\n`) + + // Fallback to individual price updates + for (const token of deployedTokens) { + try { + const priceTx = await tokenRegistry.updatePriceRatio(token.tokenID, token.priceRatio) + const priceReceipt = await priceTx.wait() + console.log(` ✓ ${token.symbol} price set in block: ${priceReceipt.blockNumber}`) + } catch (err) { + console.error(` ✗ Failed to set price for ${token.symbol}: ${err}`) + } + } + } + + // Verify registration + console.log(`\n========================================`) + console.log(`Verifying token registrations...`) + console.log(`========================================\n`) + + for (const token of deployedTokens) { + try { + const tokenInfo = await tokenRegistry.tokenRegistry(token.tokenID) + const registeredTokenID = await tokenRegistry.tokenRegistration(token.address) + const priceRatio = await tokenRegistry.priceRatio(token.tokenID) + + console.log(`Token ID ${token.tokenID} (${token.symbol}):`) + console.log(` - Address: ${tokenInfo.tokenAddress}`) + console.log(` - Balance Slot: ${tokenInfo.balanceSlot}`) + console.log(` - Is Active: ${tokenInfo.isActive}`) + console.log(` - Decimals: ${tokenInfo.decimals}`) + console.log(` - Scale: ${tokenInfo.scale.toString()}`) + console.log(` - Price Ratio: ${priceRatio.toString()}`) + console.log(` - Registered TokenID: ${registeredTokenID}`) + console.log(` ✓ Registration verified\n`) + } catch (error) { + console.error(` ✗ Failed to verify token ${token.tokenID}: ${error}\n`) + } + } + + console.log(`\n========================================`) + console.log(`Summary:`) + console.log(`========================================`) + console.log(`Total tokens deployed: ${deployedTokens.length}`) + console.log(`Total tokens registered: ${tokenIDs.length}`) + console.log(`\nToken addresses:`) + for (const token of deployedTokens) { + console.log(` ${token.symbol} (ID: ${token.tokenID}): ${token.address}`) + } + console.log(`\nL2TokenRegistry: ${taskArgs.tokenregistry}`) + console.log(`========================================\n`) + + } catch (error) { + console.error(`\n✗ Failed to register tokens: ${error}`) + console.log(`\nTrying individual registration instead...\n`) + + // Fallback to individual registration + for (const token of deployedTokens) { + try { + console.log(`Registering ${token.symbol} (ID: ${token.tokenID}) individually...`) + const balanceSlotValue = ethers.BigNumber.from(token.balanceSlot) + const balanceSlot = ethers.utils.hexZeroPad(balanceSlotValue.toHexString(), 32) + const needBalanceSlot = !balanceSlotValue.isZero() // Only set to true if balanceSlot is not 0 + const tx = await tokenRegistry.registerToken( + token.tokenID, + token.address, + balanceSlot, + needBalanceSlot, + token.scale + ) + const receipt = await tx.wait() + console.log(` ✓ ${token.symbol} registered in block: ${receipt.blockNumber}`) + + // Set price after registration + try { + const priceTx = await tokenRegistry.updatePriceRatio(token.tokenID, token.priceRatio) + const priceReceipt = await priceTx.wait() + console.log(` ✓ ${token.symbol} price set in block: ${priceReceipt.blockNumber}\n`) + } catch (priceErr) { + console.error(` ⚠ Failed to set price for ${token.symbol}: ${priceErr}\n`) + } + } catch (err) { + console.error(` ✗ Failed to register ${token.symbol}: ${err}\n`) + } + } + } }) \ No newline at end of file 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 000000000..3382e351a --- /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 dc4c9bba6..28f7a5c6d 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,9 +609,14 @@ "type": "bytes" }, { - "internalType": "bytes", - "name": "blockContexts", - "type": "bytes" + "internalType": "uint64", + "name": "lastBlockNumber", + "type": "uint64" + }, + { + "internalType": "uint16", + "name": "numL1Messages", + "type": "uint16" }, { "internalType": "bytes32", diff --git a/gas-oracle/app/src/da_scalar/calculate.rs b/gas-oracle/app/src/da_scalar/calculate.rs index 22d409e0c..92b0e537e 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 485a02bf7..140e8163f 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/gas-oracle/app/src/l1_base_fee.rs b/gas-oracle/app/src/l1_base_fee.rs index 09fc97c52..aaa977b07 100644 --- a/gas-oracle/app/src/l1_base_fee.rs +++ b/gas-oracle/app/src/l1_base_fee.rs @@ -1,7 +1,8 @@ use std::{str::FromStr, sync::Arc}; use crate::{ - abi::gas_price_oracle_abi::GasPriceOracle, calc_blob_basefee, external_sign::ExternalSign, metrics::ORACLE_SERVICE_METRICS, signer::send_transaction, OracleError + abi::gas_price_oracle_abi::GasPriceOracle, external_sign::ExternalSign, + metrics::ORACLE_SERVICE_METRICS, signer::send_transaction, OracleError, }; use ethers::prelude::*; use eyre::anyhow; @@ -210,8 +211,14 @@ async fn query_l1_base_fee( })?; let l1_base_fee = latest_block.base_fee_per_gas.unwrap_or_default(); - let excess_blob_gas = latest_block.excess_blob_gas.unwrap_or_default(); - let latest_blob_fee = calc_blob_basefee(excess_blob_gas.as_u64()); + + // Use the Blob blobBaseFee provided by the L1 node. + // We no longer compute it locally (e.g. via `calc_blob_basefee`) to avoid + // depending on future L1 config changes. + let latest_blob_fee = l1_provider + .request::<(), U256>("eth_blobBaseFee", ()) + .await + .map_err(|e| OracleError::L1BaseFeeError(anyhow!(format!("eth_blobBaseFee: {:#?}", e))))?; let gas_price = match l1_provider.get_gas_price().await { Ok(gp) => gp, @@ -226,3 +233,15 @@ async fn query_l1_base_fee( Ok((l1_base_fee, U256::from(latest_blob_fee), gas_price)) } + +#[tokio::test] +async fn test_eth_blob_base_fee() -> Result<(), OracleError> { + let l1_provider = Provider::::try_from("https://ethereum-rpc.publicnode.com").unwrap(); + let blob_base_fee = l1_provider + .request::<(), U256>("eth_blobBaseFee", ()) + .await + .map_err(|e| OracleError::L1BaseFeeError(anyhow!(format!("eth_blobBaseFee: {:#?}", e))))?; + + println!("eth_blobBaseFee: {:?}", blob_base_fee); + Ok(()) +} diff --git a/gas-oracle/app/src/lib.rs b/gas-oracle/app/src/lib.rs index fbeca2eca..d5055f4ae 100644 --- a/gas-oracle/app/src/lib.rs +++ b/gas-oracle/app/src/lib.rs @@ -39,33 +39,4 @@ pub fn contract_error(e: ContractError) -> String { format!("error: {:#?}", e) }; error_msg -} - -/// Minimum gas price for data blobs. -pub const MIN_BLOB_GASPRICE: u64 = 1; - -/// Controls the maximum rate of change for blob gas price. -pub const BLOB_GASPRICE_UPDATE_FRACTION: u64 = 3338477; - -pub fn calc_blob_basefee(excess_blob_gas: u64) -> u128 { - fake_exponential(MIN_BLOB_GASPRICE, excess_blob_gas, BLOB_GASPRICE_UPDATE_FRACTION) -} - -fn fake_exponential(factor: u64, numerator: u64, denominator: u64) -> u128 { - assert_ne!(denominator, 0, "attempt to divide by zero"); - let factor = factor as u128; - let numerator = numerator as u128; - let denominator = denominator as u128; - - let mut i = 1; - let mut output = 0; - let mut numerator_accum = factor * denominator; - while numerator_accum > 0 { - output += numerator_accum; - - // Denominator is asserted as not zero at the start of the function. - numerator_accum = (numerator_accum * numerator) / (denominator * i); - i += 1; - } - output / denominator -} +} \ No newline at end of file diff --git a/gas-oracle/app/src/signer.rs b/gas-oracle/app/src/signer.rs index f3b96b794..929939b12 100644 --- a/gas-oracle/app/src/signer.rs +++ b/gas-oracle/app/src/signer.rs @@ -85,14 +85,12 @@ async fn sign_tx( //Fee estimator lazy_static::lazy_static! { - static ref PRIORITY_FEE_INCREASE_MULTIPLIER: i32= read_env_var("PRIORITY_FEE_INCREASE_MULTIPLIER", 11); - static ref PRIORITY_FEE_INCREASE_DIVISOR: i32= read_env_var("PRIORITY_FEE_INCREASE_DIVISOR", 10); static ref EIP1559_FEE_ESTIMATION_MAX_FEE: u64= read_env_var("EIP1559_FEE_ESTIMATION_MAX_FEE", 200_000_000_000); } -fn eip1559_estimator(base_fee_per_gas: U256, rewards: Vec>) -> (U256, U256) { - let max_priority_fee_per_gas = - std::cmp::max(estimate_priority_fee(rewards), base_fee_per_gas / 10); +const PRIORITY_FEE_PER_GAS_WEI: u64 = 1_000_000; // 0.001 Gwei +fn eip1559_estimator(base_fee_per_gas: U256, _rewards: Vec>) -> (U256, U256) { + let max_priority_fee_per_gas = U256::from(PRIORITY_FEE_PER_GAS_WEI); let max_fee_per_gas = std::cmp::min( U256::from(*EIP1559_FEE_ESTIMATION_MAX_FEE), base_fee_per_gas + max_priority_fee_per_gas, @@ -101,26 +99,14 @@ fn eip1559_estimator(base_fee_per_gas: U256, rewards: Vec>) -> (U256, (max_fee_per_gas, max_priority_fee_per_gas) } -fn estimate_priority_fee(rewards: Vec>) -> U256 { - let mut rewards: Vec = - rewards.iter().map(|r| r[0]).filter(|r| *r > U256::zero()).collect(); - if rewards.is_empty() { - return U256::zero() - } - if rewards.len() == 1 { - return rewards[0] - } - // Sort the rewards as we will eventually take the median. - rewards.sort(); - rewards[rewards.len() / 2] * *PRIORITY_FEE_INCREASE_MULTIPLIER / *PRIORITY_FEE_INCREASE_DIVISOR -} + #[tokio::test] #[ignore] async fn test_estimate_eip1559_fees() { dotenv::dotenv().ok(); env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); - let l2_provider = Provider::::try_from("https://rpc.xx.io").unwrap(); + let l2_provider = Provider::::try_from("https://rpc-quicknode.morphl2.io").unwrap(); let l2_signer = Arc::new(SignerMiddleware::new( l2_provider.clone(), Wallet::from_str("0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80") diff --git a/go-ethereum b/go-ethereum index 1582a364e..4f0f6e6bd 160000 --- a/go-ethereum +++ b/go-ethereum @@ -1 +1 @@ -Subproject commit 1582a364edc0434bec74f3e3933d5a787b7429ac +Subproject commit 4f0f6e6bd14178a19a6ef6e57bdcb48eb6612bf4 diff --git a/go.work b/go.work index a223f15ce..d29dbaad9 100644 --- a/go.work +++ b/go.work @@ -1,4 +1,4 @@ -go 1.22 +go 1.24.0 use ( ./bindings @@ -7,5 +7,6 @@ use ( ./ops/l2-genesis ./ops/tools ./oracle + ./token-price-oracle ./tx-submitter ) diff --git a/go.work.sum b/go.work.sum index 597fdaeeb..8c91e41ad 100644 --- a/go.work.sum +++ b/go.work.sum @@ -2,142 +2,263 @@ 4d63.com/gochecknoglobals v0.1.0/go.mod h1:wfdC5ZjKSPr7CybKEcgJhUOgeAQW1+7WcyK8OvUilfo= cloud.google.com/go v0.43.0/go.mod h1:BOSR3VbTLkk6FDC/TcffxP4NF/FFBGA5ku+jvKOP7pg= cloud.google.com/go v0.51.0/go.mod h1:hWtGJ6gnXH+KgDv+V0zFGDvpi07n3z8ZNj3T1RW0Gcw= +cloud.google.com/go v0.78.0/go.mod h1:QjdrLG0uq+YwhjoVOLsS1t7TW8fs36kLs4XO5R5ECHg= +cloud.google.com/go v0.79.0/go.mod h1:3bzgcEeQlzbuEAYu4mrWhKqWjmpprinYgKJLgKHnbb8= +cloud.google.com/go v0.81.0/go.mod h1:mk/AM35KwGk/Nm2YSeZbxXdrNK3KZOYHmLkOqC2V6E0= 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= cloud.google.com/go/compute v1.23.3 h1:6sVlXXBmbd7jNX0Ipq0trII3e4n1/MsADLK6a+aiVlk= 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.1.0/go.mod h1:ulACoGHTpvq5r8rxGJ4ddJZBZqakUQqClKRT5SZwBmk= 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 +268,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/toml v1.5.0 h1:W5quZX/G/csjUnuI8SUYlsHs9M38FC7znL0lIO+DvMg= 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,18 +309,21 @@ 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= -github.com/VictoriaMetrics/fastcache v1.12.1/go.mod h1:tX04vaqcNoQeGLD+ra5pU5sWkuxnzWhEzLwhP9w653o= 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,19 @@ 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/bketelsen/crypt v0.0.4 h1:w/jqZtC9YD4DS/Vp9GhWfWcCpuAL58oTnLoI8vE9YHU= +github.com/bketelsen/crypt v0.0.4/go.mod h1:aI6NrJ0pMGgvZKL1iVgXLnfIFJtfV+bKCoqOes/6LfM= 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 +430,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= @@ -295,16 +442,23 @@ github.com/charithe/durationcheck v0.0.9 h1:mPP4ucLrf/rKZiIG/a9IPXHGlh8p4CzgpyTy github.com/charithe/durationcheck v0.0.9/go.mod h1:SSbRIBVfMjCi/kEB6K65XEA83D6prSM8ap1UCpNKtgg= github.com/chavacava/garif v0.0.0-20220630083739-93517212f375 h1:E7LT642ysztPWE0dfz43cWOvMiF42DyTRC+eZIaO4yI= github.com/chavacava/garif v0.0.0-20220630083739-93517212f375/go.mod h1:4m1Rv7xfuwWPNKXlThldNuJvutYM6J95wNuuVmn55To= +github.com/chengxilo/virtualterm v1.0.4 h1:Z6IpERbRVlfB8WkOmtbHiDbBANU7cimRIof7mk9/PwM= +github.com/chengxilo/virtualterm v1.0.4/go.mod h1:DyxxBZz/x1iqJjFxTFcr6/x+jSpqN0iwWCOK1q10rlY= 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= @@ -316,7 +470,6 @@ github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XP github.com/cncf/xds/go v0.0.0-20210312221358-fbca930ec8ed/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa h1:jQCWAUqqlij9Pgj2i/PB79y4KOPYVyFYdROxgaCwdTQ= github.com/cncf/xds/go v0.0.0-20231128003011-0fa0005c9caa/go.mod h1:x/1Gn8zydmfq8dk6e9PdstVsDgu9RuyIIJqAaF//0IM= -github.com/consensys/gnark-crypto v0.10.0/go.mod h1:Iq/P3HHl0ElSjsg2E1gsMwhAyxnxoKK5nVyZKd+/KhU= github.com/containerd/containerd v1.7.14 h1:H/XLzbnGuenZEGK+v0RkwTdv2u1QFAruMe5N0GNPJwA= github.com/containerd/containerd v1.7.14/go.mod h1:YMC9Qt5yzNqXx/fO4j/5yYVIHXSRrlB3H7sxkUTvspg= github.com/containerd/log v0.1.0 h1:TCJt7ioM2cr/tfR8GPbGf9/VRAX8D2B4PjzCpfX540I= @@ -330,12 +483,18 @@ github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3Ee github.com/coreos/go-systemd/v22 v22.3.2 h1:D9/bQk5vlXQFZ6Kwuu6zaiXJ9oTPe68++AzAJc1DzSI= github.com/coreos/go-systemd/v22 v22.3.2/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc= github.com/cpuguy83/go-md2man v1.0.10 h1:BSKMNlYxDvnunlTymqtgONjNnaRV1sTpcovwwjF22jk= +github.com/cpuguy83/go-md2man/v2 v2.0.0/go.mod h1:maD7wRr/U5Z6m/iR4s+kqSMx2CaBsrgA7czyZG/E6dU= +github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= +github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= github.com/creack/pty v1.1.9 h1:uDmaGzcdjhF4i/plgjmEsriH11Y0o7RKapEf/LDaM3w= +github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= 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 +505,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 +522,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= @@ -375,8 +541,8 @@ github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU github.com/envoyproxy/protoc-gen-validate v1.0.4/go.mod h1:qys6tmnRsYrQqIhm2bvKZH4Blx/1gTIZ2UKVY1M+Yew= github.com/esimonov/ifshort v1.0.4 h1:6SID4yGWfRae/M7hkVDVVyppy8q/v9OuxNdmjLQStBA= github.com/esimonov/ifshort v1.0.4/go.mod h1:Pe8zjlRrJ80+q2CxHLfEOfTwxCZ4O+MuhcHcfgNWTk0= -github.com/ethereum/go-ethereum v1.10.26 h1:i/7d9RBBwiXCEuyduBQzJw/mKmnvzsN14jqBmytw72s= -github.com/ethereum/go-ethereum v1.10.26/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= +github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4 h1:B2mpK+MNqgPqk2/KNi1LbqwtZDy5F7iy0mynQiBr8VA= +github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4/go.mod h1:y4GA2JbAUama1S4QwYjC2hefgGLU8Ul0GMtL/ADMF1c= github.com/ettle/strcase v0.1.1 h1:htFueZyVeE1XNnMEfbqp5r67qAN/4r6ya1ysq8Q+Zcw= github.com/ettle/strcase v0.1.1/go.mod h1:hzDLsPC7/lwKyBOywSHEP89nt2pDgdy+No1NBA9o9VY= github.com/fatih/color v1.7.0/go.mod h1:Zm6kSWBoL9eyXnKyktHP6abPY2pDugNf5KwzbycvMj4= @@ -394,7 +560,11 @@ 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/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5 h1:FtmdgXiUlNeRsoNMFlKLDt+S+6hbjVMEW6RGQ7aUf7c= +github.com/fjl/memsize v0.0.0-20190710130421-bcb5799ab5e5/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +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 +574,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 +600,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 +631,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,13 +643,18 @@ 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= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da h1:oI5xCqsCo564l8iNU+DwB5epxmsaqB+rhGL0m5jtYqE= github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da/go.mod h1:cIg4eruTrX1D+g88fzRXU5OdNfaM+9IcxsU14FzY7Hc= github.com/golang/mock v1.4.4 h1:l75CXGRSwbaYNpl/Z2X1XIIAMSCquvXgpVZDhwEIJsc= +github.com/golang/mock v1.5.0 h1:jlYHihg//f7RRwuPfptm04yp4s7O6Kw8EZiVYIGcH0g= +github.com/golang/mock v1.5.0/go.mod h1:CWnOUgYIOo4TcNZ0wHX3YZCqsaM1I1Jvs6v3mP3KVu8= +github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2 h1:23T5iq8rbUYlhpt5DB4XJkc6BU31uODLD1o1gKvZmD0= github.com/golangci/check v0.0.0-20180506172741-cfe4005ccda2/go.mod h1:k9Qvh+8juN+UKMCS/3jFtGICgW8O96FVaZsaxdzDkR4= @@ -496,11 +678,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 +693,35 @@ 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-20210122040257-d980be63207e/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/pprof v0.0.0-20210226084205-cbba55b83ad5/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= 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/go.mod h1:wJfORRmW1u3UXTncJ5qlYoELFm8eSnnEO6hX4iZ3EWY= +github.com/gopherjs/gopherjs v1.17.2 h1:fQnZVsXk8uxXIStYb0N4bGk7jeyTalG/wsZjQ25dO0g= +github.com/gopherjs/gopherjs v1.17.2/go.mod h1:pRRIvn/QzFLrKfvEz3qUuEhtE/zLCWfreZ6J5gM2i+k= 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 +736,17 @@ 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.1.0/go.mod h1:VmuI/Lkw1nC05EYQWNKwWGbkg+FbDBtguAZLlVdkD9Q= 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.1.1/go.mod h1:VKf9jXwCTEY1QZP2MOLRhb5i/I/ssyNV1vwHyQBF0x8= +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,27 +761,40 @@ 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= github.com/hashicorp/go-retryablehttp v0.5.3/go.mod h1:9B5zBasrRhHXnJnui7y6sL7es7NDiJgTc6Er0maI1Xs= github.com/hashicorp/go-retryablehttp v0.7.4 h1:ZQgVdpTdAL7WpMIwLzCfbalOcSUdkDZnpUv3/+BxzFA= github.com/hashicorp/go-retryablehttp v0.7.4/go.mod h1:Jy/gPYAdjqffZ/yFGCFV2doI5wjtH1ewM9u8iYVjtX8= +github.com/hashicorp/go-rootcerts v1.0.0/go.mod h1:K6zTfqpRlCUIjkwsN4Z+hiSfzSTQa6eBIzfwKfwNnHU= 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/go.net v0.0.1 h1:sNCoNyDEvN1xa+X0baata4RdcpKwcMS6DH+xwfqPgjw= +github.com/hashicorp/go.net v0.0.1/go.mod h1:hjKkEWcCURg++eb33jQU7oqQcI9XDCnUzHA0oac0k90= 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.0/go.mod h1:tL+uN++7HEJ6SQLQ2/p+z2pH24WQKWjBPkE0mNTz8vQ= 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.1.3/go.mod h1:ajVTdAv/9Im8oMAAj5G31PhhMCZJV2pPBoIllUwCN7I= 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.8.2/go.mod h1:6hOLApaqBFA1NXqRQAsxw9QxuDEvNxSQRwA/JwenrHc= github.com/hashicorp/serf v0.9.5/go.mod h1:UWDWwZeL5cuWDJdl0C6wrvrUwEqtQ4ZKBKKENpqIUyk= github.com/hashicorp/serf v0.9.6/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= github.com/hashicorp/serf v0.9.7 h1:hkdgbqizGQHuU5IPqYM1JdSMV8nKfpuOnZYXssk9muY= @@ -593,11 +804,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 +819,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 +852,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,14 +863,20 @@ 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/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213 h1:qGQQKEcAR99REcMpsXCp3lJ03zYT1PkRd3kQGPn9GVg= +github.com/k0kubun/go-ansi v0.0.0-20180517002512-3bf9e2903213/go.mod h1:vNUNkEQ1e29fT/6vq2aBdFsgNPmy8qMdSay1npru+Sw= github.com/karalabe/usb v0.0.2 h1:M6QQBNxF+CQ8OFvxrT90BA0qBOXymndZnk5q235mFc4= github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= @@ -658,21 +884,27 @@ 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= github.com/kr/pretty v0.2.0/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= +github.com/kr/pretty v0.2.1/go.mod h1:ipq/a2n7PKx3OHsz4KJII5eveXtPO4qwEXGdVfWzfnI= github.com/kr/pretty v0.3.0/go.mod h1:640gp4NfQd8pI5XOwp5fnNeVWj67G7CFk/SaSQn7NBk= github.com/kr/pty v1.1.1 h1:VkoXIwSboBpnk99O/KFauAEILuNHv5DVFKZMBN/gUgw= github.com/kulti/thelper v0.6.3 h1:ElhKf+AlItIu+xGnI990no4cE2+XaSu1ULymV2Yulxs= @@ -683,24 +915,31 @@ 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= github.com/ldez/tagliatelle v0.3.1 h1:3BqVVlReVUZwafJUwQ+oxbx2BEX2vUG4Yu/NOfMiKiM= github.com/ldez/tagliatelle v0.3.1/go.mod h1:8s6WJQwEYHbKZDsp/LjArytKOG8qaMrKQQ3mFukHs88= +github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= github.com/leonklingele/grouper v1.1.0 h1:tC2y/ygPbMFSBOs3DcyaEMKnnwH7eYKzohOtRrf0SAg= github.com/leonklingele/grouper v1.1.0/go.mod h1:uk3I3uDfi9B6PeUjsCKi6ndcf63Uy7snXgR4yDYQVDY= 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/magiconair/properties v1.8.5/go.mod h1:y3VJvCyxH9uVvJTWEGAELF3aiYNyPKd5NZ3oSwXrF60= 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 +962,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,12 +977,24 @@ 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.0.0/go.mod h1:hNIlj7HEI86fIcpObd7a0FcrxTWetlwJDGcceTlRvqc= +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/colorstring v0.0.0-20190213212951-d06e56a500db h1:62I3jR2EmQ4l5rM/4FEfDWcRD+abF5XlKShorW5LRoQ= +github.com/mitchellh/colorstring v0.0.0-20190213212951-d06e56a500db/go.mod h1:l0dey0ia/Uv7NcFFVbCLtqEBQbrT4OCwCSKTEv6enCw= +github.com/mitchellh/go-homedir v1.0.0/go.mod h1:SfyaCUpYCn1Vlf4IUYiD9fPX4A5wJrkLzIz1N1q0pr0= 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/gox v0.4.0 h1:lfGJxY7ToLJQjHHwi0EX6uYBdK78egf954SQl13PQJc= +github.com/mitchellh/gox v0.4.0/go.mod h1:Sd9lOJ0+aimLBi73mGofS1ycjY8lL3uZM3JPS42BGNg= +github.com/mitchellh/iochan v1.0.0 h1:C+X3KsSTLFVBr/tK1eYN/vs4rJcvsiLU338UhYPJWeY= +github.com/mitchellh/iochan v1.0.0/go.mod h1:JwYml1nuB7xOzsp52dPpHFffvOCDupsG0QubkSMEySY= 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= github.com/mitchellh/pointerstructure v1.2.0/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= @@ -759,12 +1012,10 @@ github.com/moricho/tparallel v0.2.1 h1:95FytivzT6rYzdJLdtfn6m1bfFJylOJK41+lgv/EH github.com/moricho/tparallel v0.2.1/go.mod h1:fXEIZxG2vdfl0ZF8b42f5a78EhjjD5mX8qUplsoSU4k= 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.20251125061742-69718a9dcab9/go.mod h1:tiFPeidxjoCmLj18ne9H3KQdIGTCvRC30qlef06Fd9M= +github.com/morph-l2/go-ethereum v1.10.14-0.20260206063816-522b70a5f16f h1:e8gfduHc4AKlR0fD6J3HXveP2Gp4PMvN2UfA9CYEvEc= +github.com/morph-l2/go-ethereum v1.10.14-0.20260206063816-522b70a5f16f/go.mod h1:tiFPeidxjoCmLj18ne9H3KQdIGTCvRC30qlef06Fd9M= +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= @@ -774,6 +1025,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= @@ -788,6 +1040,11 @@ 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/neelance/astrewrite v0.0.0-20160511093645-99348263ae86 h1:D6paGObi5Wud7xg83MaEFyjxQB1W5bz5d0IFppr+ymk= +github.com/neelance/astrewrite v0.0.0-20160511093645-99348263ae86/go.mod h1:kHJEU3ofeGjhHklVoIGuVj85JJwZ6kWPaJwCIxgnFmo= +github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c h1:bY6ktFuJkt+ZXkX0RChQch2FtHpWQLVS8Qo1YasiIVk= +github.com/neelance/sourcemap v0.0.0-20200213170602-2833bce08e4c/go.mod h1:Qr6/a/Q4r9LP1IltGz7tA7iOK1WonHEYhu1HRBA7ZiM= +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= @@ -807,8 +1064,11 @@ 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/pelletier/go-toml v1.9.3/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= 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= github.com/peterh/liner v1.0.1-0.20180619022028-8c1271fcf47f/go.mod h1:xIteQHvHuaLYG9IFj6mSxM0fCKrs34IrEQUhOYuGPHc= @@ -816,17 +1076,23 @@ 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= github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e h1:aoZm08cpOy4WuID//EZDgcC4zIxODThtZNPirFr42+A= +github.com/pkg/diff v0.0.0-20210226163009-20ebb0f2a09e/go.mod h1:pJLUxLENpZxwdsKMEsNbx1VGcRFpLqf3715MtcvvzbA= github.com/pkg/profile v1.2.1/go.mod h1:hJw3o1OdXxsrSjjVksARp5W95eeEaEfptyVZyv6JUPA= 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.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= 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= @@ -837,6 +1103,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= @@ -866,19 +1133,23 @@ 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= github.com/rogpeppe/go-internal v1.6.1/go.mod h1:xXDCJY+GAPziupqXw64V24skbSoqbTEfhy4qGm1nDQc= +github.com/rogpeppe/go-internal v1.9.0/go.mod h1:WtVeX8xhTBvf0smdhujwtBcq4Qrzq/fJaraNFVN+nFs= github.com/rogpeppe/go-internal v1.10.0/go.mod h1:UQnix2H7Ngw/k4C5ijL5+65zddjncjaFoBhdsK/akog= github.com/rs/cors v1.7.0/go.mod h1:gFx+x8UowdsKA9AchylcLynDq+nNFfI8FkUZdN/jGCU= github.com/rs/zerolog v1.27.0 h1:1T7qCieN22GVc8S4Q2yuexzBb1EqjbgjSH9RohbMjKs= github.com/rs/zerolog v1.27.0/go.mod h1:7frBqO0oezxmnO7GF86FY++uy8I0Tk/If5ni1G9Qc0U= github.com/russross/blackfriday v1.5.2 h1:HyvC0ARfnZBqnXwABFeSZHpKvJHJJfPz81GNueLj0oo= +github.com/russross/blackfriday/v2 v2.0.1/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= github.com/ryancurrah/gomodguard v1.2.4 h1:CpMSDKan0LtNGGhPrvupAoLeObRFjND8/tU1rEOtBp4= 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= @@ -890,15 +1161,28 @@ 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/schollz/progressbar/v3 v3.19.0 h1:Ea18xuIRQXLAUidVDox3AbwfUhD0/1IvohyTutOIFoc= +github.com/schollz/progressbar/v3 v3.19.0/go.mod h1:IsO3lpbaGuzh8zIMzgY3+J8l4C8GjO0Y9S69eFvNsec= +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= github.com/shirou/gopsutil v3.21.4-0.20210419000835-c7a38de76ee5+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/shurcooL/go v0.0.0-20200502201357-93f07166e636 h1:aSISeOcal5irEhJd1M+IrApc0PdcN7e7Aj4yuEnOrfQ= +github.com/shurcooL/go v0.0.0-20200502201357-93f07166e636/go.mod h1:TDJrrUr11Vxrven61rcy3hJMUqaf/CLWYhHNPmT14Lk= +github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749 h1:bUGsEnyNbVPw06Bs80sCeARAlK8lhwqGyi6UT8ymuGk= +github.com/shurcooL/httpfs v0.0.0-20190707220628-8d4bc4ba7749/go.mod h1:ZY1cvUeJuFPAdZ/B6v7RHavJWZn2YPVFQ1OSXhCGOkg= +github.com/shurcooL/sanitized_anchor_name v1.0.0 h1:PdmoCO6wvbs+7yrJyMORt4/BmY5IYyJwS/kOiWx8mHo= +github.com/shurcooL/sanitized_anchor_name v1.0.0/go.mod h1:1NzhyTcUVG4SuEtjjoZeVRXNmyL/1OwPU0+IJeTBvfc= +github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546 h1:pXY9qYc/MP5zdvqWEUH6SjNiu7VhSjuVFTFiTcphaLU= +github.com/shurcooL/vfsgen v0.0.0-20200824052919-0d455de96546/go.mod h1:TrYk7fJVaAttu97ZZKrO9UbRa8izdowaMIZcxYMbVaw= github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE= github.com/sirupsen/logrus v1.6.0/go.mod h1:7uNnSEd1DgxDLC74fIahvMZmmYsHGZGEOFrfsX/uA88= github.com/sirupsen/logrus v1.8.1/go.mod h1:yWOB1SBYBC5VeMP7gHvWumXLIWorT60ONWic61uBYv0= @@ -908,8 +1192,13 @@ 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/smarty/assertions v1.15.0 h1:cR//PqUBUiQRakZWqBiFFQ9wb8emQGDb0HeGdqGByCY= +github.com/smarty/assertions v1.15.0/go.mod h1:yABtdzeQs6l1brC900WlRNwj6ZR55d7B+E8C6HtKdec= +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/go.mod h1:syvi0/a8iFYH4r/RixwvyeAJjdLS9QV7WQ/tjFTllLA= +github.com/smartystreets/goconvey v1.8.1 h1:qGjIddxOk4grTu9JPOU31tVfq3cNdBlNa5sSznIX1xY= +github.com/smartystreets/goconvey v1.8.1/go.mod h1:+/u4qLyY6x1jReYOp7GOM2FSt8aP9CzCZL03bI28W60= 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= github.com/sonatard/noctx v0.0.1 h1:VC1Qhl6Oxx9vvWo3UDgrGXYCeKCe3Wbw7qAWL6FrmTY= @@ -918,7 +1207,11 @@ github.com/sony/gobreaker v0.4.1 h1:oMnRNZXX5j85zso6xCPRNPtmAycat+WcoKbklScLDgQ= github.com/sony/gobreaker v0.4.1/go.mod h1:ZKptC7FHNvhBz7dN2LGjPVBz2sZJmc0/PkyDJOjmxWY= github.com/sourcegraph/go-diff v0.6.1 h1:hmA1LzxW0n1c3Q4YbrFgg4P99GSnebYa3x8gr0HZqLQ= github.com/sourcegraph/go-diff v0.6.1/go.mod h1:iBszgVvyxdc8SFZ7gm69go2KDdt3ag071iBaWPF6cjs= +github.com/spf13/afero v1.6.0/go.mod h1:Ai8FlHk4v/PARR026UzYexafAt9roJ7LcLMAmO6Z93I= +github.com/spf13/cast v1.3.1/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkUJE= github.com/spf13/cobra v0.0.3/go.mod h1:1l0Ry5zgKvJasoi3XT1TypsSe7PqH0Sj9dhYf7v3XqQ= +github.com/spf13/cobra v1.2.1/go.mod h1:ExllRjgxM/piMAM+3tAZvg8fsklGAf3tPfi+i8t68Nk= +github.com/spf13/viper v1.8.1/go.mod h1:o0Pch8wJ9BVSWGQMbra6iw0oQ5oktSIBaujf1rJH9Ns= github.com/ssgreg/nlreturn/v2 v2.2.1 h1:X4XDI7jstt3ySqGU86YGAURbxw3oTDPK9sPEi6YEwQ0= github.com/ssgreg/nlreturn/v2 v2.2.1/go.mod h1:E/iiPB78hV7Szg2YfRgyIrk1AD6JVMTRkkxBiELzh2I= github.com/status-im/keycard-go v0.2.0/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= @@ -933,6 +1226,7 @@ github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf github.com/stretchr/testify v1.6.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= +github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= github.com/sylvia7788/contextcheck v1.0.6 h1:o2EZgVPyMKE/Mtoqym61DInKEjwEbsmyoxg3VrmjNO4= github.com/sylvia7788/contextcheck v1.0.6/go.mod h1:9XDxwvxyuKD+8N+a7Gs7bfWLityh5t70g/GjdEt2N2M= github.com/syndtr/goleveldb v1.0.1-0.20210819022825-2ae1ddf74ef7/go.mod h1:q4W45IWZaF22tdD+VEXcAWRA037jwmWEB5VWYORlTpc= @@ -944,6 +1238,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= @@ -951,34 +1246,42 @@ 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= github.com/ultraware/funlen v0.0.3/go.mod h1:Dp4UiAus7Wdb9KUZsYWZEWiRzGuM2kXM1lPbfaF6xhA= 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 h1:x3p8awjp/2arX+Nl/G2040AZpOCHS/eMJJ1/a+mye4Y= 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= github.com/yeya24/promlinter v0.2.0 h1:xFKDQ82orCU5jQujdaD8stOHiv8UN68BSdn2a8u8Y3o= github.com/yeya24/promlinter v0.2.0/go.mod h1:u54lkmBOZrpEbQQ6gox2zWKKLKu2SGe+2KOiextY+IA= -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= @@ -1007,16 +1310,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= @@ -1029,21 +1335,21 @@ go.uber.org/zap v1.19.1/go.mod h1:j3DNczoxDZroyBnOT1L/Q79cfUMGZxlv/9dzN7SM1rI= go.uber.org/zap v1.21.0 h1:WefMeulhovoZ2sYXz7st6K0sLj7bBhpiFaud4r4zST8= go.uber.org/zap v1.21.0/go.mod h1:wjWOCqI0f2ZZrJF/UufIOkiC8ii6tm1iqIsLo76RfJw= golang.org/x/crypto v0.0.0-20181029021203-45a5f77698d3/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20200323165209-0ec3e9974c59/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20201221181555-eec23a3978ad/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210314154223-e6e6c4f2bb5b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20210616213533-5ff15b29337e/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20210711020723-a769d52b0f97/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20210915214749-c084706c2272/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.0.0-20211117183948-ae814b36b871/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/crypto v0.1.0/go.mod h1:RecgLatLF4+eUMCP1PoPZQb+cVrJcOPbHkTkbkB9sbw= golang.org/x/crypto v0.6.0/go.mod h1:OFC/31mSvZgRz0V1QTNCzfAI1aIRzbiufJtkMIlEp58= golang.org/x/crypto v0.7.0/go.mod h1:pYwdfH91IfpZVANVyUOhSIPZaFoJGxTFbZhFTx+dXZU= -golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= golang.org/x/crypto v0.14.0/go.mod h1:MVFd36DqK4CsrnJYDkBA3VC4m2GkXAM0PvzMCn4JQf4= golang.org/x/crypto v0.17.0/go.mod h1:gCAAfMLgwOJRpTjQ2zCCt2OcSfYMTeZVSRtQlPC7Nq4= -golang.org/x/crypto v0.21.0/go.mod h1:0BP7YvVV9gBbVKyeTG0Gyn+gZm94bibOW5BjDEYAOMs= golang.org/x/exp v0.0.0-20180321215751-8460e604b9de/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20180807140117-3d87b88a115f/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190125153040-c74c464bbbf2/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -1052,24 +1358,30 @@ 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= golang.org/x/mod v0.9.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= golang.org/x/net v0.0.0-20181023162649-9b4f9f5ad519/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181201002055-351d144fa1fc/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190613194153-d28f0bde5980/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20190923162816-aa69164e4478/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= golang.org/x/net v0.0.0-20201110031124-69a78807bb2b/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= golang.org/x/net v0.0.0-20210119194325-5f4716e94777/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc= golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM= golang.org/x/net v0.0.0-20210410081132-afb366fc7cd1/go.mod h1:9tjilg8BloeKEkVJvy7fQ90B1CfIiPueXVOjqfkSzI8= golang.org/x/net v0.0.0-20210525063256-abc453219eb5/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= golang.org/x/net v0.0.0-20210917221730-978cfadd31cf/go.mod h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y= +golang.org/x/net v0.8.0/go.mod h1:QVkue5JL9kW//ek3r6jTKnTFis1tRmNAW2P1shuFdJc= golang.org/x/net v0.17.0/go.mod h1:NxSsAGuq816PNPmqtQdLE42eU2Fs7NoRIZrHJAlaCOE= -golang.org/x/net v0.18.0/go.mod h1:/czyP5RqHAH4odGYxBJ1qz0+CE5WZ+2j1YgoEo8F2jQ= golang.org/x/net v0.19.0/go.mod h1:CfAk/cbD4CthTvqiEl8NpboMuiuOYsAr/7NOjZJtv1U= golang.org/x/net v0.20.0/go.mod h1:z8BVo6PvndSri0LbOE3hAn0apkU+1YvI6E70E9jsnvY= +golang.org/x/oauth2 v0.0.0-20210220000619-9bb904979d93/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210313182246-cd4f82c27b84/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= +golang.org/x/oauth2 v0.0.0-20210402161424-2e8d93401602/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.0.0-20210514164344-f6687ab2804c/go.mod h1:KelEdhl1UZF7XfJ4dDtk6s++YSgaE7mD/BuKKDLBl4A= golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE= golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= @@ -1078,50 +1390,19 @@ golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCA golang.org/x/oauth2 v0.16.0 h1:aDkGMBSYxElaoP81NpoUoz2oo2R2wHdZpGToUxfyQrQ= golang.org/x/oauth2 v0.16.0/go.mod h1:hqZ+0LWXsiVoZpeld6jVt06P3adbS2Uu911W1SsJv2o= golang.org/x/sync v0.3.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= -golang.org/x/sync v0.4.0/go.mod h1:FU7BRWz2tNW+3quACPkgCx/L+uEAv1htQ0V83Z9Rj+Y= golang.org/x/sync v0.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181026203630-95b1ffbd15a5/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20181107165924-66b7b1311ac8/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190222072716-a9d3bda3a223/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= -golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190813064441-fde4db37ae7a/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190922100055-0a153f010e69/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20190924154521-2837fb4f24fe/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191008105621-543471e840be/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20191026070338-33540a1f6037/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200106162015-b016eb3dc98e/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200107162124-548cf772de50/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200116001909-b77594299b42/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200124204421-9fbb57f87de9/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200615200032-f1bc736245b1/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200625212154-ddb9806d33ae/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20200826173525-f9321e4c35a6/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210124154548-22da62e12c0c/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210330210617-4fbd30eecc44/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210403161142-5e06dd20ab57/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210510120138-977fb7262007/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210603081109-ebe580a85c40/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210630005230-0f9fa26af87c/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20210917161153-d61c044b1678/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220310020820-b874c991c1a5/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.2.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.9.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.11.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.13.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.15.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.16.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.18.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2 h1:IRJeR9r1pYWsHKTRe/IInb7lYvbBVIqOgsX/u0mbOWY= +golang.org/x/telemetry v0.0.0-20240228155512-f48c80bd79b2/go.mod h1:TeRTkGYfJXctD9OcfyVLyj2J3IxLnKwHJR8f4D8a3YE= golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= -golang.org/x/term v0.20.0 h1:VnkxpohqXaOBYJtBmEppKUG6mXpi+4O6purfc2+sMhw= +golang.org/x/term v0.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= +golang.org/x/term v0.29.0 h1:L6pJp37ocefwRRtYPKSWOWzOtWSxVajvz2ldH/xi3iU= +golang.org/x/term v0.29.0/go.mod h1:6bl4lRlvVuDgSf3179VpIxBF0o10JUpXWOnI7nErv7s= golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ= golang.org/x/text v0.4.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.8.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.13.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= golang.org/x/time v0.0.0-20200416051211-89c76fbcd5d1/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20201208040808-7e3f01d25324/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -1133,12 +1414,14 @@ golang.org/x/tools v0.0.0-20181030221726-6c7e314b6563/go.mod h1:n7NCudcB/nEzxVGm golang.org/x/tools v0.0.0-20190206041539-40960b6deb8e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= golang.org/x/tools v0.0.0-20190328211700-ab21143f2384/go.mod h1:LCzVGOaR6xXOjkQ3onu1FJEFr0SW1gC7cKk1uF8kGRs= golang.org/x/tools v0.0.0-20190907020128-2ca718005c18/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20191112195655-aa38f8e97acc/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= golang.org/x/tools v0.0.0-20200108203644-89082a384178/go.mod h1:TB2adYChydJhpapKDTa4BR/hXlZSLoq2Wpct/0txZ28= golang.org/x/tools v0.1.2/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= golang.org/x/tools v0.1.5/go.mod h1:o0xws9oXOQQZyjljx8fwUC0k7L1pTE6eaCbjGeHmOkk= +golang.org/x/tools v0.7.0/go.mod h1:4pg6aUX35JBAogB10C9AtvVL+qowtN4pT3CGSQex14s= 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= @@ -1146,17 +1429,27 @@ 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.41.0/go.mod h1:RkxM5lITDfTzmyKFPt+wGrCJbVfniCr2ool8kTBzRTU= +google.golang.org/api v0.43.0/go.mod h1:nQsDGjRXMo4lvh5hP0TKqF244gqhGcr/YSIykhUk/94= +google.golang.org/api v0.44.0/go.mod h1:EBOGZqzyhtvMDoxwS97ctnh0zUmYY6CxqXsc1AvkYD8= 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= google.golang.org/genproto v0.0.0-20190716160619-c506a9f90610/go.mod h1:DMBHOl98Agz4BDEuKkezgsaosCRResVns1a3J2ZsMNc= google.golang.org/genproto v0.0.0-20200108215221-bd8f9a0ef82f/go.mod h1:n3cpQtvxv34hfy77yVDNjmbRyujviMdxYliBSkLhpCc= +google.golang.org/genproto v0.0.0-20210222152913-aa3ee6e6a81c/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210303154014-9728d6b83eeb/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210310155132-4ce2db91004e/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210319143718-93e7006c17a6/go.mod h1:FWY/as6DDZQgahTzZj3fqbO1CbirC29ZNUFHwi0/+no= +google.golang.org/genproto v0.0.0-20210402141018-6c239bbf2bb1/go.mod h1:9lPAdzaEmUacj36I+k7YKbEc5CXzPIeORRgDAUOu28A= google.golang.org/genproto v0.0.0-20210602131652-f16073e35f0c/go.mod h1:UODoCrxHCcBojKKwX1terBiRUaqAsFqJiF615XL43r0= google.golang.org/genproto v0.0.0-20210917145530-b395a37504d4/go.mod h1:eFjDcFEctNawg4eG61bRv87N7iHBWyVhJu7u1kqDUXY= google.golang.org/genproto v0.0.0-20231016165738-49dd2c1f3d0b/go.mod h1:CgAqfJo+Xmu0GwA0411Ht3OU3OntXwsGmrmjI8ioGXI= @@ -1171,17 +1464,19 @@ 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= google.golang.org/genproto/googleapis/rpc v0.0.0-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA= google.golang.org/genproto/googleapis/rpc v0.0.0-20240102182953-50ed04b92917/go.mod h1:xtjpI3tXFPP051KaWnhvxkiubL/6dJ18vLVf7q2pTOU= google.golang.org/genproto/googleapis/rpc v0.0.0-20240116215550-a9fa1716bcac/go.mod h1:daQN87bsDqDoe316QbbvX60nMoJQa4r6Ds0ZuoAe5yA= +google.golang.org/grpc v1.36.1/go.mod h1:qjiiYl8FncCW8feJPdyg3v6XW24KsRHe+dy9BAGRRjU= google.golang.org/grpc v1.37.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQdJfM= 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= @@ -1192,8 +1487,7 @@ gopkg.in/errgo.v2 v2.1.0 h1:0vLT13EuvQ0hNvakwLuFZ/jYrLp5F3kcWHXdRggjCE8= gopkg.in/fsnotify.v1 v1.4.7 h1:xOHLXZwVvI9hhs+cLKq5+I5onOuwQLhQwiu63xxlHs4= gopkg.in/gcfg.v1 v1.2.3 h1:m8OOJ4ccYHnx2f4gQwpno8nAX5OGOh7RLaaz0pj3Ogs= gopkg.in/gcfg.v1 v1.2.3/go.mod h1:yesOnuUOFQAhST5vPY4nbZsb/huCgGGXlipJsBn0b3o= -gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6 h1:a6cXbcDDUkSBlpnkWV1bJ+vv3mOgQEltEJ2rPxroVu0= -gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= +gopkg.in/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= gopkg.in/warnings.v0 v0.1.2 h1:wFXVbFY8DY5/xOe1ECiWdKCzZlxgshcYVNkBHstARME= gopkg.in/warnings.v0 v0.1.2/go.mod h1:jksf8JmL6Qr/oQM2OXTHunEvvTAsrWBLb6OOjuVWRNI= gopkg.in/yaml.v2 v2.2.5/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= @@ -1212,7 +1506,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 1ab1e3091..acd835766 100644 --- a/node/Makefile +++ b/node/Makefile @@ -1,8 +1,12 @@ -GITCOMMIT := $(shell git rev-parse HEAD) +GITCOMMIT := $(shell git rev-parse --short HEAD) GITDATE := $(shell git show -s --format='%ct') +VERSION ?= $(shell git describe --tags --always --dirty 2>/dev/null || echo "dev") +BUILD_TIME := $(shell date -u +%Y-%m-%dT%H:%M:%SZ) LDFLAGSSTRING +=-X main.GitCommit=$(GITCOMMIT) LDFLAGSSTRING +=-X main.GitDate=$(GITDATE) +LDFLAGSSTRING +=-X main.Version=$(VERSION) +LDFLAGSSTRING +=-X main.BuildTime=$(BUILD_TIME) LDFLAGS := -ldflags "$(LDFLAGSSTRING)" morphnode: diff --git a/node/blocktag/config.go b/node/blocktag/config.go new file mode 100644 index 000000000..6c392ce0f --- /dev/null +++ b/node/blocktag/config.go @@ -0,0 +1,55 @@ +package blocktag + +import ( + "fmt" + "time" + + "github.com/morph-l2/go-ethereum/common" + "github.com/urfave/cli" + + node "morph-l2/node/core" + "morph-l2/node/flags" +) + +const ( + // DefaultSafeConfirmations is the default number of L1 blocks to wait before considering a batch as safe + DefaultSafeConfirmations = 10 + // DefaultPollInterval is the default interval to poll L1 for batch status updates + DefaultPollInterval = 10 * time.Second +) + +// Config holds the configuration for BlockTagService +type Config struct { + L1Addr string + RollupAddress common.Address + SafeConfirmations uint64 + PollInterval time.Duration +} + +// DefaultConfig returns the default configuration +func DefaultConfig() *Config { + return &Config{ + SafeConfirmations: DefaultSafeConfirmations, + PollInterval: DefaultPollInterval, + } +} + +// SetCliContext sets the configuration from CLI context +func (c *Config) SetCliContext(ctx *cli.Context) error { + c.L1Addr = ctx.GlobalString(flags.L1NodeAddr.Name) + + // Determine RollupAddress: use explicit flag, or mainnet default, or error + if ctx.GlobalBool(flags.MainnetFlag.Name) { + c.RollupAddress = node.MainnetRollupContractAddress + } else if ctx.GlobalIsSet(flags.RollupContractAddress.Name) { + c.RollupAddress = common.HexToAddress(ctx.GlobalString(flags.RollupContractAddress.Name)) + } else { + return fmt.Errorf("rollup contract address is required: either specify --%s or use --%s for mainnet default", + flags.RollupContractAddress.Name, flags.MainnetFlag.Name) + } + + if ctx.GlobalIsSet(flags.BlockTagSafeConfirmations.Name) { + c.SafeConfirmations = ctx.GlobalUint64(flags.BlockTagSafeConfirmations.Name) + } + return nil +} diff --git a/node/blocktag/service.go b/node/blocktag/service.go new file mode 100644 index 000000000..86f9b8d70 --- /dev/null +++ b/node/blocktag/service.go @@ -0,0 +1,462 @@ +package blocktag + +import ( + "context" + "fmt" + "math/big" + "time" + + "github.com/morph-l2/go-ethereum/accounts/abi/bind" + "github.com/morph-l2/go-ethereum/common" + "github.com/morph-l2/go-ethereum/ethclient" + "github.com/morph-l2/go-ethereum/rpc" + tmlog "github.com/tendermint/tendermint/libs/log" + + "morph-l2/bindings/bindings" + "morph-l2/node/types" +) + +// BlockTagType represents the type of block tag (safe or finalized) +type BlockTagType int + +const ( + TagTypeSafe BlockTagType = iota + TagTypeFinalized +) + +// BlockTagService is responsible for tracking and updating safe/finalized block tags +// based on L1 batch commit tx status. +// +// Key logic: +// - Safe: batch tx is committed to L1 with N block confirmations (configurable) +// - Finalized: batch tx's L1 block is finalized (using L1 finalized block tag) +type BlockTagService struct { + ctx context.Context + cancel context.CancelFunc + + // Current safe and finalized L2 block hashes + safeL2BlockHash common.Hash + finalizedL2BlockHash common.Hash + // Last notified hashes (to avoid redundant RPC calls) + lastNotifiedSafeHash common.Hash + lastNotifiedFinalizedHash common.Hash + + // Cached batch index for optimization (avoid full binary search each time) + // Separate caches for safe and finalized since they have different maxBatchIndex + lastKnownSafeBatchIndex uint64 + lastKnownFinalizedBatchIndex uint64 + + // Clients + l1Client *ethclient.Client + l2Client *types.RetryableClient + rollup *bindings.Rollup + + // Configuration + rollupAddress common.Address + safeConfirmations uint64 // Number of L1 blocks to wait before considering a batch as safe + pollInterval time.Duration + + logger tmlog.Logger + stop chan struct{} +} + +// NewBlockTagService creates a new BlockTagService +func NewBlockTagService( + ctx context.Context, + l2Client *types.RetryableClient, + config *Config, + logger tmlog.Logger, +) (*BlockTagService, error) { + if config.L1Addr == "" { + return nil, fmt.Errorf("L1 RPC address is required") + } + if config.RollupAddress == (common.Address{}) { + return nil, fmt.Errorf("Rollup contract address is required") + } + + l1Client, err := ethclient.Dial(config.L1Addr) + if err != nil { + return nil, fmt.Errorf("failed to connect to L1: %w", err) + } + + rollup, err := bindings.NewRollup(config.RollupAddress, l1Client) + if err != nil { + return nil, fmt.Errorf("failed to create rollup binding: %w", err) + } + + ctx, cancel := context.WithCancel(ctx) + + return &BlockTagService{ + ctx: ctx, + cancel: cancel, + l1Client: l1Client, + l2Client: l2Client, + rollup: rollup, + rollupAddress: config.RollupAddress, + safeConfirmations: config.SafeConfirmations, + pollInterval: config.PollInterval, + logger: logger.With("module", "blocktag"), + stop: make(chan struct{}), + }, nil +} + +// Start starts the BlockTagService +func (s *BlockTagService) Start() error { + s.logger.Info("Starting BlockTagService", + "safeConfirmations", s.safeConfirmations, + "pollInterval", s.pollInterval, + ) + + // Initialize by checking current L1 batch status + if err := s.initialize(); err != nil { + s.logger.Error("Failed to initialize BlockTagService", "error", err) + // Don't return error, let the service start and retry + } + + go s.loop() + return nil +} + +// Stop stops the BlockTagService +func (s *BlockTagService) Stop() { + s.logger.Info("Stopping BlockTagService") + s.cancel() + <-s.stop + s.l1Client.Close() + s.logger.Info("BlockTagService stopped") +} + +// initialize initializes the service by checking current L1 batch status +func (s *BlockTagService) initialize() error { + s.logger.Info("Initializing BlockTagService") + return s.updateBlockTags() +} + +// loop is the main loop that polls L1 for batch status updates +func (s *BlockTagService) loop() { + defer close(s.stop) + + ticker := time.NewTicker(s.pollInterval) + defer ticker.Stop() + + for { + select { + case <-s.ctx.Done(): + return + case <-ticker.C: + if err := s.updateBlockTags(); err != nil { + s.logger.Error("Failed to update block tags", "error", err) + } + } + } +} + +// updateBlockTags updates the safe and finalized block tags based on L1 batch tx status +func (s *BlockTagService) updateBlockTags() error { + l2Head, err := s.l2Client.BlockNumber(s.ctx) + if err != nil { + return fmt.Errorf("failed to get L2 head: %w", err) + } + + var safeBlockNum uint64 + var safeBlockHash common.Hash + + // Update safe block + safeBlockNum, safeBlockHash, err = s.getL2BlockForTag(TagTypeSafe, l2Head) + if err != nil { + s.logger.Error("Failed to get safe L2 block", "error", err) + } else if safeBlockHash != (common.Hash{}) { + s.setSafeL2Block(safeBlockHash) + } + + // Update finalized block + finalizedBlockNum, finalizedBlockHash, err := s.getL2BlockForTag(TagTypeFinalized, l2Head) + if err != nil { + s.logger.Error("Failed to get finalized L2 block", "error", err) + } else if finalizedBlockHash != (common.Hash{}) { + // If finalized > safe, update safe to finalized (finalized is a stronger state) + if finalizedBlockNum > safeBlockNum { + safeBlockHash = finalizedBlockHash + s.setSafeL2Block(safeBlockHash) + } + s.setFinalizedL2Block(finalizedBlockHash) + } + + // Notify geth + if err := s.notifyGeth(); err != nil { + s.logger.Error("Failed to notify geth of block tags", "error", err) + } + + s.logger.Debug("Block tags updated", + "l2Head", l2Head, + "safeL2BlockHash", s.safeL2BlockHash.Hex(), + "finalizedL2BlockHash", s.finalizedL2BlockHash.Hex(), + ) + + return nil +} + +// getL2BlockForTag gets the L2 block number and hash based on the L1 block tag +// Also validates state root matches between L1 batch and L2 block +func (s *BlockTagService) getL2BlockForTag(tagType BlockTagType, l2Head uint64) (uint64, common.Hash, error) { + var l1BlockTag rpc.BlockNumber + + switch tagType { + case TagTypeSafe: + latestL1, err := s.l1Client.BlockNumber(s.ctx) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("failed to get L1 latest block: %w", err) + } + if latestL1 <= s.safeConfirmations { + return 0, common.Hash{}, nil + } + l1BlockTag = rpc.BlockNumber(latestL1 - s.safeConfirmations) + + case TagTypeFinalized: + l1BlockTag = rpc.FinalizedBlockNumber + + default: + return 0, common.Hash{}, fmt.Errorf("unknown tag type: %d", tagType) + } + + // Query rollup contract at specified L1 block + lastCommittedBatchIndex, err := s.getLastCommittedBatchAtBlock(l1BlockTag) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("failed to get last committed batch: %w", err) + } + if lastCommittedBatchIndex == 0 { + return 0, common.Hash{}, nil + } + + // Find the largest completed batch (lastL2Block <= l2Head) + // This works for both synced and syncing scenarios + targetBatchIndex, targetBatchLastBlockNum, err := s.findCompletedBatchForL2Block(tagType, l2Head, lastCommittedBatchIndex) + if err != nil { + s.logger.Debug("No completed batch found", "l2Head", l2Head, "error", err) + return 0, common.Hash{}, nil + } + + // Validate state root. + // Skip validation for already finalized batches, as their state roots may have been + // deleted from the L1 contract after finalization + lastFinalizedBatchIndex, err := s.rollup.LastFinalizedBatchIndex(nil) + if err != nil { + s.logger.Info("Failed to get last finalized batch index, skipping state root validation", "error", err) + return 0, common.Hash{}, nil + } + if targetBatchIndex < lastFinalizedBatchIndex.Uint64() { + // Batch data may have been deleted after finalization, cannot validate + // Return error so caller skips this batch and keeps previous safe/finalized value + // TODO: optimize this by using a different approach to get the state root + s.logger.Info("batch already finalized, state root may be deleted", + "batchIndex", targetBatchIndex, + "lastFinalized", lastFinalizedBatchIndex.Uint64()) + return 0, common.Hash{}, nil + } + if err := s.validateBatchStateRoot(targetBatchIndex, targetBatchLastBlockNum); err != nil { + s.logger.Error("State root validation failed", + "tagType", tagType, + "batchIndex", targetBatchIndex, + "l2Block", targetBatchLastBlockNum, + "error", err, + ) + return 0, common.Hash{}, err + } + + // Get L2 block header for hash + l2Header, err := s.l2Client.HeaderByNumber(s.ctx, big.NewInt(int64(targetBatchLastBlockNum))) + if err != nil { + return 0, common.Hash{}, fmt.Errorf("failed to get L2 block header: %w", err) + } + + l2BlockHash := l2Header.Hash() + + s.logger.Debug("Got L2 block for tag", + "tagType", tagType, + "l1BlockTag", l1BlockTag, + "batchIndex", targetBatchIndex, + "l2Block", targetBatchLastBlockNum, + "l2BlockHash", l2BlockHash.Hex(), + ) + + return targetBatchLastBlockNum, l2BlockHash, nil +} + +// validateBatchStateRoot validates that the state root of batch's lastL2Block matches L1 +func (s *BlockTagService) validateBatchStateRoot(batchIndex uint64, batchLastBlockNum uint64) error { + // Get L2 block header + l2Header, err := s.l2Client.HeaderByNumber(s.ctx, big.NewInt(int64(batchLastBlockNum))) + if err != nil { + return fmt.Errorf("failed to get L2 block header for block %d: %w", batchLastBlockNum, err) + } + + // Get state root from L1 committed batch + stateRoot, err := s.rollup.CommittedStateRoots(nil, big.NewInt(int64(batchIndex))) + if err != nil { + return fmt.Errorf("failed to get state root from L1: %w", err) + } + + // Compare state roots + l1StateRoot := common.BytesToHash(stateRoot[:]) + if l1StateRoot != l2Header.Root { + return fmt.Errorf("state root mismatch for batch %d: L1=%s, L2=%s", batchIndex, l1StateRoot.Hex(), l2Header.Root.Hex()) + } + + return nil +} + +// findCompletedBatchForL2Block finds the largest batch where lastL2Block <= l2BlockNum. +// Uses cached index for optimization: first call binary search, subsequent calls search forward. +// Separate caches for safe and finalized to avoid conflicts. +func (s *BlockTagService) findCompletedBatchForL2Block(tagType BlockTagType, l2HeaderNum uint64, lastCommittedBatchIndex uint64) (uint64, uint64, error) { + return s.findCompletedBatchForL2BlockWithDepth(tagType, l2HeaderNum, lastCommittedBatchIndex, 0) +} + +// findCompletedBatchForL2BlockWithDepth is the internal implementation with recursion depth limit. +// maxDepth is set to 1 to allow one retry after cache reset. +func (s *BlockTagService) findCompletedBatchForL2BlockWithDepth(tagType BlockTagType, l2HeaderNum uint64, lastCommittedBatchIndex uint64, depth int) (uint64, uint64, error) { + const maxDepth = 2 + + if lastCommittedBatchIndex == 0 { + return 0, 0, fmt.Errorf("no batches available") + } + + // Get cached index based on tag type + startIdx := s.getCachedBatchIndex(tagType) + if startIdx == 0 || startIdx > lastCommittedBatchIndex { + // First time or cache invalid: use binary search to find starting point + startIdx = s.binarySearchBatch(l2HeaderNum, lastCommittedBatchIndex) + if startIdx == 0 { + return 0, 0, fmt.Errorf("no completed batch found for L2 block %d", l2HeaderNum) + } + } + + // Search forward from startIdx + var resultIdx, resultLastL2Block uint64 + for idx := startIdx; idx <= lastCommittedBatchIndex; idx++ { + batchData, err := s.rollup.BatchDataStore(nil, big.NewInt(int64(idx))) + if err != nil { + return 0, 0, fmt.Errorf("failed to get batch data for index %d: %w", idx, err) + } + + lastL2Block := batchData.BlockNumber.Uint64() + if lastL2Block <= l2HeaderNum { + resultIdx = idx + resultLastL2Block = lastL2Block + s.setCachedBatchIndex(tagType, idx) + } else { + break + } + } + + // Handle L2 reorg: if cache was too new, reset and use binary search + if resultIdx == 0 { + if depth >= maxDepth { + return 0, 0, fmt.Errorf("no completed batch found for L2 block %d after retry", l2HeaderNum) + } + s.setCachedBatchIndex(tagType, 0) + return s.findCompletedBatchForL2BlockWithDepth(tagType, l2HeaderNum, lastCommittedBatchIndex, depth+1) + } + + return resultIdx, resultLastL2Block, nil +} + +func (s *BlockTagService) getCachedBatchIndex(tagType BlockTagType) uint64 { + if tagType == TagTypeSafe { + return s.lastKnownSafeBatchIndex + } + return s.lastKnownFinalizedBatchIndex +} + +func (s *BlockTagService) setCachedBatchIndex(tagType BlockTagType, idx uint64) { + if tagType == TagTypeSafe { + s.lastKnownSafeBatchIndex = idx + } else { + s.lastKnownFinalizedBatchIndex = idx + } +} + +// binarySearchBatch finds the largest batch index where lastL2BlockInBatch <= l2HeaderNum +func (s *BlockTagService) binarySearchBatch(l2HeaderNum uint64, maxBatchIndex uint64) uint64 { + low, high := uint64(1), maxBatchIndex + var result uint64 + + for low <= high { + mid := (low + high) / 2 + batchData, err := s.rollup.BatchDataStore(nil, big.NewInt(int64(mid))) + if err != nil { + return result // Return best result so far on error + } + + if batchData.BlockNumber.Uint64() <= l2HeaderNum { + result = mid + low = mid + 1 + } else { + high = mid - 1 + } + } + + return result +} + +// getLastCommittedBatchAtBlock queries the rollup contract at a specific L1 block +func (s *BlockTagService) getLastCommittedBatchAtBlock(l1BlockTag rpc.BlockNumber) (uint64, error) { + var blockNum *big.Int + if l1BlockTag == rpc.FinalizedBlockNumber { + blockNum = big.NewInt(int64(rpc.FinalizedBlockNumber)) + } else if l1BlockTag >= 0 { + blockNum = big.NewInt(int64(l1BlockTag)) + } + + lastCommitted, err := s.rollup.LastCommittedBatchIndex(&bind.CallOpts{ + BlockNumber: blockNum, + Context: s.ctx, + }) + if err != nil { + return 0, err + } + + return lastCommitted.Uint64(), nil +} + +// setSafeL2Block sets the safe L2 block hash +func (s *BlockTagService) setSafeL2Block(blockHash common.Hash) { + if blockHash != s.safeL2BlockHash { + s.safeL2BlockHash = blockHash + s.logger.Info("Updated safe L2 block", "hash", blockHash.Hex()) + } +} + +// setFinalizedL2Block sets the finalized L2 block hash +func (s *BlockTagService) setFinalizedL2Block(blockHash common.Hash) { + if blockHash != s.finalizedL2BlockHash { + s.finalizedL2BlockHash = blockHash + s.logger.Info("Updated finalized L2 block", "hash", blockHash.Hex()) + } +} + +// notifyGeth notifies geth of the new block tags via RPC +// Only calls RPC if there are changes since last notification +func (s *BlockTagService) notifyGeth() error { + safeBlockHash := s.safeL2BlockHash + finalizedBlockHash := s.finalizedL2BlockHash + + // Skip if no changes + if safeBlockHash == s.lastNotifiedSafeHash && finalizedBlockHash == s.lastNotifiedFinalizedHash { + return nil + } + + // Skip if both are empty + if safeBlockHash == (common.Hash{}) && finalizedBlockHash == (common.Hash{}) { + return nil + } + + if err := s.l2Client.SetBlockTags(s.ctx, safeBlockHash, finalizedBlockHash); err != nil { + return err + } + + // Update last notified hashes + s.lastNotifiedSafeHash = safeBlockHash + s.lastNotifiedFinalizedHash = finalizedBlockHash + return nil +} diff --git a/node/cmd/node/main.go b/node/cmd/node/main.go index 25a5a0a05..2a71f2a28 100644 --- a/node/cmd/node/main.go +++ b/node/cmd/node/main.go @@ -14,6 +14,7 @@ import ( "github.com/urfave/cli" "morph-l2/bindings/bindings" + "morph-l2/node/blocktag" "morph-l2/node/cmd/keyconverter" node "morph-l2/node/core" "morph-l2/node/db" @@ -41,6 +42,7 @@ func main() { app.Action = L2NodeMain app.Commands = []cli.Command{ keyConverterCmd, + versionCmd, } err := app.Run(os.Args) if err != nil { @@ -51,12 +53,13 @@ func main() { func L2NodeMain(ctx *cli.Context) error { var ( - err error - executor *node.Executor - syncer *sync.Syncer - ms *mock.Sequencer - tmNode *tmnode.Node - dvNode *derivation.Derivation + err error + executor *node.Executor + syncer *sync.Syncer + ms *mock.Sequencer + tmNode *tmnode.Node + dvNode *derivation.Derivation + blockTagSvc *blocktag.BlockTagService nodeConfig = node.DefaultConfig() ) @@ -141,6 +144,19 @@ func L2NodeMain(ctx *cli.Context) error { return fmt.Errorf("failed to start consensus node, error: %v", err) } } + + // Start BlockTagService for sequencer mode + blockTagConfig := blocktag.DefaultConfig() + if err := blockTagConfig.SetCliContext(ctx); err != nil { + return fmt.Errorf("blocktag config set cli context error: %w", err) + } + blockTagSvc, err = blocktag.NewBlockTagService(context.Background(), executor.L2Client(), blockTagConfig, nodeConfig.Logger) + if err != nil { + return fmt.Errorf("failed to create BlockTagService: %w", err) + } + if err := blockTagSvc.Start(); err != nil { + return fmt.Errorf("failed to start BlockTagService: %w", err) + } } interruptChannel := make(chan os.Signal, 1) @@ -167,6 +183,9 @@ func L2NodeMain(ctx *cli.Context) error { if dvNode != nil { dvNode.Stop() } + if blockTagSvc != nil { + blockTagSvc.Stop() + } return nil } diff --git a/node/cmd/node/version.go b/node/cmd/node/version.go new file mode 100644 index 000000000..427e98f12 --- /dev/null +++ b/node/cmd/node/version.go @@ -0,0 +1,29 @@ +package main + +import ( + "fmt" + "runtime" + + "github.com/urfave/cli" +) + +// Version information, set via -ldflags +var ( + Version = "dev" + GitCommit = "unknown" + BuildTime = "unknown" +) + +var versionCmd = cli.Command{ + Name: "version", + Aliases: []string{"v"}, + Usage: "show version information", + Action: func(ctx *cli.Context) error { + fmt.Printf("morphnode %s\n", Version) + fmt.Printf("Git Commit: %s\n", GitCommit) + fmt.Printf("Build Time: %s\n", BuildTime) + fmt.Printf("Go Version: %s\n", runtime.Version()) + fmt.Printf("OS/Arch: %s/%s\n", runtime.GOOS, runtime.GOARCH) + return nil + }, +} diff --git a/node/core/batch.go b/node/core/batch.go index 2ecb561ba..9c851956e 100644 --- a/node/core/batch.go +++ b/node/core/batch.go @@ -3,13 +3,11 @@ package node import ( "bytes" "context" - "errors" "fmt" "math/big" "morph-l2/node/types" - "github.com/morph-l2/go-ethereum/accounts/abi/bind" "github.com/morph-l2/go-ethereum/common" eth "github.com/morph-l2/go-ethereum/core/types" "github.com/morph-l2/go-ethereum/crypto" @@ -19,7 +17,7 @@ import ( ) type BatchingCache struct { - parentBatchHeader *types.BatchHeader + parentBatchHeader *types.BatchHeaderBytes prevStateRoot common.Hash // accumulated batch data @@ -30,7 +28,7 @@ type BatchingCache struct { lastPackedBlockHeight uint64 // caches sealedBatchHeader according to the above accumulated batch data - sealedBatchHeader *types.BatchHeader + sealedBatchHeader *types.BatchHeaderBytes sealedSidecar *eth.BlobTxSidecar currentBlockContext []byte @@ -82,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 { @@ -92,22 +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 } 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 { @@ -128,7 +128,7 @@ func (e *Executor) CalculateCapWithProposalBlock(currentBlockBytes []byte, curre 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) @@ -137,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 } @@ -145,7 +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.parentBatchHeader = &parentBatchHeader header, err := e.l2Client.HeaderByNumber(context.Background(), big.NewInt(int64(lastHeightBeforeCurrentBatch))) if err != nil { return false, err @@ -155,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 @@ -176,163 +178,97 @@ 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") - } - - 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() - } - - sequencerSetVerifyHash, err := e.sequencerCaller.SequencerSetVerifyHash(nil) + // MPT fork: force batch points on the 1st and 2nd post-fork blocks, so the 1st post-fork block + // becomes a single-block batch: [H1, H2). + force, err := e.forceBatchPointForMPTFork(height, block.Timestamp, block.StateRoot, block.Hash) if err != nil { - return nil, nil, fmt.Errorf("failed to get sequencerSetVerifyHash, err: %w", err) + return false, err } - - block, err := wrappedBlockFromBytes(e.batchingCache.currentBlockBytes) - if err != nil { - return nil, nil, err - } - l1MessagePopped := e.batchingCache.totalL1MessagePopped - e.batchingCache.parentBatchHeader.TotalL1MessagePopped - var skippedL1MessageBitmap []byte - if block.Timestamp < e.UpgradeBatchTime { - e.logger.Info("waiting upgrade batch time", "upgradeBatchTime", e.UpgradeBatchTime, "current block time", block.Timestamp, "remaining seconds", e.UpgradeBatchTime-block.Timestamp) - if l1MessagePopped > 0 { // 32 zero bytes when before upgrading and has L1 message in batch - skippedL1MessageBitmap = make([]byte, 32) - } + if force { + e.logger.Info("MPT fork: force batch point", "height", height, "timestamp", block.Timestamp) + return true, nil } - batchHeader := types.BatchHeader{ - Version: 0, - BatchIndex: e.batchingCache.parentBatchHeader.BatchIndex + 1, - L1MessagePopped: l1MessagePopped, - 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: skippedL1MessageBitmap, + 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) } - 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===SkippedL1MessageBitmap: %s \n===ParentBatchHash: %x \n", - batchHeader.BatchIndex, - batchHeader.L1MessagePopped, - batchHeader.TotalL1MessagePopped, - batchHeader.DataHash, - e.batchingCache.batchData.BlockNum(), - batchHeader.SkippedL1MessageBitmap, - batchHeader.ParentBatchHash)) - blockContexts, _ := e.batchingCache.batchData.Encode() - e.logger.Info(fmt.Sprintf("===blockContexts: %x \n", blockContexts)) - - return batchHash[:], e.batchingCache.sealedBatchHeader.Encode(), nil + return exceeded, err } -// 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 +// forceBatchPointForMPTFork forces batch points at the 1st and 2nd block after the MPT fork time. +// +// Design goals: +// - Minimal change: only affects batch-point decision logic. +// - Stability: CalculateCapWithProposalBlock can be called multiple times at the same height; return must be consistent. +// - Performance: after handling (or skipping beyond) the fork boundary, no more HeaderByNumber calls are made. +func (e *Executor) forceBatchPointForMPTFork(height uint64, blockTime uint64, stateRoot common.Hash, blockHash common.Hash) (bool, error) { + // If we already decided to force at this height, keep returning true without extra RPCs. + if e.mptForkForceHeight == height && height != 0 { + return true, 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 - } + // If fork boundary is already handled and this isn't a forced height, fast exit. + if e.mptForkStage >= 2 { + return false, nil } - blockContexts, err := e.batchingCache.batchData.Encode() - if err != nil { - return err + // Ensure we have fork time cached (0 means disabled). + if e.mptForkTime == 0 { + e.mptForkTime = e.l2Client.MPTForkTime() } - - curHeight, err := heightFromBCBytes(e.batchingCache.currentBlockBytes) - if err != nil { - return err + forkTime := e.mptForkTime + if forkTime == 0 || blockTime < forkTime { + return false, nil } - - var batchSigs []eth.BatchSignature - if !e.devSequencer { - batchSigs, err = e.ConvertBlsDatas(blsDatas) - if err != nil { - return err - } + if height == 0 { + return false, nil } - 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) + // Check parent block time to detect the 1st post-fork block (H1). + parent, err := e.l2Client.HeaderByNumber(context.Background(), big.NewInt(int64(height-1))) 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 + return false, 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, _, err := ParsingTxs(e.batchingCache.currentTxs, e.batchingCache.totalL1MessagePopped) + if parent.Time < forkTime { + // Log H1 (the 1st post-fork block) state root + // This stateRoot is intended to be used as the Rollup contract "genesis state root" + // when we reset/re-initialize the genesis state root during the MPT upgrade. + e.logger.Info( + "MPT_FORK_H1_GENESIS_STATE_ROOT", + "height", height, + "timestamp", blockTime, + "forkTime", forkTime, + "stateRoot", stateRoot.Hex(), + "blockHash", blockHash.Hex(), + ) + e.mptForkStage = 1 + e.mptForkForceHeight = height + return true, nil + } + + // If parent is already post-fork, we may be at the 2nd post-fork block (H2) or later. + if height < 2 { + // We cannot be H2; mark done to avoid future calls. + e.mptForkStage = 2 + return false, nil + } + + grandParent, err := e.l2Client.HeaderByNumber(context.Background(), big.NewInt(int64(height-2))) if err != nil { - return err + return false, err + } + if grandParent.Time < forkTime { + // This is H2 (2nd post-fork block). + e.mptForkStage = 2 + e.mptForkForceHeight = height + return true, nil } - e.batchingCache.totalL1MessagePopped = totalL1MessagePopped - 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 + // Beyond H2: nothing to do (can't retroactively fix). Mark done for performance. + e.mptForkStage = 2 + return false, nil } func (e *Executor) AppendBlsData(height int64, batchHash []byte, data l2node.BlsData) error { @@ -366,7 +302,7 @@ func (e *Executor) PackCurrentBlock(currentBlockBytes []byte, currentTxs tmtypes } } - curHeight, err := heightFromBCBytes(currentBlockBytes) + curHeight, err := types.HeightFromBlockBytes(currentBlockBytes) if err != nil { return err } @@ -442,7 +378,7 @@ func ParsingTxs(transactions tmtypes.Txs, totalL1MessagePoppedBefore uint64) (tx 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, @@ -458,8 +394,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, @@ -482,7 +417,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) } @@ -495,18 +432,6 @@ func (e *Executor) ConvertBlsData(blsData l2node.BlsData) (*eth.BatchSignature, return &bs, nil } -func wrappedBlockFromBytes(blockBytes []byte) (*types.WrappedBlock, error) { - var curBlock = new(types.WrappedBlock) - if err := curBlock.UnmarshalBinary(blockBytes); err != nil { - return nil, err - } - return curBlock, nil -} - -func heightFromBCBytes(blockBytes []byte) (uint64, error) { - curBlock, err := wrappedBlockFromBytes(blockBytes) - if 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 000000000..c0f161768 --- /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 000000000..be02cdfe1 --- /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 f14d66488..9132f732c 100644 --- a/node/core/config.go +++ b/node/core/config.go @@ -23,18 +23,23 @@ import ( ) var ( - MainnetUpgradeBatchTime uint64 = 2000 - HoleskyUpgradeBatchTime uint64 = 350000 + MainnetUpgradeBatchTime uint64 = 0 + MainnetBlsKeyCheckForkHeight uint64 = 18409547 + + // L1 Mainnet Contract Addresses + MainnetRollupContractAddress = common.HexToAddress("0x759894ced0e6af42c26668076ffa84d02e3cef60") ) type Config struct { L2 *types.L2Config `json:"l2"` + L2Next *types.L2Config `json:"l2_next,omitempty"` // optional, for geth upgrade switch L2CrossDomainMessengerAddress common.Address `json:"cross_domain_messenger_address"` SequencerAddress common.Address `json:"sequencer_address"` 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"` + BlsKeyCheckForkHeight uint64 `json:"bls_key_check_fork_height"` DevSequencer bool `json:"dev_sequencer"` Logger tmlog.Logger `json:"logger"` } @@ -42,6 +47,7 @@ type Config struct { func DefaultConfig() *Config { return &Config{ L2: new(types.L2Config), + L2Next: nil, // optional, only for upgrade switch Logger: tmlog.NewTMLogger(tmlog.NewSyncWriter(os.Stdout)), MaxL1MessageNumPerBlock: 100, L2CrossDomainMessengerAddress: predeploys.L2CrossDomainMessengerAddr, @@ -122,6 +128,16 @@ func (c *Config) SetCliContext(ctx *cli.Context) error { c.L2.EngineAddr = l2EngineAddr c.L2.JwtSecret = secret + // L2Next is optional - only for upgrade switch (e.g., ZK to MPT) + l2NextEthAddr := ctx.GlobalString(flags.L2NextEthAddr.Name) + l2NextEngineAddr := ctx.GlobalString(flags.L2NextEngineAddr.Name) + if l2NextEthAddr != "" && l2NextEngineAddr != "" { + c.L2Next = &types.L2Config{ + EthAddr: l2NextEthAddr, + EngineAddr: l2NextEngineAddr, + JwtSecret: secret, // same secret + } + } if ctx.GlobalIsSet(flags.MaxL1MessageNumPerBlock.Name) { c.MaxL1MessageNumPerBlock = ctx.GlobalUint64(flags.MaxL1MessageNumPerBlock.Name) if c.MaxL1MessageNumPerBlock == 0 { @@ -157,12 +173,16 @@ func (c *Config) SetCliContext(ctx *cli.Context) error { c.DevSequencer = ctx.GlobalBool(flags.DevSequencer.Name) } - // setup batch upgrade index + if ctx.GlobalIsSet(flags.BlsKeyCheckForkHeight.Name) { + c.BlsKeyCheckForkHeight = ctx.GlobalUint64(flags.BlsKeyCheckForkHeight.Name) + } + + // setup batch upgrade index and fork heights switch { case ctx.GlobalIsSet(flags.MainnetFlag.Name): c.UpgradeBatchTime = MainnetUpgradeBatchTime - case ctx.GlobalIsSet(flags.HoleskyFlag.Name): - c.UpgradeBatchTime = HoleskyUpgradeBatchTime + c.BlsKeyCheckForkHeight = MainnetBlsKeyCheckForkHeight + logger.Info("set UpgradeBatchTime: ", c.UpgradeBatchTime, "BlsKeyCheckForkHeight: ", c.BlsKeyCheckForkHeight) case ctx.GlobalIsSet(flags.UpgradeBatchTime.Name): c.UpgradeBatchTime = ctx.GlobalUint64(flags.UpgradeBatchTime.Name) logger.Info("set UpgradeBatchTime: ", ctx.GlobalUint64(flags.UpgradeBatchTime.Name)) diff --git a/node/core/executor.go b/node/core/executor.go index a7209526e..52d30125d 100644 --- a/node/core/executor.go +++ b/node/core/executor.go @@ -51,9 +51,17 @@ type Executor struct { isSequencer bool devSequencer bool - UpgradeBatchTime uint64 - rollupABI *abi.ABI - batchingCache *BatchingCache + UpgradeBatchTime uint64 + blsKeyCheckForkHeight uint64 + rollupABI *abi.ABI + batchingCache *BatchingCache + + // MPT fork handling: force batch points at the 1st and 2nd block after fork. + // This state machine exists to avoid repeated HeaderByNumber calls after the fork is handled, + // while keeping results stable if CalculateCapWithProposalBlock is called multiple times at the same height. + mptForkTime uint64 // cached from geth eth_config.morph.mptForkTime (0 means disabled/unknown) + mptForkStage uint8 // 0: not handled, 1: forced H1, 2: done (forced H2 or skipped beyond H2) + mptForkForceHeight uint64 // if equals current height, must return true (stability across multiple calls) logger tmlog.Logger metrics *Metrics @@ -70,6 +78,7 @@ func getNextL1MsgIndex(client *types.RetryableClient) (uint64, error) { func NewExecutor(newSyncFunc NewSyncerFunc, config *Config, tmPubKey crypto.PubKey) (*Executor, error) { logger := config.Logger logger = logger.With("module", "executor") + // L2 geth endpoint (required - current geth) aClient, err := authclient.DialContext(context.Background(), config.L2.EngineAddr, config.L2.JwtSecret) if err != nil { return nil, err @@ -79,7 +88,31 @@ func NewExecutor(newSyncFunc NewSyncerFunc, config *Config, tmPubKey crypto.PubK return nil, err } - l2Client := types.NewRetryableClient(aClient, eClient, config.Logger) + // L2Next endpoint (optional - for upgrade switch) + var aNextClient *authclient.Client + var eNextClient *ethclient.Client + if config.L2Next != nil && config.L2Next.EngineAddr != "" && config.L2Next.EthAddr != "" { + aNextClient, err = authclient.DialContext(context.Background(), config.L2Next.EngineAddr, config.L2Next.JwtSecret) + if err != nil { + return nil, err + } + eNextClient, err = ethclient.Dial(config.L2Next.EthAddr) + if err != nil { + return nil, err + } + logger.Info("L2Next geth configured (upgrade switch enabled)", "engineAddr", config.L2Next.EngineAddr, "ethAddr", config.L2Next.EthAddr) + } else { + logger.Info("L2Next geth not configured (no upgrade switch)") + } + + // Fetch geth config at startup (with retry to wait for geth) + gethCfg, err := types.FetchGethConfigWithRetry(config.L2.EthAddr, logger) + if err != nil { + return nil, fmt.Errorf("failed to fetch geth config: %w", err) + } + logger.Info("Geth config fetched", "switchTime", gethCfg.SwitchTime, "useZktrie", gethCfg.UseZktrie) + + l2Client := types.NewRetryableClient(aClient, eClient, aNextClient, eNextClient, gethCfg.SwitchTime, logger) index, err := getNextL1MsgIndex(l2Client) if err != nil { return nil, err @@ -108,21 +141,23 @@ func NewExecutor(newSyncFunc NewSyncerFunc, config *Config, tmPubKey crypto.PubK tmPubKeyBytes = tmPubKey.Bytes() } executor := &Executor{ - l2Client: l2Client, - bc: &Version1Converter{}, - govCaller: gov, - sequencerCaller: sequencer, - l2StakingCaller: l2Staking, - tmPubKey: tmPubKeyBytes, - nextL1MsgIndex: index, - maxL1MsgNumPerBlock: config.MaxL1MessageNumPerBlock, - newSyncerFunc: newSyncFunc, - devSequencer: config.DevSequencer, - rollupABI: rollupAbi, - batchingCache: NewBatchingCache(), - UpgradeBatchTime: config.UpgradeBatchTime, - logger: logger, - metrics: PrometheusMetrics("morphnode"), + l2Client: l2Client, + bc: &Version1Converter{}, + govCaller: gov, + sequencerCaller: sequencer, + l2StakingCaller: l2Staking, + tmPubKey: tmPubKeyBytes, + nextL1MsgIndex: index, + maxL1MsgNumPerBlock: config.MaxL1MessageNumPerBlock, + newSyncerFunc: newSyncFunc, + devSequencer: config.DevSequencer, + rollupABI: rollupAbi, + batchingCache: NewBatchingCache(), + UpgradeBatchTime: config.UpgradeBatchTime, + blsKeyCheckForkHeight: config.BlsKeyCheckForkHeight, + mptForkTime: l2Client.MPTForkTime(), + logger: logger, + metrics: PrometheusMetrics("morphnode"), } if config.DevSequencer { @@ -135,7 +170,12 @@ func NewExecutor(newSyncFunc NewSyncerFunc, config *Config, tmPubKey crypto.PubK return executor, nil } - if _, err = executor.updateSequencerSet(); err != nil { + // Get current height for initial sequencer set update + currentHeight, err := l2Client.BlockNumber(context.Background()) + if err != nil { + return nil, err + } + if _, err = executor.updateSequencerSet(currentHeight); err != nil { return nil, err } @@ -146,7 +186,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 allowed to be called") + err = fmt.Errorf("RequestBlockData is not alllowed to be called") return } e.logger.Info("RequestBlockData request", "height", height) @@ -208,7 +248,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 allowed to be called") + return false, fmt.Errorf("RequestBlockData is not alllowed to be called") } if len(metaData) == 0 { e.logger.Error("metaData cannot be nil") @@ -276,16 +316,39 @@ func (e *Executor) DeliverBlock(txs [][]byte, metaData []byte, consensusData l2n } if wrappedBlock.Number <= height { - e.logger.Info("ignore it, the block was delivered", "block number", wrappedBlock.Number) - if e.devSequencer { - return nil, consensusData.ValidatorSet, nil + e.logger.Info("block already delivered by geth (via P2P sync)", "block_number", wrappedBlock.Number) + // Even if block was already delivered (e.g., synced via P2P), we still need to check + // if MPT switch should happen, otherwise sentry nodes won't switch to the correct geth. + e.l2Client.EnsureSwitched(context.Background(), wrappedBlock.Timestamp, wrappedBlock.Number) + + // After switch, re-check height from the new geth client + // The block might exist in legacy geth but not in target geth after switch + newHeight, err := e.l2Client.BlockNumber(context.Background()) + if err != nil { + return nil, nil, err + } + if wrappedBlock.Number > newHeight { + e.logger.Info("block not in target geth after switch, need to deliver", + "block_number", wrappedBlock.Number, + "old_height", height, + "new_height", newHeight) + // Update height and continue to deliver the block + height = newHeight + } else { + if e.devSequencer { + return nil, consensusData.ValidatorSet, nil + } + return e.getParamsAndValsAtHeight(int64(wrappedBlock.Number)) } - return e.getParamsAndValsAtHeight(int64(wrappedBlock.Number)) } // We only accept the continuous blocks for now. // It acts like full sync. Snap sync is not enabled until the Geth enables snapshot with zkTrie if wrappedBlock.Number > height+1 { + e.logger.Error("!!! CRITICAL: Geth is behind - node BLOCKED !!!", + "consensus_block", wrappedBlock.Number, + "geth_height", height, + "action", "Switch to MPT-compatible geth IMMEDIATELY") return nil, nil, types.ErrWrongBlockNumber } @@ -317,7 +380,15 @@ func (e *Executor) DeliverBlock(txs [][]byte, metaData []byte, consensusData l2n } err = e.l2Client.NewL2Block(context.Background(), l2Block, batchHash) if err != nil { - e.logger.Error("failed to NewL2Block", "error", err) + e.logger.Error("========================================") + e.logger.Error("CRITICAL: Failed to deliver block to geth!") + e.logger.Error("========================================") + e.logger.Error("failed to NewL2Block", + "error", err, + "block_number", l2Block.Number, + "block_timestamp", l2Block.Timestamp) + e.logger.Error("HINT: If this occurs after MPT upgrade, your geth node may not support MPT blocks. " + + "Please ensure you are running an MPT-compatible geth node.") return nil, nil, err } @@ -327,7 +398,7 @@ func (e *Executor) DeliverBlock(txs [][]byte, metaData []byte, consensusData l2n var newValidatorSet = consensusData.ValidatorSet var newBatchParams *tmproto.BatchParams if !e.devSequencer { - if newValidatorSet, err = e.updateSequencerSet(); err != nil { + if newValidatorSet, err = e.updateSequencerSet(l2Block.Number); err != nil { return nil, nil, err } if newBatchParams, err = e.batchParamsUpdates(l2Block.Number); err != nil { @@ -390,9 +461,16 @@ func (e *Executor) getParamsAndValsAtHeight(height int64) (*tmproto.BatchParams, if err != nil { return nil, nil, err } - newValidators := make([][]byte, len(addrs)) + newValidators := make([][]byte, 0, len(addrs)) for i := range stakesInfo { - newValidators[i] = stakesInfo[i].TmKey[:] + // validate blsKey to keep consistent with sequencerSetUpdates + if _, err := decodeBlsPubKey(stakesInfo[i].BlsKey); err != nil { + e.logger.Error("getParamsAndValsAtHeight: failed to decode bls key", "key bytes", hexutil.Encode(stakesInfo[i].BlsKey), "error", err) + if e.isBlsKeyCheckFork(uint64(height)) { + continue + } + } + newValidators = append(newValidators, stakesInfo[i].TmKey[:]) } return &tmproto.BatchParams{ diff --git a/node/core/sequencers.go b/node/core/sequencers.go index 68f253a64..9632fa8d8 100644 --- a/node/core/sequencers.go +++ b/node/core/sequencers.go @@ -18,6 +18,12 @@ import ( const tmKeySize = ed25519.PubKeySize +// isBlsKeyCheckFork returns true if blsKey validation should be enforced at the given height. +// For mainnet, blsKey validation is skipped before fork height to maintain historical compatibility. +func (e *Executor) isBlsKeyCheckFork(height uint64) bool { + return e.blsKeyCheckForkHeight == 0 || height > e.blsKeyCheckForkHeight +} + type validatorInfo struct { address common.Address blsPubKey blssignatures.PublicKey @@ -55,12 +61,14 @@ func (e *Executor) VerifySignature(tmPubKey []byte, messageHash []byte, blsSig [ return blssignatures.VerifySignature(sig, messageHash, blsKey) } -func (e *Executor) sequencerSetUpdates() ([][]byte, error) { +func (e *Executor) sequencerSetUpdates(height uint64) ([][]byte, error) { seqHash, err := e.sequencerCaller.SequencerSetVerifyHash(nil) if err != nil { return nil, err } - if e.currentSeqHash != nil && bytes.Equal(e.currentSeqHash[:], seqHash[:]) { + // Don't use cache at fork height boundary to ensure correct blsKey validation behavior change + atForkBoundary := e.blsKeyCheckForkHeight > 0 && (height == e.blsKeyCheckForkHeight || height == e.blsKeyCheckForkHeight+1) + if e.currentSeqHash != nil && bytes.Equal(e.currentSeqHash[:], seqHash[:]) && !atForkBoundary { return e.nextValidators, nil } @@ -98,7 +106,9 @@ func (e *Executor) sequencerSetUpdates() ([][]byte, error) { blsPK, err := decodeBlsPubKey(stakesInfo[i].BlsKey) if err != nil { e.logger.Error("failed to decode bls key", "key bytes", hexutil.Encode(stakesInfo[i].BlsKey), "error", err) - return nil, err + if e.isBlsKeyCheckFork(height) { + continue + } } // sequencerSet2 is the latest updated sequencer set which is considered as the next validator set for tendermint if slices.Contains(sequencerSet2, stakesInfo[i].Addr) { @@ -147,8 +157,8 @@ func (e *Executor) batchParamsUpdates(height uint64) (*tmproto.BatchParams, erro return nil, nil } -func (e *Executor) updateSequencerSet() ([][]byte, error) { - validatorUpdates, err := e.sequencerSetUpdates() +func (e *Executor) updateSequencerSet(height uint64) ([][]byte, error) { + validatorUpdates, err := e.sequencerSetUpdates(height) if err != nil { e.logger.Error("failed to get sequencer set from geth", "err", err) return nil, err diff --git a/node/db/keys.go b/node/db/keys.go index 334009223..b0d50ddcd 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 dcabfc091..1a87a227c 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 17d4fe88a..d795092b8 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,29 +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 - // If skipMap is zero value, there are no msgs that can be skipped - if len(batch.SkippedL1MessageBitmap[:]) != 0 { - 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) @@ -106,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 @@ -122,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) @@ -138,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 ab35a373a..50bd0802a 100644 --- a/node/derivation/beacon.go +++ b/node/derivation/beacon.go @@ -13,7 +13,6 @@ import ( "sync" "github.com/morph-l2/go-ethereum/common" - "github.com/morph-l2/go-ethereum/common/hexutil" "github.com/morph-l2/go-ethereum/core/types" "github.com/morph-l2/go-ethereum/crypto/kzg4844" "github.com/morph-l2/go-ethereum/params" @@ -131,70 +130,16 @@ func (cl *L1BeaconClient) GetBlobSidecars(ctx context.Context, ref L1BlockRef, h if err := cl.apiReq(ctx, &resp, builder.String()); err != nil { return nil, fmt.Errorf("%w: failed to fetch blob sidecars for slot %v block %v", err, slot, ref) } - if len(hashes) != len(resp.Data) { - return nil, fmt.Errorf("expected %v sidecars but got %v", len(hashes), len(resp.Data)) + // Some Beacon nodes may ignore the indices parameter and return all sidecars for the slot. + // We only need to ensure we have at least the number of sidecars we requested. + // Callers are responsible for filtering the correct sidecars by index if needed. + if len(resp.Data) < len(hashes) { + return nil, fmt.Errorf("expected at least %v sidecars but got %v", len(hashes), len(resp.Data)) } return resp.Data, nil } -// GetBlobSidecar fetches blob sidecars that were confirmed in the specified L1 block with the -// given indexed hashes. Order of the returned sidecars is not guaranteed, and blob data is not -// checked for validity. -func (cl *L1BeaconClient) GetBlobSidecar(ctx context.Context, ref L1BlockRef, hashes []IndexedBlobHash) (types.BlobTxSidecar, error) { - blobSidecars, err := cl.GetBlobSidecars(ctx, ref, hashes) - if err != nil { - return types.BlobTxSidecar{}, fmt.Errorf("%w: failed to get blob sidecars for L1BlockRef %v", err, ref) - } - return sidecarFromSidecars(blobSidecars, hashes) -} - -func indexFunc(s []*BlobSidecar, f func(blobSidecars *BlobSidecar) bool) int { - for i := range s { - if f(s[i]) { - return i - } - } - return -1 -} - -func sidecarFromSidecars(blobSidecars []*BlobSidecar, hashes []IndexedBlobHash) (types.BlobTxSidecar, error) { - var blobTxSidecar types.BlobTxSidecar - for i, ih := range hashes { - // The beacon node api makes no guarantees on order of the returned blob sidecars, so - // search for the sidecar that matches the current indexed hash to ensure blobs are - // returned in the same order. - scIndex := indexFunc( - blobSidecars, - func(sc *BlobSidecar) bool { return uint64(sc.Index) == ih.Index }) - if scIndex == -1 { - return types.BlobTxSidecar{}, fmt.Errorf("no blob in response matches desired index: %v", ih.Index) - } - sidecar := blobSidecars[scIndex] - - // make sure the blob's kzg commitment hashes to the expected value - hash := KZGToVersionedHash(kzg4844.Commitment(sidecar.KZGCommitment)) - if hash != ih.Hash { - return types.BlobTxSidecar{}, fmt.Errorf("expected hash %s for blob at index %d but got %s", ih.Hash, ih.Index, hash) - } - - // confirm blob data is valid by verifying its proof against the commitment - var blob Blob - b, err := hexutil.Decode(sidecar.Blob) - if err != nil { - return types.BlobTxSidecar{}, fmt.Errorf("hexutil.Decode(sidecar.Blob) error:%v", err) - } - copy(blob[:], b) - if err := VerifyBlobProof(&blob, kzg4844.Commitment(sidecar.KZGCommitment), kzg4844.Proof(sidecar.KZGProof)); err != nil { - return types.BlobTxSidecar{}, fmt.Errorf("%w: blob at index %d failed verification", err, i) - } - blobTxSidecar.Blobs = append(blobTxSidecar.Blobs, *blob.KZGBlob()) - blobTxSidecar.Commitments = append(blobTxSidecar.Commitments, kzg4844.Commitment(sidecar.KZGCommitment)) - blobTxSidecar.Proofs = append(blobTxSidecar.Proofs, kzg4844.Proof(sidecar.KZGProof)) - } - return blobTxSidecar, nil -} - // IndexedBlobHash represents a blob hash that commits to a single blob confirmed in a block. The // index helps us avoid unnecessary blob to blob hash conversions to find the right content in a // sidecar. @@ -241,3 +186,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 000000000..12e2dbaf7 --- /dev/null +++ b/node/derivation/beacon_test.go @@ -0,0 +1,71 @@ +package derivation + +import ( + "context" + "fmt" + "math/big" + "os" + "testing" + + "github.com/morph-l2/go-ethereum" + "github.com/morph-l2/go-ethereum/common" + eth "github.com/morph-l2/go-ethereum/core/types" + "github.com/morph-l2/go-ethereum/ethclient" + "github.com/stretchr/testify/require" +) + +func TestGetBlob(t *testing.T) { + url := os.Getenv("BLOB_URL") + if url == "" { + return + } + var ( + start uint64 = 1590159 + end uint64 = 1590159 + ) + baseHttp := NewBasicHTTPClient(url, nil) + // query blob + l1BeaconClient := NewL1BeaconClient(baseHttp) + l1Client, err := ethclient.Dial(url) + require.NoError(t, err) + logs, err := testTchRollupLog(l1Client, context.Background(), start, end) + require.NoError(t, err) + if len(logs) > 0 { + for _, lg := range logs { + txHash := lg.TxHash + block, err := l1Client.BlockByNumber(context.Background(), big.NewInt(int64(lg.BlockNumber))) + require.NoError(t, err) + tx, _, err := l1Client.TransactionByHash(context.Background(), txHash) + require.NoError(t, err) + indexedBlobHashes := dataAndHashesFromTxs(block.Transactions(), tx) + fmt.Println(indexedBlobHashes) + header, err := l1Client.HeaderByNumber(context.Background(), big.NewInt(int64(lg.BlockNumber))) + require.NoError(t, err) + var bts []*BlobSidecar + if len(indexedBlobHashes) != 0 { + bts, err = l1BeaconClient.GetBlobSidecarsEnhanced(context.Background(), L1BlockRef{ + Time: header.Time, + }, indexedBlobHashes) + require.NoError(t, err) + } + t.Log(len(bts)) + } + + } + +} + +func testTchRollupLog(l1Client *ethclient.Client, ctx context.Context, from, to uint64) ([]eth.Log, error) { + RollupContractAddress := common.HexToAddress("0x511d92b63ae7471fd5239bded29b76a446698a00") + query := ethereum.FilterQuery{ + FromBlock: big.NewInt(0).SetUint64(from), + ToBlock: big.NewInt(0).SetUint64(to), + Addresses: []common.Address{ + RollupContractAddress, + }, + Topics: [][]common.Hash{ + {RollupEventTopicHash}, + }, + } + return l1Client.FilterLogs(ctx, query) +} diff --git a/node/derivation/config.go b/node/derivation/config.go index 439acbc42..efb1ceb31 100644 --- a/node/derivation/config.go +++ b/node/derivation/config.go @@ -34,6 +34,7 @@ const ( type Config struct { L1 *types.L1Config `json:"l1"` L2 *types.L2Config `json:"l2"` + L2Next *types.L2Config `json:"l2_next,omitempty"` // optional, for geth upgrade switch BeaconRpc string `json:"beacon_rpc"` RollupContractAddress common.Address `json:"rollup_contract_address"` StartHeight uint64 `json:"start_height"` @@ -55,6 +56,7 @@ func DefaultConfig() *Config { LogProgressInterval: DefaultLogProgressInterval, FetchBlockRange: DefaultFetchBlockRange, L2: new(types.L2Config), + L2Next: nil, // optional, only for upgrade switch } } @@ -135,6 +137,17 @@ func (c *Config) SetCliContext(ctx *cli.Context) error { c.L2.EthAddr = l2EthAddr c.L2.EngineAddr = l2EngineAddr c.L2.JwtSecret = secret + + // L2Next is optional - only for upgrade switch (e.g., ZK to MPT) + l2NextEthAddr := ctx.GlobalString(flags.L2NextEthAddr.Name) + l2NextEngineAddr := ctx.GlobalString(flags.L2NextEngineAddr.Name) + if l2NextEthAddr != "" && l2NextEngineAddr != "" { + c.L2Next = &types.L2Config{ + EthAddr: l2NextEthAddr, + EngineAddr: l2NextEngineAddr, + JwtSecret: secret, // same secret + } + } c.MetricsServerEnable = ctx.GlobalBool(flags.MetricsServerEnable.Name) c.MetricsHostname = ctx.GlobalString(flags.MetricsHostname.Name) c.MetricsPort = ctx.GlobalUint64(flags.MetricsPort.Name) diff --git a/node/derivation/derivation.go b/node/derivation/derivation.go index 0b4eeb137..8fb311b0e 100644 --- a/node/derivation/derivation.go +++ b/node/derivation/derivation.go @@ -6,15 +6,16 @@ import ( "errors" "fmt" "math/big" - "os" "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" @@ -48,8 +49,9 @@ type Derivation struct { l1BeaconClient *L1BeaconClient L2ToL1MessagePasser *bindings.L2ToL1MessagePasser - rollupABI *abi.ABI - legacyRollupABI *abi.ABI // before remove skipMap + rollupABI *abi.ABI + legacyRollupABI *abi.ABI // before remove skipMap + beforeMoveBlockCtxABI *abi.ABI db Database @@ -61,6 +63,10 @@ type Derivation struct { pollInterval time.Duration logProgressInterval time.Duration stop chan struct{} + + // geth upgrade config (fetched once at startup) + switchTime uint64 + useZktrie bool } type DeployContractBackend interface { @@ -75,6 +81,7 @@ func NewDerivationClient(ctx context.Context, cfg *Config, syncer *sync.Syncer, if err != nil { return nil, err } + // L2 geth endpoint (required - current geth) aClient, err := authclient.DialContext(context.Background(), cfg.L2.EngineAddr, cfg.L2.JwtSecret) if err != nil { return nil, err @@ -83,6 +90,24 @@ func NewDerivationClient(ctx context.Context, cfg *Config, syncer *sync.Syncer, if err != nil { return nil, err } + + // L2Next endpoint (optional - for upgrade switch) + var aNextClient *authclient.Client + var eNextClient *ethclient.Client + if cfg.L2Next != nil && cfg.L2Next.EngineAddr != "" && cfg.L2Next.EthAddr != "" { + aNextClient, err = authclient.DialContext(context.Background(), cfg.L2Next.EngineAddr, cfg.L2Next.JwtSecret) + if err != nil { + return nil, err + } + eNextClient, err = ethclient.Dial(cfg.L2Next.EthAddr) + if err != nil { + return nil, err + } + logger.Info("L2Next geth configured (upgrade switch enabled)", "engineAddr", cfg.L2Next.EngineAddr, "ethAddr", cfg.L2Next.EthAddr) + } else { + logger.Info("L2Next geth not configured (no upgrade switch)") + } + msgPasser, err := bindings.NewL2ToL1MessagePasser(predeploys.L2ToL1MessagePasserAddr, eClient) if err != nil { return nil, err @@ -95,6 +120,10 @@ func NewDerivationClient(ctx context.Context, cfg *Config, syncer *sync.Syncer, 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") @@ -109,6 +138,15 @@ func NewDerivationClient(ctx context.Context, cfg *Config, syncer *sync.Syncer, } baseHttp := NewBasicHTTPClient(cfg.BeaconRpc, logger) l1BeaconClient := NewL1BeaconClient(baseHttp) + + // Fetch geth config once at startup for root validation skip logic (with retry) + gethCfg, err := types.FetchGethConfigWithRetry(cfg.L2.EthAddr, logger) + if err != nil { + cancel() // cancel context to avoid leak + return nil, fmt.Errorf("failed to fetch geth config: %w", err) + } + logger.Info("Geth config fetched", "switchTime", gethCfg.SwitchTime, "useZktrie", gethCfg.UseZktrie) + return &Derivation{ ctx: ctx, db: db, @@ -118,10 +156,11 @@ func NewDerivationClient(ctx context.Context, cfg *Config, syncer *sync.Syncer, rollup: rollup, rollupABI: rollupAbi, legacyRollupABI: legacyRollupAbi, + beforeMoveBlockCtxABI: beforeMoveBlockCtxAbi, logger: logger, RollupContractAddress: cfg.RollupContractAddress, confirmations: cfg.L1.Confirmations, - l2Client: types.NewRetryableClient(aClient, eClient, tmlog.NewTMLogger(tmlog.NewSyncWriter(os.Stdout))), + l2Client: types.NewRetryableClient(aClient, eClient, aNextClient, eNextClient, gethCfg.SwitchTime, logger), cancel: cancel, stop: make(chan struct{}), startHeight: cfg.StartHeight, @@ -132,6 +171,8 @@ func NewDerivationClient(ctx context.Context, cfg *Config, syncer *sync.Syncer, metrics: metrics, l1BeaconClient: l1BeaconClient, L2ToL1MessagePasser: msgPasser, + switchTime: gethCfg.SwitchTime, + useZktrie: gethCfg.UseZktrie, }, nil } @@ -238,25 +279,47 @@ func (d *Derivation) derivationBlock(ctx context.Context) { d.logger.Error("get withdrawal root failed", "error", err) return } - if !bytes.Equal(lastHeader.Root.Bytes(), batchInfo.root.Bytes()) || !bytes.Equal(withdrawalRoot[:], batchInfo.withdrawalRoot.Bytes()) { - d.metrics.SetBatchStatus(stateException) - // TODO The challenge switch is currently on and will be turned on in the future - if d.validator != nil && d.validator.ChallengeEnable() { - if err := d.validator.ChallengeState(batchInfo.batchIndex); err != nil { - d.logger.Error("challenge state failed") - return + + rootMismatch := !bytes.Equal(lastHeader.Root.Bytes(), batchInfo.root.Bytes()) + withdrawalMismatch := !bytes.Equal(withdrawalRoot[:], batchInfo.withdrawalRoot.Bytes()) + + if rootMismatch || withdrawalMismatch { + // Check if should skip validation during upgrade transition + // Skip if: (before switch && MPT geth) or (after switch && ZK geth) + skipValidation := false + if d.switchTime > 0 { + beforeSwitch := lastHeader.Time < d.switchTime + if (beforeSwitch && !d.useZktrie) || (!beforeSwitch && d.useZktrie) { + skipValidation = true + d.logger.Info("Root validation skipped during upgrade transition", + "originStateRootHash", batchInfo.root, + "deriveStateRootHash", lastHeader.Root.Hex(), + "blockTimestamp", lastHeader.Time, + "switchTime", d.switchTime, + "useZktrie", d.useZktrie, + ) } } - d.logger.Info("root hash or withdrawal hash is not equal", - "originStateRootHash", batchInfo.root, - "deriveStateRootHash", lastHeader.Root.Hex(), - "batchWithdrawalRoot", batchInfo.withdrawalRoot.Hex(), - "deriveWithdrawalRoot", common.BytesToHash(withdrawalRoot[:]).Hex(), - ) - return - } else { - d.metrics.SetBatchStatus(stateNormal) + + if !skipValidation { + d.metrics.SetBatchStatus(stateException) + // TODO The challenge switch is currently on and will be turned on in the future + if d.validator != nil && d.validator.ChallengeEnable() { + if err := d.validator.ChallengeState(batchInfo.batchIndex); err != nil { + d.logger.Error("challenge state failed") + return + } + } + d.logger.Error("root hash or withdrawal hash is not equal", + "originStateRootHash", batchInfo.root, + "deriveStateRootHash", lastHeader.Root.Hex(), + "batchWithdrawalRoot", batchInfo.withdrawalRoot.Hex(), + "deriveWithdrawalRoot", common.BytesToHash(withdrawalRoot[:]).Hex(), + ) + return + } } + d.metrics.SetBatchStatus(stateNormal) d.metrics.SetL1SyncHeight(lg.BlockNumber) } @@ -291,26 +354,91 @@ func (d *Derivation) fetchRollupDataByTxHash(txHash common.Hash, blockNumber uin if err != nil { return nil, err } - // 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 + } + } + } + + 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) } } - batch.Sidecar = bts + + // Get L2 height l2Height, err := d.l2Client.BlockNumber(d.ctx) if err != nil { return nil, fmt.Errorf("query l2 block number error:%v", err) @@ -329,8 +457,8 @@ func (d *Derivation) fetchRollupDataByTxHash(txHash common.Hash, blockNumber uin func (d *Derivation) UnPackData(data []byte) (geth.RPCRollupBatch, error) { var batch geth.RPCRollupBatch - if bytes.Equal(d.rollupABI.Methods["commitBatch"].ID, data[:4]) { - args, err := d.rollupABI.Methods["commitBatch"].Inputs.Unpack(data[4:]) + 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) } @@ -365,13 +493,58 @@ func (d *Derivation) UnPackData(data []byte) (geth.RPCRollupBatch, error) { WithdrawalRoot [32]uint8 "json:\"withdrawalRoot\"" }) 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[:]), + 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 if bytes.Equal(d.rollupABI.Methods["commitBatchWithProof"].ID, data[:4]) { + args, err := d.rollupABI.Methods["commitBatchWithProof"].Inputs.Unpack(data[4:]) + if err != nil { + return batch, fmt.Errorf("commitBatchWithProof 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 @@ -380,25 +553,20 @@ func (d *Derivation) UnPackData(data []byte) (geth.RPCRollupBatch, error) { } func (d *Derivation) parseBatch(batch geth.RPCRollupBatch, l2Height uint64) (*BatchInfo, error) { - parentBatchHeader, err := types.DecodeBatchHeader(batch.ParentBatchHeader) - if err != nil { - return nil, fmt.Errorf("decode batch header error:%v", err) - } 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, l2Height); 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, l2Height uint64) error { totalL1MessagePopped := parentTotalL1MessagePopped for bIndex, block := range rollupData.blockContexts { - // This may happen to nodes started from sanpshot, in which case we will no longer handle L1Msg + // This may happen to nodes started from snapshot, in which case we will no longer handle L1Msg if block.Number <= l2Height { continue } @@ -413,9 +581,6 @@ func (d *Derivation) handleL1Message(rollupData *BatchInfo, parentTotalL1Message totalL1MessagePopped += uint64(block.l1MsgNum) if len(l1Messages) > 0 { for _, l1Message := range l1Messages { - if rollupData.skippedL1MessageBitmap != nil && rollupData.skippedL1MessageBitmap.Bit(int(l1Message.QueueIndex)-int(parentTotalL1MessagePopped)) == 1 { - continue - } transaction := eth.NewTx(&l1Message.L1MessageTx) l1Transactions = append(l1Transactions, transaction) } diff --git a/node/derivation/derivation_test.go b/node/derivation/derivation_test.go index 6d16c0a0c..69eb750d6 100644 --- a/node/derivation/derivation_test.go +++ b/node/derivation/derivation_test.go @@ -11,9 +11,9 @@ import ( ) var ( - errorData = "0x92f65af30000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008e0000000000000000000000000000000000000000000000000000000000000098000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000006a02b8abfcc1aa740eb6330093a5ef9c1d09c39672c390926de6db9089554b620322b8abfcc1aa740eb6330093a5ef9c1d09c39672c390926de6db9089554b6203227ae5ba08d7291c96c8cbddcc148bf48a6d68c7974b94356f53754ef6171d75700000000000000000000000000000000000000000000000000000000000006c00000000000000000000000000000000000000000000000000000000000000059000000000000000127000000000000000000000000000000006a5279896e0503ca805ecdb9208afa1ae78e214ceae183cf59fba3a8788e4598b0cd5e7bf4073160681199a5f107e15ec96c350840ebedb522a79c73615037b9000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004b11400000000000015520000000065e43bfb000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015530000000065e43c02000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015540000000065e43c08000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015550000000065e43c0f000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015560000000065e43c15000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015570000000065e43c1c000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015580000000065e43c22000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015590000000065e43c280000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000155a0000000065e43c2f0000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000155b0000000065e43c350000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000155c0000000065e43c3c0000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000155d0000000065e43c420000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000155e0000000065e43c490000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000155f0000000065e43c4f000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015600000000065e43c56000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015610000000065e43c5c000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015620000000065e43c62000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015630000000065e43c69000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015640000000065e43c6f000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015650000000065e43c7600000000000000000000000000000000000000000000000000000000000000000000000000989680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000001656c61193a9eca0201811fc18e071ee949910f696d7464fb3ed32ce9e9f022967f03962fb34c8533f0d01c13e808f4c000000000000000000000000000000000a066efeb662c0804b6c35a0be989a5fbd6a229261b12a176195772febca89e806e3fa2bebe19f95c7491af5afc7334e000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000001656c61193a9eca0201811fc18e071ee949910f696d7464fb3ed32ce9e9f022967f03962fb34c8533f0d01c13e808f4c000000000000000000000000000000000a066efeb662c0804b6c35a0be989a5fbd6a229261b12a176195772febca89e806e3fa2bebe19f95c7491af5afc7334e" - legacyData = "0xd63b3549000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000260292474b44bd10019728c36f474d43e57f666da244f857f10155d3b1df986d37700ba12e4dbe3733969348ffaf757b9225bdc7a3c48a5119f9a31256bbaa206fd6c0ab4151eda56c3b5b3f680e5100a43957ccb5aed62431468c550838e42f6df00000000000000000000000000000000000000000000000000000000000000f9000000000000008a98000000000000000000000000000001fbabd382d81484e2b0dc54e4d50d5767c312cd80d9c333217cc54d2a7395b06e650146a9e49d91463c241819423fac7ffa814a0a04473cace0e7a00b42da68ecd00a75fef5e27def60bbd05a3d76a3ca335df4d182a33e63c7f6c8e7890fe323f2292474b44bd10019728c36f474d43e57f666da244f857f10155d3b1df986d3776c0ab4151eda56c3b5b3f680e5100a43957ccb5aed62431468c550838e42f6dffed06619f2ec164eedb2121c02eda056059e58b8651d8b73785ab73f8aa3a555ac69de82ab218b900846f782176e21f0fa200cd8d8e8a70f64624e80d45d68a800000000000000000000000000000000000000000000000000000000000000000000000000003e000100000000000776ed00000000672b021600000000000000000000000000000000000000000000000000000000000f42400000000001c9c38003f9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000004e4600000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000675cfc328f9f2e79a51e499b2be44462270572fe000000000000000000000000b096665645994775eeba8aa114752d569734dcb40000000000000000000000003a587733d38e5487d2a7e81d84625f25c99ab3a1000000000000000000000000b6346ded94fc61b637763610d0c59846b77810800000000000000000000000000000000000000000000000000000000000000004000000000000000000000000675cfc328f9f2e79a51e499b2be44462270572fe000000000000000000000000b096665645994775eeba8aa114752d569734dcb40000000000000000000000003a587733d38e5487d2a7e81d84625f25c99ab3a1000000000000000000000000b6346ded94fc61b637763610d0c59846b77810800000000000000000000000000000000000000000000000000000000000000004000000000000000000000000b096665645994775eeba8aa114752d569734dcb40000000000000000000000003a587733d38e5487d2a7e81d84625f25c99ab3a1000000000000000000000000675cfc328f9f2e79a51e499b2be44462270572fe000000000000000000000000b6346ded94fc61b637763610d0c59846b778108000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000002c6d7a4e30d442f8d1acdc5068b604b75d1fc37673a07d51e0e56f3cbe28c36fa177a7d490b0147b89dbcc9e496f7d80000000000000000000000000000000001dddd9c85d12fb203286351cd1def0e5e830194ccc8ca494420adaa75db7613bf4cbe61fb316b8df2ec89eeda2b04e1" - data = "0x4a8d544f000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000260292474b44bd10019728c36f474d43e57f666da244f857f10155d3b1df986d37700ba12e4dbe3733969348ffaf757b9225bdc7a3c48a5119f9a31256bbaa206fd6c0ab4151eda56c3b5b3f680e5100a43957ccb5aed62431468c550838e42f6df00000000000000000000000000000000000000000000000000000000000000f9000000000000008a98000000000000000000000000000001fbabd382d81484e2b0dc54e4d50d5767c312cd80d9c333217cc54d2a7395b06e650146a9e49d91463c241819423fac7ffa814a0a04473cace0e7a00b42da68ecd00a75fef5e27def60bbd05a3d76a3ca335df4d182a33e63c7f6c8e7890fe323f2292474b44bd10019728c36f474d43e57f666da244f857f10155d3b1df986d3776c0ab4151eda56c3b5b3f680e5100a43957ccb5aed62431468c550838e42f6dffed06619f2ec164eedb2121c02eda056059e58b8651d8b73785ab73f8aa3a555ac69de82ab218b900846f782176e21f0fa200cd8d8e8a70f64624e80d45d68a800000000000000000000000000000000000000000000000000000000000000000000000000003e000100000000000776ed00000000672b021600000000000000000000000000000000000000000000000000000000000f42400000000001c9c38003f9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000004e4600000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000675cfc328f9f2e79a51e499b2be44462270572fe000000000000000000000000b096665645994775eeba8aa114752d569734dcb40000000000000000000000003a587733d38e5487d2a7e81d84625f25c99ab3a1000000000000000000000000b6346ded94fc61b637763610d0c59846b77810800000000000000000000000000000000000000000000000000000000000000004000000000000000000000000675cfc328f9f2e79a51e499b2be44462270572fe000000000000000000000000b096665645994775eeba8aa114752d569734dcb40000000000000000000000003a587733d38e5487d2a7e81d84625f25c99ab3a1000000000000000000000000b6346ded94fc61b637763610d0c59846b77810800000000000000000000000000000000000000000000000000000000000000004000000000000000000000000b096665645994775eeba8aa114752d569734dcb40000000000000000000000003a587733d38e5487d2a7e81d84625f25c99ab3a1000000000000000000000000675cfc328f9f2e79a51e499b2be44462270572fe000000000000000000000000b6346ded94fc61b637763610d0c59846b778108000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000002c6d7a4e30d442f8d1acdc5068b604b75d1fc37673a07d51e0e56f3cbe28c36fa177a7d490b0147b89dbcc9e496f7d80000000000000000000000000000000001dddd9c85d12fb203286351cd1def0e5e830194ccc8ca494420adaa75db7613bf4cbe61fb316b8df2ec89eeda2b04e1" + errorData = "0x92f65af30000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008e0000000000000000000000000000000000000000000000000000000000000098000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000018000000000000000000000000000000000000000000000000000000000000006a02b8abfcc1aa740eb6330093a5ef9c1d09c39672c390926de6db9089554b620322b8abfcc1aa740eb6330093a5ef9c1d09c39672c390926de6db9089554b6203227ae5ba08d7291c96c8cbddcc148bf48a6d68c7974b94356f53754ef6171d75700000000000000000000000000000000000000000000000000000000000006c00000000000000000000000000000000000000000000000000000000000000059000000000000000127000000000000000000000000000000006a5279896e0503ca805ecdb9208afa1ae78e214ceae183cf59fba3a8788e4598b0cd5e7bf4073160681199a5f107e15ec96c350840ebedb522a79c73615037b9000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004b11400000000000015520000000065e43bfb000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015530000000065e43c02000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015540000000065e43c08000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015550000000065e43c0f000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015560000000065e43c15000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015570000000065e43c1c000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015580000000065e43c22000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015590000000065e43c280000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000155a0000000065e43c2f0000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000155b0000000065e43c350000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000155c0000000065e43c3c0000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000155d0000000065e43c420000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000155e0000000065e43c490000000000000000000000000000000000000000000000000000000000000000000000000098968000000000000000000000155f0000000065e43c4f000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015600000000065e43c56000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015610000000065e43c5c000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015620000000065e43c62000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015630000000065e43c69000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015640000000065e43c6f000000000000000000000000000000000000000000000000000000000000000000000000009896800000000000000000000015650000000065e43c7600000000000000000000000000000000000000000000000000000000000000000000000000989680000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000001656c61193a9eca0201811fc18e071ee949910f696d7464fb3ed32ce9e9f022967f03962fb34c8533f0d01c13e808f4c000000000000000000000000000000000a066efeb662c0804b6c35a0be989a5fbd6a229261b12a176195772febca89e806e3fa2bebe19f95c7491af5afc7334e000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000001656c61193a9eca0201811fc18e071ee949910f696d7464fb3ed32ce9e9f022967f03962fb34c8533f0d01c13e808f4c000000000000000000000000000000000a066efeb662c0804b6c35a0be989a5fbd6a229261b12a176195772febca89e806e3fa2bebe19f95c7491af5afc7334e" + legacyData = "0xd63b3549000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000260292474b44bd10019728c36f474d43e57f666da244f857f10155d3b1df986d37700ba12e4dbe3733969348ffaf757b9225bdc7a3c48a5119f9a31256bbaa206fd6c0ab4151eda56c3b5b3f680e5100a43957ccb5aed62431468c550838e42f6df00000000000000000000000000000000000000000000000000000000000000f9000000000000008a98000000000000000000000000000001fbabd382d81484e2b0dc54e4d50d5767c312cd80d9c333217cc54d2a7395b06e650146a9e49d91463c241819423fac7ffa814a0a04473cace0e7a00b42da68ecd00a75fef5e27def60bbd05a3d76a3ca335df4d182a33e63c7f6c8e7890fe323f2292474b44bd10019728c36f474d43e57f666da244f857f10155d3b1df986d3776c0ab4151eda56c3b5b3f680e5100a43957ccb5aed62431468c550838e42f6dffed06619f2ec164eedb2121c02eda056059e58b8651d8b73785ab73f8aa3a555ac69de82ab218b900846f782176e21f0fa200cd8d8e8a70f64624e80d45d68a800000000000000000000000000000000000000000000000000000000000000000000000000003e000100000000000776ed00000000672b021600000000000000000000000000000000000000000000000000000000000f42400000000001c9c38003f9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000004e4600000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000675cfc328f9f2e79a51e499b2be44462270572fe000000000000000000000000b096665645994775eeba8aa114752d569734dcb40000000000000000000000003a587733d38e5487d2a7e81d84625f25c99ab3a1000000000000000000000000b6346ded94fc61b637763610d0c59846b77810800000000000000000000000000000000000000000000000000000000000000004000000000000000000000000675cfc328f9f2e79a51e499b2be44462270572fe000000000000000000000000b096665645994775eeba8aa114752d569734dcb40000000000000000000000003a587733d38e5487d2a7e81d84625f25c99ab3a1000000000000000000000000b6346ded94fc61b637763610d0c59846b77810800000000000000000000000000000000000000000000000000000000000000004000000000000000000000000b096665645994775eeba8aa114752d569734dcb40000000000000000000000003a587733d38e5487d2a7e81d84625f25c99ab3a1000000000000000000000000675cfc328f9f2e79a51e499b2be44462270572fe000000000000000000000000b6346ded94fc61b637763610d0c59846b778108000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000002c6d7a4e30d442f8d1acdc5068b604b75d1fc37673a07d51e0e56f3cbe28c36fa177a7d490b0147b89dbcc9e496f7d80000000000000000000000000000000001dddd9c85d12fb203286351cd1def0e5e830194ccc8ca494420adaa75db7613bf4cbe61fb316b8df2ec89eeda2b04e1" + beforeMoveBctxData = "0x4a8d544f000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000002c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000260292474b44bd10019728c36f474d43e57f666da244f857f10155d3b1df986d37700ba12e4dbe3733969348ffaf757b9225bdc7a3c48a5119f9a31256bbaa206fd6c0ab4151eda56c3b5b3f680e5100a43957ccb5aed62431468c550838e42f6df00000000000000000000000000000000000000000000000000000000000000f9000000000000008a98000000000000000000000000000001fbabd382d81484e2b0dc54e4d50d5767c312cd80d9c333217cc54d2a7395b06e650146a9e49d91463c241819423fac7ffa814a0a04473cace0e7a00b42da68ecd00a75fef5e27def60bbd05a3d76a3ca335df4d182a33e63c7f6c8e7890fe323f2292474b44bd10019728c36f474d43e57f666da244f857f10155d3b1df986d3776c0ab4151eda56c3b5b3f680e5100a43957ccb5aed62431468c550838e42f6dffed06619f2ec164eedb2121c02eda056059e58b8651d8b73785ab73f8aa3a555ac69de82ab218b900846f782176e21f0fa200cd8d8e8a70f64624e80d45d68a800000000000000000000000000000000000000000000000000000000000000000000000000003e000100000000000776ed00000000672b021600000000000000000000000000000000000000000000000000000000000f42400000000001c9c38003f9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000032000000000000000000000000000000000000000000000000000000000000002a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000004e4600000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000675cfc328f9f2e79a51e499b2be44462270572fe000000000000000000000000b096665645994775eeba8aa114752d569734dcb40000000000000000000000003a587733d38e5487d2a7e81d84625f25c99ab3a1000000000000000000000000b6346ded94fc61b637763610d0c59846b77810800000000000000000000000000000000000000000000000000000000000000004000000000000000000000000675cfc328f9f2e79a51e499b2be44462270572fe000000000000000000000000b096665645994775eeba8aa114752d569734dcb40000000000000000000000003a587733d38e5487d2a7e81d84625f25c99ab3a1000000000000000000000000b6346ded94fc61b637763610d0c59846b77810800000000000000000000000000000000000000000000000000000000000000004000000000000000000000000b096665645994775eeba8aa114752d569734dcb40000000000000000000000003a587733d38e5487d2a7e81d84625f25c99ab3a1000000000000000000000000675cfc328f9f2e79a51e499b2be44462270572fe000000000000000000000000b6346ded94fc61b637763610d0c59846b778108000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000002c6d7a4e30d442f8d1acdc5068b604b75d1fc37673a07d51e0e56f3cbe28c36fa177a7d490b0147b89dbcc9e496f7d80000000000000000000000000000000001dddd9c85d12fb203286351cd1def0e5e830194ccc8ca494420adaa75db7613bf4cbe61fb316b8df2ec89eeda2b04e1" ) func TestUnPackData(t *testing.T) { @@ -21,9 +21,12 @@ func TestUnPackData(t *testing.T) { 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, + rollupABI: rollupAbi, + legacyRollupABI: legacyRollupAbi, + beforeMoveBlockCtxABI: beforeMoveBlockCtxABI, } errorTxData, err := hexutil.Decode(errorData) require.NoError(t, err) @@ -31,16 +34,10 @@ func TestUnPackData(t *testing.T) { require.Error(t, err) legacyTxData, err := hexutil.Decode(legacyData) require.NoError(t, err) - legacyBatch, err := d.UnPackData(legacyTxData) - require.NoError(t, err) - LegacyBatchInfo := new(BatchInfo) - err = LegacyBatchInfo.ParseBatch(legacyBatch) - require.NoError(t, err) - txData, err := hexutil.Decode(data) + _, err = d.UnPackData(legacyTxData) require.NoError(t, err) - batch, err := d.UnPackData(txData) + beforeMoveBctxTxData, err := hexutil.Decode(beforeMoveBctxData) require.NoError(t, err) - batchInfo := new(BatchInfo) - err = batchInfo.ParseBatch(batch) + _, err = d.UnPackData(beforeMoveBctxTxData) require.NoError(t, err) } diff --git a/node/flags/flags.go b/node/flags/flags.go index 7ea7c21b2..2c00f4a87 100644 --- a/node/flags/flags.go +++ b/node/flags/flags.go @@ -28,6 +28,18 @@ var ( EnvVar: prefixEnvVar("L2_ENGINE_RPC"), } + L2NextEthAddr = cli.StringFlag{ + Name: "l2next.eth", + Usage: "Address of next L2 geth JSON-RPC endpoints to switch to (optional, for upgrades)", + EnvVar: prefixEnvVar("L2_NEXT_ETH_RPC"), + } + + L2NextEngineAddr = cli.StringFlag{ + Name: "l2next.engine", + Usage: "Address of next L2 geth Engine JSON-RPC endpoints to switch to (optional, for upgrades)", + EnvVar: prefixEnvVar("L2_NEXT_ENGINE_RPC"), + } + L2EngineJWTSecret = cli.StringFlag{ Name: "l2.jwt-secret", Usage: "Path to JWT secret key. Keys are 32 bytes, hex encoded in a file. A new key will be generated if left empty.", @@ -220,6 +232,14 @@ var ( EnvVar: prefixEnvVar("DERIVATION_FETCH_BLOCK_RANGE"), } + // BlockTag options + BlockTagSafeConfirmations = cli.Uint64Flag{ + Name: "blocktag.safeConfirmations", + Usage: "Number of L1 blocks to wait before considering a batch as safe", + EnvVar: prefixEnvVar("BLOCKTAG_SAFE_CONFIRMATIONS"), + Value: 10, + } + // Batch rules UpgradeBatchTime = cli.Uint64Flag{ Name: "upgrade.batchTime", @@ -230,10 +250,6 @@ var ( Name: "mainnet", Usage: "Morph mainnet", } - HoleskyFlag = cli.BoolFlag{ - Name: "holesky", - Usage: "Morph Holesky", - } DerivationConfirmations = cli.Int64Flag{ Name: "derivation.confirmations", @@ -294,6 +310,12 @@ var ( Value: 26660, EnvVar: prefixEnvVar("METRICS_PORT"), } + + BlsKeyCheckForkHeight = cli.Uint64Flag{ + Name: "bls-key-check-fork-height", + Usage: "The height at which the BLS key check fork occurs", + EnvVar: prefixEnvVar("BLS_KEY_CHECK_FORK_HEIGHT"), + } ) var Flags = []cli.Flag{ @@ -304,6 +326,8 @@ var Flags = []cli.Flag{ L2EthAddr, L2EngineAddr, L2EngineJWTSecret, + L2NextEthAddr, + L2NextEngineAddr, MaxL1MessageNumPerBlock, L2CrossDomainMessengerContractAddr, L2SequencerAddr, @@ -342,10 +366,12 @@ var Flags = []cli.Flag{ DerivationConfirmations, L1BeaconAddr, + // blocktag options + BlockTagSafeConfirmations, + // batch rules UpgradeBatchTime, MainnetFlag, - HoleskyFlag, // logger LogLevel, @@ -359,4 +385,6 @@ var Flags = []cli.Flag{ MetricsServerEnable, MetricsPort, MetricsHostname, + + BlsKeyCheckForkHeight, } diff --git a/node/go.mod b/node/go.mod index 031fa72e6..d8c7bff2e 100644 --- a/node/go.mod +++ b/node/go.mod @@ -1,38 +1,39 @@ module morph-l2/node -go 1.22 +go 1.24.0 -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.3 require ( github.com/cenkalti/backoff/v4 v4.1.3 github.com/go-kit/kit v0.12.0 github.com/hashicorp/go-multierror v1.1.1 github.com/hashicorp/golang-lru v1.0.2 + github.com/holiman/uint256 v1.2.4 github.com/klauspost/compress v1.17.9 - github.com/morph-l2/go-ethereum v1.10.14-0.20241224100051-1582a364edc0 + github.com/morph-l2/go-ethereum v1.10.14-0.20260211074551-4f0f6e6bd141 github.com/prometheus/client_golang v1.17.0 github.com/spf13/viper v1.13.0 - github.com/stretchr/testify v1.9.0 + github.com/stretchr/testify v1.10.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 - golang.org/x/exp v0.0.0-20230206171751-46f607a40771 + github.com/urfave/cli v1.22.17 + golang.org/x/exp v0.0.0-20230905200255-921286631fa9 gopkg.in/natefinch/lumberjack.v2 v2.2.1 ) require ( github.com/VictoriaMetrics/fastcache v1.12.2 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.7.0 // indirect + github.com/bits-and-blooms/bitset v1.20.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.2.1 // indirect github.com/cespare/xxhash v1.1.0 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.12.1 // indirect + github.com/consensys/bavard v0.1.27 // indirect + github.com/consensys/gnark-crypto v0.16.0 // indirect github.com/cosmos/gogoproto v1.4.1 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect - github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect + github.com/crate-crypto/go-eth-kzg v1.4.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/deckarep/golang-set v1.8.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect @@ -41,11 +42,11 @@ require ( github.com/dgryski/go-farm v0.0.0-20190423205320-6a90982ecee2 // indirect github.com/dustin/go-humanize v1.0.0 // indirect github.com/edsrzf/mmap-go v1.1.0 // indirect - github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4 // indirect + github.com/ethereum/c-kzg-4844/v2 v2.1.5 // indirect + github.com/ethereum/go-ethereum v1.10.26 // indirect github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c // indirect github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 // indirect github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4 // indirect - github.com/fjl/memsize v0.0.2 // indirect github.com/fsnotify/fsnotify v1.6.0 // indirect github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect github.com/go-kit/log v0.2.1 // indirect @@ -64,10 +65,9 @@ require ( github.com/hashicorp/go-bexpr v0.1.13 // indirect github.com/hashicorp/hcl v1.0.0 // indirect github.com/holiman/bloomfilter/v2 v2.0.3 // indirect - github.com/holiman/uint256 v1.2.4 // indirect github.com/huin/goupnp v1.3.0 // indirect github.com/iden3/go-iden3-crypto v0.0.16 // indirect - github.com/inconshreveable/mousetrap v1.0.0 // indirect + github.com/inconshreveable/mousetrap v1.1.0 // indirect github.com/jackpal/go-nat-pmp v1.0.2 // indirect github.com/jmhodges/levigo v1.0.0 // indirect github.com/lib/pq v1.10.7 // indirect @@ -75,7 +75,7 @@ require ( github.com/magiconair/properties v1.8.6 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect github.com/minio/highwayhash v1.0.2 // indirect @@ -93,7 +93,7 @@ require ( github.com/prometheus/procfs v0.12.0 // indirect github.com/prometheus/tsdb v0.10.0 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect - github.com/rivo/uniseg v0.4.3 // indirect + github.com/rivo/uniseg v0.4.7 // indirect github.com/rjeczalik/notify v0.9.3 // indirect github.com/rs/cors v1.11.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect @@ -102,12 +102,12 @@ require ( github.com/shirou/gopsutil v3.21.11+incompatible // indirect github.com/spf13/afero v1.10.0 // indirect github.com/spf13/cast v1.5.0 // indirect - github.com/spf13/cobra v1.5.0 // indirect + github.com/spf13/cobra v1.8.1 // indirect github.com/spf13/jwalterweatherman v1.1.0 // indirect github.com/spf13/pflag v1.0.5 // indirect github.com/status-im/keycard-go v0.3.2 // indirect github.com/subosito/gotenv v1.4.1 // indirect - github.com/supranational/blst v0.3.11 // indirect + github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe // indirect github.com/tecbot/gorocksdb v0.0.0-20191217155057-f0fad39f321c // indirect github.com/tendermint/tm-db v0.6.6 // indirect github.com/tklauser/go-sysconf v0.3.13 // indirect @@ -115,11 +115,11 @@ require ( github.com/tyler-smith/go-bip39 v1.1.0 // indirect github.com/yusufpapurcu/wmi v1.2.3 // indirect go.etcd.io/bbolt v1.3.9 // indirect - golang.org/x/crypto v0.23.0 // indirect + golang.org/x/crypto v0.35.0 // indirect golang.org/x/net v0.25.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect + golang.org/x/sync v0.11.0 // indirect + golang.org/x/sys v0.30.0 // indirect + golang.org/x/text v0.22.0 // indirect golang.org/x/time v0.5.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 // indirect google.golang.org/grpc v1.62.1 // indirect diff --git a/node/go.sum b/node/go.sum index 868e83176..dda7b959d 100644 --- a/node/go.sum +++ b/node/go.sum @@ -39,7 +39,7 @@ dmitri.shuralyov.com/gpu/mtl v0.0.0-20190408044501-666a987793e9/go.mod h1:H6x//7 github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1 h1:UQHMgLO+TxOElx5B5HZ4hJQsoJ/PvUvKRhJHDQXO8P8= github.com/Azure/go-ansiterm v0.0.0-20210617225240-d185dfc1b5a1/go.mod h1:xomTg63KZ2rFqZQzSB4Vz2SUXa1BpHTVz9L5PTmPC4E= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/BurntSushi/xgb v0.0.0-20160522181843-27f122750802/go.mod h1:IVnqGOEym/WlBOVXweHU+Q+/VP0lqqI8lqeDx9IjBqo= github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d h1:nalkkPQcITbvhmL4+C4cKA87NW0tfm3Kl9VXRoPywFg= github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d/go.mod h1:URdX5+vg25ts3aCh8H5IFZybJYKWhJHYMTnf+ULtoC4= @@ -66,8 +66,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo= -github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bits-and-blooms/bitset v1.20.0 h1:2F+rfL86jE2d/bmw7OhqUg2Sj/1rURkBn3MdfoPyRVU= +github.com/bits-and-blooms/bitset v1.20.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/btcsuite/btcd/btcec/v2 v2.2.1 h1:xP60mv8fvp+0khmrN0zTdPC3cNm24rfeE6lh2R/Yv3E= github.com/btcsuite/btcd/btcec/v2 v2.2.1/go.mod h1:9/CSmJxmuvqzX9Wh2fXMWToLOHhPd11lSPuIupwTkI8= github.com/btcsuite/btcd/btcutil v1.1.2 h1:XLMbX8JQEiwMcYft2EGi8zPUkoa0abKIU6/BJSRsjzQ= @@ -97,10 +97,10 @@ github.com/cncf/udpa/go v0.0.0-20210930031921-04548b0d99d4/go.mod h1:6pvJx4me5XP github.com/cncf/xds/go v0.0.0-20210805033703-aa0b78936158/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20210922020428-25de7278fc84/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= github.com/cncf/xds/go v0.0.0-20211011173535-cb28da3451f1/go.mod h1:eXthEFrGJvWHgFFCl3hGmgk+/aYT6PnTQLykKQRLhEs= -github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= -github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= -github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/consensys/bavard v0.1.27 h1:j6hKUrGAy/H+gpNrpLU3I26n1yc+VMGmd6ID5+gAhOs= +github.com/consensys/bavard v0.1.27/go.mod h1:k/zVjHHC4B+PQy1Pg7fgvG3ALicQw540Crag8qx+dZs= +github.com/consensys/gnark-crypto v0.16.0 h1:8Dl4eYmUWK9WmlP1Bj6je688gBRJCJbT8Mw4KoTAawo= +github.com/consensys/gnark-crypto v0.16.0/go.mod h1:Ke3j06ndtPTVvo++PhGNgvm+lgpLvzbcE2MqljY7diU= github.com/containerd/continuity v0.4.3 h1:6HVkalIp+2u1ZLH1J/pYX2oBVXlJZvh1X1A7bEZ9Su8= github.com/containerd/continuity v0.4.3/go.mod h1:F6PTNCKepoxEaXLQp3wDAjygEnImnZ/7o4JzpodfroQ= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= @@ -111,11 +111,11 @@ github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXy github.com/cosmos/gogoproto v1.4.1 h1:WoyH+0/jbCTzpKNvyav5FL1ZTWsp1im1MxEpJEzKUB8= github.com/cosmos/gogoproto v1.4.1/go.mod h1:Ac9lzL4vFpBMcptJROQ6dQ4M3pOEK5Z/l0Q9p+LoCr4= github.com/cpuguy83/go-md2man v1.0.10/go.mod h1:SmD6nW6nTyfqj6ABTjUi3V3JVMnlJmwcJI5acqYI6dE= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= -github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/cpuguy83/go-md2man/v2 v2.0.4/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= +github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo= +github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/crate-crypto/go-eth-kzg v1.4.0 h1:WzDGjHk4gFg6YzV0rJOAsTK4z3Qkz5jd4RE3DAvPFkg= +github.com/crate-crypto/go-eth-kzg v1.4.0/go.mod h1:J9/u5sWfznSObptgfa92Jq8rTswn6ahQWEuiLHOjCUI= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -149,16 +149,16 @@ github.com/envoyproxy/go-control-plane v0.9.7/go.mod h1:cwu0lG7PUMfa9snN8LXBig5y github.com/envoyproxy/go-control-plane v0.9.9-0.20201210154907-fd9021fe5dad/go.mod h1:cXg6YxExXjJnVBQHBLXeUAgxn2UodCpnH306RInaBQk= github.com/envoyproxy/go-control-plane v0.9.10-0.20210907150352-cf90f659a021/go.mod h1:AFq3mo9L8Lqqiid3OhADV3RfLJnjiw63cSpi+fDTRC0= github.com/envoyproxy/protoc-gen-validate v0.1.0/go.mod h1:iSmxcyjqTsJpI2R4NaDN7+kN2VEUnK/pcBlmesArF7c= -github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4 h1:B2mpK+MNqgPqk2/KNi1LbqwtZDy5F7iy0mynQiBr8VA= -github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4/go.mod h1:y4GA2JbAUama1S4QwYjC2hefgGLU8Ul0GMtL/ADMF1c= +github.com/ethereum/c-kzg-4844/v2 v2.1.5 h1:aVtoLK5xwJ6c5RiqO8g8ptJ5KU+2Hdquf6G3aXiHh5s= +github.com/ethereum/c-kzg-4844/v2 v2.1.5/go.mod h1:u59hRTTah4Co6i9fDWtiCjTrblJv0UwsqZKCc0GfgUs= +github.com/ethereum/go-ethereum v1.10.26 h1:i/7d9RBBwiXCEuyduBQzJw/mKmnvzsN14jqBmytw72s= +github.com/ethereum/go-ethereum v1.10.26/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c h1:8ISkoahWXwZR41ois5lSJBSVw4D0OV19Ht/JSTzvSv0= github.com/facebookgo/ensure v0.0.0-20200202191622-63f1cf65ac4c/go.mod h1:Yg+htXGokKKdzcwhuNDwVvN+uBxDGXJ7G/VN1d8fa64= github.com/facebookgo/stack v0.0.0-20160209184415-751773369052 h1:JWuenKqqX8nojtoVVWjGfOF9635RETekkoH6Cc9SX0A= github.com/facebookgo/stack v0.0.0-20160209184415-751773369052/go.mod h1:UbMTZqLaRiH3MsBH8va0n7s1pQYcu3uTb8G4tygF4Zg= github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4 h1:7HZCaLC5+BZpmbhCOZJ293Lz68O7PYrF2EzeiFMwCLk= github.com/facebookgo/subset v0.0.0-20200203212716-c811ad88dec4/go.mod h1:5tD+neXqOorC30/tWg0LCSkrqj/AR6gu8yY8/fpw1q0= -github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= -github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/frankban/quicktest v1.14.3 h1:FJKSZTDHjyhriyC81FLQ0LY93eSai0ZyR/ZIkd3ZUKE= @@ -298,8 +298,9 @@ github.com/ianlancetaylor/demangle v0.0.0-20181102032728-5e5cf60278f6/go.mod h1: github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= github.com/iden3/go-iden3-crypto v0.0.16 h1:zN867xiz6HgErXVIV/6WyteGcOukE9gybYTorBMEdsk= github.com/iden3/go-iden3-crypto v0.0.16/go.mod h1:dLpM4vEPJ3nDHzhWFXDjzkn1qHoBeOT/3UEhXsEsP3E= -github.com/inconshreveable/mousetrap v1.0.0 h1:Z8tu5sraLXCXIcARxBp/8cbvlwVa7Z1NHg9XEKhtSvM= github.com/inconshreveable/mousetrap v1.0.0/go.mod h1:PxqpIevigyE2G7u3NXJIT2ANytuPF1OarO4DADm73n8= +github.com/inconshreveable/mousetrap v1.1.0 h1:wN+x4NVGpMsO7ErUn/mUI3vEoE6Jt13X2s0bqwp9tc8= +github.com/inconshreveable/mousetrap v1.1.0/go.mod h1:vpF70FUmC8bwa3OWnCshd2FqLfsEA9PFc4w1p2J65bw= github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= github.com/jmhodges/levigo v1.0.0 h1:q5EC36kV79HWeTBWsod3mG11EgStG3qArTKcvlksN1U= @@ -323,8 +324,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/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= -github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/leanovate/gopter v0.2.11 h1:vRjThO1EKPb/1NsDXuDrzldR28RLkBflWYcU9CvzWu4= +github.com/leanovate/gopter v0.2.11/go.mod h1:aK3tzZP/C+p1m3SPRE4SYZFGP7jjkuSI4f7Xvpt0S9c= github.com/lib/pq v1.10.7 h1:p7ZhMD+KsSRozJr34udlUrhboJwWAgCg34+/ZZNvZZw= github.com/lib/pq v1.10.7/go.mod h1:AlVN5x4E4T544tWzH6hKfbfQvm3HdbOxrmggDNAPY9o= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= @@ -338,8 +339,8 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= -github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= @@ -360,10 +361,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.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/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.20260211074551-4f0f6e6bd141 h1:A8eygErKU6WKMipGWIemzwLeYkIGLd9yb/Ry3x+J9PQ= +github.com/morph-l2/go-ethereum v1.10.14-0.20260211074551-4f0f6e6bd141/go.mod h1:nkVzHjQWCOjvukQW8ittlwX+Xz9gmVHrP7mUi7zoHTs= +github.com/morph-l2/tendermint v0.3.3 h1:zsmzVJfKp+NuCr45ZUUY2ZJjnHAVLzwJLID6GxBR4i4= +github.com/morph-l2/tendermint v0.3.3/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= @@ -428,8 +429,8 @@ github.com/prometheus/tsdb v0.10.0/go.mod h1:oi49uRhEe9dPUTlS3JRZOwJuVi6tmh10QSg github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= -github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rjeczalik/notify v0.9.3 h1:6rJAzHTGKXGj76sbRgDiDcYj/HniypXmSJo1SWakZeY= github.com/rjeczalik/notify v0.9.3/go.mod h1:gF3zSOrafR9DQEWSE8TjfI9NkooDxbyT4UgRGKZA0lc= github.com/rogpeppe/fastuuid v1.2.0/go.mod h1:jVj6XXZzXRy/MSR5jhDC/2q6DgLz+nrA6LYCDYWNEvQ= @@ -460,8 +461,8 @@ github.com/spf13/cast v1.3.0/go.mod h1:Qx5cxh0v+4UWYiBimWS+eyWzqEqokIECu5etghLkU github.com/spf13/cast v1.5.0 h1:rj3WzYc11XZaIZMPKmwP96zkFEnnAmV8s6XbB2aY32w= github.com/spf13/cast v1.5.0/go.mod h1:SpXXQ5YoyJw6s3/6cMTQuxvgRl3PCJiyaX9p6b155UU= github.com/spf13/cobra v0.0.5/go.mod h1:3K3wKZymM7VvHMDS9+Akkh4K60UwM26emMESw8tLCHU= -github.com/spf13/cobra v1.5.0 h1:X+jTBEBqF0bHN+9cSMgmfuvv2VHJ9ezmFNf9Y/XstYU= -github.com/spf13/cobra v1.5.0/go.mod h1:dWXEIy2H428czQCjInthrTRUg7yKbok+2Qi/yBIJoUM= +github.com/spf13/cobra v1.8.1 h1:e5/vxKd/rZsfSJMUX1agtjeTDf+qv1/JdBF8gg5k9ZM= +github.com/spf13/cobra v1.8.1/go.mod h1:wHxEcudfqmLYa8iTfL+OuZPbBZkmvliBWKIezN3kD9Y= github.com/spf13/jwalterweatherman v1.0.0/go.mod h1:cQK4TGJAtQXfYWX+Ddv3mKDzgVb68N+wFjFa4jdeBTo= github.com/spf13/jwalterweatherman v1.1.0 h1:ue6voC5bR5F8YxI5S67j9i582FU4Qvo2bmqnqMYADFk= github.com/spf13/jwalterweatherman v1.1.0/go.mod h1:aNWZUN0dPAAO/Ljvb5BEdw96iTZ0EXowPYD95IqWIGo= @@ -488,12 +489,12 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/subosito/gotenv v1.4.1 h1:jyEFiXpy21Wm81FBN71l9VoMMV8H8jG+qIK3GCpY6Qs= github.com/subosito/gotenv v1.4.1/go.mod h1:ayKnFf/c6rvx/2iiLrJUk1e6plDbT3edrFNGqEflhK0= -github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= -github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe h1:nbdqkIGOGfUAD54q1s2YBcBz/WcsxCO9HUQ4aGV5hUw= +github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20200815110645-5c35d600f0ca/go.mod h1:u2MKkTVTVJWe5D1rCvame8WqhBd88EuIwODJZ1VHCPM= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= @@ -508,8 +509,8 @@ github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDgu github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= github.com/ugorji/go/codec v0.0.0-20181204163529-d75b2dcb6bc8/go.mod h1:VFNgLljTbGfSG7qAOspJ7OScBnGdDN/yBr0sguwnwf0= -github.com/urfave/cli v1.22.14 h1:ebbhrRiGK2i4naQJr+1Xj92HXZCrK7MsyTS/ob3HnAk= -github.com/urfave/cli v1.22.14/go.mod h1:X0eDS6pD6Exaclxm99NJ3FiCDRED7vIHpx2mDOHLvkA= +github.com/urfave/cli v1.22.17 h1:SYzXoiPfQjHBbkYxbew5prZHS1TOLT3ierW8SYLqtVQ= +github.com/urfave/cli v1.22.17/go.mod h1:b0ht0aqgH/6pBYzzxURyrM4xXNgsoT/n2ZzwQiEhNVo= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -536,8 +537,8 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210421170649-83a5a9bb288b/go.mod h1:T9bdIzuCu7OtxOm1hfPfRQxPLYneinmdGuTeoZ9dtd4= golang.org/x/crypto v0.0.0-20220722155217-630584e8d5aa/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs= +golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8= @@ -548,8 +549,8 @@ golang.org/x/exp v0.0.0-20191227195350-da58074b4299/go.mod h1:2RIsYlXP63K8oxa1u0 golang.org/x/exp v0.0.0-20200119233911-0405dc783f0a/go.mod h1:2RIsYlXP63K8oxa1u096TMicItID8zy7Y6sNkU49FU4= golang.org/x/exp v0.0.0-20200207192155-f17229e696bd/go.mod h1:J/WKrq2StrnmMY6+EHIKF9dgMWnmCNThgcyBT1FY9mM= golang.org/x/exp v0.0.0-20200224162631-6cc2880d07d6/go.mod h1:3jZMyOhIsHpP37uCMkUooju7aAi5cS1Q23tOzKc+0MU= -golang.org/x/exp v0.0.0-20230206171751-46f607a40771 h1:xP7rWLUr1e1n2xkK5YB4LI0hPEy3LJC6Wk+D4pGlOJg= -golang.org/x/exp v0.0.0-20230206171751-46f607a40771/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9 h1:GoHiUyI/Tp2nVkLI2mCxVkOjsbSXD66ic0XW0js0R9g= +golang.org/x/exp v0.0.0-20230905200255-921286631fa9/go.mod h1:S2oDrQGGwySpoQPVqRShND87VCbxmc6bL1Yd2oYrm6k= golang.org/x/image v0.0.0-20190227222117-0694c2d4d067/go.mod h1:kZ7UVZpmo3dzQBMxlp+ypCbDeSB+sBbTgSJuh5dn5js= golang.org/x/image v0.0.0-20190802002840-cff245a6509b/go.mod h1:FeLwcggjj3mMvU+oOTbSwawSJRM1uh48EjtB4UJZlP0= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= @@ -573,8 +574,8 @@ golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.4.1/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= -golang.org/x/mod v0.14.0 h1:dGoOF9QVLYng8IHTm7BAyWqCqSheQ5pYWGhzW00YJr0= -golang.org/x/mod v0.14.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= +golang.org/x/mod v0.17.0 h1:zY54UmvipHiNd+pm+m0x9KhZ9hl1/7QNMyxXbc6ICqA= +golang.org/x/mod v0.17.0/go.mod h1:hTbmBsO62+eylJbnUtE2MGJUyE7QWk4xUqPFrRgJ+7c= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180826012351-8a410e7b638d/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -636,8 +637,8 @@ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -696,8 +697,8 @@ golang.org/x/sys v0.0.0-20220908164124-27713097b956/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -708,8 +709,8 @@ golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= golang.org/x/time v0.0.0-20191024005414-555d28b269f0/go.mod h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ= @@ -765,8 +766,8 @@ golang.org/x/tools v0.0.0-20210105154028-b0ab187a4818/go.mod h1:emZCQorbCU4vsT4f golang.org/x/tools v0.0.0-20210106214847-113979e3529a/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.0.0-20210108195828-e2f9c7f1fc8e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= golang.org/x/tools v0.1.0/go.mod h1:xkSsbof2nBLbhDlRMhhhyNLN/zl3eTqcnHD5viDpcZ0= -golang.org/x/tools v0.15.0 h1:zdAyfUGbYmuVokhzVmghFl2ZJh5QhcfebBgmVPFYA+8= -golang.org/x/tools v0.15.0/go.mod h1:hpksKq4dtpQWS1uQ61JkdqWM3LscIS6Slf+VVkm+wQk= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d h1:vU5i/LfpvrRCpgM/VPfJLg5KjxD3E+hfT1SH+d9zLwg= +golang.org/x/tools v0.21.1-0.20240508182429-e35e4ccd0d2d/go.mod h1:aiJjzUbINMkxbQROHiO6hDPo2LHcIPhhQsa9DLh0yGk= golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= diff --git a/node/types/batch.go b/node/types/batch.go index 12b95cd96..c9746dfc7 100644 --- a/node/types/batch.go +++ b/node/types/batch.go @@ -8,7 +8,6 @@ import ( "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" ) @@ -17,86 +16,15 @@ var ( 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\"}]", } -) - -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") - } - 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 @@ -121,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 @@ -160,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) { @@ -177,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 000000000..d8832a7e8 --- /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 25dc43e36..97a3393e8 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 a6b86e26a..d4aea96fb 100644 --- a/node/types/blob.go +++ b/node/types/blob.go @@ -52,7 +52,7 @@ func RetrieveBlobBytes(blob *kzg4844.Blob) ([]byte, error) { return data, nil } -func makeBCP(bz []byte) (b kzg4844.Blob, c kzg4844.Commitment, p kzg4844.Proof, err error) { +func makeBlobCommitment(bz []byte) (b kzg4844.Blob, c kzg4844.Commitment, err error) { blob, err := MakeBlobCanonical(bz) if err != nil { return @@ -62,10 +62,6 @@ func makeBCP(bz []byte) (b kzg4844.Blob, c kzg4844.Commitment, p kzg4844.Proof, if err != nil { return } - p, err = kzg4844.ComputeBlobProof(&b, c) - if err != nil { - return - } return } @@ -85,20 +81,19 @@ func MakeBlobTxSidecar(blobBytes []byte) (*eth.BlobTxSidecar, error) { err error blobs = make([]kzg4844.Blob, blobCount) commitments = make([]kzg4844.Commitment, blobCount) - proofs = make([]kzg4844.Proof, blobCount) ) switch blobCount { case 1: - blobs[0], commitments[0], proofs[0], err = makeBCP(blobBytes) + blobs[0], commitments[0], err = makeBlobCommitment(blobBytes) if err != nil { return nil, err } case 2: - blobs[0], commitments[0], proofs[0], err = makeBCP(blobBytes[:MaxBlobBytesSize]) + blobs[0], commitments[0], err = makeBlobCommitment(blobBytes[:MaxBlobBytesSize]) if err != nil { return nil, err } - blobs[1], commitments[1], proofs[1], err = makeBCP(blobBytes[MaxBlobBytesSize:]) + blobs[1], commitments[1], err = makeBlobCommitment(blobBytes[MaxBlobBytesSize:]) if err != nil { return nil, err } @@ -106,79 +101,22 @@ func MakeBlobTxSidecar(blobBytes []byte) (*eth.BlobTxSidecar, error) { return ð.BlobTxSidecar{ Blobs: blobs, Commitments: commitments, - Proofs: proofs, }, nil } -func EncodeTxsPayloadToBlob(batchBytes []byte) (*eth.BlobTxSidecar, error) { +func CompressBatchBytes(batchBytes []byte) ([]byte, error) { if len(batchBytes) == 0 { - return MakeBlobTxSidecar(batchBytes) + return nil, nil } compressedBatchBytes, err := zstd.CompressBatchBytes(batchBytes) if err != nil { - return nil, err - } - return MakeBlobTxSidecar(compressedBatchBytes) -} - -// Deprecated: DecodeTxsFromBlob is recommended -func DecodeLegacyTxsFromBlob(b *kzg4844.Blob) (eth.Transactions, error) { - data, err := RetrieveBlobBytes(b) - if err != nil { - return nil, err - } - - // metadata || tx_payload - // metadata consists of num_chunks (2 bytes) and chunki_size (4 bytes per chunk) - dataReader := bytes.NewReader(data[2:]) - var txPayloadSize uint32 - for i := 0; i < 15; i++ { - var size uint32 - if err := binary.Read(dataReader, binary.BigEndian, size); err != nil { - return nil, err - } - txPayloadSize += size - } - txPayload := data[62 : 62+txPayloadSize] - - var byteOccupied int - var sizeBytes []byte - b3 := byte(txPayloadSize >> 16) - b2 := byte(txPayloadSize >> 8) - b1 := byte(txPayloadSize) - if b3 > 0 { - byteOccupied = 3 - sizeBytes = []byte{b3, b2, b1} - } else if b2 > 0 { - byteOccupied = 2 - sizeBytes = []byte{b2, b1} - } else { - byteOccupied = 1 - sizeBytes = []byte{b1} - } - - fistByte := byte(247 + byteOccupied) - simulatedRLP := append(append([]byte{fistByte}, sizeBytes...), txPayload...) - decoded := make([]*eth.Transaction, 0) - if err := rlp.DecodeBytes(simulatedRLP, &decoded); err != nil { - return nil, err + return nil, fmt.Errorf("failed to compress batch bytes, err: %w", err) } - return decoded, nil + return compressedBatchBytes, nil } -func DecodeTxsFromBlob(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) +func DecodeTxsFromBytes(txsBytes []byte) (eth.Transactions, error) { + reader := bytes.NewReader(txsBytes) txs := make(eth.Transactions, 0) for { var ( @@ -210,6 +148,16 @@ func DecodeTxsFromBlob(blob *kzg4844.Blob) (eth.Transactions, error) { return nil, err } innerTx = new(eth.DynamicFeeTx) + case eth.SetCodeTxType: + if err := binary.Read(reader, binary.BigEndian, &firstByte); err != nil { + return nil, err + } + innerTx = new(eth.SetCodeTx) + case eth.AltFeeTxType: + if err := binary.Read(reader, binary.BigEndian, &firstByte); err != nil { + return nil, err + } + innerTx = new(eth.AltFeeTx) default: if firstByte <= 0xf7 { // legacy tx first byte must be greater than 0xf7(247) return nil, fmt.Errorf("not supported tx type: %d", firstByte) @@ -238,15 +186,6 @@ func DecodeTxsFromBlob(blob *kzg4844.Blob) (eth.Transactions, error) { return txs, nil } -func isEmptyBlob(blob *kzg4844.Blob) bool { - for _, b := range blob { - if b != 0 { - return false - } - } - return true -} - func extractInnerTxFullBytes(firstByte byte, reader io.Reader) ([]byte, error) { //the occupied byte length for storing the size of the following rlp encoded bytes sizeByteLen := firstByte - 0xf7 diff --git a/node/types/blob_test.go b/node/types/blob_test.go index 11f72476c..94c08318f 100644 --- a/node/types/blob_test.go +++ b/node/types/blob_test.go @@ -2,9 +2,9 @@ package types import ( "math/big" - "morph-l2/node/zstd" "testing" + "github.com/holiman/uint256" "github.com/morph-l2/go-ethereum/accounts/abi/bind" "github.com/morph-l2/go-ethereum/common" eth "github.com/morph-l2/go-ethereum/core/types" @@ -97,7 +97,31 @@ func generateContractTx(isLegacy bool) (*eth.Transaction, error) { return auth.Signer(address, contractTx) } -func TestDecodeTxsFromBlob(t *testing.T) { +func generateSetCodeTx() *eth.Transaction { + privKey, _ := crypto.GenerateKey() + address := crypto.PubkeyToAddress(privKey.PublicKey) + to := common.BigToAddress(big.NewInt(100)) + data := rand.Bytes(100) + inner := ð.SetCodeTx{ + ChainID: uint256.NewInt(2810), + Nonce: 1, + GasFeeCap: uint256.NewInt(1e10), + GasTipCap: uint256.NewInt(1e8), + Gas: 500000, + To: to, + Value: uint256.NewInt(1), + Data: data, + AccessList: []eth.AccessTuple{{ + Address: address, + StorageKeys: []common.Hash{common.BigToHash(big.NewInt(2))}, + }}, + AuthList: []eth.SetCodeAuthorization{}, + } + return eth.NewTx(inner) + +} + +func TestDecodeTxsFromBytes(t *testing.T) { transferTx, err := generateTransferTx(false) require.NoError(t, err) transferTxBz, err := transferTx.MarshalBinary() @@ -113,16 +137,17 @@ func TestDecodeTxsFromBlob(t *testing.T) { contractTxBz, err := contractTx.MarshalBinary() require.NoError(t, err) - cks := BatchData{ - txsPayload: append(append(transferTxBz, legacyContractTxBz...), contractTxBz...), - } - compressedBlobBytes, err := zstd.CompressBatchBytes(cks.TxsPayload()) + setCodeTx := generateSetCodeTx() require.NoError(t, err) - b, err := MakeBlobCanonical(compressedBlobBytes) + setCodeTxBz, err := setCodeTx.MarshalBinary() require.NoError(t, err) - txs, err := DecodeTxsFromBlob(b) + + cks := BatchData{ + txsPayload: append(append(append(transferTxBz, legacyContractTxBz...), contractTxBz...), setCodeTxBz...), + } + txs, err := DecodeTxsFromBytes(cks.TxsPayload()) require.NoError(t, err) - require.EqualValues(t, 3, txs.Len()) + require.EqualValues(t, 4, txs.Len()) require.EqualValues(t, transferTx.Hash(), txs[0].Hash()) require.EqualValues(t, legacyContractTx.Hash(), txs[1].Hash()) require.EqualValues(t, contractTx.Hash(), txs[2].Hash()) diff --git a/node/types/consensus_message.go b/node/types/consensus_message.go index 1fdbe491d..94742380b 100644 --- a/node/types/consensus_message.go +++ b/node/types/consensus_message.go @@ -3,6 +3,7 @@ package types import ( "bytes" "encoding/binary" + "fmt" "math/big" "github.com/morph-l2/go-ethereum/common" @@ -145,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/retryable_client.go b/node/types/retryable_client.go index cf874ab81..899c3be12 100644 --- a/node/types/retryable_client.go +++ b/node/types/retryable_client.go @@ -2,7 +2,12 @@ package types import ( "context" + "encoding/json" + "fmt" "math/big" + "strings" + "sync/atomic" + "time" "github.com/cenkalti/backoff/v4" "github.com/morph-l2/go-ethereum" @@ -11,41 +16,288 @@ import ( "github.com/morph-l2/go-ethereum/eth/catalyst" "github.com/morph-l2/go-ethereum/ethclient" "github.com/morph-l2/go-ethereum/ethclient/authclient" + "github.com/morph-l2/go-ethereum/rpc" tmlog "github.com/tendermint/tendermint/libs/log" ) 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" + + // Geth connection retry settings + GethRetryAttempts = 60 // max retry attempts + GethRetryInterval = 5 * time.Second // interval between retries ) +// configResponse represents the eth_config RPC response (EIP-7910) +type configResponse struct { + Current *forkConfig `json:"current"` + Next *forkConfig `json:"next"` + Last *forkConfig `json:"last"` +} + +// forkConfig represents a single fork configuration +type forkConfig struct { + ActivationTime uint64 `json:"activationTime"` + ChainId string `json:"chainId"` + ForkId string `json:"forkId"` + Precompiles map[string]string `json:"precompiles"` + SystemContracts map[string]string `json:"systemContracts"` + Morph *morphExtension `json:"morph,omitempty"` +} + +// morphExtension contains Morph-specific configuration fields +type morphExtension struct { + UseZktrie bool `json:"useZktrie"` + MPTForkTime *uint64 `json:"mptForkTime,omitempty"` +} + +// GethConfig holds the configuration fetched from geth via eth_config API +type GethConfig struct { + SwitchTime uint64 + UseZktrie bool +} + +// FetchGethConfigWithRetry fetches geth config with retry, waiting for geth to be ready. +func FetchGethConfigWithRetry(rpcURL string, logger tmlog.Logger) (*GethConfig, error) { + var lastErr error + for i := 0; i < GethRetryAttempts; i++ { + config, err := FetchGethConfig(rpcURL, logger) + if err == nil { + return config, nil + } + lastErr = err + logger.Info("Waiting for geth to be ready...", "attempt", i+1, "error", err) + time.Sleep(GethRetryInterval) + } + return nil, fmt.Errorf("geth not ready after %d attempts: %w", GethRetryAttempts, lastErr) +} + +// FetchGethConfig fetches the geth configuration via eth_config API +func FetchGethConfig(rpcURL string, logger tmlog.Logger) (*GethConfig, error) { + client, err := rpc.Dial(rpcURL) + if err != nil { + return nil, fmt.Errorf("failed to connect to geth: %w", err) + } + defer client.Close() + + var result json.RawMessage + if err := client.Call(&result, "eth_config"); err != nil { + return nil, fmt.Errorf("eth_config call failed: %w", err) + } + + var resp configResponse + if err := json.Unmarshal(result, &resp); err != nil { + return nil, fmt.Errorf("failed to parse eth_config response: %w", err) + } + + config := &GethConfig{} + + // Get useZktrie from current config + if resp.Current != nil && resp.Current.Morph != nil { + config.UseZktrie = resp.Current.Morph.UseZktrie + logger.Info("Fetched useZktrie from geth", "useZktrie", config.UseZktrie) + } + + // Try to get mptForkTime from current config + if resp.Current != nil && resp.Current.Morph != nil && resp.Current.Morph.MPTForkTime != nil { + config.SwitchTime = *resp.Current.Morph.MPTForkTime + logger.Info("Fetched MPT fork time from geth", "mptForkTime", config.SwitchTime, "source", "current") + return config, nil + } + + // Fallback to next config + if resp.Next != nil && resp.Next.Morph != nil && resp.Next.Morph.MPTForkTime != nil { + config.SwitchTime = *resp.Next.Morph.MPTForkTime + logger.Info("Fetched MPT fork time from geth", "mptForkTime", config.SwitchTime, "source", "next") + return config, nil + } + + // Fallback to last config + if resp.Last != nil && resp.Last.Morph != nil && resp.Last.Morph.MPTForkTime != nil { + config.SwitchTime = *resp.Last.Morph.MPTForkTime + logger.Info("Fetched MPT fork time from geth", "mptForkTime", config.SwitchTime, "source", "last") + return config, nil + } + + logger.Info("MPT fork time not configured in geth, switch disabled") + return config, nil +} + type RetryableClient struct { - authClient *authclient.Client - ethClient *ethclient.Client - b backoff.BackOff - logger tmlog.Logger + authClient *authclient.Client // current geth + ethClient *ethclient.Client // current geth + nextAuthClient *authclient.Client // next geth (for upgrade switch) + nextEthClient *ethclient.Client // next geth (for upgrade switch) + switchTime uint64 // timestamp to switch to next geth + switched atomic.Bool // whether switched to next geth + b backoff.BackOff + logger tmlog.Logger +} + +// MPTForkTime returns the configured MPT fork/switch timestamp fetched from geth (eth_config). +// Note: this is a local value stored in the client; it does not perform any RPC. +func (rc *RetryableClient) MPTForkTime() uint64 { + return rc.switchTime } -// NewRetryableClient make the client retryable -// Will retry calling the api, if the connection is refused -func NewRetryableClient(authClient *authclient.Client, ethClient *ethclient.Client, logger tmlog.Logger) *RetryableClient { +// NewRetryableClient creates a new retryable client with the given switch time. +// Will retry calling the api, if the connection is refused. +// +// If nextAuthClient or nextEthClient is nil, switch is disabled and only current client is used. +// This is useful for nodes that don't need to switch geth (most nodes). +// +// The switchTime should be fetched via FetchGethConfig before calling this function. +func NewRetryableClient(authClient *authclient.Client, ethClient *ethclient.Client, nextAuthClient *authclient.Client, nextEthClient *ethclient.Client, switchTime uint64, logger tmlog.Logger) *RetryableClient { logger = logger.With("module", "retryClient") - return &RetryableClient{ - authClient: authClient, - ethClient: ethClient, - b: backoff.NewExponentialBackOff(), - logger: logger, + + // If next client is not configured, disable switch + if nextAuthClient == nil || nextEthClient == nil { + logger.Info("L2Next client not configured, switch disabled") + return &RetryableClient{ + authClient: authClient, + ethClient: ethClient, + nextAuthClient: authClient, // fallback to current + nextEthClient: ethClient, // fallback to current + switchTime: switchTime, + b: backoff.NewExponentialBackOff(), + logger: logger, + } + } + // Check if switch time has already passed at startup + now := uint64(time.Now().Unix()) + alreadySwitched := switchTime > 0 && now >= switchTime + + if alreadySwitched { + logger.Info("Switch time already passed at startup, starting with next client", + "switchTime", switchTime, + "currentTime", now) + } else { + logger.Info("Geth switch enabled", "switchTime", switchTime) + } + + rc := &RetryableClient{ + authClient: authClient, + ethClient: ethClient, + nextAuthClient: nextAuthClient, + nextEthClient: nextEthClient, + switchTime: switchTime, + b: backoff.NewExponentialBackOff(), + logger: logger, + } + + // If switch time already passed, mark as switched immediately + if alreadySwitched { + rc.switched.Store(true) + } + + return rc +} + +func (rc *RetryableClient) aClient() *authclient.Client { + if !rc.switched.Load() { + return rc.authClient + } + return rc.nextAuthClient +} + +func (rc *RetryableClient) eClient() *ethclient.Client { + if !rc.switched.Load() { + return rc.ethClient + } + return rc.nextEthClient +} + +// EnsureSwitched checks if switch time has been reached and switches to next client if needed. +// This should be called when the block is already delivered (e.g., synced via P2P) to ensure +// the client switch happens even if NewL2Block is not called. +func (rc *RetryableClient) EnsureSwitched(ctx context.Context, timeStamp uint64, number uint64) { + rc.switchClient(ctx, timeStamp, number) +} + +func (rc *RetryableClient) switchClient(ctx context.Context, timeStamp uint64, number uint64) { + if rc.switched.Load() { + return + } + if rc.switchTime == 0 { + return + } + if timeStamp < rc.switchTime { + return + } + + rc.logger.Info("========================================") + rc.logger.Info("GETH UPGRADE: Switch time reached!") + rc.logger.Info("========================================") + rc.logger.Info("Switch time reached, switching from current client to next client", + "switch_time", rc.switchTime, + "current_time", timeStamp, + "target_block", number) + rc.logger.Info("Current status: connected to current geth, waiting for next geth to sync...") + + ticker := time.NewTicker(500 * time.Millisecond) + defer ticker.Stop() + + startTime := time.Now() + lastLogTime := startTime + + for { + remote, err := rc.nextEthClient.BlockNumber(ctx) + if err != nil { + rc.logger.Error("Failed to get next geth block number", + "error", err, + "hint", "Please ensure next geth is running and accessible") + <-ticker.C + continue + } + + if remote+1 >= number { + // Get next geth's latest block hash for debugging + targetHeader, headerErr := rc.nextEthClient.HeaderByNumber(ctx, big.NewInt(int64(remote))) + targetBlockHash := "unknown" + targetStateRoot := "unknown" + if headerErr == nil && targetHeader != nil { + targetBlockHash = targetHeader.Hash().Hex() + targetStateRoot = targetHeader.Root.Hex() + } + + rc.switched.Store(true) + rc.logger.Info("========================================") + rc.logger.Info("GETH UPGRADE: Successfully switched!") + rc.logger.Info("========================================") + rc.logger.Info("Successfully switched to next client", + "remote_block", remote, + "target_block", number, + "target_block_hash", targetBlockHash, + "target_state_root", targetStateRoot, + "wait_duration", time.Since(startTime)) + return + } + + if time.Since(lastLogTime) >= 5*time.Second { + rc.logger.Error("!!! WAITING: Node BLOCKED waiting for next geth !!!", + "next_geth_block", remote, + "target_block", number, + "blocks_behind", number-remote-1, + "wait_duration", time.Since(startTime)) + lastLogTime = time.Now() + } + + <-ticker.C } } func (rc *RetryableClient) AssembleL2Block(ctx context.Context, number *big.Int, transactions eth.Transactions) (ret *catalyst.ExecutableL2Data, err error) { + timestamp := uint64(time.Now().Unix()) if retryErr := backoff.Retry(func() error { - resp, respErr := rc.authClient.AssembleL2Block(ctx, number, transactions) + rc.switchClient(ctx, timestamp, number.Uint64()) + resp, respErr := rc.aClient().AssembleL2Block(ctx, ×tamp, number, transactions) if respErr != nil { rc.logger.Info("failed to AssembleL2Block", "error", respErr) if retryableError(respErr) { @@ -62,8 +314,9 @@ func (rc *RetryableClient) AssembleL2Block(ctx context.Context, number *big.Int, } func (rc *RetryableClient) ValidateL2Block(ctx context.Context, executableL2Data *catalyst.ExecutableL2Data) (ret bool, err error) { + rc.switchClient(ctx, executableL2Data.Timestamp, executableL2Data.Number) if retryErr := backoff.Retry(func() error { - resp, respErr := rc.authClient.ValidateL2Block(ctx, executableL2Data) + resp, respErr := rc.aClient().ValidateL2Block(ctx, executableL2Data) if respErr != nil { rc.logger.Info("failed to ValidateL2Block", "error", respErr) if retryableError(respErr) { @@ -80,10 +333,14 @@ func (rc *RetryableClient) ValidateL2Block(ctx context.Context, executableL2Data } func (rc *RetryableClient) NewL2Block(ctx context.Context, executableL2Data *catalyst.ExecutableL2Data, batchHash *common.Hash) (err error) { + rc.switchClient(ctx, executableL2Data.Timestamp, executableL2Data.Number) + if retryErr := backoff.Retry(func() error { - respErr := rc.authClient.NewL2Block(ctx, executableL2Data, batchHash) + respErr := rc.aClient().NewL2Block(ctx, executableL2Data, batchHash) if respErr != nil { - rc.logger.Info("failed to NewL2Block", "error", respErr) + rc.logger.Error("NewL2Block failed", + "block_number", executableL2Data.Number, + "error", respErr) if retryableError(respErr) { return respErr } @@ -97,8 +354,9 @@ func (rc *RetryableClient) NewL2Block(ctx context.Context, executableL2Data *cat } func (rc *RetryableClient) NewSafeL2Block(ctx context.Context, safeL2Data *catalyst.SafeL2Data) (ret *eth.Header, err error) { + rc.switchClient(ctx, safeL2Data.Timestamp, safeL2Data.Number) if retryErr := backoff.Retry(func() error { - resp, respErr := rc.authClient.NewSafeL2Block(ctx, safeL2Data) + resp, respErr := rc.aClient().NewSafeL2Block(ctx, safeL2Data) if respErr != nil { rc.logger.Info("failed to NewSafeL2Block", "error", respErr) if retryableError(respErr) { @@ -116,7 +374,7 @@ func (rc *RetryableClient) NewSafeL2Block(ctx context.Context, safeL2Data *catal func (rc *RetryableClient) CommitBatch(ctx context.Context, batch *eth.RollupBatch, signatures []eth.BatchSignature) (err error) { if retryErr := backoff.Retry(func() error { - respErr := rc.authClient.CommitBatch(ctx, batch, signatures) + respErr := rc.aClient().CommitBatch(ctx, batch, signatures) if respErr != nil { rc.logger.Info("failed to CommitBatch", "error", respErr) if retryableError(respErr) { @@ -133,7 +391,7 @@ func (rc *RetryableClient) CommitBatch(ctx context.Context, batch *eth.RollupBat func (rc *RetryableClient) AppendBlsSignature(ctx context.Context, batchHash common.Hash, signature eth.BatchSignature) (err error) { if retryErr := backoff.Retry(func() error { - respErr := rc.authClient.AppendBlsSignature(ctx, batchHash, signature) + respErr := rc.aClient().AppendBlsSignature(ctx, batchHash, signature) if respErr != nil { rc.logger.Info("failed to call AppendBlsSignature", "error", respErr) if retryableError(respErr) { @@ -150,7 +408,7 @@ func (rc *RetryableClient) AppendBlsSignature(ctx context.Context, batchHash com func (rc *RetryableClient) BlockNumber(ctx context.Context) (ret uint64, err error) { if retryErr := backoff.Retry(func() error { - resp, respErr := rc.ethClient.BlockNumber(ctx) + resp, respErr := rc.eClient().BlockNumber(ctx) if respErr != nil { rc.logger.Info("failed to call BlockNumber", "error", respErr) if retryableError(respErr) { @@ -168,7 +426,7 @@ func (rc *RetryableClient) BlockNumber(ctx context.Context) (ret uint64, err err func (rc *RetryableClient) HeaderByNumber(ctx context.Context, blockNumber *big.Int) (ret *eth.Header, err error) { if retryErr := backoff.Retry(func() error { - resp, respErr := rc.ethClient.HeaderByNumber(ctx, blockNumber) + resp, respErr := rc.eClient().HeaderByNumber(ctx, blockNumber) if respErr != nil { rc.logger.Info("failed to call BlockNumber", "error", respErr) if retryableError(respErr) { @@ -186,7 +444,7 @@ func (rc *RetryableClient) HeaderByNumber(ctx context.Context, blockNumber *big. func (rc *RetryableClient) CallContract(ctx context.Context, call ethereum.CallMsg, blockNumber *big.Int) (ret []byte, err error) { if retryErr := backoff.Retry(func() error { - resp, respErr := rc.ethClient.CallContract(ctx, call, blockNumber) + resp, respErr := rc.eClient().CallContract(ctx, call, blockNumber) if respErr != nil { rc.logger.Info("failed to call eth_call", "error", respErr) if retryableError(respErr) { @@ -204,7 +462,7 @@ func (rc *RetryableClient) CallContract(ctx context.Context, call ethereum.CallM func (rc *RetryableClient) CodeAt(ctx context.Context, contract common.Address, blockNumber *big.Int) (ret []byte, err error) { if retryErr := backoff.Retry(func() error { - resp, respErr := rc.ethClient.CodeAt(ctx, contract, blockNumber) + resp, respErr := rc.eClient().CodeAt(ctx, contract, blockNumber) if respErr != nil { rc.logger.Info("failed to call eth_getCode", "error", respErr) if retryableError(respErr) { @@ -220,7 +478,24 @@ func (rc *RetryableClient) CodeAt(ctx context.Context, contract common.Address, return } -// currently we want every error retryable +func (rc *RetryableClient) SetBlockTags(ctx context.Context, safeBlockHash common.Hash, finalizedBlockHash common.Hash) (err error) { + if retryErr := backoff.Retry(func() error { + respErr := rc.authClient.SetBlockTags(ctx, safeBlockHash, finalizedBlockHash) + if respErr != nil { + rc.logger.Info("failed to call SetBlockTags", "error", respErr) + if retryableError(respErr) { + return respErr + } + err = respErr + } + return nil + }, rc.b); retryErr != nil { + return retryErr + } + return +} + +// 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 +504,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/ops/devnet-morph/devnet/__init__.py b/ops/devnet-morph/devnet/__init__.py index ba151512b..4ec81c897 100644 --- a/ops/devnet-morph/devnet/__init__.py +++ b/ops/devnet-morph/devnet/__init__.py @@ -73,21 +73,51 @@ def main(): def devnet_l1(paths, result=None): log.info('Starting L1.') - run_command(['docker', 'compose', '-f', 'docker-compose-4nodes.yml', 'build', '--no-cache', 'l1'], check=False, - cwd=paths.ops_dir, env={ + + layer1_dir = pjoin(paths.ops_dir, 'layer1') + genesis_dir = pjoin(layer1_dir, 'genesis') + jwt_dir = pjoin(layer1_dir, 'jwt') + + # Check if genesis files exist, if not generate them + genesis_json = pjoin(genesis_dir, 'genesis.json') + genesis_ssz = pjoin(genesis_dir, 'genesis.ssz') + jwt_secret = pjoin(jwt_dir, 'jwtsecret') + + if not os.path.exists(genesis_json) or not os.path.exists(genesis_ssz) or not os.path.exists(jwt_secret): + log.info('Genesis files not found, generating...') + generate_script = pjoin(layer1_dir, 'scripts', 'generate-genesis.sh') + if os.path.exists(generate_script): + run_command(['bash', generate_script], check=True, cwd=layer1_dir) + else: + log.error(f'Genesis generation script not found at {generate_script}') + raise FileNotFoundError(f'Genesis generation script not found') + + # Start layer1 services + log.info('Starting layer1 services (layer1-el, layer1-cl, layer1-vc)...') + run_command(['docker', 'compose', '-f', 'docker-compose-4nodes.yml', 'up', '-d', + 'layer1-el', 'layer1-cl', 'layer1-vc'], check=False, cwd=paths.ops_dir, env={ 'PWD': paths.ops_dir }) - run_command(['docker', 'compose', '-f', 'docker-compose-4nodes.yml', 'up', '-d', 'l1'], check=False, - cwd=paths.ops_dir, env={ - 'PWD': paths.ops_dir - }) - wait_up(9545) + + # Wait for EL node to be ready + log.info('Waiting for layer1-el to be ready...') + wait_up(9545, retries=60, wait_secs=2) wait_for_rpc_server('127.0.0.1:9545') - log.info('Sleep another 10s...') - time.sleep(10) - res = eth_accounts('127.0.0.1:9545') - response = json.loads(res) - account = response['result'][0] + + # Wait for first block to be mined + log.info('Waiting for first block to be mined...') + max_retries = 60 + retry_count = 0 + while retry_count < max_retries: + block_number = eth_blockNumber('127.0.0.1:9545') + if block_number is not None and block_number >= 1: + log.info(f'First block mined! Current block number: {block_number}') + break + retry_count += 1 + log.info(f'Waiting for first block (current: {block_number if block_number is not None else "N/A"})...') + time.sleep(3) + else: + log.warning('Timeout waiting for first block to be mined') devnet_cfg_orig = pjoin(paths.deploy_config_dir, 'devnet-deploy-config.json') deploy_config = read_json(devnet_cfg_orig) @@ -97,7 +127,7 @@ def devnet_l1(paths, result=None): log.info(f"Account {sequencer}, Balance: {result.stdout}", ) if int(result.stdout) < 5 * ETH: - log.info(f'Insufficient Sequencer: {sequencer}, Founding with account: {account}') + log.info(f'Insufficient Sequencer: {sequencer}, Founding') run_command([ 'cast', 'send', '--private-key', deploy_config['BLOCK_SIGNER_PRIVATE_KEY'], '--rpc-url', 'http://127.0.0.1:9545', @@ -229,7 +259,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'], @@ -238,8 +268,8 @@ def devnet_deploy(paths, args): 'NODE_DATA_DIR': '/data', 'GETH_DATA_DIR': '/db', 'GENESIS_FILE_PATH': '/genesis.json', - 'L1_ETH_RPC': 'http://l1:8545', - 'L1_BEACON_CHAIN_RPC': 'http://beacon-chain:3500', + 'L1_ETH_RPC': 'http://layer1-el:8545', + 'L1_BEACON_CHAIN_RPC': 'http://layer1-cl:4000', }) wait_up(8545) wait_for_rpc_server('127.0.0.1:8545') @@ -345,3 +375,27 @@ def eth_accounts(url): data = response.read().decode() conn.close() return data + + +def eth_blockNumber(url): + """ + Call eth_blockNumber JSON-RPC method to get the current block number. + Returns the block number as an integer, or None on error. + """ + try: + conn = http.client.HTTPConnection(url) + headers = {'Content-type': 'application/json'} + body = '{"id":1, "jsonrpc":"2.0", "method": "eth_blockNumber", "params":[]}' + conn.request('POST', '/', body, headers) + response = conn.getresponse() + data = response.read().decode() + conn.close() + result = json.loads(data) + if 'result' in result: + # Convert hex string (e.g., "0x1") to integer + block_number_hex = result['result'] + return int(block_number_hex, 16) + return None + except Exception as e: + log.debug(f'Error calling eth_blockNumber: {e}') + return None diff --git a/ops/devnet-morph/devnet/setup_nodes.py b/ops/devnet-morph/devnet/setup_nodes.py index 7e72c730d..9169e74fc 100644 --- a/ops/devnet-morph/devnet/setup_nodes.py +++ b/ops/devnet-morph/devnet/setup_nodes.py @@ -25,7 +25,6 @@ def setup_devnet_nodes(): print("Error: Failed to build Tendermint. Exiting.") sys.exit(1) - # back to the root directory os.chdir(root_dir) print("Tendermint build process completed.") diff --git a/ops/docker/.env b/ops/docker/.env index 238f50195..8c4125ef4 100644 --- a/ops/docker/.env +++ b/ops/docker/.env @@ -2,8 +2,8 @@ GETH_DATA_DIR=/db GENESIS_FILE_PATH=/genesis.json 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_ETH_RPC=http://layer1-el:8545 +L1_BEACON_CHAIN_RPC=http://layer1-cl:4000 L1_CROSS_DOMAIN_MESSENGER=0xcf7ed3acca5a467e9e704c703e8d87f634fb0fc9 MORPH_PORTAL=0xdc64a140aa3e981100a9beca4e685f962f0cf6c9 MORPH_ROLLUP=0x0165878a594ca255338adfa4d48449f69242eb8f diff --git a/ops/docker/Dockerfile.indexer b/ops/docker/Dockerfile.indexer index eb4b86ba2..1d6dc3f83 100644 --- a/ops/docker/Dockerfile.indexer +++ b/ops/docker/Dockerfile.indexer @@ -1,4 +1,4 @@ -FROM golang:1.22-alpine as builder +FROM golang:1.24.0-alpine as builder RUN apk add --no-cache make gcc musl-dev linux-headers git jq bash diff --git a/ops/docker/Dockerfile.l2-geth b/ops/docker/Dockerfile.l2-geth index eda5d8e4e..5f959888d 100644 --- a/ops/docker/Dockerfile.l2-geth +++ b/ops/docker/Dockerfile.l2-geth @@ -1,5 +1,5 @@ # Build Geth in a stock Go builder container -FROM golang:1.22-alpine as builder +FROM golang:1.24.0-alpine as builder RUN apk add --no-cache gcc musl-dev linux-headers git make diff --git a/ops/docker/Dockerfile.l2-node b/ops/docker/Dockerfile.l2-node index 940ca9dfd..f743dc1fb 100644 --- a/ops/docker/Dockerfile.l2-node +++ b/ops/docker/Dockerfile.l2-node @@ -1,5 +1,5 @@ # Build Stage -FROM morph/go-ubuntu-builder:go-1.22-ubuntu as builder +FROM ghcr.io/morph-l2/go-ubuntu-builder:go-1.24-ubuntu as builder # Set working directory and copy necessary files COPY . /morph @@ -9,7 +9,7 @@ WORKDIR /morph/node RUN make build # Final Stage -FROM morph/go-ubuntu-builder:go-1.22-ubuntu +FROM ghcr.io/morph-l2/go-ubuntu-builder:go-1.24-ubuntu # Update and install dependencies, then clean up unnecessary files RUN apt-get -qq update \ diff --git a/ops/docker/Dockerfile.l2-node-1 b/ops/docker/Dockerfile.l2-node-1 index 4ef95807d..11873cf4d 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.24-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 bbcc23c1b..c449038e1 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.24-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 eadeaa28e..a9c0f9836 100644 --- a/ops/docker/Dockerfile.staking-oracle +++ b/ops/docker/Dockerfile.staking-oracle @@ -1,12 +1,12 @@ -FROM morph/go-ubuntu-builder:go-1.22-ubuntu as builder +FROM ghcr.io/morph-l2/go-ubuntu-builder:go-1.24-ubuntu as builder # Copy source code and build application COPY . /morph WORKDIR /morph/oracle RUN make build -# Deploy stage using the same base image (morph/go-ubuntu-builder:go-1.22-ubuntu) -FROM morph/go-ubuntu-builder:go-1.22-ubuntu +# Deploy stage using the same base image (morph/go-ubuntu-builder:go-1.24-ubuntu) +FROM ghcr.io/morph-l2/go-ubuntu-builder:go-1.24-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/* diff --git a/ops/docker/Dockerfile.submitter b/ops/docker/Dockerfile.submitter index 726530c23..a24027f00 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.24-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.24-ubuntu RUN apt-get -qq update \ && apt-get -qq install -y --no-install-recommends ca-certificates diff --git a/ops/docker/Dockerfile.token-price-oracle b/ops/docker/Dockerfile.token-price-oracle new file mode 100644 index 000000000..249ba4228 --- /dev/null +++ b/ops/docker/Dockerfile.token-price-oracle @@ -0,0 +1,17 @@ +# Build token-price-oracle in a stock Go builder container +FROM ghcr.io/morph-l2/go-ubuntu-builder:go-1.24-ubuntu as builder + +COPY . /morph + +WORKDIR /morph/token-price-oracle + +RUN make build + +# Copy binary into a lightweight runtime container +FROM ghcr.io/morph-l2/go-ubuntu-builder:go-1.24-ubuntu + +RUN apt-get -qq update \ + && apt-get -qq install -y --no-install-recommends ca-certificates +COPY --from=builder /morph/token-price-oracle/build/bin/token-price-oracle /usr/local/bin/ + +CMD ["token-price-oracle"] \ No newline at end of file diff --git a/ops/docker/Makefile.layer1 b/ops/docker/Makefile.layer1 new file mode 100644 index 000000000..d52aef375 --- /dev/null +++ b/ops/docker/Makefile.layer1 @@ -0,0 +1,27 @@ +.PHONY: help generate start stop restart logs clean + +help: + @echo "Available commands:" + @echo " make generate - Generate genesis data and keystores" + @echo " make start - Start network" + @echo " make stop - Stop network" + @echo " make restart - Restart network" + @echo " make logs - View logs" + @echo " make clean - Clean all generated data and reset to initial state" + +generate: + @./layer1/scripts/generate-genesis.sh + +start: + @./layer1/scripts/start.sh + +stop: + @docker compose -f docker-compose-4nodes.yml down + +restart: stop start + +logs: + @docker compose -f docker-compose-4nodes.yml logs -f layer1-el layer1-cl layer1-vc + +clean: + @./layer1/scripts/clean.sh diff --git a/ops/docker/docker-compose-4nodes.yml b/ops/docker/docker-compose-4nodes.yml index 7353ee639..255d2a13e 100644 --- a/ops/docker/docker-compose-4nodes.yml +++ b/ops/docker/docker-compose-4nodes.yml @@ -16,114 +16,110 @@ volumes: sentry_node_data: validator_geth_data: validator_node_data: + layer1-el-data: + layer1-cl-data: + layer1-vc-data: services: - # Runs a Prysm beacon chain from a specified genesis state created in the previous step - # and connects to go-ethereum in the same network as the execution client. - # The account used in go-ethereum is set as the suggested fee recipient for transactions - # proposed via the validators attached to the beacon node. - beacon-chain: - container_name: l1-beacon-chain -# image: gcr.io/prysmaticlabs/prysm/beacon-chain:v4.2.1 - image: morph-beacon-chain - build: - context: ../.. - dockerfile: ops/docker/Dockerfile.l1-beacon - target: beacon-chain - command: - - --datadir=/consensus/beacondata - - --min-sync-peers=0 - - --genesis-state=/consensus/genesis.ssz - - --bootstrap-node= - - --interop-eth1data-votes - - --chain-config-file=/consensus/config.yml - - --contract-deployment-block=0 - - --chain-id=${CHAIN_ID:-900} - - --rpc-host=0.0.0.0 - - --grpc-gateway-host=0.0.0.0 - - --execution-endpoint=http://l1:8551 - - --accept-terms-of-use - - --jwt-secret=/execution/jwtsecret - - --suggested-fee-recipient=0xca062b0fd91172d89bcd4bb084ac4e21972cc467 - - --minimum-peers-per-subnet=0 - - --enable-debug-rpc-endpoints - - --force-clear-db -# depends_on: -# chain-genesis: -# condition: service_completed_successfully - ports: - - 4000 - - 3500 - - 8080 - - 6060 - volumes: - - l1_consensus:/consensus - - l1_execution:/execution - - # We run a validator client with 64, deterministically-generated keys that match - # The validator keys present in the beacon chain genesis state generated a few steps above. - validator: - container_name: l1-validator - image: gcr.io/prysmaticlabs/prysm/validator:v4.2.1 + # ========== Layer1 Ethereum Node ========== + layer1-el: + image: ethereum/client-go:latest + container_name: layer1-el + ports: + - "9545:8545" # RPC + - "9546:8546" # WebSocket + - "8551:8551" # Engine API + volumes: + - ./layer1/genesis:/network-configs:ro + - ./layer1/jwt:/jwt:ro + - layer1-el-data:/data + entrypoint: ["/bin/sh", "-c"] command: - - --beacon-rpc-provider=beacon-chain:4000 - - --datadir=/consensus/validatordata - - --accept-terms-of-use - - --interop-num-validators=64 - - --interop-start-index=0 - - --chain-config-file=/consensus/config.yml - - --force-clear-db + - | + mkdir -p /data/geth/execution-data + if [ ! -f /data/geth/execution-data/geth/chaindata/CURRENT ]; then + echo "Initializing genesis..." + geth init --datadir=/data/geth/execution-data /network-configs/genesis.json || exit 1 + else + echo "Genesis already initialized, skipping init" + fi + exec geth --networkid=900 --datadir=/data/geth/execution-data --http --http.addr=0.0.0.0 --http.port=8545 --http.api=admin,engine,net,eth,web3,debug,txpool --http.vhosts=* --http.corsdomain=* --ws --ws.addr=0.0.0.0 --ws.port=8546 --ws.api=admin,engine,net,eth,web3,debug,txpool --ws.origins=* --allow-insecure-unlock --authrpc.port=8551 --authrpc.addr=0.0.0.0 --authrpc.vhosts=* --authrpc.jwtsecret=/jwt/jwtsecret --syncmode=full --miner.gasprice=1 --rpc.allow-unprotected-txs --metrics --metrics.addr=0.0.0.0 --metrics.port=9001 --discovery.port=30303 --port=30303 + restart: unless-stopped + + layer1-cl: + image: sigp/lighthouse:latest + container_name: layer1-cl depends_on: - beacon-chain: - condition: service_started + - layer1-el + ports: + - "4000:4000" # HTTP API + - "9000:9000" # P2P TCP/UDP + - "9000:9000/udp" # P2P UDP + - "9001:9001" # P2P QUIC + - "5054:5054" # Metrics volumes: - - l1_consensus:/consensus - - l1_execution:/execution - - # Runs the go-ethereum execution client with the specified, unlocked account and necessary - # APIs to allow for proof-of-stake consensus via Prysm. - l1: - container_name: l1-geth - image: ethereum/client-go:v1.14.11 + - ./layer1/genesis:/network-configs:ro + - ./layer1/jwt:/jwt:ro + - layer1-cl-data:/data command: + - lighthouse + - beacon_node + - --supernode + - --debug-level=info + - --datadir=/data/lighthouse/beacon-data + - --listen-address=0.0.0.0 + - --port=9000 - --http - - --http.api=web3,debug,eth,txpool,net,engine - - --http.addr=0.0.0.0 - - --http.corsdomain=* - - --http.vhosts=* - - --ws - - --ws.api=web3,debug,eth,txpool,net,engine - - --ws.addr=0.0.0.0 - - --ws.origins=* - - --authrpc.vhosts=* - - --authrpc.addr=0.0.0.0 - - --authrpc.jwtsecret=/execution/jwtsecret - - --datadir=/execution - - --allow-insecure-unlock - - --unlock=0xca062b0fd91172d89bcd4bb084ac4e21972cc467 - - --password=/execution/password - - --nodiscover - - --syncmode=full - - --gcmode=archive - ports: - - 8551 - - 9545:8545 - - 9546:8546 + - --http-address=0.0.0.0 + - --http-port=4000 + - --disable-packet-filter + - --execution-endpoints=http://layer1-el:8551 + - --jwt-secrets=/jwt/jwtsecret + - --suggested-fee-recipient=0x8943545177806ED17B9F23F0a21ee5948eCaa776 + - --testnet-dir=/network-configs + - --allow-insecure-genesis-sync + - --disable-enr-auto-update + - --enr-tcp-port=9000 + - --enr-udp-port=9000 + - --enr-quic-port=9001 + - --quic-port=9001 + - --metrics + - --metrics-address=0.0.0.0 + - --metrics-allow-origin=* + - --metrics-port=5054 + - --enable-private-discovery + restart: unless-stopped + + layer1-vc: + image: sigp/lighthouse:latest + container_name: layer1-vc depends_on: -# geth-genesis: -# condition: service_completed_successfully - beacon-chain: - condition: service_started - validator: - condition: service_started + - layer1-cl volumes: - - l1_execution:/execution - - l1_consensus:/consensus + - ./layer1/genesis:/network-configs:ro + - ./layer1/keystores/layer1:/validator-keys + - layer1-vc-data:/data + command: + - lighthouse + - vc + - --debug-level=info + - --testnet-dir=/network-configs + - --validators-dir=/validator-keys/keys + - --secrets-dir=/validator-keys/secrets + - --init-slashing-protection + - --beacon-nodes=http://layer1-cl:4000 + - --suggested-fee-recipient=0x8943545177806ED17B9F23F0a21ee5948eCaa776 + - --metrics + - --metrics-address=0.0.0.0 + - --metrics-allow-origin=* + - --metrics-port=5064 + restart: unless-stopped + # ========== L2 Services ========== morph-geth-0: container_name: morph-geth-0 depends_on: - l1: + layer1-el: condition: service_started image: morph-geth:latest build: @@ -388,7 +384,7 @@ services: - "${PWD}/jwt-secret.txt:${JWT_SECRET_PATH}" command: > morphnode - --home $NODE_DATA_DIR + --home $NODE_DATA_DIR validator_geth: @@ -493,7 +489,6 @@ services: - TX_SUBMITTER_L1_STAKING_ADDRESS=${MORPH_L1STAKING:-0x5fc8d32690cc91d4c39d9d3abcbd16989f875707} - TX_SUBMITTER_L1_STAKING_DEPLOYED_BLOCKNUM=0 - tx-submitter-1: container_name: tx-submitter-1 depends_on: @@ -536,7 +531,6 @@ services: - TX_SUBMITTER_L1_STAKING_ADDRESS=${MORPH_L1STAKING:-0x5fc8d32690cc91d4c39d9d3abcbd16989f875707} - TX_SUBMITTER_L1_STAKING_DEPLOYED_BLOCKNUM=0 - tx-submitter-2: container_name: tx-submitter-2 depends_on: @@ -579,7 +573,6 @@ services: - TX_SUBMITTER_L1_STAKING_ADDRESS=${MORPH_L1STAKING:-0x5fc8d32690cc91d4c39d9d3abcbd16989f875707} - TX_SUBMITTER_L1_STAKING_DEPLOYED_BLOCKNUM=0 - tx-submitter-3: container_name: tx-submitter-3 depends_on: @@ -651,31 +644,3 @@ services: - L1_ROLLUP=${MORPH_ROLLUP:-0x6900000000000000000000000000000000000010} - OVERHEAD_SWITCH=${OVERHEAD_SWITCH} - MAX_OVERHEAD=${MAX_OVERHEAD} - - staking-oracle: - container_name: staking-oracle - depends_on: - node-0: - condition: service_started - build: - context: ../.. - dockerfile: ops/docker/Dockerfile.staking-oracle - image: morph-staking-oracle:latest - restart: unless-stopped - command: staking-oracle - ports: - - "9060:6060" - environment: - # change the env variables to your own - - STAKING_ORACLE_BUILD_ENV=dev - - STAKING_ORACLE_L1_ETH_RPC=${L1_ETH_RPC} - - STAKING_ORACLE_RECORD_PRIVATE_KEY=ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 - - STAKING_ORACLE_L2_ETH_RPC=http://morph-geth-0:8545 - - STAKING_ORACLE_L2_TENDERMINT_RPC=http://node-0:26657 - - STAKING_ORACLE_L2_WS_ENDPOINT=http://node-0:26656 - - STAKING_ORACLE_ROLLUP=${MORPH_ROLLUP:-0x6900000000000000000000000000000000000010} - - STAKING_ORACLE_LOG_FILENAME=staking-oracle.log - - STAKING_ORACLE_LOG_FILE_MAX_SIZE=100 #MB - - STAKING_ORACLE_LOG_FILE_MAX_AGE=7 #day - - STAKING_ORACLE_LOG_COMPRESS=true - - STAKING_ORACLE_METRICS_SERVER_ENABLE=true diff --git a/ops/docker/go-rust-builder.Dockerfile b/ops/docker/go-rust-builder.Dockerfile index 38d0c1417..05997e3b9 100644 --- a/ops/docker/go-rust-builder.Dockerfile +++ b/ops/docker/go-rust-builder.Dockerfile @@ -1,4 +1,4 @@ -ARG GO_VERSION=1.19 +ARG GO_VERSION=1.24.0 ARG RUST_VERSION=nightly-2022-12-10 ARG CARGO_CHEF_TAG=0.1.41 @@ -12,8 +12,8 @@ RUN apt-get install build-essential curl wget git pkg-config -y RUN apt-get install libclang-dev libssl-dev llvm software-properties-common -y # Install golang RUN add-apt-repository ppa:longsleep/golang-backports -RUN apt install golang-1.19-go -y -ENV PATH="/usr/lib/go-1.19/bin:${PATH}" +RUN apt install golang-1.24.0-go -y +ENV PATH="/usr/lib/go-1.24.0/bin:${PATH}" # Install Rust RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y diff --git a/ops/docker/intermediate/go-rust-alpine-builder.Dockerfile b/ops/docker/intermediate/go-rust-alpine-builder.Dockerfile index 3587ae006..dc0395afe 100644 --- a/ops/docker/intermediate/go-rust-alpine-builder.Dockerfile +++ b/ops/docker/intermediate/go-rust-alpine-builder.Dockerfile @@ -1,4 +1,4 @@ -ARG GO_VERSION=1.22 +ARG GO_VERSION=1.24.0 ARG RUST_VERSION=nightly-2023-12-03 ARG CARGO_CHEF_TAG=0.1.41 diff --git a/ops/docker/intermediate/go-rust-builder.Dockerfile b/ops/docker/intermediate/go-rust-builder.Dockerfile index b74b372ce..1eee2fe26 100644 --- a/ops/docker/intermediate/go-rust-builder.Dockerfile +++ b/ops/docker/intermediate/go-rust-builder.Dockerfile @@ -1,4 +1,4 @@ -ARG GO_VERSION=1.22 +ARG GO_VERSION=1.24.0 ARG RUST_VERSION=nightly-2023-12-03 ARG CARGO_CHEF_TAG=0.1.41 diff --git a/ops/docker/intermediate/go-ubuntu-builder.Dockerfile b/ops/docker/intermediate/go-ubuntu-builder.Dockerfile index 80871357c..18b66ddaf 100644 --- a/ops/docker/intermediate/go-ubuntu-builder.Dockerfile +++ b/ops/docker/intermediate/go-ubuntu-builder.Dockerfile @@ -1,4 +1,4 @@ -ARG GO_VERSION=1.22 +ARG GO_VERSION=1.24 FROM ubuntu:20.04 diff --git a/ops/docker/layer1/.gitignore b/ops/docker/layer1/.gitignore new file mode 100644 index 000000000..9d0924a2c --- /dev/null +++ b/ops/docker/layer1/.gitignore @@ -0,0 +1,5 @@ +genesis/ +keystores/ +configs/ +jwt/ + diff --git a/ops/docker/layer1/configs/values.env.template b/ops/docker/layer1/configs/values.env.template new file mode 100644 index 000000000..52a3ed168 --- /dev/null +++ b/ops/docker/layer1/configs/values.env.template @@ -0,0 +1,85 @@ +export PRESET_BASE=minimal +export CHAIN_ID=900 +export DEPOSIT_CONTRACT_ADDRESS=0x00000000219ab540356cBB839Cbe05303d7705Fa +export EL_AND_CL_MNEMONIC="giant issue aisle success illegal bike spike question tent bar rely arctic volcano long crawl hungry vocal artwork sniff fantasy very lucky have athlete" +export CL_EXEC_BLOCK=0 +export SLOT_DURATION_IN_SECONDS=3 +export SLOT_DURATION_MS=3000 +export DEPOSIT_CONTRACT_BLOCK=0x0000000000000000000000000000000000000000000000000000000000000000 +export NUMBER_OF_VALIDATORS=32 +export GENESIS_FORK_VERSION=0x10000038 +export ALTAIR_FORK_VERSION=0x20000038 +export ALTAIR_FORK_EPOCH=0 +export BELLATRIX_FORK_VERSION=0x30000038 +export BELLATRIX_FORK_EPOCH=0 +export CAPELLA_FORK_VERSION=0x40000038 +export CAPELLA_FORK_EPOCH=0 +export DENEB_FORK_VERSION=0x50000038 +export DENEB_FORK_EPOCH=0 +export ELECTRA_FORK_VERSION=0x60000038 +export ELECTRA_FORK_EPOCH=0 +export FULU_FORK_VERSION=0x70000038 +export FULU_FORK_EPOCH=0 +export GLOAS_FORK_VERSION=0x80000038 +export GLOAS_FORK_EPOCH=18446744073709551615 +export EIP7805_FORK_VERSION=0x90000038 +export EIP7805_FORK_EPOCH=18446744073709551615 +export EIP7441_FORK_VERSION=0xa0000038 +export EIP7441_FORK_EPOCH=18446744073709551615 +export WITHDRAWAL_TYPE=0x01 +export WITHDRAWAL_ADDRESS=0x8943545177806ED17B9F23F0a21ee5948eCaa776 +export VALIDATOR_BALANCE=32000000000 +export GENESIS_TIMESTAMP={{GENESIS_TIMESTAMP}} +export GENESIS_DELAY=0 +export GENESIS_GASLIMIT=60000000 +export MAX_PER_EPOCH_ACTIVATION_CHURN_LIMIT=8 +export CHURN_LIMIT_QUOTIENT=65536 +export EJECTION_BALANCE=16000000000 +export ETH1_FOLLOW_DISTANCE=1 +export SHADOW_FORK_FILE= +export MIN_VALIDATOR_WITHDRAWABILITY_DELAY=256 +export SHARD_COMMITTEE_PERIOD=256 +export ATTESTATION_DUE_BPS_GLOAS=2500 +export AGGREGATE_DUE_BPS_GLOAS=5000 +export SYNC_MESSAGE_DUE_BPS_GLOAS=2500 +export CONTRIBUTION_DUE_BPS_GLOAS=5000 +export PAYLOAD_ATTESTATION_DUE_BPS=7500 +export VIEW_FREEZE_CUTOFF_BPS=7500 +export INCLUSION_LIST_SUBMISSION_DUE_BPS=6667 +export PROPOSER_INCLUSION_LIST_CUTOFF_BPS=9167 +export DATA_COLUMN_SIDECAR_SUBNET_COUNT=128 +export SAMPLES_PER_SLOT=8 +export CUSTODY_REQUIREMENT=4 +export MAX_BLOBS_PER_BLOCK_ELECTRA=9 +export TARGET_BLOBS_PER_BLOCK_ELECTRA=6 +export MAX_REQUEST_BLOCKS_DENEB=128 +export MAX_REQUEST_BLOB_SIDECARS_ELECTRA=1152 +export BASEFEE_UPDATE_FRACTION_ELECTRA=5007716 +export MAX_BLOBS_PER_BLOCK_FULU=9 +export TARGET_BLOBS_PER_BLOCK_FULU=6 +export BASEFEE_UPDATE_FRACTION_FULU=5007716 +export ADDITIONAL_PRELOADED_CONTRACTS=/opt/additional-contracts.json +export EL_PREMINE_ADDRS='{"0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266": {"balance": "1000000000000000000000000000"}, "0xca062b0fd91172d89bcd4bb084ac4e21972cc467": {"balance": "1000000000000000000000000000"}}' +export MAX_PAYLOAD_SIZE=10485760 +export BPO_1_EPOCH=18446744073709551615 +export BPO_1_MAX_BLOBS=0 +export BPO_1_TARGET_BLOBS=0 +export BPO_1_BASE_FEE_UPDATE_FRACTION=0 +export BPO_2_EPOCH=18446744073709551615 +export BPO_2_MAX_BLOBS=0 +export BPO_2_TARGET_BLOBS=0 +export BPO_2_BASE_FEE_UPDATE_FRACTION=0 +export BPO_3_EPOCH=18446744073709551615 +export BPO_3_MAX_BLOBS=0 +export BPO_3_TARGET_BLOBS=0 +export BPO_3_BASE_FEE_UPDATE_FRACTION=0 +export BPO_4_EPOCH=18446744073709551615 +export BPO_4_MAX_BLOBS=0 +export BPO_4_TARGET_BLOBS=0 +export BPO_4_BASE_FEE_UPDATE_FRACTION=0 +export BPO_5_EPOCH=18446744073709551615 +export BPO_5_MAX_BLOBS=0 +export BPO_5_TARGET_BLOBS=0 +export BPO_5_BASE_FEE_UPDATE_FRACTION=0 +export MIN_EPOCHS_FOR_DATA_COLUMN_SIDECARS_REQUESTS=4096 +export MIN_EPOCHS_FOR_BLOCK_REQUESTS=33024 diff --git a/ops/docker/layer1/docker-compose.yml b/ops/docker/layer1/docker-compose.yml new file mode 100644 index 000000000..6267e49cd --- /dev/null +++ b/ops/docker/layer1/docker-compose.yml @@ -0,0 +1,116 @@ +version: '3.8' + +services: + # ========== Ethereum Node ========== + # Note: Kurtosis executes "geth init && geth run" in the same container + # with datadir=/data/geth/execution-data + layer1-el: + image: ethereum/client-go:latest + container_name: layer1-el + networks: + - morph-network + ports: + - "9545:8545" # RPC + - "9546:8546" # WebSocket + # - "30303:30303" # P2P TCP + # - "30303:30303/udp" # P2P UDP + - "8551:8551" # Engine API + volumes: + - ./genesis:/network-configs:ro + - ./jwt:/jwt:ro + - layer1-el-data:/data + entrypoint: ["/bin/sh", "-c"] + command: + - | + mkdir -p /data/geth/execution-data + if [ ! -f /data/geth/execution-data/geth/chaindata/CURRENT ]; then + echo "Initializing genesis..." + geth init --datadir=/data/geth/execution-data /network-configs/genesis.json || exit 1 + else + echo "Genesis already initialized, skipping init" + fi + exec geth --networkid=900 --datadir=/data/geth/execution-data --http --http.addr=0.0.0.0 --http.port=8545 --http.api=admin,engine,net,eth,web3,debug,txpool --http.vhosts=* --http.corsdomain=* --ws --ws.addr=0.0.0.0 --ws.port=8546 --ws.api=admin,engine,net,eth,web3,debug,txpool --ws.origins=* --allow-insecure-unlock --authrpc.port=8551 --authrpc.addr=0.0.0.0 --authrpc.vhosts=* --authrpc.jwtsecret=/jwt/jwtsecret --syncmode=full --miner.gasprice=1 --rpc.allow-unprotected-txs --metrics --metrics.addr=0.0.0.0 --metrics.port=9001 --discovery.port=30303 --port=30303 + restart: unless-stopped + + layer1-cl: + image: sigp/lighthouse:latest + container_name: layer1-cl + depends_on: + - layer1-el + networks: + - morph-network + ports: + - "4000:4000" # HTTP API + - "9000:9000" # P2P TCP/UDP + - "9000:9000/udp" # P2P UDP + - "9001:9001" # P2P QUIC + - "5054:5054" # Metrics + volumes: + - ./genesis:/network-configs:ro + - ./jwt:/jwt:ro + - layer1-cl-data:/data + command: + - lighthouse + - beacon_node + - --debug-level=info + - --datadir=/data/lighthouse/beacon-data + - --listen-address=0.0.0.0 + - --port=9000 + - --http + - --http-address=0.0.0.0 + - --http-port=4000 + - --disable-packet-filter + - --execution-endpoints=http://layer1-el:8551 + - --jwt-secrets=/jwt/jwtsecret + - --suggested-fee-recipient=0x8943545177806ED17B9F23F0a21ee5948eCaa776 + - --testnet-dir=/network-configs + - --allow-insecure-genesis-sync + - --disable-enr-auto-update + - --enr-tcp-port=9000 + - --enr-udp-port=9000 + - --enr-quic-port=9001 + - --quic-port=9001 + - --metrics + - --metrics-address=0.0.0.0 + - --metrics-allow-origin=* + - --metrics-port=5054 + - --enable-private-discovery + restart: unless-stopped + + layer1-vc: + image: sigp/lighthouse:latest + container_name: layer1-vc + depends_on: + - layer1-cl + networks: + - morph-network + volumes: + - ./genesis:/network-configs:ro + - ./keystores/layer1:/validator-keys + - layer1-vc-data:/data + command: + - lighthouse + - vc + - --debug-level=info + - --testnet-dir=/network-configs + - --validators-dir=/validator-keys/keys + - --secrets-dir=/validator-keys/secrets + - --init-slashing-protection + - --beacon-nodes=http://layer1-cl:4000 + - --suggested-fee-recipient=0x8943545177806ED17B9F23F0a21ee5948eCaa776 + - --metrics + - --metrics-address=0.0.0.0 + - --metrics-allow-origin=* + - --metrics-port=5064 + restart: unless-stopped + +networks: + morph-network: + driver: bridge + name: morph-network + +volumes: + layer1-el-data: + layer1-cl-data: + layer1-vc-data: + diff --git a/ops/docker/layer1/jwt/jwtsecret b/ops/docker/layer1/jwt/jwtsecret new file mode 100644 index 000000000..9852e4914 --- /dev/null +++ b/ops/docker/layer1/jwt/jwtsecret @@ -0,0 +1,2 @@ +fa94394eb51a9e2f4cc9004706c4ae877bdd3369867db455a90b3c0344bc59d4 + diff --git a/ops/docker/layer1/keystores/layer1-password.txt b/ops/docker/layer1/keystores/layer1-password.txt new file mode 100644 index 000000000..8f7177458 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1-password.txt @@ -0,0 +1,2 @@ +password123 + diff --git a/ops/docker/layer1/keystores/layer1/keys/0x81ea9f74ef7d935b807474e38954ae3934856219a23e074954b2e860c5a3c400f9aedb42cd27cb4ceb697ca36d1e58cb/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0x81ea9f74ef7d935b807474e38954ae3934856219a23e074954b2e860c5a3c400f9aedb42cd27cb4ceb697ca36d1e58cb/voting-keystore.json new file mode 100644 index 000000000..97c3fdf3d --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0x81ea9f74ef7d935b807474e38954ae3934856219a23e074954b2e860c5a3c400f9aedb42cd27cb4ceb697ca36d1e58cb/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"2a2e99081f3f44634c5e73b079cf5e3ce855a33032d1fb7df9376c590af99c27"},"message":""},"checksum":{"function":"sha256","params":{},"message":"626b9b4db0f705b71f786ea970114972def50f1489e1f20e62b050e8896556ae"},"cipher":{"function":"aes-128-ctr","params":{"iv":"165133464c00067e914f080859bd6660"},"message":"c5a809a113e4e03e3e9af6ced49c1c9ce7460be4e487085433f46845662b0c2f"}},"description":"0x81ea9f74ef7d935b807474e38954ae3934856219a23e074954b2e860c5a3c400f9aedb42cd27cb4ceb697ca36d1e58cb","pubkey":"81ea9f74ef7d935b807474e38954ae3934856219a23e074954b2e860c5a3c400f9aedb42cd27cb4ceb697ca36d1e58cb","path":"","uuid":"7ef682ad-e17b-467c-a54a-41c2a9212b65","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0x8419cf00f2783c430dc861a710984d0429d3b3a7f6db849b4f5c05e0d87339704c5c7f5eede6adfc8776d666587b5932/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0x8419cf00f2783c430dc861a710984d0429d3b3a7f6db849b4f5c05e0d87339704c5c7f5eede6adfc8776d666587b5932/voting-keystore.json new file mode 100644 index 000000000..8d59c1f04 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0x8419cf00f2783c430dc861a710984d0429d3b3a7f6db849b4f5c05e0d87339704c5c7f5eede6adfc8776d666587b5932/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"50ce342faa62f848df9574c313cd2b1e8e54c46d0b61f1aa26cac255ab1b8df9"},"message":""},"checksum":{"function":"sha256","params":{},"message":"bf6be1a6de5056740a6a23d0ce96ecf056e4fc2168b2cffe385ae0e9b95151fe"},"cipher":{"function":"aes-128-ctr","params":{"iv":"fd9f1e6fb0669ee85fd8b9dd87ade97b"},"message":"1d0d88569c781f99a8bcdfe77adf1cec6b4ecd18720f65e4bfbcd1aa7036033a"}},"description":"0x8419cf00f2783c430dc861a710984d0429d3b3a7f6db849b4f5c05e0d87339704c5c7f5eede6adfc8776d666587b5932","pubkey":"8419cf00f2783c430dc861a710984d0429d3b3a7f6db849b4f5c05e0d87339704c5c7f5eede6adfc8776d666587b5932","path":"","uuid":"bba75357-fcdf-4441-be4d-2ae794c262bd","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0x84a687ffdf21a0ad754d0164d1e2c03035613ab76359e7f5cf51ea4a425a6ee026725ec0a0dbd336f7dab759596f0bf8/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0x84a687ffdf21a0ad754d0164d1e2c03035613ab76359e7f5cf51ea4a425a6ee026725ec0a0dbd336f7dab759596f0bf8/voting-keystore.json new file mode 100644 index 000000000..c34a8da91 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0x84a687ffdf21a0ad754d0164d1e2c03035613ab76359e7f5cf51ea4a425a6ee026725ec0a0dbd336f7dab759596f0bf8/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"38c8b764995108cd73ae03fb4df45e08a2fd4b6149c43379353e6343f5e8b90c"},"message":""},"checksum":{"function":"sha256","params":{},"message":"7ae8ec9b327d7a025f5d38488dd1cf9a9b990b18b7920b9e41dfb545c398628f"},"cipher":{"function":"aes-128-ctr","params":{"iv":"8b41b32e094532bf9b425507d4eef378"},"message":"fb21e36d424cdde1c5a87cd81539947c161fb04505fe08acae237dd1e540a98c"}},"description":"0x84a687ffdf21a0ad754d0164d1e2c03035613ab76359e7f5cf51ea4a425a6ee026725ec0a0dbd336f7dab759596f0bf8","pubkey":"84a687ffdf21a0ad754d0164d1e2c03035613ab76359e7f5cf51ea4a425a6ee026725ec0a0dbd336f7dab759596f0bf8","path":"","uuid":"9313bc22-c3cc-4e47-9e7a-59de6938a8a7","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0x87231421a08ed28e7d357e2b37a26a458155c8d822d829344bd1029e5d175b5edfaa78f16f784f724a2caef124944c4f/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0x87231421a08ed28e7d357e2b37a26a458155c8d822d829344bd1029e5d175b5edfaa78f16f784f724a2caef124944c4f/voting-keystore.json new file mode 100644 index 000000000..8bcf0d9e1 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0x87231421a08ed28e7d357e2b37a26a458155c8d822d829344bd1029e5d175b5edfaa78f16f784f724a2caef124944c4f/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"754eb44c6b05ed7fdcdbbc3841fad3214d4b751404b5e73df034cfe8694511b5"},"message":""},"checksum":{"function":"sha256","params":{},"message":"640dde460b068ab307783d27744c4965b2ba3b8ece2db3d9127c6e0224167850"},"cipher":{"function":"aes-128-ctr","params":{"iv":"c2f135b28d239073cb5206e019dbbc51"},"message":"a5e4114e2bb1e4ddcd6219064ce51886fa6a5e3b37e4709db702afd7d016418a"}},"description":"0x87231421a08ed28e7d357e2b37a26a458155c8d822d829344bd1029e5d175b5edfaa78f16f784f724a2caef124944c4f","pubkey":"87231421a08ed28e7d357e2b37a26a458155c8d822d829344bd1029e5d175b5edfaa78f16f784f724a2caef124944c4f","path":"","uuid":"7cbc504e-989d-4f0c-88dc-3605c322622f","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0x8a8bb292bcc481070d3afdbbc8789e2ab4b29c9603936e6d85f5ff71e23fc5b6d61009f0fa636b5d5b2dc309d39e3d75/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0x8a8bb292bcc481070d3afdbbc8789e2ab4b29c9603936e6d85f5ff71e23fc5b6d61009f0fa636b5d5b2dc309d39e3d75/voting-keystore.json new file mode 100644 index 000000000..9efa2ab49 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0x8a8bb292bcc481070d3afdbbc8789e2ab4b29c9603936e6d85f5ff71e23fc5b6d61009f0fa636b5d5b2dc309d39e3d75/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"22c551538a5126f6d8acdfcc7ce8da3e1f31dd3bc6bb18b311c4ebe612cd6953"},"message":""},"checksum":{"function":"sha256","params":{},"message":"b1598d17ff4307d245c8c078e1c150f45e36284ac8a412699530cf02ecc4e513"},"cipher":{"function":"aes-128-ctr","params":{"iv":"657cdbcafd3cb6ab495d90916a42e09c"},"message":"24f00f8db95ccddb572a01c0645227a8d5d314a615904fd6d041428c94b83af7"}},"description":"0x8a8bb292bcc481070d3afdbbc8789e2ab4b29c9603936e6d85f5ff71e23fc5b6d61009f0fa636b5d5b2dc309d39e3d75","pubkey":"8a8bb292bcc481070d3afdbbc8789e2ab4b29c9603936e6d85f5ff71e23fc5b6d61009f0fa636b5d5b2dc309d39e3d75","path":"","uuid":"38b7eba0-0c08-4b88-a6eb-8a6b8ebcc871","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0x8aa5bbee21e98c7b9e7a4c8ea45aa99f89e22992fa4fc2d73869d77da4cc8a05b25b61931ff521986677dd7f7159e8e6/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0x8aa5bbee21e98c7b9e7a4c8ea45aa99f89e22992fa4fc2d73869d77da4cc8a05b25b61931ff521986677dd7f7159e8e6/voting-keystore.json new file mode 100644 index 000000000..79053066b --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0x8aa5bbee21e98c7b9e7a4c8ea45aa99f89e22992fa4fc2d73869d77da4cc8a05b25b61931ff521986677dd7f7159e8e6/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"5fc82922d6a3b56c127fafedce08f7dd485c119af6fe7210c593a15ec2f6a4b1"},"message":""},"checksum":{"function":"sha256","params":{},"message":"f56d614600c930b3093abd3c2a142b125d5a0b10dc01f6d90b693ac15d5056a2"},"cipher":{"function":"aes-128-ctr","params":{"iv":"893c684da1616a2b978a9b642f4adc8f"},"message":"5eb88a63416f2c330a3816725f0d34fc38febda8e0431642d08f90b62cfedfb2"}},"description":"0x8aa5bbee21e98c7b9e7a4c8ea45aa99f89e22992fa4fc2d73869d77da4cc8a05b25b61931ff521986677dd7f7159e8e6","pubkey":"8aa5bbee21e98c7b9e7a4c8ea45aa99f89e22992fa4fc2d73869d77da4cc8a05b25b61931ff521986677dd7f7159e8e6","path":"","uuid":"e48ff448-38eb-4b2e-811c-25b734c9c125","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0x8d46e9aa0c1986056e407efc7013b7f271027d3c98ce96667faa98074ab0588a61681faf78644c11819a459a95689dab/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0x8d46e9aa0c1986056e407efc7013b7f271027d3c98ce96667faa98074ab0588a61681faf78644c11819a459a95689dab/voting-keystore.json new file mode 100644 index 000000000..f31628e48 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0x8d46e9aa0c1986056e407efc7013b7f271027d3c98ce96667faa98074ab0588a61681faf78644c11819a459a95689dab/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"5ccefb67de4aa473b14a6e8924ebe75b7cdf0aa4b5f4eba45b3050638ebdc540"},"message":""},"checksum":{"function":"sha256","params":{},"message":"32f2505d9f610f27419c3e24e379a874f2f24dfa37505933da6faf45e0e2563c"},"cipher":{"function":"aes-128-ctr","params":{"iv":"7d130535cda9c5560abeeeaa28fa91ee"},"message":"db6d4a726e2c501cf130ed3e676881c7c92022f4e7eeb1e15b83bb6751e0fb56"}},"description":"0x8d46e9aa0c1986056e407efc7013b7f271027d3c98ce96667faa98074ab0588a61681faf78644c11819a459a95689dab","pubkey":"8d46e9aa0c1986056e407efc7013b7f271027d3c98ce96667faa98074ab0588a61681faf78644c11819a459a95689dab","path":"","uuid":"5cca9e94-3149-498d-a1f8-3cb50f5fc37d","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0x8de5a6200cebb09b2198e69fed84bcd512ec5cf317c5f1ee99aad03d2a9a8564bf3807c08da2664222268d59c34a06e4/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0x8de5a6200cebb09b2198e69fed84bcd512ec5cf317c5f1ee99aad03d2a9a8564bf3807c08da2664222268d59c34a06e4/voting-keystore.json new file mode 100644 index 000000000..42d4066e3 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0x8de5a6200cebb09b2198e69fed84bcd512ec5cf317c5f1ee99aad03d2a9a8564bf3807c08da2664222268d59c34a06e4/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"15081a6a3959643b42b57aa14a04330078b790b3703ab2417cc12e5078cb67c4"},"message":""},"checksum":{"function":"sha256","params":{},"message":"a2424d9a8e5f88fa640d8ae7662fa0535467802d5a453c02df44979e93e67158"},"cipher":{"function":"aes-128-ctr","params":{"iv":"b9534b4f146a155db58c392c424598e4"},"message":"5145c94106d5700b3eeb83397b44141fd693630c3d2da5b8c192ace6ea716e05"}},"description":"0x8de5a6200cebb09b2198e69fed84bcd512ec5cf317c5f1ee99aad03d2a9a8564bf3807c08da2664222268d59c34a06e4","pubkey":"8de5a6200cebb09b2198e69fed84bcd512ec5cf317c5f1ee99aad03d2a9a8564bf3807c08da2664222268d59c34a06e4","path":"","uuid":"fe505f6d-504b-4efa-afc1-143c6b63028a","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0x91709ee06497b9ac049325853d64947290189a8c2322e3a500d91e23ea02dc158b6db63ae558b3b7670357a151cd6071/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0x91709ee06497b9ac049325853d64947290189a8c2322e3a500d91e23ea02dc158b6db63ae558b3b7670357a151cd6071/voting-keystore.json new file mode 100644 index 000000000..60328b40a --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0x91709ee06497b9ac049325853d64947290189a8c2322e3a500d91e23ea02dc158b6db63ae558b3b7670357a151cd6071/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"27b69ffcaf55d9e3884a75298e5a95660d94fc53983d8a86c8aa9f19aa761670"},"message":""},"checksum":{"function":"sha256","params":{},"message":"8045df2eea34e1a326373c042b1802616549b24840183e948c08a931a6ecae9a"},"cipher":{"function":"aes-128-ctr","params":{"iv":"7a51bb36f7de674e8f05f94339acaecf"},"message":"7529f75843df106aa71dd6762e4e852ab35295ceb81e38214af95fd37041086c"}},"description":"0x91709ee06497b9ac049325853d64947290189a8c2322e3a500d91e23ea02dc158b6db63ae558b3b7670357a151cd6071","pubkey":"91709ee06497b9ac049325853d64947290189a8c2322e3a500d91e23ea02dc158b6db63ae558b3b7670357a151cd6071","path":"","uuid":"9c48003a-283e-4614-9647-44e2485b7899","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0x930743bfc7e18d3bd7351eaa74f477505268c1e4e1fd1ca3ccccdefb2595517343bbb8f5589c435c3c39323a4c0080f8/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0x930743bfc7e18d3bd7351eaa74f477505268c1e4e1fd1ca3ccccdefb2595517343bbb8f5589c435c3c39323a4c0080f8/voting-keystore.json new file mode 100644 index 000000000..817176ed2 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0x930743bfc7e18d3bd7351eaa74f477505268c1e4e1fd1ca3ccccdefb2595517343bbb8f5589c435c3c39323a4c0080f8/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"586798b1b0983a9cd54b281283ebbe01c25e08482a2fd2c6e00f3d124a1fd5d1"},"message":""},"checksum":{"function":"sha256","params":{},"message":"dd7d2d86d574cf9a6c6f7fe3ac0de9649178a95d44f7575af22e1c500f5a3553"},"cipher":{"function":"aes-128-ctr","params":{"iv":"9009c6c729ec27470ad0bb1eeb8c1227"},"message":"749e1b3c69a7bf4733610a5df95366f15c5bcb9d6182c54c603864293069cd4c"}},"description":"0x930743bfc7e18d3bd7351eaa74f477505268c1e4e1fd1ca3ccccdefb2595517343bbb8f5589c435c3c39323a4c0080f8","pubkey":"930743bfc7e18d3bd7351eaa74f477505268c1e4e1fd1ca3ccccdefb2595517343bbb8f5589c435c3c39323a4c0080f8","path":"","uuid":"d5fa5791-b381-4e34-b5bd-d395a1e3ccc3","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0x96947de9e6068c22a7716656a2755a9551b0b66c2d1a741bf84a088fe1e840e992dc39861bf8ba3e8d5b6d21e8f57e64/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0x96947de9e6068c22a7716656a2755a9551b0b66c2d1a741bf84a088fe1e840e992dc39861bf8ba3e8d5b6d21e8f57e64/voting-keystore.json new file mode 100644 index 000000000..1dfff9961 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0x96947de9e6068c22a7716656a2755a9551b0b66c2d1a741bf84a088fe1e840e992dc39861bf8ba3e8d5b6d21e8f57e64/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"63e05898e457ab85e2dee0c8da10fdda630558a0a3900ea09da484be8dbd9967"},"message":""},"checksum":{"function":"sha256","params":{},"message":"936dfff7aaed5a48bbc15e308f4079ea18127803be71a974a2acc60db980bef1"},"cipher":{"function":"aes-128-ctr","params":{"iv":"59357db2000d776034a0c5e89d36cd22"},"message":"75ab389e3d57401013883972c5f23602fc2909cc1c7a2ad8c22bd26f59f56aa1"}},"description":"0x96947de9e6068c22a7716656a2755a9551b0b66c2d1a741bf84a088fe1e840e992dc39861bf8ba3e8d5b6d21e8f57e64","pubkey":"96947de9e6068c22a7716656a2755a9551b0b66c2d1a741bf84a088fe1e840e992dc39861bf8ba3e8d5b6d21e8f57e64","path":"","uuid":"00c54fed-7953-439f-ac28-4d4bad382a41","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0x996323af7e545fb6363ace53f1538c7ddc3eb0d985b2479da3ee4ace10cbc393b518bf02d1a2ddb2f5bdf09b473933ea/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0x996323af7e545fb6363ace53f1538c7ddc3eb0d985b2479da3ee4ace10cbc393b518bf02d1a2ddb2f5bdf09b473933ea/voting-keystore.json new file mode 100644 index 000000000..9f24ed54c --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0x996323af7e545fb6363ace53f1538c7ddc3eb0d985b2479da3ee4ace10cbc393b518bf02d1a2ddb2f5bdf09b473933ea/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"41f4391f34c1d1fbef3eb00a379db3bf7fd917ce71dddb007105cd41e5d29891"},"message":""},"checksum":{"function":"sha256","params":{},"message":"0ffaa28fa028d99c0782bf11a72da203cabc3a45e6ef35909a1277cdcf3218cb"},"cipher":{"function":"aes-128-ctr","params":{"iv":"501d50680e3075df7fa00a68929adcd1"},"message":"44a19907c6286ae3226b4f10f6bc744e752706750a8735669f10e807ebe31513"}},"description":"0x996323af7e545fb6363ace53f1538c7ddc3eb0d985b2479da3ee4ace10cbc393b518bf02d1a2ddb2f5bdf09b473933ea","pubkey":"996323af7e545fb6363ace53f1538c7ddc3eb0d985b2479da3ee4ace10cbc393b518bf02d1a2ddb2f5bdf09b473933ea","path":"","uuid":"8f3eb0ae-dbb9-4d0e-b3e1-293ad94dec02","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0x996d10c3026b9344532b06c70a596f972a1e779a1f6106d3da9f6ba376bbf7ec82d2f52629e5dbf3f7d03b00f6b862af/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0x996d10c3026b9344532b06c70a596f972a1e779a1f6106d3da9f6ba376bbf7ec82d2f52629e5dbf3f7d03b00f6b862af/voting-keystore.json new file mode 100644 index 000000000..d615a7eb7 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0x996d10c3026b9344532b06c70a596f972a1e779a1f6106d3da9f6ba376bbf7ec82d2f52629e5dbf3f7d03b00f6b862af/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"8f1a1499d041e6cc22257abd95660db857b6876f169c58f6ca556aa99638e354"},"message":""},"checksum":{"function":"sha256","params":{},"message":"cf63ec13187a2604fbd0bdc6b6e9cfaca8ecf610ad0d4642b940faa3eefea8b1"},"cipher":{"function":"aes-128-ctr","params":{"iv":"cfc92b4683f440427cfbafb62782cc31"},"message":"f5ca4fbdab0977a91dd40d6c957668048d67049f12b1161d8bb3da41a119ff7a"}},"description":"0x996d10c3026b9344532b06c70a596f972a1e779a1f6106d3da9f6ba376bbf7ec82d2f52629e5dbf3f7d03b00f6b862af","pubkey":"996d10c3026b9344532b06c70a596f972a1e779a1f6106d3da9f6ba376bbf7ec82d2f52629e5dbf3f7d03b00f6b862af","path":"","uuid":"5cf506c7-6a09-4139-b298-f07b02bdc643","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xa03c2a82374e04b2e0594c4ce14fb3f225b46f13188f0d8002a523c7dcfb939ae4856053c2c9c695374d7c3685df1ca5/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xa03c2a82374e04b2e0594c4ce14fb3f225b46f13188f0d8002a523c7dcfb939ae4856053c2c9c695374d7c3685df1ca5/voting-keystore.json new file mode 100644 index 000000000..857ceeda3 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xa03c2a82374e04b2e0594c4ce14fb3f225b46f13188f0d8002a523c7dcfb939ae4856053c2c9c695374d7c3685df1ca5/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"200b09be686266f3767c599168ada8bf61fc27d091fc0d894161b601719ce7b8"},"message":""},"checksum":{"function":"sha256","params":{},"message":"6b28f90fae44774ff87c5b48d688557d3931fedc1e21a9df5a133d741bf8b050"},"cipher":{"function":"aes-128-ctr","params":{"iv":"f61bbdce20571f4dd4eac392ec3ca32f"},"message":"94d30a9a147c52e96fe01e2ba51691a08b887ae153b618bd975e69937cde4360"}},"description":"0xa03c2a82374e04b2e0594c4ce14fb3f225b46f13188f0d8002a523c7dcfb939ae4856053c2c9c695374d7c3685df1ca5","pubkey":"a03c2a82374e04b2e0594c4ce14fb3f225b46f13188f0d8002a523c7dcfb939ae4856053c2c9c695374d7c3685df1ca5","path":"","uuid":"fa7cd4db-056e-476e-a949-6e56f029a416","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xa1584dfe1573df8ec88c7b74d76726b4821bfe84bf886dd3c0e3f74c2ea18aa62ca44c871fb1c63971fccf6937e6501f/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xa1584dfe1573df8ec88c7b74d76726b4821bfe84bf886dd3c0e3f74c2ea18aa62ca44c871fb1c63971fccf6937e6501f/voting-keystore.json new file mode 100644 index 000000000..04f54d6a5 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xa1584dfe1573df8ec88c7b74d76726b4821bfe84bf886dd3c0e3f74c2ea18aa62ca44c871fb1c63971fccf6937e6501f/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"138175c9f91425c8de63864c4887713585004fe4a9b4126e56a7add4fe71a26a"},"message":""},"checksum":{"function":"sha256","params":{},"message":"8b8998d36aa0cc15c6bbc974bba6ccb172dfe95f2431de8813e3433216a267b5"},"cipher":{"function":"aes-128-ctr","params":{"iv":"e6df1f20454e469f52dde9dbf783c6dd"},"message":"5b7fcc744a4643f520fb5a89634ec3be3e0176a26cc097239ffc6e0eac3d9c27"}},"description":"0xa1584dfe1573df8ec88c7b74d76726b4821bfe84bf886dd3c0e3f74c2ea18aa62ca44c871fb1c63971fccf6937e6501f","pubkey":"a1584dfe1573df8ec88c7b74d76726b4821bfe84bf886dd3c0e3f74c2ea18aa62ca44c871fb1c63971fccf6937e6501f","path":"","uuid":"04ad2f0a-b15f-47d8-9621-a2f7ae1da957","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xa1d9840eda3036fbf63eeea40146e4548553e6e1b2a653ab349b376f31b367c40d71fb59ff8e94b91daa99c262ec8b52/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xa1d9840eda3036fbf63eeea40146e4548553e6e1b2a653ab349b376f31b367c40d71fb59ff8e94b91daa99c262ec8b52/voting-keystore.json new file mode 100644 index 000000000..fc6e38be2 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xa1d9840eda3036fbf63eeea40146e4548553e6e1b2a653ab349b376f31b367c40d71fb59ff8e94b91daa99c262ec8b52/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"682074132dec5cc76e1647487bbf9146e67965f2697a35041608485ce598e5b2"},"message":""},"checksum":{"function":"sha256","params":{},"message":"467d577e4591748782eabfde0a8aea6c0b4d0e62d1624c2cad29296f3ece965b"},"cipher":{"function":"aes-128-ctr","params":{"iv":"37e46657cc42a268d00492ffef93a0a8"},"message":"f952d4f7ee86e1a995f6860934ee838b1ad0b5560ea3468dc388f5703eeedeec"}},"description":"0xa1d9840eda3036fbf63eeea40146e4548553e6e1b2a653ab349b376f31b367c40d71fb59ff8e94b91daa99c262ec8b52","pubkey":"a1d9840eda3036fbf63eeea40146e4548553e6e1b2a653ab349b376f31b367c40d71fb59ff8e94b91daa99c262ec8b52","path":"","uuid":"757939aa-f987-4cef-a1b2-88b2296ce568","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xa35c6004f387430c3797ab0157af7b824c8fe106241c7cdeb897d900c0f9e4bb945ff2a6b88cbd10e35ec48aaa554ecb/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xa35c6004f387430c3797ab0157af7b824c8fe106241c7cdeb897d900c0f9e4bb945ff2a6b88cbd10e35ec48aaa554ecb/voting-keystore.json new file mode 100644 index 000000000..c088f5f77 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xa35c6004f387430c3797ab0157af7b824c8fe106241c7cdeb897d900c0f9e4bb945ff2a6b88cbd10e35ec48aaa554ecb/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"c9dec4cc84b90e052f1e2a9dae753c8e8c374a54cb25766315a75a8c5cce59ba"},"message":""},"checksum":{"function":"sha256","params":{},"message":"8e219831653cb3cce5bb5b48776d84c665392d82e069137fd8324e57661cab49"},"cipher":{"function":"aes-128-ctr","params":{"iv":"5157c4cde7ad4d0a416d88a283f30096"},"message":"fb1d78bb7ab5469aa17d63eeaf79bd1ed4fd70c435681bdca9ff0fca874f6cc7"}},"description":"0xa35c6004f387430c3797ab0157af7b824c8fe106241c7cdeb897d900c0f9e4bb945ff2a6b88cbd10e35ec48aaa554ecb","pubkey":"a35c6004f387430c3797ab0157af7b824c8fe106241c7cdeb897d900c0f9e4bb945ff2a6b88cbd10e35ec48aaa554ecb","path":"","uuid":"67f42de7-fc6d-4f27-b3d3-63b6fd62fc65","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xa54fe5c26059ed60b4f0b66ef7b0bf167580504525f83c169507dc812816df41b1da6128341c23977300dffd32a32f41/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xa54fe5c26059ed60b4f0b66ef7b0bf167580504525f83c169507dc812816df41b1da6128341c23977300dffd32a32f41/voting-keystore.json new file mode 100644 index 000000000..db497d171 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xa54fe5c26059ed60b4f0b66ef7b0bf167580504525f83c169507dc812816df41b1da6128341c23977300dffd32a32f41/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"4f9441901a303d31ce37c5da83e5e8f1ed67088ba28419718598272800f85d74"},"message":""},"checksum":{"function":"sha256","params":{},"message":"68ee1733c8e58f30d7d46ea951fe5cc96e1cad503cd2eeb81a632c791dcea90b"},"cipher":{"function":"aes-128-ctr","params":{"iv":"a01ba35f529f16359e67d0a67f862e55"},"message":"3651eb1fa2289a9b55af5384674351705a4c113c6eb60a5a52bd668c45e4d559"}},"description":"0xa54fe5c26059ed60b4f0b66ef7b0bf167580504525f83c169507dc812816df41b1da6128341c23977300dffd32a32f41","pubkey":"a54fe5c26059ed60b4f0b66ef7b0bf167580504525f83c169507dc812816df41b1da6128341c23977300dffd32a32f41","path":"","uuid":"0dee2eaa-5935-45c9-bf91-2ce8a0f09188","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xa75ca9447dca3a3745ada36731187ddd1f6a152cf15d7446b785eab381e5c8562c1202a6e7a24080bc6b619a161113db/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xa75ca9447dca3a3745ada36731187ddd1f6a152cf15d7446b785eab381e5c8562c1202a6e7a24080bc6b619a161113db/voting-keystore.json new file mode 100644 index 000000000..1532396f4 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xa75ca9447dca3a3745ada36731187ddd1f6a152cf15d7446b785eab381e5c8562c1202a6e7a24080bc6b619a161113db/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"931e7ea2ccc4632146539ae4cba803c0ed67420e54e9d9d79cc65a74674b5591"},"message":""},"checksum":{"function":"sha256","params":{},"message":"b25f021f2ce6d7761a696bd62fcefa7ac9b757147615e4765ac9754ce118e301"},"cipher":{"function":"aes-128-ctr","params":{"iv":"c81acda9bdd5c390ba720710d03d5881"},"message":"ea2f82e1adf200abb628844f8ced24be13c7e28514947437e34145ce984a93d6"}},"description":"0xa75ca9447dca3a3745ada36731187ddd1f6a152cf15d7446b785eab381e5c8562c1202a6e7a24080bc6b619a161113db","pubkey":"a75ca9447dca3a3745ada36731187ddd1f6a152cf15d7446b785eab381e5c8562c1202a6e7a24080bc6b619a161113db","path":"","uuid":"e300fd01-792e-4718-bc14-1ccb529fd5a8","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xa804e4fa8d1391a9d078aa93985a12503b84ce4f6f1f9e70ab7fca421e1cf972538666299d4c1bfc39327b469b2db7a8/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xa804e4fa8d1391a9d078aa93985a12503b84ce4f6f1f9e70ab7fca421e1cf972538666299d4c1bfc39327b469b2db7a8/voting-keystore.json new file mode 100644 index 000000000..d4e7c7b31 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xa804e4fa8d1391a9d078aa93985a12503b84ce4f6f1f9e70ab7fca421e1cf972538666299d4c1bfc39327b469b2db7a8/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"22dde765bdb763f4fedf1e5854cddc7abe3d7fe87e1b97a972fc364d6b2d8b9d"},"message":""},"checksum":{"function":"sha256","params":{},"message":"fd224bea1372d2feba3fbe6aba6724cc3b7c0d60bb719bc4a4bd80b9f0d0ff9e"},"cipher":{"function":"aes-128-ctr","params":{"iv":"7c60acf762bf651b619f98d4d392c027"},"message":"07783121901ac016c01a2731a7cffd6c386af757234c1aada2a845e24c792e32"}},"description":"0xa804e4fa8d1391a9d078aa93985a12503b84ce4f6f1f9e70ab7fca421e1cf972538666299d4c1bfc39327b469b2db7a8","pubkey":"a804e4fa8d1391a9d078aa93985a12503b84ce4f6f1f9e70ab7fca421e1cf972538666299d4c1bfc39327b469b2db7a8","path":"","uuid":"72b953c4-8e95-4b8a-bc98-61a95b58cb20","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xaaddb0cb69ca18f14aed7054e98a24df0ff606aeff919d489f7884fd1bd183bcb46ea54bc363146e1a88db36dc20a7a4/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xaaddb0cb69ca18f14aed7054e98a24df0ff606aeff919d489f7884fd1bd183bcb46ea54bc363146e1a88db36dc20a7a4/voting-keystore.json new file mode 100644 index 000000000..e886f33ca --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xaaddb0cb69ca18f14aed7054e98a24df0ff606aeff919d489f7884fd1bd183bcb46ea54bc363146e1a88db36dc20a7a4/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"dbef2aafe19e2fb2a6cf68eebdf261ff447d174ff69805869fb11870d6081c2b"},"message":""},"checksum":{"function":"sha256","params":{},"message":"b836d69123af0eb7b3b8810d26b156727b043a642a415516abc22a408d6832b5"},"cipher":{"function":"aes-128-ctr","params":{"iv":"5f37825f271dc8724f160778e276042f"},"message":"ad41a3fea964e3775b18e7d9def72fdf197b80bdd91a7e3f088c1ec4deeba8c3"}},"description":"0xaaddb0cb69ca18f14aed7054e98a24df0ff606aeff919d489f7884fd1bd183bcb46ea54bc363146e1a88db36dc20a7a4","pubkey":"aaddb0cb69ca18f14aed7054e98a24df0ff606aeff919d489f7884fd1bd183bcb46ea54bc363146e1a88db36dc20a7a4","path":"","uuid":"9b885749-f312-45af-9672-db7edc662e8b","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xaaf6c1251e73fb600624937760fef218aace5b253bf068ed45398aeb29d821e4d2899343ddcbbe37cb3f6cf500dff26c/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xaaf6c1251e73fb600624937760fef218aace5b253bf068ed45398aeb29d821e4d2899343ddcbbe37cb3f6cf500dff26c/voting-keystore.json new file mode 100644 index 000000000..fc25bb9d6 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xaaf6c1251e73fb600624937760fef218aace5b253bf068ed45398aeb29d821e4d2899343ddcbbe37cb3f6cf500dff26c/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"a1772b8770416db2982250247c3c37fe4eccb0706371c80a914e279bf129e3dc"},"message":""},"checksum":{"function":"sha256","params":{},"message":"301a47d72e40aec2640bbbd5b6524522e6fc4133cee756d73325377798b78e90"},"cipher":{"function":"aes-128-ctr","params":{"iv":"36ad1c69103d6951f6388e1e303d2fa5"},"message":"3e19bdc5a9509140fa3bdf221d133d46ab9dd43b5e1d1b7e24d9d1d3d92a69c6"}},"description":"0xaaf6c1251e73fb600624937760fef218aace5b253bf068ed45398aeb29d821e4d2899343ddcbbe37cb3f6cf500dff26c","pubkey":"aaf6c1251e73fb600624937760fef218aace5b253bf068ed45398aeb29d821e4d2899343ddcbbe37cb3f6cf500dff26c","path":"","uuid":"b8fc724f-b604-4d6d-8d85-62079488cd3e","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xab72cbc6575c3179680a58c0ecd5de46d2678ccbafc016746348ee5688edcb21b4e15bd37c70c508e3ea73103c2d566b/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xab72cbc6575c3179680a58c0ecd5de46d2678ccbafc016746348ee5688edcb21b4e15bd37c70c508e3ea73103c2d566b/voting-keystore.json new file mode 100644 index 000000000..35ec204a6 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xab72cbc6575c3179680a58c0ecd5de46d2678ccbafc016746348ee5688edcb21b4e15bd37c70c508e3ea73103c2d566b/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"134bcf0fb3bd12a40a8f56f5d501ad32cb2997b1e57127ecb68174b1aa67572f"},"message":""},"checksum":{"function":"sha256","params":{},"message":"a32ebbafdd9bcbe17e42b6b792329e825269037f2bf2e162694e697ce60e0f52"},"cipher":{"function":"aes-128-ctr","params":{"iv":"8b338c77547910599c8c746b13e29c45"},"message":"2b014341fb98f9efc8c8bc5f38140d274a3f7db79bf2fe48d0808e77dffc8c4b"}},"description":"0xab72cbc6575c3179680a58c0ecd5de46d2678ccbafc016746348ee5688edcb21b4e15bd37c70c508e3ea73103c2d566b","pubkey":"ab72cbc6575c3179680a58c0ecd5de46d2678ccbafc016746348ee5688edcb21b4e15bd37c70c508e3ea73103c2d566b","path":"","uuid":"03e47af2-e1f4-401f-8fdb-533d88f7c58b","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xabd12678c73463ecea5867a80caf256d5c5e6ba53ff188b143a4d5be83365ad257edf39eaa1ba8753c4cdf4c632ff99e/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xabd12678c73463ecea5867a80caf256d5c5e6ba53ff188b143a4d5be83365ad257edf39eaa1ba8753c4cdf4c632ff99e/voting-keystore.json new file mode 100644 index 000000000..3ed4f1d92 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xabd12678c73463ecea5867a80caf256d5c5e6ba53ff188b143a4d5be83365ad257edf39eaa1ba8753c4cdf4c632ff99e/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"8e4d0293c4cb76bf079c26ffcbec614fdeef98a8dccac7f3625f755677f2561c"},"message":""},"checksum":{"function":"sha256","params":{},"message":"f0775f94d9f44868e103f6f72b147d8f11426120ec951e608e00f518904f67c6"},"cipher":{"function":"aes-128-ctr","params":{"iv":"aa16d15abd4560bce198fe1394741fe9"},"message":"75e717379b4f8c5b1ce255bd5671067687948f3c26392cdf4857c977bb33295c"}},"description":"0xabd12678c73463ecea5867a80caf256d5c5e6ba53ff188b143a4d5be83365ad257edf39eaa1ba8753c4cdf4c632ff99e","pubkey":"abd12678c73463ecea5867a80caf256d5c5e6ba53ff188b143a4d5be83365ad257edf39eaa1ba8753c4cdf4c632ff99e","path":"","uuid":"ca0eeeb8-8a3b-4157-9b4c-43a6e5607269","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xac69ae9e6c385a368df71d11ac68f45f05e005306df3c2bf98ed3577708256bd97f8c09d3f72115444077a9bb711d8d1/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xac69ae9e6c385a368df71d11ac68f45f05e005306df3c2bf98ed3577708256bd97f8c09d3f72115444077a9bb711d8d1/voting-keystore.json new file mode 100644 index 000000000..483103501 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xac69ae9e6c385a368df71d11ac68f45f05e005306df3c2bf98ed3577708256bd97f8c09d3f72115444077a9bb711d8d1/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"526d87dbfddfda859a89601a584aff34186425f8241b9a886044a77e33b37ded"},"message":""},"checksum":{"function":"sha256","params":{},"message":"2e6ff061b119e326ad88aad0d90034dbc24961a135a13263fc05ad4227d53742"},"cipher":{"function":"aes-128-ctr","params":{"iv":"8aee8b3e69438b10be1f916b0ee3e608"},"message":"9e753dceeb7d8adf306674cc964892a7358df1c04c6b236e5c6d288a274d4412"}},"description":"0xac69ae9e6c385a368df71d11ac68f45f05e005306df3c2bf98ed3577708256bd97f8c09d3f72115444077a9bb711d8d1","pubkey":"ac69ae9e6c385a368df71d11ac68f45f05e005306df3c2bf98ed3577708256bd97f8c09d3f72115444077a9bb711d8d1","path":"","uuid":"21c3b6f7-23a3-45e3-8444-6428ba673c6e","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xad9222dec71ff8ee6bc0426ffe7b5e66f96738225db281dd20027a1556d089fdebd040abfbc2041d6c1a0d8fdcfce183/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xad9222dec71ff8ee6bc0426ffe7b5e66f96738225db281dd20027a1556d089fdebd040abfbc2041d6c1a0d8fdcfce183/voting-keystore.json new file mode 100644 index 000000000..9ce2db384 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xad9222dec71ff8ee6bc0426ffe7b5e66f96738225db281dd20027a1556d089fdebd040abfbc2041d6c1a0d8fdcfce183/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"4ff0333603052e80a2d903d61f279ef1e140b0e55ac47bdaffd061d02a4d7abf"},"message":""},"checksum":{"function":"sha256","params":{},"message":"b3535c2d432a6dfba1f5a3b0c241cee1e459d2bc8943cce2222cf58872646ffd"},"cipher":{"function":"aes-128-ctr","params":{"iv":"58fec23cecca2230f870d82b3151d5e8"},"message":"17e754cf5ee643e7c8442cb5d8daa711784437910070c2c579998f76cda425ef"}},"description":"0xad9222dec71ff8ee6bc0426ffe7b5e66f96738225db281dd20027a1556d089fdebd040abfbc2041d6c1a0d8fdcfce183","pubkey":"ad9222dec71ff8ee6bc0426ffe7b5e66f96738225db281dd20027a1556d089fdebd040abfbc2041d6c1a0d8fdcfce183","path":"","uuid":"46723964-9060-4c82-b1c5-d7177c96672b","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xae5302796cfeca685eaf37ffd5baeb32121f2f07415bee26cc0051ee513ff3932d2c365e3d9f87b0949a5980445cb64c/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xae5302796cfeca685eaf37ffd5baeb32121f2f07415bee26cc0051ee513ff3932d2c365e3d9f87b0949a5980445cb64c/voting-keystore.json new file mode 100644 index 000000000..f011e5ce5 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xae5302796cfeca685eaf37ffd5baeb32121f2f07415bee26cc0051ee513ff3932d2c365e3d9f87b0949a5980445cb64c/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"1b842a26b0c7eb587e8e3373ad5569756f4acfd8f73e815d6640512f791d71c2"},"message":""},"checksum":{"function":"sha256","params":{},"message":"305d355d2041c556a17aff536770eecabb97004821d67cb80b4649e8b055b31f"},"cipher":{"function":"aes-128-ctr","params":{"iv":"1d729d9aed577493b5b56fff878a7764"},"message":"be7dce5a4765a7830d5d672f836606343d33913a1e6128516c92358f0ee14d04"}},"description":"0xae5302796cfeca685eaf37ffd5baeb32121f2f07415bee26cc0051ee513ff3932d2c365e3d9f87b0949a5980445cb64c","pubkey":"ae5302796cfeca685eaf37ffd5baeb32121f2f07415bee26cc0051ee513ff3932d2c365e3d9f87b0949a5980445cb64c","path":"","uuid":"70ab074f-b273-415f-b6aa-bad700d59063","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xae940a07850cf904b44f31cbf0e44824bae5ec36dcfdb7fad858f2a39dba38de82ca12b0ae939a34fce7a02e4b9789f8/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xae940a07850cf904b44f31cbf0e44824bae5ec36dcfdb7fad858f2a39dba38de82ca12b0ae939a34fce7a02e4b9789f8/voting-keystore.json new file mode 100644 index 000000000..06066dca4 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xae940a07850cf904b44f31cbf0e44824bae5ec36dcfdb7fad858f2a39dba38de82ca12b0ae939a34fce7a02e4b9789f8/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"0da7bdc544e5ebb70eb2fad9b56467fe0679b4bafa422e69eaf3d833769c0d45"},"message":""},"checksum":{"function":"sha256","params":{},"message":"6cd9110ec2d2dfc6feee40feaaeaeb48c528e090597af511a089ed8a84a7e43b"},"cipher":{"function":"aes-128-ctr","params":{"iv":"4bf0acc4600f59ae8012f358f2e39e9d"},"message":"24946b7bfabfd1e7139e09314da0b09348ff6d7eb88110f25d7e9aadd0bf0862"}},"description":"0xae940a07850cf904b44f31cbf0e44824bae5ec36dcfdb7fad858f2a39dba38de82ca12b0ae939a34fce7a02e4b9789f8","pubkey":"ae940a07850cf904b44f31cbf0e44824bae5ec36dcfdb7fad858f2a39dba38de82ca12b0ae939a34fce7a02e4b9789f8","path":"","uuid":"188c3b58-bd99-4ffd-9f98-a8a77102d5b6","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xafa10af166a0dbf3a25ff86cd6f8e44cccc818c5e70cd70e4e98e226b158f3563450b3fb184d2649adbb11e53080d1ca/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xafa10af166a0dbf3a25ff86cd6f8e44cccc818c5e70cd70e4e98e226b158f3563450b3fb184d2649adbb11e53080d1ca/voting-keystore.json new file mode 100644 index 000000000..a03308c07 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xafa10af166a0dbf3a25ff86cd6f8e44cccc818c5e70cd70e4e98e226b158f3563450b3fb184d2649adbb11e53080d1ca/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"5dfc2de5b8d0d33bf80fed98e5059beee41e3fead686f18412d8f731736fc9f7"},"message":""},"checksum":{"function":"sha256","params":{},"message":"61de8e43d1dc0f600022717030f54e60570452b363291253b6e040226d4e39c1"},"cipher":{"function":"aes-128-ctr","params":{"iv":"b6d337601e10d229726b23b6149984f4"},"message":"acfc2545555b59aef1f0cb608adca50bdc1c4b4d7be3d15f5e1eea12de4ad1e2"}},"description":"0xafa10af166a0dbf3a25ff86cd6f8e44cccc818c5e70cd70e4e98e226b158f3563450b3fb184d2649adbb11e53080d1ca","pubkey":"afa10af166a0dbf3a25ff86cd6f8e44cccc818c5e70cd70e4e98e226b158f3563450b3fb184d2649adbb11e53080d1ca","path":"","uuid":"c26b8e0c-c6dc-404d-99ce-97b80deb506f","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xb27ad13afc8ff30e087797b344c8382bb0a84447549f1b0274059ddd652276e7b148ba8808a10cc45746762957d4efbe/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xb27ad13afc8ff30e087797b344c8382bb0a84447549f1b0274059ddd652276e7b148ba8808a10cc45746762957d4efbe/voting-keystore.json new file mode 100644 index 000000000..f06753882 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xb27ad13afc8ff30e087797b344c8382bb0a84447549f1b0274059ddd652276e7b148ba8808a10cc45746762957d4efbe/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"271f1ac0d5c775545eba7520fe06aa5b86ddcd1c89456d1996bf17898edb5e5b"},"message":""},"checksum":{"function":"sha256","params":{},"message":"f5fa40e12e6766eade84457a7529dbf0b2cf2ea1cc07e554e6ff290051c98dad"},"cipher":{"function":"aes-128-ctr","params":{"iv":"f48e97290ecf6a460cfdc6a3acf538c4"},"message":"2d68c326e9365f655433e3b2e8fa82cb357f91e707bf65a947977b11216ef9d6"}},"description":"0xb27ad13afc8ff30e087797b344c8382bb0a84447549f1b0274059ddd652276e7b148ba8808a10cc45746762957d4efbe","pubkey":"b27ad13afc8ff30e087797b344c8382bb0a84447549f1b0274059ddd652276e7b148ba8808a10cc45746762957d4efbe","path":"","uuid":"22473cbd-6ed0-4816-80eb-08d0b82b56a7","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xb570dde8ee80512e3d031caf22e775c60f7f5a6cbdeb3e52e24cf8c867d38569a53dd19cdc36a03a1bbb3a8d94b03670/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xb570dde8ee80512e3d031caf22e775c60f7f5a6cbdeb3e52e24cf8c867d38569a53dd19cdc36a03a1bbb3a8d94b03670/voting-keystore.json new file mode 100644 index 000000000..beb92293c --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xb570dde8ee80512e3d031caf22e775c60f7f5a6cbdeb3e52e24cf8c867d38569a53dd19cdc36a03a1bbb3a8d94b03670/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"222406294e1fb21caf6f7777a0537b5ae94b1d8820388e1dc268073bf5085ca8"},"message":""},"checksum":{"function":"sha256","params":{},"message":"f1f410a131a0c0a8d216cb39ed5ffe16a8d982a1d00da5d529aefaa3720ad977"},"cipher":{"function":"aes-128-ctr","params":{"iv":"7d6299c83718cb971f368353670321c4"},"message":"3df201ea7052135448dbe4c2f617967d633785e709a30242649db21ddd90d781"}},"description":"0xb570dde8ee80512e3d031caf22e775c60f7f5a6cbdeb3e52e24cf8c867d38569a53dd19cdc36a03a1bbb3a8d94b03670","pubkey":"b570dde8ee80512e3d031caf22e775c60f7f5a6cbdeb3e52e24cf8c867d38569a53dd19cdc36a03a1bbb3a8d94b03670","path":"","uuid":"0af96913-93e6-4937-bfb9-cb9118b6f513","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/0xb72cb106b7bc1ecae219e0ae1830a509ed18a042b56a2779f4033419de69ba8ae8017090caed1f5377bfa68506157360/voting-keystore.json b/ops/docker/layer1/keystores/layer1/keys/0xb72cb106b7bc1ecae219e0ae1830a509ed18a042b56a2779f4033419de69ba8ae8017090caed1f5377bfa68506157360/voting-keystore.json new file mode 100644 index 000000000..76176e142 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/0xb72cb106b7bc1ecae219e0ae1830a509ed18a042b56a2779f4033419de69ba8ae8017090caed1f5377bfa68506157360/voting-keystore.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"pbkdf2","params":{"dklen":32,"c":2,"prf":"hmac-sha256","salt":"97e8590bea39215bca7ace1cf93453c611aa04bcd0c7d3b0cbea788ad2accfbb"},"message":""},"checksum":{"function":"sha256","params":{},"message":"7af44166d684f436684c2463b65ecbba330779de4e0a9255fd06c1b4f714e2de"},"cipher":{"function":"aes-128-ctr","params":{"iv":"860ea37f28713d0cad22a4794e0d9893"},"message":"dcf43552f417ae3303018c76309a9c394ce818bc5714323d34caac229b2c164d"}},"description":"0xb72cb106b7bc1ecae219e0ae1830a509ed18a042b56a2779f4033419de69ba8ae8017090caed1f5377bfa68506157360","pubkey":"b72cb106b7bc1ecae219e0ae1830a509ed18a042b56a2779f4033419de69ba8ae8017090caed1f5377bfa68506157360","path":"","uuid":"40b4cada-d794-4973-842b-cf565999c093","version":4} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/api-token.txt b/ops/docker/layer1/keystores/layer1/keys/api-token.txt new file mode 100644 index 000000000..ffd99ada4 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/api-token.txt @@ -0,0 +1 @@ +80aooS4HtRHAFPtVkYI0imFBuVWBFYIRK \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/keys/validator_definitions.yml b/ops/docker/layer1/keystores/layer1/keys/validator_definitions.yml new file mode 100644 index 000000000..3aed0a306 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/validator_definitions.yml @@ -0,0 +1,192 @@ +- enabled: true + voting_public_key: 0x91709ee06497b9ac049325853d64947290189a8c2322e3a500d91e23ea02dc158b6db63ae558b3b7670357a151cd6071 + description: 0x91709ee06497b9ac049325853d64947290189a8c2322e3a500d91e23ea02dc158b6db63ae558b3b7670357a151cd6071 + type: local_keystore + voting_keystore_path: /validator-keys/keys/0x91709ee06497b9ac049325853d64947290189a8c2322e3a500d91e23ea02dc158b6db63ae558b3b7670357a151cd6071/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0x91709ee06497b9ac049325853d64947290189a8c2322e3a500d91e23ea02dc158b6db63ae558b3b7670357a151cd6071 +- enabled: true + voting_public_key: 0xb27ad13afc8ff30e087797b344c8382bb0a84447549f1b0274059ddd652276e7b148ba8808a10cc45746762957d4efbe + description: 0xb27ad13afc8ff30e087797b344c8382bb0a84447549f1b0274059ddd652276e7b148ba8808a10cc45746762957d4efbe + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xb27ad13afc8ff30e087797b344c8382bb0a84447549f1b0274059ddd652276e7b148ba8808a10cc45746762957d4efbe/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xb27ad13afc8ff30e087797b344c8382bb0a84447549f1b0274059ddd652276e7b148ba8808a10cc45746762957d4efbe +- enabled: true + voting_public_key: 0xaaddb0cb69ca18f14aed7054e98a24df0ff606aeff919d489f7884fd1bd183bcb46ea54bc363146e1a88db36dc20a7a4 + description: 0xaaddb0cb69ca18f14aed7054e98a24df0ff606aeff919d489f7884fd1bd183bcb46ea54bc363146e1a88db36dc20a7a4 + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xaaddb0cb69ca18f14aed7054e98a24df0ff606aeff919d489f7884fd1bd183bcb46ea54bc363146e1a88db36dc20a7a4/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xaaddb0cb69ca18f14aed7054e98a24df0ff606aeff919d489f7884fd1bd183bcb46ea54bc363146e1a88db36dc20a7a4 +- enabled: true + voting_public_key: 0xa1584dfe1573df8ec88c7b74d76726b4821bfe84bf886dd3c0e3f74c2ea18aa62ca44c871fb1c63971fccf6937e6501f + description: 0xa1584dfe1573df8ec88c7b74d76726b4821bfe84bf886dd3c0e3f74c2ea18aa62ca44c871fb1c63971fccf6937e6501f + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xa1584dfe1573df8ec88c7b74d76726b4821bfe84bf886dd3c0e3f74c2ea18aa62ca44c871fb1c63971fccf6937e6501f/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xa1584dfe1573df8ec88c7b74d76726b4821bfe84bf886dd3c0e3f74c2ea18aa62ca44c871fb1c63971fccf6937e6501f +- enabled: true + voting_public_key: 0xa03c2a82374e04b2e0594c4ce14fb3f225b46f13188f0d8002a523c7dcfb939ae4856053c2c9c695374d7c3685df1ca5 + description: 0xa03c2a82374e04b2e0594c4ce14fb3f225b46f13188f0d8002a523c7dcfb939ae4856053c2c9c695374d7c3685df1ca5 + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xa03c2a82374e04b2e0594c4ce14fb3f225b46f13188f0d8002a523c7dcfb939ae4856053c2c9c695374d7c3685df1ca5/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xa03c2a82374e04b2e0594c4ce14fb3f225b46f13188f0d8002a523c7dcfb939ae4856053c2c9c695374d7c3685df1ca5 +- enabled: true + voting_public_key: 0xa1d9840eda3036fbf63eeea40146e4548553e6e1b2a653ab349b376f31b367c40d71fb59ff8e94b91daa99c262ec8b52 + description: 0xa1d9840eda3036fbf63eeea40146e4548553e6e1b2a653ab349b376f31b367c40d71fb59ff8e94b91daa99c262ec8b52 + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xa1d9840eda3036fbf63eeea40146e4548553e6e1b2a653ab349b376f31b367c40d71fb59ff8e94b91daa99c262ec8b52/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xa1d9840eda3036fbf63eeea40146e4548553e6e1b2a653ab349b376f31b367c40d71fb59ff8e94b91daa99c262ec8b52 +- enabled: true + voting_public_key: 0xa35c6004f387430c3797ab0157af7b824c8fe106241c7cdeb897d900c0f9e4bb945ff2a6b88cbd10e35ec48aaa554ecb + description: 0xa35c6004f387430c3797ab0157af7b824c8fe106241c7cdeb897d900c0f9e4bb945ff2a6b88cbd10e35ec48aaa554ecb + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xa35c6004f387430c3797ab0157af7b824c8fe106241c7cdeb897d900c0f9e4bb945ff2a6b88cbd10e35ec48aaa554ecb/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xa35c6004f387430c3797ab0157af7b824c8fe106241c7cdeb897d900c0f9e4bb945ff2a6b88cbd10e35ec48aaa554ecb +- enabled: true + voting_public_key: 0xafa10af166a0dbf3a25ff86cd6f8e44cccc818c5e70cd70e4e98e226b158f3563450b3fb184d2649adbb11e53080d1ca + description: 0xafa10af166a0dbf3a25ff86cd6f8e44cccc818c5e70cd70e4e98e226b158f3563450b3fb184d2649adbb11e53080d1ca + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xafa10af166a0dbf3a25ff86cd6f8e44cccc818c5e70cd70e4e98e226b158f3563450b3fb184d2649adbb11e53080d1ca/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xafa10af166a0dbf3a25ff86cd6f8e44cccc818c5e70cd70e4e98e226b158f3563450b3fb184d2649adbb11e53080d1ca +- enabled: true + voting_public_key: 0x96947de9e6068c22a7716656a2755a9551b0b66c2d1a741bf84a088fe1e840e992dc39861bf8ba3e8d5b6d21e8f57e64 + description: 0x96947de9e6068c22a7716656a2755a9551b0b66c2d1a741bf84a088fe1e840e992dc39861bf8ba3e8d5b6d21e8f57e64 + type: local_keystore + voting_keystore_path: /validator-keys/keys/0x96947de9e6068c22a7716656a2755a9551b0b66c2d1a741bf84a088fe1e840e992dc39861bf8ba3e8d5b6d21e8f57e64/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0x96947de9e6068c22a7716656a2755a9551b0b66c2d1a741bf84a088fe1e840e992dc39861bf8ba3e8d5b6d21e8f57e64 +- enabled: true + voting_public_key: 0xa804e4fa8d1391a9d078aa93985a12503b84ce4f6f1f9e70ab7fca421e1cf972538666299d4c1bfc39327b469b2db7a8 + description: 0xa804e4fa8d1391a9d078aa93985a12503b84ce4f6f1f9e70ab7fca421e1cf972538666299d4c1bfc39327b469b2db7a8 + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xa804e4fa8d1391a9d078aa93985a12503b84ce4f6f1f9e70ab7fca421e1cf972538666299d4c1bfc39327b469b2db7a8/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xa804e4fa8d1391a9d078aa93985a12503b84ce4f6f1f9e70ab7fca421e1cf972538666299d4c1bfc39327b469b2db7a8 +- enabled: true + voting_public_key: 0xa54fe5c26059ed60b4f0b66ef7b0bf167580504525f83c169507dc812816df41b1da6128341c23977300dffd32a32f41 + description: 0xa54fe5c26059ed60b4f0b66ef7b0bf167580504525f83c169507dc812816df41b1da6128341c23977300dffd32a32f41 + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xa54fe5c26059ed60b4f0b66ef7b0bf167580504525f83c169507dc812816df41b1da6128341c23977300dffd32a32f41/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xa54fe5c26059ed60b4f0b66ef7b0bf167580504525f83c169507dc812816df41b1da6128341c23977300dffd32a32f41 +- enabled: true + voting_public_key: 0xae940a07850cf904b44f31cbf0e44824bae5ec36dcfdb7fad858f2a39dba38de82ca12b0ae939a34fce7a02e4b9789f8 + description: 0xae940a07850cf904b44f31cbf0e44824bae5ec36dcfdb7fad858f2a39dba38de82ca12b0ae939a34fce7a02e4b9789f8 + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xae940a07850cf904b44f31cbf0e44824bae5ec36dcfdb7fad858f2a39dba38de82ca12b0ae939a34fce7a02e4b9789f8/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xae940a07850cf904b44f31cbf0e44824bae5ec36dcfdb7fad858f2a39dba38de82ca12b0ae939a34fce7a02e4b9789f8 +- enabled: true + voting_public_key: 0x8a8bb292bcc481070d3afdbbc8789e2ab4b29c9603936e6d85f5ff71e23fc5b6d61009f0fa636b5d5b2dc309d39e3d75 + description: 0x8a8bb292bcc481070d3afdbbc8789e2ab4b29c9603936e6d85f5ff71e23fc5b6d61009f0fa636b5d5b2dc309d39e3d75 + type: local_keystore + voting_keystore_path: /validator-keys/keys/0x8a8bb292bcc481070d3afdbbc8789e2ab4b29c9603936e6d85f5ff71e23fc5b6d61009f0fa636b5d5b2dc309d39e3d75/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0x8a8bb292bcc481070d3afdbbc8789e2ab4b29c9603936e6d85f5ff71e23fc5b6d61009f0fa636b5d5b2dc309d39e3d75 +- enabled: true + voting_public_key: 0x84a687ffdf21a0ad754d0164d1e2c03035613ab76359e7f5cf51ea4a425a6ee026725ec0a0dbd336f7dab759596f0bf8 + description: 0x84a687ffdf21a0ad754d0164d1e2c03035613ab76359e7f5cf51ea4a425a6ee026725ec0a0dbd336f7dab759596f0bf8 + type: local_keystore + voting_keystore_path: /validator-keys/keys/0x84a687ffdf21a0ad754d0164d1e2c03035613ab76359e7f5cf51ea4a425a6ee026725ec0a0dbd336f7dab759596f0bf8/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0x84a687ffdf21a0ad754d0164d1e2c03035613ab76359e7f5cf51ea4a425a6ee026725ec0a0dbd336f7dab759596f0bf8 +- enabled: true + voting_public_key: 0x8de5a6200cebb09b2198e69fed84bcd512ec5cf317c5f1ee99aad03d2a9a8564bf3807c08da2664222268d59c34a06e4 + description: 0x8de5a6200cebb09b2198e69fed84bcd512ec5cf317c5f1ee99aad03d2a9a8564bf3807c08da2664222268d59c34a06e4 + type: local_keystore + voting_keystore_path: /validator-keys/keys/0x8de5a6200cebb09b2198e69fed84bcd512ec5cf317c5f1ee99aad03d2a9a8564bf3807c08da2664222268d59c34a06e4/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0x8de5a6200cebb09b2198e69fed84bcd512ec5cf317c5f1ee99aad03d2a9a8564bf3807c08da2664222268d59c34a06e4 +- enabled: true + voting_public_key: 0x8419cf00f2783c430dc861a710984d0429d3b3a7f6db849b4f5c05e0d87339704c5c7f5eede6adfc8776d666587b5932 + description: 0x8419cf00f2783c430dc861a710984d0429d3b3a7f6db849b4f5c05e0d87339704c5c7f5eede6adfc8776d666587b5932 + type: local_keystore + voting_keystore_path: /validator-keys/keys/0x8419cf00f2783c430dc861a710984d0429d3b3a7f6db849b4f5c05e0d87339704c5c7f5eede6adfc8776d666587b5932/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0x8419cf00f2783c430dc861a710984d0429d3b3a7f6db849b4f5c05e0d87339704c5c7f5eede6adfc8776d666587b5932 +- enabled: true + voting_public_key: 0x996d10c3026b9344532b06c70a596f972a1e779a1f6106d3da9f6ba376bbf7ec82d2f52629e5dbf3f7d03b00f6b862af + description: 0x996d10c3026b9344532b06c70a596f972a1e779a1f6106d3da9f6ba376bbf7ec82d2f52629e5dbf3f7d03b00f6b862af + type: local_keystore + voting_keystore_path: /validator-keys/keys/0x996d10c3026b9344532b06c70a596f972a1e779a1f6106d3da9f6ba376bbf7ec82d2f52629e5dbf3f7d03b00f6b862af/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0x996d10c3026b9344532b06c70a596f972a1e779a1f6106d3da9f6ba376bbf7ec82d2f52629e5dbf3f7d03b00f6b862af +- enabled: true + voting_public_key: 0xad9222dec71ff8ee6bc0426ffe7b5e66f96738225db281dd20027a1556d089fdebd040abfbc2041d6c1a0d8fdcfce183 + description: 0xad9222dec71ff8ee6bc0426ffe7b5e66f96738225db281dd20027a1556d089fdebd040abfbc2041d6c1a0d8fdcfce183 + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xad9222dec71ff8ee6bc0426ffe7b5e66f96738225db281dd20027a1556d089fdebd040abfbc2041d6c1a0d8fdcfce183/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xad9222dec71ff8ee6bc0426ffe7b5e66f96738225db281dd20027a1556d089fdebd040abfbc2041d6c1a0d8fdcfce183 +- enabled: true + voting_public_key: 0x87231421a08ed28e7d357e2b37a26a458155c8d822d829344bd1029e5d175b5edfaa78f16f784f724a2caef124944c4f + description: 0x87231421a08ed28e7d357e2b37a26a458155c8d822d829344bd1029e5d175b5edfaa78f16f784f724a2caef124944c4f + type: local_keystore + voting_keystore_path: /validator-keys/keys/0x87231421a08ed28e7d357e2b37a26a458155c8d822d829344bd1029e5d175b5edfaa78f16f784f724a2caef124944c4f/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0x87231421a08ed28e7d357e2b37a26a458155c8d822d829344bd1029e5d175b5edfaa78f16f784f724a2caef124944c4f +- enabled: true + voting_public_key: 0x996323af7e545fb6363ace53f1538c7ddc3eb0d985b2479da3ee4ace10cbc393b518bf02d1a2ddb2f5bdf09b473933ea + description: 0x996323af7e545fb6363ace53f1538c7ddc3eb0d985b2479da3ee4ace10cbc393b518bf02d1a2ddb2f5bdf09b473933ea + type: local_keystore + voting_keystore_path: /validator-keys/keys/0x996323af7e545fb6363ace53f1538c7ddc3eb0d985b2479da3ee4ace10cbc393b518bf02d1a2ddb2f5bdf09b473933ea/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0x996323af7e545fb6363ace53f1538c7ddc3eb0d985b2479da3ee4ace10cbc393b518bf02d1a2ddb2f5bdf09b473933ea +- enabled: true + voting_public_key: 0x930743bfc7e18d3bd7351eaa74f477505268c1e4e1fd1ca3ccccdefb2595517343bbb8f5589c435c3c39323a4c0080f8 + description: 0x930743bfc7e18d3bd7351eaa74f477505268c1e4e1fd1ca3ccccdefb2595517343bbb8f5589c435c3c39323a4c0080f8 + type: local_keystore + voting_keystore_path: /validator-keys/keys/0x930743bfc7e18d3bd7351eaa74f477505268c1e4e1fd1ca3ccccdefb2595517343bbb8f5589c435c3c39323a4c0080f8/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0x930743bfc7e18d3bd7351eaa74f477505268c1e4e1fd1ca3ccccdefb2595517343bbb8f5589c435c3c39323a4c0080f8 +- enabled: true + voting_public_key: 0xac69ae9e6c385a368df71d11ac68f45f05e005306df3c2bf98ed3577708256bd97f8c09d3f72115444077a9bb711d8d1 + description: 0xac69ae9e6c385a368df71d11ac68f45f05e005306df3c2bf98ed3577708256bd97f8c09d3f72115444077a9bb711d8d1 + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xac69ae9e6c385a368df71d11ac68f45f05e005306df3c2bf98ed3577708256bd97f8c09d3f72115444077a9bb711d8d1/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xac69ae9e6c385a368df71d11ac68f45f05e005306df3c2bf98ed3577708256bd97f8c09d3f72115444077a9bb711d8d1 +- enabled: true + voting_public_key: 0x8aa5bbee21e98c7b9e7a4c8ea45aa99f89e22992fa4fc2d73869d77da4cc8a05b25b61931ff521986677dd7f7159e8e6 + description: 0x8aa5bbee21e98c7b9e7a4c8ea45aa99f89e22992fa4fc2d73869d77da4cc8a05b25b61931ff521986677dd7f7159e8e6 + type: local_keystore + voting_keystore_path: /validator-keys/keys/0x8aa5bbee21e98c7b9e7a4c8ea45aa99f89e22992fa4fc2d73869d77da4cc8a05b25b61931ff521986677dd7f7159e8e6/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0x8aa5bbee21e98c7b9e7a4c8ea45aa99f89e22992fa4fc2d73869d77da4cc8a05b25b61931ff521986677dd7f7159e8e6 +- enabled: true + voting_public_key: 0xae5302796cfeca685eaf37ffd5baeb32121f2f07415bee26cc0051ee513ff3932d2c365e3d9f87b0949a5980445cb64c + description: 0xae5302796cfeca685eaf37ffd5baeb32121f2f07415bee26cc0051ee513ff3932d2c365e3d9f87b0949a5980445cb64c + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xae5302796cfeca685eaf37ffd5baeb32121f2f07415bee26cc0051ee513ff3932d2c365e3d9f87b0949a5980445cb64c/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xae5302796cfeca685eaf37ffd5baeb32121f2f07415bee26cc0051ee513ff3932d2c365e3d9f87b0949a5980445cb64c +- enabled: true + voting_public_key: 0x8d46e9aa0c1986056e407efc7013b7f271027d3c98ce96667faa98074ab0588a61681faf78644c11819a459a95689dab + description: 0x8d46e9aa0c1986056e407efc7013b7f271027d3c98ce96667faa98074ab0588a61681faf78644c11819a459a95689dab + type: local_keystore + voting_keystore_path: /validator-keys/keys/0x8d46e9aa0c1986056e407efc7013b7f271027d3c98ce96667faa98074ab0588a61681faf78644c11819a459a95689dab/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0x8d46e9aa0c1986056e407efc7013b7f271027d3c98ce96667faa98074ab0588a61681faf78644c11819a459a95689dab +- enabled: true + voting_public_key: 0xb570dde8ee80512e3d031caf22e775c60f7f5a6cbdeb3e52e24cf8c867d38569a53dd19cdc36a03a1bbb3a8d94b03670 + description: 0xb570dde8ee80512e3d031caf22e775c60f7f5a6cbdeb3e52e24cf8c867d38569a53dd19cdc36a03a1bbb3a8d94b03670 + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xb570dde8ee80512e3d031caf22e775c60f7f5a6cbdeb3e52e24cf8c867d38569a53dd19cdc36a03a1bbb3a8d94b03670/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xb570dde8ee80512e3d031caf22e775c60f7f5a6cbdeb3e52e24cf8c867d38569a53dd19cdc36a03a1bbb3a8d94b03670 +- enabled: true + voting_public_key: 0xb72cb106b7bc1ecae219e0ae1830a509ed18a042b56a2779f4033419de69ba8ae8017090caed1f5377bfa68506157360 + description: 0xb72cb106b7bc1ecae219e0ae1830a509ed18a042b56a2779f4033419de69ba8ae8017090caed1f5377bfa68506157360 + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xb72cb106b7bc1ecae219e0ae1830a509ed18a042b56a2779f4033419de69ba8ae8017090caed1f5377bfa68506157360/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xb72cb106b7bc1ecae219e0ae1830a509ed18a042b56a2779f4033419de69ba8ae8017090caed1f5377bfa68506157360 +- enabled: true + voting_public_key: 0xa75ca9447dca3a3745ada36731187ddd1f6a152cf15d7446b785eab381e5c8562c1202a6e7a24080bc6b619a161113db + description: 0xa75ca9447dca3a3745ada36731187ddd1f6a152cf15d7446b785eab381e5c8562c1202a6e7a24080bc6b619a161113db + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xa75ca9447dca3a3745ada36731187ddd1f6a152cf15d7446b785eab381e5c8562c1202a6e7a24080bc6b619a161113db/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xa75ca9447dca3a3745ada36731187ddd1f6a152cf15d7446b785eab381e5c8562c1202a6e7a24080bc6b619a161113db +- enabled: true + voting_public_key: 0xaaf6c1251e73fb600624937760fef218aace5b253bf068ed45398aeb29d821e4d2899343ddcbbe37cb3f6cf500dff26c + description: 0xaaf6c1251e73fb600624937760fef218aace5b253bf068ed45398aeb29d821e4d2899343ddcbbe37cb3f6cf500dff26c + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xaaf6c1251e73fb600624937760fef218aace5b253bf068ed45398aeb29d821e4d2899343ddcbbe37cb3f6cf500dff26c/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xaaf6c1251e73fb600624937760fef218aace5b253bf068ed45398aeb29d821e4d2899343ddcbbe37cb3f6cf500dff26c +- enabled: true + voting_public_key: 0xabd12678c73463ecea5867a80caf256d5c5e6ba53ff188b143a4d5be83365ad257edf39eaa1ba8753c4cdf4c632ff99e + description: 0xabd12678c73463ecea5867a80caf256d5c5e6ba53ff188b143a4d5be83365ad257edf39eaa1ba8753c4cdf4c632ff99e + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xabd12678c73463ecea5867a80caf256d5c5e6ba53ff188b143a4d5be83365ad257edf39eaa1ba8753c4cdf4c632ff99e/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xabd12678c73463ecea5867a80caf256d5c5e6ba53ff188b143a4d5be83365ad257edf39eaa1ba8753c4cdf4c632ff99e +- enabled: true + voting_public_key: 0xab72cbc6575c3179680a58c0ecd5de46d2678ccbafc016746348ee5688edcb21b4e15bd37c70c508e3ea73103c2d566b + description: 0xab72cbc6575c3179680a58c0ecd5de46d2678ccbafc016746348ee5688edcb21b4e15bd37c70c508e3ea73103c2d566b + type: local_keystore + voting_keystore_path: /validator-keys/keys/0xab72cbc6575c3179680a58c0ecd5de46d2678ccbafc016746348ee5688edcb21b4e15bd37c70c508e3ea73103c2d566b/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0xab72cbc6575c3179680a58c0ecd5de46d2678ccbafc016746348ee5688edcb21b4e15bd37c70c508e3ea73103c2d566b +- enabled: true + voting_public_key: 0x81ea9f74ef7d935b807474e38954ae3934856219a23e074954b2e860c5a3c400f9aedb42cd27cb4ceb697ca36d1e58cb + description: 0x81ea9f74ef7d935b807474e38954ae3934856219a23e074954b2e860c5a3c400f9aedb42cd27cb4ceb697ca36d1e58cb + type: local_keystore + voting_keystore_path: /validator-keys/keys/0x81ea9f74ef7d935b807474e38954ae3934856219a23e074954b2e860c5a3c400f9aedb42cd27cb4ceb697ca36d1e58cb/voting-keystore.json + voting_keystore_password_path: /validator-keys/secrets/0x81ea9f74ef7d935b807474e38954ae3934856219a23e074954b2e860c5a3c400f9aedb42cd27cb4ceb697ca36d1e58cb diff --git a/ops/docker/layer1/keystores/layer1/keys/validator_key_cache.json b/ops/docker/layer1/keystores/layer1/keys/validator_key_cache.json new file mode 100644 index 000000000..3c67a1128 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/keys/validator_key_cache.json @@ -0,0 +1 @@ +{"crypto":{"kdf":{"function":"scrypt","params":{"dklen":32,"n":262144,"r":8,"p":1,"salt":"0ead8ef6a4e193aa9684ed6163bb9e287dee9e8a37dcf1a51839a6151c1bcd07"},"message":""},"checksum":{"function":"sha256","params":{},"message":"99e1c6667d2d4b52703abf78d754e47bcc1089124ecae1cc248f06553155dc1d"},"cipher":{"function":"aes-128-ctr","params":{"iv":"abcb35fb4e8e123c04737b99d6a0a006"},"message":"1108302561612904b2454bf1a723cdcd4804c498239eb3b00b567b01a363f6c71ffc9ecc8f03af405367a926df1e5170ee0e450fe227adc1d2c40e0a2ac16d19f7d57bd4d1573321e4f2f77d138678840e33eb672a6217d618104f39edee3483469752cce40c673f8599e7bc66c44bc4c80a60f9491f83ae9bc1b68dcedb2e44db23ee65fd861c3cf6e035fa35a560a9a8b4d3e6790be0c2659a409037cca743b8de3cc0d74fa75b1a4e3caa807f151d3e1dd8114da355f4d40cd096c3a5bcdf06b1d594ac22b7a7c0af6ef4b51511376823c1bb6a55ac9e6d53c31d3970aa729aedd7ceb60c70943551fada1f033bfa81066d993f42d21721e984b46353bf5865f7a5fc0bc78726c801e934c1c1921af03762cec224eefa9010f557239d3a1979691732b2ac7acc81bb626bf192e9eee5ddb12faf2357ff88740a2ab1405259207101eb4ee00eb63381e5e825f03301e7bbef995370896990b433e113a37f3b53f4699891c374ab433075473dc518622de53f9ab29932a2811ddba6c9603e2103a5d07586574b65ab372861542eb7a3a362240f2a29ca52588f2c48d85b2d3ed80e8ee646d7d4bae5e64123305a9a9d8c2f5182fd796088db106f79923d56aafaa85fcb32c3edc9129fe808adc0f1c9bd1d63a1f9acfb91fff05fe9e855fb380ea831e0e20d1c2b01219bb5db015e4bba583a872859ccbdaf2a8d5a82eafba0bc6c8e2a03e69cf43e5188fd5a71daa4a923173cec267d159410425f2143803c7d0fe2b6ffaa2fb82ce86205abe972ee563cf0f7ec19a2806337a86a662dec7de54171bf9406be850d74a06b3160d8c234756c43737734282c8be01f7eb58cabb7cf6f46f1a51fecc1bec81044104e312861882d7bb3bcd740e8c0e7029248c5c7ef6260512f683017b8aa377ccd1f71507ace6636c9cc000fa6dfb00491fb07b651add2e76d75fd87b8ec7bff6cd2a26f9ec35c71c68d2121cd10451b47c6e0201bb1c0c37bfe1f90306bc250c13c631bfc2dd805f0c4f4192b548ac9d4670c02e0ff1d0e136d57eb981664739f9dd1107cebfdf95433384ce6027f667eb5a2c7aac705cfa7f7cc1498e501242ab5427d9e5d57e7e66839478b202f1064d5a444ea83b9d047dcdc24ecf736c6fdb8cd65434050bac6c187800ff6b822eaa000dc7953c1a6b04e59e9d4d26a59a5872d48e1aabc90ad4296c51b39fcefd264c44dbe18912e0f3ea676068e98e47538c12e8ba9bca5483a16213edf9d530fa2061e46df8a7b0178b27e9584bd86d9562dc9122954eb64c3827d9ce55949cb8d583bc0568c57c25d98b6a7f051a66934f42c24643403c4bcf63029184a4b15f2c2232af7ec8c4821cb76a9dfcc152721225cf8557dcb60033a1f892a8ee34599d634cdc4e48701ca4143d008375ac769534dce6a93f6e2cc6e53684c5865fc0845cbd6f60c6ada25c9d4126f6d5eed8cd94a90b4027a6b725b3180237ed6bb9ee83ca45e453809fe9c7d1a27eb9a2590608371e7eee9df7603df47c702d93324bed5d3aab2e03a2cf07a3b70bd7f87347d9d78e3420e8b3d4c7295b42fec74ac4bc3a67c46ffdb641b57a7e4ca31767321b449acd888785b4b687b8982cdf27a80b90a392aaf23125dbab2f33614401f83f39ca60f6f01adf77167204b35e47ed814194a90c4a507c9abbb9669a4524a5724ac4c9c23fe0cffde235655b6b09cbac93921fba15756bf75b81d043a1847600158a060cc411d9f45734c1b35385b6b1e33b0150984b6ef77c1835ff54cade18f022070248d86fe41e8480eef5a6b3fd6c9ab96e00773ef22b57f617ed0debcfeacdeb4e42a2ebe216348ee544beb03264bed04e087f745a9a16bc7cfe3990db56c838bd2a542b1b375f958899ae2f8200826deedf66d133e3d1d1f945851db38c1d3f5ee290d17bca876055562c59a2dc80e32bd551c1bd52e7f9660bf21900ab5d61daa421e24dcee2fb7d46355317df5ca63730b33fe8f7e9f6c33e35e7516211bb311906b7a1dd04adae4b33c571e983b997bd9d1e9ebfd0d6e5ca464c5fa1cd7bebdc7df9b1e800d80f43e04fcf14ff4217c2db9ede423955b92f3fceb155953f704b26aa45ce980baec8bb68a11816ec7b99bf23d204519e042774862e5ec07d844c018de2c185dc12b2ab0dff311b11e110872572daadaabbd36ab0502e5c71c2dd331de26af7177a5105b3a20b8461971071019c6f328ab8f23e84713b488a881d483d8f7c451704c9b15db8fff2f3f39b68e70ed2efefe545e16d0a2f4df3dc1d3f322409df77a0a286352ec3859d4d47dea6361f4064a63aed63a35dda51492b664b297f980f41b8c18a59e390c2335b419a03467f6667d01a9a22c5de0aa3507af431dde999f696def77b8a54697fda24e9e094c8227cc02b6fcec4759ce9fa1965b55eb3a332f0e3da0be63ed5b37ba1f515096fd8c66322335c5a65b9ff5fe52fe43af1a9c5e639b3bf1786d8e7cfbfb75d8502d90ed37e83c4f5d86cee3c5f61a05605c178d02531ff8dfa5a207ccc799"}},"uuids":["9c48003a-283e-4614-9647-44e2485b7899","22473cbd-6ed0-4816-80eb-08d0b82b56a7","9b885749-f312-45af-9672-db7edc662e8b","04ad2f0a-b15f-47d8-9621-a2f7ae1da957","fa7cd4db-056e-476e-a949-6e56f029a416","757939aa-f987-4cef-a1b2-88b2296ce568","67f42de7-fc6d-4f27-b3d3-63b6fd62fc65","c26b8e0c-c6dc-404d-99ce-97b80deb506f","00c54fed-7953-439f-ac28-4d4bad382a41","72b953c4-8e95-4b8a-bc98-61a95b58cb20","0dee2eaa-5935-45c9-bf91-2ce8a0f09188","188c3b58-bd99-4ffd-9f98-a8a77102d5b6","38b7eba0-0c08-4b88-a6eb-8a6b8ebcc871","9313bc22-c3cc-4e47-9e7a-59de6938a8a7","fe505f6d-504b-4efa-afc1-143c6b63028a","bba75357-fcdf-4441-be4d-2ae794c262bd","5cf506c7-6a09-4139-b298-f07b02bdc643","46723964-9060-4c82-b1c5-d7177c96672b","7cbc504e-989d-4f0c-88dc-3605c322622f","8f3eb0ae-dbb9-4d0e-b3e1-293ad94dec02","d5fa5791-b381-4e34-b5bd-d395a1e3ccc3","21c3b6f7-23a3-45e3-8444-6428ba673c6e","e48ff448-38eb-4b2e-811c-25b734c9c125","70ab074f-b273-415f-b6aa-bad700d59063","5cca9e94-3149-498d-a1f8-3cb50f5fc37d","0af96913-93e6-4937-bfb9-cb9118b6f513","40b4cada-d794-4973-842b-cf565999c093","e300fd01-792e-4718-bc14-1ccb529fd5a8","b8fc724f-b604-4d6d-8d85-62079488cd3e","ca0eeeb8-8a3b-4157-9b4c-43a6e5607269","03e47af2-e1f4-401f-8fdb-533d88f7c58b","7ef682ad-e17b-467c-a54a-41c2a9212b65"]} \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/pubkeys.json b/ops/docker/layer1/keystores/layer1/pubkeys.json new file mode 100644 index 000000000..69d6d544e --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/pubkeys.json @@ -0,0 +1 @@ +["0xaaf6c1251e73fb600624937760fef218aace5b253bf068ed45398aeb29d821e4d2899343ddcbbe37cb3f6cf500dff26c","0x8aa5bbee21e98c7b9e7a4c8ea45aa99f89e22992fa4fc2d73869d77da4cc8a05b25b61931ff521986677dd7f7159e8e6","0x996323af7e545fb6363ace53f1538c7ddc3eb0d985b2479da3ee4ace10cbc393b518bf02d1a2ddb2f5bdf09b473933ea","0xa1584dfe1573df8ec88c7b74d76726b4821bfe84bf886dd3c0e3f74c2ea18aa62ca44c871fb1c63971fccf6937e6501f","0xac69ae9e6c385a368df71d11ac68f45f05e005306df3c2bf98ed3577708256bd97f8c09d3f72115444077a9bb711d8d1","0xa54fe5c26059ed60b4f0b66ef7b0bf167580504525f83c169507dc812816df41b1da6128341c23977300dffd32a32f41","0xad9222dec71ff8ee6bc0426ffe7b5e66f96738225db281dd20027a1556d089fdebd040abfbc2041d6c1a0d8fdcfce183","0x87231421a08ed28e7d357e2b37a26a458155c8d822d829344bd1029e5d175b5edfaa78f16f784f724a2caef124944c4f","0xb72cb106b7bc1ecae219e0ae1830a509ed18a042b56a2779f4033419de69ba8ae8017090caed1f5377bfa68506157360","0xb27ad13afc8ff30e087797b344c8382bb0a84447549f1b0274059ddd652276e7b148ba8808a10cc45746762957d4efbe","0xaaddb0cb69ca18f14aed7054e98a24df0ff606aeff919d489f7884fd1bd183bcb46ea54bc363146e1a88db36dc20a7a4","0x996d10c3026b9344532b06c70a596f972a1e779a1f6106d3da9f6ba376bbf7ec82d2f52629e5dbf3f7d03b00f6b862af","0x91709ee06497b9ac049325853d64947290189a8c2322e3a500d91e23ea02dc158b6db63ae558b3b7670357a151cd6071","0xa03c2a82374e04b2e0594c4ce14fb3f225b46f13188f0d8002a523c7dcfb939ae4856053c2c9c695374d7c3685df1ca5","0xab72cbc6575c3179680a58c0ecd5de46d2678ccbafc016746348ee5688edcb21b4e15bd37c70c508e3ea73103c2d566b","0xafa10af166a0dbf3a25ff86cd6f8e44cccc818c5e70cd70e4e98e226b158f3563450b3fb184d2649adbb11e53080d1ca","0xabd12678c73463ecea5867a80caf256d5c5e6ba53ff188b143a4d5be83365ad257edf39eaa1ba8753c4cdf4c632ff99e","0xa35c6004f387430c3797ab0157af7b824c8fe106241c7cdeb897d900c0f9e4bb945ff2a6b88cbd10e35ec48aaa554ecb","0x8a8bb292bcc481070d3afdbbc8789e2ab4b29c9603936e6d85f5ff71e23fc5b6d61009f0fa636b5d5b2dc309d39e3d75","0xae940a07850cf904b44f31cbf0e44824bae5ec36dcfdb7fad858f2a39dba38de82ca12b0ae939a34fce7a02e4b9789f8","0xa75ca9447dca3a3745ada36731187ddd1f6a152cf15d7446b785eab381e5c8562c1202a6e7a24080bc6b619a161113db","0x84a687ffdf21a0ad754d0164d1e2c03035613ab76359e7f5cf51ea4a425a6ee026725ec0a0dbd336f7dab759596f0bf8","0x96947de9e6068c22a7716656a2755a9551b0b66c2d1a741bf84a088fe1e840e992dc39861bf8ba3e8d5b6d21e8f57e64","0xb570dde8ee80512e3d031caf22e775c60f7f5a6cbdeb3e52e24cf8c867d38569a53dd19cdc36a03a1bbb3a8d94b03670","0xae5302796cfeca685eaf37ffd5baeb32121f2f07415bee26cc0051ee513ff3932d2c365e3d9f87b0949a5980445cb64c","0x8de5a6200cebb09b2198e69fed84bcd512ec5cf317c5f1ee99aad03d2a9a8564bf3807c08da2664222268d59c34a06e4","0xa1d9840eda3036fbf63eeea40146e4548553e6e1b2a653ab349b376f31b367c40d71fb59ff8e94b91daa99c262ec8b52","0x8419cf00f2783c430dc861a710984d0429d3b3a7f6db849b4f5c05e0d87339704c5c7f5eede6adfc8776d666587b5932","0x8d46e9aa0c1986056e407efc7013b7f271027d3c98ce96667faa98074ab0588a61681faf78644c11819a459a95689dab","0x930743bfc7e18d3bd7351eaa74f477505268c1e4e1fd1ca3ccccdefb2595517343bbb8f5589c435c3c39323a4c0080f8","0x81ea9f74ef7d935b807474e38954ae3934856219a23e074954b2e860c5a3c400f9aedb42cd27cb4ceb697ca36d1e58cb","0xa804e4fa8d1391a9d078aa93985a12503b84ce4f6f1f9e70ab7fca421e1cf972538666299d4c1bfc39327b469b2db7a8"] \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0x81ea9f74ef7d935b807474e38954ae3934856219a23e074954b2e860c5a3c400f9aedb42cd27cb4ceb697ca36d1e58cb b/ops/docker/layer1/keystores/layer1/secrets/0x81ea9f74ef7d935b807474e38954ae3934856219a23e074954b2e860c5a3c400f9aedb42cd27cb4ceb697ca36d1e58cb new file mode 100644 index 000000000..bcad43dcc --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0x81ea9f74ef7d935b807474e38954ae3934856219a23e074954b2e860c5a3c400f9aedb42cd27cb4ceb697ca36d1e58cb @@ -0,0 +1 @@ +ZUWk0okTR2xKYRJ3wOBLbhFE3hvsQK9r8K-KElrQFss= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0x8419cf00f2783c430dc861a710984d0429d3b3a7f6db849b4f5c05e0d87339704c5c7f5eede6adfc8776d666587b5932 b/ops/docker/layer1/keystores/layer1/secrets/0x8419cf00f2783c430dc861a710984d0429d3b3a7f6db849b4f5c05e0d87339704c5c7f5eede6adfc8776d666587b5932 new file mode 100644 index 000000000..ef874e4af --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0x8419cf00f2783c430dc861a710984d0429d3b3a7f6db849b4f5c05e0d87339704c5c7f5eede6adfc8776d666587b5932 @@ -0,0 +1 @@ +5j_WCIi1BEnRWPK-UHMAx74pGGssHfvnq-CWOo3Wg7E= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0x84a687ffdf21a0ad754d0164d1e2c03035613ab76359e7f5cf51ea4a425a6ee026725ec0a0dbd336f7dab759596f0bf8 b/ops/docker/layer1/keystores/layer1/secrets/0x84a687ffdf21a0ad754d0164d1e2c03035613ab76359e7f5cf51ea4a425a6ee026725ec0a0dbd336f7dab759596f0bf8 new file mode 100644 index 000000000..06942b936 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0x84a687ffdf21a0ad754d0164d1e2c03035613ab76359e7f5cf51ea4a425a6ee026725ec0a0dbd336f7dab759596f0bf8 @@ -0,0 +1 @@ +xqGP6hfOImR8vjBgHqfBXP651ibAi8CYzr7TPVIp49w= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0x87231421a08ed28e7d357e2b37a26a458155c8d822d829344bd1029e5d175b5edfaa78f16f784f724a2caef124944c4f b/ops/docker/layer1/keystores/layer1/secrets/0x87231421a08ed28e7d357e2b37a26a458155c8d822d829344bd1029e5d175b5edfaa78f16f784f724a2caef124944c4f new file mode 100644 index 000000000..f36900ee0 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0x87231421a08ed28e7d357e2b37a26a458155c8d822d829344bd1029e5d175b5edfaa78f16f784f724a2caef124944c4f @@ -0,0 +1 @@ +9CARLtXFmeamkSZYGEzKJj21F6xzXhdh9q_Hx1NwKjU= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0x8a8bb292bcc481070d3afdbbc8789e2ab4b29c9603936e6d85f5ff71e23fc5b6d61009f0fa636b5d5b2dc309d39e3d75 b/ops/docker/layer1/keystores/layer1/secrets/0x8a8bb292bcc481070d3afdbbc8789e2ab4b29c9603936e6d85f5ff71e23fc5b6d61009f0fa636b5d5b2dc309d39e3d75 new file mode 100644 index 000000000..dd51762c2 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0x8a8bb292bcc481070d3afdbbc8789e2ab4b29c9603936e6d85f5ff71e23fc5b6d61009f0fa636b5d5b2dc309d39e3d75 @@ -0,0 +1 @@ +xFtbRMM9OIvL7QEzeJN7IY1aIQGrpzY60XsWqskW0hU= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0x8aa5bbee21e98c7b9e7a4c8ea45aa99f89e22992fa4fc2d73869d77da4cc8a05b25b61931ff521986677dd7f7159e8e6 b/ops/docker/layer1/keystores/layer1/secrets/0x8aa5bbee21e98c7b9e7a4c8ea45aa99f89e22992fa4fc2d73869d77da4cc8a05b25b61931ff521986677dd7f7159e8e6 new file mode 100644 index 000000000..9199e1844 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0x8aa5bbee21e98c7b9e7a4c8ea45aa99f89e22992fa4fc2d73869d77da4cc8a05b25b61931ff521986677dd7f7159e8e6 @@ -0,0 +1 @@ +HW2zOtCg1rUoxTpI5PrfJf4vBer_g47F9kRa_VCVQl0= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0x8d46e9aa0c1986056e407efc7013b7f271027d3c98ce96667faa98074ab0588a61681faf78644c11819a459a95689dab b/ops/docker/layer1/keystores/layer1/secrets/0x8d46e9aa0c1986056e407efc7013b7f271027d3c98ce96667faa98074ab0588a61681faf78644c11819a459a95689dab new file mode 100644 index 000000000..0a8bb258d --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0x8d46e9aa0c1986056e407efc7013b7f271027d3c98ce96667faa98074ab0588a61681faf78644c11819a459a95689dab @@ -0,0 +1 @@ +W65ZJicHA9pKlXwoIK9NsExEUzPMvdTnDFqN2sImdNo= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0x8de5a6200cebb09b2198e69fed84bcd512ec5cf317c5f1ee99aad03d2a9a8564bf3807c08da2664222268d59c34a06e4 b/ops/docker/layer1/keystores/layer1/secrets/0x8de5a6200cebb09b2198e69fed84bcd512ec5cf317c5f1ee99aad03d2a9a8564bf3807c08da2664222268d59c34a06e4 new file mode 100644 index 000000000..516097a09 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0x8de5a6200cebb09b2198e69fed84bcd512ec5cf317c5f1ee99aad03d2a9a8564bf3807c08da2664222268d59c34a06e4 @@ -0,0 +1 @@ +L-mvkrvLL_2TPJMW2dZp-ViIR0WZE362zYzWd5cuvY4= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0x91709ee06497b9ac049325853d64947290189a8c2322e3a500d91e23ea02dc158b6db63ae558b3b7670357a151cd6071 b/ops/docker/layer1/keystores/layer1/secrets/0x91709ee06497b9ac049325853d64947290189a8c2322e3a500d91e23ea02dc158b6db63ae558b3b7670357a151cd6071 new file mode 100644 index 000000000..ae6327f3e --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0x91709ee06497b9ac049325853d64947290189a8c2322e3a500d91e23ea02dc158b6db63ae558b3b7670357a151cd6071 @@ -0,0 +1 @@ +IRtpLprt_w6WKx1JMe-f-0MAHp7iOXzb99PJgzTKTMg= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0x930743bfc7e18d3bd7351eaa74f477505268c1e4e1fd1ca3ccccdefb2595517343bbb8f5589c435c3c39323a4c0080f8 b/ops/docker/layer1/keystores/layer1/secrets/0x930743bfc7e18d3bd7351eaa74f477505268c1e4e1fd1ca3ccccdefb2595517343bbb8f5589c435c3c39323a4c0080f8 new file mode 100644 index 000000000..1d33a2bad --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0x930743bfc7e18d3bd7351eaa74f477505268c1e4e1fd1ca3ccccdefb2595517343bbb8f5589c435c3c39323a4c0080f8 @@ -0,0 +1 @@ +o8TqdqYeELpK0-R0J3OhqTAjzO3nA05D82L7voCS0YM= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0x96947de9e6068c22a7716656a2755a9551b0b66c2d1a741bf84a088fe1e840e992dc39861bf8ba3e8d5b6d21e8f57e64 b/ops/docker/layer1/keystores/layer1/secrets/0x96947de9e6068c22a7716656a2755a9551b0b66c2d1a741bf84a088fe1e840e992dc39861bf8ba3e8d5b6d21e8f57e64 new file mode 100644 index 000000000..4cca50f28 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0x96947de9e6068c22a7716656a2755a9551b0b66c2d1a741bf84a088fe1e840e992dc39861bf8ba3e8d5b6d21e8f57e64 @@ -0,0 +1 @@ +E39ZFm0FK64pO2a19Gi8SkelsNTLSUq1FcVxY1CSQng= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0x996323af7e545fb6363ace53f1538c7ddc3eb0d985b2479da3ee4ace10cbc393b518bf02d1a2ddb2f5bdf09b473933ea b/ops/docker/layer1/keystores/layer1/secrets/0x996323af7e545fb6363ace53f1538c7ddc3eb0d985b2479da3ee4ace10cbc393b518bf02d1a2ddb2f5bdf09b473933ea new file mode 100644 index 000000000..c93f662d2 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0x996323af7e545fb6363ace53f1538c7ddc3eb0d985b2479da3ee4ace10cbc393b518bf02d1a2ddb2f5bdf09b473933ea @@ -0,0 +1 @@ +6J_smE458smJp2ZBoq5MYjKzuRas-CUzRW1WxByY44k= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0x996d10c3026b9344532b06c70a596f972a1e779a1f6106d3da9f6ba376bbf7ec82d2f52629e5dbf3f7d03b00f6b862af b/ops/docker/layer1/keystores/layer1/secrets/0x996d10c3026b9344532b06c70a596f972a1e779a1f6106d3da9f6ba376bbf7ec82d2f52629e5dbf3f7d03b00f6b862af new file mode 100644 index 000000000..7b4b42275 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0x996d10c3026b9344532b06c70a596f972a1e779a1f6106d3da9f6ba376bbf7ec82d2f52629e5dbf3f7d03b00f6b862af @@ -0,0 +1 @@ +TPSwkifoWQIxIhPazgESo0ZIYlMdbSGWRzEBLXUQ4BA= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xa03c2a82374e04b2e0594c4ce14fb3f225b46f13188f0d8002a523c7dcfb939ae4856053c2c9c695374d7c3685df1ca5 b/ops/docker/layer1/keystores/layer1/secrets/0xa03c2a82374e04b2e0594c4ce14fb3f225b46f13188f0d8002a523c7dcfb939ae4856053c2c9c695374d7c3685df1ca5 new file mode 100644 index 000000000..49ce9eee1 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xa03c2a82374e04b2e0594c4ce14fb3f225b46f13188f0d8002a523c7dcfb939ae4856053c2c9c695374d7c3685df1ca5 @@ -0,0 +1 @@ +5j-TkOPp5kYICAQQJhUOEngEjSl6Q8OuXkqCD5vEP2I= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xa1584dfe1573df8ec88c7b74d76726b4821bfe84bf886dd3c0e3f74c2ea18aa62ca44c871fb1c63971fccf6937e6501f b/ops/docker/layer1/keystores/layer1/secrets/0xa1584dfe1573df8ec88c7b74d76726b4821bfe84bf886dd3c0e3f74c2ea18aa62ca44c871fb1c63971fccf6937e6501f new file mode 100644 index 000000000..33d4f3c1c --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xa1584dfe1573df8ec88c7b74d76726b4821bfe84bf886dd3c0e3f74c2ea18aa62ca44c871fb1c63971fccf6937e6501f @@ -0,0 +1 @@ +vMEIX4TeB3tk56Ket1pMWjofSgAgGCJ6ZaCc2YMJbWs= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xa1d9840eda3036fbf63eeea40146e4548553e6e1b2a653ab349b376f31b367c40d71fb59ff8e94b91daa99c262ec8b52 b/ops/docker/layer1/keystores/layer1/secrets/0xa1d9840eda3036fbf63eeea40146e4548553e6e1b2a653ab349b376f31b367c40d71fb59ff8e94b91daa99c262ec8b52 new file mode 100644 index 000000000..7fd6bc709 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xa1d9840eda3036fbf63eeea40146e4548553e6e1b2a653ab349b376f31b367c40d71fb59ff8e94b91daa99c262ec8b52 @@ -0,0 +1 @@ +dJXqUc9MPTRrG-1M6CCnqLg1ShOpNicOV2iRflvjPFk= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xa35c6004f387430c3797ab0157af7b824c8fe106241c7cdeb897d900c0f9e4bb945ff2a6b88cbd10e35ec48aaa554ecb b/ops/docker/layer1/keystores/layer1/secrets/0xa35c6004f387430c3797ab0157af7b824c8fe106241c7cdeb897d900c0f9e4bb945ff2a6b88cbd10e35ec48aaa554ecb new file mode 100644 index 000000000..8988cc553 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xa35c6004f387430c3797ab0157af7b824c8fe106241c7cdeb897d900c0f9e4bb945ff2a6b88cbd10e35ec48aaa554ecb @@ -0,0 +1 @@ +qDNu0WskAg1qQr4b8YRJGUrGvBmwrDexshqVTRUahkw= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xa54fe5c26059ed60b4f0b66ef7b0bf167580504525f83c169507dc812816df41b1da6128341c23977300dffd32a32f41 b/ops/docker/layer1/keystores/layer1/secrets/0xa54fe5c26059ed60b4f0b66ef7b0bf167580504525f83c169507dc812816df41b1da6128341c23977300dffd32a32f41 new file mode 100644 index 000000000..ad8c06711 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xa54fe5c26059ed60b4f0b66ef7b0bf167580504525f83c169507dc812816df41b1da6128341c23977300dffd32a32f41 @@ -0,0 +1 @@ +ZFub7IkE88rO8iSgfckfzzmmUFqdAN0ydOBhLbBZvdY= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xa75ca9447dca3a3745ada36731187ddd1f6a152cf15d7446b785eab381e5c8562c1202a6e7a24080bc6b619a161113db b/ops/docker/layer1/keystores/layer1/secrets/0xa75ca9447dca3a3745ada36731187ddd1f6a152cf15d7446b785eab381e5c8562c1202a6e7a24080bc6b619a161113db new file mode 100644 index 000000000..25f5e12c5 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xa75ca9447dca3a3745ada36731187ddd1f6a152cf15d7446b785eab381e5c8562c1202a6e7a24080bc6b619a161113db @@ -0,0 +1 @@ +3CZgGV4YmAfvbb2wUhYmC3J_fH6v502RKjHwGmViwEU= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xa804e4fa8d1391a9d078aa93985a12503b84ce4f6f1f9e70ab7fca421e1cf972538666299d4c1bfc39327b469b2db7a8 b/ops/docker/layer1/keystores/layer1/secrets/0xa804e4fa8d1391a9d078aa93985a12503b84ce4f6f1f9e70ab7fca421e1cf972538666299d4c1bfc39327b469b2db7a8 new file mode 100644 index 000000000..276b85e73 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xa804e4fa8d1391a9d078aa93985a12503b84ce4f6f1f9e70ab7fca421e1cf972538666299d4c1bfc39327b469b2db7a8 @@ -0,0 +1 @@ +_Au4lfBPnpnpIZgh4k2DtmlEt3O2an1Ra91Q4E5YNtQ= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xaaddb0cb69ca18f14aed7054e98a24df0ff606aeff919d489f7884fd1bd183bcb46ea54bc363146e1a88db36dc20a7a4 b/ops/docker/layer1/keystores/layer1/secrets/0xaaddb0cb69ca18f14aed7054e98a24df0ff606aeff919d489f7884fd1bd183bcb46ea54bc363146e1a88db36dc20a7a4 new file mode 100644 index 000000000..20068612a --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xaaddb0cb69ca18f14aed7054e98a24df0ff606aeff919d489f7884fd1bd183bcb46ea54bc363146e1a88db36dc20a7a4 @@ -0,0 +1 @@ +khEI292Bierz0cGZ4vMLew2JeU7LU_gss8FwVWwnKmc= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xaaf6c1251e73fb600624937760fef218aace5b253bf068ed45398aeb29d821e4d2899343ddcbbe37cb3f6cf500dff26c b/ops/docker/layer1/keystores/layer1/secrets/0xaaf6c1251e73fb600624937760fef218aace5b253bf068ed45398aeb29d821e4d2899343ddcbbe37cb3f6cf500dff26c new file mode 100644 index 000000000..0975a8662 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xaaf6c1251e73fb600624937760fef218aace5b253bf068ed45398aeb29d821e4d2899343ddcbbe37cb3f6cf500dff26c @@ -0,0 +1 @@ +rRg3dBHEB0rNd3ws39VbrU9O0TGz8ub5THCab-brfXg= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xab72cbc6575c3179680a58c0ecd5de46d2678ccbafc016746348ee5688edcb21b4e15bd37c70c508e3ea73103c2d566b b/ops/docker/layer1/keystores/layer1/secrets/0xab72cbc6575c3179680a58c0ecd5de46d2678ccbafc016746348ee5688edcb21b4e15bd37c70c508e3ea73103c2d566b new file mode 100644 index 000000000..b35c36749 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xab72cbc6575c3179680a58c0ecd5de46d2678ccbafc016746348ee5688edcb21b4e15bd37c70c508e3ea73103c2d566b @@ -0,0 +1 @@ +GtHr5sN3W-KTOUvA3OSfuPEFUAhOGn9wl97F2smo_EE= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xabd12678c73463ecea5867a80caf256d5c5e6ba53ff188b143a4d5be83365ad257edf39eaa1ba8753c4cdf4c632ff99e b/ops/docker/layer1/keystores/layer1/secrets/0xabd12678c73463ecea5867a80caf256d5c5e6ba53ff188b143a4d5be83365ad257edf39eaa1ba8753c4cdf4c632ff99e new file mode 100644 index 000000000..4f0c999b9 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xabd12678c73463ecea5867a80caf256d5c5e6ba53ff188b143a4d5be83365ad257edf39eaa1ba8753c4cdf4c632ff99e @@ -0,0 +1 @@ +rzUo8KPugtBDRv84uGoultyzCdnxIViLekhy6qrZZL0= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xac69ae9e6c385a368df71d11ac68f45f05e005306df3c2bf98ed3577708256bd97f8c09d3f72115444077a9bb711d8d1 b/ops/docker/layer1/keystores/layer1/secrets/0xac69ae9e6c385a368df71d11ac68f45f05e005306df3c2bf98ed3577708256bd97f8c09d3f72115444077a9bb711d8d1 new file mode 100644 index 000000000..d5b9b41ba --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xac69ae9e6c385a368df71d11ac68f45f05e005306df3c2bf98ed3577708256bd97f8c09d3f72115444077a9bb711d8d1 @@ -0,0 +1 @@ +DQJZCL9IOKlbpyN29EBIdM4sUklMu7zc1IKTrK9VE60= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xad9222dec71ff8ee6bc0426ffe7b5e66f96738225db281dd20027a1556d089fdebd040abfbc2041d6c1a0d8fdcfce183 b/ops/docker/layer1/keystores/layer1/secrets/0xad9222dec71ff8ee6bc0426ffe7b5e66f96738225db281dd20027a1556d089fdebd040abfbc2041d6c1a0d8fdcfce183 new file mode 100644 index 000000000..04a5e8f4a --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xad9222dec71ff8ee6bc0426ffe7b5e66f96738225db281dd20027a1556d089fdebd040abfbc2041d6c1a0d8fdcfce183 @@ -0,0 +1 @@ +VMftlRJfjSD_8oc4maA_pV-IhJRyf1s2jBn_HwK3HjE= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xae5302796cfeca685eaf37ffd5baeb32121f2f07415bee26cc0051ee513ff3932d2c365e3d9f87b0949a5980445cb64c b/ops/docker/layer1/keystores/layer1/secrets/0xae5302796cfeca685eaf37ffd5baeb32121f2f07415bee26cc0051ee513ff3932d2c365e3d9f87b0949a5980445cb64c new file mode 100644 index 000000000..c1c395fd3 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xae5302796cfeca685eaf37ffd5baeb32121f2f07415bee26cc0051ee513ff3932d2c365e3d9f87b0949a5980445cb64c @@ -0,0 +1 @@ +1y8B2Q0VKtGC71U5d4hllb7wGSmxM2T8zW_PhOuneB4= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xae940a07850cf904b44f31cbf0e44824bae5ec36dcfdb7fad858f2a39dba38de82ca12b0ae939a34fce7a02e4b9789f8 b/ops/docker/layer1/keystores/layer1/secrets/0xae940a07850cf904b44f31cbf0e44824bae5ec36dcfdb7fad858f2a39dba38de82ca12b0ae939a34fce7a02e4b9789f8 new file mode 100644 index 000000000..addf60c12 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xae940a07850cf904b44f31cbf0e44824bae5ec36dcfdb7fad858f2a39dba38de82ca12b0ae939a34fce7a02e4b9789f8 @@ -0,0 +1 @@ +qETVYVop1wqSdueWixO_CDeb29an1pV6pkGs3T8t2oE= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xafa10af166a0dbf3a25ff86cd6f8e44cccc818c5e70cd70e4e98e226b158f3563450b3fb184d2649adbb11e53080d1ca b/ops/docker/layer1/keystores/layer1/secrets/0xafa10af166a0dbf3a25ff86cd6f8e44cccc818c5e70cd70e4e98e226b158f3563450b3fb184d2649adbb11e53080d1ca new file mode 100644 index 000000000..142831492 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xafa10af166a0dbf3a25ff86cd6f8e44cccc818c5e70cd70e4e98e226b158f3563450b3fb184d2649adbb11e53080d1ca @@ -0,0 +1 @@ +GtHF8DbPC-1zy36sQVfRz_eEXcTphPoFcczyfPal6gQ= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xb27ad13afc8ff30e087797b344c8382bb0a84447549f1b0274059ddd652276e7b148ba8808a10cc45746762957d4efbe b/ops/docker/layer1/keystores/layer1/secrets/0xb27ad13afc8ff30e087797b344c8382bb0a84447549f1b0274059ddd652276e7b148ba8808a10cc45746762957d4efbe new file mode 100644 index 000000000..9a5b66574 --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xb27ad13afc8ff30e087797b344c8382bb0a84447549f1b0274059ddd652276e7b148ba8808a10cc45746762957d4efbe @@ -0,0 +1 @@ +6wIGp35d-hjuXqk_mu4F-vWQRspOyaESCRHOBuamqAI= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xb570dde8ee80512e3d031caf22e775c60f7f5a6cbdeb3e52e24cf8c867d38569a53dd19cdc36a03a1bbb3a8d94b03670 b/ops/docker/layer1/keystores/layer1/secrets/0xb570dde8ee80512e3d031caf22e775c60f7f5a6cbdeb3e52e24cf8c867d38569a53dd19cdc36a03a1bbb3a8d94b03670 new file mode 100644 index 000000000..3950f698d --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xb570dde8ee80512e3d031caf22e775c60f7f5a6cbdeb3e52e24cf8c867d38569a53dd19cdc36a03a1bbb3a8d94b03670 @@ -0,0 +1 @@ +4uT82wJlHt1kGimFo3gffv35MqlITD7O42-zpYYEOJ4= \ No newline at end of file diff --git a/ops/docker/layer1/keystores/layer1/secrets/0xb72cb106b7bc1ecae219e0ae1830a509ed18a042b56a2779f4033419de69ba8ae8017090caed1f5377bfa68506157360 b/ops/docker/layer1/keystores/layer1/secrets/0xb72cb106b7bc1ecae219e0ae1830a509ed18a042b56a2779f4033419de69ba8ae8017090caed1f5377bfa68506157360 new file mode 100644 index 000000000..0c013f70d --- /dev/null +++ b/ops/docker/layer1/keystores/layer1/secrets/0xb72cb106b7bc1ecae219e0ae1830a509ed18a042b56a2779f4033419de69ba8ae8017090caed1f5377bfa68506157360 @@ -0,0 +1 @@ +SQO5GHmhiJqumLZh8TzJ0mT-B_7w3b1worvAUnRZTKw= \ No newline at end of file diff --git a/ops/docker/layer1/scripts/clean.sh b/ops/docker/layer1/scripts/clean.sh new file mode 100755 index 000000000..934612b3a --- /dev/null +++ b/ops/docker/layer1/scripts/clean.sh @@ -0,0 +1,87 @@ +#!/bin/bash + +# Clean script to reset the network to initial state +# Removes all generated files from generate-genesis and docker compose data + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" + +echo "=== Cleaning Network Data ===" + +cd "$PROJECT_DIR/.." + +# Stop and remove only layer1 containers +echo "Stopping and removing layer1 containers..." +docker compose -f docker-compose-4nodes.yml stop layer1-el layer1-cl layer1-vc 2>/dev/null || true +docker compose -f docker-compose-4nodes.yml rm -f layer1-el layer1-cl layer1-vc 2>/dev/null || true + +# Remove layer1 volumes +echo "Removing layer1 volumes..." +docker volume rm docker_layer1-el-data docker_layer1-cl-data docker_layer1-vc-data 2>/dev/null || true + +# Remove generated genesis files +echo "Removing generated genesis files..." +if [ -d "layer1/genesis" ]; then + # Remove all generated genesis files - everything in genesis/ is generated by generate-genesis.sh + # These files are regenerated each time generate-genesis.sh runs + rm -rf layer1/genesis/genesis.json + rm -rf layer1/genesis/genesis.ssz + rm -rf layer1/genesis/config.yaml + rm -rf layer1/genesis/metadata + rm -rf layer1/genesis/parsed + rm -rf layer1/genesis/network-configs + rm -rf layer1/genesis/jwt + # Remove all other generated files from ethereum-genesis-generator + rm -f layer1/genesis/*.json + rm -f layer1/genesis/*.yaml + rm -f layer1/genesis/*.txt + rm -f layer1/genesis/*.ssz + echo "✓ Genesis files removed" +fi + +# Remove generated configs (but keep template) +echo "Removing generated config files..." +if [ -d "layer1/configs" ]; then + rm -f layer1/configs/values.env + rm -f layer1/configs/additional-contracts.json + echo "✓ Config files removed (template preserved)" +fi + +# Remove VC slashing protection database (if exists) +echo "Removing VC slashing protection database..." +if [ -d "layer1/keystores/layer1" ]; then + # Remove slashing protection database but keep keys and secrets + find layer1/keystores/layer1 -name "*.db" -o -name "*.sqlite" -o -name "*.sqlite3" | xargs rm -f 2>/dev/null || true + find layer1/keystores/layer1 -type d -name "slashing_protection" -exec rm -rf {} + 2>/dev/null || true + echo "✓ VC slashing protection database removed" +fi + +# Remove any remaining data directories +echo "Removing data directories..." +rm -rf data/ 2>/dev/null || true + +# Clean up any docker volumes that might remain +echo "Cleaning up Docker volumes..." +docker volume ls | grep -E "simple-ethereum-network|layer1-" | awk '{print $2}' | while read volume; do + docker volume rm "$volume" 2>/dev/null || true +done + +echo "" +echo "=== Cleanup Complete ===" +echo "" +echo "Removed:" +echo " - Generated genesis files (genesis.json, genesis.ssz, config.yaml, metadata/, parsed/)" +echo " - Generated config files (values.env, additional-contracts.json)" +echo " - Docker containers and volumes" +echo " - Data directories" +echo "" +echo "Preserved:" +echo " - Configuration templates (layer1/configs/values.env.template)" +echo " - JWT secret (layer1/jwt/jwtsecret)" +echo " - Keystores (layer1/keystores/)" +echo " - Docker Compose file (docker-compose-4nodes.yml)" +echo "" +echo "You can now run 'make generate' and 'make start' again to create a fresh network." + diff --git a/ops/docker/layer1/scripts/generate-genesis.sh b/ops/docker/layer1/scripts/generate-genesis.sh new file mode 100755 index 000000000..62a592c94 --- /dev/null +++ b/ops/docker/layer1/scripts/generate-genesis.sh @@ -0,0 +1,97 @@ +#!/bin/bash + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" + +GENESIS_DIR="$PROJECT_DIR/genesis" +KEYSTORES_DIR="$PROJECT_DIR/keystores" +JWT_DIR="$PROJECT_DIR/jwt" +CONFIGS_DIR="$PROJECT_DIR/configs" + +# Create necessary directories +mkdir -p "$GENESIS_DIR" "$CONFIGS_DIR" + +echo "=== Generating Genesis Data ===" + +# Calculate genesis timestamp (current time + 20 seconds) +GENESIS_TIMESTAMP=$(date -u +%s) +GENESIS_TIMESTAMP=$((GENESIS_TIMESTAMP + 20)) + +# Use ethereum-genesis-generator to generate genesis +echo "Generating genesis data..." + +# Create values.env file from template +VALUES_ENV_TEMPLATE="$SCRIPT_DIR/../configs/values.env.template" +VALUES_ENV="$CONFIGS_DIR/values.env" + +if [ ! -f "$VALUES_ENV_TEMPLATE" ]; then + echo "Error: Template file not found: $VALUES_ENV_TEMPLATE" + exit 1 +fi + +# Replace placeholders in template +sed -e "s/{{GENESIS_TIMESTAMP}}/$GENESIS_TIMESTAMP/g" \ + "$VALUES_ENV_TEMPLATE" > "$VALUES_ENV" + +# Create additional-contracts.json +ADDITIONAL_CONTRACTS="$CONFIGS_DIR/additional-contracts.json" +echo "[]" > "$ADDITIONAL_CONTRACTS" + +# Run genesis generator +# The generator creates files in /data/metadata/ which need to be moved to /data/ root +# Since /data is mounted to genesis/ on the host, moving to /data automatically puts files in genesis/ +# IMPORTANT: additional-contracts.json must be at /opt/additional-contracts.json as specified in values.env +echo "Running genesis generator..." +docker run --rm \ + -v "$CONFIGS_DIR/values.env:/opt/values.env" \ + -v "$CONFIGS_DIR/additional-contracts.json:/opt/additional-contracts.json" \ + -v "$GENESIS_DIR:/data" \ + --entrypoint="" \ + ethpandaops/ethereum-genesis-generator:5.1.0 \ + sh -c "cp /opt/values.env /config/values.env && /work/entrypoint.sh all && mv /data/metadata/* /data/ 2>/dev/null || true && [ -d /data/parsed ] && mv /data/parsed /data/ 2>/dev/null || true && rmdir /data/metadata 2>/dev/null || true" + +# Verify that files were generated (they should be directly in genesis/ now) +if [ ! -f "$GENESIS_DIR/genesis.json" ]; then + echo "❌ Error: genesis.json not found after generation" + exit 1 +fi + +# Check output +if [ -f "$GENESIS_DIR/genesis.json" ]; then + echo "✓ genesis.json generated successfully" +else + echo "❌ Error: genesis.json not generated" + exit 1 +fi + +if [ -f "$GENESIS_DIR/genesis.ssz" ]; then + echo "✓ genesis.ssz generated successfully" +else + echo "⚠ Warning: genesis.ssz not generated" +fi + +if [ -f "$GENESIS_DIR/config.yaml" ]; then + echo "✓ config.yaml generated successfully" +else + echo "⚠ Warning: config.yaml not generated" +fi + +if [ -f "$GENESIS_DIR/deposit_contract_block.txt" ]; then + echo "✓ deposit_contract_block.txt generated successfully" +else + echo "⚠ Warning: deposit_contract_block.txt not generated" +fi + +echo "" +echo "=== Genesis Data Generation Complete ===" +echo "Genesis files location: $GENESIS_DIR" +echo "Keystores location: $KEYSTORES_DIR" +echo "JWT secret location: $JWT_DIR/jwtsecret" +echo "" +echo "Genesis timestamp: $GENESIS_TIMESTAMP" +echo "Validator count: 32" +echo "" +echo "Lighthouse testnet-dir files:" +ls -1 "$GENESIS_DIR"/*.{yaml,ssz,txt} 2>/dev/null | xargs -n 1 basename | head -10 diff --git a/ops/docker/layer1/scripts/start.sh b/ops/docker/layer1/scripts/start.sh new file mode 100755 index 000000000..b57775b5d --- /dev/null +++ b/ops/docker/layer1/scripts/start.sh @@ -0,0 +1,58 @@ +#!/bin/bash + +set -e + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" +PROJECT_DIR="$(cd "$SCRIPT_DIR/.." && pwd)" + +# Check if genesis files exist +if [ ! -f "$PROJECT_DIR/genesis/genesis.json" ]; then + echo "Error: genesis.json does not exist, please run ./scripts/generate-genesis.sh first" + exit 1 +fi + +if [ ! -f "$PROJECT_DIR/genesis/genesis.ssz" ]; then + echo "Error: genesis.ssz does not exist, please run ./scripts/generate-genesis.sh first" + exit 1 +fi + +if [ ! -f "$PROJECT_DIR/jwt/jwtsecret" ]; then + echo "Error: jwtsecret does not exist, please run ./scripts/generate-genesis.sh first" + exit 1 +fi + +echo "=== Starting Ethereum Network ===" + +cd "$PROJECT_DIR/.." + +# Start all services +docker compose -f docker-compose-4nodes.yml up -d layer1-el layer1-cl layer1-vc + +echo "" +echo "Waiting for containers to start..." +sleep 15 + +# Wait for EL node initialization to complete +echo "Waiting for EL node initialization..." +for i in {1..30}; do + if docker exec layer1-el geth --exec "eth.blockNumber" attach http://localhost:8545 > /dev/null 2>&1; then + echo "Layer1 EL is ready" + break + fi + sleep 2 +done + +echo "" +echo "=== Network Started Successfully ===" +echo "" +echo "Access ports:" +echo " Layer1 EL RPC: http://localhost:9545" +echo " Layer1 EL WebSocket: ws://localhost:9546" +echo " Layer1 CL HTTP API: http://localhost:4000" +echo " Layer1 CL Metrics: http://localhost:5054" +echo "" +echo "View logs:" +echo " docker compose -f docker-compose-4nodes.yml logs -f layer1-el layer1-cl layer1-vc" +echo "" +echo "Stop network:" +echo " docker compose -f docker-compose-4nodes.yml down" diff --git a/ops/l2-genesis/cmd/genesis/cmd.go b/ops/l2-genesis/cmd/genesis/cmd.go index 30f249e54..aac68d399 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/devnet-deploy-config.json b/ops/l2-genesis/deploy-config/devnet-deploy-config.json index 0dfc49866..46923a4b4 100644 --- a/ops/l2-genesis/deploy-config/devnet-deploy-config.json +++ b/ops/l2-genesis/deploy-config/devnet-deploy-config.json @@ -1,42 +1,42 @@ { "l1ChainID": 900, "l2ChainID": 53077, - "finalSystemOwner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", "proxyAdminOwner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "BLOCK_SIGNER_PRIVATE_KEY": "3e4bde571b86929bf08e2aaad9a6a1882664cd5e65b96fff7d03e1c4e6dfa15c", "BLOCK_SIGNER_ADDRESS": "0xca062b0fd91172d89bcd4bb084ac4e21972cc467", - "l1FeeVaultRecipient": "0x71bE63f3384f5fb98995898A86B02Fb2426c5788", "sequencerFeeVaultRecipient": "0xfabb0ac9d68b0b445fb7357272ff202c5651694a", "l2BridgeFeeVaultRecipient": "0xfabb0ac9d68b0b445fb7357272ff202c5651694a", "fundDevAccounts": true, - "l1StartingBlockTag": "earliest", "maxTxPerBlock": 1000, - "gasPriceOracleOverhead": 2500, "gasPriceOracleScalar": 1000000000, "gasPriceOracleOwner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", - "govVotingDuration": 1000, "govBatchBlockInterval": 20, "govBatchTimeout": 600, "govRollupEpoch": 100, - "recordOracleAddress": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", "recordNextBatchSubmissionIndex": 1, - "morphTokenName": "Morph Token", "morphTokenSymbol": "Morph", "morphTokenOwner": "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266", "morphTokenInitialSupply": 1000000000, "morphTokenDailyInflationRate": 1, - + "morph203Time": 0, + "viridianTime": 0, + "emeraldTime": 0, "l2StakingSequencerMaxSize": 4, "l2StakingUnDelegatedLockEpochs": 2, "l2StakingRewardStartTime": 1728000000, + "l2StakingPks": [ + "0xd99870855d97327d20c666abc78588f1449b1fac76ed0c86c1afb9ce2db85f32", + "0x0890c388c3bf5e04fee1d8f3c117e5f44f435ced7baf7bfd66c10e1f3a3f4b10", + "0x6fd437eef7a83c486bd2e0a802ae071b3912d125ac31ac08f60841fd891559ae", + "0x9ae53aecdaebe4dcbfec96f3123a2a8c53f9596bf4b3d5adc9a388ccb361b4c0" + ], "l2StakingAddresses": [ "0x783698dCDEBdc96785c5c60ED96113612bA09c2b", "0x310824AA27a29D269d2F9C0a8563C0e3C98dD226", @@ -55,4 +55,4 @@ "0x0000000000000000000000000000000003fd9468a8ceffc1b696874517777ef8bfdc9a1bade95c480ee2624903e648c1caf01c65de5b4fda8876a3a0e8d9f0890000000000000000000000000000000004c02f3609a0f61d12fe737dcbb047d5253bd3ff905b55c0e0f932b476fd77d172a58b72ef0f506407870988dd6038220000000000000000000000000000000017fa5765899f60f7a58f8ccdaaa295cde55992231710672692ba6a71a4faa9572f728f438ded65576a570d57e19fd304000000000000000000000000000000001226138813bde98af3464ed03649d8c731bc4e5cb3d26b53bf7483f4105d18bbb3f19e23905119e156e7d003d2fd125c", "0x00000000000000000000000000000000109bf02a2636c0dc1968b0a50db77251eb090c3e9f51e2a2bc60c4ac72213f41f01f0a34e92c2e0625bd62e28e27edb500000000000000000000000000000000139969bd92522113c0615659874d1fae311ad8152d0584c7b57ffc14927067486dcf86413c5684fccc1163ee2d45c1c1000000000000000000000000000000000f172603f70a0730d100ad6d28bde477195987062e8ade83b82d093935d956ff20ca768c26263577b094f1cb756adc400000000000000000000000000000000010dde3acca00b4ff1b4976500a8f97e92246f43f78cadc95c4993dfc4f4c501c33d42a4bf52587f4931287b59623149c" ] -} +} \ No newline at end of file diff --git a/ops/l2-genesis/deploy-config/hoodi-deploy-config.json b/ops/l2-genesis/deploy-config/hoodi-deploy-config.json new file mode 100644 index 000000000..2840d59fd --- /dev/null +++ b/ops/l2-genesis/deploy-config/hoodi-deploy-config.json @@ -0,0 +1,50 @@ +{ + "l1ChainID": 560048, + "l2ChainID": 2910, + "l2GenesisBlockTimestamp": "0x68CCF160", + + "finalSystemOwner": "0x2910beed7B7F86f4bE9907b2e91FA0a216a67f2E", + "proxyAdminOwner": "0x2910beed7B7F86f4bE9907b2e91FA0a216a67f2E", + + "l1FeeVaultRecipient": "0x29107CB79Ef8f69fE1587F77e283d47E84c5202f", + "sequencerFeeVaultRecipient": "0x29107CB79Ef8f69fE1587F77e283d47E84c5202f", + "l2BridgeFeeVaultRecipient": "0x29107CB79Ef8f69fE1587F77e283d47E84c5202f", + "fundDevAccounts": false, + + "l1StartingBlockTag": "earliest", + "maxTxPerBlock": 100, + + "gasPriceOracleOverhead": 2500, + "gasPriceOracleScalar": 1000000000, + "gasPriceOracleOwner": "0x2910beed7B7F86f4bE9907b2e91FA0a216a67f2E", + + "recordOracleAddress": "0x291013E884C338A4BD6Ef083Bb7dC649662d49E0", + "recordNextBatchSubmissionIndex": 1, + + "govVotingDuration": 1000, + "govBatchBlockInterval": 600, + "govBatchTimeout": 1200, + "govRollupEpoch": 600, + + "l2StakingSequencerMaxSize": 4, + "l2StakingUnDelegatedLockEpochs": 4, + "l2StakingRewardStartTime": 1764460800, + "l2StakingAddresses": [ + "0x48446b07A04307F320fa34790116d73aD4A51810", + "0x48447a9d66D8eAE067e59E3F9f7E6B5f1b5E7581", + "0x4844631425Ed76D79164c37CA9d558bd5FB12662", + "0x4844ede12C743845dfae266A6BE891F114702583" + ], + "l2StakingTmKeys": [ + "0xa4f3a7fb882c3159398f520e3c89a39dc9818235fea07789995a9ce7b4aba31d", + "0x0535824f72998615ac8265c12c9cfc63d315d8f3e849aa1857f42b11cfc5d72c", + "0x3a50197cbfdbe5bbd85ff13b0d55ddc08ecd5dbddbc012880ba1358562e192bd", + "0x814ce757e9727768f25ead4619efa552d9f8facad85236c0a774d0b21fae28ea" + ], + "l2StakingBlsKeys": [ + "0x0000000000000000000000000000000017c22eb22cfacc028f8556a10ed0dcf56f4189c03c57103498bebc38df3f04202a1bf2ae6361bd0fd0c606e5a5d1122500000000000000000000000000000000115359ea50bb5e0bc9a72d5d96dbe5425aad06b7c4f9b18c30534d8237de9f3d94df3fd38e2e19bf572cda4e76dfd7200000000000000000000000000000000001584eb7275c2678f41b1649c4de05acecffa73f998c30995e934b01029257a6466964b68d4ea34c64ac1807f57bad0c0000000000000000000000000000000016d8f19d0fb3f0428c5fe338ca6bdb4b93e49f106267a106b11bde1bc4b795a119cbd8bfcd21d5be79b83fabc43c1d1e", + "0x0000000000000000000000000000000018ca6c24a492491ccbc97b0743c52e188ccbf4c42fe858a22ece10c96d99af4c80a3c73b2b199f1bc35adf2b42be86e700000000000000000000000000000000028ebe1896404b3a9f3609d61b55c8a13aed4c2ba951fb081d0982bebcd072ea2fa5a90bd581565e4277be1b86b201c80000000000000000000000000000000009f5d61b5b90288ba4650db5865235935447e4999ed773965db1cc663d14bd30e364244f8f97cbdb9483591366d11db00000000000000000000000000000000015d1d71cb633e1a33b7e7432b268d94453704f0fcd54dbf223d294c969c4ea9285d807a42d785d6198d3a361be98fdf7", + "0x000000000000000000000000000000000c666fbafcde1b34ac662d6edd8ddaca29fb406c27bdb4b45114409d1d6b3a1415efcb88a9adf94a925f255a7e3b4cb300000000000000000000000000000000097f204c34019966d2f1f2e57572e534d51f93f5c2e372bf15bdb031eefa72398fb5c773c217365df980c9c6b3480962000000000000000000000000000000000b1d419b65cf9d415ae3dc213f41296623517efeea8a6b97ed31aacfd75a9d0c15b1b59091fa185981ce1b45b85291240000000000000000000000000000000007085c7d37c0b2ac925b75b1f86ea93cbfc60909ddabbc7a1d89cc24b1766e4bdfc3e88cf405a7cd8e8137050777a8e7", + "0x0000000000000000000000000000000017cb2706bf579e0043486627a62d7b4b9f868585bab1eb584253e54d57cc6e8d5851d4260df693f2e671eadf5daac13b000000000000000000000000000000001176bb97fd0c8d1ecec2d240ffe9db99305ef00fdd2341590970dde0e34f26c672b5bb3ecd2e91fa66c349cba9f2f77a000000000000000000000000000000000220ff827a48e8a21e7ec9c73432fa47453d275de48fbc1988dad49e58123a91ba1e8f0463c2f6913a5efff41f3100a2000000000000000000000000000000000219da2bc157d03525b20e6ec00d2edb312ab654c107465dfe9c2b19e2c07639c02bbbe19ba5ab0202110ba7b7d72c90" + ] +} diff --git a/ops/l2-genesis/deploy-config/qanet-deploy-config.json b/ops/l2-genesis/deploy-config/qanet-deploy-config.json index 6bb1d033e..530a442b7 100644 --- a/ops/l2-genesis/deploy-config/qanet-deploy-config.json +++ b/ops/l2-genesis/deploy-config/qanet-deploy-config.json @@ -1,43 +1,36 @@ { "l1ChainID": 900, "l2ChainID": 53077, - "finalSystemOwner": "0x716173f5BBE0b4B51AaDF5A5840fA9A79D01636E", "proxyAdminOwner": "0x716173f5BBE0b4B51AaDF5A5840fA9A79D01636E", - "BLOCK_SIGNER_PRIVATE_KEY": "3e4bde571b86929bf08e2aaad9a6a1882664cd5e65b96fff7d03e1c4e6dfa15c", "BLOCK_SIGNER_ADDRESS": "0xca062b0fd91172d89bcd4bb084ac4e21972cc467", - "l1FeeVaultRecipient": "0x716170D0687c3d31CC10DebE0dAa1DDD3FE3D792", "sequencerFeeVaultRecipient": "0x716170D0687c3d31CC10DebE0dAa1DDD3FE3D792", "l2BridgeFeeVaultRecipient": "0x716170D0687c3d31CC10DebE0dAa1DDD3FE3D792", "fundDevAccounts": false, - "l1StartingBlockTag": "earliest", "maxTxPerBlock": 1000, "maxTxPayloadBytesPerBlock": 122880, - "gasPriceOracleOverhead": 2500, "gasPriceOracleScalar": 1000000000, "gasPriceOracleOwner": "0x71612D2b36859fbad5865085be7c9dEB026bBCbC", - "govVotingDuration": 1000, "govBatchBlockInterval": 600, "govBatchTimeout": 1200, "govRollupEpoch": 100, - "l2GenesisBlockGasLimit": "0xbebc200", "useMPT": false, - "recordOracleAddress": "0x7161F66BDf7C980B61b426122BBEfff813c0cdF0", "recordNextBatchSubmissionIndex": 1, - + "morph203Time": 0, + "viridianTime": 0, + "emeraldTime": 0, "morphTokenName": "Morph Token", "morphTokenSymbol": "Morph", "morphTokenOwner": "0x716173f5BBE0b4B51AaDF5A5840fA9A79D01636E", "morphTokenInitialSupply": 1000000000, "morphTokenDailyInflationRate": 1596535874529, - "l2StakingSequencerMaxSize": 4, "l2StakingUnDelegatedLockEpochs": 2, "l2StakingRewardStartTime": 1728000000, diff --git a/ops/l2-genesis/go.mod b/ops/l2-genesis/go.mod index cd5ed08c0..e464485c4 100644 --- a/ops/l2-genesis/go.mod +++ b/ops/l2-genesis/go.mod @@ -1,31 +1,31 @@ module morph-l2/morph-deployer -go 1.22 +go 1.24.0 -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.3 require ( github.com/holiman/uint256 v1.2.4 - github.com/morph-l2/go-ethereum v1.10.14-0.20241224100051-1582a364edc0 - github.com/stretchr/testify v1.9.0 - github.com/urfave/cli v1.22.14 + github.com/morph-l2/go-ethereum v1.10.14-0.20260211074551-4f0f6e6bd141 + github.com/stretchr/testify v1.10.0 + github.com/urfave/cli v1.22.17 ) require ( github.com/VictoriaMetrics/fastcache v1.12.2 // indirect - github.com/bits-and-blooms/bitset v1.7.0 // indirect + github.com/bits-and-blooms/bitset v1.20.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.2.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.12.1 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect - github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect + github.com/consensys/bavard v0.1.27 // indirect + github.com/consensys/gnark-crypto v0.16.0 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect + github.com/crate-crypto/go-eth-kzg v1.4.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/deckarep/golang-set v1.8.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect github.com/edsrzf/mmap-go v1.1.0 // indirect - github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4 // indirect - github.com/fjl/memsize v0.0.2 // indirect + github.com/ethereum/c-kzg-4844/v2 v2.1.5 // indirect + github.com/ethereum/go-ethereum v1.10.26 // indirect github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.1 // indirect @@ -42,10 +42,9 @@ require ( github.com/huin/goupnp v1.3.0 // indirect github.com/iden3/go-iden3-crypto v0.0.16 // indirect github.com/jackpal/go-nat-pmp v1.0.2 // indirect - github.com/kr/text v0.2.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/pointerstructure v1.2.1 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect @@ -53,24 +52,24 @@ require ( github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/tsdb v0.10.0 // indirect - github.com/rivo/uniseg v0.4.3 // indirect + github.com/rivo/uniseg v0.4.7 // indirect github.com/rjeczalik/notify v0.9.3 // indirect github.com/rs/cors v1.11.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect 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/supranational/blst v0.3.11 // indirect + github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe // 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 github.com/yusufpapurcu/wmi v1.2.3 // indirect - golang.org/x/crypto v0.23.0 // indirect + golang.org/x/crypto v0.35.0 // indirect golang.org/x/net v0.25.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect + golang.org/x/sync v0.11.0 // indirect + golang.org/x/sys v0.30.0 // indirect + golang.org/x/text v0.22.0 // indirect golang.org/x/time v0.5.0 // indirect gopkg.in/natefinch/lumberjack.v2 v2.2.1 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect diff --git a/ops/l2-genesis/go.sum b/ops/l2-genesis/go.sum index fbb92ea29..6907ac512 100644 --- a/ops/l2-genesis/go.sum +++ b/ops/l2-genesis/go.sum @@ -1,4 +1,4 @@ -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= @@ -8,8 +8,8 @@ github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= -github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo= -github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bits-and-blooms/bitset v1.20.0 h1:2F+rfL86jE2d/bmw7OhqUg2Sj/1rURkBn3MdfoPyRVU= +github.com/bits-and-blooms/bitset v1.20.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/btcsuite/btcd/btcec/v2 v2.2.1 h1:xP60mv8fvp+0khmrN0zTdPC3cNm24rfeE6lh2R/Yv3E= github.com/btcsuite/btcd/btcec/v2 v2.2.1/go.mod h1:9/CSmJxmuvqzX9Wh2fXMWToLOHhPd11lSPuIupwTkI8= github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= @@ -22,16 +22,14 @@ github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= -github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= -github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= -github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= -github.com/creack/pty v1.1.9/go.mod h1:oKZEueFk5CKHvIhNR5MUki03XCEU+Q6VDXinZuGJ33E= +github.com/consensys/bavard v0.1.27 h1:j6hKUrGAy/H+gpNrpLU3I26n1yc+VMGmd6ID5+gAhOs= +github.com/consensys/bavard v0.1.27/go.mod h1:k/zVjHHC4B+PQy1Pg7fgvG3ALicQw540Crag8qx+dZs= +github.com/consensys/gnark-crypto v0.16.0 h1:8Dl4eYmUWK9WmlP1Bj6je688gBRJCJbT8Mw4KoTAawo= +github.com/consensys/gnark-crypto v0.16.0/go.mod h1:Ke3j06ndtPTVvo++PhGNgvm+lgpLvzbcE2MqljY7diU= +github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo= +github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/crate-crypto/go-eth-kzg v1.4.0 h1:WzDGjHk4gFg6YzV0rJOAsTK4z3Qkz5jd4RE3DAvPFkg= +github.com/crate-crypto/go-eth-kzg v1.4.0/go.mod h1:J9/u5sWfznSObptgfa92Jq8rTswn6ahQWEuiLHOjCUI= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -45,10 +43,10 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3 github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= -github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4 h1:B2mpK+MNqgPqk2/KNi1LbqwtZDy5F7iy0mynQiBr8VA= -github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4/go.mod h1:y4GA2JbAUama1S4QwYjC2hefgGLU8Ul0GMtL/ADMF1c= -github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= -github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/ethereum/c-kzg-4844/v2 v2.1.5 h1:aVtoLK5xwJ6c5RiqO8g8ptJ5KU+2Hdquf6G3aXiHh5s= +github.com/ethereum/c-kzg-4844/v2 v2.1.5/go.mod h1:u59hRTTah4Co6i9fDWtiCjTrblJv0UwsqZKCc0GfgUs= +github.com/ethereum/go-ethereum v1.10.26 h1:i/7d9RBBwiXCEuyduBQzJw/mKmnvzsN14jqBmytw72s= +github.com/ethereum/go-ethereum v1.10.26/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= @@ -122,16 +120,16 @@ github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= -github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/leanovate/gopter v0.2.11 h1:vRjThO1EKPb/1NsDXuDrzldR28RLkBflWYcU9CvzWu4= +github.com/leanovate/gopter v0.2.11/go.mod h1:aK3tzZP/C+p1m3SPRE4SYZFGP7jjkuSI4f7Xvpt0S9c= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= -github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= @@ -143,8 +141,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.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.20260211074551-4f0f6e6bd141 h1:A8eygErKU6WKMipGWIemzwLeYkIGLd9yb/Ry3x+J9PQ= +github.com/morph-l2/go-ethereum v1.10.14-0.20260211074551-4f0f6e6bd141/go.mod h1:nkVzHjQWCOjvukQW8ittlwX+Xz9gmVHrP7mUi7zoHTs= 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= @@ -179,8 +177,8 @@ github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsT github.com/prometheus/tsdb v0.10.0 h1:If5rVCMTp6W2SiRAQFlbpJNgVlgMEd+U2GZckwK38ic= github.com/prometheus/tsdb v0.10.0/go.mod h1:oi49uRhEe9dPUTlS3JRZOwJuVi6tmh10QSgwXEyGCt4= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= -github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rjeczalik/notify v0.9.3 h1:6rJAzHTGKXGj76sbRgDiDcYj/HniypXmSJo1SWakZeY= github.com/rjeczalik/notify v0.9.3/go.mod h1:gF3zSOrafR9DQEWSE8TjfI9NkooDxbyT4UgRGKZA0lc= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= @@ -201,6 +199,7 @@ 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/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= @@ -208,10 +207,10 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= -github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe h1:nbdqkIGOGfUAD54q1s2YBcBz/WcsxCO9HUQ4aGV5hUw= +github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4= @@ -220,8 +219,8 @@ github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= -github.com/urfave/cli v1.22.14 h1:ebbhrRiGK2i4naQJr+1Xj92HXZCrK7MsyTS/ob3HnAk= -github.com/urfave/cli v1.22.14/go.mod h1:X0eDS6pD6Exaclxm99NJ3FiCDRED7vIHpx2mDOHLvkA= +github.com/urfave/cli v1.22.17 h1:SYzXoiPfQjHBbkYxbew5prZHS1TOLT3ierW8SYLqtVQ= +github.com/urfave/cli v1.22.17/go.mod h1:b0ht0aqgH/6pBYzzxURyrM4xXNgsoT/n2ZzwQiEhNVo= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= @@ -229,8 +228,8 @@ golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs= +golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -249,8 +248,8 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180926160741-c2ed4eda69e7/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -275,16 +274,16 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/ops/l2-genesis/hoodi-l2genesis.sh b/ops/l2-genesis/hoodi-l2genesis.sh new file mode 100755 index 000000000..4578919bf --- /dev/null +++ b/ops/l2-genesis/hoodi-l2genesis.sh @@ -0,0 +1,28 @@ +#!/bin/sh +set -eu + +source ../../contracts/.env +FOLDER=".hoodi" +CONTRACT_CONFIG="../../contracts/src/deploy-config/hoodi.ts" +echo "Regenerating genesis files" +# Check if the folder exists +if [ ! -d "$FOLDER" ]; then + echo "Folder not exists, mkdir $FOLDER" + mkdir "$FOLDER" +fi + + +RPC_URL="https://rpc.hoodi.ethpandaops.io" + +echo "RPC_URL is $RPC_URL" +cat "deploy-config/hoodi-deploy-config.json" > $FOLDER/hoodi-deploy-config.json +( +go run cmd/main.go genesis l2 \ +--l1-rpc $RPC_URL \ +--deploy-config $FOLDER/hoodi-deploy-config.json \ +--deployment-dir "$PWD/../../contracts/hoodi.json" \ +--outfile.l2 $FOLDER/genesis-l2.json \ +--outfile.rollup $FOLDER/rollup.json \ +--outfile.genbatchheader $FOLDER/genesis-batch-header.json +touch "$FOLDER/done" +) diff --git a/ops/l2-genesis/morph-chain-ops/genesis/config.go b/ops/l2-genesis/morph-chain-ops/genesis/config.go index 9102c780e..a87f38c04 100644 --- a/ops/l2-genesis/morph-chain-ops/genesis/config.go +++ b/ops/l2-genesis/morph-chain-ops/genesis/config.go @@ -125,6 +125,11 @@ type DeployConfig struct { //MorphTokenDailyInflationRate uint64 `json:"morphTokenDailyInflationRate"` FundDevAccounts bool `json:"fundDevAccounts"` + + // Upgrade configs + Morph203Time *uint64 `json:"morph203Time,omitempty"` + ViridianTime *uint64 `json:"viridianTime,omitempty"` + EmeraldTime *uint64 `json:"emeraldTime,omitempty"` } // GetDeployedAddresses will get the deployed addresses of deployed L1 contracts @@ -451,6 +456,12 @@ func NewL2StorageConfig(config *DeployConfig, baseFee *big.Int) (state.StorageCo // "_initialized": 1, // "_initializing": false, //} + storage["L2TokenRegistry"] = state.StorageValues{ + "_initialized": 1, + "_initializing": false, + "_owner": config.FinalSystemOwner, + "allowListEnabled": true, + } storage["Record"] = state.StorageValues{ "_initialized": 1, "_initializing": false, diff --git a/ops/l2-genesis/morph-chain-ops/genesis/genesis.go b/ops/l2-genesis/morph-chain-ops/genesis/genesis.go index 89f6ca4ad..7aae9cd7d 100644 --- a/ops/l2-genesis/morph-chain-ops/genesis/genesis.go +++ b/ops/l2-genesis/morph-chain-ops/genesis/genesis.go @@ -35,6 +35,21 @@ func NewL2Genesis(config *DeployConfig, block *types.Block) (*core.Genesis, erro sequencerFeeVaultReceipt = predeploys.L2TxFeeVaultAddr } + var morph203Time *uint64 + if config.Morph203Time != nil { + morph203Time = config.Morph203Time + } + + var viridianTime *uint64 + if config.ViridianTime != nil { + viridianTime = config.ViridianTime + } + + var emeraldTime *uint64 + if config.EmeraldTime != nil { + emeraldTime = config.EmeraldTime + } + morphChainConfig := params.ChainConfig{ ChainID: new(big.Int).SetUint64(config.L2ChainID), HomesteadBlock: big.NewInt(0), @@ -55,6 +70,9 @@ func NewL2Genesis(config *DeployConfig, block *types.Block) (*core.Genesis, erro ShanghaiBlock: big.NewInt(0), BernoulliBlock: big.NewInt(0), CurieBlock: big.NewInt(0), + Morph203Time: morph203Time, + ViridianTime: viridianTime, + EmeraldTime: emeraldTime, TerminalTotalDifficulty: big.NewInt(0), Morph: params.MorphConfig{ UseZktrie: true, diff --git a/ops/l2-genesis/morph-chain-ops/genesis/layer_two.go b/ops/l2-genesis/morph-chain-ops/genesis/layer_two.go index 3a376818f..46a517f8f 100644 --- a/ops/l2-genesis/morph-chain-ops/genesis/layer_two.go +++ b/ops/l2-genesis/morph-chain-ops/genesis/layer_two.go @@ -2,13 +2,16 @@ package genesis import ( "fmt" + "math/big" "github.com/morph-l2/go-ethereum/common" "github.com/morph-l2/go-ethereum/core" "github.com/morph-l2/go-ethereum/core/types" + "github.com/morph-l2/go-ethereum/core/vm" "github.com/morph-l2/go-ethereum/rollup/rcfg" "github.com/morph-l2/go-ethereum/rollup/withdrawtrie" + "morph-l2/bindings/predeploys" "morph-l2/morph-deployer/morph-chain-ops/state" ) @@ -50,5 +53,32 @@ func BuildL2DeveloperGenesis(config *DeployConfig, l1StartBlock *types.Block, cu withdrawRoot := withdrawtrie.ReadWTRSlot(rcfg.L2MessageQueueAddress, db) fmt.Println("get withdraw root:", withdrawRoot) + + // Verify L2TokenRegistry allowListEnabled configuration + if err = VerifyL2TokenRegistryConfig(db); err != nil { + return nil, common.Hash{}, fmt.Errorf("L2TokenRegistry verification failed: %w", err) + } + return db.Genesis(), withdrawRoot, nil } + +// VerifyL2TokenRegistryConfig verifies that L2TokenRegistry's allowListEnabled is set to true at slot 155 +func VerifyL2TokenRegistryConfig(db vm.StateDB) error { + contractAddr := predeploys.L2TokenRegistryAddr + // AllowListEnabledSlot = 155 + allowListEnabledSlot := common.BigToHash(big.NewInt(155)) + + // Read storage at slot 155 + storageValue := db.GetState(contractAddr, allowListEnabledSlot) + + // For bool type, true is represented as 0x01 (or any non-zero value in the last byte) + // Check if the last byte is non-zero + isEnabled := storageValue[31] != 0 + + if !isEnabled { + return fmt.Errorf("L2TokenRegistry allowListEnabled is not set to true at slot 155. Got: %s (value: %d)", storageValue.Hex(), storageValue[31]) + } + + fmt.Printf("✓ L2TokenRegistry allowListEnabled verified: true (slot 155 = %s, value = 0x%02x)\n", allowListEnabledSlot.Hex(), storageValue[31]) + return nil +} 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 8ce0e6ae8..56f945ac7 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/l2-genesis/morph-chain-ops/genesis/setters.go b/ops/l2-genesis/morph-chain-ops/genesis/setters.go index a41393383..16cacd182 100644 --- a/ops/l2-genesis/morph-chain-ops/genesis/setters.go +++ b/ops/l2-genesis/morph-chain-ops/genesis/setters.go @@ -5,6 +5,7 @@ import ( "math/big" "github.com/morph-l2/go-ethereum/common" + "github.com/morph-l2/go-ethereum/core/tracing" "github.com/morph-l2/go-ethereum/core/vm" "github.com/morph-l2/go-ethereum/log" @@ -28,7 +29,7 @@ var ( func FundDevAccounts(db vm.StateDB) { for _, account := range DevAccounts { db.CreateAccount(account) - db.AddBalance(account, devBalance) + db.AddBalance(account, devBalance, tracing.BalanceChangeUnspecified) } } @@ -106,7 +107,7 @@ func SetTouchable(db vm.StateDB, name string, address common.Address, storage st db.SetState(address, ImplementationSlot, codeAddr.Hash()) - if err := setupPredeploy(db, deployResults, slotResults, storage, name, address, codeAddr); err != nil { + if err = setupPredeploy(db, deployResults, slotResults, storage, name, address, codeAddr); err != nil { return err } @@ -139,12 +140,12 @@ func SetPrecompileBalances(db vm.StateDB) { for i := 0; i < 256; i++ { addr := common.BytesToAddress([]byte{byte(i)}) db.CreateAccount(addr) - db.AddBalance(addr, common.Big1) + db.AddBalance(addr, common.Big1, tracing.BalanceIncreaseGenesisBalance) } } func SetL2CrossDomainMessengerBalances(db *state.MemoryStateDB) { - db.AddBalance(predeploys.L2CrossDomainMessengerAddr, lockedBalance) + db.AddBalance(predeploys.L2CrossDomainMessengerAddr, lockedBalance, tracing.BalanceIncreaseGenesisBalance) log.Info("Set balance to address of L2CrossDomainMessenger =>", "address:", predeploys.L2CrossDomainMessengerAddr, "balance:", lockedBalance) } diff --git a/ops/l2-genesis/morph-chain-ops/immutables/immutables.go b/ops/l2-genesis/morph-chain-ops/immutables/immutables.go index 00faba3b3..eb59080ec 100644 --- a/ops/l2-genesis/morph-chain-ops/immutables/immutables.go +++ b/ops/l2-genesis/morph-chain-ops/immutables/immutables.go @@ -119,6 +119,9 @@ func BuildMorph(immutable ImmutableConfig, config *InitConfig) (DeploymentResult { Name: "ProxyAdmin", }, + { + Name: "L2TokenRegistry", + }, } return BuildL2(deployments, config) } @@ -233,6 +236,8 @@ func l2Deployer(backend *backends.SimulatedBackend, opts *bind.TransactOpts, dep switch deployment.Name { case "GasPriceOracle": _, tx, _, err = bindings.DeployGasPriceOracle(opts, backend, common.BigToAddress(common.Big1)) + case "L2TokenRegistry": + _, tx, _, err = bindings.DeployL2TokenRegistry(opts, backend) case "L2CrossDomainMessenger": _, tx, _, err = bindings.DeployL2CrossDomainMessenger(opts, backend) case "Sequencer": diff --git a/ops/l2-genesis/morph-chain-ops/state/memory_db.go b/ops/l2-genesis/morph-chain-ops/state/memory_db.go index 556b922c9..94af35bb8 100644 --- a/ops/l2-genesis/morph-chain-ops/state/memory_db.go +++ b/ops/l2-genesis/morph-chain-ops/state/memory_db.go @@ -8,6 +8,7 @@ import ( "github.com/morph-l2/go-ethereum/common" "github.com/morph-l2/go-ethereum/core" + "github.com/morph-l2/go-ethereum/core/tracing" "github.com/morph-l2/go-ethereum/core/types" "github.com/morph-l2/go-ethereum/core/vm" "github.com/morph-l2/go-ethereum/crypto" @@ -107,7 +108,7 @@ func (db *MemoryStateDB) CreateAccount(addr common.Address) { } -func (db *MemoryStateDB) SubBalance(addr common.Address, amount *big.Int) { +func (db *MemoryStateDB) SubBalance(addr common.Address, amount *big.Int, reason tracing.BalanceChangeReason) *big.Int { db.rw.Lock() defer db.rw.Unlock() @@ -116,13 +117,15 @@ func (db *MemoryStateDB) SubBalance(addr common.Address, amount *big.Int) { panic(fmt.Sprintf("%s not in state", addr)) } if account.Balance.Sign() == 0 { - return + return common.Big0 } + prev := new(big.Int).Set(account.Balance) account.Balance = new(big.Int).Sub(account.Balance, amount) db.genesis.Alloc[addr] = account + return prev } -func (db *MemoryStateDB) AddBalance(addr common.Address, amount *big.Int) { +func (db *MemoryStateDB) AddBalance(addr common.Address, amount *big.Int, reason tracing.BalanceChangeReason) *big.Int { db.rw.Lock() defer db.rw.Unlock() @@ -130,8 +133,10 @@ func (db *MemoryStateDB) AddBalance(addr common.Address, amount *big.Int) { if !ok { panic(fmt.Sprintf("%s not in state", addr)) } + prev := new(big.Int).Set(account.Balance) account.Balance = new(big.Int).Add(account.Balance, amount) db.genesis.Alloc[addr] = account + return prev } func (db *MemoryStateDB) GetBalance(addr common.Address) *big.Int { @@ -156,7 +161,7 @@ func (db *MemoryStateDB) GetNonce(addr common.Address) uint64 { return account.Nonce } -func (db *MemoryStateDB) SetNonce(addr common.Address, value uint64) { +func (db *MemoryStateDB) SetNonce(addr common.Address, value uint64, _ tracing.NonceChangeReason) { db.rw.Lock() defer db.rw.Unlock() @@ -196,16 +201,17 @@ func (db *MemoryStateDB) GetCode(addr common.Address) []byte { return account.Code } -func (db *MemoryStateDB) SetCode(addr common.Address, code []byte) { +func (db *MemoryStateDB) SetCode(addr common.Address, code []byte) []byte { db.rw.Lock() defer db.rw.Unlock() account, ok := db.genesis.Alloc[addr] if !ok { - return + return nil } account.Code = code db.genesis.Alloc[addr] = account + return code } func (db *MemoryStateDB) GetCodeSize(addr common.Address) uint64 { @@ -249,7 +255,7 @@ func (db *MemoryStateDB) GetState(addr common.Address, key common.Hash) common.H return account.Storage[key] } -func (db *MemoryStateDB) SetState(addr common.Address, key, value common.Hash) { +func (db *MemoryStateDB) SetState(addr common.Address, key, value common.Hash) common.Hash { db.rw.Lock() defer db.rw.Unlock() @@ -257,8 +263,10 @@ func (db *MemoryStateDB) SetState(addr common.Address, key, value common.Hash) { if !ok { panic(fmt.Sprintf("%s not in state", addr)) } + prev := account.Storage[key] account.Storage[key] = value db.genesis.Alloc[addr] = account + return prev } func (db *MemoryStateDB) Suicide(common.Address) bool { diff --git a/ops/publicnode/Dockerfile.node b/ops/publicnode/Dockerfile.node index 0dbd67b7c..208ca928f 100644 --- a/ops/publicnode/Dockerfile.node +++ b/ops/publicnode/Dockerfile.node @@ -1,5 +1,5 @@ # Build Node -FROM morph/go-ubuntu-builder:go-1.22-ubuntu as builder +FROM morph/go-ubuntu-builder:go-1.24-ubuntu as builder COPY . /morph WORKDIR /morph/node RUN make build diff --git a/ops/publicnode/Makefile b/ops/publicnode/Makefile index 3544ed77a..0a2dd6dd1 100644 --- a/ops/publicnode/Makefile +++ b/ops/publicnode/Makefile @@ -5,7 +5,7 @@ include .env go-ubuntu-builder: @if [ -z "$(shell docker images -q morph/go-ubuntu-builder 2> /dev/null)" ]; then \ echo "Docker image morph/go-ubuntu-builder does not exist. Building..."; \ - cd ../docker/intermediate && docker build -t morph/go-ubuntu-builder:go-1.22-ubuntu . -f go-ubuntu-builder.Dockerfile; \ + cd ../docker/intermediate && docker build -t morph/go-ubuntu-builder:go-1.24-ubuntu . -f go-ubuntu-builder.Dockerfile; \ else \ echo "Docker image morph/go-ubuntu-builder already exists."; \ fi diff --git a/ops/tools/batchparse/main.go b/ops/tools/batchparse/main.go index 3b1b9a441..429756a1d 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/bls12381/main.go b/ops/tools/bls12381/main.go index 86ba6d2aa..28df5f300 100644 --- a/ops/tools/bls12381/main.go +++ b/ops/tools/bls12381/main.go @@ -77,14 +77,14 @@ func main() { var costGas uint64 // hashToG1Curve - bls12381MapG1 := vm.PrecompiledContractsBLS[common.BytesToAddress([]byte{17})] + bls12381MapG1 := vm.PrecompiledContractsEmerald[common.BytesToAddress([]byte{17})] messagePointOnCurveBz, err := bls12381MapG1.Run(messageInput) if err != nil { panic(err) } costGas += bls12381MapG1.RequiredGas(messageInput) - bls12381Pairing := vm.PrecompiledContractsBLS[common.BytesToAddress([]byte{16})] + bls12381Pairing := vm.PrecompiledContractsEmerald[common.BytesToAddress([]byte{16})] // left side add pair, message(point on g1) & public key(point on g2) byteRaw := blssignatures.PublicKeyToBytes(aggPubKeys) fmt.Println("aggPubKeys length: ", len(byteRaw)) diff --git a/ops/tools/go.mod b/ops/tools/go.mod index 81a7b0bd3..78ad604a6 100644 --- a/ops/tools/go.mod +++ b/ops/tools/go.mod @@ -1,30 +1,30 @@ module morph-l2/tools -go 1.22 +go 1.24.0 -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.3 require ( - github.com/morph-l2/go-ethereum v1.10.14-0.20241224100051-1582a364edc0 + github.com/morph-l2/go-ethereum v1.10.14-0.20260211074551-4f0f6e6bd141 github.com/tendermint/tendermint v0.35.9 ) require ( github.com/VictoriaMetrics/fastcache v1.12.2 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.7.0 // indirect + github.com/bits-and-blooms/bitset v1.20.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.2.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.12.1 // indirect + github.com/consensys/bavard v0.1.27 // indirect + github.com/consensys/gnark-crypto v0.16.0 // indirect github.com/cosmos/gogoproto v1.4.1 // indirect - github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect + github.com/crate-crypto/go-eth-kzg v1.4.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/deckarep/golang-set v1.8.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect github.com/edsrzf/mmap-go v1.1.0 // indirect - github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4 // indirect - github.com/fjl/memsize v0.0.2 // indirect + github.com/ethereum/c-kzg-4844/v2 v2.1.5 // indirect + github.com/ethereum/go-ethereum v1.10.26 // indirect github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect github.com/go-kit/kit v0.12.0 // indirect github.com/go-kit/log v0.2.1 // indirect @@ -47,7 +47,7 @@ require ( github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect @@ -62,25 +62,24 @@ require ( github.com/prometheus/common v0.45.0 // indirect github.com/prometheus/procfs v0.12.0 // indirect github.com/prometheus/tsdb v0.10.0 // indirect - github.com/rivo/uniseg v0.4.3 // indirect + github.com/rivo/uniseg v0.4.7 // indirect github.com/rjeczalik/notify v0.9.3 // indirect github.com/rs/cors v1.11.0 // indirect github.com/sasha-s/go-deadlock v0.3.1 // indirect 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/testify v1.9.0 // indirect - github.com/supranational/blst v0.3.11 // indirect + github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe // 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 github.com/yusufpapurcu/wmi v1.2.3 // indirect - golang.org/x/crypto v0.23.0 // indirect + golang.org/x/crypto v0.35.0 // indirect golang.org/x/net v0.25.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect + golang.org/x/sync v0.11.0 // indirect + golang.org/x/sys v0.30.0 // indirect + golang.org/x/text v0.22.0 // indirect golang.org/x/time v0.5.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 // indirect google.golang.org/grpc v1.62.1 // indirect diff --git a/ops/tools/go.sum b/ops/tools/go.sum index 471b75e08..6be6c6bf0 100644 --- a/ops/tools/go.sum +++ b/ops/tools/go.sum @@ -13,8 +13,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo= -github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bits-and-blooms/bitset v1.20.0 h1:2F+rfL86jE2d/bmw7OhqUg2Sj/1rURkBn3MdfoPyRVU= +github.com/bits-and-blooms/bitset v1.20.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/btcsuite/btcd/btcec/v2 v2.2.1 h1:xP60mv8fvp+0khmrN0zTdPC3cNm24rfeE6lh2R/Yv3E= github.com/btcsuite/btcd/btcec/v2 v2.2.1/go.mod h1:9/CSmJxmuvqzX9Wh2fXMWToLOHhPd11lSPuIupwTkI8= github.com/btcsuite/btcd/btcutil v1.1.2 h1:XLMbX8JQEiwMcYft2EGi8zPUkoa0abKIU6/BJSRsjzQ= @@ -29,16 +29,16 @@ github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= -github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= -github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/consensys/bavard v0.1.27 h1:j6hKUrGAy/H+gpNrpLU3I26n1yc+VMGmd6ID5+gAhOs= +github.com/consensys/bavard v0.1.27/go.mod h1:k/zVjHHC4B+PQy1Pg7fgvG3ALicQw540Crag8qx+dZs= +github.com/consensys/gnark-crypto v0.16.0 h1:8Dl4eYmUWK9WmlP1Bj6je688gBRJCJbT8Mw4KoTAawo= +github.com/consensys/gnark-crypto v0.16.0/go.mod h1:Ke3j06ndtPTVvo++PhGNgvm+lgpLvzbcE2MqljY7diU= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d h1:49RLWk1j44Xu4fjHb6JFYmeUnDORVwHNkDxaQ0ctCVU= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/cosmos/gogoproto v1.4.1 h1:WoyH+0/jbCTzpKNvyav5FL1ZTWsp1im1MxEpJEzKUB8= github.com/cosmos/gogoproto v1.4.1/go.mod h1:Ac9lzL4vFpBMcptJROQ6dQ4M3pOEK5Z/l0Q9p+LoCr4= -github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= -github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/crate-crypto/go-eth-kzg v1.4.0 h1:WzDGjHk4gFg6YzV0rJOAsTK4z3Qkz5jd4RE3DAvPFkg= +github.com/crate-crypto/go-eth-kzg v1.4.0/go.mod h1:J9/u5sWfznSObptgfa92Jq8rTswn6ahQWEuiLHOjCUI= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -52,10 +52,10 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3 github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= -github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4 h1:B2mpK+MNqgPqk2/KNi1LbqwtZDy5F7iy0mynQiBr8VA= -github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4/go.mod h1:y4GA2JbAUama1S4QwYjC2hefgGLU8Ul0GMtL/ADMF1c= -github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= -github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/ethereum/c-kzg-4844/v2 v2.1.5 h1:aVtoLK5xwJ6c5RiqO8g8ptJ5KU+2Hdquf6G3aXiHh5s= +github.com/ethereum/c-kzg-4844/v2 v2.1.5/go.mod h1:u59hRTTah4Co6i9fDWtiCjTrblJv0UwsqZKCc0GfgUs= +github.com/ethereum/go-ethereum v1.10.26 h1:i/7d9RBBwiXCEuyduBQzJw/mKmnvzsN14jqBmytw72s= +github.com/ethereum/go-ethereum v1.10.26/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -135,8 +135,8 @@ github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCV github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= -github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= -github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/leanovate/gopter v0.2.11 h1:vRjThO1EKPb/1NsDXuDrzldR28RLkBflWYcU9CvzWu4= +github.com/leanovate/gopter v0.2.11/go.mod h1:aK3tzZP/C+p1m3SPRE4SYZFGP7jjkuSI4f7Xvpt0S9c= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= @@ -145,8 +145,8 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= -github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= @@ -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.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/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.20260211074551-4f0f6e6bd141 h1:A8eygErKU6WKMipGWIemzwLeYkIGLd9yb/Ry3x+J9PQ= +github.com/morph-l2/go-ethereum v1.10.14-0.20260211074551-4f0f6e6bd141/go.mod h1:nkVzHjQWCOjvukQW8ittlwX+Xz9gmVHrP7mUi7zoHTs= +github.com/morph-l2/tendermint v0.3.3 h1:zsmzVJfKp+NuCr45ZUUY2ZJjnHAVLzwJLID6GxBR4i4= +github.com/morph-l2/tendermint v0.3.3/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= @@ -212,8 +212,8 @@ github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3c github.com/prometheus/tsdb v0.10.0 h1:If5rVCMTp6W2SiRAQFlbpJNgVlgMEd+U2GZckwK38ic= github.com/prometheus/tsdb v0.10.0/go.mod h1:oi49uRhEe9dPUTlS3JRZOwJuVi6tmh10QSgwXEyGCt4= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= -github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rjeczalik/notify v0.9.3 h1:6rJAzHTGKXGj76sbRgDiDcYj/HniypXmSJo1SWakZeY= github.com/rjeczalik/notify v0.9.3/go.mod h1:gF3zSOrafR9DQEWSE8TjfI9NkooDxbyT4UgRGKZA0lc= github.com/rs/cors v1.11.0 h1:0B9GE/r9Bc2UxRMMtymBkHTenPkHDv0CW4Y98GBY+po= @@ -234,10 +234,10 @@ github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXf 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= github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= -github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe h1:nbdqkIGOGfUAD54q1s2YBcBz/WcsxCO9HUQ4aGV5hUw= +github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4= @@ -253,8 +253,8 @@ golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnf golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= -golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs= +golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= @@ -273,8 +273,8 @@ golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180926160741-c2ed4eda69e7/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -299,16 +299,16 @@ golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= -golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= -golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/ops/tools/multisend/main.go b/ops/tools/multisend/main.go index 672542790..a7f58bc98 100644 --- a/ops/tools/multisend/main.go +++ b/ops/tools/multisend/main.go @@ -22,7 +22,7 @@ var ( chainId *big.Int fundPrivKey = crypto.ToECDSAUnsafe(hexutil.MustDecode("0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80")) urls = []string{"http://localhost:8945", "http://localhost:8545", "http://localhost:8645", "http://localhost:8745", "http://localhost:8845"} - senderNum = 50 + senderNum = 10 duration = 120 * time.Minute ) @@ -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 } @@ -67,7 +67,7 @@ func main() { }(sender, i) } count++ - time.Sleep(300 * time.Millisecond) + time.Sleep(800 * time.Millisecond) fmt.Println() } } diff --git a/oracle/go.mod b/oracle/go.mod index e2846a6e8..d82290072 100644 --- a/oracle/go.mod +++ b/oracle/go.mod @@ -1,37 +1,37 @@ module morph-l2/oracle -go 1.22 +go 1.24.0 -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.3 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.20241224100051-1582a364edc0 + github.com/morph-l2/go-ethereum v1.10.14-0.20260211074551-4f0f6e6bd141 github.com/prometheus/client_golang v1.17.0 - github.com/stretchr/testify v1.9.0 + github.com/stretchr/testify v1.10.0 github.com/tendermint/tendermint v0.35.9 - github.com/urfave/cli v1.22.14 + github.com/urfave/cli v1.22.17 gopkg.in/natefinch/lumberjack.v2 v2.2.1 ) require ( github.com/VictoriaMetrics/fastcache v1.12.2 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.7.0 // indirect + github.com/bits-and-blooms/bitset v1.20.0 // indirect github.com/btcsuite/btcd/btcec/v2 v2.2.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.12.1 // indirect + github.com/consensys/bavard v0.1.27 // indirect + github.com/consensys/gnark-crypto v0.16.0 // indirect github.com/cosmos/gogoproto v1.4.1 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect - github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect + github.com/crate-crypto/go-eth-kzg v1.4.0 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/deckarep/golang-set v1.8.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect github.com/edsrzf/mmap-go v1.1.0 // indirect - github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4 // indirect - github.com/fjl/memsize v0.0.2 // indirect + github.com/ethereum/c-kzg-4844/v2 v2.1.5 // indirect + github.com/ethereum/go-ethereum v1.10.26 // indirect github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect github.com/go-kit/log v0.2.1 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect @@ -54,7 +54,7 @@ require ( github.com/libp2p/go-buffer-pool v0.1.0 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/mimoo/StrobeGo v0.0.0-20210601165009-122bf33a46e0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect @@ -69,7 +69,7 @@ require ( github.com/prometheus/procfs v0.12.0 // indirect github.com/prometheus/tsdb v0.10.0 // indirect github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 // indirect - github.com/rivo/uniseg v0.4.3 // indirect + github.com/rivo/uniseg v0.4.7 // indirect github.com/rjeczalik/notify v0.9.3 // indirect github.com/rs/cors v1.11.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect @@ -77,17 +77,17 @@ 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/supranational/blst v0.3.11 // indirect + github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe // 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 github.com/yusufpapurcu/wmi v1.2.3 // indirect - golang.org/x/crypto v0.23.0 // indirect + golang.org/x/crypto v0.35.0 // indirect golang.org/x/net v0.25.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect + golang.org/x/sync v0.11.0 // indirect + golang.org/x/sys v0.30.0 // indirect + golang.org/x/text v0.22.0 // indirect golang.org/x/time v0.5.0 // indirect google.golang.org/genproto/googleapis/rpc v0.0.0-20240123012728-ef4313101c80 // indirect google.golang.org/grpc v1.62.1 // indirect diff --git a/oracle/go.sum b/oracle/go.sum index 54788c16b..da0d78add 100644 --- a/oracle/go.sum +++ b/oracle/go.sum @@ -1,4 +1,4 @@ -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d h1:nalkkPQcITbvhmL4+C4cKA87NW0tfm3Kl9VXRoPywFg= github.com/ChainSafe/go-schnorrkel v0.0.0-20200405005733-88cbf1b4c40d/go.mod h1:URdX5+vg25ts3aCh8H5IFZybJYKWhJHYMTnf+ULtoC4= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= @@ -14,8 +14,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo= -github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bits-and-blooms/bitset v1.20.0 h1:2F+rfL86jE2d/bmw7OhqUg2Sj/1rURkBn3MdfoPyRVU= +github.com/bits-and-blooms/bitset v1.20.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/btcsuite/btcd/btcec/v2 v2.2.1 h1:xP60mv8fvp+0khmrN0zTdPC3cNm24rfeE6lh2R/Yv3E= github.com/btcsuite/btcd/btcec/v2 v2.2.1/go.mod h1:9/CSmJxmuvqzX9Wh2fXMWToLOHhPd11lSPuIupwTkI8= github.com/btcsuite/btcd/btcutil v1.1.2 h1:XLMbX8JQEiwMcYft2EGi8zPUkoa0abKIU6/BJSRsjzQ= @@ -30,19 +30,18 @@ github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= -github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= -github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= +github.com/consensys/bavard v0.1.27 h1:j6hKUrGAy/H+gpNrpLU3I26n1yc+VMGmd6ID5+gAhOs= +github.com/consensys/bavard v0.1.27/go.mod h1:k/zVjHHC4B+PQy1Pg7fgvG3ALicQw540Crag8qx+dZs= +github.com/consensys/gnark-crypto v0.16.0 h1:8Dl4eYmUWK9WmlP1Bj6je688gBRJCJbT8Mw4KoTAawo= +github.com/consensys/gnark-crypto v0.16.0/go.mod h1:Ke3j06ndtPTVvo++PhGNgvm+lgpLvzbcE2MqljY7diU= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d h1:49RLWk1j44Xu4fjHb6JFYmeUnDORVwHNkDxaQ0ctCVU= github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d/go.mod h1:tSxLoYXyBmiFeKpvmq4dzayMdCjCnu8uqmCysIGBT2Y= github.com/cosmos/gogoproto v1.4.1 h1:WoyH+0/jbCTzpKNvyav5FL1ZTWsp1im1MxEpJEzKUB8= github.com/cosmos/gogoproto v1.4.1/go.mod h1:Ac9lzL4vFpBMcptJROQ6dQ4M3pOEK5Z/l0Q9p+LoCr4= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= -github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo= +github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/crate-crypto/go-eth-kzg v1.4.0 h1:WzDGjHk4gFg6YzV0rJOAsTK4z3Qkz5jd4RE3DAvPFkg= +github.com/crate-crypto/go-eth-kzg v1.4.0/go.mod h1:J9/u5sWfznSObptgfa92Jq8rTswn6ahQWEuiLHOjCUI= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= @@ -56,10 +55,10 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3 github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= -github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4 h1:B2mpK+MNqgPqk2/KNi1LbqwtZDy5F7iy0mynQiBr8VA= -github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4/go.mod h1:y4GA2JbAUama1S4QwYjC2hefgGLU8Ul0GMtL/ADMF1c= -github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= -github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/ethereum/c-kzg-4844/v2 v2.1.5 h1:aVtoLK5xwJ6c5RiqO8g8ptJ5KU+2Hdquf6G3aXiHh5s= +github.com/ethereum/c-kzg-4844/v2 v2.1.5/go.mod h1:u59hRTTah4Co6i9fDWtiCjTrblJv0UwsqZKCc0GfgUs= +github.com/ethereum/go-ethereum v1.10.26 h1:i/7d9RBBwiXCEuyduBQzJw/mKmnvzsN14jqBmytw72s= +github.com/ethereum/go-ethereum v1.10.26/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= github.com/fortytw2/leaktest v1.3.0 h1:u8491cBMTQ8ft8aeV+adlcytMZylmA5nnwwkRZjI8vw= github.com/fortytw2/leaktest v1.3.0/go.mod h1:jDsjWgpAGjm2CA7WthBh/CdZYEPF31XHquHwclZch5g= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= @@ -145,8 +144,8 @@ github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= -github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/leanovate/gopter v0.2.11 h1:vRjThO1EKPb/1NsDXuDrzldR28RLkBflWYcU9CvzWu4= +github.com/leanovate/gopter v0.2.11/go.mod h1:aK3tzZP/C+p1m3SPRE4SYZFGP7jjkuSI4f7Xvpt0S9c= github.com/libp2p/go-buffer-pool v0.1.0 h1:oK4mSFcQz7cTQIfqbe4MIj9gLW+mnanjyFtc6cdF0Y8= github.com/libp2p/go-buffer-pool v0.1.0/go.mod h1:N+vh8gMqimBzdKkSMVuydVDq+UV5QTWy5HSiZacSbPg= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= @@ -155,8 +154,8 @@ github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/ github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= -github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= @@ -175,10 +174,10 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 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.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/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.20260211074551-4f0f6e6bd141 h1:A8eygErKU6WKMipGWIemzwLeYkIGLd9yb/Ry3x+J9PQ= +github.com/morph-l2/go-ethereum v1.10.14-0.20260211074551-4f0f6e6bd141/go.mod h1:nkVzHjQWCOjvukQW8ittlwX+Xz9gmVHrP7mUi7zoHTs= +github.com/morph-l2/tendermint v0.3.3 h1:zsmzVJfKp+NuCr45ZUUY2ZJjnHAVLzwJLID6GxBR4i4= +github.com/morph-l2/tendermint v0.3.3/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= @@ -226,8 +225,8 @@ github.com/prometheus/tsdb v0.10.0/go.mod h1:oi49uRhEe9dPUTlS3JRZOwJuVi6tmh10QSg github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475 h1:N/ElC8H3+5XpJzTSTfLsJV/mx9Q9g7kxmchpfZyxgzM= github.com/rcrowley/go-metrics v0.0.0-20201227073835-cf1acfcdf475/go.mod h1:bCqnVzQkZxMG4s8nGwiZ5l3QUCyqpo9Y+/ZMZ9VjZe4= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= -github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rjeczalik/notify v0.9.3 h1:6rJAzHTGKXGj76sbRgDiDcYj/HniypXmSJo1SWakZeY= github.com/rjeczalik/notify v0.9.3/go.mod h1:gF3zSOrafR9DQEWSE8TjfI9NkooDxbyT4UgRGKZA0lc= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= @@ -250,6 +249,7 @@ 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/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= @@ -257,10 +257,10 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= -github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe h1:nbdqkIGOGfUAD54q1s2YBcBz/WcsxCO9HUQ4aGV5hUw= +github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4= @@ -269,8 +269,8 @@ github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= -github.com/urfave/cli v1.22.14 h1:ebbhrRiGK2i4naQJr+1Xj92HXZCrK7MsyTS/ob3HnAk= -github.com/urfave/cli v1.22.14/go.mod h1:X0eDS6pD6Exaclxm99NJ3FiCDRED7vIHpx2mDOHLvkA= +github.com/urfave/cli v1.22.17 h1:SYzXoiPfQjHBbkYxbew5prZHS1TOLT3ierW8SYLqtVQ= +github.com/urfave/cli v1.22.17/go.mod h1:b0ht0aqgH/6pBYzzxURyrM4xXNgsoT/n2ZzwQiEhNVo= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= @@ -281,8 +281,9 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs= +golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= @@ -310,8 +311,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180926160741-c2ed4eda69e7/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -340,8 +341,9 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -355,8 +357,9 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/oracle/oracle/batch.go b/oracle/oracle/batch.go index 4270bc117..8e1eb9c23 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" @@ -94,7 +95,7 @@ func (o *Oracle) getBatchSubmissionByLogs(rLogs []types.Log, recordBatchSubmissi if err != nil { return fmt.Errorf("get transaction by hash error:%v", err) } - signer := types.NewLondonSignerWithEIP4844(tx.ChainId()) + signer := types.NewViridianSigner(tx.ChainId()) msg, err := tx.AsMessage(signer, tx.GasFeeCap()) if err != nil { return err @@ -154,13 +155,29 @@ func (o *Oracle) getBatchSubmissionByLogs(rLogs []types.Log, recordBatchSubmissi 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[:]), + 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 @@ -175,7 +192,7 @@ func (o *Oracle) getBatchSubmissionByLogs(rLogs []types.Log, recordBatchSubmissi continue } if rollupCommitBatch.BatchIndex.Uint64() > batchIndex { - return fmt.Errorf(fmt.Sprintf("batch is incontinuity,expect %v,have %v", batchIndex, rollupCommitBatch.BatchIndex.Uint64())) + return fmt.Errorf("batch is incontinuity, expect %v, have %v", batchIndex, rollupCommitBatch.BatchIndex.Uint64()) } // set batchIndex to new batch index + 1 batchIndex = rollupCommitBatch.BatchIndex.Uint64() + 1 diff --git a/oracle/oracle/rollup.go b/oracle/oracle/rollup.go index c6052fafa..6c9256b09 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("generate rollup epoch info error:%v", err) + return fmt.Errorf("gernerate rollup epoch info error:%v", err) } rollupEpochInfos = append(rollupEpochInfos, epochs...) } diff --git a/prover/.gitignore b/prover/.gitignore index 8f82cd087..62bb18875 100644 --- a/prover/.gitignore +++ b/prover/.gitignore @@ -24,4 +24,6 @@ shadow-proving contracts/cache contracts out -lib \ No newline at end of file +lib + +proof \ No newline at end of file diff --git a/prover/Cargo.lock b/prover/Cargo.lock index 0aeae50ff..311bec3ea 100644 --- a/prover/Cargo.lock +++ b/prover/Cargo.lock @@ -745,6 +745,39 @@ version = "1.0.86" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b3d1d046238990b9cf5bcde22a3fb3584ee5cf65fb2765f454ed428c7a0063da" +[[package]] +name = "ark-bls12-381" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3df4dcc01ff89867cd86b0da835f23c3f02738353aaee7dde7495af71363b8d5" +dependencies = [ + "ark-ec", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", +] + +[[package]] +name = "ark-ec" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "43d68f2d516162846c1238e755a7c4d131b892b70cc70c471a8e3ca3ed818fce" +dependencies = [ + "ahash 0.8.11", + "ark-ff 0.5.0", + "ark-poly", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.5", + "itertools 0.13.0", + "num-bigint 0.4.6", + "num-integer", + "num-traits", + "zeroize", +] + [[package]] name = "ark-ff" version = "0.3.0" @@ -783,6 +816,26 @@ dependencies = [ "zeroize", ] +[[package]] +name = "ark-ff" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a177aba0ed1e0fbb62aa9f6d0502e9b46dad8c2eab04c14258a1212d2557ea70" +dependencies = [ + "ark-ff-asm 0.5.0", + "ark-ff-macros 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "educe", + "itertools 0.13.0", + "num-bigint 0.4.6", + "num-traits", + "paste", + "zeroize", +] + [[package]] name = "ark-ff-asm" version = "0.3.0" @@ -803,6 +856,16 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "ark-ff-asm" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "62945a2f7e6de02a31fe400aa489f0e0f5b2502e69f95f853adb82a96c7a6b60" +dependencies = [ + "quote", + "syn 2.0.72", +] + [[package]] name = "ark-ff-macros" version = "0.3.0" @@ -828,6 +891,34 @@ dependencies = [ "syn 1.0.109", ] +[[package]] +name = "ark-ff-macros" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "09be120733ee33f7693ceaa202ca41accd5653b779563608f1234f78ae07c4b3" +dependencies = [ + "num-bigint 0.4.6", + "num-traits", + "proc-macro2", + "quote", + "syn 2.0.72", +] + +[[package]] +name = "ark-poly" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "579305839da207f02b89cd1679e50e67b4331e2f9294a57693e5051b7703fe27" +dependencies = [ + "ahash 0.8.11", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", + "ark-std 0.5.0", + "educe", + "fnv", + "hashbrown 0.15.5", +] + [[package]] name = "ark-serialize" version = "0.3.0" @@ -849,6 +940,30 @@ dependencies = [ "num-bigint 0.4.6", ] +[[package]] +name = "ark-serialize" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "3f4d068aaf107ebcd7dfb52bc748f8030e0fc930ac8e360146ca54c1203088f7" +dependencies = [ + "ark-serialize-derive", + "ark-std 0.5.0", + "arrayvec", + "digest 0.10.7", + "num-bigint 0.4.6", +] + +[[package]] +name = "ark-serialize-derive" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "213888f660fddcca0d257e88e54ac05bca01885f258ccdf695bafd77031bb69d" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + [[package]] name = "ark-std" version = "0.3.0" @@ -869,6 +984,16 @@ dependencies = [ "rand", ] +[[package]] +name = "ark-std" +version = "0.5.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "246a225cc6131e9ee4f24619af0f19d67761fff15d7ccc22e42b80846e69449a" +dependencies = [ + "num-traits", + "rand", +] + [[package]] name = "arrayref" version = "0.3.8" @@ -1282,9 +1407,9 @@ dependencies = [ [[package]] name = "blst" -version = "0.3.13" +version = "0.3.16" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4378725facc195f1a538864863f6de233b500a8862747e7f165078a419d5e874" +checksum = "dcdb4c7013139a150f9fc55d123186dbfaba0d912817466282c73ac49e71fb45" dependencies = [ "cc", "glob", @@ -2039,6 +2164,18 @@ dependencies = [ "spki", ] +[[package]] +name = "educe" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1d7bc049e1bd8cdeb31b68bbd586a9464ecf9f3944af3958a7a9d0f8b9799417" +dependencies = [ + "enum-ordinalize", + "proc-macro2", + "quote", + "syn 2.0.72", +] + [[package]] name = "either" version = "1.13.0" @@ -2130,6 +2267,26 @@ dependencies = [ "syn 2.0.72", ] +[[package]] +name = "enum-ordinalize" +version = "4.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "4a1091a7bb1f8f2c4b28f1fe2cef4980ca2d410a3d727d67ecc3178c9b0800f0" +dependencies = [ + "enum-ordinalize-derive", +] + +[[package]] +name = "enum-ordinalize-derive" +version = "4.3.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ca9601fb2d62598ee17836250842873a413586e5d7ed88b356e38ddbb0ec631" +dependencies = [ + "proc-macro2", + "quote", + "syn 2.0.72", +] + [[package]] name = "enumn" version = "0.1.14" @@ -2880,6 +3037,15 @@ dependencies = [ "serde", ] +[[package]] +name = "hashbrown" +version = "0.15.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9229cfe53dfd69f0609a49f65461bd93001ea1ef889cd5529dd176593f5338a1" +dependencies = [ + "allocator-api2", +] + [[package]] name = "hashers" version = "1.0.1" @@ -4012,6 +4178,18 @@ version = "0.1.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b15813163c1d831bf4a13c3610c05c0d03b39feb07f7e09fa234dac9b15aaf39" +[[package]] +name = "p256" +version = "0.13.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c9863ad85fa8f4460f9c48cb909d38a0d689dba1f6f6988a5e3e0d31071bcd4b" +dependencies = [ + "ecdsa", + "elliptic-curve", + "primeorder", + "sha2", +] + [[package]] name = "p3-air" version = "0.1.3-succinct" @@ -4540,6 +4718,15 @@ dependencies = [ "syn 2.0.72", ] +[[package]] +name = "primeorder" +version = "0.13.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "353e1ca18966c16d9deb1c69278edbc5f194139612772bd9537af60ac231e1e6" +dependencies = [ + "elliptic-curve", +] + [[package]] name = "primitive-types" version = "0.12.2" @@ -5095,7 +5282,7 @@ dependencies = [ [[package]] name = "revm" version = "14.0.0" -source = "git+https://github.com/morph-l2/revm?branch=release/v42#028eb309a053bfcc1c7fd14b4cf623c0821e6c96" +source = "git+https://github.com/morph-l2/revm?branch=release/v42#b95485fcf20a2d492ac2dba705250b92a95737ac" dependencies = [ "auto_impl", "cfg-if 1.0.0", @@ -5109,7 +5296,7 @@ dependencies = [ [[package]] name = "revm-interpreter" version = "10.0.0" -source = "git+https://github.com/morph-l2/revm?branch=release/v42#028eb309a053bfcc1c7fd14b4cf623c0821e6c96" +source = "git+https://github.com/morph-l2/revm?branch=release/v42#b95485fcf20a2d492ac2dba705250b92a95737ac" dependencies = [ "cfg-if 1.0.0", "revm-primitives", @@ -5119,13 +5306,18 @@ dependencies = [ [[package]] name = "revm-precompile" version = "11.0.0" -source = "git+https://github.com/morph-l2/revm?branch=release/v42#028eb309a053bfcc1c7fd14b4cf623c0821e6c96" +source = "git+https://github.com/morph-l2/revm?branch=release/v42#b95485fcf20a2d492ac2dba705250b92a95737ac" dependencies = [ + "ark-bls12-381", + "ark-ec", + "ark-ff 0.5.0", + "ark-serialize 0.5.0", "aurora-engine-modexp", "c-kzg", "cfg-if 1.0.0", "k256", "once_cell", + "p256", "revm-primitives", "ripemd", "secp256k1", @@ -5136,7 +5328,7 @@ dependencies = [ [[package]] name = "revm-primitives" version = "9.0.0" -source = "git+https://github.com/morph-l2/revm?branch=release/v42#028eb309a053bfcc1c7fd14b4cf623c0821e6c96" +source = "git+https://github.com/morph-l2/revm?branch=release/v42#b95485fcf20a2d492ac2dba705250b92a95737ac" dependencies = [ "alloy-eips", "alloy-primitives 0.8.0", @@ -5459,6 +5651,7 @@ dependencies = [ name = "sbv-core" version = "2.0.0" dependencies = [ + "cfg-if 1.0.0", "ctor", "hex", "once_cell", diff --git a/prover/Cargo.toml b/prover/Cargo.toml index 24401aab0..aa44f7f94 100644 --- a/prover/Cargo.toml +++ b/prover/Cargo.toml @@ -10,9 +10,9 @@ members = [ "crates/primitives", "crates/sbv", "crates/utils", - "tests/*/*" + "tests/*/*", ] -exclude = ["bin/shadow-prove","bin/challenge"] +exclude = ["bin/shadow-prove", "bin/challenge"] resolver = "2" [workspace.package] @@ -24,13 +24,8 @@ 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"} +alloy = { version = "0.3" } hex = "0.4" once_cell = "1.19" rkyv = { version = "0.7", features = ["validation"] } @@ -39,22 +34,29 @@ tiny-keccak = "2.0" getrandom = { version = "*", features = ["custom"] } # just for disable log = "0.4" prometheus = { version = "0.9", features = ["process"] } -zstd = { git = "https://github.com/scroll-tech/zstd-rs", branch = "hack/mul-block", features = ["experimental"]} -ruzstd = { git = "https://github.com/KillingSpark/zstd-rs.git", branch = "master"} +zstd = { git = "https://github.com/scroll-tech/zstd-rs", branch = "hack/mul-block", features = [ + "experimental", +] } +ruzstd = { git = "https://github.com/KillingSpark/zstd-rs.git", branch = "master" } # crypto -c-kzg = "1.0.3" +c-kzg = { version = "1.0.3", features = ["no-threads"] } kzg-rs = { git = "https://github.com/morph-l2/kzg-rs.git", branch = "sp1-bls-dev" } sha2 = "0.10.8" -sp1-zkvm = { git = "https://github.com/morph-l2/sp1.git", branch = "morph-1.0"} -sp1-sdk = { git = "https://github.com/morph-l2/sp1.git", branch = "morph-1.0", features = ["native-gnark"]} -sp1-helper = { git = "https://github.com/morph-l2/sp1.git", branch = "morph-1.0"} +sp1-zkvm = { git = "https://github.com/morph-l2/sp1.git", branch = "morph-1.0" } +sp1-sdk = { git = "https://github.com/morph-l2/sp1.git", branch = "morph-1.0", features = [ + "native-gnark", +] } +sp1-helper = { git = "https://github.com/morph-l2/sp1.git", branch = "morph-1.0" } # dependencies from scroll-tech -poseidon-bn254 = { git = "https://github.com/scroll-tech/poseidon-bn254", branch = "master", features = ["bn254"] } -zktrie = { git = "https://github.com/scroll-tech/zktrie.git", branch = "main", features= ["rs_zktrie"] } - +poseidon-bn254 = { git = "https://github.com/scroll-tech/poseidon-bn254", branch = "master", features = [ + "bn254", +] } +zktrie = { git = "https://github.com/scroll-tech/zktrie.git", branch = "main", features = [ + "rs_zktrie", +] } # binary dependencies anyhow = "1.0" @@ -109,7 +111,7 @@ features = [ "morph-default-handler", "morph-poseidon-codehash", "std", - "optional_no_base_fee" + "optional_no_base_fee", ] [workspace.dependencies.revm-primitives] @@ -120,7 +122,7 @@ features = [ "morph-default-handler", "morph-poseidon-codehash", "std", - "optional_no_base_fee" + "optional_no_base_fee", ] @@ -143,9 +145,8 @@ alloy-eips = { git = "https://github.com/scroll-tech/alloy.git", branch = "v0.3. alloy-eip2930 = { git = "https://github.com/scroll-tech/alloy-eips", branch = "v0.1.0" } alloy-eip7702 = { git = "https://github.com/scroll-tech/alloy-eips", branch = "v0.1.0" } -alloy-core = { git = "https://github.com/scroll-tech/alloy-core", branch = "v0.8.0"} -alloy-primitives = { git = "https://github.com/scroll-tech/alloy-core", branch = "v0.8.0"} - +alloy-core = { git = "https://github.com/scroll-tech/alloy-core", branch = "v0.8.0" } +alloy-primitives = { git = "https://github.com/scroll-tech/alloy-core", branch = "v0.8.0" } #[profile.release] -#debug-assertions = true \ No newline at end of file +#debug-assertions = true diff --git a/prover/Makefile b/prover/Makefile index 2961c1690..4b860bd77 100644 --- a/prover/Makefile +++ b/prover/Makefile @@ -1,6 +1,7 @@ build-plonk-circuits: docker build -f Dockerfile.sp1-plonk -t sp1-plonk:latest . + save-plonk-circuits: rm -rf plonk-circuits && \ mkdir -p plonk-circuits && \ @@ -16,10 +17,9 @@ start-server: stop-server: docker compose -f docker-compose-app.yml down + build-shadow-prove: - cd bin/shadow-prove && \ - cargo build --release + cd bin/shadow-prove && cargo build --release build-challenge: - cd bin/challenge && \ - cargo build --release \ No newline at end of file + cd bin/challenge && cargo build --release diff --git a/prover/README.md b/prover/README.md index 813c0b4c1..e7939af86 100644 --- a/prover/README.md +++ b/prover/README.md @@ -4,10 +4,9 @@ Generate zk proof for the l2 batch. ## Requirements - [Rust](https://rustup.rs/) -- [SP1](https://succinctlabs.github.io/sp1/getting-started/install.html) +- [SP1](https://docs.succinct.xyz/docs/sp1/getting-started/install) - -### Fast Run +### Fast Run ```sh cd bin/host RUST_LOG=info TRUSTED_SETUP_4844=../../configs/4844_trusted_setup.txt cargo run --release @@ -15,7 +14,7 @@ RUST_LOG=info TRUSTED_SETUP_4844=../../configs/4844_trusted_setup.txt cargo run or ```sh -RUST_LOG=info TRUSTED_SETUP_4844=../../configs/4844_trusted_setup.txt cargo run --release -- --block-path ../../testdata/mainnet_batch_traces_l1.json +RUST_LOG=info TRUSTED_SETUP_4844=./configs/4844_trusted_setup.txt cargo run --release -- --block-path ./testdata/viridian/eip7702_traces.json ``` ### Build the Program @@ -26,7 +25,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 dc4c9bba6..28f7a5c6d 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,9 +609,14 @@ "type": "bytes" }, { - "internalType": "bytes", - "name": "blockContexts", - "type": "bytes" + "internalType": "uint64", + "name": "lastBlockNumber", + "type": "uint64" + }, + { + "internalType": "uint16", + "name": "numL1Messages", + "type": "uint16" }, { "internalType": "bytes32", diff --git a/prover/bin/challenge/src/external_sign.rs b/prover/bin/challenge/src/external_sign.rs index 8cbfa2212..fb4a28fa2 100644 --- a/prover/bin/challenge/src/external_sign.rs +++ b/prover/bin/challenge/src/external_sign.rs @@ -86,7 +86,7 @@ impl ExternalSign { let req_data = self.craft_req_data(data, tx_info)?; let rt = self.do_request(&self.url, &req_data).await?; - log::debug!("ext_sign response: {:?}", rt); + log::info!("ext_sign rt: {:?}", rt); let response: Response = serde_json::from_str(&rt)?; if response.result.sign_datas.is_empty() { @@ -97,6 +97,7 @@ impl ExternalSign { return Err("ext_sign response sign data invalid".into()); } + let sig = hex::decode(&response.result.sign_datas[0].sign[2..])?; let signed_tx: Bytes = tx.rlp_signed(&Signature::try_from(sig.as_slice())?); Ok(signed_tx) @@ -139,8 +140,13 @@ impl ExternalSign { async fn do_request(&self, url: &str, payload: &ReqData) -> Result> { log::debug!("===payload: {:?}", serde_json::to_string(payload).unwrap()); let response: reqwest::Response = self.client.post(url).json(&payload).send().await?; - if !response.status().is_success() { - return Err(format!("ext_sign response status not ok: {:?}", response.status()).into()); + log::info!("===do_request response: {:?}", response); + + let status = response.status(); + if !status.is_success() { + let text = response.text().await?; + log::info!("===do_request response text: {:?}", &text); + return Err(format!("ext_sign response status not ok: {:?}", status).into()); } Ok(response.text().await?) } diff --git a/prover/bin/challenge/src/handler.rs b/prover/bin/challenge/src/handler.rs index dc40a1407..44763205f 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; @@ -12,7 +12,6 @@ use eyre::anyhow; use serde::{Deserialize, Serialize}; use std::env::var; use std::error::Error; -use std::ops::Mul; use std::str::FromStr; use std::sync::Arc; use std::time::Duration; @@ -152,7 +151,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,20 +160,21 @@ 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() { log::info!("query proof and prove state: {:#?}", batch_index); let batch_header = batch_info.fill_ext(batch_proof.batch_header.clone()).encode(); + sleep(Duration::from_secs(600)).await; self.prove_state(batch_index, batch_header, batch_proof, l1_rollup).await; continue; } @@ -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], @@ -420,7 +421,14 @@ struct BatchInfo { parent_batch_hash: [u8; 32], } -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 { @@ -452,15 +460,19 @@ async fn batch_inspect(l1_provider: &Provider, hash: TxHash) -> Option batch inspect: decode tx.input, version = {:#?}", version); + log::info!("======> batch inspect: decode tx.input, param = {:#?}", param); + let mut batch_info = BatchInfo { version, prev_state_root, post_state_root, withdrawal_root, - blocks_info, - l1_message_popped: total_l1_txn, + start_block: prev_batch_last_bn.as_u64() + 1, + end_block: last_block_number, + l1_message_popped: num_l1_messages as u64, ..Default::default() }; @@ -496,41 +508,11 @@ impl BatchInfo { batch_header.extend_from_slice(&self.withdrawal_root); batch_header.extend_from_slice(&self.sequencer_set_verify_hash); batch_header.extend_from_slice(&self.parent_batch_hash); + batch_header.extend_from_slice(&self.end_block.to_be_bytes()); Bytes::from(batch_header) } } -fn decode_blocks(block_contexts: Bytes) -> 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, @@ -589,13 +571,9 @@ 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) }; error_msg -} +} \ No newline at end of file diff --git a/prover/bin/challenge/src/main.rs b/prover/bin/challenge/src/main.rs index 04d3c15c7..f134ac403 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 4e014ab10..480d01f26 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 ca8716323..4a3d54dd3 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/build.rs b/prover/bin/host/build.rs deleted file mode 100644 index 8d530f6bd..000000000 --- a/prover/bin/host/build.rs +++ /dev/null @@ -1,15 +0,0 @@ -use morph_executor_utils::read_env_var; -use sp1_helper::{build_program_with_args, BuildArgs}; - -fn main() { - if read_env_var("DEVNET", false) { - build_program_with_args( - "../client", - BuildArgs { - ignore_rust_version: true, - output_directory: "bin/client/elf".to_string(), - ..Default::default() - }, - ); - } -} diff --git a/prover/bin/host/src/lib.rs b/prover/bin/host/src/lib.rs index 928db6cb9..91f0c6c52 100644 --- a/prover/bin/host/src/lib.rs +++ b/prover/bin/host/src/lib.rs @@ -34,7 +34,7 @@ pub fn prove( // Prepare input. // Convert the traces' format to reduce conversion costs in the client. - blocks.iter_mut().for_each(|blobk| blobk.flatten()); + blocks.iter_mut().for_each(|block| block.flatten()); let client_input = ClientInput { l2_traces: blocks.clone(), blob_info: get_blob_info(blocks).unwrap() }; @@ -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/host/src/main.rs b/prover/bin/host/src/main.rs index 217b5195e..5a0d370df 100644 --- a/prover/bin/host/src/main.rs +++ b/prover/bin/host/src/main.rs @@ -10,7 +10,7 @@ use sbv_primitives::types::BlockTrace; struct Args { #[clap(long)] prove: bool, - #[clap(long, default_value = "../../testdata/mainnet_batch_traces.json")] + #[clap(long, default_value = "./testdata/altfeetx/trace.json")] block_path: String, } @@ -21,8 +21,9 @@ fn main() { let args = Args::parse(); let traces: &mut Vec> = &mut load_trace(&args.block_path); let block_traces: &mut Vec = &mut traces[0]; + println!("block_traces.len: {:?}", block_traces.len()); - let _ = prove(block_traces, args.prove); + let _ = prove(block_traces, args.prove).unwrap(); } fn load_trace(file_path: &str) -> Vec> { diff --git a/prover/bin/server/src/execute.rs b/prover/bin/server/src/execute.rs new file mode 100644 index 000000000..f21ef7e77 --- /dev/null +++ b/prover/bin/server/src/execute.rs @@ -0,0 +1,142 @@ +use std::{ + fs::{self, File}, + io::BufWriter, + sync::Arc, + thread, + time::Duration, +}; + +use crate::{read_env_var, PROVER_L2_RPC, PROVER_PROOF_DIR}; +use alloy::{ + providers::{Provider, ProviderBuilder, ReqwestProvider, RootProvider}, + transports::http::reqwest, +}; +use anyhow::anyhow; +use morph_prove::prove; +use sbv_primitives::types::BlockTrace; +use serde::{Deserialize, Serialize}; +use tokio::sync::Mutex; + +// proveRequest +#[derive(Serialize, Deserialize, Debug)] +pub struct ExecuteRequest { + pub batch_index: u64, + pub start_block: u64, + pub end_block: u64, + pub rpc: String, +} + +pub struct Executor { + execute_queue: Arc>>, + provider: ReqwestProvider, +} + +impl Executor { + pub fn new(execute_queue: Arc>>) -> Result { + let url = reqwest::Url::parse(PROVER_L2_RPC.as_str()) + .map_err(|_| anyhow!("Invalid L2 RPC URL"))?; + let provider = ProviderBuilder::new().on_provider(RootProvider::new_http(url)); + + Ok(Self { execute_queue, provider }) + } + + /// Processes execute requests from a queue asynchronously. + pub async fn execute_for_queue(&mut self) { + log::info!("Waiting for execute request"); + loop { + thread::sleep(Duration::from_millis(12000)); + + // Step1. Get request from queue + let req = match self.execute_queue.lock().await.pop() { + Some(req) => { + log::info!( + "start execute batch, batch index = {:#?}, blocks len = {:#?}, start_block = {:#?}, end_block = {:#?}", + req.batch_index, + req.end_block - req.start_block + 1, + req.start_block, + req.end_block, + ); + req + } + None => { + log::info!("no execute request"); + continue; + } + }; + + // Spawn async task to handle the execution + let provider = self.provider.clone(); + execute_batch(req, provider).await; + } + } +} + +/// Executes a batch asynchronously. +async fn execute_batch(req: ExecuteRequest, provider: ReqwestProvider) { + // Step1. Fetch trace + log::info!("Requesting trace of batch-{:#?} ...", req.batch_index); + let mut block_traces = + match get_block_traces(req.batch_index, req.start_block, req.end_block, &provider).await { + Some(traces) => traces, + None => { + log::error!("Failed to get block traces for batch {}", req.batch_index); + return; + } + }; + + if read_env_var("SAVE_TRACE", false) { + save_trace(req.batch_index, &block_traces); + } + + // Step2. Execute batch (without generating proof) + log::info!("Executing evm proof for batch-{}", req.batch_index); + let prove_rt = prove(&mut block_traces, false); + match prove_rt { + Ok(_) => { + log::info!("Successfully executed batch-{}", req.batch_index,); + } + Err(e) => { + log::error!("Execution of batch-{} error: {:?}", req.batch_index, e); + } + } +} + +// Fetches block traces by provider +async fn get_block_traces( + batch_index: u64, + start_block: u64, + end_block: u64, + provider: &ReqwestProvider, +) -> Option> { + let mut block_traces: Vec = Vec::new(); + for block_num in start_block..end_block + 1 { + log::debug!("requesting trace of block {block_num}"); + let result = provider + .raw_request("morph_getBlockTraceByNumberOrHash".into(), [format!("{block_num:#x}")]) + .await; + + match result { + Ok(trace) => block_traces.push(trace), + Err(e) => { + log::error!("requesting trace error: {e}"); + return None; + } + } + } + if (end_block + 1 - start_block) as usize != block_traces.len() { + log::error!("block_traces.len not expected, batch index = {:#?}", batch_index); + return None; + } + Some(block_traces) +} + +#[allow(dead_code)] +fn save_trace(batch_index: u64, batch_traces: &Vec) { + let path = PROVER_PROOF_DIR.to_string() + format!("/batch_{}", batch_index).as_str(); + fs::create_dir_all(path.clone()).unwrap(); + let file = File::create(format!("{}/block_traces.json", path.as_str())).unwrap(); + let writer = BufWriter::new(file); + + serde_json::to_writer_pretty(writer, &batch_traces).unwrap(); + log::info!("batch_traces of batch_index = {:#?} saved", batch_index); +} diff --git a/prover/bin/server/src/lib.rs b/prover/bin/server/src/lib.rs index 1b8cad321..f95b538ad 100644 --- a/prover/bin/server/src/lib.rs +++ b/prover/bin/server/src/lib.rs @@ -1,6 +1,7 @@ pub mod server; use std::str::FromStr; +pub mod execute; pub mod queue; use once_cell::sync::Lazy; diff --git a/prover/bin/server/src/queue.rs b/prover/bin/server/src/queue.rs index a32609d74..974bffffb 100644 --- a/prover/bin/server/src/queue.rs +++ b/prover/bin/server/src/queue.rs @@ -86,7 +86,10 @@ impl Prover { if read_env_var("SAVE_TRACE", false) { save_trace(batch_index, block_traces); } - save_batch_header(block_traces, batch_index); + if !save_batch_header(block_traces, batch_index) { + save_trace(batch_index, block_traces); + continue; + } // Step3. Generate evm proof log::info!("Generate evm proof"); @@ -113,24 +116,40 @@ impl Prover { } } -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(); - - // Save batch_header - // | batch_data_hash | versioned_hash | sequencer_root | - // |-----------------|----------------|----------------| - // | bytes32 | bytes32 | bytes32 | - let mut batch_header: Vec = Vec::with_capacity(96); - batch_header.extend_from_slice(&batch_info.data_hash().0); - batch_header.extend_from_slice(&versioned_hash.0); - batch_header.extend_from_slice(&batch_info.sequencer_root().0); +fn save_batch_header(blocks: &mut Vec, batch_index: u64) -> bool { let proof_dir = PROVER_PROOF_DIR.to_string() + format!("/batch_{}", batch_index).as_str(); std::fs::create_dir_all(&proof_dir).expect("failed to create proof path"); - let mut batch_file = File::create(format!("{}/batch_header.data", proof_dir)).unwrap(); - batch_file.write_all(&batch_header[..]).expect("failed to batch_header"); + blocks.iter_mut().for_each(|block| block.flatten()); + let verify_result = EVMVerifier::verify(blocks); + + if let Ok(batch_info) = verify_result { + let blob_info = morph_executor_host::get_blob_info(blocks).unwrap(); + let (versioned_hash, _) = BlobVerifier::verify(&blob_info, blocks.len()).unwrap(); + + // Save batch_header + // | batch_data_hash | versioned_hash | sequencer_root | + // |-----------------|----------------|----------------| + // | bytes32 | bytes32 | bytes32 | + let mut batch_header: Vec = Vec::with_capacity(96); + batch_header.extend_from_slice(&batch_info.data_hash().0); + batch_header.extend_from_slice(&versioned_hash.0); + batch_header.extend_from_slice(&batch_info.sequencer_root().0); + let mut batch_file = File::create(format!("{}/batch_header.data", proof_dir)).unwrap(); + batch_file.write_all(&batch_header[..]).expect("failed to batch_header"); + true + } else { + let e = verify_result.unwrap_err(); + let error_data = serde_json::json!({ + "error_code": "EVM_EXECUTE_NOT_EXPECTED", + "error_msg": e.to_string() + }); + let mut batch_file = File::create(format!("{}/execute_result.json", proof_dir)).unwrap(); + batch_file + .write_all(serde_json::to_string_pretty(&error_data).unwrap().as_bytes()) + .expect("failed to write error"); + log::error!("EVM verification failed for batch {}: {}", batch_index, e); + false + } } fn save_proof(batch_index: u64, proof: EvmProofFixture) { @@ -191,3 +210,19 @@ fn save_trace(batch_index: u64, chunk_traces: &Vec) { serde_json::to_writer_pretty(writer, &chunk_traces).unwrap(); log::info!("chunk_traces of batch_index = {:#?} saved", batch_index); } + +#[test] +fn test_save_execute() { + let batch_index = 102u64; + + let mut blocks = load_trace("../../testdata/viridian/eip7702_traces.json"); + println!("blocks.len(): {:?}", blocks.len()); + let traces = blocks.first_mut().unwrap(); + + if !save_batch_header(traces, batch_index) { + save_trace(batch_index, traces); + println!("save_batch_header error"); + } else { + println!("save_batch_header success"); + } +} diff --git a/prover/bin/server/src/server.rs b/prover/bin/server/src/server.rs index 4fbbd2a87..08cdcb8de 100644 --- a/prover/bin/server/src/server.rs +++ b/prover/bin/server/src/server.rs @@ -1,4 +1,5 @@ use crate::{ + execute::{ExecuteRequest, Executor}, queue::{ProveRequest, Prover}, read_env_var, PROVER_PROOF_DIR, PROVE_RESULT, PROVE_TIME, REGISTRY, }; @@ -38,6 +39,9 @@ pub static MAX_PROVE_BLOCKS: Lazy = Lazy::new(|| read_env_var("MAX_PROVE_ pub static PROVE_QUEUE: Lazy>>> = Lazy::new(|| Arc::new(Mutex::new(vec![]))); +pub static EXECUTE_QUEUE: Lazy>>> = + Lazy::new(|| Arc::new(Mutex::new(vec![]))); + // Main async function to start prover service. // 1. Spawns prover mng. // 2. Spawns metric mng. @@ -51,7 +55,10 @@ pub async fn start() { // Step2. start metric management metric_mng().await; - // Step3. start prover + // Step3. start executor + start_executor().await; + + // Step4. start prover start_prover().await; } @@ -59,6 +66,7 @@ async fn prover_mng() { tokio::spawn(async { let service = Router::new() .route("/prove_batch", post(add_pending_req)) + .route("/execute_batch", post(add_execute_req)) .route("/query_proof", post(query_prove_result)) .route("/query_status", post(query_status)); @@ -90,6 +98,13 @@ async fn start_prover() { prover.prove_for_queue().await; } +async fn start_executor() { + tokio::spawn(async { + let mut executor = Executor::new(Arc::clone(&EXECUTE_QUEUE)).unwrap(); + executor.execute_for_queue().await; + }); +} + async fn handle_metrics() -> String { let mut buffer = Vec::new(); let encoder = TextEncoder::new(); @@ -164,6 +179,54 @@ async fn add_pending_req(param: String) -> String { String::from(task_status::STARTED) } +// Add execute request to queue. +async fn add_execute_req(param: String) -> String { + // Verify parameter is not empty + if param.is_empty() { + return String::from("request is empty"); + } + + // Deserialize parameter to ExecuteRequest type + let execute_request: Result = serde_json::from_str(¶m); + + // Handle deserialization result + let execute_request = match execute_request { + Ok(req) => req, + Err(_) => return String::from("deserialize executeRequest failed"), + }; + log::info!("received execute request of batch_index: {:#?}", execute_request.batch_index); + + if execute_request.end_block < execute_request.start_block { + return String::from("blocks index error"); + } + + let blocks_len = execute_request.end_block - execute_request.start_block + 1; + if blocks_len as usize > *MAX_PROVE_BLOCKS { + return format!( + "blocks len = {:?} exceeds MAX_PROVE_BLOCKS = {:?}", + blocks_len, MAX_PROVE_BLOCKS + ); + } + + // Verify RPC URL format + if !execute_request.rpc.starts_with("http://") && !execute_request.rpc.starts_with("https://") { + return String::from("invalid rpc url"); + } + + let mut queue_lock = match timeout(Duration::from_secs(1), EXECUTE_QUEUE.lock()).await { + Ok(queue_lock) => queue_lock, + Err(_) => return String::from("queue is busy"), + }; + + if queue_lock.len() > 2 { + return String::from("The execute queue is full"); + } + // Add request to queue + log::info!("add execute req of batch: {:#?}", execute_request.batch_index); + queue_lock.push(execute_request); + String::from(task_status::STARTED) +} + // Async function to check status of a proof request for a batch. // PROVED -> there are already proven results. async fn check_batch_status(prove_request: &ProveRequest) -> Option { @@ -224,6 +287,31 @@ async fn query_proof(batch_index: String) -> ProveResult { .unwrap_or("nothing") .ends_with(format!("batch_{}", batch_index.trim()).as_str()) { + // execute_result + let prove_result_path = path.join("execute_result.json"); + if prove_result_path.exists() { + match fs::File::open(prove_result_path) { + Ok(file) => { + let reader = BufReader::new(file); + let prove_result: serde_json::Value = + serde_json::from_reader(reader).unwrap_or_default(); + if let Some(error_code) = prove_result.get("error_code") { + result.error_code = error_code.as_str().unwrap_or("").to_string(); + } + if let Some(error_msg) = prove_result.get("error_msg") { + result.error_msg = error_msg.as_str().unwrap_or("").to_string(); + } + } + Err(e) => { + log::error!("Failed to load prove_result: {:#?}", e); + result.error_msg = String::from("Failed to load prove_result"); + } + } + } + if !result.error_code.is_empty() { + return result; + } + //pi_batch_agg.data let proof_path = path.join("plonk_proof.json"); if !proof_path.exists() { @@ -261,7 +349,7 @@ async fn query_proof(batch_index: String) -> ProveResult { break; } } - if result.proof_data.is_empty() { + if result.proof_data.is_empty() && result.error_msg.is_empty() { result.error_msg = String::from("No proof was found"); } result diff --git a/prover/bin/shadow-prove/Cargo.lock b/prover/bin/shadow-prove/Cargo.lock index 539489b81..e671567f5 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 5768b2ca0..becb4ceac 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 dc4c9bba6..28f7a5c6d 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,9 +609,14 @@ "type": "bytes" }, { - "internalType": "bytes", - "name": "blockContexts", - "type": "bytes" + "internalType": "uint64", + "name": "lastBlockNumber", + "type": "uint64" + }, + { + "internalType": "uint16", + "name": "numL1Messages", + "type": "uint16" }, { "internalType": "bytes32", diff --git a/prover/bin/shadow-prove/src/execute.rs b/prover/bin/shadow-prove/src/execute.rs new file mode 100644 index 000000000..8069b8a1c --- /dev/null +++ b/prover/bin/shadow-prove/src/execute.rs @@ -0,0 +1,36 @@ +use crate::{util, BatchInfo}; +use anyhow::anyhow; +use serde::{Deserialize, Serialize}; +#[derive(Serialize)] +pub struct ExecuteRequest { + pub batch_index: u64, + pub start_block: u64, + pub end_block: u64, + pub rpc: String, +} + +#[derive(Serialize, Deserialize, Debug)] +pub struct ExecuteResult { + pub error_msg: String, + pub error_code: String, +} + +pub async fn execute_batch(batch: &BatchInfo) -> Result<(), anyhow::Error> { + // Request the proverServer to prove. + let request = ExecuteRequest { + batch_index: batch.batch_index, + start_block: batch.start_block, + end_block: batch.end_block, + rpc: "http://localhost:8545".to_owned(), + }; + let rt = tokio::task::spawn_blocking(move || { + util::call_prover(serde_json::to_string(&request).unwrap(), "/execute_batch") + }) + .await; + + match rt { + Ok(Some(_)) => Ok(()), + Ok(None) => Err(anyhow!("call_prover result empty")), + Err(e) => Err(anyhow::Error::from(e)), + } +} diff --git a/prover/bin/shadow-prove/src/lib.rs b/prover/bin/shadow-prove/src/lib.rs index e13074918..7e3c2900c 100644 --- a/prover/bin/shadow-prove/src/lib.rs +++ b/prover/bin/shadow-prove/src/lib.rs @@ -1,6 +1,12 @@ +use std::env::var; + use abi::{Rollup, ShadowRollup}; +use once_cell::sync::Lazy; + +use crate::util::read_env_var; pub mod abi; +pub mod execute; pub mod metrics; pub mod shadow_prove; pub mod shadow_rollup; @@ -9,5 +15,17 @@ pub mod util; #[derive(Clone, Debug)] pub struct BatchInfo { pub batch_index: u64, - pub blocks: Vec, + pub start_block: u64, + pub end_block: u64, + pub total_txn: u64, } +pub static SHADOW_EXECUTE: Lazy = Lazy::new(|| read_env_var("SHADOW_PROVING_EXECUTE", false)); + +pub static SHADOW_PROVING_MAX_BLOCK: Lazy = + Lazy::new(|| read_env_var("SHADOW_PROVING_MAX_BLOCK", 600)); + +pub static SHADOW_PROVING_MAX_TXN: Lazy = + Lazy::new(|| read_env_var("SHADOW_PROVING_MAX_TXN", 200)); + +pub static SHADOW_PROVING_PROVER_RPC: Lazy = + Lazy::new(|| var("SHADOW_PROVING_PROVER_RPC").expect("Cannot detect PROVER_RPC env var")); diff --git a/prover/bin/shadow-prove/src/main.rs b/prover/bin/shadow-prove/src/main.rs index e5ce82eb1..7db8a69c0 100644 --- a/prover/bin/shadow-prove/src/main.rs +++ b/prover/bin/shadow-prove/src/main.rs @@ -13,10 +13,12 @@ use flexi_logger::{Cleanup, Criterion, Duplicate, FileSpec, Logger, Naming, Writ use log::Record; use prometheus::{Encoder, TextEncoder}; use shadow_proving::{ + execute::execute_batch, metrics::{METRICS, REGISTRY}, shadow_prove::ShadowProver, shadow_rollup::BatchSyncer, util::{read_env_var, read_parse_env}, + SHADOW_EXECUTE, SHADOW_PROVING_MAX_BLOCK, SHADOW_PROVING_MAX_TXN, SHADOW_PROVING_PROVER_RPC, }; use tokio::time::sleep; @@ -28,12 +30,16 @@ async fn main() { dotenv().ok(); setup_logging(); log::info!("Starting shadow proving..."); + log::info!("Loading with env SHADOW_PROVING_MAX_BLOCK: {}", *SHADOW_PROVING_MAX_BLOCK); + log::info!("Loading with env SHADOW_PROVING_MAX_TXN: {}", *SHADOW_PROVING_MAX_TXN); + log::info!("Loading with env SHADOW_PROVING_PROVER_RPC: {}", *SHADOW_PROVING_PROVER_RPC); // Start metric management. metric_mng().await; 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 +47,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 +64,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(), ); @@ -66,10 +76,52 @@ async fn main() { l1_signer, ); + // Track the latest processed batch index + let mut latest_processed_batch: u64 = 0; + loop { - sleep(Duration::from_secs(12)).await; + sleep(Duration::from_secs(30)).await; + // Get committed batch + let (batch_info, batch_header) = match batch_syncer.get_committed_batch().await { + Ok(Some(committed_batch)) => committed_batch, + Ok(None) => continue, + Err(e) => { + log::error!("get_committed_batch error: {:?}", e); + continue + } + }; + + // Check if batch has already been processed + if batch_info.batch_index <= latest_processed_batch { + log::info!("Batch {} has already been processed, skipping", batch_info.batch_index); + continue; + } + if *SHADOW_EXECUTE { + log::info!(">Start shadow execute batch: {:#?}", batch_info.batch_index); + // Execute batch + match execute_batch(&batch_info).await { + Ok(_) => { + // Update the latest processed batch index + latest_processed_batch = batch_info.batch_index; + } + Err(e) => { + log::error!("execute_batch error: {:?}", e); + continue + } + } + } + // Sync & Prove - let result = match batch_syncer.sync_batch().await { + if batch_info.end_block - batch_info.start_block + 1 > *SHADOW_PROVING_MAX_BLOCK { + log::warn!("Too many blocks in the latest batch to shadow prove"); + continue; + } + + if batch_info.total_txn > *SHADOW_PROVING_MAX_TXN { + log::warn!("Too many txn in the latest batch to shadow prove"); + continue; + } + let result = match batch_syncer.sync_batch(batch_info, batch_header).await { Ok(Some(batch)) => shadow_prover.prove(batch).await, Ok(None) => Ok(()), Err(e) => Err(e), @@ -178,90 +230,3 @@ fn log_format( record.args() ) } - -#[tokio::test] -async fn test_prove_batch() { - use alloy::{ - network::EthereumWallet, - primitives::{Address, B256}, - providers::{ProviderBuilder, RootProvider}, - signers::local::PrivateKeySigner, - transports::http::{Client, Http}, - }; - use shadow_proving::{abi::ShadowRollup, BatchInfo}; - use std::{env::var, str::FromStr}; - - dotenv().ok(); - env_logger::Builder::from_env(env_logger::Env::default().default_filter_or("info")).init(); - - let l1_rpc: String = read_parse_env("SHADOW_PROVING_L1_RPC"); - let l1_verify_rpc: String = read_parse_env("SHADOW_PROVING_VERIFY_L1_RPC"); - let private_key: String = read_parse_env("SHADOW_PROVING_PRIVATE_KEY"); - let next_tx_hash: String = read_parse_env("NEXT_TX_HASH"); - let batch_index: u64 = read_parse_env("BATCH_INDEX"); - - let signer: PrivateKeySigner = private_key.parse().unwrap(); - let wallet: EthereumWallet = EthereumWallet::from(signer.clone()); - let provider: RootProvider> = - ProviderBuilder::new().on_http(l1_rpc.parse().unwrap()); - - let verify_provider: RootProvider> = - ProviderBuilder::new().on_http(l1_verify_rpc.parse().unwrap()); - - let shadow_rollup = - var("SHADOW_PROVING_L1_SHADOW_ROLLUP").expect("Cannot detect L1_SHADOW_ROLLUP env var"); - - let l1_signer = ProviderBuilder::new() - .with_recommended_fillers() - .wallet(wallet) - .on_http(l1_verify_rpc.parse().unwrap()); - - let l1_shadow_rollup = - ShadowRollup::new(Address::from_str(&shadow_rollup).unwrap(), l1_signer.clone()); - - let shadow_prover = ShadowProver::new( - signer.address(), - Address::from_str(&shadow_rollup).unwrap(), - verify_provider.clone(), - l1_signer, - ); - - let tx_hash = B256::from_str(&next_tx_hash).unwrap(); - let batch_header = shadow_prove::shadow_rollup::batch_header_inspect(&provider, tx_hash) - .await - .ok_or_else(|| "Failed to inspect batch header".to_string()) - .unwrap(); - - let batch_store = ShadowRollup::BatchStore { - prevStateRoot: batch_header.get(89..121).unwrap_or_default().try_into().unwrap_or_default(), - postStateRoot: batch_header - .get(121..153) - .unwrap_or_default() - .try_into() - .unwrap_or_default(), - withdrawalRoot: batch_header - .get(153..185) - .unwrap_or_default() - .try_into() - .unwrap_or_default(), - dataHash: batch_header.get(25..57).unwrap_or_default().try_into().unwrap_or_default(), - blobVersionedHash: batch_header - .get(57..89) - .unwrap_or_default() - .try_into() - .unwrap_or_default(), - sequencerSetVerifyHash: batch_header - .get(185..217) - .unwrap_or_default() - .try_into() - .unwrap_or_default(), - }; - - let shadow_tx = l1_shadow_rollup.commitBatch(batch_index, batch_store); - let rt = shadow_tx.send().await.unwrap(); - println!("commitBatch success: {:?}", rt.tx_hash()); - - let batch_info = BatchInfo { batch_index, blocks: vec![1000001, 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 dd3e5094e..b6f9b2d06 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,11 +105,15 @@ 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 if let Some(prove_result) = query_proof(batch_index).await { + if !prove_result.error_code.is_empty() { + log::error!("query proof and prove state error, batch_index: {:?}, prove_result.error_code: {:?}, prove_result.error_msg: {:?}", batch_index, prove_result.error_code, prove_result.error_msg); + break; + } if !prove_result.proof_data.is_empty() { log::info!("query proof and prove state: {:?}", batch_index); prove_state(batch_index, l1_shadow_rollup).await; @@ -121,8 +124,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,12 +158,16 @@ 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. match query_proof(batch_index).await { Some(prove_result) => { + if !prove_result.error_code.is_empty() { + log::error!("query proof and prove state error, batch_index: {:?}, prove_result.error_code: {:?}, prove_result.error_msg: {:?}", batch_index, prove_result.error_code, prove_result.error_msg); + return; + } log::debug!("query proof and prove state: {:#?}", batch_index); if !prove_result.proof_data.is_empty() { prove_state(batch_index, l1_shadow_rollup).await; diff --git a/prover/bin/shadow-prove/src/shadow_rollup.rs b/prover/bin/shadow-prove/src/shadow_rollup.rs index 31402ae4b..18e9e866c 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 crate::{metrics::METRICS, 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,48 +34,34 @@ 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 } } /** * Sync a latest batch to l1-shadow-rollup. */ - pub async fn sync_batch(&self) -> Result, anyhow::Error> { + pub async fn sync_batch( + &self, + batch_info: BatchInfo, + batch_header: Bytes, + ) -> Result, anyhow::Error> { log::info!("start sync_batch..."); - - let latest = self.l1_provider.get_block_number().await?; - - // Fetch a commited batch on l1 rollup. - let (batch_info, batch_header) = match get_committed_batch( - U64::from(latest), - &self.l1_rollup, - &self.l1_provider, - ) - .await - { - Ok(Some(committed_batch)) => committed_batch, - Ok(None) => return Ok(None), - Err(msg) => { - log::error!("get_committed_batch error: {:?}", msg); - return Ok(None); - } - }; - // Batch should not have been verified yet. - if is_prove_success(batch_info.batch_index, &self.l1_shadow_rollup).await.unwrap_or(true) { - log::debug!("batch of {:?} already prove state successful", batch_info.batch_index); + if self.is_prove_success(batch_info.batch_index).await.unwrap_or(true) { + log::info!("batch of {:?} already prove state successful", batch_info.batch_index); return Ok(None); }; // 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 +76,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 @@ -150,129 +139,154 @@ where log::info!(">Sync shadow batch complete: {:#?}", batch_info.batch_index); Ok(Some(batch_info)) } -} -async fn get_committed_batch( - latest: U64, - l1_rollup: &RollupInstance, - l1_provider: &RootProvider>, -) -> Result, String> -where - P: Provider + Clone, - T: Transport + Clone, - N: Network, -{ - log::info!("latest l1 blocknum = {:#?}", latest); - let start = if latest > U64::from(600) { latest - U64::from(600) } else { U64::from(1) }; - let filter = - l1_rollup.CommitBatch_filter().filter.from_block(start).address(*l1_rollup.address()); - let mut logs: Vec = match l1_provider.get_logs(&filter).await { - Ok(logs) => logs, - Err(e) => { - log::error!("l1_rollup.commit_batch.get_logs error: {:#?}", e); - return Err("l1_rollup.commit_batch.get_logs provider error".to_string()); + pub async fn get_committed_batch(&self) -> Result, String> { + let latest = match self.l1_provider.get_block_number().await { + Ok(v) => U64::from(v), + Err(e) => { + log::error!("l1_provider.get_block_number error: {:?}", e); + return Err("l1_provider.get_block_number error".to_string()); + } + }; + + log::info!("latest l1 blocknum = {:#?}", latest); + let start = if latest > U64::from(600) { latest - U64::from(600) } else { U64::from(1) }; + let filter = self + .l1_rollup + .CommitBatch_filter() + .filter + .from_block(start) + .address(*self.l1_rollup.address()); + let mut logs: Vec = match self.l1_provider.get_logs(&filter).await { + Ok(logs) => logs, + Err(e) => { + log::error!("l1_rollup.commit_batch.get_logs error: {:#?}", e); + return Err("l1_rollup.commit_batch.get_logs provider error".to_string()); + } + }; + if logs.is_empty() { + log::warn!("There have been no commit_batch logs for the last 600 blocks"); + return Ok(None); } - }; - if logs.is_empty() { - log::warn!("There have been no commit_batch logs for the last 600 blocks"); - return Ok(None); - } - if logs.len() < 2 { - 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())); + 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(), + let batch_index_hash = match logs.get(logs.len() - 2) { + Some(log) => { + let _index = U256::from_be_slice(log.topics()[1].as_slice()); + (_index.to::(), log.transaction_hash.unwrap_or_default()) + } + None => { + return Err("find commit_batch log error".to_string()); + } + }; - None => { - return Err("find commit_batch log error".to_string()); + if batch_index_hash.0 == 0 { + return Err(String::from("batch_index is 0")); } - }; - 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) { - 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) - } - None => { - return Err("find commit_batch log error".to_string()); - } - }; + let prev_tx_hash = match logs.get(logs.len() - 3) { + Some(log) => log.transaction_hash.unwrap_or_default(), + None => { + return Err("find commit_batch log error".to_string()); + } + }; - 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 self.batch_blocks_inspect(prev_tx_hash, batch_index_hash.1).await { + Some(block_txn) => block_txn, + None => return Err(String::from("batch_blocks_inspect none")), + }; - if blocks.is_empty() { - return Err(String::from("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) { - log::warn!("Too many blocks in the latest batch to shadow prove"); - return Ok(None); - } + let batch_info: BatchInfo = BatchInfo { + batch_index: batch_index_hash.0, + start_block: blocks.0, + end_block: blocks.1, + total_txn: total_txn_count, + }; - if total_txn_count > read_env_var("SHADOW_PROVING_MAX_TXN", 600) { - log::warn!("Too many txn in the latest batch to shadow prove"); - return Ok(None); - } + // A rollup commit_batch_input contains prev batch_header. + let next_tx_hash = match logs.last() { + Some(log) => log.transaction_hash.unwrap_or_default(), - let batch_info: BatchInfo = BatchInfo { batch_index, blocks }; + None => { + return Err("find commit_batch log error".to_string()); + } + }; + let batch_input = batch_input_inspect(&self.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))) -} + log::info!("Found the committed batch, batch index = {:#?}", batch_index_hash.0); + Ok(Some((batch_info, batch_input.0))) + } -pub async fn batch_header_inspect( - l1_provider: &RootProvider>, - hash: TxHash, -) -> Option { - //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"); + async fn batch_blocks_inspect( + &self, + prev_batch_hash: TxHash, + current_batch_hash: TxHash, + ) -> Option<((u64, u64), u64)> { + let prev_batch_input = batch_input_inspect(&self.l1_provider, prev_batch_hash).await?; + let current_batch_input = + batch_input_inspect(&self.l1_provider, current_batch_hash).await?; + let start_block = prev_batch_input.1 + 1; + let end_block = current_batch_input.1; + + if start_block == 0 { + log::error!("batch_blocks_inspect: start_block = 0, tx_hash = {:#?}", prev_batch_hash); return None; } - Err(e) => { - log::error!("l1_provider.get_transaction err: {:#?}", e); - return None; + + let mut total_tx_count: u64 = 0; + for i in start_block..end_block + 1 { + total_tx_count += self + .l2_provider + .get_block_transaction_count_by_number(i.into()) + .await + .unwrap_or_default() + .unwrap_or_default(); } - }; - //Step2. Parse transaction data - let data = tx.input; + log::info!( + "decode_blocks, blocks_len: {:#?}, start_block: {:#?}, txn_in_batch: {:?}", + end_block - start_block, + start_block, + total_tx_count + ); - if data.is_empty() { - log::warn!("batch inspect: tx.input is empty, tx_hash = {:#?}", hash); - return None; + METRICS.shadow_txn_len.set(total_tx_count as i64); + + Some(((start_block, end_block), total_tx_count)) + } + + async fn is_prove_success(&self, batch_index: u64) -> Option { + let is_prove_success: bool = + match self.l1_shadow_rollup.isProveSuccess(U256::from(batch_index)).call().await { + Ok(x) => x._0, + Err(e) => { + log::info!( + "query l1_shadow_rollup.is_prove_success error, batch index = {:#?}, {:#?}", + batch_index, + e + ); + return None; + } + }; + Some(is_prove_success) } - 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 parent_batch_header: Bytes = param.batchDataInput.parentBatchHeader; - Some(parent_batch_header) } -async fn batch_blocks_inspect( +pub async fn batch_input_inspect( l1_provider: &RootProvider>, hash: TxHash, -) -> Option<(Vec, u32)> { +) -> Option<(Bytes, u64)> { //Step1. Get transaction let result = l1_provider.get_transaction_by_hash(hash).await; let tx = match result { @@ -288,7 +302,7 @@ async fn batch_blocks_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); @@ -300,87 +314,10 @@ async fn batch_blocks_inspect( log::error!("batch inspect: decode tx.input error, tx_hash = {:#?}", hash); 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); - } - - 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 - ); - Some((blocks, txn_in_batch)) -} - -async fn is_prove_success( - batch_index: u64, - l1_rollup: &ShadowRollupInstance, -) -> Option -where - P: Provider + Clone, - T: Transport + Clone, - N: Network, -{ - let is_prove_success: bool = - match l1_rollup.isProveSuccess(U256::from(batch_index)).call().await { - Ok(x) => x._0, - Err(e) => { - log::info!( - "query l1_shadow_rollup.is_prove_success error, batch index = {:#?}, {:#?}", - batch_index, - e - ); - return None; - } - }; - 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); + let parent_batch_header: Bytes = param.batchDataInput.parentBatchHeader; + let last_block_number: u64 = param.batchDataInput.lastBlockNumber; + Some((parent_batch_header, last_block_number)) } - #[tokio::test] async fn test_sync_batch() { use alloy::{ @@ -395,13 +332,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,10 +357,12 @@ 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(); + let batch = bs.get_committed_batch().await.unwrap().unwrap(); + bs.sync_batch(batch.0, batch.1).await.unwrap(); } #[tokio::test] @@ -432,10 +376,11 @@ async fn test_inspect_batch_header() { let next_tx_hash = B256::from_str("0x2bdfb2bd0b8c9210bfb593cc5734e3f092fcdd54fe74c46a938448b0422089f7") .unwrap(); - let batch_header = batch_header_inspect(&provider, next_tx_hash) + let batch_header = batch_input_inspect(&provider, next_tx_hash) .await .ok_or_else(|| "Failed to inspect batch header".to_string()) - .unwrap(); + .unwrap() + .0; let batch_store = ShadowRollup::BatchStore { prevStateRoot: batch_header.get(89..121).unwrap_or_default().try_into().unwrap_or_default(), diff --git a/prover/bin/shadow-prove/src/util.rs b/prover/bin/shadow-prove/src/util.rs index 96c1654ff..86e74f0b5 100644 --- a/prover/bin/shadow-prove/src/util.rs +++ b/prover/bin/shadow-prove/src/util.rs @@ -1,7 +1,9 @@ -use std::{env::var, str::FromStr}; +use std::str::FromStr; + +use crate::SHADOW_PROVING_PROVER_RPC; pub fn call_prover(param: String, function: &str) -> Option { - let prover_rpc = var("SHADOW_PROVING_PROVER_RPC").expect("Cannot detect PROVER_RPC env var"); + let prover_rpc = SHADOW_PROVING_PROVER_RPC.clone(); let client = reqwest::blocking::Client::new(); let url = prover_rpc.to_owned() + function; @@ -61,9 +63,11 @@ async fn test_call_prover() { shadow: true, }; - let rt = tokio::task::spawn_blocking(move || call_prover(serde_json::to_string(&request).unwrap(), "/query_proof")) - .await - .unwrap(); + let rt = tokio::task::spawn_blocking(move || { + call_prover(serde_json::to_string(&request).unwrap(), "/query_proof") + }) + .await + .unwrap(); match rt { Some(info) => { diff --git a/prover/crates/core/Cargo.toml b/prover/crates/core/Cargo.toml index 053ac0ebb..f10947bc9 100644 --- a/prover/crates/core/Cargo.toml +++ b/prover/crates/core/Cargo.toml @@ -21,6 +21,7 @@ tiny-keccak.workspace = true sbv-primitives.workspace = true sbv-utils.workspace = true +cfg-if = { workspace = true } [dev-dependencies] ctor.workspace = true diff --git a/prover/crates/core/src/batch.rs b/prover/crates/core/src/batch.rs index 9a394579a..202de0809 100644 --- a/prover/crates/core/src/batch.rs +++ b/prover/crates/core/src/batch.rs @@ -31,9 +31,10 @@ impl BatchInfo { 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); } diff --git a/prover/crates/core/src/database.rs b/prover/crates/core/src/database.rs index 1db47d33e..82ddae1d9 100644 --- a/prover/crates/core/src/database.rs +++ b/prover/crates/core/src/database.rs @@ -193,12 +193,10 @@ impl DatabaseRef for ReadOnlyDB { // then the upcoming trace contains code (meaning the code is used in this new block), // we can't directly update the CacheDB, so we offer the code by hash here. // However, if the code still cannot be found, this is an error. - self.code_db.get(&hash).cloned().ok_or_else(|| { - unreachable!( - "Code is either loaded or not needed (like EXTCODESIZE), code hash: {:?}", - hash - ); - }) + Ok(self.code_db.get(&hash).cloned().unwrap_or_else(|| { + println!("---------------->code_by_hash_ref error: {:?}", hash); + Bytecode::default() + })) } /// Get storage value of address at index. diff --git a/prover/crates/core/src/executor/mod.rs b/prover/crates/core/src/executor/mod.rs index bc5c03b15..6ab5f2bce 100644 --- a/prover/crates/core/src/executor/mod.rs +++ b/prover/crates/core/src/executor/mod.rs @@ -6,16 +6,29 @@ use crate::{ use revm::{ db::{AccountState, CacheDB}, primitives::{ - AccountInfo, BlockEnv, Env, SpecId, TxEnv, B256, KECCAK_EMPTY, POSEIDON_EMPTY, U256, + AccountInfo, AuthorizationList as RevmAuthorizationList, BlockEnv, Env, SpecId, TxEnv, + B256, KECCAK_EMPTY, POSEIDON_EMPTY, U256, }, Database, }; -use sbv_primitives::{zk_trie::ZkMemoryDb, Address, Block, Transaction, TxTrace}; +use sbv_primitives::{ + zk_trie::ZkMemoryDb, Address, Block, SignedAuthorization, Transaction, TxTrace, +}; use std::{fmt::Debug, rc::Rc}; mod builder; pub use builder::EvmExecutorBuilder; +/// Convert from Option<&[SignedAuthorization]> to Option +fn convert_authorization_list( + auth_list: Option<&[SignedAuthorization]>, +) -> Option { + auth_list.map(|list| { + let signed_auths: Vec = list.to_vec(); + RevmAuthorizationList::from(signed_auths) + }) +} + /// Execute hooks pub mod hooks; @@ -79,6 +92,12 @@ impl EvmExecutor<'_> { }; for (idx, tx) in l2_trace.transactions().enumerate() { + cfg_if::cfg_if! { + if #[cfg(not(target_os = "zkvm"))] { + println!("handle block: {:?}, handle tx: {:?}th", l2_trace.number(), idx); + } + } + cycle_tracker_start!("handle tx {}", idx); dev_trace!("handle {idx}th tx"); @@ -105,7 +124,10 @@ impl EvmExecutor<'_> { nonce: if !tx.is_l1_msg() { Some(tx.nonce()) } else { None }, chain_id: tx.chain_id(), access_list: tx.access_list().cloned().unwrap_or_default().0, + authorization_list: convert_authorization_list(tx.authorization_list()), gas_priority_fee: tx.max_priority_fee_per_gas().map(U256::from), + fee_token_id: tx.fee_token_id(), + fee_limit: tx.fee_limit(), ..Default::default() }; @@ -263,9 +285,11 @@ impl EvmExecutor<'_> { poseidon_code_hash.0, ]; cycle_track!( - zktrie - .update_account(addr.as_slice(), &acc_data) - .unwrap_or_else(|_| panic!("failed to update account: {}", addr)), + zktrie.update_account(addr.as_slice(), &acc_data).unwrap_or_else(|e| println!( + "---------------->failed to update account: {:?}, address: {:?}", + addr, + e.to_string() + )), "Zktrie::update_account" ); @@ -289,3 +313,257 @@ impl Debug for EvmExecutor<'_> { f.debug_struct("EvmExecutor").field("db", &self.db).field("spec_id", &self.spec_id).finish() } } + +#[cfg(test)] +mod test { + use crate::ReadOnlyDB; + use revm::{ + db::CacheDB, + primitives::{ + address, bytes, keccak256, AccountInfo, BlockEnv, Bytecode, Bytes, TxEnv, B256, U256, + }, + Database, + }; + use sbv_primitives::{types::BlockTrace, zk_trie::ZkMemoryDb, Address}; + use std::rc::Rc; + + static ERC20_DEPLOYED_CODE : Bytes = bytes!("608060405234801561001057600080fd5b50600436106100a95760003560e01c80633950935111610071578063395093511461016857806370a082311461019857806395d89b41146101c8578063a457c2d7146101e6578063a9059cbb14610216578063dd62ed3e14610246576100a9565b806306fdde03146100ae578063095ea7b3146100cc57806318160ddd146100fc57806323b872dd1461011a578063313ce5671461014a575b600080fd5b6100b6610276565b6040516100c39190610b0c565b60405180910390f35b6100e660048036038101906100e19190610bc7565b610308565b6040516100f39190610c22565b60405180910390f35b61010461032b565b6040516101119190610c4c565b60405180910390f35b610134600480360381019061012f9190610c67565b610335565b6040516101419190610c22565b60405180910390f35b610152610364565b60405161015f9190610cd6565b60405180910390f35b610182600480360381019061017d9190610bc7565b61036d565b60405161018f9190610c22565b60405180910390f35b6101b260048036038101906101ad9190610cf1565b6103a4565b6040516101bf9190610c4c565b60405180910390f35b6101d06103ec565b6040516101dd9190610b0c565b60405180910390f35b61020060048036038101906101fb9190610bc7565b61047e565b60405161020d9190610c22565b60405180910390f35b610230600480360381019061022b9190610bc7565b6104f5565b60405161023d9190610c22565b60405180910390f35b610260600480360381019061025b9190610d1e565b610518565b60405161026d9190610c4c565b60405180910390f35b60606003805461028590610d8d565b80601f01602080910402602001604051908101604052809291908181526020018280546102b190610d8d565b80156102fe5780601f106102d3576101008083540402835291602001916102fe565b820191906000526020600020905b8154815290600101906020018083116102e157829003601f168201915b5050505050905090565b60008061031361059f565b90506103208185856105a7565b600191505092915050565b6000600254905090565b60008061034061059f565b905061034d858285610770565b6103588585856107fc565b60019150509392505050565b60006006905090565b60008061037861059f565b905061039981858561038a8589610518565b6103949190610ded565b6105a7565b600191505092915050565b60008060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060600480546103fb90610d8d565b80601f016020809104026020016040519081016040528092919081815260200182805461042790610d8d565b80156104745780601f1061044957610100808354040283529160200191610474565b820191906000526020600020905b81548152906001019060200180831161045757829003601f168201915b5050505050905090565b60008061048961059f565b905060006104978286610518565b9050838110156104dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104d390610e93565b60405180910390fd5b6104e982868684036105a7565b60019250505092915050565b60008061050061059f565b905061050d8185856107fc565b600191505092915050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610616576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161060d90610f25565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610685576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161067c90610fb7565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516107639190610c4c565b60405180910390a3505050565b600061077c8484610518565b90507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146107f657818110156107e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107df90611023565b60405180910390fd5b6107f584848484036105a7565b5b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361086b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610862906110b5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036108da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d190611147565b60405180910390fd5b6108e5838383610a72565b60008060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561096b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610962906111d9565b60405180910390fd5b8181036000808673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816000808573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051610a599190610c4c565b60405180910390a3610a6c848484610a77565b50505050565b505050565b505050565b600081519050919050565b600082825260208201905092915050565b60005b83811015610ab6578082015181840152602081019050610a9b565b60008484015250505050565b6000601f19601f8301169050919050565b6000610ade82610a7c565b610ae88185610a87565b9350610af8818560208601610a98565b610b0181610ac2565b840191505092915050565b60006020820190508181036000830152610b268184610ad3565b905092915050565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000610b5e82610b33565b9050919050565b610b6e81610b53565b8114610b7957600080fd5b50565b600081359050610b8b81610b65565b92915050565b6000819050919050565b610ba481610b91565b8114610baf57600080fd5b50565b600081359050610bc181610b9b565b92915050565b60008060408385031215610bde57610bdd610b2e565b5b6000610bec85828601610b7c565b9250506020610bfd85828601610bb2565b9150509250929050565b60008115159050919050565b610c1c81610c07565b82525050565b6000602082019050610c376000830184610c13565b92915050565b610c4681610b91565b82525050565b6000602082019050610c616000830184610c3d565b92915050565b600080600060608486031215610c8057610c7f610b2e565b5b6000610c8e86828701610b7c565b9350506020610c9f86828701610b7c565b9250506040610cb086828701610bb2565b9150509250925092565b600060ff82169050919050565b610cd081610cba565b82525050565b6000602082019050610ceb6000830184610cc7565b92915050565b600060208284031215610d0757610d06610b2e565b5b6000610d1584828501610b7c565b91505092915050565b60008060408385031215610d3557610d34610b2e565b5b6000610d4385828601610b7c565b9250506020610d5485828601610b7c565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680610da557607f821691505b602082108103610db857610db7610d5e565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000610df882610b91565b9150610e0383610b91565b9250828201905080821115610e1b57610e1a610dbe565b5b92915050565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b6000610e7d602583610a87565b9150610e8882610e21565b604082019050919050565b60006020820190508181036000830152610eac81610e70565b9050919050565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000610f0f602483610a87565b9150610f1a82610eb3565b604082019050919050565b60006020820190508181036000830152610f3e81610f02565b9050919050565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b6000610fa1602283610a87565b9150610fac82610f45565b604082019050919050565b60006020820190508181036000830152610fd081610f94565b9050919050565b7f45524332303a20696e73756666696369656e7420616c6c6f77616e6365000000600082015250565b600061100d601d83610a87565b915061101882610fd7565b602082019050919050565b6000602082019050818103600083015261103c81611000565b9050919050565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b600061109f602583610a87565b91506110aa82611043565b604082019050919050565b600060208201905081810360008301526110ce81611092565b9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b6000611131602383610a87565b915061113c826110d5565b604082019050919050565b6000602082019050818103600083015261116081611124565b9050919050565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b60006111c3602683610a87565b91506111ce82611167565b604082019050919050565b600060208201905081810360008301526111f2816111b6565b905091905056fea2646970667358221220bd76a0877c61d26a928dd36a2ac3491d00e9086a429df7883853cc988a8c1cbf64736f6c63430008120033"); + // TokenRegistry is the storage slot for mapping(uint16 => TokenInfo) - slot 151 + const TOKEN_REGISTRY_SLOT: U256 = U256::from_limbs([151u64, 0, 0, 0]); + // PriceRatio is the storage slot for mapping(uint16 => uint256) - slot 153 + const PRICE_RATIO_SLOT: U256 = U256::from_limbs([153u64, 0, 0, 0]); + // System address for receiving Alt Token fees + pub const L2_FEE_VAULT: Address = address!("0e87cd091e091562F25CB1cf4641065dA2C049F5"); + // System address for L2 token registry + pub const L2_TOKEN_REGISTRY_ADDRESS: Address = + address!("5300000000000000000000000000000000000021"); + + #[test] + fn alt_fee_normal() { + let account_from = address!("f39Fd6e51aad88F6F4ce6aB8827279cffFb92266"); + let account_to = address!("70997970C51812dc3A010C7d01b50e0d17dc79C8"); + + // use erc20 gas token for txn. + let tx = TxEnv { + caller: account_from, + gas_limit: 31000u64, + transact_to: account_to.into(), + value: U256::from(1_000u64), + data: Bytes::new(), + nonce: None, + chain_id: None, + fee_token_id: Some(1), + fee_limit: None, + gas_price: U256::from(10u64.pow(9)), + ..Default::default() + }; + + // 1 ETH = 4000 USDT. + let (account_from_balance, erc20_value, erc20_value_vault, erc20_balance_evm) = + exec_alt_fee_txn(1, U256::from(1u64), U256::from(250000000u64), tx); + + assert!( + account_from_balance.to::() == 999999999999999000, + "Only 1000wei must have been transferred." + ); //Only the value 1_000 wei was transferred. + + assert!(erc20_value.to::() == 199916000, "Gas fees should use: 84,000"); //Gas fees used: 84,000 + + assert!(erc20_value_vault.to::() == 84000, "Gas fees should use: 84,000"); //recive gas fees: 84,000 + + assert!(erc20_value.eq(&erc20_balance_evm), "Gas fees used: 84,000") //Gas fees used: + // 84,000 + } + + fn exec_alt_fee_txn( + token_id: u16, + scale_value: U256, + price_ratio_value: U256, + tx: TxEnv, + ) -> (U256, U256, U256, U256) { + let account_from = tx.caller; + + let zktrie_db = ZkMemoryDb::new(); + let zktrie_db = Rc::new(zktrie_db); + let trace = BlockTrace::default(); + let mut cache_db = CacheDB::new(ReadOnlyDB::new(trace, &zktrie_db).unwrap()); + let token_account = address!("fab77965cAfB593Bd86E2e8073407CAb7fD2f6c4"); + let token_account_info = AccountInfo { + nonce: 0_u64, + balance: U256::from(1_000_000_000_000_000_000u128), + code_hash: keccak256(Bytes::new()), + code: Some(Bytecode::new_legacy(ERC20_DEPLOYED_CODE.clone())), + code_size: 0, + poseidon_code_hash: B256::default(), + }; + // cache_db.insert_contract(token_account); + cache_db.insert_account_info(token_account, token_account_info.clone()); + + // Calculate the storage location of account_from in the _balances mapping + // Storage location of Solidity mapping = keccak256(abi.encode(key, slot)) + let balance_slot = U256::ZERO; // slot of _balances mapping in ERC20. + let mut data = [0u8; 64]; + data[12..32].copy_from_slice(account_from.as_slice()); // The address occupies 20 bytes, left-padded to 32 bytes. + data[32..64].copy_from_slice(&balance_slot.to_be_bytes::<32>()); // The slot occupies 32 bytes. + + let storage_key = keccak256(&data); + let storage_key_u256 = U256::from_be_bytes(storage_key.0); + + // Set the balance to 200000000 + let balance_value = U256::from(200000000u64); + let _ = cache_db.insert_account_storage(token_account, storage_key_u256, balance_value); + + let balance_slot = U256::ZERO; // slot of _balances mapping in ERC20. + let mut data = [0u8; 64]; + data[12..32].copy_from_slice(L2_FEE_VAULT.as_slice()); // The address occupies 20 bytes, left-padded to 32 bytes. + data[32..64].copy_from_slice(&balance_slot.to_be_bytes::<32>()); // The slot occupies 32 bytes. + + let storage_key = keccak256(&data); + let storage_key_u256_vault = U256::from_be_bytes(storage_key.0); + + // Set ERC20PriceOracle storage + // Calculate base slot for tokenRegistry[token_id] + // tokenRegistry is at slot 0 + let token_registry_slot = TOKEN_REGISTRY_SLOT.to_be_bytes_vec(); + let mut token_id_bytes = [0u8; 32]; + token_id_bytes[30..32].copy_from_slice(&token_id.to_be_bytes()); + + let mut token_registry_pre_image = token_id_bytes.to_vec(); + token_registry_pre_image.extend_from_slice(&token_registry_slot); + let token_registry_base = keccak256(&token_registry_pre_image); + let token_registry_base_u256 = U256::from_be_bytes(token_registry_base.0); + + // TokenInfo struct layout: + // slot + 0: tokenAddress (address, 20 bytes) + 12 bytes padding + // slot + 1: balanceSlot (bytes32, 32 bytes) + // slot + 2: isActive (bool, 1 byte) + decimals (uint8, 1 byte) + 30 bytes padding + // slot + 3: scale (uint256, 32 bytes) + + // Set tokenAddress at slot + 0 + let token_address_value = U256::from_be_bytes(token_account.into_word().into()); + let _ = cache_db.insert_account_storage( + L2_TOKEN_REGISTRY_ADDRESS, + token_registry_base_u256, + token_address_value, + ); + + // Set balanceSlot at slot + 1 (using slot 0 for ERC20 balance mapping) + let balance_slot_value = U256::ZERO; + let _ = cache_db.insert_account_storage( + L2_TOKEN_REGISTRY_ADDRESS, + token_registry_base_u256 + U256::from(1), + balance_slot_value, + ); + + // Set isActive and decimals at slot + 2 + // isActive = true (1), decimals = 6 + // In storage: rightmost byte (byte 31) is isActive, byte 30 is decimals + let mut slot_2_bytes = [0u8; 32]; + slot_2_bytes[30] = 6; // decimals + slot_2_bytes[31] = 1; // isActive = true + let slot_2_value = U256::from_be_bytes(slot_2_bytes); + let _ = cache_db.insert_account_storage( + L2_TOKEN_REGISTRY_ADDRESS, + token_registry_base_u256 + U256::from(2), + slot_2_value, + ); + + // Set scale at slot + 3 + let _ = cache_db.insert_account_storage( + L2_TOKEN_REGISTRY_ADDRESS, + token_registry_base_u256 + U256::from(3), + scale_value, + ); + + // Set priceRatio for tokenID + // priceRatio is at slot 2 + let price_ratio_slot = PRICE_RATIO_SLOT.to_be_bytes_vec(); + let mut price_ratio_pre_image = token_id_bytes.to_vec(); + price_ratio_pre_image.extend_from_slice(&price_ratio_slot); + + let price_ratio_storage_slot = keccak256(&price_ratio_pre_image); + let price_ratio_storage_slot_u256 = U256::from_be_bytes(price_ratio_storage_slot.0); + + let _ = cache_db.insert_account_storage( + L2_TOKEN_REGISTRY_ADDRESS, + price_ratio_storage_slot_u256, + price_ratio_value, + ); + + let acc_info = AccountInfo { + nonce: 0_u64, + balance: U256::from(1_000_000_000_000_000_000u128), + code_hash: keccak256(Bytes::new()), + code: None, + code_size: 0, + poseidon_code_hash: B256::default(), + }; + cache_db.insert_account_info(account_from, acc_info.clone()); + let mut block_env = BlockEnv::default(); + block_env.coinbase = L2_FEE_VAULT; + let mut evm = revm::Evm::builder().with_db(&mut cache_db).with_block_env(block_env).build(); + // use erc20 gas token for txn. + let mut tx = tx; + + // process txn + tx.morph.is_l1_msg = false; + tx.morph.rlp_bytes = Some(Bytes::default()); + evm.context.evm.env.tx = tx; + let _ = evm.transact_commit(); + + let account_from_balance = + evm.context.evm.inner.db.load_account(account_from).unwrap().info.balance; + + let erc20_value = + evm.context.evm.db.storage(token_account, storage_key_u256).unwrap_or_default(); + + let erc20_value_vault = + evm.context.evm.db.storage(token_account, storage_key_u256_vault).unwrap_or_default(); + + let method_id = [0x70u8, 0xa0, 0x82, 0x31]; + let mut calldata = Vec::with_capacity(36); + calldata.extend_from_slice(&method_id); + calldata.extend_from_slice(&[0u8; 12]); // Pad address to 32 bytes + calldata.extend_from_slice(account_from.as_slice()); + + let mut token_balance_tx = TxEnv { + caller: Address::default(), + gas_limit: u64::MAX, + transact_to: token_account.into(), + value: U256::ZERO, + data: Bytes::from(calldata), + nonce: None, + chain_id: None, + ..Default::default() + }; + token_balance_tx.morph.is_l1_msg = false; + token_balance_tx.morph.rlp_bytes = Some(Bytes::default()); + evm.context.evm.env.tx = token_balance_tx; + + let erc20_balance_evm = match evm.transact() { + Ok(result) => { + if result.result.is_success() { + // Parse the returned balance (32 bytes) + if let Some(output) = result.result.output() { + if output.len() >= 32 { + U256::from_be_slice(&output[..32]) + } else { + U256::ZERO + } + } else { + U256::ZERO + } + } else { + U256::ZERO + } + } + Err(_) => { + println!("get_erc20_balance error"); + U256::ZERO + } + }; + println!("account_from_erc20_value_evm: {:?}", erc20_balance_evm); + + (account_from_balance, erc20_value, erc20_value_vault, erc20_balance_evm) + } +} diff --git a/prover/crates/core/src/hardfork.rs b/prover/crates/core/src/hardfork.rs index 9b06e9f98..d613a36be 100644 --- a/prover/crates/core/src/hardfork.rs +++ b/prover/crates/core/src/hardfork.rs @@ -13,12 +13,39 @@ 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)])); - map.insert(MORPH_TESTNET_CHAIN_ID, HashMap::from([(SpecId::BERNOULLI, 0), (SpecId::CURIE, 0)])); - map.insert(MORPH_MAINNET_CHAIN_ID, HashMap::from([(SpecId::BERNOULLI, 0), (SpecId::CURIE, 0)])); + map.insert( + MORPH_DEVNET_CHAIN_ID, + HashMap::from([ + (SpecId::BERNOULLI, 0), + (SpecId::CURIE, 0), + (SpecId::MORPH203, 0), + (SpecId::VIRIDIAN, 0), + (SpecId::EMERALD, 0), + ]), + ); + map.insert( + MORPH_TESTNET_CHAIN_ID, + HashMap::from([ + (SpecId::BERNOULLI, 0), + (SpecId::CURIE, 0), + (SpecId::MORPH203, 0), + (SpecId::VIRIDIAN, 0), + (SpecId::EMERALD, 0), + ]), + ); + map.insert( + MORPH_MAINNET_CHAIN_ID, + HashMap::from([ + (SpecId::BERNOULLI, 0), + (SpecId::CURIE, 0), + (SpecId::MORPH203, 0), + (SpecId::VIRIDIAN, 0), + (SpecId::EMERALD, 0), + ]), + ); map }); @@ -28,6 +55,9 @@ static HARDFORK_HEIGHTS: Lazy>> = Lazy::new(|| pub struct HardforkConfig { bernoulli_block: u64, curie_block: u64, + morph203_block: u64, + viridian_block: u64, + emerald_block: u64, } impl HardforkConfig { @@ -37,6 +67,9 @@ 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), + viridian_block: heights.get(&SpecId::VIRIDIAN).copied().unwrap_or(0), + emerald_block: heights.get(&SpecId::EMERALD).copied().unwrap_or(0), } } else { dev_warn!( @@ -59,12 +92,27 @@ 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 + } + + /// Set the Emerald block number. + pub fn set_emerald_block(&mut self, emerald_block: u64) -> &mut Self { + self.emerald_block = emerald_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, + n if n < self.viridian_block => SpecId::MORPH203, + n if n < self.emerald_block => SpecId::VIRIDIAN, + _ => SpecId::EMERALD, } } diff --git a/prover/crates/morph-executor/client/src/lib.rs b/prover/crates/morph-executor/client/src/lib.rs index 6b1457b41..5bd458a58 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,12 +34,14 @@ 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"); - let batch_info = EVMVerifier::verify(&input.l2_traces).unwrap(); + let batch_info = EVMVerifier::verify(&input.l2_traces)?; println!("cycle-tracker-end: evm-verify"); // Calc public input hash. diff --git a/prover/crates/morph-executor/client/src/types/blob.rs b/prover/crates/morph-executor/client/src/types/blob.rs index 3bdeaca96..3f83b0eba 100644 --- a/prover/crates/morph-executor/client/src/types/blob.rs +++ b/prover/crates/morph-executor/client/src/types/blob.rs @@ -75,8 +75,10 @@ pub fn decode_transactions(bs: &[u8]) -> Vec { let tx_len_size = if first_byte > 0xf7 { (first_byte - 0xf7) as usize } else { - if first_byte != 0x01 && first_byte != 0x02 { - println!("not supported tx type"); + // Support transaction types: 0x01, 0x02, 0x04 + if first_byte != 0x01 && first_byte != 0x02 && first_byte != 0x04 && first_byte != 0x7f + { + println!("not supported tx type: 0x{:02x}", first_byte); break; } (*bs.get(offset + 1).unwrap() - 0xf7) as usize @@ -108,5 +110,6 @@ pub fn decode_transactions(bs: &[u8]) -> Vec { offset += rlp_tx_len; } + println!("Successfully decoded {} transactions", txs_decoded.len()); txs_decoded } 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 12835f4e1..72b597f8b 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,17 @@ 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/client/src/verifier/evm_verifier.rs b/prover/crates/morph-executor/client/src/verifier/evm_verifier.rs index 945f5ddd7..5d915f556 100644 --- a/prover/crates/morph-executor/client/src/verifier/evm_verifier.rs +++ b/prover/crates/morph-executor/client/src/verifier/evm_verifier.rs @@ -29,6 +29,7 @@ fn execute(traces: &[BlockTrace]) -> Result { let mut executor = EvmExecutorBuilder::new(zktrie_db.clone()) .hardfork_config(fork_config) .build(&traces[0])?; + #[allow(clippy::map_identity)] #[allow(clippy::manual_inspect)] executor.handle_block(&traces[0])?; @@ -39,6 +40,7 @@ fn execute(traces: &[BlockTrace]) -> Result { let trace_root_after = batch_info.post_state_root(); let revm_root_after = executor.commit_changes(&zktrie_db); + if revm_root_after != batch_info.post_state_root() { dev_error!( "root mismatch: root after in trace = {trace_root_after:x}, root after in revm = {revm_root_after:x}" diff --git a/prover/crates/morph-executor/host/src/lib.rs b/prover/crates/morph-executor/host/src/lib.rs index 5f0de76f4..05249a592 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/primitives/src/lib.rs b/prover/crates/primitives/src/lib.rs index ca1af5349..6f6f17216 100644 --- a/prover/crates/primitives/src/lib.rs +++ b/prover/crates/primitives/src/lib.rs @@ -1,8 +1,8 @@ //! Stateless Block Verifier primitives library. -use crate::types::{TxL1Msg, TypedTransaction}; +use crate::types::{tx_alt_fee::TxAltFee, TxL1Msg, TypedTransaction}; use alloy::{ - consensus::{SignableTransaction, TxEip1559, TxEip2930, TxEnvelope, TxLegacy}, + consensus::{SignableTransaction, TxEip1559, TxEip2930, TxEip7702, TxEnvelope, TxLegacy}, eips::eip2930::AccessList, primitives::{Bytes, ChainId, Signature, SignatureError, TxKind}, }; @@ -17,6 +17,7 @@ pub mod types; pub use alloy::{ consensus as alloy_consensus, consensus::Transaction, + eips::eip7702::SignedAuthorization, primitives as alloy_primitives, primitives::{Address, B256, U256}, }; @@ -182,6 +183,9 @@ pub trait TxTrace { /// Get `access_list`. fn access_list(&self) -> AccessList; + /// Get `authorization_list`. + fn authorization_list(&self) -> Vec; + /// Get `signature`. fn signature(&self) -> Result; @@ -190,6 +194,12 @@ pub trait TxTrace { self.ty() == 0x7e } + /// Get `fee_token_id`. + fn fee_token_id(&self) -> u16; + + /// Get `fee_limit`. + fn fee_limit(&self) -> U256; + /// Try to build a typed transaction fn try_build_typed_tx(&self) -> Result { let chain_id = self.chain_id(); @@ -237,6 +247,22 @@ pub trait TxTrace { TypedTransaction::Enveloped(TxEnvelope::from(tx.into_signed(self.signature()?))) } + 0x04 => { + let tx = TxEip7702 { + chain_id, + nonce: self.nonce(), + gas_limit: self.gas_limit(), + max_fee_per_gas: self.max_fee_per_gas(), + max_priority_fee_per_gas: self.max_priority_fee_per_gas(), + to: self.to(), + value: self.value(), + access_list: self.access_list(), + authorization_list: self.authorization_list(), + input: self.data(), + }; + + TypedTransaction::Enveloped(TxEnvelope::from(tx.into_signed(self.signature()?))) + } 0x7e => { let tx = TxL1Msg { tx_hash: self.tx_hash(), @@ -250,9 +276,25 @@ pub trait TxTrace { TypedTransaction::L1Msg(tx) } + 0x7f => { + let tx = TxAltFee { + chain_id, + nonce: self.nonce(), + gas_limit: self.gas_limit(), + max_fee_per_gas: self.max_fee_per_gas(), + max_priority_fee_per_gas: self.max_priority_fee_per_gas(), + to: self.to(), + value: self.value(), + access_list: self.access_list(), + input: self.data(), + fee_token_id: self.fee_token_id(), + fee_limit: self.fee_limit(), + }; + println!("tx.self.fee_token_id: {:?}", self.fee_token_id()); + TypedTransaction::AltFee(tx.into_signed(self.signature()?)) + } _ => unimplemented!("unsupported tx type: {}", self.ty()), }; - Ok(tx) } } @@ -374,7 +416,19 @@ impl TxTrace for &T { (*self).access_list() } + fn authorization_list(&self) -> Vec { + (*self).authorization_list() + } + fn signature(&self) -> Result { (*self).signature() } + + fn fee_token_id(&self) -> u16 { + (*self).fee_token_id() + } + + fn fee_limit(&self) -> U256 { + (*self).fee_limit() + } } diff --git a/prover/crates/primitives/src/types/authorization_list.rs b/prover/crates/primitives/src/types/authorization_list.rs new file mode 100644 index 000000000..15f1e04c9 --- /dev/null +++ b/prover/crates/primitives/src/types/authorization_list.rs @@ -0,0 +1,130 @@ +use alloy::{ + eips::eip7702::SignedAuthorization, + primitives::{Address, Signature, U256, U8}, +}; +use serde::{Deserialize, Deserializer, Serialize, Serializer}; + +/// A wrapper around SignedAuthorization that implements Archive trait +#[derive( + Clone, Debug, Default, PartialEq, Eq, Hash, rkyv::Archive, rkyv::Serialize, rkyv::Deserialize, +)] +#[archive(check_bytes)] +#[archive_attr(derive(Debug, PartialEq, Eq, Hash))] +pub struct ArchivedSignedAuthorization { + /// The chain ID of the authorization + pub chain_id: U256, + /// The address of the authorization + pub address: Address, + /// The nonce for the authorization + pub nonce: u64, + /// Signature r value + pub r: U256, + /// Signature s value + pub s: U256, + /// Signature v value + pub v: U8, +} + +// Custom serialization for JSON compatibility +impl Serialize for ArchivedSignedAuthorization { + fn serialize(&self, serializer: S) -> Result + where + S: Serializer, + { + use serde::ser::SerializeStruct; + let mut state = serializer.serialize_struct("ArchivedSignedAuthorization", 6)?; + state.serialize_field("chainId", &self.chain_id)?; + state.serialize_field("address", &self.address)?; + state.serialize_field("nonce", &self.nonce)?; + state.serialize_field("r", &self.r)?; + state.serialize_field("s", &self.s)?; + state.serialize_field("yParity", &self.v)?; + state.end() + } +} + +// Custom deserialization for JSON compatibility +impl<'de> Deserialize<'de> for ArchivedSignedAuthorization { + fn deserialize(deserializer: D) -> Result + where + D: Deserializer<'de>, + { + #[derive(Deserialize)] + struct ArchivedSignedAuthorizationHelper { + #[serde(rename = "chainId")] + chain_id: U256, + address: Address, + nonce: u64, + r: U256, + s: U256, + #[serde(rename = "yParity")] + y_parity: U8, + } + + let helper = ArchivedSignedAuthorizationHelper::deserialize(deserializer)?; + Ok(ArchivedSignedAuthorization { + chain_id: helper.chain_id, + address: helper.address, + nonce: helper.nonce, + r: helper.r, + s: helper.s, + v: helper.y_parity, + }) + } +} + +impl From for ArchivedSignedAuthorization { + fn from(auth: SignedAuthorization) -> Self { + let (inner, signature) = auth.into_parts(); + Self { + chain_id: inner.chain_id, + address: inner.address, + nonce: inner.nonce, + r: signature.r(), + s: signature.s(), + v: U8::from(signature.v().y_parity_byte()), + } + } +} + +impl From for SignedAuthorization { + fn from(auth: ArchivedSignedAuthorization) -> Self { + use alloy::eips::eip7702::Authorization; + let inner = + Authorization { chain_id: auth.chain_id, address: auth.address, nonce: auth.nonce }; + let v: u8 = auth.v.to(); + let parity = alloy::primitives::Parity::try_from(v as u64).unwrap(); + let signature = Signature::from_rs_and_parity(auth.r, auth.s, parity).unwrap(); + inner.into_signed(signature) + } +} + +/// A wrapper around Vec that implements Archive trait +#[derive( + Clone, + Debug, + Default, + PartialEq, + Eq, + Hash, + rkyv::Archive, + rkyv::Serialize, + rkyv::Deserialize, + Serialize, + Deserialize, +)] +#[archive(check_bytes)] +#[archive_attr(derive(Debug, PartialEq, Eq, Hash))] +pub struct AuthorizationList(pub Vec); + +impl From> for AuthorizationList { + fn from(auths: Vec) -> Self { + Self(auths.into_iter().map(ArchivedSignedAuthorization::from).collect()) + } +} + +impl From for Vec { + fn from(auths: AuthorizationList) -> Self { + auths.0.into_iter().map(SignedAuthorization::from).collect() + } +} diff --git a/prover/crates/primitives/src/types/mod.rs b/prover/crates/primitives/src/types/mod.rs index 156c40cc3..d88af7dd0 100644 --- a/prover/crates/primitives/src/types/mod.rs +++ b/prover/crates/primitives/src/types/mod.rs @@ -4,15 +4,27 @@ use serde::{Deserialize, Serialize}; use serde_with::{serde_as, Map}; use zktrie::ZkTrieNode; +mod authorization_list; mod tx; +/// Alternative fee transaction types +pub mod tx_alt_fee; +pub use authorization_list::{ArchivedSignedAuthorization, AuthorizationList}; pub use tx::{ArchivedTransactionTrace, TransactionTrace, TxL1Msg, TypedTransaction}; /// Block header #[derive( - rkyv::Archive, rkyv::Serialize, rkyv::Deserialize, Serialize, Deserialize, Default, Debug, Clone, + rkyv::Archive, + rkyv::Serialize, + rkyv::Deserialize, + Serialize, + Deserialize, + Default, + Debug, + Clone, + Hash, )] #[archive(check_bytes)] -#[archive_attr(derive(Debug, Hash, PartialEq, Eq))] +#[archive_attr(derive(Debug, PartialEq, Eq, Hash))] struct BlockHeader { /// block number number: U256, @@ -35,10 +47,18 @@ struct BlockHeader { /// Coinbase #[derive( - rkyv::Archive, rkyv::Serialize, rkyv::Deserialize, Serialize, Deserialize, Default, Debug, Clone, + rkyv::Archive, + rkyv::Serialize, + rkyv::Deserialize, + Serialize, + Deserialize, + Default, + Debug, + Clone, + Hash, )] #[archive(check_bytes)] -#[archive_attr(derive(Debug, Hash, PartialEq, Eq))] +#[archive_attr(derive(Debug, PartialEq, Eq, Hash))] struct Coinbase { /// address of coinbase address: Address, @@ -46,10 +66,18 @@ struct Coinbase { /// Bytecode trace #[derive( - rkyv::Archive, rkyv::Serialize, rkyv::Deserialize, Serialize, Deserialize, Default, Debug, Clone, + rkyv::Archive, + rkyv::Serialize, + rkyv::Deserialize, + Serialize, + Deserialize, + Default, + Debug, + Clone, + Hash, )] #[archive(check_bytes)] -#[archive_attr(derive(Debug, Hash, PartialEq, Eq))] +#[archive_attr(derive(Debug, PartialEq, Eq, Hash))] struct BytecodeTrace { /// bytecode code: Bytes, @@ -68,9 +96,10 @@ struct BytecodeTrace { Clone, Eq, PartialEq, + Hash, )] #[archive(check_bytes)] -#[archive_attr(derive(Debug, Hash, PartialEq, Eq))] +#[archive_attr(derive(Debug, PartialEq, Eq, Hash))] pub struct StorageTrace { /// root before #[serde(rename = "rootBefore")] diff --git a/prover/crates/primitives/src/types/tx.rs b/prover/crates/primitives/src/types/tx.rs index 69f7c8f1e..8790efaaa 100644 --- a/prover/crates/primitives/src/types/tx.rs +++ b/prover/crates/primitives/src/types/tx.rs @@ -1,6 +1,9 @@ -use crate::TxTrace; +use crate::{ + types::{tx_alt_fee::TxAltFee, AuthorizationList}, + TxTrace, +}; use alloy::{ - consensus::{Transaction, TxEnvelope, TxType}, + consensus::{Signed, Transaction, TxEnvelope, TxType}, eips::{ eip2718::{Decodable2718, Encodable2718}, eip2930::AccessList, @@ -20,6 +23,8 @@ pub enum TypedTransaction { Enveloped(TxEnvelope), /// Layer1 Message Transaction L1Msg(TxL1Msg), + /// Alt Fee Transaction + AltFee(Signed), } /// Layer1 Message Transaction @@ -105,6 +110,17 @@ pub struct TransactionTrace { #[serde(rename = "accessList")] #[serde_as(as = "DefaultOnNull")] pub(crate) access_list: AccessList, + /// authorization list + #[serde(rename = "authorizationList")] + #[serde(default)] + #[serde_as(as = "DefaultOnNull")] + pub(crate) authorization_list: AuthorizationList, + /// For AltFeeType + #[serde(rename = "feeTokenID")] + pub(crate) fee_token_id: Option, + /// For AltFeeType + #[serde(rename = "feeLimit")] + pub(crate) fee_limit: Option, /// signature v pub(crate) v: U64, /// signature r @@ -171,9 +187,21 @@ impl TxTrace for TransactionTrace { self.access_list.clone() } + fn authorization_list(&self) -> Vec { + self.authorization_list.clone().into() + } + fn signature(&self) -> Result { Signature::from_rs_and_parity(self.r, self.s, self.v) } + + fn fee_token_id(&self) -> u16 { + self.fee_token_id.unwrap_or_default() + } + + fn fee_limit(&self) -> U256 { + self.fee_limit.unwrap_or_default().to() + } } impl TxTrace for ArchivedTransactionTrace { @@ -235,9 +263,26 @@ impl TxTrace for ArchivedTransactionTrace { .unwrap() } + fn authorization_list(&self) -> Vec { + rkyv::Deserialize::::deserialize( + &self.authorization_list, + &mut rkyv::Infallible, + ) + .unwrap() + .into() + } + fn signature(&self) -> Result { Signature::from_rs_and_parity(self.r, self.s, self.v) } + + fn fee_token_id(&self) -> u16 { + self.fee_token_id.unwrap_or(0) + } + + fn fee_limit(&self) -> U256 { + self.fee_limit.unwrap_or(U256::default()) + } } impl Transaction for TypedTransaction { @@ -245,6 +290,7 @@ impl Transaction for TypedTransaction { match self { TypedTransaction::Enveloped(tx) => tx.chain_id(), TypedTransaction::L1Msg(tx) => tx.chain_id(), + TypedTransaction::AltFee(tx) => Some(tx.tx().chain_id), } } @@ -252,6 +298,7 @@ impl Transaction for TypedTransaction { match self { TypedTransaction::Enveloped(tx) => tx.nonce(), TypedTransaction::L1Msg(tx) => tx.nonce(), + TypedTransaction::AltFee(tx) => tx.tx().nonce(), } } @@ -259,6 +306,7 @@ impl Transaction for TypedTransaction { match self { TypedTransaction::Enveloped(tx) => tx.gas_limit(), TypedTransaction::L1Msg(tx) => tx.gas_limit(), + TypedTransaction::AltFee(tx) => tx.tx().gas_limit(), } } @@ -266,6 +314,7 @@ impl Transaction for TypedTransaction { match self { TypedTransaction::Enveloped(tx) => tx.gas_price(), TypedTransaction::L1Msg(tx) => tx.gas_price(), + TypedTransaction::AltFee(tx) => tx.tx().gas_price(), } } @@ -273,6 +322,7 @@ impl Transaction for TypedTransaction { match self { TypedTransaction::Enveloped(tx) => tx.max_fee_per_gas(), TypedTransaction::L1Msg(tx) => tx.max_fee_per_gas(), + TypedTransaction::AltFee(tx) => tx.tx().max_fee_per_gas(), } } @@ -280,6 +330,7 @@ impl Transaction for TypedTransaction { match self { TypedTransaction::Enveloped(tx) => tx.max_priority_fee_per_gas(), TypedTransaction::L1Msg(tx) => tx.max_priority_fee_per_gas(), + TypedTransaction::AltFee(tx) => tx.tx().max_priority_fee_per_gas(), } } @@ -287,6 +338,7 @@ impl Transaction for TypedTransaction { match self { TypedTransaction::Enveloped(tx) => tx.max_fee_per_blob_gas(), TypedTransaction::L1Msg(tx) => tx.max_fee_per_blob_gas(), + TypedTransaction::AltFee(tx) => tx.tx().max_fee_per_blob_gas(), } } @@ -294,6 +346,7 @@ impl Transaction for TypedTransaction { match self { TypedTransaction::Enveloped(tx) => tx.priority_fee_or_price(), TypedTransaction::L1Msg(tx) => tx.priority_fee_or_price(), + TypedTransaction::AltFee(tx) => tx.tx().priority_fee_or_price(), } } @@ -301,6 +354,7 @@ impl Transaction for TypedTransaction { match self { TypedTransaction::Enveloped(tx) => tx.to(), TypedTransaction::L1Msg(tx) => tx.to(), + TypedTransaction::AltFee(tx) => tx.tx().to(), } } @@ -308,6 +362,7 @@ impl Transaction for TypedTransaction { match self { TypedTransaction::Enveloped(tx) => tx.value(), TypedTransaction::L1Msg(tx) => tx.value(), + TypedTransaction::AltFee(tx) => tx.tx().value(), } } @@ -315,6 +370,7 @@ impl Transaction for TypedTransaction { match self { TypedTransaction::Enveloped(tx) => tx.input(), TypedTransaction::L1Msg(tx) => tx.input(), + TypedTransaction::AltFee(tx) => tx.tx().input(), } } @@ -322,6 +378,7 @@ impl Transaction for TypedTransaction { match self { TypedTransaction::Enveloped(tx) => tx.ty(), TypedTransaction::L1Msg(tx) => tx.ty(), + TypedTransaction::AltFee(tx) => tx.tx().ty(), } } @@ -329,6 +386,7 @@ impl Transaction for TypedTransaction { match self { TypedTransaction::Enveloped(tx) => tx.access_list(), TypedTransaction::L1Msg(tx) => tx.access_list(), + TypedTransaction::AltFee(tx) => tx.tx().access_list(), } } @@ -336,13 +394,15 @@ impl Transaction for TypedTransaction { match self { TypedTransaction::Enveloped(tx) => tx.blob_versioned_hashes(), TypedTransaction::L1Msg(tx) => tx.blob_versioned_hashes(), + TypedTransaction::AltFee(tx) => tx.tx().blob_versioned_hashes(), } } fn authorization_list(&self) -> Option<&[SignedAuthorization]> { match self { TypedTransaction::Enveloped(tx) => tx.authorization_list(), - TypedTransaction::L1Msg(tx) => tx.authorization_list(), + TypedTransaction::L1Msg(_) => None, + TypedTransaction::AltFee(_) => None, } } } @@ -459,6 +519,7 @@ impl TypedTransaction { match self { TypedTransaction::Enveloped(tx) => tx.tx_hash(), TypedTransaction::L1Msg(tx) => &tx.tx_hash, + TypedTransaction::AltFee(tx) => tx.hash(), } } @@ -469,6 +530,7 @@ impl TypedTransaction { match self { TypedTransaction::Enveloped(tx) => tx.recover_signer(), TypedTransaction::L1Msg(tx) => Ok(tx.from), + TypedTransaction::AltFee(tx) => tx.recover_signer(), } } @@ -479,6 +541,14 @@ impl TypedTransaction { let priority_fee_per_gas = tx.tx().effective_tip_per_gas(base_fee_per_gas)?; Some(priority_fee_per_gas + base_fee_per_gas as u128) } + TypedTransaction::Enveloped(TxEnvelope::Eip7702(ref tx)) => { + let priority_fee_per_gas = tx.tx().effective_tip_per_gas(base_fee_per_gas)?; + Some(priority_fee_per_gas + base_fee_per_gas as u128) + } + TypedTransaction::AltFee(tx) => { + let priority_fee_per_gas = tx.tx().effective_tip_per_gas(base_fee_per_gas)?; + Some(priority_fee_per_gas + base_fee_per_gas as u128) + } _ => self.gas_price(), } } @@ -490,6 +560,7 @@ impl TypedTransaction { match self { TypedTransaction::Enveloped(tx) => tx.encode_2718(&mut bytes), TypedTransaction::L1Msg(tx) => tx.encode_2718(&mut bytes), + TypedTransaction::AltFee(tx) => tx.tx().encode_2718(tx.signature(), &mut bytes), } Bytes(bytes.freeze()) } @@ -499,6 +570,7 @@ impl TypedTransaction { match self { TypedTransaction::Enveloped(tx) => tx.signature_hash(), TypedTransaction::L1Msg(_) => keccak256(self.rlp()), + TypedTransaction::AltFee(tx) => tx.signature_hash(), } } @@ -509,9 +581,11 @@ impl TypedTransaction { TxType::Legacy => tx.as_legacy().unwrap().tx().input.clone(), TxType::Eip1559 => tx.as_eip1559().unwrap().tx().input.clone(), TxType::Eip2930 => tx.as_eip2930().unwrap().tx().input.clone(), + TxType::Eip7702 => tx.as_eip7702().unwrap().tx().input.clone(), _ => unimplemented!("unsupported tx type {:?}", tx.tx_type()), }, TypedTransaction::L1Msg(tx) => tx.input.clone(), + TypedTransaction::AltFee(tx) => tx.tx().input.clone(), } } @@ -519,6 +593,24 @@ impl TypedTransaction { pub fn is_l1_msg(&self) -> bool { matches!(self, TypedTransaction::L1Msg(_)) } + + /// Returns the fee token ID if this is an AltFee transaction, otherwise None. + pub fn fee_token_id(&self) -> Option { + match self { + TypedTransaction::Enveloped(_) => None, + TypedTransaction::L1Msg(_) => None, + TypedTransaction::AltFee(tx) => Some(tx.tx().fee_token_id), + } + } + + /// Returns the fee limit if this is an AltFee transaction, otherwise None. + pub fn fee_limit(&self) -> Option { + match self { + TypedTransaction::Enveloped(_) => None, + TypedTransaction::L1Msg(_) => None, + TypedTransaction::AltFee(tx) => Some(tx.tx().fee_limit), + } + } } /// Get a TypedTransaction directly from a rlp encoded byte stream @@ -527,23 +619,15 @@ impl Decodable for TypedTransaction { if buf.is_empty() { return Err(alloy::rlp::Error::InputTooShort); } - Ok(TypedTransaction::Enveloped(TxEnvelope::decode_2718(buf).unwrap())) - } -} - -#[cfg(test)] -mod tests { - use super::*; - - const TRACE: &str = include_str!("../../../../testdata/dev.json"); - - #[test] - fn test_transaction_trace_deserialize() { - let trace = serde_json::from_str::(TRACE).unwrap()["result"].clone(); - let txs = trace["transactions"].clone(); - for tx in txs.as_array().unwrap() { - let tx: TransactionTrace = serde_json::from_value(tx.clone()).unwrap(); - let _ = tx.try_build_typed_tx().unwrap(); - } + let tx_type = *buf.first().unwrap_or(&0u8); + match tx_type { + 0x7f => { + return Ok(TypedTransaction::AltFee( + TxAltFee::decode_signed_fields(&mut &buf[1..]) + .map_err(|_| alloy::rlp::Error::Custom("decode TxAltFee error"))?, + )) + } + _ => return Ok(TypedTransaction::Enveloped(TxEnvelope::decode_2718(buf).unwrap())), + }; } } diff --git a/prover/crates/primitives/src/types/tx_alt_fee.rs b/prover/crates/primitives/src/types/tx_alt_fee.rs new file mode 100644 index 000000000..8c8f2df46 --- /dev/null +++ b/prover/crates/primitives/src/types/tx_alt_fee.rs @@ -0,0 +1,418 @@ +/// Use alt token for tx fee. +use alloy::{ + consensus::{EncodableSignature, SignableTransaction, Signed, Transaction}, + eips::{eip2718::Encodable2718, eip2930::AccessList, eip7702::SignedAuthorization}, + primitives::{keccak256, Bytes, ChainId, Signature, TxKind, B256, U256}, + rlp::{BufMut, Decodable, Encodable, Header}, +}; +use core::mem; +use serde_with::serde_as; + +// #[cfg(not(feature = "std"))] +// use alloc::vec::Vec; + +/// TxAltFee +#[derive(Clone, Debug, Default, PartialEq, Eq, serde::Serialize, serde::Deserialize, Hash)] +#[serde_as] +pub struct TxAltFee { + /// EIP-155: Simple replay attack protection + pub chain_id: ChainId, + /// A scalar value equal to the number of transactions sent by the sender; formally Tn. + pub nonce: u64, + /// A scalar value equal to the maximum + /// amount of gas that should be used in executing + /// this transaction. This is paid up-front, before any + /// computation is done and may not be increased + /// later; formally Tg. + pub gas_limit: u128, + /// A scalar value equal to the maximum + /// amount of gas that should be used in executing + /// this transaction. This is paid up-front, before any + /// computation is done and may not be increased + /// later; formally Tg. + /// + /// As ethereum circulation is around 120mil eth as of 2022 that is around + /// 120000000000000000000000000 wei we are safe to use u128 as its max number is: + /// 340282366920938463463374607431768211455 + /// + /// This is also known as `GasFeeCap` + pub max_fee_per_gas: u128, + /// Max Priority fee that transaction is paying + /// + /// As ethereum circulation is around 120mil eth as of 2022 that is around + /// 120000000000000000000000000 wei we are safe to use u128 as its max number is: + /// 340282366920938463463374607431768211455 + /// + /// This is also known as `GasTipCap` + pub max_priority_fee_per_gas: u128, + /// The 160-bit address of the message call’s recipient or, for a contract creation + /// transaction, ∅, used here to denote the only member of B0 ; formally Tt. + pub to: TxKind, + /// A scalar value equal to the number of Wei to + /// be transferred to the message call’s recipient or, + /// in the case of contract creation, as an endowment + /// to the newly created account; formally Tv. + pub value: U256, + /// The accessList specifies a list of addresses and storage keys; + /// these addresses and storage keys are added into the `accessed_addresses` + /// and `accessed_storage_keys` global sets (introduced in EIP-2929). + /// A gas cost is charged, though at a discount relative to the cost of + /// accessing outside the list. + pub access_list: AccessList, + /// Input has two uses depending if transaction is Create or Call (if `to` field is None or + /// Some). pub init: An unlimited size byte array specifying the + /// EVM-code for the account initialisation procedure CREATE, + /// data: An unlimited size byte array specifying the + /// input data of the message call, formally Td. + pub input: Bytes, + /// For AltFeeType + pub fee_token_id: u16, + /// For AltFeeType + pub fee_limit: U256, +} + +impl TxAltFee { + /// Returns the effective gas price for the given `base_fee`. + pub const fn effective_gas_price(&self, base_fee: Option) -> u128 { + match base_fee { + None => self.max_fee_per_gas, + Some(base_fee) => { + // if the tip is greater than the max priority fee per gas, set it to the max + // priority fee per gas + base fee + let tip = self.max_fee_per_gas.saturating_sub(base_fee as u128); + if tip > self.max_priority_fee_per_gas { + self.max_priority_fee_per_gas + base_fee as u128 + } else { + // otherwise return the max fee per gas + self.max_fee_per_gas + } + } + } + } + + /// Decodes the inner [TxEip1559] fields from RLP bytes. + /// + /// NOTE: This assumes a RLP header has already been decoded, and _just_ decodes the following + /// RLP fields in the following order: + /// + /// - `chain_id` + /// - `nonce` + /// - `max_priority_fee_per_gas` + /// - `max_fee_per_gas` + /// - `gas_limit` + /// - `to` + /// - `value` + /// - `data` (`input`) + /// - `access_list` + /// - `fee_token_id` + /// - `fee_limit` + pub fn decode_fields(buf: &mut &[u8]) -> alloy::rlp::Result { + Ok(Self { + chain_id: Decodable::decode(buf)?, + nonce: Decodable::decode(buf)?, + max_priority_fee_per_gas: Decodable::decode(buf)?, + max_fee_per_gas: Decodable::decode(buf)?, + gas_limit: Decodable::decode(buf)?, + to: Decodable::decode(buf)?, + value: Decodable::decode(buf)?, + input: Decodable::decode(buf)?, + access_list: Decodable::decode(buf)?, + fee_token_id: Decodable::decode(buf)?, + fee_limit: Decodable::decode(buf)?, + }) + } + + /// Outputs the length of the transaction's fields, without a RLP header. + #[doc(hidden)] + pub fn fields_len(&self) -> usize { + let mut len = 0; + len += self.chain_id.length(); + len += self.nonce.length(); + len += self.max_priority_fee_per_gas.length(); + len += self.max_fee_per_gas.length(); + len += self.gas_limit.length(); + len += self.to.length(); + len += self.value.length(); + len += self.input.0.length(); + len += self.access_list.length(); + len += self.fee_token_id.length(); + len += self.fee_limit.length(); + len + } + + /// Encodes only the transaction's fields into the desired buffer, without a RLP header. + pub(crate) fn encode_fields(&self, out: &mut dyn alloy::rlp::BufMut) { + self.chain_id.encode(out); + self.nonce.encode(out); + self.max_priority_fee_per_gas.encode(out); + self.max_fee_per_gas.encode(out); + self.gas_limit.encode(out); + self.to.encode(out); + self.value.encode(out); + self.input.0.encode(out); + self.access_list.encode(out); + self.fee_token_id.encode(out); + self.fee_limit.encode(out); + } + + /// Returns what the encoded length should be, if the transaction were RLP encoded with the + /// given signature, depending on the value of `with_header`. + /// + /// If `with_header` is `true`, the payload length will include the RLP header length. + /// If `with_header` is `false`, the payload length will not include the RLP header length. + pub fn encoded_len_with_signature(&self, signature: &S, with_header: bool) -> usize + where + S: EncodableSignature, + { + // this counts the tx fields and signature fields + let payload_length = self.fields_len() + signature.rlp_vrs_len(); + + // this counts: + // * tx type byte + // * inner header length + // * inner payload length + let inner_payload_length = + 1 + Header { list: true, payload_length }.length() + payload_length; + + if with_header { + // header length plus length of the above, wrapped with a string header + Header { list: false, payload_length: inner_payload_length }.length() + + inner_payload_length + } else { + inner_payload_length + } + } + + /// Inner encoding function that is used for both rlp [`Encodable`] trait and for calculating + /// hash that for eip2718 does not require a rlp header. + #[doc(hidden)] + pub fn encode_with_signature(&self, signature: &S, out: &mut dyn BufMut, with_header: bool) + where + S: EncodableSignature, + { + let payload_length = self.fields_len() + signature.rlp_vrs_len(); + if with_header { + Header { + list: false, + payload_length: 1 + Header { list: true, payload_length }.length() + payload_length, + } + .encode(out); + } + out.put_u8(self.tx_type() as u8); + self.encode_with_signature_fields(signature, out); + } + + /// Encodes the transaction according to EIP-2718, without a header. + pub fn encode_2718(&self, signature: &S, out: &mut dyn BufMut) + where + S: EncodableSignature, + { + self.encode_with_signature(signature, out, false); + } + + /// Decodes the transaction from RLP bytes, including the signature. + /// + /// This __does not__ expect the bytes to start with a transaction type byte or string + /// header. + /// + /// This __does__ expect the bytes to start with a list header and include a signature. + #[doc(hidden)] + pub fn decode_signed_fields(buf: &mut &[u8]) -> alloy::rlp::Result> { + let header = Header::decode(buf)?; + if !header.list { + return Err(alloy::rlp::Error::UnexpectedString); + } + + // record original length so we can check encoding + let original_len = buf.len(); + + let tx = Self::decode_fields(buf)?; + let signature = Signature::decode_rlp_vrs(buf)?; + + let signed = tx.into_signed(signature); + if buf.len() + header.payload_length != original_len { + return Err(alloy::rlp::Error::ListLengthMismatch { + expected: header.payload_length, + got: original_len - buf.len(), + }); + } + + Ok(signed) + } + + /// Encodes the transaction from RLP bytes, including the signature. This __does not__ encode a + /// tx type byte or string header. + /// + /// This __does__ encode a list header and include a signature. + pub fn encode_with_signature_fields(&self, signature: &S, out: &mut dyn BufMut) + where + S: EncodableSignature, + { + let payload_length = self.fields_len() + signature.rlp_vrs_len(); + let header = Header { list: true, payload_length }; + header.encode(out); + self.encode_fields(out); + signature.write_rlp_vrs(out); + } + + /// Get transaction type + #[doc(alias = "transaction_type")] + pub(crate) const fn tx_type(&self) -> u8 { + 0x7f + } + + /// Calculates a heuristic for the in-memory size of the [TxEip1559] transaction. + #[inline] + pub fn size(&self) -> usize { + mem::size_of::() + // chain_id + mem::size_of::() + // nonce + mem::size_of::() + // gas_limit + mem::size_of::() + // max_fee_per_gas + mem::size_of::() + // max_priority_fee_per_gas + self.to.size() + // to + mem::size_of::() + // value + self.access_list.size() + // access_list + self.input.len() + // input + mem::size_of::()+ // fee_token_id + mem::size_of::() // fee_limit + } +} + +impl Transaction for TxAltFee { + fn chain_id(&self) -> Option { + Some(self.chain_id) + } + + fn nonce(&self) -> u64 { + self.nonce + } + + fn gas_limit(&self) -> u128 { + self.gas_limit + } + + fn gas_price(&self) -> Option { + None + } + + fn max_fee_per_gas(&self) -> u128 { + self.max_fee_per_gas + } + + fn max_priority_fee_per_gas(&self) -> Option { + Some(self.max_priority_fee_per_gas) + } + + fn priority_fee_or_price(&self) -> u128 { + self.max_priority_fee_per_gas + } + + fn max_fee_per_blob_gas(&self) -> Option { + None + } + + fn to(&self) -> TxKind { + self.to + } + + fn value(&self) -> U256 { + self.value + } + + fn input(&self) -> &[u8] { + &self.input + } + + fn ty(&self) -> u8 { + 0x7f + } + + fn access_list(&self) -> Option<&AccessList> { + Some(&self.access_list) + } + + fn blob_versioned_hashes(&self) -> Option<&[B256]> { + None + } + + fn authorization_list(&self) -> Option<&[SignedAuthorization]> { + None + } + // fn fee_token_id(&self) -> u16 { + // 0x7f + // } + // fn fee_limit(&self) -> u64 { + // 0x7f + // } +} + +impl Encodable2718 for TxAltFee { + fn type_flag(&self) -> Option { + Some(0x7f) + } + + fn encode_2718_len(&self) -> usize { + let payload_length = self.fields_len(); + 1 + Header { list: true, payload_length }.length() + payload_length + } + + fn encode_2718(&self, out: &mut dyn BufMut) { + 0x7fu8.encode(out); + let header = Header { list: true, payload_length: self.fields_len() }; + header.encode(out); + self.encode(out) + } +} + +impl SignableTransaction for TxAltFee { + fn set_chain_id(&mut self, chain_id: ChainId) { + self.chain_id = chain_id; + } + + fn encode_for_signing(&self, out: &mut dyn alloy::rlp::BufMut) { + out.put_u8(self.tx_type() as u8); + self.encode(out) + } + + fn payload_len_for_signature(&self) -> usize { + self.length() + 1 + } + + fn into_signed(self, signature: Signature) -> Signed { + // Drop any v chain id value to ensure the signature format is correct at the time of + // combination for an EIP-1559 transaction. V should indicate the y-parity of the + // signature. + let signature = signature.with_parity_bool(); + + let mut buf = Vec::with_capacity(self.encoded_len_with_signature(&signature, false)); + self.encode_with_signature(&signature, &mut buf, false); + let hash = keccak256(&buf); + + Signed::new_unchecked(self, signature, hash) + } +} + +impl Encodable for TxAltFee { + fn encode(&self, out: &mut dyn BufMut) { + Header { list: true, payload_length: self.fields_len() }.encode(out); + self.encode_fields(out); + } + + fn length(&self) -> usize { + let payload_length = self.fields_len(); + Header { list: true, payload_length }.length() + payload_length + } +} + +impl Decodable for TxAltFee { + fn decode(data: &mut &[u8]) -> alloy::rlp::Result { + let header = Header::decode(data)?; + let remaining_len = data.len(); + + if header.payload_length > remaining_len { + return Err(alloy::rlp::Error::InputTooShort); + } + + Self::decode_fields(data) + } +} diff --git a/prover/crates/utils/src/macros.rs b/prover/crates/utils/src/macros.rs index 77ad3cf08..1bc91c699 100644 --- a/prover/crates/utils/src/macros.rs +++ b/prover/crates/utils/src/macros.rs @@ -41,7 +41,7 @@ macro_rules! dev_trace { ($($arg:tt)*) => { #[cfg(any(feature = "dev", test))] { - $crate::tracing::trace!($($arg)*); + // $crate::tracing::trace!($($arg)*); } }; } @@ -52,7 +52,7 @@ macro_rules! dev_info { ($($arg:tt)*) => { #[cfg(any(feature = "dev", test))] { - $crate::tracing::info!($($arg)*); + // $crate::tracing::info!($($arg)*); } }; } @@ -63,7 +63,7 @@ macro_rules! dev_error { ($($arg:tt)*) => { #[cfg(any(feature = "dev", test))] { - $crate::tracing::error!($($arg)*); + // $crate::tracing::error!($($arg)*); } }; } @@ -74,7 +74,7 @@ macro_rules! dev_debug { ($($arg:tt)*) => { #[cfg(any(feature = "dev", test))] { - $crate::tracing::debug!($($arg)*); + // $crate::tracing::debug!($($arg)*); } }; } @@ -85,7 +85,7 @@ macro_rules! dev_warn { ($($arg:tt)*) => { #[cfg(any(feature = "dev", test))] { - $crate::tracing::warn!($($arg)*); + // $crate::tracing::warn!($($arg)*); } }; } diff --git a/prover/testdata/altfeetx/block_traces_329475_329475.json b/prover/testdata/altfeetx/block_traces_329475_329475.json new file mode 100644 index 000000000..45b533995 --- /dev/null +++ b/prover/testdata/altfeetx/block_traces_329475_329475.json @@ -0,0 +1,597 @@ +[ + [ + { + "chainID": 53077, + "version": "2.0.8-mainnet-49fa27bc", + "coinbase": { + "address": "0x716170d0687c3d31cc10debe0daa1ddd3fe3d792", + "nonce": 0, + "balance": "0x1fbed38436f9c721", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + "header": { + "parentHash": "0xeb88562c2529b518bdb8c6d7d943ef9d6da18c97e008c9a731bd2a62b7f220ca", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "miner": "0x0000000000000000000000000000000000000000", + "stateRoot": "0x0c4936b3e6430e339137e2e9086f1cab780703f1fdf32a874b595f442e5f122a", + "transactionsRoot": "0xb121eaea9863c31c77cd8f12a8e0b6142c8ad6345463ff327fa132344c9a0dc3", + "receiptsRoot": "0xea7da874fa7b81092a6cd3cf76c5555885550fc825537a8371d5c43d4376fe48", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000100000000000000000400000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000010000000000000000000000080000000000000000000008000000000000000000000000000000000000000000000000000000002004000000000000000000000000000000000000002000000000000000000000000000000000000000000004000000000000000080000000000000000000000000000000000000000000000000000000000", + "difficulty": "0x0", + "number": "0x50703", + "gasLimit": "0x3b9aca00", + "gasUsed": "0x5208", + "timestamp": "0x692fe15c", + "extraData": "0x", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x0000000000000000", + "nextL1MsgIndex": "0xe", + "batchHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "baseFeePerGas": "0xf4240", + "withdrawalsRoot": null, + "blobGasUsed": null, + "excessBlobGas": null, + "parentBeaconBlockRoot": null, + "requestsHash": null, + "hash": "0xabc53e6a4b8118148181b958a9a6e0dc4262c16e1bdfea59bac6f479c9630958" + }, + "transactions": [ + { + "type": 127, + "nonce": 1062, + "txHash": "0x6e0d39ed1c8e7ff77f883279f08ef9b96224052a78b837e197eb08b1338491c9", + "gas": 25000, + "gasPrice": "0x77359400", + "gasTipCap": "0x3b9aca00", + "gasFeeCap": "0x77359400", + "feeTokenID": 4, + "feeLimit": "0x3b9aca00", + "from": "0xb055051fb2889be5e9831524f1624941299c49bb", + "to": "0x5add06f01e73b75a4184c8cb74485bb0a897b23e", + "chainId": "0xcf55", + "value": "0x38d7ea4c68000", + "data": "0x", + "isCreate": false, + "accessList": [], + "v": "0x0", + "r": "0xa5d9a323f9a799a4bc9314f3d31c22a1dec956b27fcb8bded9131cedfa6ff5d1", + "s": "0xc19b538857b3fb431502ab3c89efcca09c46e78982811c82947cc3423b3f607" + } + ], + "storageTrace": { + "rootBefore": "0x168e9408313b570db45fbc4d2654226378ca8a2d2bc55757785ca22181d0b99d", + "rootAfter": "0x0c4936b3e6430e339137e2e9086f1cab780703f1fdf32a874b595f442e5f122a", + "proofs": { + "0x3c58DBda457360a9B7D9c8713273608bd1Be59af": [ + "0x0922400597ff3c7f13ac0cf7113f4bc53de534ef7684e32b3a7f97f070dda2b18d0f3317c922c86c1ffb67ec6ddf7cdbd138abc6db00a9401797df859ef7f7d159", + "0x0929386fe592e14bf39d9d464223d43f6601a219e4908c458dca6b0375c427b37f25602e21ec4b807c8119faf27e696590e6144ff41164ce80370d64f0743ed5c0", + "0x09038344babd5fb6933aefb9b43437e120955a7bc74f6ad9c4024d2334129037e92c10742d9e097fe0303088a43bd06d632237075d0953129f983944f1fe8da086", + "0x09195c7fe0a901f08cc0fd8490866ae10e18c0a2a5b489fd6044bd241e8c8922301f761055609ff5ed18bdde2208e06bd2f2996755978a495f6dbaf69da56e7ebb", + "0x092518f8d92281a123ca9f8c9a10ffa90bd4166de182aa8c4592176e177d458ebf13a9e659f4b5461810aa1e3af677c79410abf87f02b5b9f7f84789ebf61220e8", + "0x091c6258c6d7113965fa33cf47433176a0ea35c1012a8d1462b4ed521982b67e162811499662824e135821a1dd6b069b64001fb81ac367288642cecbb0278b4606", + "0x072a941db58791cdd82561e2f2360c76f22ca32f9495acc14f4855069f870472681ae74b4b23bb9d25c16438535d2c280b19e036e3511ab5d9639b86d2c040ab42", + "0x091eb22fb420adc799bbfcdacd8f1de56ae423841812b060c39f9b6e107f659f5c06a780c5b07fb945d0da31456c6dadfdb4e9a683572f8783d51fce46fbd49626", + "0x0824960aa2fbb2a00390e6960aa7dfea797699d8ac832a7b21d19924faef25269c0000000000000000000000000000000000000000000000000000000000000000", + "0x062777a1c6882f3662c273c71bf06831768f0c90ab620b8376ee6020b0552d4b931b38eca2e1e5715f412de91311989474ab569bb429f05ae96ae12ae580a7b4c9", + "0x0415332f1e7c756905199e3e1821b812e853569e281f4d7b7d95ed06db34a69870050800000000000000000000000000000000000000000000000007830000000000000001000000000000000000000000000000000000000000000000000000000000000002203cf2b3e1ae988b2d68de7a6f7017a525b0f3b313db4f15cfa98a3537b6198b37156d23eecc5f4dc725b655fd12920b9e594b2d7d707b006b2fc511519f5d0a1108cffae95ace28f77dee674975f9461bd7cc707c45dff3d151f10130f3cd203c58dbda457360a9b7d9c8713273608bd1be59af000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5300000000000000000000000000000000000001": [ + "0x0922400597ff3c7f13ac0cf7113f4bc53de534ef7684e32b3a7f97f070dda2b18d0f3317c922c86c1ffb67ec6ddf7cdbd138abc6db00a9401797df859ef7f7d159", + "0x0929386fe592e14bf39d9d464223d43f6601a219e4908c458dca6b0375c427b37f25602e21ec4b807c8119faf27e696590e6144ff41164ce80370d64f0743ed5c0", + "0x091780bf2685aee4cc20e38cfb209bf5540171232c36f2c4ef8dc6d5ec9eb802aa13a9601efda3832f813a4f776a5763e5f2fed5a83a605ec7aaa57d1350142408", + "0x0913046d9147f6140867c16178302bb84d525e9243a28319247f9c9956b202f9200e040a41ca00083067eb14b19a451c7cf0e05bf739f6915b0f6177771802f5fe", + "0x092d4100122c3353a8f28526ceefe65940ca36418b1bffe3d5e036966ee005aa4d0706520f354ea98106b866465b383a7ce1e0636f4acc4eff1a6fae792304d3bd", + "0x090f1792f829e49f7ddc4363bfd5fc4b2ff99ba01195a391a871ea32e9645f4ce01bd5260d7cc00ba19d748d026db53b327e40a67896f322045fa37ac50b69ad58", + "0x090917563238627df3e543bfcc691e919d0f39a710c02243ea64bc3c9336b4fd9e24709dd93ba67cb3b801bb52cff7f48c1ac12bdc3e3944e13000e77c8bf3401b", + "0x070d2b94a19d55666528236fda1898bddf7d211baceabad89fd68feecdccb182fb2523f68a7eb14cf3681a3942c3dc9b61386017cecd6b1dfe732de6476eb72709", + "0x082043c0b5184d1bbc876966aa4555fdd464bf213095f59b93c984c65bdd951ff216f335d0dcd917173153fe3b20c1fbc5a3cdda0c00dc1506869c2543afd0002e", + "0x06139a07f81bccd48e6cb20549b10e65fe23136b43668f983aeff62ad0af93adfd0e85fcae64f44e3c2c0f52fec073576309f661dbad22b1bcd1b292bc930262b3", + "0x0427cfcbd2fe87474008e199ef5bff09273803bbf38032c75a36a7726b3c88f8a205080000000000000000000000000000000000000000000000000aec000000000000000000000000000000000000000000000000000000000000000000000000000000001311db297653267f19e944ebc886157711d99c48cdf34eaf9c3e25b5cf4f9b0f44107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f84205300000000000000000000000000000000000001000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x530000000000000000000000000000000000000f": [ + "0x0922400597ff3c7f13ac0cf7113f4bc53de534ef7684e32b3a7f97f070dda2b18d0f3317c922c86c1ffb67ec6ddf7cdbd138abc6db00a9401797df859ef7f7d159", + "0x0929386fe592e14bf39d9d464223d43f6601a219e4908c458dca6b0375c427b37f25602e21ec4b807c8119faf27e696590e6144ff41164ce80370d64f0743ed5c0", + "0x09038344babd5fb6933aefb9b43437e120955a7bc74f6ad9c4024d2334129037e92c10742d9e097fe0303088a43bd06d632237075d0953129f983944f1fe8da086", + "0x09195c7fe0a901f08cc0fd8490866ae10e18c0a2a5b489fd6044bd241e8c8922301f761055609ff5ed18bdde2208e06bd2f2996755978a495f6dbaf69da56e7ebb", + "0x092d49201535bedc99fba584f191470fcc90a1536753b14c14409b638d881802741eb287abf0022dc97801b880a992d612cd3413df725faa59fc9a424a1d82d064", + "0x090bbeb68e19051ecc140fa9c84e136acf6e9097773338272727fe5add195715bf2bee81201efc661b8170dd635aecf86d593e76e5f8e40458107b46bc91a8ab26", + "0x0918feed44ae85fd99c29b4a6853aa09cef2ebff51ea5773aeaca8f5299887ed8810e3c0507354c21e5807881a746fa026b4b8339aab3be465bbe07b6ed0c27425", + "0x070000000000000000000000000000000000000000000000000000000000000000210819a999e16a1f46f3d08219832fb69e6eae2ab67bf749b015abf116278d4c", + "0x060b07422b633f67b3316792d15445d151ecbe8b07ce31264736d04f16f5edb23f0d953d2de9a6664b45242946eebe10693dd610b25dadefdf83222d76e0fd2289", + "0x0418a86f98026d1a55f6fee616f04d51be16c033651ffaafb0514287ec067d04e805080000000000000000000000000000000000000000000000000aec0000000000000000000000000000000000000000000000000000000000000000000000000000000026153e742765d1be8b6d388fe5cddbf9f2dc4450ee7f8ec94272783ce5048d4544107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f8420530000000000000000000000000000000000000f000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5300000000000000000000000000000000000017": [ + "0x0922400597ff3c7f13ac0cf7113f4bc53de534ef7684e32b3a7f97f070dda2b18d0f3317c922c86c1ffb67ec6ddf7cdbd138abc6db00a9401797df859ef7f7d159", + "0x0929386fe592e14bf39d9d464223d43f6601a219e4908c458dca6b0375c427b37f25602e21ec4b807c8119faf27e696590e6144ff41164ce80370d64f0743ed5c0", + "0x09038344babd5fb6933aefb9b43437e120955a7bc74f6ad9c4024d2334129037e92c10742d9e097fe0303088a43bd06d632237075d0953129f983944f1fe8da086", + "0x09195c7fe0a901f08cc0fd8490866ae10e18c0a2a5b489fd6044bd241e8c8922301f761055609ff5ed18bdde2208e06bd2f2996755978a495f6dbaf69da56e7ebb", + "0x092518f8d92281a123ca9f8c9a10ffa90bd4166de182aa8c4592176e177d458ebf13a9e659f4b5461810aa1e3af677c79410abf87f02b5b9f7f84789ebf61220e8", + "0x09252ed76f54141622be19600acca03942b31d6c01cdeca6137fe1b0e809c9eaa1098bc530cf79a832dff7d88ab9dc76d8be264223e36a35d189a819c1154488d8", + "0x0916b4a56bd925d2fbe81635a9384a9dd75cf83e2a444f695a6b96147a5ddb4e082f5dd93317dc453b297377e634c77d346600ba436ce802829e62677b94050743", + "0x0700000000000000000000000000000000000000000000000000000000000000001df893aae2a1745948ca56b3fed605526943240ca1a846347e2c6fa74ed44889", + "0x08240e09303236429698d29fd6ba0e53a71d61dfd7ac740c471702cfc3076d62a50000000000000000000000000000000000000000000000000000000000000000", + "0x070000000000000000000000000000000000000000000000000000000000000000297ba7a8d6fbe07c8cef12ee33e549791f6a3464ccdfccc89fc0b5ad944d8bb3", + "0x08080efc67898a2c931965c27e6d237bd7d26ac9ccc58cad4917d8bb57553071100000000000000000000000000000000000000000000000000000000000000000", + "0x071b2371fa1ee45b8c0c3d5875a2611855bee597806d1270941f182c93c7a7825313340fbcdbc78854c9f2655a9966f73c23e1d92eddd341e0da93e9d6eb2f0de2", + "0x041918c47a133f759975cc95c0dba82051d9b5cd65407e76ef1366a9deaa14f28005080000000000000000000000000000000000000000000000000aec000000000000000000000000000000000000000000000000000000000000000000000000000000001003098d9a6027ade54c3a5208d47a81c8127b06267f74bf963c29f05d11101244107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f84205300000000000000000000000000000000000017000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5300000000000000000000000000000000000021": [ + "0x0922400597ff3c7f13ac0cf7113f4bc53de534ef7684e32b3a7f97f070dda2b18d0f3317c922c86c1ffb67ec6ddf7cdbd138abc6db00a9401797df859ef7f7d159", + "0x0920419accd86858e2513996e144cebf4055af4e123ce989ed65f61980d1ff46ab04104166a24a37201435daa45d2c7d9f21d7d011cb097a685d0eb17a977dcc5f", + "0x092c44196a609d8853e777a45c1992ab9812253405474451f73b2c51d901d2a0e71dc9f3781baf7945495245a207a8b08cd944f2c09a5ea25b072d1dde21b81bff", + "0x0928c916c20b323297a7e36bed1a3c5872ea9d17562fb0a6e444836a924054ebb720bd0beab76f2e4805ecd3a196ac5bd179e31a8346dcbd35fbf2d11891b2585c", + "0x092da65da78b3cff5b695f2bd3c275b7d4358024657d0e14cc3458f5a017c8fa800d442e19937f6010668984415d624c2278ee41b9f85a30690328cf1df209e73a", + "0x0919fb1c690c67d149718ac5e778fd1145868e7b3ad457c76070d6ea77eb4ae47e1ac089a7e7393471f1b8213e391e776867edd4a64f3e2b36668b2d8f7d738989", + "0x07013229378490a4cceba120f9e9899c432da48a4b6b5d809af396868819ac3e492a21e214d065739f78b8680adc4f64e8dd32477820809eac089843040d8f0564", + "0x040883d4562dfe8ba7ad8176bc2844d35ecc486199d589a152eabcee8398f3aebb05080000000000000000000000000000000000000000000000000aec000000000000000000000000000000000000000000000000000000000000000000000000000000000baa6539e83c7dc7c138c3eb3dbe8657130f53f7c72c9c958d611a8c30ab233f44107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f84205300000000000000000000000000000000000021000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5add06F01e73b75A4184C8cb74485bB0A897b23E": [ + "0x0922400597ff3c7f13ac0cf7113f4bc53de534ef7684e32b3a7f97f070dda2b18d0f3317c922c86c1ffb67ec6ddf7cdbd138abc6db00a9401797df859ef7f7d159", + "0x0920419accd86858e2513996e144cebf4055af4e123ce989ed65f61980d1ff46ab04104166a24a37201435daa45d2c7d9f21d7d011cb097a685d0eb17a977dcc5f", + "0x090fb48ca023111d90314fe102d114bcb0891589b2814d7a574fdd6635aa326aba030f83fd46a40d224591afe4ff831180641ad6ac5e472e56a59f432a8a9f6595", + "0x09098a83815f59bfd19570c03d046fea3fa5f4a800583bd2280f7b341a8d6f1bc614c384f7d644b88ae4ffead574dce42fb40f70bf06c48b2f130eefe3c1d352f5", + "0x092969003c85a71dd03e14528ff099d7ee69c318cd7b441337a8f1f1e24c40e48e0ccaadf733376b76eb22ab103f97bd2dffbbd785fa127adf4446b1b59008b8c4", + "0x090a4374681b0d6dc98ef133864972abe6716caeb844f9ee6c722a5af2d84e078e0f01a3d026923d08e42986e47746b499d9d761eb5041d429d20e4b502a230609", + "0x070f48fcbcfe94d9e293618b428a44065dd774c063d8c1caefa5323018ec799d9f2338cfed1f2456b036596fc2003b5e6e2bbaa3d88fbc0d47124a415d2833b445", + "0x0700000000000000000000000000000000000000000000000000000000000000002ad608b5df53d230ab9d3641cbff8ad9afd2c703a9d48a4e61c6e4090532aaad", + "0x091a5c484c6957ab80ee2649b2c863192f52d3adc258f3c1a0b03ca9d6872340a70de2336ed6cc6f7af14d35c543eed899daa6eb26214ee4642e037c0d071fffa9", + "0x06283465243b826f14bb66f7babd9dc61ea472872a89ef8a1e0859667f22971e350d163b641a25ec4aa3bffd18a712fa25c4713652b48f1ef53d20dcf659837921", + "0x041736e2ebcabec708f4ecce38cd9c16a8a1f6ebfa1df67ed285e8e2ef95f2aec10508000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000241f6ff67977cf30000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864205add06f01e73b75a4184c8cb74485bb0a897b23e000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x716170D0687c3d31CC10DebE0dAa1DDD3FE3D792": [ + "0x0922400597ff3c7f13ac0cf7113f4bc53de534ef7684e32b3a7f97f070dda2b18d0f3317c922c86c1ffb67ec6ddf7cdbd138abc6db00a9401797df859ef7f7d159", + "0x0929386fe592e14bf39d9d464223d43f6601a219e4908c458dca6b0375c427b37f25602e21ec4b807c8119faf27e696590e6144ff41164ce80370d64f0743ed5c0", + "0x09038344babd5fb6933aefb9b43437e120955a7bc74f6ad9c4024d2334129037e92c10742d9e097fe0303088a43bd06d632237075d0953129f983944f1fe8da086", + "0x0905c05964386c6ceaa91e691a403b41490ba625ccec420e52d39eb5aef53691a10626513e5342bb37b800f39bd2f6c9d4cd871a3a06d9fad1c0f3401c5be5999b", + "0x0913eff588f55e7c7a2f3fdb66c7e34afeb3eb8c83472b7ea6f3c5e20cfdaf27791fc630a39ae07328b9da3b7c64caa6c767f0805216c0da0947d765edd67d44bd", + "0x090fea719a68a48e9dd333707efbb005a4c81d29707e4eedad5babdbdb10448b080b9f1b4453cf781044af788aaed0ac5bcb88d1a5002ccd640ca657f3d3b8aaec", + "0x092d8cf9858ac296e55a357479747ad048821376d4f043407af9d043dd953dfb0c1b4b75bd86f411a241ba361d15c84e22c02d45ee1838a4327beed5de61454e42", + "0x0700000000000000000000000000000000000000000000000000000000000000000fd55f73d3682f1aa396111dec8471e7ae5a6026e2b3a8d44c3090519de2dbf1", + "0x062da1750dc9f7ebf795aa7f4d9ee6933579283a4242334ff38e298db642ba417222892de62f34759b7e27b1a4997007b7ff66a9e565e3983a39732db3422b4c57", + "0x0414b0bb4090afcdae623b69d996022ea82c221cd1a3c00c5b13acb37d750f87fc0508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fbed38436f9c7210000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420716170d0687c3d31cc10debe0daa1ddd3fe3d792000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xb055051fb2889Be5e9831524f1624941299C49bb": [ + "0x0922400597ff3c7f13ac0cf7113f4bc53de534ef7684e32b3a7f97f070dda2b18d0f3317c922c86c1ffb67ec6ddf7cdbd138abc6db00a9401797df859ef7f7d159", + "0x0929386fe592e14bf39d9d464223d43f6601a219e4908c458dca6b0375c427b37f25602e21ec4b807c8119faf27e696590e6144ff41164ce80370d64f0743ed5c0", + "0x09038344babd5fb6933aefb9b43437e120955a7bc74f6ad9c4024d2334129037e92c10742d9e097fe0303088a43bd06d632237075d0953129f983944f1fe8da086", + "0x09195c7fe0a901f08cc0fd8490866ae10e18c0a2a5b489fd6044bd241e8c8922301f761055609ff5ed18bdde2208e06bd2f2996755978a495f6dbaf69da56e7ebb", + "0x092d49201535bedc99fba584f191470fcc90a1536753b14c14409b638d881802741eb287abf0022dc97801b880a992d612cd3413df725faa59fc9a424a1d82d064", + "0x090bbeb68e19051ecc140fa9c84e136acf6e9097773338272727fe5add195715bf2bee81201efc661b8170dd635aecf86d593e76e5f8e40458107b46bc91a8ab26", + "0x09117d192aeaa6311af3cf6179950c2d4664e3af8dc4fbf41100681584042a35dc23196427e324dc265eb0b772701a0d8b30c701b15a85a210e4ef6bfc011c96ea", + "0x061d741b029db79b9631a6164c03568163e5598506df9846ca6fa2d281f2ce95580774efa3afb6dcac978d1b3856fb5c77e7022c26b61b48a2c66e0a21886ee5e8", + "0x042309c8ab1f3c5435a473ea279640fbd4ebdde9ff680ac6b79971a0d96582fac80508000000000000000000000000000000000000000000000000000000000000000004260000000000000000000000000000000000000000000000006e67db319bc683dc0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420b055051fb2889be5e9831524f1624941299c49bb000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "storageProofs": { + "0x3c58DBda457360a9B7D9c8713273608bd1Be59af": { + "0x2bc0a6c7d79a49c3ae960abc1b08ccd6c0b844abaa810594f68fdefc701b92d6": [ + "0x092f5b1503b2b2ffc4e916a222cd824072ace168646ce82a1ab26ff9b5582062ff0001f5fa8eee97a5f05ec191ee67362d6206b4bcbcca389ef12e3a0a6235b9b9", + "0x092f84cc51764db2ac29d9fa763d293a2318549dd50465819cad60f363f00fe47e0826885024e03b00c3e296dc90fa4f17f12d5787ba3e8300fd4aae4c19eeca02", + "0x0802e80421aaa16895ad35061cc0746da7447bd5e46e2cd5c342286a6c57b7b25e0af121aaf5e97c1a05c3b370ad4b9a371c23754a2a2ec8354e234c828363b30a", + "0x072df0a2b7734173fe5c633d61fed384f4435213f399f9007a240705ca99847b0d02769f4d92a2bae211050ad2ad923b9520039806acf8e24f850daf7260de55ba", + "0x0700000000000000000000000000000000000000000000000000000000000000002f7e69c25f2aaae35521ecf2943e1e0caa66f48b68de7ee452b252cbb1f79695", + "0x0604437bbb94a72bf2299c0be1a56438cf0cc4042cfca77eb3f0b09b618af154ff2068676cb5fc3ee474e9d3a1ea873895d285664596e5dd3389cc9f7f761e6aa0", + "0x0429d8c87e5e7036a7ccbd5754f78c1d9a8cb750530e9a5a03d1c4a92b326ac35a010100000000000000000000000000000000000000000000000000000000000002457e26202bc0a6c7d79a49c3ae960abc1b08ccd6c0b844abaa810594f68fdefc701b92d6", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xed3b720424f8e7d811b36ea6ea06ba9dbb304fb353fe36fff4d75ce3b5706137": [ + "0x092f5b1503b2b2ffc4e916a222cd824072ace168646ce82a1ab26ff9b5582062ff0001f5fa8eee97a5f05ec191ee67362d6206b4bcbcca389ef12e3a0a6235b9b9", + "0x092f84cc51764db2ac29d9fa763d293a2318549dd50465819cad60f363f00fe47e0826885024e03b00c3e296dc90fa4f17f12d5787ba3e8300fd4aae4c19eeca02", + "0x0802e80421aaa16895ad35061cc0746da7447bd5e46e2cd5c342286a6c57b7b25e0af121aaf5e97c1a05c3b370ad4b9a371c23754a2a2ec8354e234c828363b30a", + "0x0424f6c97e04f23262b2b294f40f6a3972028a8f43c4b755fd9f5017d2cc3373c601010000000000000000000000000000000000000000000000000000000000e90dae109a20ed3b720424f8e7d811b36ea6ea06ba9dbb304fb353fe36fff4d75ce3b5706137", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x5300000000000000000000000000000000000001": { + "0x0000000000000000000000000000000000000000000000000000000000000021": [ + "0x0901ac3061bae99c0d741f0e4792bc61f3bec93e3bfd4e9b1bf71c2eeac83249e102061789fdb797f8009586a28b3e7d4c68c4135ea830b033a9f25fe324965e65", + "0x09039a1d7db21776aa517761e120fde5632733c21865973139f42dd1225d899b7726294ab601fdc57919e84fa003fd3ce4c0e6cfee6ca224264e739c9bf99fb2ff", + "0x0922ef214b35725542f2c5236a9078c04cfe868c2460af073d11329f35cf5d2607172db12bf8987212e0367db213237d6a1b173dc47128739678a51d6bccfdf2a8", + "0x0700000000000000000000000000000000000000000000000000000000000000000537f9984b1cd35c20d6f780fbd8749aa9113bd2fbb9acdf16020c5495ff2df3", + "0x0805c6ac03fc8a8b84ea997df623ebf3379db02353d56e8eba20ec14491e4c562b0000000000000000000000000000000000000000000000000000000000000000", + "0x081f648065f7de77e04e42b850348f2312accd4635b3f75f4a589ed3b4e7c50d7c0000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000001a0889384c3b0cb128f42846b741bc975d22cfda4b45d366dcc85206808c6f68", + "0x07000000000000000000000000000000000000000000000000000000000000000018329b600c16bdf6169b0f4d0814187d0418ee42fbc105adf54d4b94b620ed74", + "0x0700000000000000000000000000000000000000000000000000000000000000000478e67a8cdaa52ab5fbe27e8a41204ed4fa319414c16aac6538d63f2905c2f1", + "0x062eb5eb1aaf8a82049d72b509368f65b50ab88d06282074a93e7ab30c702fcd0809b4fbe11b794c8b46f8e16f64f4e685e54255192dcea7d0f1b39baa21ccc270", + "0x042f683d080c393f5fb2ade2190fd56e8a5e8fa26533acdea8cce25caa236027cc01010000d8b1ed3f4a01e26b20ae06ee54a673e1614431cb403597252f7a5caefa36da38200000000000000000000000000000000000000000000000000000000000000021", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x530000000000000000000000000000000000000f": { + "0x0000000000000000000000000000000000000000000000000000000000000001": [ + "0x09084c55612dd3d5d693fcf7f99fe36100352956a642145a28d98c0539f0cbec2500ae2a216f67a296746c3a1c5a6d0dbf4dbe5b54faea4c279911ab6670706d8e", + "0x092d97cd795354a5a30b84fd02c9a88cffbb662ba30e270dace1e6a32df43297fb22007b8b7b52795bdee79b0a1277a8c5444fa9067a322baea00ece0558e3400b", + "0x090be43faf2770938b49bf9954f96ffb7781fe565616cc19eea1c50f5640fc04491dc5a73fb5d4f7493bf818961c71889f3564ed31a3560d4492b17e2380fb5963", + "0x0826204c54a20b8755b26c8593cbb0f6ccf9faa0d99069fc115fb5345be6e0d6c90000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000002dd3f5348ed437f041f7cbe0ebbfe32ea11debb6bd59585320c711c01fc03312", + "0x0811a12c26bdf47ee813c84db5c6a980d96fd51478295be83171b414caa96dca1f0000000000000000000000000000000000000000000000000000000000000000", + "0x07000000000000000000000000000000000000000000000000000000000000000026e550cb3f8b93622bcb2d1ad0e9e1136d301282f9656f8021918225ed057101", + "0x08095417273a9a98241a36ac71b5bd2264e369b4535dfce68c96eea4fc507ab7270000000000000000000000000000000000000000000000000000000000000000", + "0x080b06c3db82a6ce0908af547a8ac4ec566b42e67a058e66cc5180db596b94a7400000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000000bd96bdb2e373b23f31075d56a6299319285b89bac22d33dc9b6bfd2805d9050", + "0x0611741fb28e6c583a7f0d715a6c810f1fd4b42b714284dcf837adea8ba3a668f4156a0960a84fa4287f66d18b9c39ab9d403fa6b6dddd126f47758aadcb82e122", + "0x0426049ba6de63003492eb078a01a8aa4f4a0e67f28f0955c2eba9101d5d2eea50010100000000000000000000000000000000000000000000000000000000000000944f7f200000000000000000000000000000000000000000000000000000000000000001", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000002": [ + "0x09084c55612dd3d5d693fcf7f99fe36100352956a642145a28d98c0539f0cbec2500ae2a216f67a296746c3a1c5a6d0dbf4dbe5b54faea4c279911ab6670706d8e", + "0x092d97cd795354a5a30b84fd02c9a88cffbb662ba30e270dace1e6a32df43297fb22007b8b7b52795bdee79b0a1277a8c5444fa9067a322baea00ece0558e3400b", + "0x090be43faf2770938b49bf9954f96ffb7781fe565616cc19eea1c50f5640fc04491dc5a73fb5d4f7493bf818961c71889f3564ed31a3560d4492b17e2380fb5963", + "0x06060c405a93a636d8a8d0a2a74e7f7b15c776862a72b952fe807434a878ee088d1e144bbeb8f4c147dafacf9567e13b1b15e4804a9d74df2da7619735d765c1be", + "0x04020953ad52de135367a1ba2629636216ed5174cce5629d11b5d97fe733f07dcc0101000000000000000000000000000000000000000000000000000000000000000009c4200000000000000000000000000000000000000000000000000000000000000002", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000003": [ + "0x09084c55612dd3d5d693fcf7f99fe36100352956a642145a28d98c0539f0cbec2500ae2a216f67a296746c3a1c5a6d0dbf4dbe5b54faea4c279911ab6670706d8e", + "0x0700000000000000000000000000000000000000000000000000000000000000000b2f0f973417fccae039c879f858dc3ebb7f1ebf01fda9dbc71f7c54913a4297", + "0x070ee2ca3e190e48951aa8d5bb00d33ba76a92de69a807dfa6f2eaa9881e303f32140b95c8e970324b0ccea88d06f534e85d995c8639b93234a7f254fcc4ebc7ee", + "0x0406c50541f08911ad149aa545dd3d606f86ee63c751a795c7d57f0d3f85e6bdeb01010000000000000000000000000000000000000000000000000000000000003b9aca00200000000000000000000000000000000000000000000000000000000000000003", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000006": [ + "0x09084c55612dd3d5d693fcf7f99fe36100352956a642145a28d98c0539f0cbec2500ae2a216f67a296746c3a1c5a6d0dbf4dbe5b54faea4c279911ab6670706d8e", + "0x092d97cd795354a5a30b84fd02c9a88cffbb662ba30e270dace1e6a32df43297fb22007b8b7b52795bdee79b0a1277a8c5444fa9067a322baea00ece0558e3400b", + "0x090be43faf2770938b49bf9954f96ffb7781fe565616cc19eea1c50f5640fc04491dc5a73fb5d4f7493bf818961c71889f3564ed31a3560d4492b17e2380fb5963", + "0x06060c405a93a636d8a8d0a2a74e7f7b15c776862a72b952fe807434a878ee088d1e144bbeb8f4c147dafacf9567e13b1b15e4804a9d74df2da7619735d765c1be", + "0x04064ef33f6d7044a6aa1458b710bb24a531e379030cf6ca490d84fff1d8e79c9401010000000000000000000000000000000000000000000000000000000000174876e800200000000000000000000000000000000000000000000000000000000000000006", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000007": [ + "0x09084c55612dd3d5d693fcf7f99fe36100352956a642145a28d98c0539f0cbec2500ae2a216f67a296746c3a1c5a6d0dbf4dbe5b54faea4c279911ab6670706d8e", + "0x092d97cd795354a5a30b84fd02c9a88cffbb662ba30e270dace1e6a32df43297fb22007b8b7b52795bdee79b0a1277a8c5444fa9067a322baea00ece0558e3400b", + "0x0817eb488c5eacbbe8312febc6d42a18398848fc21f141a9303cf52faa1e244de50000000000000000000000000000000000000000000000000000000000000000", + "0x082119746c2afd71d1574bea80b47eab52d70db3990cd1c9f6d4df98eaed5c3ff00e7d8382b2fb64acebb539a337686f0a3a0775c6fcece0c4031269462a08edf0", + "0x040d1e80106f23933567a7c4881177b5d6c45a3f319feafe560a28df75769db9ba0101000000000000000000000000000000000000000000000000000000000636b08c8614200000000000000000000000000000000000000000000000000000000000000007", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000008": [ + "0x09084c55612dd3d5d693fcf7f99fe36100352956a642145a28d98c0539f0cbec2500ae2a216f67a296746c3a1c5a6d0dbf4dbe5b54faea4c279911ab6670706d8e", + "0x0700000000000000000000000000000000000000000000000000000000000000000b2f0f973417fccae039c879f858dc3ebb7f1ebf01fda9dbc71f7c54913a4297", + "0x070ee2ca3e190e48951aa8d5bb00d33ba76a92de69a807dfa6f2eaa9881e303f32140b95c8e970324b0ccea88d06f534e85d995c8639b93234a7f254fcc4ebc7ee", + "0x060e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b20002e15ce98746594c1414772d1a34c7ea3e78c4425a2a2188d3f2a3f2bceebec6", + "0x0412c0c59f64422dd5b7ce259c4aa62e9bf4e2bcc4f0da068e332b9f4e502ba38f0101000000000000000000000000000000000000000000000000000000000001bc65a48c200000000000000000000000000000000000000000000000000000000000000008", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000009": [ + "0x09084c55612dd3d5d693fcf7f99fe36100352956a642145a28d98c0539f0cbec2500ae2a216f67a296746c3a1c5a6d0dbf4dbe5b54faea4c279911ab6670706d8e", + "0x0700000000000000000000000000000000000000000000000000000000000000000b2f0f973417fccae039c879f858dc3ebb7f1ebf01fda9dbc71f7c54913a4297", + "0x05", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x5300000000000000000000000000000000000017": { + "0x0000000000000000000000000000000000000000000000000000000000000065": [ + "0x091bb7a17100326207252cca54cc98c3293214f00f78f0838705cb9c010ec9425903306ea60fb41692e3f39006fb0e854dc68fbd405ca2e3d49a5f12f71c4e8ebb", + "0x092868a32bf50018c0ead11533c9d5ab6fb903b3b09b0ed0eaeadcb2a24d8b1de029c7d6f42d6683d307cb5a0f54e8f9c7b16f172bc733d0ce2dc73437a36a2d48", + "0x0822ff52889832a4791479ca13912145d3a87533bbcf370741240082014f9748bc0e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200", + "0x091bb97fb18271cd4ca26a868e66ac7a2c7776b73adfe15d12e504ca401ef359e60bc7a0ba00c4d2d8976480a9f1fa930dda977b76f17b371767baf1db1afcc030", + "0x072a16cea49bf0bb77fd1cb958831a90704bb227ddfd645b17f5d559a21f53380b13edc24099a1b13d8fb640eb37b1630d58cc2c21cb2289d3dfdd48a942b7e357", + "0x0700000000000000000000000000000000000000000000000000000000000000001a6eab72d5f5f28368c1c39e305732f4650596cfb871dd7b7d1490c5e419f080", + "0x06062f41430c96c9ed21486f1cfec127cabc439f6bc6aaef5449181e35f52ed0212be55fc17d1eb7312a5105d0edb44a405d37d81b392fa71717be628a5a401f80", + "0x042115c9b0a0938aa1ce2e8c01581e5aa931288249a453588de70cf2c5dae26a7b010100006d547e175e7a1d4b4da46abecd844564f5c7aa9da8d073003b73401042c50f80200000000000000000000000000000000000000000000000000000000000000065", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x5300000000000000000000000000000000000021": { + "0x000000000000000000000000000000000000000000000000000000000000009a": [ + "0x092a76d8bd0344762abb8b43b89746a007039f07aaea92d304880c6abcf9a2c70d04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091cbcafd73a15869f9398bb2410de2817eeeff7a68be0f55e31ffc4c68d23481120031d47a0be18e8437af4e775f0e6106b981963505e4c3dc3537044eb05ea71", + "0x0921bf8a30a3d1a684baafd49ee7a13f6eedbe9b52ce362520d8442f9fe29433bf09c3876c8274155eb6d51a79d942e22e9579509ce8fbfdc296ab24f6bac8a7cf", + "0x091ac18bfbb031365e7277465e677848506bc1f80089786c1b1893fee0f96464c709bd08cfb12c05c4f3ea2c7ebc03ee9a82f31b42ccf718fcef4649d64e9dd800", + "0x0829ce85ca1679232d4d1bb506c1a4b7974d8f38b6290131ec64653da8dc30d81128b3bf9a92d906051defc60a366063e6d133f3bb15dc661dad6b57e1f51f95e6", + "0x081f9b1d6040a2a81a670747cefe745efa1e65d2bd9147581fe96782278e4d0a380000000000000000000000000000000000000000000000000000000000000000", + "0x05", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x6d01ba8ffed4ce500f24b73f45df7dc163a96f64ced987d8ee795c34e371362e": [ + "0x092a76d8bd0344762abb8b43b89746a007039f07aaea92d304880c6abcf9a2c70d04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091cbcafd73a15869f9398bb2410de2817eeeff7a68be0f55e31ffc4c68d23481120031d47a0be18e8437af4e775f0e6106b981963505e4c3dc3537044eb05ea71", + "0x0921bf8a30a3d1a684baafd49ee7a13f6eedbe9b52ce362520d8442f9fe29433bf09c3876c8274155eb6d51a79d942e22e9579509ce8fbfdc296ab24f6bac8a7cf", + "0x091ac18bfbb031365e7277465e677848506bc1f80089786c1b1893fee0f96464c709bd08cfb12c05c4f3ea2c7ebc03ee9a82f31b42ccf718fcef4649d64e9dd800", + "0x0829ce85ca1679232d4d1bb506c1a4b7974d8f38b6290131ec64653da8dc30d81128b3bf9a92d906051defc60a366063e6d133f3bb15dc661dad6b57e1f51f95e6", + "0x081f9b1d6040a2a81a670747cefe745efa1e65d2bd9147581fe96782278e4d0a380000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000002247aa69e009ac835666f64bcaf43bbb3f5a885a79f9e87e00bbd2c7bda14cde", + "0x062e4f8d4fe6ca5397cc102e59a85d43a7ea3a61c67962c510d3a09ba73a313f03078d656a65a456e82959aec42fa6f07b77bd98556b0115528907a4a95b969e0f", + "0x040959c4a1b3fc665dce20b30216d51dd0141a6738567cfbbf2054a1bc710af9480101000000000000000000000000000000000000000000000000000000010334bbc2d000206d01ba8ffed4ce500f24b73f45df7dc163a96f64ced987d8ee795c34e371362e", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c1f": [ + "0x092a76d8bd0344762abb8b43b89746a007039f07aaea92d304880c6abcf9a2c70d04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091cbcafd73a15869f9398bb2410de2817eeeff7a68be0f55e31ffc4c68d23481120031d47a0be18e8437af4e775f0e6106b981963505e4c3dc3537044eb05ea71", + "0x090872f3723922b5e7b15f02463e5424b6ace0c7dd1bbe712a47d5c50b5182e9e405ca23d77ef7e23741a051f6f8c2bbb3f23c6031554bda48758bfe0c30661921", + "0x09139b028a20238945226733d3dc957255b94fcec991a7fb62670e668670043dc615cef82615590561df79ba0aeb59c3805e1bf66450098b0632b0873e52acc119", + "0x090269c5b1c6b4b35151f850f0caa5105613d97b403010715c920529fa0d1ed74e1d65d478edf0bbaee142118730ef5ebed3117411d3c132cdd135d9533b2b6ff3", + "0x0917e6a0650e3f8bddd6b56e1012b4155e44d0afc307ced8a2b8261df4c655f8d42720829d5afeb87762b75baf003dc0d67d9a310e5fa04347401ee211411f3074", + "0x0628f4649cd3965ffdae9b8bb599ed02cecfb9a00bfea4627795420548d0d3d02b061de6c1cc11d78e6268c23e9658807bd2a78d0c25035ef619d94a1d629c0975", + "0x040e11aafee10c1ada84b19baca77f65014d45b4d26b4ce3aef99a36898199d986010100000000000000000000000000003c58dbda457360a9b7d9c8713273608bd1be59af20f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c1f", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c20": [ + "0x092a76d8bd0344762abb8b43b89746a007039f07aaea92d304880c6abcf9a2c70d04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091d97f1c4d55347b1d429c1c032640017976a1d5a4d9e7d267eaab810e76cde5410922a2f16b0d79199940d61d76b9a38b356ded2b55ef3cb9efd8d41b55cd9a1", + "0x0919192c804de24fd6bbeb6bbe3a9e3d60628368d05e485d6d5b2cb3c87db54bb6170b4d2136b00854310e3859a85e31de715b00bde4985a57d051677d2aaa0d6b", + "0x090c7116a446f80048f743bcbe5a6fd6f74a35235d70f146a2fbc28d39f581046a29c8e336d9a3512e280786a9936b24f5d21b7c06b079152fb0ae05cb9957b933", + "0x07183d6eaf5b24b3d61190d244d68d53775408e896f412fea55ada9ae82937d39e0224d9ff76c56f22b90576f73ddf574c54444ace601eccf441db7036c55d4815", + "0x042b481a9ad830b50496586f117cffd43e36bb39c800fe1041856fea045d6c164901010000000000000000000000000000fc0ba9431eb05cfb341e9af3ddc911f9544f8d3c208053690728cdd65bc3df04693ede9a54b0234d698fecfe95b20f98f490cc27c8", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c21": [ + "0x092a76d8bd0344762abb8b43b89746a007039f07aaea92d304880c6abcf9a2c70d04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091cbcafd73a15869f9398bb2410de2817eeeff7a68be0f55e31ffc4c68d23481120031d47a0be18e8437af4e775f0e6106b981963505e4c3dc3537044eb05ea71", + "0x090872f3723922b5e7b15f02463e5424b6ace0c7dd1bbe712a47d5c50b5182e9e405ca23d77ef7e23741a051f6f8c2bbb3f23c6031554bda48758bfe0c30661921", + "0x092844f9973c0091032065205aa3ee43dfb70a92a167f7eb4aa252eac32fe3170023bd36cc34044ad00a9be7f55e7d59e855f235ad63ce17999da46dc614c244f7", + "0x091837d3df34f0cd641a40c90699d8a5cd9f75d95284337fb6ad97d7d400cc11a0213840d432c9a896719a5e27ac8a33c881222f55bc257631e6a9b48092f6bac3", + "0x09187c68e93dbd497a6fd042e5d48d3ec07344334576df0f8ae2c4ab519d82456c006638b810ed97d5a6e2798b22105fb538145f44b4fdc2f6133ec19f284852b9", + "0x081a6da792fdca879a8e5a966cc677327a27a93d4e0e5b4b10736f495780a755420000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000001757d3b68fe5609bb417d69e844076087720fd9ac0615a4fd7259a1177892431", + "0x08183f814d072493364968e21dc8b99b81feb73e88d08622258ff4e9e5e3e6f9cb0000000000000000000000000000000000000000000000000000000000000000", + "0x0710bd56aa4fa4fe8c8a00021a98c7a560c42dca3a35a21f4ab0a92c1ef02709a32e595a6c3c1be5266c3c8e3b8990f8c12a3209356621aaa502c0564b65659eda", + "0x08052614f553ae26abda62741495cd00d44551df1fa8a81df3a21a2c0ee814350e1d2b12508501e2c638408b3226eaff5dae4959be9d85bf09363771fb46f78f96", + "0x0628153a925626ec6022f5d63f9be0640f202ede37cf09a961a03513eb89d377230154484431d37f9c311e65c4a516c144975b04c404eae5b908e141b3df6ccf92", + "0x0409130a06ba75cb64ae567f1af4e20969bcad96dedcf63d1e434f3f6dc966ca9201010000000000000000000000000000000000000000000000000000000000000000060120f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c21", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c22": [ + "0x092a76d8bd0344762abb8b43b89746a007039f07aaea92d304880c6abcf9a2c70d04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091d97f1c4d55347b1d429c1c032640017976a1d5a4d9e7d267eaab810e76cde5410922a2f16b0d79199940d61d76b9a38b356ded2b55ef3cb9efd8d41b55cd9a1", + "0x092883e6c9f8554b07276ac716a5b75dfea32ced6155a997e35b3f628f30b7dee42c3eaa894b3a3ce7148977abf5e239b1e92deabb870ebb0476962ad8d8f623ab", + "0x092a16326c64bc4d8f5a84a63b8e8393ce26a4f3d668969a2228f016fd1803884d251cf79c50546e5f56b08ac68ccd7bd4831d70d54c284f1b750dbb69f4feadf8", + "0x09052897e407fcbc56b0630c56428eae64abb5b7deadc370bc21f274a5bd35f14527876ddd9d75c6fcccd372762c3ad645195374953db62ebb3b0651fb3ddea3fa", + "0x070000000000000000000000000000000000000000000000000000000000000000136ecb21790bfcdbefecbd46fa7dbfea6b4ea3c78ebbc2d262a7ca19ea2b0235", + "0x0822b3c66f5387d999dc66891a75bb307c11efd4950e59925d90657dffed78603611a4b142f80899b94192f56c30e2545b0f60d45246f89520b827da4245440b0a", + "0x0426021fba3d566dfc3284c8ace6e55cbf07f0864ebec2f8f1a14e7d1d1294ecf70101000000000000000000000000000000000000000000000000000000000000000f424020f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c22", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + } + } + }, + "codes": [ + { + "codeSize": 0, + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "code": "0x" + }, + { + "codeSize": 0, + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "code": "0x" + }, + { + "codeSize": 1923, + "keccakCodeHash": "0x8b37156d23eecc5f4dc725b655fd12920b9e594b2d7d707b006b2fc511519f5d", + "hash": "0x0a1108cffae95ace28f77dee674975f9461bd7cc707c45dff3d151f10130f3cd", + "code": "0x608060405234801561000f575f80fd5b506004361061009b575f3560e01c806340c10f191161006357806340c10f191461012957806370a082311461013e57806395d89b411461015d578063a9059cbb14610165578063dd62ed3e14610178575f80fd5b806306fdde031461009f578063095ea7b3146100bd57806318160ddd146100e057806323b872dd146100f7578063313ce5671461010a575b5f80fd5b6100a76101a2565b6040516100b491906105c3565b60405180910390f35b6100d06100cb366004610629565b61022d565b60405190151581526020016100b4565b6100e960035481565b6040519081526020016100b4565b6100d0610105366004610651565b610299565b6002546101179060ff1681565b60405160ff90911681526020016100b4565b61013c610137366004610629565b61044f565b005b6100e961014c36600461068a565b60046020525f908152604090205481565b6100a76104d5565b6100d0610173366004610629565b6104e2565b6100e96101863660046106aa565b600560209081525f928352604080842090915290825290205481565b5f80546101ae906106db565b80601f01602080910402602001604051908101604052809291908181526020018280546101da906106db565b80156102255780601f106101fc57610100808354040283529160200191610225565b820191905f5260205f20905b81548152906001019060200180831161020857829003601f168201915b505050505081565b335f8181526005602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906102879086815260200190565b60405180910390a35060015b92915050565b6001600160a01b0383165f908152600460205260408120548211156102fc5760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b60448201526064015b60405180910390fd5b6001600160a01b0384165f9081526005602090815260408083203384529091529020548211156103675760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b60448201526064016102f3565b6001600160a01b0384165f908152600460205260408120805484929061038e908490610727565b90915550506001600160a01b0383165f90815260046020526040812080548492906103ba90849061073a565b90915550506001600160a01b0384165f908152600560209081526040808320338452909152812080548492906103f1908490610727565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161043d91815260200190565b60405180910390a35060019392505050565b8060035f828254610460919061073a565b90915550506001600160a01b0382165f908152600460205260408120805483929061048c90849061073a565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600180546101ae906106db565b335f908152600460205260408120548211156105375760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b60448201526064016102f3565b335f9081526004602052604081208054849290610555908490610727565b90915550506001600160a01b0383165f908152600460205260408120805484929061058190849061073a565b90915550506040518281526001600160a01b0384169033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610287565b5f6020808352835180828501525f5b818110156105ee578581018301518582016040015282016105d2565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610624575f80fd5b919050565b5f806040838503121561063a575f80fd5b6106438361060e565b946020939093013593505050565b5f805f60608486031215610663575f80fd5b61066c8461060e565b925061067a6020850161060e565b9150604084013590509250925092565b5f6020828403121561069a575f80fd5b6106a38261060e565b9392505050565b5f80604083850312156106bb575f80fd5b6106c48361060e565b91506106d26020840161060e565b90509250929050565b600181811c908216806106ef57607f821691505b60208210810361070d57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561029357610293610713565b808201808211156102935761029361071356fea264697066735822122037b5e8204352efb74ca0aabb5eeb6432aec1c80cfe9987543bd70804bea0ff7364736f6c63430008140033" + }, + { + "codeSize": 2796, + "keccakCodeHash": "0x44107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d5", + "hash": "0x18d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f84", + "code": "0x60806040523661001357610011610017565b005b6100115b61001f6102a0565b73ffffffffffffffffffffffffffffffffffffffff1633036102965760607fffffffff000000000000000000000000000000000000000000000000000000005f35167fc9a6301a000000000000000000000000000000000000000000000000000000008101610097576100906102df565b915061028e565b7fb0e10d7a000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216016100e857610090610332565b7f70d7c690000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160161013957610090610376565b7f07ae5bc0000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160161018a576100906103a6565b7fa39f25e5000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216016101db576100906103f2565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b815160208301f35b61029e610405565b565b5f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b60606102e9610415565b5f6102f736600481846108bc565b810190610304919061090b565b905061031f8160405180602001604052805f8152505f61041f565b505060408051602081019091525f815290565b60605f8061034336600481846108bc565b8101906103509190610951565b915091506103608282600161041f565b60405180602001604052805f8152509250505090565b6060610380610415565b5f61038e36600481846108bc565b81019061039b919061090b565b905061031f8161044a565b60606103b0610415565b5f6103b96102a0565b6040805173ffffffffffffffffffffffffffffffffffffffff831660208201529192500160405160208183030381529060405291505090565b60606103fc610415565b5f6103b96104ae565b61029e6104106104ae565b6104bc565b341561029e575f80fd5b610428836104da565b5f825111806104345750805b15610445576104438383610526565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6104736102a0565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a16104ab81610552565b50565b5f6104b761065e565b905090565b365f80375f80365f845af43d5f803e8080156104d6573d5ff35b3d5ffd5b6104e381610685565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b606061054b8383604051806060016040528060278152602001610ab960279139610750565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81166105f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610285565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6102c3565b73ffffffffffffffffffffffffffffffffffffffff81163b610729576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610285565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610618565b60605f808573ffffffffffffffffffffffffffffffffffffffff16856040516107799190610a4d565b5f60405180830381855af49150503d805f81146107b1576040519150601f19603f3d011682016040523d82523d5f602084013e6107b6565b606091505b50915091506107c7868383876107d1565b9695505050505050565b606083156108665782515f0361085f5773ffffffffffffffffffffffffffffffffffffffff85163b61085f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610285565b5081610870565b6108708383610878565b949350505050565b8151156108885781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102859190610a68565b5f80858511156108ca575f80fd5b838611156108d6575f80fd5b5050820193919092039150565b803573ffffffffffffffffffffffffffffffffffffffff81168114610906575f80fd5b919050565b5f6020828403121561091b575f80fd5b61054b826108e3565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f8060408385031215610962575f80fd5b61096b836108e3565b9150602083013567ffffffffffffffff80821115610987575f80fd5b818501915085601f83011261099a575f80fd5b8135818111156109ac576109ac610924565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156109f2576109f2610924565b81604052828152886020848701011115610a0a575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f5b83811015610a45578181015183820152602001610a2d565b50505f910152565b5f8251610a5e818460208701610a2b565b9190910192915050565b602081525f8251806020840152610a86816040850160208701610a2b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a164736f6c6343000818000a" + } + ], + "txStorageTraces": [ + { + "rootBefore": "0x168e9408313b570db45fbc4d2654226378ca8a2d2bc55757785ca22181d0b99d", + "rootAfter": "0x0c4936b3e6430e339137e2e9086f1cab780703f1fdf32a874b595f442e5f122a", + "proofs": { + "0x3c58DBda457360a9B7D9c8713273608bd1Be59af": [ + "0x0922400597ff3c7f13ac0cf7113f4bc53de534ef7684e32b3a7f97f070dda2b18d0f3317c922c86c1ffb67ec6ddf7cdbd138abc6db00a9401797df859ef7f7d159", + "0x0929386fe592e14bf39d9d464223d43f6601a219e4908c458dca6b0375c427b37f25602e21ec4b807c8119faf27e696590e6144ff41164ce80370d64f0743ed5c0", + "0x09038344babd5fb6933aefb9b43437e120955a7bc74f6ad9c4024d2334129037e92c10742d9e097fe0303088a43bd06d632237075d0953129f983944f1fe8da086", + "0x09195c7fe0a901f08cc0fd8490866ae10e18c0a2a5b489fd6044bd241e8c8922301f761055609ff5ed18bdde2208e06bd2f2996755978a495f6dbaf69da56e7ebb", + "0x092518f8d92281a123ca9f8c9a10ffa90bd4166de182aa8c4592176e177d458ebf13a9e659f4b5461810aa1e3af677c79410abf87f02b5b9f7f84789ebf61220e8", + "0x091c6258c6d7113965fa33cf47433176a0ea35c1012a8d1462b4ed521982b67e162811499662824e135821a1dd6b069b64001fb81ac367288642cecbb0278b4606", + "0x072a941db58791cdd82561e2f2360c76f22ca32f9495acc14f4855069f870472681ae74b4b23bb9d25c16438535d2c280b19e036e3511ab5d9639b86d2c040ab42", + "0x091eb22fb420adc799bbfcdacd8f1de56ae423841812b060c39f9b6e107f659f5c06a780c5b07fb945d0da31456c6dadfdb4e9a683572f8783d51fce46fbd49626", + "0x0824960aa2fbb2a00390e6960aa7dfea797699d8ac832a7b21d19924faef25269c0000000000000000000000000000000000000000000000000000000000000000", + "0x062777a1c6882f3662c273c71bf06831768f0c90ab620b8376ee6020b0552d4b931b38eca2e1e5715f412de91311989474ab569bb429f05ae96ae12ae580a7b4c9", + "0x0415332f1e7c756905199e3e1821b812e853569e281f4d7b7d95ed06db34a69870050800000000000000000000000000000000000000000000000007830000000000000001000000000000000000000000000000000000000000000000000000000000000002203cf2b3e1ae988b2d68de7a6f7017a525b0f3b313db4f15cfa98a3537b6198b37156d23eecc5f4dc725b655fd12920b9e594b2d7d707b006b2fc511519f5d0a1108cffae95ace28f77dee674975f9461bd7cc707c45dff3d151f10130f3cd203c58dbda457360a9b7d9c8713273608bd1be59af000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5add06F01e73b75A4184C8cb74485bB0A897b23E": [ + "0x0922400597ff3c7f13ac0cf7113f4bc53de534ef7684e32b3a7f97f070dda2b18d0f3317c922c86c1ffb67ec6ddf7cdbd138abc6db00a9401797df859ef7f7d159", + "0x0920419accd86858e2513996e144cebf4055af4e123ce989ed65f61980d1ff46ab04104166a24a37201435daa45d2c7d9f21d7d011cb097a685d0eb17a977dcc5f", + "0x090fb48ca023111d90314fe102d114bcb0891589b2814d7a574fdd6635aa326aba030f83fd46a40d224591afe4ff831180641ad6ac5e472e56a59f432a8a9f6595", + "0x09098a83815f59bfd19570c03d046fea3fa5f4a800583bd2280f7b341a8d6f1bc614c384f7d644b88ae4ffead574dce42fb40f70bf06c48b2f130eefe3c1d352f5", + "0x092969003c85a71dd03e14528ff099d7ee69c318cd7b441337a8f1f1e24c40e48e0ccaadf733376b76eb22ab103f97bd2dffbbd785fa127adf4446b1b59008b8c4", + "0x090a4374681b0d6dc98ef133864972abe6716caeb844f9ee6c722a5af2d84e078e0f01a3d026923d08e42986e47746b499d9d761eb5041d429d20e4b502a230609", + "0x070f48fcbcfe94d9e293618b428a44065dd774c063d8c1caefa5323018ec799d9f2338cfed1f2456b036596fc2003b5e6e2bbaa3d88fbc0d47124a415d2833b445", + "0x0700000000000000000000000000000000000000000000000000000000000000002ad608b5df53d230ab9d3641cbff8ad9afd2c703a9d48a4e61c6e4090532aaad", + "0x091a5c484c6957ab80ee2649b2c863192f52d3adc258f3c1a0b03ca9d6872340a70de2336ed6cc6f7af14d35c543eed899daa6eb26214ee4642e037c0d071fffa9", + "0x06283465243b826f14bb66f7babd9dc61ea472872a89ef8a1e0859667f22971e350d163b641a25ec4aa3bffd18a712fa25c4713652b48f1ef53d20dcf659837921", + "0x041736e2ebcabec708f4ecce38cd9c16a8a1f6ebfa1df67ed285e8e2ef95f2aec10508000000000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000241f6ff67977cf30000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864205add06f01e73b75a4184c8cb74485bb0a897b23e000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x716170D0687c3d31CC10DebE0dAa1DDD3FE3D792": [ + "0x0922400597ff3c7f13ac0cf7113f4bc53de534ef7684e32b3a7f97f070dda2b18d0f3317c922c86c1ffb67ec6ddf7cdbd138abc6db00a9401797df859ef7f7d159", + "0x0929386fe592e14bf39d9d464223d43f6601a219e4908c458dca6b0375c427b37f25602e21ec4b807c8119faf27e696590e6144ff41164ce80370d64f0743ed5c0", + "0x09038344babd5fb6933aefb9b43437e120955a7bc74f6ad9c4024d2334129037e92c10742d9e097fe0303088a43bd06d632237075d0953129f983944f1fe8da086", + "0x0905c05964386c6ceaa91e691a403b41490ba625ccec420e52d39eb5aef53691a10626513e5342bb37b800f39bd2f6c9d4cd871a3a06d9fad1c0f3401c5be5999b", + "0x0913eff588f55e7c7a2f3fdb66c7e34afeb3eb8c83472b7ea6f3c5e20cfdaf27791fc630a39ae07328b9da3b7c64caa6c767f0805216c0da0947d765edd67d44bd", + "0x090fea719a68a48e9dd333707efbb005a4c81d29707e4eedad5babdbdb10448b080b9f1b4453cf781044af788aaed0ac5bcb88d1a5002ccd640ca657f3d3b8aaec", + "0x092d8cf9858ac296e55a357479747ad048821376d4f043407af9d043dd953dfb0c1b4b75bd86f411a241ba361d15c84e22c02d45ee1838a4327beed5de61454e42", + "0x0700000000000000000000000000000000000000000000000000000000000000000fd55f73d3682f1aa396111dec8471e7ae5a6026e2b3a8d44c3090519de2dbf1", + "0x062da1750dc9f7ebf795aa7f4d9ee6933579283a4242334ff38e298db642ba417222892de62f34759b7e27b1a4997007b7ff66a9e565e3983a39732db3422b4c57", + "0x0414b0bb4090afcdae623b69d996022ea82c221cd1a3c00c5b13acb37d750f87fc0508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fbed38436f9c7210000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420716170d0687c3d31cc10debe0daa1ddd3fe3d792000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xb055051fb2889Be5e9831524f1624941299C49bb": [ + "0x0922400597ff3c7f13ac0cf7113f4bc53de534ef7684e32b3a7f97f070dda2b18d0f3317c922c86c1ffb67ec6ddf7cdbd138abc6db00a9401797df859ef7f7d159", + "0x0929386fe592e14bf39d9d464223d43f6601a219e4908c458dca6b0375c427b37f25602e21ec4b807c8119faf27e696590e6144ff41164ce80370d64f0743ed5c0", + "0x09038344babd5fb6933aefb9b43437e120955a7bc74f6ad9c4024d2334129037e92c10742d9e097fe0303088a43bd06d632237075d0953129f983944f1fe8da086", + "0x09195c7fe0a901f08cc0fd8490866ae10e18c0a2a5b489fd6044bd241e8c8922301f761055609ff5ed18bdde2208e06bd2f2996755978a495f6dbaf69da56e7ebb", + "0x092d49201535bedc99fba584f191470fcc90a1536753b14c14409b638d881802741eb287abf0022dc97801b880a992d612cd3413df725faa59fc9a424a1d82d064", + "0x090bbeb68e19051ecc140fa9c84e136acf6e9097773338272727fe5add195715bf2bee81201efc661b8170dd635aecf86d593e76e5f8e40458107b46bc91a8ab26", + "0x09117d192aeaa6311af3cf6179950c2d4664e3af8dc4fbf41100681584042a35dc23196427e324dc265eb0b772701a0d8b30c701b15a85a210e4ef6bfc011c96ea", + "0x061d741b029db79b9631a6164c03568163e5598506df9846ca6fa2d281f2ce95580774efa3afb6dcac978d1b3856fb5c77e7022c26b61b48a2c66e0a21886ee5e8", + "0x042309c8ab1f3c5435a473ea279640fbd4ebdde9ff680ac6b79971a0d96582fac80508000000000000000000000000000000000000000000000000000000000000000004260000000000000000000000000000000000000000000000006e67db319bc683dc0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420b055051fb2889be5e9831524f1624941299c49bb000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "storageProofs": { + "0x3c58DBda457360a9B7D9c8713273608bd1Be59af": { + "0x2bc0a6c7d79a49c3ae960abc1b08ccd6c0b844abaa810594f68fdefc701b92d6": [ + "0x092f5b1503b2b2ffc4e916a222cd824072ace168646ce82a1ab26ff9b5582062ff0001f5fa8eee97a5f05ec191ee67362d6206b4bcbcca389ef12e3a0a6235b9b9", + "0x092f84cc51764db2ac29d9fa763d293a2318549dd50465819cad60f363f00fe47e0826885024e03b00c3e296dc90fa4f17f12d5787ba3e8300fd4aae4c19eeca02", + "0x0802e80421aaa16895ad35061cc0746da7447bd5e46e2cd5c342286a6c57b7b25e0af121aaf5e97c1a05c3b370ad4b9a371c23754a2a2ec8354e234c828363b30a", + "0x072df0a2b7734173fe5c633d61fed384f4435213f399f9007a240705ca99847b0d02769f4d92a2bae211050ad2ad923b9520039806acf8e24f850daf7260de55ba", + "0x0700000000000000000000000000000000000000000000000000000000000000002f7e69c25f2aaae35521ecf2943e1e0caa66f48b68de7ee452b252cbb1f79695", + "0x0604437bbb94a72bf2299c0be1a56438cf0cc4042cfca77eb3f0b09b618af154ff2068676cb5fc3ee474e9d3a1ea873895d285664596e5dd3389cc9f7f761e6aa0", + "0x0429d8c87e5e7036a7ccbd5754f78c1d9a8cb750530e9a5a03d1c4a92b326ac35a010100000000000000000000000000000000000000000000000000000000000002457e26202bc0a6c7d79a49c3ae960abc1b08ccd6c0b844abaa810594f68fdefc701b92d6", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xed3b720424f8e7d811b36ea6ea06ba9dbb304fb353fe36fff4d75ce3b5706137": [ + "0x092f5b1503b2b2ffc4e916a222cd824072ace168646ce82a1ab26ff9b5582062ff0001f5fa8eee97a5f05ec191ee67362d6206b4bcbcca389ef12e3a0a6235b9b9", + "0x092f84cc51764db2ac29d9fa763d293a2318549dd50465819cad60f363f00fe47e0826885024e03b00c3e296dc90fa4f17f12d5787ba3e8300fd4aae4c19eeca02", + "0x0802e80421aaa16895ad35061cc0746da7447bd5e46e2cd5c342286a6c57b7b25e0af121aaf5e97c1a05c3b370ad4b9a371c23754a2a2ec8354e234c828363b30a", + "0x0424f6c97e04f23262b2b294f40f6a3972028a8f43c4b755fd9f5017d2cc3373c601010000000000000000000000000000000000000000000000000000000000e90dae109a20ed3b720424f8e7d811b36ea6ea06ba9dbb304fb353fe36fff4d75ce3b5706137", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x5300000000000000000000000000000000000021": { + "0x6d01ba8ffed4ce500f24b73f45df7dc163a96f64ced987d8ee795c34e371362e": [ + "0x092a76d8bd0344762abb8b43b89746a007039f07aaea92d304880c6abcf9a2c70d04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091cbcafd73a15869f9398bb2410de2817eeeff7a68be0f55e31ffc4c68d23481120031d47a0be18e8437af4e775f0e6106b981963505e4c3dc3537044eb05ea71", + "0x0921bf8a30a3d1a684baafd49ee7a13f6eedbe9b52ce362520d8442f9fe29433bf09c3876c8274155eb6d51a79d942e22e9579509ce8fbfdc296ab24f6bac8a7cf", + "0x091ac18bfbb031365e7277465e677848506bc1f80089786c1b1893fee0f96464c709bd08cfb12c05c4f3ea2c7ebc03ee9a82f31b42ccf718fcef4649d64e9dd800", + "0x0829ce85ca1679232d4d1bb506c1a4b7974d8f38b6290131ec64653da8dc30d81128b3bf9a92d906051defc60a366063e6d133f3bb15dc661dad6b57e1f51f95e6", + "0x081f9b1d6040a2a81a670747cefe745efa1e65d2bd9147581fe96782278e4d0a380000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000002247aa69e009ac835666f64bcaf43bbb3f5a885a79f9e87e00bbd2c7bda14cde", + "0x062e4f8d4fe6ca5397cc102e59a85d43a7ea3a61c67962c510d3a09ba73a313f03078d656a65a456e82959aec42fa6f07b77bd98556b0115528907a4a95b969e0f", + "0x040959c4a1b3fc665dce20b30216d51dd0141a6738567cfbbf2054a1bc710af9480101000000000000000000000000000000000000000000000000000000010334bbc2d000206d01ba8ffed4ce500f24b73f45df7dc163a96f64ced987d8ee795c34e371362e", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c1f": [ + "0x092a76d8bd0344762abb8b43b89746a007039f07aaea92d304880c6abcf9a2c70d04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091cbcafd73a15869f9398bb2410de2817eeeff7a68be0f55e31ffc4c68d23481120031d47a0be18e8437af4e775f0e6106b981963505e4c3dc3537044eb05ea71", + "0x090872f3723922b5e7b15f02463e5424b6ace0c7dd1bbe712a47d5c50b5182e9e405ca23d77ef7e23741a051f6f8c2bbb3f23c6031554bda48758bfe0c30661921", + "0x09139b028a20238945226733d3dc957255b94fcec991a7fb62670e668670043dc615cef82615590561df79ba0aeb59c3805e1bf66450098b0632b0873e52acc119", + "0x090269c5b1c6b4b35151f850f0caa5105613d97b403010715c920529fa0d1ed74e1d65d478edf0bbaee142118730ef5ebed3117411d3c132cdd135d9533b2b6ff3", + "0x0917e6a0650e3f8bddd6b56e1012b4155e44d0afc307ced8a2b8261df4c655f8d42720829d5afeb87762b75baf003dc0d67d9a310e5fa04347401ee211411f3074", + "0x0628f4649cd3965ffdae9b8bb599ed02cecfb9a00bfea4627795420548d0d3d02b061de6c1cc11d78e6268c23e9658807bd2a78d0c25035ef619d94a1d629c0975", + "0x040e11aafee10c1ada84b19baca77f65014d45b4d26b4ce3aef99a36898199d986010100000000000000000000000000003c58dbda457360a9b7d9c8713273608bd1be59af20f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c1f", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c20": [ + "0x092a76d8bd0344762abb8b43b89746a007039f07aaea92d304880c6abcf9a2c70d04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091d97f1c4d55347b1d429c1c032640017976a1d5a4d9e7d267eaab810e76cde5410922a2f16b0d79199940d61d76b9a38b356ded2b55ef3cb9efd8d41b55cd9a1", + "0x0919192c804de24fd6bbeb6bbe3a9e3d60628368d05e485d6d5b2cb3c87db54bb6170b4d2136b00854310e3859a85e31de715b00bde4985a57d051677d2aaa0d6b", + "0x090c7116a446f80048f743bcbe5a6fd6f74a35235d70f146a2fbc28d39f581046a29c8e336d9a3512e280786a9936b24f5d21b7c06b079152fb0ae05cb9957b933", + "0x07183d6eaf5b24b3d61190d244d68d53775408e896f412fea55ada9ae82937d39e0224d9ff76c56f22b90576f73ddf574c54444ace601eccf441db7036c55d4815", + "0x042b481a9ad830b50496586f117cffd43e36bb39c800fe1041856fea045d6c164901010000000000000000000000000000fc0ba9431eb05cfb341e9af3ddc911f9544f8d3c208053690728cdd65bc3df04693ede9a54b0234d698fecfe95b20f98f490cc27c8", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c21": [ + "0x092a76d8bd0344762abb8b43b89746a007039f07aaea92d304880c6abcf9a2c70d04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091cbcafd73a15869f9398bb2410de2817eeeff7a68be0f55e31ffc4c68d23481120031d47a0be18e8437af4e775f0e6106b981963505e4c3dc3537044eb05ea71", + "0x090872f3723922b5e7b15f02463e5424b6ace0c7dd1bbe712a47d5c50b5182e9e405ca23d77ef7e23741a051f6f8c2bbb3f23c6031554bda48758bfe0c30661921", + "0x092844f9973c0091032065205aa3ee43dfb70a92a167f7eb4aa252eac32fe3170023bd36cc34044ad00a9be7f55e7d59e855f235ad63ce17999da46dc614c244f7", + "0x091837d3df34f0cd641a40c90699d8a5cd9f75d95284337fb6ad97d7d400cc11a0213840d432c9a896719a5e27ac8a33c881222f55bc257631e6a9b48092f6bac3", + "0x09187c68e93dbd497a6fd042e5d48d3ec07344334576df0f8ae2c4ab519d82456c006638b810ed97d5a6e2798b22105fb538145f44b4fdc2f6133ec19f284852b9", + "0x081a6da792fdca879a8e5a966cc677327a27a93d4e0e5b4b10736f495780a755420000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000001757d3b68fe5609bb417d69e844076087720fd9ac0615a4fd7259a1177892431", + "0x08183f814d072493364968e21dc8b99b81feb73e88d08622258ff4e9e5e3e6f9cb0000000000000000000000000000000000000000000000000000000000000000", + "0x0710bd56aa4fa4fe8c8a00021a98c7a560c42dca3a35a21f4ab0a92c1ef02709a32e595a6c3c1be5266c3c8e3b8990f8c12a3209356621aaa502c0564b65659eda", + "0x08052614f553ae26abda62741495cd00d44551df1fa8a81df3a21a2c0ee814350e1d2b12508501e2c638408b3226eaff5dae4959be9d85bf09363771fb46f78f96", + "0x0628153a925626ec6022f5d63f9be0640f202ede37cf09a961a03513eb89d377230154484431d37f9c311e65c4a516c144975b04c404eae5b908e141b3df6ccf92", + "0x0409130a06ba75cb64ae567f1af4e20969bcad96dedcf63d1e434f3f6dc966ca9201010000000000000000000000000000000000000000000000000000000000000000060120f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c21", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c22": [ + "0x092a76d8bd0344762abb8b43b89746a007039f07aaea92d304880c6abcf9a2c70d04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091d97f1c4d55347b1d429c1c032640017976a1d5a4d9e7d267eaab810e76cde5410922a2f16b0d79199940d61d76b9a38b356ded2b55ef3cb9efd8d41b55cd9a1", + "0x092883e6c9f8554b07276ac716a5b75dfea32ced6155a997e35b3f628f30b7dee42c3eaa894b3a3ce7148977abf5e239b1e92deabb870ebb0476962ad8d8f623ab", + "0x092a16326c64bc4d8f5a84a63b8e8393ce26a4f3d668969a2228f016fd1803884d251cf79c50546e5f56b08ac68ccd7bd4831d70d54c284f1b750dbb69f4feadf8", + "0x09052897e407fcbc56b0630c56428eae64abb5b7deadc370bc21f274a5bd35f14527876ddd9d75c6fcccd372762c3ad645195374953db62ebb3b0651fb3ddea3fa", + "0x070000000000000000000000000000000000000000000000000000000000000000136ecb21790bfcdbefecbd46fa7dbfea6b4ea3c78ebbc2d262a7ca19ea2b0235", + "0x0822b3c66f5387d999dc66891a75bb307c11efd4950e59925d90657dffed78603611a4b142f80899b94192f56c30e2545b0f60d45246f89520b827da4245440b0a", + "0x0426021fba3d566dfc3284c8ace6e55cbf07f0864ebec2f8f1a14e7d1d1294ecf70101000000000000000000000000000000000000000000000000000000000000000f424020f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c22", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + } + } + } + ], + "executionResults": [ + { + "l1DataFee": "0x558020be693d", + "feeTokenID": 4, + "feeRate": "0x10334bbc2d000", + "tokenScale": "0xf4240", + "feeLimit": "0x3b9aca00", + "gas": 21000, + "failed": false, + "returnValue": "", + "from": { + "address": "0xb055051fb2889be5e9831524f1624941299c49bb", + "nonce": 1062, + "balance": "0x6e67db319bc683dc", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + "to": { + "address": "0x5add06f01e73b75a4184c8cb74485bb0a897b23e", + "nonce": 3, + "balance": "0x241f6ff67977cf3", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + "accountAfter": [ + { + "address": "0xb055051fb2889be5e9831524f1624941299c49bb", + "nonce": 1063, + "balance": "0x6e644db2f70003dc", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + { + "address": "0x5add06f01e73b75a4184c8cb74485bb0a897b23e", + "nonce": 3, + "balance": "0x245847e0c5dfcf3", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + { + "address": "0x716170d0687c3d31cc10debe0daa1ddd3fe3d792", + "nonce": 0, + "balance": "0x1fbed38436f9c721", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + } + ], + "structLogs": [], + "callTrace": { + "from": "0xb055051fb2889be5e9831524f1624941299c49bb", + "gas": "0x61a8", + "gasUsed": "0x5208", + "to": "0x5add06f01e73b75a4184c8cb74485bb0a897b23e", + "input": "0x", + "value": "0x38d7ea4c68000", + "type": "CALL" + } + } + ], + "withdraw_trie_root": "0xd8b1ed3f4a01e26b20ae06ee54a673e1614431cb403597252f7a5caefa36da38", + "sequencer_set_verify_hash": "0x6d547e175e7a1d4b4da46abecd844564f5c7aa9da8d073003b73401042c50f80", + "startL1QueueIndex": 14 + } + ] +] diff --git a/prover/testdata/altfeetx/block_traces_329791_329791.json b/prover/testdata/altfeetx/block_traces_329791_329791.json new file mode 100644 index 000000000..029289b4f --- /dev/null +++ b/prover/testdata/altfeetx/block_traces_329791_329791.json @@ -0,0 +1,597 @@ +[ + [ + { + "chainID": 53077, + "version": "2.0.8-mainnet-49fa27bc", + "coinbase": { + "address": "0x716170d0687c3d31cc10debe0daa1ddd3fe3d792", + "nonce": 0, + "balance": "0x1fbed38436f9c721", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + "header": { + "parentHash": "0xdbff1c38e2aed29d4ad9b9d313e55f238f6a65aaf060e84948d5fcb0273f9865", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "miner": "0x0000000000000000000000000000000000000000", + "stateRoot": "0x04cd27057cc913367e0245ab79d7d1949f4915bdbc44981cd989ae60f6065390", + "transactionsRoot": "0xab43b29f8bfd60f5c1a819321f4bf2bb8a4ae95ed3fe77ed4a27dd74f4668f1d", + "receiptsRoot": "0xb9f915ac32795f804fd520b1aac55d1bf8127ba9cd60c03794bdd38897290c81", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000008000000000000000002000000000000000000000000000000000000000000010000000000000000000000000000000020000000000008000000000000000000000000000000000000000000000000000000002004000000000000000000000000000000000000002000000000000000000000000000000000000001000004000000000000000000000000000000000000000000000000000000000000000000000000000", + "difficulty": "0x0", + "number": "0x5083f", + "gasLimit": "0x3b9aca00", + "gasUsed": "0x5208", + "timestamp": "0x692fe7a6", + "extraData": "0x", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x0000000000000000", + "nextL1MsgIndex": "0xe", + "batchHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "baseFeePerGas": "0xf4240", + "withdrawalsRoot": null, + "blobGasUsed": null, + "excessBlobGas": null, + "parentBeaconBlockRoot": null, + "requestsHash": null, + "hash": "0x32150e4fd273fd84c15ca84b1575fa1c6fab2c62000ae9ddf9c550008bbf5751" + }, + "transactions": [ + { + "type": 127, + "nonce": 1065, + "txHash": "0xb2c71c8963164964a05b613d35b42c3333b95b929a9cd5030ecdbf6636452bae", + "gas": 21000, + "gasPrice": "0x77359400", + "gasTipCap": "0x3b9aca00", + "gasFeeCap": "0x77359400", + "feeTokenID": 5, + "feeLimit": "0x989680", + "from": "0xb055051fb2889be5e9831524f1624941299c49bb", + "to": "0x5add06f01e73b75a4184c8cb74485bb0a897b23e", + "chainId": "0xcf55", + "value": "0x38d7ea4c68000", + "data": "0x", + "isCreate": false, + "accessList": [], + "v": "0x0", + "r": "0x9a4c5272cb8cead875fd2a7c4c78a1923031723b24a013e93fbdf961861a29bb", + "s": "0x5c813bf697635db327b302b379c8dfad88bc86e71683322f155641831698f60f" + } + ], + "storageTrace": { + "rootBefore": "0x022d1eacc7e8ee2af159bc1279c5d812ca2ada02d880b89c014026c5856e0827", + "rootAfter": "0x04cd27057cc913367e0245ab79d7d1949f4915bdbc44981cd989ae60f6065390", + "proofs": { + "0x5300000000000000000000000000000000000001": [ + "0x0907d919f6dfce2dc7d89e8901461a7b3e91c48eb137e21af6c8d5c0e5a664ec1318e360d775d28d41f5e6ba2e6f119b1ae32977202ee93127875b98c5bc6d4a1f", + "0x091e285a0c054247aafcc4585f4d5eca266f69f65b3c5908c3289b99901598e53f205f9682352a9f3ea02978e3bccdce1cd4614711c4f45a3e8677dcae468d1682", + "0x0926daec582d0ad368ce3ed1d67e4dc24c0bdccd62d11608db237459a0797fab1a13a9601efda3832f813a4f776a5763e5f2fed5a83a605ec7aaa57d1350142408", + "0x090705cea0113a147638d3be7c6cfa08c924c5b8a832983cf4efb4e9d50532d28a0e040a41ca00083067eb14b19a451c7cf0e05bf739f6915b0f6177771802f5fe", + "0x092d4100122c3353a8f28526ceefe65940ca36418b1bffe3d5e036966ee005aa4d03fd91bfa85e92d24ecc4faaeb6022ee24b9d7e45c74f5ca5aa3d9a08b2101b6", + "0x090f1792f829e49f7ddc4363bfd5fc4b2ff99ba01195a391a871ea32e9645f4ce01bd5260d7cc00ba19d748d026db53b327e40a67896f322045fa37ac50b69ad58", + "0x090917563238627df3e543bfcc691e919d0f39a710c02243ea64bc3c9336b4fd9e24709dd93ba67cb3b801bb52cff7f48c1ac12bdc3e3944e13000e77c8bf3401b", + "0x070d2b94a19d55666528236fda1898bddf7d211baceabad89fd68feecdccb182fb2523f68a7eb14cf3681a3942c3dc9b61386017cecd6b1dfe732de6476eb72709", + "0x082043c0b5184d1bbc876966aa4555fdd464bf213095f59b93c984c65bdd951ff216f335d0dcd917173153fe3b20c1fbc5a3cdda0c00dc1506869c2543afd0002e", + "0x06139a07f81bccd48e6cb20549b10e65fe23136b43668f983aeff62ad0af93adfd0e85fcae64f44e3c2c0f52fec073576309f661dbad22b1bcd1b292bc930262b3", + "0x0427cfcbd2fe87474008e199ef5bff09273803bbf38032c75a36a7726b3c88f8a205080000000000000000000000000000000000000000000000000aec000000000000000000000000000000000000000000000000000000000000000000000000000000001311db297653267f19e944ebc886157711d99c48cdf34eaf9c3e25b5cf4f9b0f44107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f84205300000000000000000000000000000000000001000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x530000000000000000000000000000000000000f": [ + "0x0907d919f6dfce2dc7d89e8901461a7b3e91c48eb137e21af6c8d5c0e5a664ec1318e360d775d28d41f5e6ba2e6f119b1ae32977202ee93127875b98c5bc6d4a1f", + "0x091e285a0c054247aafcc4585f4d5eca266f69f65b3c5908c3289b99901598e53f205f9682352a9f3ea02978e3bccdce1cd4614711c4f45a3e8677dcae468d1682", + "0x09262884bc8cf73adf7390cf22080c71b8c0ec43be7769cffc6cb4b2ba5bdf475d2c10742d9e097fe0303088a43bd06d632237075d0953129f983944f1fe8da086", + "0x092917db2bc0345b0e4853f3738c64b2d2416e56ad49b75199ee04361d3830fbbc14d9324ee1ccde2b40e3a9636c96260928d42078e7499b0d39520203fbb16497", + "0x091aa2e7459125ac36a27e12df12830ec366ff6e52ddab465dd8ad41c576ea6f591eb287abf0022dc97801b880a992d612cd3413df725faa59fc9a424a1d82d064", + "0x0918819dfb15a5b90512cabcff8bdb40505b78fccb2c511821b16a5a096e99c7162bee81201efc661b8170dd635aecf86d593e76e5f8e40458107b46bc91a8ab26", + "0x0918feed44ae85fd99c29b4a6853aa09cef2ebff51ea5773aeaca8f5299887ed8810e3c0507354c21e5807881a746fa026b4b8339aab3be465bbe07b6ed0c27425", + "0x070000000000000000000000000000000000000000000000000000000000000000210819a999e16a1f46f3d08219832fb69e6eae2ab67bf749b015abf116278d4c", + "0x060b07422b633f67b3316792d15445d151ecbe8b07ce31264736d04f16f5edb23f0d953d2de9a6664b45242946eebe10693dd610b25dadefdf83222d76e0fd2289", + "0x0418a86f98026d1a55f6fee616f04d51be16c033651ffaafb0514287ec067d04e805080000000000000000000000000000000000000000000000000aec0000000000000000000000000000000000000000000000000000000000000000000000000000000026153e742765d1be8b6d388fe5cddbf9f2dc4450ee7f8ec94272783ce5048d4544107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f8420530000000000000000000000000000000000000f000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5300000000000000000000000000000000000017": [ + "0x0907d919f6dfce2dc7d89e8901461a7b3e91c48eb137e21af6c8d5c0e5a664ec1318e360d775d28d41f5e6ba2e6f119b1ae32977202ee93127875b98c5bc6d4a1f", + "0x091e285a0c054247aafcc4585f4d5eca266f69f65b3c5908c3289b99901598e53f205f9682352a9f3ea02978e3bccdce1cd4614711c4f45a3e8677dcae468d1682", + "0x09262884bc8cf73adf7390cf22080c71b8c0ec43be7769cffc6cb4b2ba5bdf475d2c10742d9e097fe0303088a43bd06d632237075d0953129f983944f1fe8da086", + "0x092917db2bc0345b0e4853f3738c64b2d2416e56ad49b75199ee04361d3830fbbc14d9324ee1ccde2b40e3a9636c96260928d42078e7499b0d39520203fbb16497", + "0x092518f8d92281a123ca9f8c9a10ffa90bd4166de182aa8c4592176e177d458ebf0d74823d0139022163c7afb078d0a298ade59e205a3285803d00d694f531a788", + "0x09252ed76f54141622be19600acca03942b31d6c01cdeca6137fe1b0e809c9eaa1098bc530cf79a832dff7d88ab9dc76d8be264223e36a35d189a819c1154488d8", + "0x0916b4a56bd925d2fbe81635a9384a9dd75cf83e2a444f695a6b96147a5ddb4e082f5dd93317dc453b297377e634c77d346600ba436ce802829e62677b94050743", + "0x0700000000000000000000000000000000000000000000000000000000000000001df893aae2a1745948ca56b3fed605526943240ca1a846347e2c6fa74ed44889", + "0x08240e09303236429698d29fd6ba0e53a71d61dfd7ac740c471702cfc3076d62a50000000000000000000000000000000000000000000000000000000000000000", + "0x070000000000000000000000000000000000000000000000000000000000000000297ba7a8d6fbe07c8cef12ee33e549791f6a3464ccdfccc89fc0b5ad944d8bb3", + "0x08080efc67898a2c931965c27e6d237bd7d26ac9ccc58cad4917d8bb57553071100000000000000000000000000000000000000000000000000000000000000000", + "0x071b2371fa1ee45b8c0c3d5875a2611855bee597806d1270941f182c93c7a7825313340fbcdbc78854c9f2655a9966f73c23e1d92eddd341e0da93e9d6eb2f0de2", + "0x041918c47a133f759975cc95c0dba82051d9b5cd65407e76ef1366a9deaa14f28005080000000000000000000000000000000000000000000000000aec000000000000000000000000000000000000000000000000000000000000000000000000000000001003098d9a6027ade54c3a5208d47a81c8127b06267f74bf963c29f05d11101244107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f84205300000000000000000000000000000000000017000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5300000000000000000000000000000000000021": [ + "0x0907d919f6dfce2dc7d89e8901461a7b3e91c48eb137e21af6c8d5c0e5a664ec1318e360d775d28d41f5e6ba2e6f119b1ae32977202ee93127875b98c5bc6d4a1f", + "0x090ac4610d5411803c7aa2164d156edf834a0b5dd044669490763c74bc34148a0204104166a24a37201435daa45d2c7d9f21d7d011cb097a685d0eb17a977dcc5f", + "0x092c44196a609d8853e777a45c1992ab9812253405474451f73b2c51d901d2a0e71dc9f3781baf7945495245a207a8b08cd944f2c09a5ea25b072d1dde21b81bff", + "0x0928c916c20b323297a7e36bed1a3c5872ea9d17562fb0a6e444836a924054ebb720bd0beab76f2e4805ecd3a196ac5bd179e31a8346dcbd35fbf2d11891b2585c", + "0x092da65da78b3cff5b695f2bd3c275b7d4358024657d0e14cc3458f5a017c8fa800d442e19937f6010668984415d624c2278ee41b9f85a30690328cf1df209e73a", + "0x0919fb1c690c67d149718ac5e778fd1145868e7b3ad457c76070d6ea77eb4ae47e1ac089a7e7393471f1b8213e391e776867edd4a64f3e2b36668b2d8f7d738989", + "0x07013229378490a4cceba120f9e9899c432da48a4b6b5d809af396868819ac3e492a21e214d065739f78b8680adc4f64e8dd32477820809eac089843040d8f0564", + "0x040883d4562dfe8ba7ad8176bc2844d35ecc486199d589a152eabcee8398f3aebb05080000000000000000000000000000000000000000000000000aec000000000000000000000000000000000000000000000000000000000000000000000000000000000baa6539e83c7dc7c138c3eb3dbe8657130f53f7c72c9c958d611a8c30ab233f44107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f84205300000000000000000000000000000000000021000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5add06F01e73b75A4184C8cb74485bB0A897b23E": [ + "0x0907d919f6dfce2dc7d89e8901461a7b3e91c48eb137e21af6c8d5c0e5a664ec1318e360d775d28d41f5e6ba2e6f119b1ae32977202ee93127875b98c5bc6d4a1f", + "0x090ac4610d5411803c7aa2164d156edf834a0b5dd044669490763c74bc34148a0204104166a24a37201435daa45d2c7d9f21d7d011cb097a685d0eb17a977dcc5f", + "0x0903f5d81e30e05870e33abf4cc07ffef3b022e7b830c382c8cbc22c6439bf8f64030f83fd46a40d224591afe4ff831180641ad6ac5e472e56a59f432a8a9f6595", + "0x0901fd077afc5ca4ac8d040d2f1b8d5e826436be1625cc67228e49da83546fe8f414c384f7d644b88ae4ffead574dce42fb40f70bf06c48b2f130eefe3c1d352f5", + "0x092acc48577cf2ad1cdfbc487f42ad4a5ce8fe8a7adb9f7d9ee8b916829bb8961d0ccaadf733376b76eb22ab103f97bd2dffbbd785fa127adf4446b1b59008b8c4", + "0x09169810339c5c09c14ba460d61bc52c11778b0dd75b04cb4dfa331be88c3afd830f01a3d026923d08e42986e47746b499d9d761eb5041d429d20e4b502a230609", + "0x070f48fcbcfe94d9e293618b428a44065dd774c063d8c1caefa5323018ec799d9f17dcc76b20e795474eb1aad7bbd7823cd4b849489539a0148773640ff05f440b", + "0x070000000000000000000000000000000000000000000000000000000000000000158142020867cc0d24e9b62408f6ffaa3c441756bb3cf40c2df88af3677d9a3f", + "0x09091d054de52c28af9c85eb2b9e8a264dc04ee1bdf17c1d9555dedeaff5a10dbc0de2336ed6cc6f7af14d35c543eed899daa6eb26214ee4642e037c0d071fffa9", + "0x06283465243b826f14bb66f7babd9dc61ea472872a89ef8a1e0859667f22971e351f4053c6729949cc4f377e8248e3984a14481eb44d3e9038a32c3c5a317574bd", + "0x041736e2ebcabec708f4ecce38cd9c16a8a1f6ebfa1df67ed285e8e2ef95f2aec1050800000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000024c9f7b55eafcf30000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864205add06f01e73b75a4184c8cb74485bb0a897b23e000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x6136b73372A87FBbcc428f5Ff67C753e36f3c6a0": [ + "0x0907d919f6dfce2dc7d89e8901461a7b3e91c48eb137e21af6c8d5c0e5a664ec1318e360d775d28d41f5e6ba2e6f119b1ae32977202ee93127875b98c5bc6d4a1f", + "0x090ac4610d5411803c7aa2164d156edf834a0b5dd044669490763c74bc34148a0204104166a24a37201435daa45d2c7d9f21d7d011cb097a685d0eb17a977dcc5f", + "0x092c44196a609d8853e777a45c1992ab9812253405474451f73b2c51d901d2a0e71dc9f3781baf7945495245a207a8b08cd944f2c09a5ea25b072d1dde21b81bff", + "0x0928c916c20b323297a7e36bed1a3c5872ea9d17562fb0a6e444836a924054ebb720bd0beab76f2e4805ecd3a196ac5bd179e31a8346dcbd35fbf2d11891b2585c", + "0x0917988b46350274ab2e5faf893a235c7570f927b6ae3932d606dc6d7360cac5010a3d369ea3435daa691e1aeb5452ce1101b196810721284f1e109a1dcd90b4fc", + "0x091433d9c880f3748ec65742c96c2daaac01366930c600e202c6c55d444deaf9122658eb87e64875decbbb8e87670f87f62795840ae4a2e84e408220b9d7e98cc0", + "0x09288f09de76ed8c0897860e1335daf6d09e008906e3e4131de085946dacb8b8441d0184608adccb74047b6657642465bb7b89c4a5b55d819397900116af84c670", + "0x07000000000000000000000000000000000000000000000000000000000000000022091eb39da1b1242c2a3fb74c4ef6bd240eee86581d10a54cb2fab87fdb0abc", + "0x061a996bde1f6c1f44c8f5dfbbf1d9113b11ca637fde9170f574f35c81a128d4341f6b9f1e6c2ba55dd72743962cc741c33e542afe66a6055f94dea566f1422cd9", + "0x042fadcb84a87200165907268e76c076439725ede5f8b7484787593f107d4382d3050800000000000000000000000000000000000000000000000007830000000000000001000000000000000000000000000000000000000000000000000000000000000010a8ec163dbb22741c8643589d5e9d546e8647a95ae32a08c5be90a05fb5d9988b37156d23eecc5f4dc725b655fd12920b9e594b2d7d707b006b2fc511519f5d0a1108cffae95ace28f77dee674975f9461bd7cc707c45dff3d151f10130f3cd206136b73372a87fbbcc428f5ff67c753e36f3c6a0000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x716170D0687c3d31CC10DebE0dAa1DDD3FE3D792": [ + "0x0907d919f6dfce2dc7d89e8901461a7b3e91c48eb137e21af6c8d5c0e5a664ec1318e360d775d28d41f5e6ba2e6f119b1ae32977202ee93127875b98c5bc6d4a1f", + "0x091e285a0c054247aafcc4585f4d5eca266f69f65b3c5908c3289b99901598e53f205f9682352a9f3ea02978e3bccdce1cd4614711c4f45a3e8677dcae468d1682", + "0x09262884bc8cf73adf7390cf22080c71b8c0ec43be7769cffc6cb4b2ba5bdf475d2c10742d9e097fe0303088a43bd06d632237075d0953129f983944f1fe8da086", + "0x0905c05964386c6ceaa91e691a403b41490ba625ccec420e52d39eb5aef53691a10626513e5342bb37b800f39bd2f6c9d4cd871a3a06d9fad1c0f3401c5be5999b", + "0x0913eff588f55e7c7a2f3fdb66c7e34afeb3eb8c83472b7ea6f3c5e20cfdaf27791fc630a39ae07328b9da3b7c64caa6c767f0805216c0da0947d765edd67d44bd", + "0x090fea719a68a48e9dd333707efbb005a4c81d29707e4eedad5babdbdb10448b080b9f1b4453cf781044af788aaed0ac5bcb88d1a5002ccd640ca657f3d3b8aaec", + "0x092d8cf9858ac296e55a357479747ad048821376d4f043407af9d043dd953dfb0c1b4b75bd86f411a241ba361d15c84e22c02d45ee1838a4327beed5de61454e42", + "0x0700000000000000000000000000000000000000000000000000000000000000000fd55f73d3682f1aa396111dec8471e7ae5a6026e2b3a8d44c3090519de2dbf1", + "0x062da1750dc9f7ebf795aa7f4d9ee6933579283a4242334ff38e298db642ba417222892de62f34759b7e27b1a4997007b7ff66a9e565e3983a39732db3422b4c57", + "0x0414b0bb4090afcdae623b69d996022ea82c221cd1a3c00c5b13acb37d750f87fc0508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fbed38436f9c7210000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420716170d0687c3d31cc10debe0daa1ddd3fe3d792000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xb055051fb2889Be5e9831524f1624941299C49bb": [ + "0x0907d919f6dfce2dc7d89e8901461a7b3e91c48eb137e21af6c8d5c0e5a664ec1318e360d775d28d41f5e6ba2e6f119b1ae32977202ee93127875b98c5bc6d4a1f", + "0x091e285a0c054247aafcc4585f4d5eca266f69f65b3c5908c3289b99901598e53f205f9682352a9f3ea02978e3bccdce1cd4614711c4f45a3e8677dcae468d1682", + "0x09262884bc8cf73adf7390cf22080c71b8c0ec43be7769cffc6cb4b2ba5bdf475d2c10742d9e097fe0303088a43bd06d632237075d0953129f983944f1fe8da086", + "0x092917db2bc0345b0e4853f3738c64b2d2416e56ad49b75199ee04361d3830fbbc14d9324ee1ccde2b40e3a9636c96260928d42078e7499b0d39520203fbb16497", + "0x091aa2e7459125ac36a27e12df12830ec366ff6e52ddab465dd8ad41c576ea6f591eb287abf0022dc97801b880a992d612cd3413df725faa59fc9a424a1d82d064", + "0x0918819dfb15a5b90512cabcff8bdb40505b78fccb2c511821b16a5a096e99c7162bee81201efc661b8170dd635aecf86d593e76e5f8e40458107b46bc91a8ab26", + "0x09117d192aeaa6311af3cf6179950c2d4664e3af8dc4fbf41100681584042a35dc0903270b4f08c31cac39364cd3f40f78ecc70467076a3fb9a59ab6649063bb03", + "0x061d741b029db79b9631a6164c03568163e5598506df9846ca6fa2d281f2ce95580b9ecd190aa1f1368c33d7b0a90e41b45b1a01768edac49246510bdbb87df94d", + "0x042309c8ab1f3c5435a473ea279640fbd4ebdde9ff680ac6b79971a0d96582fac80508000000000000000000000000000000000000000000000000000000000000000004290000000000000000000000000000000000000000000000006e5d32b5ad7303dc0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420b055051fb2889be5e9831524f1624941299c49bb000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "storageProofs": { + "0x5300000000000000000000000000000000000001": { + "0x0000000000000000000000000000000000000000000000000000000000000021": [ + "0x0901ac3061bae99c0d741f0e4792bc61f3bec93e3bfd4e9b1bf71c2eeac83249e102061789fdb797f8009586a28b3e7d4c68c4135ea830b033a9f25fe324965e65", + "0x09039a1d7db21776aa517761e120fde5632733c21865973139f42dd1225d899b7726294ab601fdc57919e84fa003fd3ce4c0e6cfee6ca224264e739c9bf99fb2ff", + "0x0922ef214b35725542f2c5236a9078c04cfe868c2460af073d11329f35cf5d2607172db12bf8987212e0367db213237d6a1b173dc47128739678a51d6bccfdf2a8", + "0x0700000000000000000000000000000000000000000000000000000000000000000537f9984b1cd35c20d6f780fbd8749aa9113bd2fbb9acdf16020c5495ff2df3", + "0x0805c6ac03fc8a8b84ea997df623ebf3379db02353d56e8eba20ec14491e4c562b0000000000000000000000000000000000000000000000000000000000000000", + "0x081f648065f7de77e04e42b850348f2312accd4635b3f75f4a589ed3b4e7c50d7c0000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000001a0889384c3b0cb128f42846b741bc975d22cfda4b45d366dcc85206808c6f68", + "0x07000000000000000000000000000000000000000000000000000000000000000018329b600c16bdf6169b0f4d0814187d0418ee42fbc105adf54d4b94b620ed74", + "0x0700000000000000000000000000000000000000000000000000000000000000000478e67a8cdaa52ab5fbe27e8a41204ed4fa319414c16aac6538d63f2905c2f1", + "0x062eb5eb1aaf8a82049d72b509368f65b50ab88d06282074a93e7ab30c702fcd0809b4fbe11b794c8b46f8e16f64f4e685e54255192dcea7d0f1b39baa21ccc270", + "0x042f683d080c393f5fb2ade2190fd56e8a5e8fa26533acdea8cce25caa236027cc01010000d8b1ed3f4a01e26b20ae06ee54a673e1614431cb403597252f7a5caefa36da38200000000000000000000000000000000000000000000000000000000000000021", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x530000000000000000000000000000000000000f": { + "0x0000000000000000000000000000000000000000000000000000000000000001": [ + "0x09084c55612dd3d5d693fcf7f99fe36100352956a642145a28d98c0539f0cbec2500ae2a216f67a296746c3a1c5a6d0dbf4dbe5b54faea4c279911ab6670706d8e", + "0x092d97cd795354a5a30b84fd02c9a88cffbb662ba30e270dace1e6a32df43297fb22007b8b7b52795bdee79b0a1277a8c5444fa9067a322baea00ece0558e3400b", + "0x090be43faf2770938b49bf9954f96ffb7781fe565616cc19eea1c50f5640fc04491dc5a73fb5d4f7493bf818961c71889f3564ed31a3560d4492b17e2380fb5963", + "0x0826204c54a20b8755b26c8593cbb0f6ccf9faa0d99069fc115fb5345be6e0d6c90000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000002dd3f5348ed437f041f7cbe0ebbfe32ea11debb6bd59585320c711c01fc03312", + "0x0811a12c26bdf47ee813c84db5c6a980d96fd51478295be83171b414caa96dca1f0000000000000000000000000000000000000000000000000000000000000000", + "0x07000000000000000000000000000000000000000000000000000000000000000026e550cb3f8b93622bcb2d1ad0e9e1136d301282f9656f8021918225ed057101", + "0x08095417273a9a98241a36ac71b5bd2264e369b4535dfce68c96eea4fc507ab7270000000000000000000000000000000000000000000000000000000000000000", + "0x080b06c3db82a6ce0908af547a8ac4ec566b42e67a058e66cc5180db596b94a7400000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000000bd96bdb2e373b23f31075d56a6299319285b89bac22d33dc9b6bfd2805d9050", + "0x0611741fb28e6c583a7f0d715a6c810f1fd4b42b714284dcf837adea8ba3a668f4156a0960a84fa4287f66d18b9c39ab9d403fa6b6dddd126f47758aadcb82e122", + "0x0426049ba6de63003492eb078a01a8aa4f4a0e67f28f0955c2eba9101d5d2eea50010100000000000000000000000000000000000000000000000000000000000000944f7f200000000000000000000000000000000000000000000000000000000000000001", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000002": [ + "0x09084c55612dd3d5d693fcf7f99fe36100352956a642145a28d98c0539f0cbec2500ae2a216f67a296746c3a1c5a6d0dbf4dbe5b54faea4c279911ab6670706d8e", + "0x092d97cd795354a5a30b84fd02c9a88cffbb662ba30e270dace1e6a32df43297fb22007b8b7b52795bdee79b0a1277a8c5444fa9067a322baea00ece0558e3400b", + "0x090be43faf2770938b49bf9954f96ffb7781fe565616cc19eea1c50f5640fc04491dc5a73fb5d4f7493bf818961c71889f3564ed31a3560d4492b17e2380fb5963", + "0x06060c405a93a636d8a8d0a2a74e7f7b15c776862a72b952fe807434a878ee088d1e144bbeb8f4c147dafacf9567e13b1b15e4804a9d74df2da7619735d765c1be", + "0x04020953ad52de135367a1ba2629636216ed5174cce5629d11b5d97fe733f07dcc0101000000000000000000000000000000000000000000000000000000000000000009c4200000000000000000000000000000000000000000000000000000000000000002", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000003": [ + "0x09084c55612dd3d5d693fcf7f99fe36100352956a642145a28d98c0539f0cbec2500ae2a216f67a296746c3a1c5a6d0dbf4dbe5b54faea4c279911ab6670706d8e", + "0x0700000000000000000000000000000000000000000000000000000000000000000b2f0f973417fccae039c879f858dc3ebb7f1ebf01fda9dbc71f7c54913a4297", + "0x070ee2ca3e190e48951aa8d5bb00d33ba76a92de69a807dfa6f2eaa9881e303f32140b95c8e970324b0ccea88d06f534e85d995c8639b93234a7f254fcc4ebc7ee", + "0x0406c50541f08911ad149aa545dd3d606f86ee63c751a795c7d57f0d3f85e6bdeb01010000000000000000000000000000000000000000000000000000000000003b9aca00200000000000000000000000000000000000000000000000000000000000000003", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000006": [ + "0x09084c55612dd3d5d693fcf7f99fe36100352956a642145a28d98c0539f0cbec2500ae2a216f67a296746c3a1c5a6d0dbf4dbe5b54faea4c279911ab6670706d8e", + "0x092d97cd795354a5a30b84fd02c9a88cffbb662ba30e270dace1e6a32df43297fb22007b8b7b52795bdee79b0a1277a8c5444fa9067a322baea00ece0558e3400b", + "0x090be43faf2770938b49bf9954f96ffb7781fe565616cc19eea1c50f5640fc04491dc5a73fb5d4f7493bf818961c71889f3564ed31a3560d4492b17e2380fb5963", + "0x06060c405a93a636d8a8d0a2a74e7f7b15c776862a72b952fe807434a878ee088d1e144bbeb8f4c147dafacf9567e13b1b15e4804a9d74df2da7619735d765c1be", + "0x04064ef33f6d7044a6aa1458b710bb24a531e379030cf6ca490d84fff1d8e79c9401010000000000000000000000000000000000000000000000000000000000174876e800200000000000000000000000000000000000000000000000000000000000000006", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000007": [ + "0x09084c55612dd3d5d693fcf7f99fe36100352956a642145a28d98c0539f0cbec2500ae2a216f67a296746c3a1c5a6d0dbf4dbe5b54faea4c279911ab6670706d8e", + "0x092d97cd795354a5a30b84fd02c9a88cffbb662ba30e270dace1e6a32df43297fb22007b8b7b52795bdee79b0a1277a8c5444fa9067a322baea00ece0558e3400b", + "0x0817eb488c5eacbbe8312febc6d42a18398848fc21f141a9303cf52faa1e244de50000000000000000000000000000000000000000000000000000000000000000", + "0x082119746c2afd71d1574bea80b47eab52d70db3990cd1c9f6d4df98eaed5c3ff00e7d8382b2fb64acebb539a337686f0a3a0775c6fcece0c4031269462a08edf0", + "0x040d1e80106f23933567a7c4881177b5d6c45a3f319feafe560a28df75769db9ba0101000000000000000000000000000000000000000000000000000000000636b08c8614200000000000000000000000000000000000000000000000000000000000000007", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000008": [ + "0x09084c55612dd3d5d693fcf7f99fe36100352956a642145a28d98c0539f0cbec2500ae2a216f67a296746c3a1c5a6d0dbf4dbe5b54faea4c279911ab6670706d8e", + "0x0700000000000000000000000000000000000000000000000000000000000000000b2f0f973417fccae039c879f858dc3ebb7f1ebf01fda9dbc71f7c54913a4297", + "0x070ee2ca3e190e48951aa8d5bb00d33ba76a92de69a807dfa6f2eaa9881e303f32140b95c8e970324b0ccea88d06f534e85d995c8639b93234a7f254fcc4ebc7ee", + "0x060e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b20002e15ce98746594c1414772d1a34c7ea3e78c4425a2a2188d3f2a3f2bceebec6", + "0x0412c0c59f64422dd5b7ce259c4aa62e9bf4e2bcc4f0da068e332b9f4e502ba38f0101000000000000000000000000000000000000000000000000000000000001bc65a48c200000000000000000000000000000000000000000000000000000000000000008", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000009": [ + "0x09084c55612dd3d5d693fcf7f99fe36100352956a642145a28d98c0539f0cbec2500ae2a216f67a296746c3a1c5a6d0dbf4dbe5b54faea4c279911ab6670706d8e", + "0x0700000000000000000000000000000000000000000000000000000000000000000b2f0f973417fccae039c879f858dc3ebb7f1ebf01fda9dbc71f7c54913a4297", + "0x05", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x5300000000000000000000000000000000000017": { + "0x0000000000000000000000000000000000000000000000000000000000000065": [ + "0x091bb7a17100326207252cca54cc98c3293214f00f78f0838705cb9c010ec9425903306ea60fb41692e3f39006fb0e854dc68fbd405ca2e3d49a5f12f71c4e8ebb", + "0x092868a32bf50018c0ead11533c9d5ab6fb903b3b09b0ed0eaeadcb2a24d8b1de029c7d6f42d6683d307cb5a0f54e8f9c7b16f172bc733d0ce2dc73437a36a2d48", + "0x0822ff52889832a4791479ca13912145d3a87533bbcf370741240082014f9748bc0e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200", + "0x091bb97fb18271cd4ca26a868e66ac7a2c7776b73adfe15d12e504ca401ef359e60bc7a0ba00c4d2d8976480a9f1fa930dda977b76f17b371767baf1db1afcc030", + "0x072a16cea49bf0bb77fd1cb958831a90704bb227ddfd645b17f5d559a21f53380b13edc24099a1b13d8fb640eb37b1630d58cc2c21cb2289d3dfdd48a942b7e357", + "0x0700000000000000000000000000000000000000000000000000000000000000001a6eab72d5f5f28368c1c39e305732f4650596cfb871dd7b7d1490c5e419f080", + "0x06062f41430c96c9ed21486f1cfec127cabc439f6bc6aaef5449181e35f52ed0212be55fc17d1eb7312a5105d0edb44a405d37d81b392fa71717be628a5a401f80", + "0x042115c9b0a0938aa1ce2e8c01581e5aa931288249a453588de70cf2c5dae26a7b010100006d547e175e7a1d4b4da46abecd844564f5c7aa9da8d073003b73401042c50f80200000000000000000000000000000000000000000000000000000000000000065", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x5300000000000000000000000000000000000021": { + "0x000000000000000000000000000000000000000000000000000000000000009a": [ + "0x092a76d8bd0344762abb8b43b89746a007039f07aaea92d304880c6abcf9a2c70d04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091cbcafd73a15869f9398bb2410de2817eeeff7a68be0f55e31ffc4c68d23481120031d47a0be18e8437af4e775f0e6106b981963505e4c3dc3537044eb05ea71", + "0x0921bf8a30a3d1a684baafd49ee7a13f6eedbe9b52ce362520d8442f9fe29433bf09c3876c8274155eb6d51a79d942e22e9579509ce8fbfdc296ab24f6bac8a7cf", + "0x091ac18bfbb031365e7277465e677848506bc1f80089786c1b1893fee0f96464c709bd08cfb12c05c4f3ea2c7ebc03ee9a82f31b42ccf718fcef4649d64e9dd800", + "0x0829ce85ca1679232d4d1bb506c1a4b7974d8f38b6290131ec64653da8dc30d81128b3bf9a92d906051defc60a366063e6d133f3bb15dc661dad6b57e1f51f95e6", + "0x081f9b1d6040a2a81a670747cefe745efa1e65d2bd9147581fe96782278e4d0a380000000000000000000000000000000000000000000000000000000000000000", + "0x05", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x040cf2419a167b50f7187f9a4e1a349aba510080d50f17f1ba8d50dffbc8570f": [ + "0x092a76d8bd0344762abb8b43b89746a007039f07aaea92d304880c6abcf9a2c70d04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091d97f1c4d55347b1d429c1c032640017976a1d5a4d9e7d267eaab810e76cde5410922a2f16b0d79199940d61d76b9a38b356ded2b55ef3cb9efd8d41b55cd9a1", + "0x0919192c804de24fd6bbeb6bbe3a9e3d60628368d05e485d6d5b2cb3c87db54bb6170b4d2136b00854310e3859a85e31de715b00bde4985a57d051677d2aaa0d6b", + "0x090720a2f304bf61b54f366ca4caed0022df7af1225db39d3dcd93fd06dd18c0f4132f15615440de5771eeee9e780b422a916e3d15eab9373edd505c651b30845a", + "0x0920e52eb3214da9b8d48a924ab785a532ea3cae55edb5108a8d125d1e5a6e86b8007cfded4f7cebd757480866f5d5127070ece931a42ad946d60abe95debbf48e", + "0x07287ed1b6fb6d5f229d7e85df8570a3772fcdd1b62bc08bf3ddd2283f200ae94e25993bbb8a15d4378b730479b916b4c7b943388a410553cd097d2269f00c75a8", + "0x072f370ad23f58c994fa0d2c6797cc35e189b622f62a421dcf59a7cc80d528f1d112d1a4a556b10f739fadfb5b27fd3cf6ca4fbfcd4c80b853786bb8fa166913dd", + "0x071219fa460e43f040f6c7d1399d064922284b58ae7ff9925f5554f53b5c8353b42528958aac7f0e5727f700322036868f4610338d95ae1b546f822dce3a6dd998", + "0x0620ecd8995f4c84c6dfb3dd533cd39fb56ab4aff3d11562d3a94eea5c7075a44200d0ab6cab6361278b37aff0004125c56ff999cb0a92fcfe10f37b9b17181637", + "0x040ca6e27f9c7dee896f5e908e688826d304b0ec3e9fb41e5b27c96dc66e9575ed0101000000000000000000000000000000000000000000000000000003f70f5e855b200020040cf2419a167b50f7187f9a4e1a349aba510080d50f17f1ba8d50dffbc8570f", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x6b5f06297375d15b61adb76b7c7f397921159abbd9d61e70bcce6d3401d8d7f7": [ + "0x092a76d8bd0344762abb8b43b89746a007039f07aaea92d304880c6abcf9a2c70d04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091d97f1c4d55347b1d429c1c032640017976a1d5a4d9e7d267eaab810e76cde5410922a2f16b0d79199940d61d76b9a38b356ded2b55ef3cb9efd8d41b55cd9a1", + "0x092883e6c9f8554b07276ac716a5b75dfea32ced6155a997e35b3f628f30b7dee42c3eaa894b3a3ce7148977abf5e239b1e92deabb870ebb0476962ad8d8f623ab", + "0x092a16326c64bc4d8f5a84a63b8e8393ce26a4f3d668969a2228f016fd1803884d251cf79c50546e5f56b08ac68ccd7bd4831d70d54c284f1b750dbb69f4feadf8", + "0x0913361360b28280a70100f463f377a05fc0f864ee78be95d3135888cd37da9ce41406402332274b18bc956f398d8e254c59f3ea1c57ed8a225cb72447be62dc66", + "0x07000000000000000000000000000000000000000000000000000000000000000022c061ac38d6ee6f8aa44808ad20495d65cb5da2ec6c3de987786a432d1d264a", + "0x0714d281e0192f4d77f4d2be6ab60de0794b1f35327491767d63ed45677cc0a90224d9591d6f0496da2f6ce8ce6643b25e9a3a6c53fcbb6e7968142be01fd357f5", + "0x070000000000000000000000000000000000000000000000000000000000000000248c30a413ea81e8169ddb536cfea12e3e28fd2b28f082d063acaf9733690664", + "0x080d3bc0197902434199f540d320406340d3b6a8f1a6ad9a78527d92d1d67cdb880000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000000fa8cdce486f5a168ec67cafb22c76ad34a33b7ed033328573ec2a33e2f2cc7e", + "0x062073d8a8e0a59ad42b75508162f5d8e37fd75fa628e8a81461f617743cbd274127ec10237ee9a7dcd593118472c514eb2073ee78d2004dbd33e3ea5026ec9698", + "0x040e38561fbf4e8557147e3e86e897cee231861e6b0fe1dca03f91020b74c98eff010100000000000000000000000000006136b73372a87fbbcc428f5ff67c753e36f3c6a0206b5f06297375d15b61adb76b7c7f397921159abbd9d61e70bcce6d3401d8d7f7", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x6b5f06297375d15b61adb76b7c7f397921159abbd9d61e70bcce6d3401d8d7f8": [ + "0x092a76d8bd0344762abb8b43b89746a007039f07aaea92d304880c6abcf9a2c70d04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091d97f1c4d55347b1d429c1c032640017976a1d5a4d9e7d267eaab810e76cde5410922a2f16b0d79199940d61d76b9a38b356ded2b55ef3cb9efd8d41b55cd9a1", + "0x0919192c804de24fd6bbeb6bbe3a9e3d60628368d05e485d6d5b2cb3c87db54bb6170b4d2136b00854310e3859a85e31de715b00bde4985a57d051677d2aaa0d6b", + "0x090720a2f304bf61b54f366ca4caed0022df7af1225db39d3dcd93fd06dd18c0f4132f15615440de5771eeee9e780b422a916e3d15eab9373edd505c651b30845a", + "0x0920e52eb3214da9b8d48a924ab785a532ea3cae55edb5108a8d125d1e5a6e86b8007cfded4f7cebd757480866f5d5127070ece931a42ad946d60abe95debbf48e", + "0x07287ed1b6fb6d5f229d7e85df8570a3772fcdd1b62bc08bf3ddd2283f200ae94e25993bbb8a15d4378b730479b916b4c7b943388a410553cd097d2269f00c75a8", + "0x072f370ad23f58c994fa0d2c6797cc35e189b622f62a421dcf59a7cc80d528f1d112d1a4a556b10f739fadfb5b27fd3cf6ca4fbfcd4c80b853786bb8fa166913dd", + "0x042a9fcb1d89ecdbf204c0a764c4ac130a7f87578595ec3a6490a4ba39d11f1d2d010100000000000000000000000000000000000000000000000000000de0b6b3a76400002042827daab032640470f1d393ca97b8d7389c6c9b4ac89d10071ac5a6f1d3f436", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x6b5f06297375d15b61adb76b7c7f397921159abbd9d61e70bcce6d3401d8d7f9": [ + "0x092a76d8bd0344762abb8b43b89746a007039f07aaea92d304880c6abcf9a2c70d04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091d97f1c4d55347b1d429c1c032640017976a1d5a4d9e7d267eaab810e76cde5410922a2f16b0d79199940d61d76b9a38b356ded2b55ef3cb9efd8d41b55cd9a1", + "0x0919192c804de24fd6bbeb6bbe3a9e3d60628368d05e485d6d5b2cb3c87db54bb6170b4d2136b00854310e3859a85e31de715b00bde4985a57d051677d2aaa0d6b", + "0x090c7116a446f80048f743bcbe5a6fd6f74a35235d70f146a2fbc28d39f581046a29c8e336d9a3512e280786a9936b24f5d21b7c06b079152fb0ae05cb9957b933", + "0x09124072fdca11ff038a2f3e0b8b30b3b8161c440e140d3423e16574f9f5db567b2e3af29d1dcabf89f88e26e42b502f9529c81cafc3aa75fca95ed3170847fa22", + "0x08283843aa31ecb5a830c3b7d963133c08589d5ed7cc887a7c40adf6882e49610120868d00f9fb9cd7f6701ce327574fd144a88c975e8efb95a179b66cc86dde96", + "0x041cc8f8660ff76f376e58969d35481294f9c165873778b15cb55e151828d93fb1010100000000000000000000000000000000000000000000000000000000000000000601206b5f06297375d15b61adb76b7c7f397921159abbd9d61e70bcce6d3401d8d7f9", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x6b5f06297375d15b61adb76b7c7f397921159abbd9d61e70bcce6d3401d8d7fa": [ + "0x092a76d8bd0344762abb8b43b89746a007039f07aaea92d304880c6abcf9a2c70d04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091d97f1c4d55347b1d429c1c032640017976a1d5a4d9e7d267eaab810e76cde5410922a2f16b0d79199940d61d76b9a38b356ded2b55ef3cb9efd8d41b55cd9a1", + "0x092883e6c9f8554b07276ac716a5b75dfea32ced6155a997e35b3f628f30b7dee42c3eaa894b3a3ce7148977abf5e239b1e92deabb870ebb0476962ad8d8f623ab", + "0x092a16326c64bc4d8f5a84a63b8e8393ce26a4f3d668969a2228f016fd1803884d251cf79c50546e5f56b08ac68ccd7bd4831d70d54c284f1b750dbb69f4feadf8", + "0x09052897e407fcbc56b0630c56428eae64abb5b7deadc370bc21f274a5bd35f14527876ddd9d75c6fcccd372762c3ad645195374953db62ebb3b0651fb3ddea3fa", + "0x092424d670bdb4826aecf7911e5ccf78551d9bdd981e4933e7add19fb1da35870c28232fc84ff5aff7c535ac343ad868ffbfe6df1769d9f321124c71253d19a355", + "0x0700000000000000000000000000000000000000000000000000000000000000002cff7d3f8cc946d984acb34f304a68e26dcb573ab3511fd9a2dea354a9da4e6c", + "0x08037d7dd711aa917aa750547c959ab60a71b230acb863a3edeb6d06e0269382100000000000000000000000000000000000000000000000000000000000000000", + "0x0600ed1c9aba2defd948754347649ec9263caf733d59fc0f12d709c2466395938e0e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200", + "0x04299e19c8cc1d4500da81ced802dfcb874ddba343278c85bff03349a678e2ec6701010000000000000000000000000000000000000000000000000000000000003b9aca00206b5f06297375d15b61adb76b7c7f397921159abbd9d61e70bcce6d3401d8d7fa", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x6136b73372A87FBbcc428f5Ff67C753e36f3c6a0": { + "0x2bc0a6c7d79a49c3ae960abc1b08ccd6c0b844abaa810594f68fdefc701b92d6": [ + "0x081c2ebec9addbb579f27f1a714caed7d81df0447a4f1e48ce76573c6ba9fc7e4a1647e2c99aa546ad0049820cc5aa92d585e6e8b6873fba6753bf0bfb6896274b", + "0x092ba648c617dd5b36d5723e907089ac23ec9bae5accae9ee06dc61a5bcdce1c110acc9fc3a0cca510cc3e2c9d38ba44a2ade6faababa8601e932882d7ba04b075", + "0x08026b3d132929c29b2d8171db2b89bc4e89979b93651dbb04f555bc0d60250889070b1ab702ee0aa92f1a83b4f787a886f8e1d7d78ff75aa7aed73baa8185bd33", + "0x06142f0b3733ee69988305ea3248faa12b8ed9749cb732e28a1b6aebd18c6eb0d11d39a92d62e506f13adc048ce1a7d357dd76c07421465e16339616f96eeb8aee", + "0x0429d8c87e5e7036a7ccbd5754f78c1d9a8cb750530e9a5a03d1c4a92b326ac35a0101000000000000000000000000000000000000000000000000000000000000014c5c02202bc0a6c7d79a49c3ae960abc1b08ccd6c0b844abaa810594f68fdefc701b92d6", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xed3b720424f8e7d811b36ea6ea06ba9dbb304fb353fe36fff4d75ce3b5706137": [ + "0x081c2ebec9addbb579f27f1a714caed7d81df0447a4f1e48ce76573c6ba9fc7e4a1647e2c99aa546ad0049820cc5aa92d585e6e8b6873fba6753bf0bfb6896274b", + "0x092ba648c617dd5b36d5723e907089ac23ec9bae5accae9ee06dc61a5bcdce1c110acc9fc3a0cca510cc3e2c9d38ba44a2ade6faababa8601e932882d7ba04b075", + "0x08026b3d132929c29b2d8171db2b89bc4e89979b93651dbb04f555bc0d60250889070b1ab702ee0aa92f1a83b4f787a886f8e1d7d78ff75aa7aed73baa8185bd33", + "0x0424f6c97e04f23262b2b294f40f6a3972028a8f43c4b755fd9f5017d2cc3373c601010000000000000000000000000000000000000000000000000000000000e90ef37dfe20ed3b720424f8e7d811b36ea6ea06ba9dbb304fb353fe36fff4d75ce3b5706137", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + } + } + }, + "codes": [ + { + "codeSize": 0, + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "code": "0x" + }, + { + "codeSize": 0, + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "code": "0x" + }, + { + "codeSize": 1923, + "keccakCodeHash": "0x8b37156d23eecc5f4dc725b655fd12920b9e594b2d7d707b006b2fc511519f5d", + "hash": "0x0a1108cffae95ace28f77dee674975f9461bd7cc707c45dff3d151f10130f3cd", + "code": "0x608060405234801561000f575f80fd5b506004361061009b575f3560e01c806340c10f191161006357806340c10f191461012957806370a082311461013e57806395d89b411461015d578063a9059cbb14610165578063dd62ed3e14610178575f80fd5b806306fdde031461009f578063095ea7b3146100bd57806318160ddd146100e057806323b872dd146100f7578063313ce5671461010a575b5f80fd5b6100a76101a2565b6040516100b491906105c3565b60405180910390f35b6100d06100cb366004610629565b61022d565b60405190151581526020016100b4565b6100e960035481565b6040519081526020016100b4565b6100d0610105366004610651565b610299565b6002546101179060ff1681565b60405160ff90911681526020016100b4565b61013c610137366004610629565b61044f565b005b6100e961014c36600461068a565b60046020525f908152604090205481565b6100a76104d5565b6100d0610173366004610629565b6104e2565b6100e96101863660046106aa565b600560209081525f928352604080842090915290825290205481565b5f80546101ae906106db565b80601f01602080910402602001604051908101604052809291908181526020018280546101da906106db565b80156102255780601f106101fc57610100808354040283529160200191610225565b820191905f5260205f20905b81548152906001019060200180831161020857829003601f168201915b505050505081565b335f8181526005602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906102879086815260200190565b60405180910390a35060015b92915050565b6001600160a01b0383165f908152600460205260408120548211156102fc5760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b60448201526064015b60405180910390fd5b6001600160a01b0384165f9081526005602090815260408083203384529091529020548211156103675760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b60448201526064016102f3565b6001600160a01b0384165f908152600460205260408120805484929061038e908490610727565b90915550506001600160a01b0383165f90815260046020526040812080548492906103ba90849061073a565b90915550506001600160a01b0384165f908152600560209081526040808320338452909152812080548492906103f1908490610727565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161043d91815260200190565b60405180910390a35060019392505050565b8060035f828254610460919061073a565b90915550506001600160a01b0382165f908152600460205260408120805483929061048c90849061073a565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600180546101ae906106db565b335f908152600460205260408120548211156105375760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b60448201526064016102f3565b335f9081526004602052604081208054849290610555908490610727565b90915550506001600160a01b0383165f908152600460205260408120805484929061058190849061073a565b90915550506040518281526001600160a01b0384169033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610287565b5f6020808352835180828501525f5b818110156105ee578581018301518582016040015282016105d2565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610624575f80fd5b919050565b5f806040838503121561063a575f80fd5b6106438361060e565b946020939093013593505050565b5f805f60608486031215610663575f80fd5b61066c8461060e565b925061067a6020850161060e565b9150604084013590509250925092565b5f6020828403121561069a575f80fd5b6106a38261060e565b9392505050565b5f80604083850312156106bb575f80fd5b6106c48361060e565b91506106d26020840161060e565b90509250929050565b600181811c908216806106ef57607f821691505b60208210810361070d57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561029357610293610713565b808201808211156102935761029361071356fea264697066735822122037b5e8204352efb74ca0aabb5eeb6432aec1c80cfe9987543bd70804bea0ff7364736f6c63430008140033" + }, + { + "codeSize": 2796, + "keccakCodeHash": "0x44107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d5", + "hash": "0x18d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f84", + "code": "0x60806040523661001357610011610017565b005b6100115b61001f6102a0565b73ffffffffffffffffffffffffffffffffffffffff1633036102965760607fffffffff000000000000000000000000000000000000000000000000000000005f35167fc9a6301a000000000000000000000000000000000000000000000000000000008101610097576100906102df565b915061028e565b7fb0e10d7a000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216016100e857610090610332565b7f70d7c690000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160161013957610090610376565b7f07ae5bc0000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160161018a576100906103a6565b7fa39f25e5000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216016101db576100906103f2565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b815160208301f35b61029e610405565b565b5f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b60606102e9610415565b5f6102f736600481846108bc565b810190610304919061090b565b905061031f8160405180602001604052805f8152505f61041f565b505060408051602081019091525f815290565b60605f8061034336600481846108bc565b8101906103509190610951565b915091506103608282600161041f565b60405180602001604052805f8152509250505090565b6060610380610415565b5f61038e36600481846108bc565b81019061039b919061090b565b905061031f8161044a565b60606103b0610415565b5f6103b96102a0565b6040805173ffffffffffffffffffffffffffffffffffffffff831660208201529192500160405160208183030381529060405291505090565b60606103fc610415565b5f6103b96104ae565b61029e6104106104ae565b6104bc565b341561029e575f80fd5b610428836104da565b5f825111806104345750805b15610445576104438383610526565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6104736102a0565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a16104ab81610552565b50565b5f6104b761065e565b905090565b365f80375f80365f845af43d5f803e8080156104d6573d5ff35b3d5ffd5b6104e381610685565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b606061054b8383604051806060016040528060278152602001610ab960279139610750565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81166105f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610285565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6102c3565b73ffffffffffffffffffffffffffffffffffffffff81163b610729576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610285565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610618565b60605f808573ffffffffffffffffffffffffffffffffffffffff16856040516107799190610a4d565b5f60405180830381855af49150503d805f81146107b1576040519150601f19603f3d011682016040523d82523d5f602084013e6107b6565b606091505b50915091506107c7868383876107d1565b9695505050505050565b606083156108665782515f0361085f5773ffffffffffffffffffffffffffffffffffffffff85163b61085f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610285565b5081610870565b6108708383610878565b949350505050565b8151156108885781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102859190610a68565b5f80858511156108ca575f80fd5b838611156108d6575f80fd5b5050820193919092039150565b803573ffffffffffffffffffffffffffffffffffffffff81168114610906575f80fd5b919050565b5f6020828403121561091b575f80fd5b61054b826108e3565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f8060408385031215610962575f80fd5b61096b836108e3565b9150602083013567ffffffffffffffff80821115610987575f80fd5b818501915085601f83011261099a575f80fd5b8135818111156109ac576109ac610924565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156109f2576109f2610924565b81604052828152886020848701011115610a0a575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f5b83811015610a45578181015183820152602001610a2d565b50505f910152565b5f8251610a5e818460208701610a2b565b9190910192915050565b602081525f8251806020840152610a86816040850160208701610a2b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a164736f6c6343000818000a" + } + ], + "txStorageTraces": [ + { + "rootBefore": "0x022d1eacc7e8ee2af159bc1279c5d812ca2ada02d880b89c014026c5856e0827", + "rootAfter": "0x04cd27057cc913367e0245ab79d7d1949f4915bdbc44981cd989ae60f6065390", + "proofs": { + "0x5add06F01e73b75A4184C8cb74485bB0A897b23E": [ + "0x0907d919f6dfce2dc7d89e8901461a7b3e91c48eb137e21af6c8d5c0e5a664ec1318e360d775d28d41f5e6ba2e6f119b1ae32977202ee93127875b98c5bc6d4a1f", + "0x090ac4610d5411803c7aa2164d156edf834a0b5dd044669490763c74bc34148a0204104166a24a37201435daa45d2c7d9f21d7d011cb097a685d0eb17a977dcc5f", + "0x0903f5d81e30e05870e33abf4cc07ffef3b022e7b830c382c8cbc22c6439bf8f64030f83fd46a40d224591afe4ff831180641ad6ac5e472e56a59f432a8a9f6595", + "0x0901fd077afc5ca4ac8d040d2f1b8d5e826436be1625cc67228e49da83546fe8f414c384f7d644b88ae4ffead574dce42fb40f70bf06c48b2f130eefe3c1d352f5", + "0x092acc48577cf2ad1cdfbc487f42ad4a5ce8fe8a7adb9f7d9ee8b916829bb8961d0ccaadf733376b76eb22ab103f97bd2dffbbd785fa127adf4446b1b59008b8c4", + "0x09169810339c5c09c14ba460d61bc52c11778b0dd75b04cb4dfa331be88c3afd830f01a3d026923d08e42986e47746b499d9d761eb5041d429d20e4b502a230609", + "0x070f48fcbcfe94d9e293618b428a44065dd774c063d8c1caefa5323018ec799d9f17dcc76b20e795474eb1aad7bbd7823cd4b849489539a0148773640ff05f440b", + "0x070000000000000000000000000000000000000000000000000000000000000000158142020867cc0d24e9b62408f6ffaa3c441756bb3cf40c2df88af3677d9a3f", + "0x09091d054de52c28af9c85eb2b9e8a264dc04ee1bdf17c1d9555dedeaff5a10dbc0de2336ed6cc6f7af14d35c543eed899daa6eb26214ee4642e037c0d071fffa9", + "0x06283465243b826f14bb66f7babd9dc61ea472872a89ef8a1e0859667f22971e351f4053c6729949cc4f377e8248e3984a14481eb44d3e9038a32c3c5a317574bd", + "0x041736e2ebcabec708f4ecce38cd9c16a8a1f6ebfa1df67ed285e8e2ef95f2aec1050800000000000000000000000000000000000000000000000000000000000000000003000000000000000000000000000000000000000000000000024c9f7b55eafcf30000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864205add06f01e73b75a4184c8cb74485bb0a897b23e000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x6136b73372A87FBbcc428f5Ff67C753e36f3c6a0": [ + "0x0907d919f6dfce2dc7d89e8901461a7b3e91c48eb137e21af6c8d5c0e5a664ec1318e360d775d28d41f5e6ba2e6f119b1ae32977202ee93127875b98c5bc6d4a1f", + "0x090ac4610d5411803c7aa2164d156edf834a0b5dd044669490763c74bc34148a0204104166a24a37201435daa45d2c7d9f21d7d011cb097a685d0eb17a977dcc5f", + "0x092c44196a609d8853e777a45c1992ab9812253405474451f73b2c51d901d2a0e71dc9f3781baf7945495245a207a8b08cd944f2c09a5ea25b072d1dde21b81bff", + "0x0928c916c20b323297a7e36bed1a3c5872ea9d17562fb0a6e444836a924054ebb720bd0beab76f2e4805ecd3a196ac5bd179e31a8346dcbd35fbf2d11891b2585c", + "0x0917988b46350274ab2e5faf893a235c7570f927b6ae3932d606dc6d7360cac5010a3d369ea3435daa691e1aeb5452ce1101b196810721284f1e109a1dcd90b4fc", + "0x091433d9c880f3748ec65742c96c2daaac01366930c600e202c6c55d444deaf9122658eb87e64875decbbb8e87670f87f62795840ae4a2e84e408220b9d7e98cc0", + "0x09288f09de76ed8c0897860e1335daf6d09e008906e3e4131de085946dacb8b8441d0184608adccb74047b6657642465bb7b89c4a5b55d819397900116af84c670", + "0x07000000000000000000000000000000000000000000000000000000000000000022091eb39da1b1242c2a3fb74c4ef6bd240eee86581d10a54cb2fab87fdb0abc", + "0x061a996bde1f6c1f44c8f5dfbbf1d9113b11ca637fde9170f574f35c81a128d4341f6b9f1e6c2ba55dd72743962cc741c33e542afe66a6055f94dea566f1422cd9", + "0x042fadcb84a87200165907268e76c076439725ede5f8b7484787593f107d4382d3050800000000000000000000000000000000000000000000000007830000000000000001000000000000000000000000000000000000000000000000000000000000000010a8ec163dbb22741c8643589d5e9d546e8647a95ae32a08c5be90a05fb5d9988b37156d23eecc5f4dc725b655fd12920b9e594b2d7d707b006b2fc511519f5d0a1108cffae95ace28f77dee674975f9461bd7cc707c45dff3d151f10130f3cd206136b73372a87fbbcc428f5ff67c753e36f3c6a0000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x716170D0687c3d31CC10DebE0dAa1DDD3FE3D792": [ + "0x0907d919f6dfce2dc7d89e8901461a7b3e91c48eb137e21af6c8d5c0e5a664ec1318e360d775d28d41f5e6ba2e6f119b1ae32977202ee93127875b98c5bc6d4a1f", + "0x091e285a0c054247aafcc4585f4d5eca266f69f65b3c5908c3289b99901598e53f205f9682352a9f3ea02978e3bccdce1cd4614711c4f45a3e8677dcae468d1682", + "0x09262884bc8cf73adf7390cf22080c71b8c0ec43be7769cffc6cb4b2ba5bdf475d2c10742d9e097fe0303088a43bd06d632237075d0953129f983944f1fe8da086", + "0x0905c05964386c6ceaa91e691a403b41490ba625ccec420e52d39eb5aef53691a10626513e5342bb37b800f39bd2f6c9d4cd871a3a06d9fad1c0f3401c5be5999b", + "0x0913eff588f55e7c7a2f3fdb66c7e34afeb3eb8c83472b7ea6f3c5e20cfdaf27791fc630a39ae07328b9da3b7c64caa6c767f0805216c0da0947d765edd67d44bd", + "0x090fea719a68a48e9dd333707efbb005a4c81d29707e4eedad5babdbdb10448b080b9f1b4453cf781044af788aaed0ac5bcb88d1a5002ccd640ca657f3d3b8aaec", + "0x092d8cf9858ac296e55a357479747ad048821376d4f043407af9d043dd953dfb0c1b4b75bd86f411a241ba361d15c84e22c02d45ee1838a4327beed5de61454e42", + "0x0700000000000000000000000000000000000000000000000000000000000000000fd55f73d3682f1aa396111dec8471e7ae5a6026e2b3a8d44c3090519de2dbf1", + "0x062da1750dc9f7ebf795aa7f4d9ee6933579283a4242334ff38e298db642ba417222892de62f34759b7e27b1a4997007b7ff66a9e565e3983a39732db3422b4c57", + "0x0414b0bb4090afcdae623b69d996022ea82c221cd1a3c00c5b13acb37d750f87fc0508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fbed38436f9c7210000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420716170d0687c3d31cc10debe0daa1ddd3fe3d792000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xb055051fb2889Be5e9831524f1624941299C49bb": [ + "0x0907d919f6dfce2dc7d89e8901461a7b3e91c48eb137e21af6c8d5c0e5a664ec1318e360d775d28d41f5e6ba2e6f119b1ae32977202ee93127875b98c5bc6d4a1f", + "0x091e285a0c054247aafcc4585f4d5eca266f69f65b3c5908c3289b99901598e53f205f9682352a9f3ea02978e3bccdce1cd4614711c4f45a3e8677dcae468d1682", + "0x09262884bc8cf73adf7390cf22080c71b8c0ec43be7769cffc6cb4b2ba5bdf475d2c10742d9e097fe0303088a43bd06d632237075d0953129f983944f1fe8da086", + "0x092917db2bc0345b0e4853f3738c64b2d2416e56ad49b75199ee04361d3830fbbc14d9324ee1ccde2b40e3a9636c96260928d42078e7499b0d39520203fbb16497", + "0x091aa2e7459125ac36a27e12df12830ec366ff6e52ddab465dd8ad41c576ea6f591eb287abf0022dc97801b880a992d612cd3413df725faa59fc9a424a1d82d064", + "0x0918819dfb15a5b90512cabcff8bdb40505b78fccb2c511821b16a5a096e99c7162bee81201efc661b8170dd635aecf86d593e76e5f8e40458107b46bc91a8ab26", + "0x09117d192aeaa6311af3cf6179950c2d4664e3af8dc4fbf41100681584042a35dc0903270b4f08c31cac39364cd3f40f78ecc70467076a3fb9a59ab6649063bb03", + "0x061d741b029db79b9631a6164c03568163e5598506df9846ca6fa2d281f2ce95580b9ecd190aa1f1368c33d7b0a90e41b45b1a01768edac49246510bdbb87df94d", + "0x042309c8ab1f3c5435a473ea279640fbd4ebdde9ff680ac6b79971a0d96582fac80508000000000000000000000000000000000000000000000000000000000000000004290000000000000000000000000000000000000000000000006e5d32b5ad7303dc0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420b055051fb2889be5e9831524f1624941299c49bb000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "storageProofs": { + "0x5300000000000000000000000000000000000021": { + "0x040cf2419a167b50f7187f9a4e1a349aba510080d50f17f1ba8d50dffbc8570f": [ + "0x092a76d8bd0344762abb8b43b89746a007039f07aaea92d304880c6abcf9a2c70d04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091d97f1c4d55347b1d429c1c032640017976a1d5a4d9e7d267eaab810e76cde5410922a2f16b0d79199940d61d76b9a38b356ded2b55ef3cb9efd8d41b55cd9a1", + "0x0919192c804de24fd6bbeb6bbe3a9e3d60628368d05e485d6d5b2cb3c87db54bb6170b4d2136b00854310e3859a85e31de715b00bde4985a57d051677d2aaa0d6b", + "0x090720a2f304bf61b54f366ca4caed0022df7af1225db39d3dcd93fd06dd18c0f4132f15615440de5771eeee9e780b422a916e3d15eab9373edd505c651b30845a", + "0x0920e52eb3214da9b8d48a924ab785a532ea3cae55edb5108a8d125d1e5a6e86b8007cfded4f7cebd757480866f5d5127070ece931a42ad946d60abe95debbf48e", + "0x07287ed1b6fb6d5f229d7e85df8570a3772fcdd1b62bc08bf3ddd2283f200ae94e25993bbb8a15d4378b730479b916b4c7b943388a410553cd097d2269f00c75a8", + "0x072f370ad23f58c994fa0d2c6797cc35e189b622f62a421dcf59a7cc80d528f1d112d1a4a556b10f739fadfb5b27fd3cf6ca4fbfcd4c80b853786bb8fa166913dd", + "0x071219fa460e43f040f6c7d1399d064922284b58ae7ff9925f5554f53b5c8353b42528958aac7f0e5727f700322036868f4610338d95ae1b546f822dce3a6dd998", + "0x0620ecd8995f4c84c6dfb3dd533cd39fb56ab4aff3d11562d3a94eea5c7075a44200d0ab6cab6361278b37aff0004125c56ff999cb0a92fcfe10f37b9b17181637", + "0x040ca6e27f9c7dee896f5e908e688826d304b0ec3e9fb41e5b27c96dc66e9575ed0101000000000000000000000000000000000000000000000000000003f70f5e855b200020040cf2419a167b50f7187f9a4e1a349aba510080d50f17f1ba8d50dffbc8570f", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x6b5f06297375d15b61adb76b7c7f397921159abbd9d61e70bcce6d3401d8d7f7": [ + "0x092a76d8bd0344762abb8b43b89746a007039f07aaea92d304880c6abcf9a2c70d04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091d97f1c4d55347b1d429c1c032640017976a1d5a4d9e7d267eaab810e76cde5410922a2f16b0d79199940d61d76b9a38b356ded2b55ef3cb9efd8d41b55cd9a1", + "0x092883e6c9f8554b07276ac716a5b75dfea32ced6155a997e35b3f628f30b7dee42c3eaa894b3a3ce7148977abf5e239b1e92deabb870ebb0476962ad8d8f623ab", + "0x092a16326c64bc4d8f5a84a63b8e8393ce26a4f3d668969a2228f016fd1803884d251cf79c50546e5f56b08ac68ccd7bd4831d70d54c284f1b750dbb69f4feadf8", + "0x0913361360b28280a70100f463f377a05fc0f864ee78be95d3135888cd37da9ce41406402332274b18bc956f398d8e254c59f3ea1c57ed8a225cb72447be62dc66", + "0x07000000000000000000000000000000000000000000000000000000000000000022c061ac38d6ee6f8aa44808ad20495d65cb5da2ec6c3de987786a432d1d264a", + "0x0714d281e0192f4d77f4d2be6ab60de0794b1f35327491767d63ed45677cc0a90224d9591d6f0496da2f6ce8ce6643b25e9a3a6c53fcbb6e7968142be01fd357f5", + "0x070000000000000000000000000000000000000000000000000000000000000000248c30a413ea81e8169ddb536cfea12e3e28fd2b28f082d063acaf9733690664", + "0x080d3bc0197902434199f540d320406340d3b6a8f1a6ad9a78527d92d1d67cdb880000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000000fa8cdce486f5a168ec67cafb22c76ad34a33b7ed033328573ec2a33e2f2cc7e", + "0x062073d8a8e0a59ad42b75508162f5d8e37fd75fa628e8a81461f617743cbd274127ec10237ee9a7dcd593118472c514eb2073ee78d2004dbd33e3ea5026ec9698", + "0x040e38561fbf4e8557147e3e86e897cee231861e6b0fe1dca03f91020b74c98eff010100000000000000000000000000006136b73372a87fbbcc428f5ff67c753e36f3c6a0206b5f06297375d15b61adb76b7c7f397921159abbd9d61e70bcce6d3401d8d7f7", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x6b5f06297375d15b61adb76b7c7f397921159abbd9d61e70bcce6d3401d8d7f8": [ + "0x092a76d8bd0344762abb8b43b89746a007039f07aaea92d304880c6abcf9a2c70d04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091d97f1c4d55347b1d429c1c032640017976a1d5a4d9e7d267eaab810e76cde5410922a2f16b0d79199940d61d76b9a38b356ded2b55ef3cb9efd8d41b55cd9a1", + "0x0919192c804de24fd6bbeb6bbe3a9e3d60628368d05e485d6d5b2cb3c87db54bb6170b4d2136b00854310e3859a85e31de715b00bde4985a57d051677d2aaa0d6b", + "0x090720a2f304bf61b54f366ca4caed0022df7af1225db39d3dcd93fd06dd18c0f4132f15615440de5771eeee9e780b422a916e3d15eab9373edd505c651b30845a", + "0x0920e52eb3214da9b8d48a924ab785a532ea3cae55edb5108a8d125d1e5a6e86b8007cfded4f7cebd757480866f5d5127070ece931a42ad946d60abe95debbf48e", + "0x07287ed1b6fb6d5f229d7e85df8570a3772fcdd1b62bc08bf3ddd2283f200ae94e25993bbb8a15d4378b730479b916b4c7b943388a410553cd097d2269f00c75a8", + "0x072f370ad23f58c994fa0d2c6797cc35e189b622f62a421dcf59a7cc80d528f1d112d1a4a556b10f739fadfb5b27fd3cf6ca4fbfcd4c80b853786bb8fa166913dd", + "0x042a9fcb1d89ecdbf204c0a764c4ac130a7f87578595ec3a6490a4ba39d11f1d2d010100000000000000000000000000000000000000000000000000000de0b6b3a76400002042827daab032640470f1d393ca97b8d7389c6c9b4ac89d10071ac5a6f1d3f436", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x6b5f06297375d15b61adb76b7c7f397921159abbd9d61e70bcce6d3401d8d7f9": [ + "0x092a76d8bd0344762abb8b43b89746a007039f07aaea92d304880c6abcf9a2c70d04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091d97f1c4d55347b1d429c1c032640017976a1d5a4d9e7d267eaab810e76cde5410922a2f16b0d79199940d61d76b9a38b356ded2b55ef3cb9efd8d41b55cd9a1", + "0x0919192c804de24fd6bbeb6bbe3a9e3d60628368d05e485d6d5b2cb3c87db54bb6170b4d2136b00854310e3859a85e31de715b00bde4985a57d051677d2aaa0d6b", + "0x090c7116a446f80048f743bcbe5a6fd6f74a35235d70f146a2fbc28d39f581046a29c8e336d9a3512e280786a9936b24f5d21b7c06b079152fb0ae05cb9957b933", + "0x09124072fdca11ff038a2f3e0b8b30b3b8161c440e140d3423e16574f9f5db567b2e3af29d1dcabf89f88e26e42b502f9529c81cafc3aa75fca95ed3170847fa22", + "0x08283843aa31ecb5a830c3b7d963133c08589d5ed7cc887a7c40adf6882e49610120868d00f9fb9cd7f6701ce327574fd144a88c975e8efb95a179b66cc86dde96", + "0x041cc8f8660ff76f376e58969d35481294f9c165873778b15cb55e151828d93fb1010100000000000000000000000000000000000000000000000000000000000000000601206b5f06297375d15b61adb76b7c7f397921159abbd9d61e70bcce6d3401d8d7f9", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x6b5f06297375d15b61adb76b7c7f397921159abbd9d61e70bcce6d3401d8d7fa": [ + "0x092a76d8bd0344762abb8b43b89746a007039f07aaea92d304880c6abcf9a2c70d04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091d97f1c4d55347b1d429c1c032640017976a1d5a4d9e7d267eaab810e76cde5410922a2f16b0d79199940d61d76b9a38b356ded2b55ef3cb9efd8d41b55cd9a1", + "0x092883e6c9f8554b07276ac716a5b75dfea32ced6155a997e35b3f628f30b7dee42c3eaa894b3a3ce7148977abf5e239b1e92deabb870ebb0476962ad8d8f623ab", + "0x092a16326c64bc4d8f5a84a63b8e8393ce26a4f3d668969a2228f016fd1803884d251cf79c50546e5f56b08ac68ccd7bd4831d70d54c284f1b750dbb69f4feadf8", + "0x09052897e407fcbc56b0630c56428eae64abb5b7deadc370bc21f274a5bd35f14527876ddd9d75c6fcccd372762c3ad645195374953db62ebb3b0651fb3ddea3fa", + "0x092424d670bdb4826aecf7911e5ccf78551d9bdd981e4933e7add19fb1da35870c28232fc84ff5aff7c535ac343ad868ffbfe6df1769d9f321124c71253d19a355", + "0x0700000000000000000000000000000000000000000000000000000000000000002cff7d3f8cc946d984acb34f304a68e26dcb573ab3511fd9a2dea354a9da4e6c", + "0x08037d7dd711aa917aa750547c959ab60a71b230acb863a3edeb6d06e0269382100000000000000000000000000000000000000000000000000000000000000000", + "0x0600ed1c9aba2defd948754347649ec9263caf733d59fc0f12d709c2466395938e0e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200", + "0x04299e19c8cc1d4500da81ced802dfcb874ddba343278c85bff03349a678e2ec6701010000000000000000000000000000000000000000000000000000000000003b9aca00206b5f06297375d15b61adb76b7c7f397921159abbd9d61e70bcce6d3401d8d7fa", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x6136b73372A87FBbcc428f5Ff67C753e36f3c6a0": { + "0x2bc0a6c7d79a49c3ae960abc1b08ccd6c0b844abaa810594f68fdefc701b92d6": [ + "0x081c2ebec9addbb579f27f1a714caed7d81df0447a4f1e48ce76573c6ba9fc7e4a1647e2c99aa546ad0049820cc5aa92d585e6e8b6873fba6753bf0bfb6896274b", + "0x092ba648c617dd5b36d5723e907089ac23ec9bae5accae9ee06dc61a5bcdce1c110acc9fc3a0cca510cc3e2c9d38ba44a2ade6faababa8601e932882d7ba04b075", + "0x08026b3d132929c29b2d8171db2b89bc4e89979b93651dbb04f555bc0d60250889070b1ab702ee0aa92f1a83b4f787a886f8e1d7d78ff75aa7aed73baa8185bd33", + "0x06142f0b3733ee69988305ea3248faa12b8ed9749cb732e28a1b6aebd18c6eb0d11d39a92d62e506f13adc048ce1a7d357dd76c07421465e16339616f96eeb8aee", + "0x0429d8c87e5e7036a7ccbd5754f78c1d9a8cb750530e9a5a03d1c4a92b326ac35a0101000000000000000000000000000000000000000000000000000000000000014c5c02202bc0a6c7d79a49c3ae960abc1b08ccd6c0b844abaa810594f68fdefc701b92d6", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xed3b720424f8e7d811b36ea6ea06ba9dbb304fb353fe36fff4d75ce3b5706137": [ + "0x081c2ebec9addbb579f27f1a714caed7d81df0447a4f1e48ce76573c6ba9fc7e4a1647e2c99aa546ad0049820cc5aa92d585e6e8b6873fba6753bf0bfb6896274b", + "0x092ba648c617dd5b36d5723e907089ac23ec9bae5accae9ee06dc61a5bcdce1c110acc9fc3a0cca510cc3e2c9d38ba44a2ade6faababa8601e932882d7ba04b075", + "0x08026b3d132929c29b2d8171db2b89bc4e89979b93651dbb04f555bc0d60250889070b1ab702ee0aa92f1a83b4f787a886f8e1d7d78ff75aa7aed73baa8185bd33", + "0x0424f6c97e04f23262b2b294f40f6a3972028a8f43c4b755fd9f5017d2cc3373c601010000000000000000000000000000000000000000000000000000000000e90ef37dfe20ed3b720424f8e7d811b36ea6ea06ba9dbb304fb353fe36fff4d75ce3b5706137", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + } + } + } + ], + "executionResults": [ + { + "l1DataFee": "0x54d2890a228d", + "feeTokenID": 5, + "feeRate": "0x3f70f5e855b2000", + "tokenScale": "0x3b9aca00", + "feeLimit": "0x989680", + "gas": 21000, + "failed": false, + "returnValue": "", + "from": { + "address": "0xb055051fb2889be5e9831524f1624941299c49bb", + "nonce": 1065, + "balance": "0x6e5d32b5ad7303dc", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + "to": { + "address": "0x5add06f01e73b75a4184c8cb74485bb0a897b23e", + "nonce": 3, + "balance": "0x24c9f7b55eafcf3", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + "accountAfter": [ + { + "address": "0xb055051fb2889be5e9831524f1624941299c49bb", + "nonce": 1066, + "balance": "0x6e59a53708ac83dc", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + { + "address": "0x5add06f01e73b75a4184c8cb74485bb0a897b23e", + "nonce": 3, + "balance": "0x2502cf9fab17cf3", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + { + "address": "0x716170d0687c3d31cc10debe0daa1ddd3fe3d792", + "nonce": 0, + "balance": "0x1fbed38436f9c721", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + } + ], + "structLogs": [], + "callTrace": { + "from": "0xb055051fb2889be5e9831524f1624941299c49bb", + "gas": "0x5208", + "gasUsed": "0x5208", + "to": "0x5add06f01e73b75a4184c8cb74485bb0a897b23e", + "input": "0x", + "value": "0x38d7ea4c68000", + "type": "CALL" + } + } + ], + "withdraw_trie_root": "0xd8b1ed3f4a01e26b20ae06ee54a673e1614431cb403597252f7a5caefa36da38", + "sequencer_set_verify_hash": "0x6d547e175e7a1d4b4da46abecd844564f5c7aa9da8d073003b73401042c50f80", + "startL1QueueIndex": 14 + } + ] +] diff --git a/prover/testdata/altfeetx/block_traces_341111_341111.json b/prover/testdata/altfeetx/block_traces_341111_341111.json new file mode 100644 index 000000000..f5c85ced3 --- /dev/null +++ b/prover/testdata/altfeetx/block_traces_341111_341111.json @@ -0,0 +1,6491 @@ +[ + [ + { + "chainID": 53077, + "version": "2.0.8-mainnet-49fa27bc", + "coinbase": { + "address": "0x716170d0687c3d31cc10debe0daa1ddd3fe3d792", + "nonce": 0, + "balance": "0x1fddc5feee35b276", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + "header": { + "parentHash": "0xbb0dcdec8b2428edacfd2ac8bdea50ffcfc827e5dc615c854679d45ccfb21f38", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "miner": "0x0000000000000000000000000000000000000000", + "stateRoot": "0x1449e3da6128f8e6ad61271ce88f904f87515efbc26816317a7b97570c74c357", + "transactionsRoot": "0xebeede6e36b6d05e630393d06e846a9ace34b4211526c6135718c88697fb6a7f", + "receiptsRoot": "0x74fad2af740fe068bbe72eb8d26d544df638131d7c09a0af056ac5f18c11f2ef", + "logsBloom": "0x00100000000000000000000000000000000000000000000000020000000000000100000000000000000400000000000000000000000000000000000000040000000000000000000000000008000000000000000000040000000000000000000000000000002000000000010000000000000000000000000000000010000000000000000000000080000000000000000000008000000000000000000000000000000000000008000000000000000002004000000000000000000000000000000000000002000000000000000000000000000000000000000000004000000040000000080400000000000002000000000000000000000000000000000000000000", + "difficulty": "0x0", + "number": "0x53477", + "gasLimit": "0x3b9aca00", + "gasUsed": "0x15012", + "timestamp": "0x6930d2cb", + "extraData": "0x", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x0000000000000000", + "nextL1MsgIndex": "0xe", + "batchHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "baseFeePerGas": "0xf4240", + "withdrawalsRoot": null, + "blobGasUsed": null, + "excessBlobGas": null, + "parentBeaconBlockRoot": null, + "requestsHash": null, + "hash": "0x804e32d25e511df6a9c19aa65a6359f8806b36ac18495c8c33b439d77fe17ceb" + }, + "transactions": [ + { + "type": 127, + "nonce": 1114, + "txHash": "0x83caed02a994df37f92df0a06ec02f3fa3b5fdbbcb5da1bf94d389db65816fd5", + "gas": 21000, + "gasPrice": "0x1e8480", + "gasTipCap": "0xf4240", + "gasFeeCap": "0x1e8480", + "feeTokenID": 4, + "from": "0xb055051fb2889be5e9831524f1624941299c49bb", + "to": "0x5add06f01e73b75a4184c8cb74485bb0a897b23e", + "chainId": "0xcf55", + "value": "0x38d7ea4c68000", + "data": "0x", + "isCreate": false, + "accessList": [], + "v": "0x1", + "r": "0xd6f16ad716d7b0666c3cc480ba198b95cf49b5ddd8886b08031c2bbd466ecddd", + "s": "0xc11c3871c795d6f7f9b6dc84c57a501fa1242f9a7687d36e50d02dbeb73c51" + }, + { + "type": 127, + "nonce": 1115, + "txHash": "0x6d662668c50c87dbbb3c39ac39ca32f4419ce34e568463ac26a585a778b7d08f", + "gas": 21000, + "gasPrice": "0x1e8480", + "gasTipCap": "0xf4240", + "gasFeeCap": "0x1e8480", + "feeTokenID": 10, + "from": "0xb055051fb2889be5e9831524f1624941299c49bb", + "to": "0x5add06f01e73b75a4184c8cb74485bb0a897b23e", + "chainId": "0xcf55", + "value": "0x38d7ea4c68000", + "data": "0x", + "isCreate": false, + "accessList": [], + "v": "0x0", + "r": "0x9669f7c8c9b3e89102b478b069c403a894b6604a9fb65fc6ca5f67657ad8346b", + "s": "0x2aae276f4119228468214ff75dd9bea58dd7b256e0d7b2e6662594c6e7b2860a" + }, + { + "type": 2, + "nonce": 4577, + "txHash": "0x16be40d12c2a1e4fc3a273d99713d345c0dc19edf3f20e7951f21d36705de386", + "gas": 66354, + "gasPrice": "0x1e8480", + "gasTipCap": "0x0", + "gasFeeCap": "0x1e8480", + "from": "0x5160a103bb83c2c684ff621d7c707bc1b93920ae", + "to": "0x5300000000000000000000000000000000000021", + "chainId": "0xcf55", + "value": "0x0", + "data": "0x8c399691000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000466", + "isCreate": false, + "accessList": [], + "v": "0x0", + "r": "0x7b04d3208128e4eec0518048a040205e87f0396ea7906b9d2ddd6753487f3421", + "s": "0x1606fcda912d638496e078c458a1362d35f853b646eaaad71f0a0aad20734702" + } + ], + "storageTrace": { + "rootBefore": "0x2bdd19721d4454e55a87359621cdb678ed967220b6c99763289947c43aa91f4f", + "rootAfter": "0x1449e3da6128f8e6ad61271ce88f904f87515efbc26816317a7b97570c74c357", + "proofs": { + "0x18e57b943f4391249A3920b948FD76EF9Dbf53E4": [ + "0x09236a77302583f53b4f50be116ee711f1446c731ce5fad55aa69d17da66c468cc083f31c46077cff3f32f02fff4c2952f72a4d384fdd9a32457a126834f31ac73", + "0x091d8263a8c1dfccd904d91b9911d1762d7e8a8771fe7d7ff05f69066511ad70f70b6600e39a4759942f41ce3ace7530502d4a000c2070c336d489d5cd0cec9ffa", + "0x0925c349f8fd600354b860853897df06673e055b80164e1fbaf3d16b28c241f9992725387247b73f2b6775bc465475b6d73c1ad699f3657d5187dbd95fc91cfaf6", + "0x092220d693e2d9895b96b0530dcb80a79f55102dd1143455513d520abbbba1435e06c0ef8a60eb13de2a024d46a58d75511c373a84706c65e7e590e7ec657afffc", + "0x092518f8d92281a123ca9f8c9a10ffa90bd4166de182aa8c4592176e177d458ebf08a35ae34ff65a9930ffe680f5184b556f1d92911a353d1b8d1840afc8bddea8", + "0x091c6258c6d7113965fa33cf47433176a0ea35c1012a8d1462b4ed521982b67e16283eeb7700302da736914d5f488b72d27191accd2c98343643f708bcc02c5add", + "0x072a941db58791cdd82561e2f2360c76f22ca32f9495acc14f4855069f870472680f0de72990e3dd0a3e749c70613bc3de4b1ac9a07d4e68199588fb40ccb1b630", + "0x09225c9237041df4c7b61dd1d0162f1ede5e947e13b067a4b6acdac845b5d951d606a780c5b07fb945d0da31456c6dadfdb4e9a683572f8783d51fce46fbd49626", + "0x081c00d84bef9c7d63f18dff5073c319b2545d7872ef745c6cd7212127196deb100000000000000000000000000000000000000000000000000000000000000000", + "0x0603d19675dc5d4852044dd5b334040c8653557486001ae05e70c3813d9dde083404a8ca4292860128fdc7e3d0d78621c121feed1726d8ed71918bb3fbc6b0e264", + "0x04189581fea8e35deca7320d756b3c15dd45d71352feb811357c0db1cfd2976270050800000000000000000000000000000000000000000000000007830000000000000001000000000000000000000000000000000000000000000000000000000000000025654792a6c51fcdbf44b8872c3cf049940ceeddbb4e3383fbb80c25e11ce3c48b37156d23eecc5f4dc725b655fd12920b9e594b2d7d707b006b2fc511519f5d0a1108cffae95ace28f77dee674975f9461bd7cc707c45dff3d151f10130f3cd2018e57b943f4391249a3920b948fd76ef9dbf53e4000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x3c58DBda457360a9B7D9c8713273608bd1Be59af": [ + "0x09236a77302583f53b4f50be116ee711f1446c731ce5fad55aa69d17da66c468cc083f31c46077cff3f32f02fff4c2952f72a4d384fdd9a32457a126834f31ac73", + "0x091d8263a8c1dfccd904d91b9911d1762d7e8a8771fe7d7ff05f69066511ad70f70b6600e39a4759942f41ce3ace7530502d4a000c2070c336d489d5cd0cec9ffa", + "0x0925c349f8fd600354b860853897df06673e055b80164e1fbaf3d16b28c241f9992725387247b73f2b6775bc465475b6d73c1ad699f3657d5187dbd95fc91cfaf6", + "0x092220d693e2d9895b96b0530dcb80a79f55102dd1143455513d520abbbba1435e06c0ef8a60eb13de2a024d46a58d75511c373a84706c65e7e590e7ec657afffc", + "0x092518f8d92281a123ca9f8c9a10ffa90bd4166de182aa8c4592176e177d458ebf08a35ae34ff65a9930ffe680f5184b556f1d92911a353d1b8d1840afc8bddea8", + "0x091c6258c6d7113965fa33cf47433176a0ea35c1012a8d1462b4ed521982b67e16283eeb7700302da736914d5f488b72d27191accd2c98343643f708bcc02c5add", + "0x072a941db58791cdd82561e2f2360c76f22ca32f9495acc14f4855069f870472680f0de72990e3dd0a3e749c70613bc3de4b1ac9a07d4e68199588fb40ccb1b630", + "0x09225c9237041df4c7b61dd1d0162f1ede5e947e13b067a4b6acdac845b5d951d606a780c5b07fb945d0da31456c6dadfdb4e9a683572f8783d51fce46fbd49626", + "0x081c00d84bef9c7d63f18dff5073c319b2545d7872ef745c6cd7212127196deb100000000000000000000000000000000000000000000000000000000000000000", + "0x0603d19675dc5d4852044dd5b334040c8653557486001ae05e70c3813d9dde083404a8ca4292860128fdc7e3d0d78621c121feed1726d8ed71918bb3fbc6b0e264", + "0x0415332f1e7c756905199e3e1821b812e853569e281f4d7b7d95ed06db34a6987005080000000000000000000000000000000000000000000000000783000000000000000100000000000000000000000000000000000000000000000000000000000000000cfbf69eb2cf2cfc56a58ee70f09856efe8cb7bc960de5d423f06f05f0b6ed318b37156d23eecc5f4dc725b655fd12920b9e594b2d7d707b006b2fc511519f5d0a1108cffae95ace28f77dee674975f9461bd7cc707c45dff3d151f10130f3cd203c58dbda457360a9b7d9c8713273608bd1be59af000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5160A103bb83C2c684FF621D7c707BC1B93920Ae": [ + "0x09236a77302583f53b4f50be116ee711f1446c731ce5fad55aa69d17da66c468cc083f31c46077cff3f32f02fff4c2952f72a4d384fdd9a32457a126834f31ac73", + "0x091d8263a8c1dfccd904d91b9911d1762d7e8a8771fe7d7ff05f69066511ad70f70b6600e39a4759942f41ce3ace7530502d4a000c2070c336d489d5cd0cec9ffa", + "0x0925c349f8fd600354b860853897df06673e055b80164e1fbaf3d16b28c241f9992725387247b73f2b6775bc465475b6d73c1ad699f3657d5187dbd95fc91cfaf6", + "0x092220d693e2d9895b96b0530dcb80a79f55102dd1143455513d520abbbba1435e06c0ef8a60eb13de2a024d46a58d75511c373a84706c65e7e590e7ec657afffc", + "0x0927720dabb5f35163812456ae15aa20f642527fac0b2a79ea4c9efc5746ada5a4194e4957538093c5fd1654d7566bec4d0c475ed3bc5c307b70d08e5820b7d54c", + "0x092412434d24a9d65009de307424953eb124685ad625c1211763471f5d8d1d5eae0a7f02449f7c1fb366b8281d794acb7ef2e2a3a91a0756ca4c6344dd3650e295", + "0x092f9f40f1ff4d0341ac5bcdadd720e3db4a6b0283e7069d552ee9da3408c224fd2f4948246688c12941566b01e0d32a762d924c7af9d0d1177b91159a412451dc", + "0x0612cbebe57b7eef7cc64130b8298d3264a44cd235883898eca786e984439f45fe0f29bd18b9da7113eb318cc4b6053302456a5d61b7fa5cc1f7391dea6de0996b", + "0x04020abe47f50e118bf630b2c91c7f6ba7bc977a43984d88a6db1ebb32382fc1b80508000000000000000000000000000000000000000000000000000000000000000011e10000000000000000000000000000000000000000000000000dc486a99a767bbe0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864205160a103bb83c2c684ff621d7c707bc1b93920ae000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5300000000000000000000000000000000000001": [ + "0x09236a77302583f53b4f50be116ee711f1446c731ce5fad55aa69d17da66c468cc083f31c46077cff3f32f02fff4c2952f72a4d384fdd9a32457a126834f31ac73", + "0x091d8263a8c1dfccd904d91b9911d1762d7e8a8771fe7d7ff05f69066511ad70f70b6600e39a4759942f41ce3ace7530502d4a000c2070c336d489d5cd0cec9ffa", + "0x0926daec582d0ad368ce3ed1d67e4dc24c0bdccd62d11608db237459a0797fab1a0880100726da58e5c32ee61684b208c82b7db95927adc33fcf53d78ba1c8bd29", + "0x090705cea0113a147638d3be7c6cfa08c924c5b8a832983cf4efb4e9d50532d28a0e040a41ca00083067eb14b19a451c7cf0e05bf739f6915b0f6177771802f5fe", + "0x092d4100122c3353a8f28526ceefe65940ca36418b1bffe3d5e036966ee005aa4d03fd91bfa85e92d24ecc4faaeb6022ee24b9d7e45c74f5ca5aa3d9a08b2101b6", + "0x090f1792f829e49f7ddc4363bfd5fc4b2ff99ba01195a391a871ea32e9645f4ce01bd5260d7cc00ba19d748d026db53b327e40a67896f322045fa37ac50b69ad58", + "0x090917563238627df3e543bfcc691e919d0f39a710c02243ea64bc3c9336b4fd9e24709dd93ba67cb3b801bb52cff7f48c1ac12bdc3e3944e13000e77c8bf3401b", + "0x070d2b94a19d55666528236fda1898bddf7d211baceabad89fd68feecdccb182fb2523f68a7eb14cf3681a3942c3dc9b61386017cecd6b1dfe732de6476eb72709", + "0x082043c0b5184d1bbc876966aa4555fdd464bf213095f59b93c984c65bdd951ff216f335d0dcd917173153fe3b20c1fbc5a3cdda0c00dc1506869c2543afd0002e", + "0x06139a07f81bccd48e6cb20549b10e65fe23136b43668f983aeff62ad0af93adfd0e85fcae64f44e3c2c0f52fec073576309f661dbad22b1bcd1b292bc930262b3", + "0x0427cfcbd2fe87474008e199ef5bff09273803bbf38032c75a36a7726b3c88f8a205080000000000000000000000000000000000000000000000000aec000000000000000000000000000000000000000000000000000000000000000000000000000000001311db297653267f19e944ebc886157711d99c48cdf34eaf9c3e25b5cf4f9b0f44107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f84205300000000000000000000000000000000000001000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x530000000000000000000000000000000000000f": [ + "0x09236a77302583f53b4f50be116ee711f1446c731ce5fad55aa69d17da66c468cc083f31c46077cff3f32f02fff4c2952f72a4d384fdd9a32457a126834f31ac73", + "0x091d8263a8c1dfccd904d91b9911d1762d7e8a8771fe7d7ff05f69066511ad70f70b6600e39a4759942f41ce3ace7530502d4a000c2070c336d489d5cd0cec9ffa", + "0x0925c349f8fd600354b860853897df06673e055b80164e1fbaf3d16b28c241f9992725387247b73f2b6775bc465475b6d73c1ad699f3657d5187dbd95fc91cfaf6", + "0x092220d693e2d9895b96b0530dcb80a79f55102dd1143455513d520abbbba1435e06c0ef8a60eb13de2a024d46a58d75511c373a84706c65e7e590e7ec657afffc", + "0x0927720dabb5f35163812456ae15aa20f642527fac0b2a79ea4c9efc5746ada5a4194e4957538093c5fd1654d7566bec4d0c475ed3bc5c307b70d08e5820b7d54c", + "0x09302a4b53c54a6e6fd628592b269001c1e37d0024fa778e1a9dd4be8b49eeca592bee81201efc661b8170dd635aecf86d593e76e5f8e40458107b46bc91a8ab26", + "0x0918feed44ae85fd99c29b4a6853aa09cef2ebff51ea5773aeaca8f5299887ed8810e3c0507354c21e5807881a746fa026b4b8339aab3be465bbe07b6ed0c27425", + "0x070000000000000000000000000000000000000000000000000000000000000000210819a999e16a1f46f3d08219832fb69e6eae2ab67bf749b015abf116278d4c", + "0x060b07422b633f67b3316792d15445d151ecbe8b07ce31264736d04f16f5edb23f0d953d2de9a6664b45242946eebe10693dd610b25dadefdf83222d76e0fd2289", + "0x0418a86f98026d1a55f6fee616f04d51be16c033651ffaafb0514287ec067d04e805080000000000000000000000000000000000000000000000000aec0000000000000000000000000000000000000000000000000000000000000000000000000000000026153e742765d1be8b6d388fe5cddbf9f2dc4450ee7f8ec94272783ce5048d4544107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f8420530000000000000000000000000000000000000f000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5300000000000000000000000000000000000017": [ + "0x09236a77302583f53b4f50be116ee711f1446c731ce5fad55aa69d17da66c468cc083f31c46077cff3f32f02fff4c2952f72a4d384fdd9a32457a126834f31ac73", + "0x091d8263a8c1dfccd904d91b9911d1762d7e8a8771fe7d7ff05f69066511ad70f70b6600e39a4759942f41ce3ace7530502d4a000c2070c336d489d5cd0cec9ffa", + "0x0925c349f8fd600354b860853897df06673e055b80164e1fbaf3d16b28c241f9992725387247b73f2b6775bc465475b6d73c1ad699f3657d5187dbd95fc91cfaf6", + "0x092220d693e2d9895b96b0530dcb80a79f55102dd1143455513d520abbbba1435e06c0ef8a60eb13de2a024d46a58d75511c373a84706c65e7e590e7ec657afffc", + "0x092518f8d92281a123ca9f8c9a10ffa90bd4166de182aa8c4592176e177d458ebf08a35ae34ff65a9930ffe680f5184b556f1d92911a353d1b8d1840afc8bddea8", + "0x09252ed76f54141622be19600acca03942b31d6c01cdeca6137fe1b0e809c9eaa1098bc530cf79a832dff7d88ab9dc76d8be264223e36a35d189a819c1154488d8", + "0x0916b4a56bd925d2fbe81635a9384a9dd75cf83e2a444f695a6b96147a5ddb4e082f5dd93317dc453b297377e634c77d346600ba436ce802829e62677b94050743", + "0x0700000000000000000000000000000000000000000000000000000000000000001df893aae2a1745948ca56b3fed605526943240ca1a846347e2c6fa74ed44889", + "0x08240e09303236429698d29fd6ba0e53a71d61dfd7ac740c471702cfc3076d62a50000000000000000000000000000000000000000000000000000000000000000", + "0x070000000000000000000000000000000000000000000000000000000000000000297ba7a8d6fbe07c8cef12ee33e549791f6a3464ccdfccc89fc0b5ad944d8bb3", + "0x08080efc67898a2c931965c27e6d237bd7d26ac9ccc58cad4917d8bb57553071100000000000000000000000000000000000000000000000000000000000000000", + "0x071b2371fa1ee45b8c0c3d5875a2611855bee597806d1270941f182c93c7a7825313340fbcdbc78854c9f2655a9966f73c23e1d92eddd341e0da93e9d6eb2f0de2", + "0x041918c47a133f759975cc95c0dba82051d9b5cd65407e76ef1366a9deaa14f28005080000000000000000000000000000000000000000000000000aec000000000000000000000000000000000000000000000000000000000000000000000000000000001003098d9a6027ade54c3a5208d47a81c8127b06267f74bf963c29f05d11101244107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f84205300000000000000000000000000000000000017000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5300000000000000000000000000000000000021": [ + "0x09236a77302583f53b4f50be116ee711f1446c731ce5fad55aa69d17da66c468cc083f31c46077cff3f32f02fff4c2952f72a4d384fdd9a32457a126834f31ac73", + "0x092f8cad70b83a6343203d02e34289416059c47bffdddb3ca8b5e8348f97b292b81402d08328ff5a3ca884a55a109d087c50a9a89521102a505733870aa5d7667c", + "0x091ba0ff6760b7f1d5618f55df9cc748b8ffdbba352f1dfdfb87f710c1ccbbf1660a78d2809714702439ae1b1793f6d96b606bd15251ff0bc458b71076cd8270f6", + "0x090c1ed4572015d1c8257513ce8a1ca7de9d7f8bf842c436ac3a129e1e48f5039e21fe37635685d1231c610d893dc50a6bbe186e51b1be0db428d58f78a3343346", + "0x092da65da78b3cff5b695f2bd3c275b7d4358024657d0e14cc3458f5a017c8fa801dc4bd21ef06c5ae6939bd20cfe0bb1be055c1010ce7c1ca4b4bb7787a45c6dc", + "0x0919fb1c690c67d149718ac5e778fd1145868e7b3ad457c76070d6ea77eb4ae47e22868b2e31c35e8bfa61b52616e7743ac4b5054f88325f516c78f7f2c5c82f36", + "0x071e0f39fdd4927dcc6d49cca915b11585c5bb0e9bacd226e5e24a6a6be3e7f4762a21e214d065739f78b8680adc4f64e8dd32477820809eac089843040d8f0564", + "0x040883d4562dfe8ba7ad8176bc2844d35ecc486199d589a152eabcee8398f3aebb05080000000000000000000000000000000000000000000000000aec000000000000000000000000000000000000000000000000000000000000000000000000000000002a60c2b4e313d1b3345626a3cf83b481f336ff4055ab13762d8cde84aaba465b44107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f84205300000000000000000000000000000000000021000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5add06F01e73b75A4184C8cb74485bB0A897b23E": [ + "0x09236a77302583f53b4f50be116ee711f1446c731ce5fad55aa69d17da66c468cc083f31c46077cff3f32f02fff4c2952f72a4d384fdd9a32457a126834f31ac73", + "0x092f8cad70b83a6343203d02e34289416059c47bffdddb3ca8b5e8348f97b292b81402d08328ff5a3ca884a55a109d087c50a9a89521102a505733870aa5d7667c", + "0x0920a6325386073c96f92f7ecb804871e5cdef9deaaaee7d92a3cc6d038be4dd77030f83fd46a40d224591afe4ff831180641ad6ac5e472e56a59f432a8a9f6595", + "0x09222a5e69086ef2a7c46b077993727085def25338ea0a98a2db1eed27e21c8e2429ef51add6ced0c0b8e4fffc383ae8084bdec66f54c6071a83c4270a51f318b3", + "0x091ac65ea4d9606a1f4f1f9dbdaf80ff5f48ca55a63965f1ba97c94429af2196f40ccaadf733376b76eb22ab103f97bd2dffbbd785fa127adf4446b1b59008b8c4", + "0x09292ef7d9e5c59efa6c571372579c4d2b0cbc622805577b083a63e95fb636a1da217af1283c8c8a7694708ca18bd6430333d4ab2d79420be8a5d6c767717adff8", + "0x070f48fcbcfe94d9e293618b428a44065dd774c063d8c1caefa5323018ec799d9f07adcfc32d2156fc2948be6a6dcb37a718f9f967c7971e85369865c6ebf918fb", + "0x0700000000000000000000000000000000000000000000000000000000000000000779e14271ee5111986cb521b565f55991d000cf5ba2ee0c04dacf801a44d201", + "0x0907fbff3626792b9fd73b39664bc11eb535b540b0a4eeb2d2ba1e7f22756d9b330de2336ed6cc6f7af14d35c543eed899daa6eb26214ee4642e037c0d071fffa9", + "0x06283465243b826f14bb66f7babd9dc61ea472872a89ef8a1e0859667f22971e352c211763cea4dfb702e9975509f9d3790e316d45c0c733026d33cb31efd2808a", + "0x041736e2ebcabec708f4ecce38cd9c16a8a1f6ebfa1df67ed285e8e2ef95f2aec105080000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000002a570d96d4d7cf30000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864205add06f01e73b75a4184c8cb74485bb0a897b23e000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x716170D0687c3d31CC10DebE0dAa1DDD3FE3D792": [ + "0x09236a77302583f53b4f50be116ee711f1446c731ce5fad55aa69d17da66c468cc083f31c46077cff3f32f02fff4c2952f72a4d384fdd9a32457a126834f31ac73", + "0x091d8263a8c1dfccd904d91b9911d1762d7e8a8771fe7d7ff05f69066511ad70f70b6600e39a4759942f41ce3ace7530502d4a000c2070c336d489d5cd0cec9ffa", + "0x0925c349f8fd600354b860853897df06673e055b80164e1fbaf3d16b28c241f9992725387247b73f2b6775bc465475b6d73c1ad699f3657d5187dbd95fc91cfaf6", + "0x0914b3df4048fc34a513e1c19fd47c2bd992b321bd1f0d1ca50a40af8920ecbab91ff6815f32091c3320ba81300163e9531393d5c0b903aa425a8ee14627de7b47", + "0x0913eff588f55e7c7a2f3fdb66c7e34afeb3eb8c83472b7ea6f3c5e20cfdaf27790edbd119400f8d026e7adde1b8066cf0598c7e1d77319854d06564dec8f41c7f", + "0x090fea719a68a48e9dd333707efbb005a4c81d29707e4eedad5babdbdb10448b080e76453c083d03a6e85406f198451801a9270399d74521dde8cfe2c4129acc4f", + "0x092d8cf9858ac296e55a357479747ad048821376d4f043407af9d043dd953dfb0c14e201117cb6d445d2dad0921101124c6de4e4464c9a2901e9fcf4354b8f7e0e", + "0x0700000000000000000000000000000000000000000000000000000000000000002a99f0c4bc934e47bab0edc377ae3e441e59738081016824793ddccd49793b73", + "0x062da1750dc9f7ebf795aa7f4d9ee6933579283a4242334ff38e298db642ba41722a97a2750ce48f2cb6dda838b668fe1cda73b9c484204645343effd87697d53f", + "0x0414b0bb4090afcdae623b69d996022ea82c221cd1a3c00c5b13acb37d750f87fc0508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fdcf5b84a5fca490000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420716170d0687c3d31cc10debe0daa1ddd3fe3d792000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x96904fF7Fe8EED74d6Ec4c9bf7612d9f239D40c6": [ + "0x09236a77302583f53b4f50be116ee711f1446c731ce5fad55aa69d17da66c468cc083f31c46077cff3f32f02fff4c2952f72a4d384fdd9a32457a126834f31ac73", + "0x091d8263a8c1dfccd904d91b9911d1762d7e8a8771fe7d7ff05f69066511ad70f70b6600e39a4759942f41ce3ace7530502d4a000c2070c336d489d5cd0cec9ffa", + "0x0925c349f8fd600354b860853897df06673e055b80164e1fbaf3d16b28c241f9992725387247b73f2b6775bc465475b6d73c1ad699f3657d5187dbd95fc91cfaf6", + "0x092220d693e2d9895b96b0530dcb80a79f55102dd1143455513d520abbbba1435e06c0ef8a60eb13de2a024d46a58d75511c373a84706c65e7e590e7ec657afffc", + "0x092518f8d92281a123ca9f8c9a10ffa90bd4166de182aa8c4592176e177d458ebf08a35ae34ff65a9930ffe680f5184b556f1d92911a353d1b8d1840afc8bddea8", + "0x09252ed76f54141622be19600acca03942b31d6c01cdeca6137fe1b0e809c9eaa1098bc530cf79a832dff7d88ab9dc76d8be264223e36a35d189a819c1154488d8", + "0x070000000000000000000000000000000000000000000000000000000000000000061bc3e24c71b73660db3a390e66211882c79c070a7e7730a795555bf5ad9c78", + "0x08164c0a8baa575aa803c43bb73b1736ecba821c7095345da3684592416cc8d76021ec96ceb39aa73a1108a6c8ddda8235c3c5d72d0a50ac88105b5351bd49707e", + "0x04159dcb3f65a1b35d7ffbc5ab856fdca99998bb0511b47418de556bf06eb8d6e005080000000000000000000000000000000000000000000000002c88000000000000000100000000000000000000000000000000000000000000000000000000000000001e455d8a5bc34b0aee1e7b9a71436a26677ccc056f690495e9df897fc83a4d843980a80a13d540f6def3466df303bc40d3e8151815da811d40d5c9b5ea7c53481a4c85afd3fbba4136b2a89fb8b56b17b972ef37228330390e0e368ae175b9b22096904ff7fe8eed74d6ec4c9bf7612d9f239d40c6000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xb055051fb2889Be5e9831524f1624941299C49bb": [ + "0x09236a77302583f53b4f50be116ee711f1446c731ce5fad55aa69d17da66c468cc083f31c46077cff3f32f02fff4c2952f72a4d384fdd9a32457a126834f31ac73", + "0x091d8263a8c1dfccd904d91b9911d1762d7e8a8771fe7d7ff05f69066511ad70f70b6600e39a4759942f41ce3ace7530502d4a000c2070c336d489d5cd0cec9ffa", + "0x0925c349f8fd600354b860853897df06673e055b80164e1fbaf3d16b28c241f9992725387247b73f2b6775bc465475b6d73c1ad699f3657d5187dbd95fc91cfaf6", + "0x092220d693e2d9895b96b0530dcb80a79f55102dd1143455513d520abbbba1435e06c0ef8a60eb13de2a024d46a58d75511c373a84706c65e7e590e7ec657afffc", + "0x0927720dabb5f35163812456ae15aa20f642527fac0b2a79ea4c9efc5746ada5a4194e4957538093c5fd1654d7566bec4d0c475ed3bc5c307b70d08e5820b7d54c", + "0x09302a4b53c54a6e6fd628592b269001c1e37d0024fa778e1a9dd4be8b49eeca592bee81201efc661b8170dd635aecf86d593e76e5f8e40458107b46bc91a8ab26", + "0x09117d192aeaa6311af3cf6179950c2d4664e3af8dc4fbf41100681584042a35dc26c224419d00af5893c652e7eb3667f802f9c98ed3b5eeb1083124c23b11c420", + "0x061d741b029db79b9631a6164c03568163e5598506df9846ca6fa2d281f2ce955812f19270e258360929b61244523c717f78bf7b785da7b0a5d4e06a8b3541641b", + "0x042309c8ab1f3c5435a473ea279640fbd4ebdde9ff680ac6b79971a0d96582fac805080000000000000000000000000000000000000000000000000000000000000000045a0000000000000000000000000000000000000000000000006dbc36546bf1c8a80000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420b055051fb2889be5e9831524f1624941299c49bb000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "storageProofs": { + "0x18e57b943f4391249A3920b948FD76EF9Dbf53E4": { + "0x2bc0a6c7d79a49c3ae960abc1b08ccd6c0b844abaa810594f68fdefc701b92d6": [ + "0x082480728d28108e9ca46ca627e3654f3e92bfe01063a80935ee4a458598d27e2d1d7b41377c4f47d97a66e28dc1efcc5662200fc2068c68c6e5da6c1e2e718ceb", + "0x090f493b23241b1fdc411a29bc147cc2f84e4a9cdfdc849731c2c13723960f16780be3f75d6b0d3cc7f5d8626d4afcc43a99e41c21781c607c7ebd8ce2e73bb6db", + "0x0803c2c911dc7b48cd1e8e3535d7cb0daa79691c1e1271e84397ab1dede3eabd622da624858764ed09f5ac01e6ceb4514458aa195b20938f536fc01dde090d21f7", + "0x06085ec2708f7e19a1e732ce314c463066c2d1ad9344d496bf48f86bd20ca4466d046e729135d69c474c6ba418106554114f18c52df92ac8b5da091bba68de7782", + "0x0429d8c87e5e7036a7ccbd5754f78c1d9a8cb750530e9a5a03d1c4a92b326ac35a010100000000000000000000000000000000000000000000000000001cea8ee3ae8dba80202bc0a6c7d79a49c3ae960abc1b08ccd6c0b844abaa810594f68fdefc701b92d6", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xed3b720424f8e7d811b36ea6ea06ba9dbb304fb353fe36fff4d75ce3b5706137": [ + "0x082480728d28108e9ca46ca627e3654f3e92bfe01063a80935ee4a458598d27e2d1d7b41377c4f47d97a66e28dc1efcc5662200fc2068c68c6e5da6c1e2e718ceb", + "0x090f493b23241b1fdc411a29bc147cc2f84e4a9cdfdc849731c2c13723960f16780be3f75d6b0d3cc7f5d8626d4afcc43a99e41c21781c607c7ebd8ce2e73bb6db", + "0x0803c2c911dc7b48cd1e8e3535d7cb0daa79691c1e1271e84397ab1dede3eabd622da624858764ed09f5ac01e6ceb4514458aa195b20938f536fc01dde090d21f7", + "0x0424f6c97e04f23262b2b294f40f6a3972028a8f43c4b755fd9f5017d2cc3373c60101000000000000000000000000000000000000000000000000d3f834adebcfd112458020ed3b720424f8e7d811b36ea6ea06ba9dbb304fb353fe36fff4d75ce3b5706137", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x3c58DBda457360a9B7D9c8713273608bd1Be59af": { + "0x2bc0a6c7d79a49c3ae960abc1b08ccd6c0b844abaa810594f68fdefc701b92d6": [ + "0x090b6430fd521e866f260e03807db65b0fbf909435b3dc0101d735f8eb232ec77d0001f5fa8eee97a5f05ec191ee67362d6206b4bcbcca389ef12e3a0a6235b9b9", + "0x092f84cc51764db2ac29d9fa763d293a2318549dd50465819cad60f363f00fe47e1edf07db6d97b629ee7b052a2761056dea1e06d70da97de8d384a4a6e09b31b5", + "0x082630e39da8acbb5230d9d60a18ce34f26ed281c407597bf3706e11d138e8843a14439a4405f15064034fa91a5b8cdc2c43502aac67dc96e4293a451c5e1154fd", + "0x072df0a2b7734173fe5c633d61fed384f4435213f399f9007a240705ca99847b0d1a176f1033928de7ae92a6252392c0e025cb29f488a7df2649467cc36735301d", + "0x070000000000000000000000000000000000000000000000000000000000000000231581a4538be7a08e6f7fd655826cb1ff3abd22f546068b347add86c6ec17c7", + "0x062b1ad0bb5b1bd54576333a369deb329f171181273a47df481804407c54cf84082068676cb5fc3ee474e9d3a1ea873895d285664596e5dd3389cc9f7f761e6aa0", + "0x0429d8c87e5e7036a7ccbd5754f78c1d9a8cb750530e9a5a03d1c4a92b326ac35a0101000000000000000000000000000000000000000000000000000000000000024ba6c3202bc0a6c7d79a49c3ae960abc1b08ccd6c0b844abaa810594f68fdefc701b92d6", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xed3b720424f8e7d811b36ea6ea06ba9dbb304fb353fe36fff4d75ce3b5706137": [ + "0x090b6430fd521e866f260e03807db65b0fbf909435b3dc0101d735f8eb232ec77d0001f5fa8eee97a5f05ec191ee67362d6206b4bcbcca389ef12e3a0a6235b9b9", + "0x092f84cc51764db2ac29d9fa763d293a2318549dd50465819cad60f363f00fe47e1edf07db6d97b629ee7b052a2761056dea1e06d70da97de8d384a4a6e09b31b5", + "0x082630e39da8acbb5230d9d60a18ce34f26ed281c407597bf3706e11d138e8843a14439a4405f15064034fa91a5b8cdc2c43502aac67dc96e4293a451c5e1154fd", + "0x0424f6c97e04f23262b2b294f40f6a3972028a8f43c4b755fd9f5017d2cc3373c601010000000000000000000000000000000000000000000000000000000000e90da7e7fd20ed3b720424f8e7d811b36ea6ea06ba9dbb304fb353fe36fff4d75ce3b5706137", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x5300000000000000000000000000000000000001": { + "0x0000000000000000000000000000000000000000000000000000000000000021": [ + "0x0901ac3061bae99c0d741f0e4792bc61f3bec93e3bfd4e9b1bf71c2eeac83249e102061789fdb797f8009586a28b3e7d4c68c4135ea830b033a9f25fe324965e65", + "0x09039a1d7db21776aa517761e120fde5632733c21865973139f42dd1225d899b7726294ab601fdc57919e84fa003fd3ce4c0e6cfee6ca224264e739c9bf99fb2ff", + "0x0922ef214b35725542f2c5236a9078c04cfe868c2460af073d11329f35cf5d2607172db12bf8987212e0367db213237d6a1b173dc47128739678a51d6bccfdf2a8", + "0x0700000000000000000000000000000000000000000000000000000000000000000537f9984b1cd35c20d6f780fbd8749aa9113bd2fbb9acdf16020c5495ff2df3", + "0x0805c6ac03fc8a8b84ea997df623ebf3379db02353d56e8eba20ec14491e4c562b0000000000000000000000000000000000000000000000000000000000000000", + "0x081f648065f7de77e04e42b850348f2312accd4635b3f75f4a589ed3b4e7c50d7c0000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000001a0889384c3b0cb128f42846b741bc975d22cfda4b45d366dcc85206808c6f68", + "0x07000000000000000000000000000000000000000000000000000000000000000018329b600c16bdf6169b0f4d0814187d0418ee42fbc105adf54d4b94b620ed74", + "0x0700000000000000000000000000000000000000000000000000000000000000000478e67a8cdaa52ab5fbe27e8a41204ed4fa319414c16aac6538d63f2905c2f1", + "0x062eb5eb1aaf8a82049d72b509368f65b50ab88d06282074a93e7ab30c702fcd0809b4fbe11b794c8b46f8e16f64f4e685e54255192dcea7d0f1b39baa21ccc270", + "0x042f683d080c393f5fb2ade2190fd56e8a5e8fa26533acdea8cce25caa236027cc01010000d8b1ed3f4a01e26b20ae06ee54a673e1614431cb403597252f7a5caefa36da38200000000000000000000000000000000000000000000000000000000000000021", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x530000000000000000000000000000000000000f": { + "0x0000000000000000000000000000000000000000000000000000000000000001": [ + "0x09084c55612dd3d5d693fcf7f99fe36100352956a642145a28d98c0539f0cbec2500ae2a216f67a296746c3a1c5a6d0dbf4dbe5b54faea4c279911ab6670706d8e", + "0x092d97cd795354a5a30b84fd02c9a88cffbb662ba30e270dace1e6a32df43297fb22007b8b7b52795bdee79b0a1277a8c5444fa9067a322baea00ece0558e3400b", + "0x090be43faf2770938b49bf9954f96ffb7781fe565616cc19eea1c50f5640fc04491dc5a73fb5d4f7493bf818961c71889f3564ed31a3560d4492b17e2380fb5963", + "0x0826204c54a20b8755b26c8593cbb0f6ccf9faa0d99069fc115fb5345be6e0d6c90000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000002dd3f5348ed437f041f7cbe0ebbfe32ea11debb6bd59585320c711c01fc03312", + "0x0811a12c26bdf47ee813c84db5c6a980d96fd51478295be83171b414caa96dca1f0000000000000000000000000000000000000000000000000000000000000000", + "0x07000000000000000000000000000000000000000000000000000000000000000026e550cb3f8b93622bcb2d1ad0e9e1136d301282f9656f8021918225ed057101", + "0x08095417273a9a98241a36ac71b5bd2264e369b4535dfce68c96eea4fc507ab7270000000000000000000000000000000000000000000000000000000000000000", + "0x080b06c3db82a6ce0908af547a8ac4ec566b42e67a058e66cc5180db596b94a7400000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000000bd96bdb2e373b23f31075d56a6299319285b89bac22d33dc9b6bfd2805d9050", + "0x0611741fb28e6c583a7f0d715a6c810f1fd4b42b714284dcf837adea8ba3a668f4156a0960a84fa4287f66d18b9c39ab9d403fa6b6dddd126f47758aadcb82e122", + "0x0426049ba6de63003492eb078a01a8aa4f4a0e67f28f0955c2eba9101d5d2eea50010100000000000000000000000000000000000000000000000000000000000000944f7f200000000000000000000000000000000000000000000000000000000000000001", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000002": [ + "0x09084c55612dd3d5d693fcf7f99fe36100352956a642145a28d98c0539f0cbec2500ae2a216f67a296746c3a1c5a6d0dbf4dbe5b54faea4c279911ab6670706d8e", + "0x092d97cd795354a5a30b84fd02c9a88cffbb662ba30e270dace1e6a32df43297fb22007b8b7b52795bdee79b0a1277a8c5444fa9067a322baea00ece0558e3400b", + "0x090be43faf2770938b49bf9954f96ffb7781fe565616cc19eea1c50f5640fc04491dc5a73fb5d4f7493bf818961c71889f3564ed31a3560d4492b17e2380fb5963", + "0x06060c405a93a636d8a8d0a2a74e7f7b15c776862a72b952fe807434a878ee088d1e144bbeb8f4c147dafacf9567e13b1b15e4804a9d74df2da7619735d765c1be", + "0x04020953ad52de135367a1ba2629636216ed5174cce5629d11b5d97fe733f07dcc0101000000000000000000000000000000000000000000000000000000000000000009c4200000000000000000000000000000000000000000000000000000000000000002", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000003": [ + "0x09084c55612dd3d5d693fcf7f99fe36100352956a642145a28d98c0539f0cbec2500ae2a216f67a296746c3a1c5a6d0dbf4dbe5b54faea4c279911ab6670706d8e", + "0x0700000000000000000000000000000000000000000000000000000000000000000b2f0f973417fccae039c879f858dc3ebb7f1ebf01fda9dbc71f7c54913a4297", + "0x070ee2ca3e190e48951aa8d5bb00d33ba76a92de69a807dfa6f2eaa9881e303f32140b95c8e970324b0ccea88d06f534e85d995c8639b93234a7f254fcc4ebc7ee", + "0x0406c50541f08911ad149aa545dd3d606f86ee63c751a795c7d57f0d3f85e6bdeb01010000000000000000000000000000000000000000000000000000000000003b9aca00200000000000000000000000000000000000000000000000000000000000000003", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000006": [ + "0x09084c55612dd3d5d693fcf7f99fe36100352956a642145a28d98c0539f0cbec2500ae2a216f67a296746c3a1c5a6d0dbf4dbe5b54faea4c279911ab6670706d8e", + "0x092d97cd795354a5a30b84fd02c9a88cffbb662ba30e270dace1e6a32df43297fb22007b8b7b52795bdee79b0a1277a8c5444fa9067a322baea00ece0558e3400b", + "0x090be43faf2770938b49bf9954f96ffb7781fe565616cc19eea1c50f5640fc04491dc5a73fb5d4f7493bf818961c71889f3564ed31a3560d4492b17e2380fb5963", + "0x06060c405a93a636d8a8d0a2a74e7f7b15c776862a72b952fe807434a878ee088d1e144bbeb8f4c147dafacf9567e13b1b15e4804a9d74df2da7619735d765c1be", + "0x04064ef33f6d7044a6aa1458b710bb24a531e379030cf6ca490d84fff1d8e79c9401010000000000000000000000000000000000000000000000000000000000174876e800200000000000000000000000000000000000000000000000000000000000000006", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000007": [ + "0x09084c55612dd3d5d693fcf7f99fe36100352956a642145a28d98c0539f0cbec2500ae2a216f67a296746c3a1c5a6d0dbf4dbe5b54faea4c279911ab6670706d8e", + "0x092d97cd795354a5a30b84fd02c9a88cffbb662ba30e270dace1e6a32df43297fb22007b8b7b52795bdee79b0a1277a8c5444fa9067a322baea00ece0558e3400b", + "0x0817eb488c5eacbbe8312febc6d42a18398848fc21f141a9303cf52faa1e244de50000000000000000000000000000000000000000000000000000000000000000", + "0x082119746c2afd71d1574bea80b47eab52d70db3990cd1c9f6d4df98eaed5c3ff00e7d8382b2fb64acebb539a337686f0a3a0775c6fcece0c4031269462a08edf0", + "0x040d1e80106f23933567a7c4881177b5d6c45a3f319feafe560a28df75769db9ba0101000000000000000000000000000000000000000000000000000000000636b08c8614200000000000000000000000000000000000000000000000000000000000000007", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000008": [ + "0x09084c55612dd3d5d693fcf7f99fe36100352956a642145a28d98c0539f0cbec2500ae2a216f67a296746c3a1c5a6d0dbf4dbe5b54faea4c279911ab6670706d8e", + "0x0700000000000000000000000000000000000000000000000000000000000000000b2f0f973417fccae039c879f858dc3ebb7f1ebf01fda9dbc71f7c54913a4297", + "0x070ee2ca3e190e48951aa8d5bb00d33ba76a92de69a807dfa6f2eaa9881e303f32140b95c8e970324b0ccea88d06f534e85d995c8639b93234a7f254fcc4ebc7ee", + "0x060e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b20002e15ce98746594c1414772d1a34c7ea3e78c4425a2a2188d3f2a3f2bceebec6", + "0x0412c0c59f64422dd5b7ce259c4aa62e9bf4e2bcc4f0da068e332b9f4e502ba38f0101000000000000000000000000000000000000000000000000000000000001bc65a48c200000000000000000000000000000000000000000000000000000000000000008", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000009": [ + "0x09084c55612dd3d5d693fcf7f99fe36100352956a642145a28d98c0539f0cbec2500ae2a216f67a296746c3a1c5a6d0dbf4dbe5b54faea4c279911ab6670706d8e", + "0x0700000000000000000000000000000000000000000000000000000000000000000b2f0f973417fccae039c879f858dc3ebb7f1ebf01fda9dbc71f7c54913a4297", + "0x05", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x5300000000000000000000000000000000000017": { + "0x0000000000000000000000000000000000000000000000000000000000000065": [ + "0x091bb7a17100326207252cca54cc98c3293214f00f78f0838705cb9c010ec9425903306ea60fb41692e3f39006fb0e854dc68fbd405ca2e3d49a5f12f71c4e8ebb", + "0x092868a32bf50018c0ead11533c9d5ab6fb903b3b09b0ed0eaeadcb2a24d8b1de029c7d6f42d6683d307cb5a0f54e8f9c7b16f172bc733d0ce2dc73437a36a2d48", + "0x0822ff52889832a4791479ca13912145d3a87533bbcf370741240082014f9748bc0e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200", + "0x091bb97fb18271cd4ca26a868e66ac7a2c7776b73adfe15d12e504ca401ef359e60bc7a0ba00c4d2d8976480a9f1fa930dda977b76f17b371767baf1db1afcc030", + "0x072a16cea49bf0bb77fd1cb958831a90704bb227ddfd645b17f5d559a21f53380b13edc24099a1b13d8fb640eb37b1630d58cc2c21cb2289d3dfdd48a942b7e357", + "0x0700000000000000000000000000000000000000000000000000000000000000001a6eab72d5f5f28368c1c39e305732f4650596cfb871dd7b7d1490c5e419f080", + "0x06062f41430c96c9ed21486f1cfec127cabc439f6bc6aaef5449181e35f52ed0212be55fc17d1eb7312a5105d0edb44a405d37d81b392fa71717be628a5a401f80", + "0x042115c9b0a0938aa1ce2e8c01581e5aa931288249a453588de70cf2c5dae26a7b010100006d547e175e7a1d4b4da46abecd844564f5c7aa9da8d073003b73401042c50f80200000000000000000000000000000000000000000000000000000000000000065", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x5300000000000000000000000000000000000021": { + "0x000000000000000000000000000000000000000000000000000000000000009a": [ + "0x090a0ad1904f86aedf87e971bec5a7c5fcf39b12d00a064560dcd2db2ef761c29c04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091cbcafd73a15869f9398bb2410de2817eeeff7a68be0f55e31ffc4c68d2348112e000bbeb0195d16d20b1c908aab77b8604b7d2e26717d9ba96a82d4b7a84bdf", + "0x0921bf8a30a3d1a684baafd49ee7a13f6eedbe9b52ce362520d8442f9fe29433bf09c3876c8274155eb6d51a79d942e22e9579509ce8fbfdc296ab24f6bac8a7cf", + "0x091ac18bfbb031365e7277465e677848506bc1f80089786c1b1893fee0f96464c709bd08cfb12c05c4f3ea2c7ebc03ee9a82f31b42ccf718fcef4649d64e9dd800", + "0x0829ce85ca1679232d4d1bb506c1a4b7974d8f38b6290131ec64653da8dc30d81128b3bf9a92d906051defc60a366063e6d133f3bb15dc661dad6b57e1f51f95e6", + "0x081f9b1d6040a2a81a670747cefe745efa1e65d2bd9147581fe96782278e4d0a380000000000000000000000000000000000000000000000000000000000000000", + "0x05", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x000000000000000000000000000000000000000000000000000000000000009b": [ + "0x090a0ad1904f86aedf87e971bec5a7c5fcf39b12d00a064560dcd2db2ef761c29c04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091d97f1c4d55347b1d429c1c032640017976a1d5a4d9e7d267eaab810e76cde5410922a2f16b0d79199940d61d76b9a38b356ded2b55ef3cb9efd8d41b55cd9a1", + "0x0919192c804de24fd6bbeb6bbe3a9e3d60628368d05e485d6d5b2cb3c87db54bb6170b4d2136b00854310e3859a85e31de715b00bde4985a57d051677d2aaa0d6b", + "0x090720a2f304bf61b54f366ca4caed0022df7af1225db39d3dcd93fd06dd18c0f4132f15615440de5771eeee9e780b422a916e3d15eab9373edd505c651b30845a", + "0x07000000000000000000000000000000000000000000000000000000000000000020f6ebe67ae77a1de87fb3e23808ec92429108aa24eabc303febcbb3b8bf75c5", + "0x0828efa182013c9def247ac7fcaa2638155dbe39178170f0b901db81e46e9b3ae40000000000000000000000000000000000000000000000000000000000000000", + "0x081e4264a1e981b7341b230a8b36b330b7c7f6c717fd7ae3ed431caa30eb3dbaab0000000000000000000000000000000000000000000000000000000000000000", + "0x0819504530d6a257bdf890fabab24c23042243b37a5f55d4f5d1d347fdfa7ef20d0000000000000000000000000000000000000000000000000000000000000000", + "0x082e58d7ad5b9586edc85a90f3ec67fd1e4a57d02592ac36b669a87577315fb5b60000000000000000000000000000000000000000000000000000000000000000", + "0x070000000000000000000000000000000000000000000000000000000000000000034ff551d0054caa3801453f74cea1553a8f99653f7775665cf81ec8ef2aba48", + "0x0817dfcd95c010bda4eb31762a94f386934a725a4b6d832ff526ab4214d3f28cec0000000000000000000000000000000000000000000000000000000000000000", + "0x081a2fca58cf05057f17e02f34159537d2a5143960baa651e448801bbeadd435d60000000000000000000000000000000000000000000000000000000000000000", + "0x061bb193e271b1ee345995c3b7a298a6793eaff80fceda7c89df6375a9e29f5d972e53e3e9599e20872ef480183a2e76d8ec41cf5728ac6aac4b029066c68124ac", + "0x0413ae6988481e7df831f5f128b1c99a13b227630c2b40a16163ce5cfebc0a621501010000000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000009b", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x29bc3b2a60f4b394d528442f4e3154d1c48862d7f135fbad213b0abde2291098": [ + "0x090a0ad1904f86aedf87e971bec5a7c5fcf39b12d00a064560dcd2db2ef761c29c04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091d97f1c4d55347b1d429c1c032640017976a1d5a4d9e7d267eaab810e76cde5410922a2f16b0d79199940d61d76b9a38b356ded2b55ef3cb9efd8d41b55cd9a1", + "0x092883e6c9f8554b07276ac716a5b75dfea32ced6155a997e35b3f628f30b7dee42c3eaa894b3a3ce7148977abf5e239b1e92deabb870ebb0476962ad8d8f623ab", + "0x090c9bfd0ba6119fa753d5401f1c58d2d1278f48704fb52fdf3b5c42e597c0459c14228de0ef14e67c35dd5c5d97a6b0bbaf3dcdbf18548a3aad218f93b664b738", + "0x0918bd2abc34c290856d68178148b3d77f1545c65d1d6dcae59c70154e056e8e05197958bcaae91767bb4f290dbaba6228724e954fd0f18b1038b23bdda0112422", + "0x0826eaaa332363373ca07cfb98aeb0e13bacab8fc594e783db87cb830b88e6ada10000000000000000000000000000000000000000000000000000000000000000", + "0x061cde72db31da357b3785dbf15aa5f3a9ffa42346705a072d6deb9b8469ce56c71fb9287a64376c8226bf8411f424a2aa0f1f8e50abffc5b45e0f437ef21f0681", + "0x042c2826bf51833f9c3306e9b20a51e6492d7c3d8d50c0849123ea839facfdc4830101000000000000000000000000000000000000000000000000000000000000000000012029bc3b2a60f4b394d528442f4e3154d1c48862d7f135fbad213b0abde2291098", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": [ + "0x090a0ad1904f86aedf87e971bec5a7c5fcf39b12d00a064560dcd2db2ef761c29c04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091cbcafd73a15869f9398bb2410de2817eeeff7a68be0f55e31ffc4c68d2348112e000bbeb0195d16d20b1c908aab77b8604b7d2e26717d9ba96a82d4b7a84bdf", + "0x091728f14a10a6f428096b080be070908cf9a43d3d2827eab3fb0e30dff43803be05ca23d77ef7e23741a051f6f8c2bbb3f23c6031554bda48758bfe0c30661921", + "0x092844f9973c0091032065205aa3ee43dfb70a92a167f7eb4aa252eac32fe317001a70b927deef5b82b33f5984e1017152da226848ceaa921247ad871b078706d3", + "0x091837d3df34f0cd641a40c90699d8a5cd9f75d95284337fb6ad97d7d400cc11a0213840d432c9a896719a5e27ac8a33c881222f55bc257631e6a9b48092f6bac3", + "0x09187c68e93dbd497a6fd042e5d48d3ec07344334576df0f8ae2c4ab519d82456c006638b810ed97d5a6e2798b22105fb538145f44b4fdc2f6133ec19f284852b9", + "0x081a6da792fdca879a8e5a966cc677327a27a93d4e0e5b4b10736f495780a755420000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000001757d3b68fe5609bb417d69e844076087720fd9ac0615a4fd7259a1177892431", + "0x08183f814d072493364968e21dc8b99b81feb73e88d08622258ff4e9e5e3e6f9cb0000000000000000000000000000000000000000000000000000000000000000", + "0x0710bd56aa4fa4fe8c8a00021a98c7a560c42dca3a35a21f4ab0a92c1ef02709a32e595a6c3c1be5266c3c8e3b8990f8c12a3209356621aaa502c0564b65659eda", + "0x08052614f553ae26abda62741495cd00d44551df1fa8a81df3a21a2c0ee814350e1d2b12508501e2c638408b3226eaff5dae4959be9d85bf09363771fb46f78f96", + "0x041a1b3841cf3c67c998be3481e8289d447b74a9ddcb8aa7f3c251b049590f2e920101000000000000000000000000000096904ff7fe8eed74d6ec4c9bf7612d9f239d40c620360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x475d269024c1af7d6d15838ca2130991aea4ae0944b3169917843465e0e8922a": [ + "0x090a0ad1904f86aedf87e971bec5a7c5fcf39b12d00a064560dcd2db2ef761c29c04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091cbcafd73a15869f9398bb2410de2817eeeff7a68be0f55e31ffc4c68d2348112e000bbeb0195d16d20b1c908aab77b8604b7d2e26717d9ba96a82d4b7a84bdf", + "0x091728f14a10a6f428096b080be070908cf9a43d3d2827eab3fb0e30dff43803be05ca23d77ef7e23741a051f6f8c2bbb3f23c6031554bda48758bfe0c30661921", + "0x09139b028a20238945226733d3dc957255b94fcec991a7fb62670e668670043dc615cef82615590561df79ba0aeb59c3805e1bf66450098b0632b0873e52acc119", + "0x09213d0b5974762004d5419d387195fafa850e032842da3c94905794e44b8c0c6219d87841da4e26d8c8db8ce6426f1c78154983ccbae3b067698c54e92cd77ae5", + "0x0620642846554360c92ba6cc2021322d90685f7ac8a3b643712504f049401fc0a008955648527ccb04b2081add32fa8bbd40e41a46016e22799a72edcc9ae1ac61", + "0x041e5b19ce6440ab2b0299338e72c03e30fe478f4b3c5b1a316ce256a6ac93f30e0101000000000000000000000000000018e57b943f4391249a3920b948fd76ef9dbf53e420475d269024c1af7d6d15838ca2130991aea4ae0944b3169917843465e0e8922a", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x475d269024c1af7d6d15838ca2130991aea4ae0944b3169917843465e0e8922b": [ + "0x090a0ad1904f86aedf87e971bec5a7c5fcf39b12d00a064560dcd2db2ef761c29c04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091d97f1c4d55347b1d429c1c032640017976a1d5a4d9e7d267eaab810e76cde5410922a2f16b0d79199940d61d76b9a38b356ded2b55ef3cb9efd8d41b55cd9a1", + "0x0919192c804de24fd6bbeb6bbe3a9e3d60628368d05e485d6d5b2cb3c87db54bb6170b4d2136b00854310e3859a85e31de715b00bde4985a57d051677d2aaa0d6b", + "0x090c7116a446f80048f743bcbe5a6fd6f74a35235d70f146a2fbc28d39f581046a29c8e336d9a3512e280786a9936b24f5d21b7c06b079152fb0ae05cb9957b933", + "0x09124072fdca11ff038a2f3e0b8b30b3b8161c440e140d3423e16574f9f5db567b2e3af29d1dcabf89f88e26e42b502f9529c81cafc3aa75fca95ed3170847fa22", + "0x08283843aa31ecb5a830c3b7d963133c08589d5ed7cc887a7c40adf6882e49610120868d00f9fb9cd7f6701ce327574fd144a88c975e8efb95a179b66cc86dde96", + "0x0801dae1feba524f3cbadb7ac82ff4180e30cadb97d449305f5675aa6f6f98c58601cf435fbe3f279de07efcef4676160bded9515cc7331a21106f4d860ffe214d", + "0x06143b9c8c8148bd69164c12fc9b4b8182968b3187a5956d69c2b97861d5ab20ca26d197d1292da1615e9e4e1fed61567e1107ac84d79deea8db3aa5b7b658d611", + "0x04208a963a771ed12d496e6a065bc90d069859365c1f2ff7eaf1b2162e63efa39101010000000000000000000000000000000000000000000000000000000000000000000520475d269024c1af7d6d15838ca2130991aea4ae0944b3169917843465e0e8922b", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x475d269024c1af7d6d15838ca2130991aea4ae0944b3169917843465e0e8922c": [ + "0x090a0ad1904f86aedf87e971bec5a7c5fcf39b12d00a064560dcd2db2ef761c29c04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091cbcafd73a15869f9398bb2410de2817eeeff7a68be0f55e31ffc4c68d2348112e000bbeb0195d16d20b1c908aab77b8604b7d2e26717d9ba96a82d4b7a84bdf", + "0x091728f14a10a6f428096b080be070908cf9a43d3d2827eab3fb0e30dff43803be05ca23d77ef7e23741a051f6f8c2bbb3f23c6031554bda48758bfe0c30661921", + "0x092844f9973c0091032065205aa3ee43dfb70a92a167f7eb4aa252eac32fe317001a70b927deef5b82b33f5984e1017152da226848ceaa921247ad871b078706d3", + "0x090be037e9fd4c2f92a2bdcb3a066a121e312873b9b8a01d269c1b08b908ca765e1abb3a2a14150ebb12955381af18d353b9fbe1eea0efefb0bde49c3ab1f68001", + "0x082046c4ef67110d984819c85a1170897bc3e42bc6a90c06f044a07eb096760a1b05b2225f0a857efdea03899f616eff13bc106bbfcad74e5111f7931e8da04107", + "0x081a3b50e39d1e0da2355c381d1a886d5d99c29945d0eeb0d2a7a925d5d0910ad50000000000000000000000000000000000000000000000000000000000000000", + "0x0824060fc7cc9544860c74634eebb1ab20d150153f682247b5aa742802a40803a40000000000000000000000000000000000000000000000000000000000000000", + "0x07000000000000000000000000000000000000000000000000000000000000000028e5d7b965e94d1f6efaacc58f962a3e0d1eda3c662649b7325e308106179a91", + "0x0604cad36862b9f470affd578703819ea27493f8b860f7296f49995e1cd5c4d4161064859534a8a9cb8251a998a70669cb1f6fb2f9d0e8cc463f140d76404ec506", + "0x040cf6d2e2b4781f877895882f7f888e8f9e4cad71a6ca3381dbfae6701a03650a01010000000000000000000000000000000000000000000000000000000000000000120120475d269024c1af7d6d15838ca2130991aea4ae0944b3169917843465e0e8922c", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x475d269024c1af7d6d15838ca2130991aea4ae0944b3169917843465e0e8922d": [ + "0x090a0ad1904f86aedf87e971bec5a7c5fcf39b12d00a064560dcd2db2ef761c29c04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091d97f1c4d55347b1d429c1c032640017976a1d5a4d9e7d267eaab810e76cde5410922a2f16b0d79199940d61d76b9a38b356ded2b55ef3cb9efd8d41b55cd9a1", + "0x092883e6c9f8554b07276ac716a5b75dfea32ced6155a997e35b3f628f30b7dee42c3eaa894b3a3ce7148977abf5e239b1e92deabb870ebb0476962ad8d8f623ab", + "0x092a16326c64bc4d8f5a84a63b8e8393ce26a4f3d668969a2228f016fd1803884d251cf79c50546e5f56b08ac68ccd7bd4831d70d54c284f1b750dbb69f4feadf8", + "0x09052897e407fcbc56b0630c56428eae64abb5b7deadc370bc21f274a5bd35f14527876ddd9d75c6fcccd372762c3ad645195374953db62ebb3b0651fb3ddea3fa", + "0x070000000000000000000000000000000000000000000000000000000000000000136ecb21790bfcdbefecbd46fa7dbfea6b4ea3c78ebbc2d262a7ca19ea2b0235", + "0x0822b3c66f5387d999dc66891a75bb307c11efd4950e59925d90657dffed78603611a4b142f80899b94192f56c30e2545b0f60d45246f89520b827da4245440b0a", + "0x0914abfd7d2c5057a6caa9bb7596832647a83615a061997cf544883ec247550dbc19d4415c0e4692c2a4741ccbfec986748be6701c68d18d0253f98579527ab990", + "0x0820d6f13c3cf07b67f35bde61eb4a87851c57793cea5e69c6a4f6d782556a8fe90000000000000000000000000000000000000000000000000000000000000000", + "0x060921b23da9e24c5e0f3bbb1eaf058c782472e949498c0ada18fa526626768f102833eaaf5c28e4d6347a8d0b374bcfe435f396bb381c7e1019a2ffbb0683296c", + "0x040cd065000f6cdb923ba93503de238f0ffc81e7a6a23f27c8f63a462be869d4b70101000000000000000000000000000000000000000000000000d3c21bcecceda100000020475d269024c1af7d6d15838ca2130991aea4ae0944b3169917843465e0e8922d", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x53bdca72fa8d2e145a1b3bd11cde5bd75428acd18eac3d6adf4e06e7e637706d": [ + "0x090a0ad1904f86aedf87e971bec5a7c5fcf39b12d00a064560dcd2db2ef761c29c04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091cbcafd73a15869f9398bb2410de2817eeeff7a68be0f55e31ffc4c68d2348112e000bbeb0195d16d20b1c908aab77b8604b7d2e26717d9ba96a82d4b7a84bdf", + "0x091728f14a10a6f428096b080be070908cf9a43d3d2827eab3fb0e30dff43803be05ca23d77ef7e23741a051f6f8c2bbb3f23c6031554bda48758bfe0c30661921", + "0x092844f9973c0091032065205aa3ee43dfb70a92a167f7eb4aa252eac32fe317001a70b927deef5b82b33f5984e1017152da226848ceaa921247ad871b078706d3", + "0x091837d3df34f0cd641a40c90699d8a5cd9f75d95284337fb6ad97d7d400cc11a0213840d432c9a896719a5e27ac8a33c881222f55bc257631e6a9b48092f6bac3", + "0x09187c68e93dbd497a6fd042e5d48d3ec07344334576df0f8ae2c4ab519d82456c006638b810ed97d5a6e2798b22105fb538145f44b4fdc2f6133ec19f284852b9", + "0x0716175660d07cd98be806c32cb2b66775b64e8aa543a8470d5d90d857f78b0b180486dc83f24b31d7a4833dbfbe26060363adbf850b4f8749cc2b44a3c052c8b1", + "0x082ecb9e18657f908e5ccdb4d6ac0fc65c6c60b7e86b33f8fc82134d1704f65e6823cf8c53ad039143dfbc1336aaf011c4b20d3c520d354216ae10ff4ea63f48bf", + "0x071f5094a0f866686490965819954304dcca1acbb5eba248966d76acccf11d1d6b1af61657ec5e7d789a9ac79ac1dd4eb4f298faf9a47a5f1560f0927f2bc6e71b", + "0x062b0c232103b6c82e6b5f588eab336a93526bf3ff6ad5dfa358f6c6e35e4ad865165bb2d134896148cdda711cf71517e576c920edd7f91f1c17a9b6b5fcb103ac", + "0x04032a62f2b11acbea541fd541ef6c2bd3e066df0a54f318716e6a6cf8bf627172010100000000000000000000000000004399eace6ab60893b789677b234762264e76a97c2053bdca72fa8d2e145a1b3bd11cde5bd75428acd18eac3d6adf4e06e7e637706d", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x6d01ba8ffed4ce500f24b73f45df7dc163a96f64ced987d8ee795c34e371362e": [ + "0x090a0ad1904f86aedf87e971bec5a7c5fcf39b12d00a064560dcd2db2ef761c29c04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091cbcafd73a15869f9398bb2410de2817eeeff7a68be0f55e31ffc4c68d2348112e000bbeb0195d16d20b1c908aab77b8604b7d2e26717d9ba96a82d4b7a84bdf", + "0x0921bf8a30a3d1a684baafd49ee7a13f6eedbe9b52ce362520d8442f9fe29433bf09c3876c8274155eb6d51a79d942e22e9579509ce8fbfdc296ab24f6bac8a7cf", + "0x091ac18bfbb031365e7277465e677848506bc1f80089786c1b1893fee0f96464c709bd08cfb12c05c4f3ea2c7ebc03ee9a82f31b42ccf718fcef4649d64e9dd800", + "0x0829ce85ca1679232d4d1bb506c1a4b7974d8f38b6290131ec64653da8dc30d81128b3bf9a92d906051defc60a366063e6d133f3bb15dc661dad6b57e1f51f95e6", + "0x081f9b1d6040a2a81a670747cefe745efa1e65d2bd9147581fe96782278e4d0a380000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000002247aa69e009ac835666f64bcaf43bbb3f5a885a79f9e87e00bbd2c7bda14cde", + "0x062e4f8d4fe6ca5397cc102e59a85d43a7ea3a61c67962c510d3a09ba73a313f03078d656a65a456e82959aec42fa6f07b77bd98556b0115528907a4a95b969e0f", + "0x040959c4a1b3fc665dce20b30216d51dd0141a6738567cfbbf2054a1bc710af9480101000000000000000000000000000000000000000000000000000000010334bbc2d000206d01ba8ffed4ce500f24b73f45df7dc163a96f64ced987d8ee795c34e371362e", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": [ + "0x090a0ad1904f86aedf87e971bec5a7c5fcf39b12d00a064560dcd2db2ef761c29c04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091d97f1c4d55347b1d429c1c032640017976a1d5a4d9e7d267eaab810e76cde5410922a2f16b0d79199940d61d76b9a38b356ded2b55ef3cb9efd8d41b55cd9a1", + "0x092883e6c9f8554b07276ac716a5b75dfea32ced6155a997e35b3f628f30b7dee42c3eaa894b3a3ce7148977abf5e239b1e92deabb870ebb0476962ad8d8f623ab", + "0x092a16326c64bc4d8f5a84a63b8e8393ce26a4f3d668969a2228f016fd1803884d251cf79c50546e5f56b08ac68ccd7bd4831d70d54c284f1b750dbb69f4feadf8", + "0x09052897e407fcbc56b0630c56428eae64abb5b7deadc370bc21f274a5bd35f14527876ddd9d75c6fcccd372762c3ad645195374953db62ebb3b0651fb3ddea3fa", + "0x092424d670bdb4826aecf7911e5ccf78551d9bdd981e4933e7add19fb1da35870c28232fc84ff5aff7c535ac343ad868ffbfe6df1769d9f321124c71253d19a355", + "0x0700000000000000000000000000000000000000000000000000000000000000002cff7d3f8cc946d984acb34f304a68e26dcb573ab3511fd9a2dea354a9da4e6c", + "0x08037d7dd711aa917aa750547c959ab60a71b230acb863a3edeb6d06e0269382100000000000000000000000000000000000000000000000000000000000000000", + "0x0600ed1c9aba2defd948754347649ec9263caf733d59fc0f12d709c2466395938e0e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200", + "0x0419a44eca69f8d5e3651ccf05934126419470106b4b51bb4b96b6230b7d80236701010000000000000000000000000000530000000000000000000000000000000000000b20b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xb7a48ed9640a96e6c9b1daf6c0ed7bfd79ab7588601da96bd1ada403da9dd88e": [ + "0x090a0ad1904f86aedf87e971bec5a7c5fcf39b12d00a064560dcd2db2ef761c29c04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091d97f1c4d55347b1d429c1c032640017976a1d5a4d9e7d267eaab810e76cde5410922a2f16b0d79199940d61d76b9a38b356ded2b55ef3cb9efd8d41b55cd9a1", + "0x0919192c804de24fd6bbeb6bbe3a9e3d60628368d05e485d6d5b2cb3c87db54bb6170b4d2136b00854310e3859a85e31de715b00bde4985a57d051677d2aaa0d6b", + "0x090c7116a446f80048f743bcbe5a6fd6f74a35235d70f146a2fbc28d39f581046a29c8e336d9a3512e280786a9936b24f5d21b7c06b079152fb0ae05cb9957b933", + "0x07183d6eaf5b24b3d61190d244d68d53775408e896f412fea55ada9ae82937d39e0224d9ff76c56f22b90576f73ddf574c54444ace601eccf441db7036c55d4815", + "0x08194ee15ea738761a8b4f2d95c3c654460aa709c9fede6ba30e609f0c1d626a7a238e1e89d5a55f2ba8a0db7dcac6a7543d92077fe7d606bd6697cb5e299a5f23", + "0x092d4cdbacf6b0ccf4a2381d0b1d36410107a545fcd481b92835bd4821f7ad38f1167bdce2a8005f777f193abef5662c63d4e898cde71527739c72bbbf42b7c04e", + "0x07000000000000000000000000000000000000000000000000000000000000000009358dcfbc4a1a04810bd6dee97b6253736170df90a6b538d1cc88f277750d8b", + "0x080d39d74fd9242e2d097858caa077ceb68ef268abaa2dee96d43666bd6927e2620000000000000000000000000000000000000000000000000000000000000000", + "0x070000000000000000000000000000000000000000000000000000000000000000094c5bfdebf5109b97c1a9994d6a4dee51529c3c444ce5643e3a22667c4af0e0", + "0x0700000000000000000000000000000000000000000000000000000000000000002cb840156544781ff360e733b727b48bafd38321ada3d554e957c6c0724ef9ca", + "0x0813375bb51f9485592504060e2f4cac7735c6914d225aecd5e24ca0a6c99392b80000000000000000000000000000000000000000000000000000000000000000", + "0x07000000000000000000000000000000000000000000000000000000000000000004cec16297d2ee84f8b1f6e6c69553d6f8b91791b3b973a39839fbc6dfb7b980", + "0x07000000000000000000000000000000000000000000000000000000000000000002ca00f93392cdf165f133a95f558dea57212bd62d3ee4ea03690b9338724589", + "0x062785217da3c639460b70c19c72fec4db611ae750aca1716c2c37c192081de96d1e8e3cd766f5474f54cbf4d75446de1eecf25086720da2f52f94c1d2024f64c8", + "0x04201e4570764169daaa275ddf0ce46bfe5a2b585544b8b6c2bd05297c9deb3699010100000000000000000000000000000000000000000000000000d8d726b7177a80000020b7a48ed9640a96e6c9b1daf6c0ed7bfd79ab7588601da96bd1ada403da9dd88e", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xbb86fbc034f4e382929974bcd8419ed626b0ea647f962d89ba2fb6bd28785ab9": [ + "0x090a0ad1904f86aedf87e971bec5a7c5fcf39b12d00a064560dcd2db2ef761c29c04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091cbcafd73a15869f9398bb2410de2817eeeff7a68be0f55e31ffc4c68d2348112e000bbeb0195d16d20b1c908aab77b8604b7d2e26717d9ba96a82d4b7a84bdf", + "0x091728f14a10a6f428096b080be070908cf9a43d3d2827eab3fb0e30dff43803be05ca23d77ef7e23741a051f6f8c2bbb3f23c6031554bda48758bfe0c30661921", + "0x092844f9973c0091032065205aa3ee43dfb70a92a167f7eb4aa252eac32fe317001a70b927deef5b82b33f5984e1017152da226848ceaa921247ad871b078706d3", + "0x090be037e9fd4c2f92a2bdcb3a066a121e312873b9b8a01d269c1b08b908ca765e1abb3a2a14150ebb12955381af18d353b9fbe1eea0efefb0bde49c3ab1f68001", + "0x06018547f2a640f76cc018f7e59e6138eb2e30836acee97a44785ad34c1bb7eb3c2f71fbc869fa7279137be24861651630c3f0ac92ecb725b6136d13b8c31705df", + "0x04089fc409063b92930d10be4d1dd9ef71b9df3816a432d70290e7c76919dedb5a01010000000000000000000000000000000000000000000000000000000000000000046720bb86fbc034f4e382929974bcd8419ed626b0ea647f962d89ba2fb6bd28785ab9", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c1f": [ + "0x090a0ad1904f86aedf87e971bec5a7c5fcf39b12d00a064560dcd2db2ef761c29c04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091cbcafd73a15869f9398bb2410de2817eeeff7a68be0f55e31ffc4c68d2348112e000bbeb0195d16d20b1c908aab77b8604b7d2e26717d9ba96a82d4b7a84bdf", + "0x091728f14a10a6f428096b080be070908cf9a43d3d2827eab3fb0e30dff43803be05ca23d77ef7e23741a051f6f8c2bbb3f23c6031554bda48758bfe0c30661921", + "0x09139b028a20238945226733d3dc957255b94fcec991a7fb62670e668670043dc615cef82615590561df79ba0aeb59c3805e1bf66450098b0632b0873e52acc119", + "0x090269c5b1c6b4b35151f850f0caa5105613d97b403010715c920529fa0d1ed74e1d65d478edf0bbaee142118730ef5ebed3117411d3c132cdd135d9533b2b6ff3", + "0x0917e6a0650e3f8bddd6b56e1012b4155e44d0afc307ced8a2b8261df4c655f8d42720829d5afeb87762b75baf003dc0d67d9a310e5fa04347401ee211411f3074", + "0x0628f4649cd3965ffdae9b8bb599ed02cecfb9a00bfea4627795420548d0d3d02b061de6c1cc11d78e6268c23e9658807bd2a78d0c25035ef619d94a1d629c0975", + "0x040e11aafee10c1ada84b19baca77f65014d45b4d26b4ce3aef99a36898199d986010100000000000000000000000000003c58dbda457360a9b7d9c8713273608bd1be59af20f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c1f", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c20": [ + "0x090a0ad1904f86aedf87e971bec5a7c5fcf39b12d00a064560dcd2db2ef761c29c04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091d97f1c4d55347b1d429c1c032640017976a1d5a4d9e7d267eaab810e76cde5410922a2f16b0d79199940d61d76b9a38b356ded2b55ef3cb9efd8d41b55cd9a1", + "0x0919192c804de24fd6bbeb6bbe3a9e3d60628368d05e485d6d5b2cb3c87db54bb6170b4d2136b00854310e3859a85e31de715b00bde4985a57d051677d2aaa0d6b", + "0x090c7116a446f80048f743bcbe5a6fd6f74a35235d70f146a2fbc28d39f581046a29c8e336d9a3512e280786a9936b24f5d21b7c06b079152fb0ae05cb9957b933", + "0x07183d6eaf5b24b3d61190d244d68d53775408e896f412fea55ada9ae82937d39e0224d9ff76c56f22b90576f73ddf574c54444ace601eccf441db7036c55d4815", + "0x042b481a9ad830b50496586f117cffd43e36bb39c800fe1041856fea045d6c164901010000000000000000000000000000fc0ba9431eb05cfb341e9af3ddc911f9544f8d3c208053690728cdd65bc3df04693ede9a54b0234d698fecfe95b20f98f490cc27c8", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c21": [ + "0x090a0ad1904f86aedf87e971bec5a7c5fcf39b12d00a064560dcd2db2ef761c29c04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091cbcafd73a15869f9398bb2410de2817eeeff7a68be0f55e31ffc4c68d2348112e000bbeb0195d16d20b1c908aab77b8604b7d2e26717d9ba96a82d4b7a84bdf", + "0x091728f14a10a6f428096b080be070908cf9a43d3d2827eab3fb0e30dff43803be05ca23d77ef7e23741a051f6f8c2bbb3f23c6031554bda48758bfe0c30661921", + "0x092844f9973c0091032065205aa3ee43dfb70a92a167f7eb4aa252eac32fe317001a70b927deef5b82b33f5984e1017152da226848ceaa921247ad871b078706d3", + "0x091837d3df34f0cd641a40c90699d8a5cd9f75d95284337fb6ad97d7d400cc11a0213840d432c9a896719a5e27ac8a33c881222f55bc257631e6a9b48092f6bac3", + "0x09187c68e93dbd497a6fd042e5d48d3ec07344334576df0f8ae2c4ab519d82456c006638b810ed97d5a6e2798b22105fb538145f44b4fdc2f6133ec19f284852b9", + "0x081a6da792fdca879a8e5a966cc677327a27a93d4e0e5b4b10736f495780a755420000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000001757d3b68fe5609bb417d69e844076087720fd9ac0615a4fd7259a1177892431", + "0x08183f814d072493364968e21dc8b99b81feb73e88d08622258ff4e9e5e3e6f9cb0000000000000000000000000000000000000000000000000000000000000000", + "0x0710bd56aa4fa4fe8c8a00021a98c7a560c42dca3a35a21f4ab0a92c1ef02709a32e595a6c3c1be5266c3c8e3b8990f8c12a3209356621aaa502c0564b65659eda", + "0x08052614f553ae26abda62741495cd00d44551df1fa8a81df3a21a2c0ee814350e1d2b12508501e2c638408b3226eaff5dae4959be9d85bf09363771fb46f78f96", + "0x0628153a925626ec6022f5d63f9be0640f202ede37cf09a961a03513eb89d377230154484431d37f9c311e65c4a516c144975b04c404eae5b908e141b3df6ccf92", + "0x0409130a06ba75cb64ae567f1af4e20969bcad96dedcf63d1e434f3f6dc966ca9201010000000000000000000000000000000000000000000000000000000000000000060120f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c21", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c22": [ + "0x090a0ad1904f86aedf87e971bec5a7c5fcf39b12d00a064560dcd2db2ef761c29c04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091d97f1c4d55347b1d429c1c032640017976a1d5a4d9e7d267eaab810e76cde5410922a2f16b0d79199940d61d76b9a38b356ded2b55ef3cb9efd8d41b55cd9a1", + "0x092883e6c9f8554b07276ac716a5b75dfea32ced6155a997e35b3f628f30b7dee42c3eaa894b3a3ce7148977abf5e239b1e92deabb870ebb0476962ad8d8f623ab", + "0x092a16326c64bc4d8f5a84a63b8e8393ce26a4f3d668969a2228f016fd1803884d251cf79c50546e5f56b08ac68ccd7bd4831d70d54c284f1b750dbb69f4feadf8", + "0x09052897e407fcbc56b0630c56428eae64abb5b7deadc370bc21f274a5bd35f14527876ddd9d75c6fcccd372762c3ad645195374953db62ebb3b0651fb3ddea3fa", + "0x070000000000000000000000000000000000000000000000000000000000000000136ecb21790bfcdbefecbd46fa7dbfea6b4ea3c78ebbc2d262a7ca19ea2b0235", + "0x0822b3c66f5387d999dc66891a75bb307c11efd4950e59925d90657dffed78603611a4b142f80899b94192f56c30e2545b0f60d45246f89520b827da4245440b0a", + "0x0426021fba3d566dfc3284c8ace6e55cbf07f0864ebec2f8f1a14e7d1d1294ecf70101000000000000000000000000000000000000000000000000000000000000000f424020f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c22", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + } + } + }, + "codes": [ + { + "codeSize": 0, + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "code": "0x" + }, + { + "codeSize": 0, + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "code": "0x" + }, + { + "codeSize": 1923, + "keccakCodeHash": "0x8b37156d23eecc5f4dc725b655fd12920b9e594b2d7d707b006b2fc511519f5d", + "hash": "0x0a1108cffae95ace28f77dee674975f9461bd7cc707c45dff3d151f10130f3cd", + "code": "0x608060405234801561000f575f80fd5b506004361061009b575f3560e01c806340c10f191161006357806340c10f191461012957806370a082311461013e57806395d89b411461015d578063a9059cbb14610165578063dd62ed3e14610178575f80fd5b806306fdde031461009f578063095ea7b3146100bd57806318160ddd146100e057806323b872dd146100f7578063313ce5671461010a575b5f80fd5b6100a76101a2565b6040516100b491906105c3565b60405180910390f35b6100d06100cb366004610629565b61022d565b60405190151581526020016100b4565b6100e960035481565b6040519081526020016100b4565b6100d0610105366004610651565b610299565b6002546101179060ff1681565b60405160ff90911681526020016100b4565b61013c610137366004610629565b61044f565b005b6100e961014c36600461068a565b60046020525f908152604090205481565b6100a76104d5565b6100d0610173366004610629565b6104e2565b6100e96101863660046106aa565b600560209081525f928352604080842090915290825290205481565b5f80546101ae906106db565b80601f01602080910402602001604051908101604052809291908181526020018280546101da906106db565b80156102255780601f106101fc57610100808354040283529160200191610225565b820191905f5260205f20905b81548152906001019060200180831161020857829003601f168201915b505050505081565b335f8181526005602090815260408083206001600160a01b038716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906102879086815260200190565b60405180910390a35060015b92915050565b6001600160a01b0383165f908152600460205260408120548211156102fc5760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b60448201526064015b60405180910390fd5b6001600160a01b0384165f9081526005602090815260408083203384529091529020548211156103675760405162461bcd60e51b8152602060048201526016602482015275496e73756666696369656e7420616c6c6f77616e636560501b60448201526064016102f3565b6001600160a01b0384165f908152600460205260408120805484929061038e908490610727565b90915550506001600160a01b0383165f90815260046020526040812080548492906103ba90849061073a565b90915550506001600160a01b0384165f908152600560209081526040808320338452909152812080548492906103f1908490610727565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161043d91815260200190565b60405180910390a35060019392505050565b8060035f828254610460919061073a565b90915550506001600160a01b0382165f908152600460205260408120805483929061048c90849061073a565b90915550506040518181526001600160a01b038316905f907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b600180546101ae906106db565b335f908152600460205260408120548211156105375760405162461bcd60e51b8152602060048201526014602482015273496e73756666696369656e742062616c616e636560601b60448201526064016102f3565b335f9081526004602052604081208054849290610555908490610727565b90915550506001600160a01b0383165f908152600460205260408120805484929061058190849061073a565b90915550506040518281526001600160a01b0384169033907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001610287565b5f6020808352835180828501525f5b818110156105ee578581018301518582016040015282016105d2565b505f604082860101526040601f19601f8301168501019250505092915050565b80356001600160a01b0381168114610624575f80fd5b919050565b5f806040838503121561063a575f80fd5b6106438361060e565b946020939093013593505050565b5f805f60608486031215610663575f80fd5b61066c8461060e565b925061067a6020850161060e565b9150604084013590509250925092565b5f6020828403121561069a575f80fd5b6106a38261060e565b9392505050565b5f80604083850312156106bb575f80fd5b6106c48361060e565b91506106d26020840161060e565b90509250929050565b600181811c908216806106ef57607f821691505b60208210810361070d57634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52601160045260245ffd5b8181038181111561029357610293610713565b808201808211156102935761029361071356fea264697066735822122037b5e8204352efb74ca0aabb5eeb6432aec1c80cfe9987543bd70804bea0ff7364736f6c63430008140033" + }, + { + "codeSize": 2796, + "keccakCodeHash": "0x44107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d5", + "hash": "0x18d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f84", + "code": "0x60806040523661001357610011610017565b005b6100115b61001f6102a0565b73ffffffffffffffffffffffffffffffffffffffff1633036102965760607fffffffff000000000000000000000000000000000000000000000000000000005f35167fc9a6301a000000000000000000000000000000000000000000000000000000008101610097576100906102df565b915061028e565b7fb0e10d7a000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216016100e857610090610332565b7f70d7c690000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160161013957610090610376565b7f07ae5bc0000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160161018a576100906103a6565b7fa39f25e5000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216016101db576100906103f2565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b815160208301f35b61029e610405565b565b5f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b60606102e9610415565b5f6102f736600481846108bc565b810190610304919061090b565b905061031f8160405180602001604052805f8152505f61041f565b505060408051602081019091525f815290565b60605f8061034336600481846108bc565b8101906103509190610951565b915091506103608282600161041f565b60405180602001604052805f8152509250505090565b6060610380610415565b5f61038e36600481846108bc565b81019061039b919061090b565b905061031f8161044a565b60606103b0610415565b5f6103b96102a0565b6040805173ffffffffffffffffffffffffffffffffffffffff831660208201529192500160405160208183030381529060405291505090565b60606103fc610415565b5f6103b96104ae565b61029e6104106104ae565b6104bc565b341561029e575f80fd5b610428836104da565b5f825111806104345750805b15610445576104438383610526565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6104736102a0565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a16104ab81610552565b50565b5f6104b761065e565b905090565b365f80375f80365f845af43d5f803e8080156104d6573d5ff35b3d5ffd5b6104e381610685565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b606061054b8383604051806060016040528060278152602001610ab960279139610750565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81166105f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610285565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6102c3565b73ffffffffffffffffffffffffffffffffffffffff81163b610729576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610285565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610618565b60605f808573ffffffffffffffffffffffffffffffffffffffff16856040516107799190610a4d565b5f60405180830381855af49150503d805f81146107b1576040519150601f19603f3d011682016040523d82523d5f602084013e6107b6565b606091505b50915091506107c7868383876107d1565b9695505050505050565b606083156108665782515f0361085f5773ffffffffffffffffffffffffffffffffffffffff85163b61085f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610285565b5081610870565b6108708383610878565b949350505050565b8151156108885781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102859190610a68565b5f80858511156108ca575f80fd5b838611156108d6575f80fd5b5050820193919092039150565b803573ffffffffffffffffffffffffffffffffffffffff81168114610906575f80fd5b919050565b5f6020828403121561091b575f80fd5b61054b826108e3565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f8060408385031215610962575f80fd5b61096b836108e3565b9150602083013567ffffffffffffffff80821115610987575f80fd5b818501915085601f83011261099a575f80fd5b8135818111156109ac576109ac610924565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156109f2576109f2610924565b81604052828152886020848701011115610a0a575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f5b83811015610a45578181015183820152602001610a2d565b50505f910152565b5f8251610a5e818460208701610a2b565b9190910192915050565b602081525f8251806020840152610a86816040850160208701610a2b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a164736f6c6343000818000a" + }, + { + "codeSize": 11400, + "keccakCodeHash": "0x3980a80a13d540f6def3466df303bc40d3e8151815da811d40d5c9b5ea7c5348", + "hash": "0x1a4c85afd3fbba4136b2a89fb8b56b17b972ef37228330390e0e368ae175b9b2", + "code": "0x608060405234801561000f575f80fd5b50600436106101c6575f3560e01c80638cbab7e4116100fe578063ce67be261161009e578063ef0fde0f1161006e578063ef0fde0f146104bd578063efeadb6d146104d0578063f2fde38b146104e3578063fce40489146104f6575f80fd5b8063ce67be261461047c578063dbbb2faa14610484578063dddc98be14610497578063e3de72a5146104aa575f80fd5b8063a1218001116100d9578063a121800114610430578063a313d00714610443578063b10b69ee14610456578063c4d66de814610469575f80fd5b80638cbab7e4146103ef5780638da5cb5b146104025780639190202e1461041d575f80fd5b80635c45246b11610169578063724f91ce11610144578063724f91ce1461030e5780637304880c1461034457806385519c36146103575780638c399691146103dc575f80fd5b80635c45246b146102dc5780636f6d6cc1146102f1578063715018a614610306575f80fd5b806322bd5c1c116101a457806322bd5c1c146102775780632848aeaf146102945780632a1ea5a2146102b65780634cbcdd13146102c9575f80fd5b80631585458c146101ca57806319904c33146101e85780631c58e79314610215575b5f80fd5b6101d2610509565b6040516101df91906124fa565b60405180910390f35b6102076101f636600461256b565b60996020525f908152604090205481565b6040519081526020016101df565b61022861022336600461256b565b610608565b6040516101df91905f60a0820190506001600160a01b0383511682526020830151602083015260408301511515604083015260ff60608401511660608301526080830151608083015292915050565b609b546102849060ff1681565b60405190151581526020016101df565b6102846102a236600461259a565b609a6020525f908152604090205460ff1681565b6102076102c436600461256b565b6106f4565b6102846102d736600461256b565b61075c565b6102ef6102ea3660046125c2565b610772565b005b6102f96107a0565b6040516101df9190612613565b6102ef610848565b61033161031c36600461259a565b60986020525f908152604090205461ffff1681565b60405161ffff90911681526020016101df565b6102ef61035236600461265a565b61085b565b6103a261036536600461256b565b60976020525f908152604090208054600182015460028301546003909301546001600160a01b0390921692909160ff808316926101009004169085565b604080516001600160a01b03909616865260208601949094529115159284019290925260ff9091166060830152608082015260a0016101df565b6102ef6103ea36600461282a565b610bee565b6103316103fd36600461259a565b610ddd565b6033546040516001600160a01b0390911681526020016101df565b6102ef61042b3660046128d2565b610e46565b6102ef61043e3660046129ff565b610fe7565b61020761045136600461256b565b611103565b6102ef610464366004612ac8565b61116e565b6102ef61047736600461259a565b6112ba565b610207611488565b6102ef61049236600461256b565b611498565b6102076104a5366004612ac8565b61161a565b6102ef6104b8366004612af0565b611781565b6102ef6104cb366004612ac8565b6118ba565b6102ef6104de366004612b46565b6119fe565b6102ef6104f136600461259a565b611a6b565b61028461050436600461256b565b611b15565b60605f610516609c611b58565b90505f815167ffffffffffffffff811115610533576105336126bc565b60405190808252806020026020018201604052801561057757816020015b604080518082019091525f80825260208201528152602001906001900390816105515790505b5090505f5b8251811015610601575f83828151811061059857610598612b5f565b60209081029190910181015161ffff81165f818152609784526040908190205481518083019092529181526001600160a01b039091169281018390528551919350908590859081106105ec576105ec612b5f565b6020908102919091010152505060010161057c565b5092915050565b6040805160a0810182525f8082526020808301829052828401829052606083018290526080830182905261ffff851682526097905291909120546001600160a01b0316610681576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff82165f90815260976020908152604091829020825160a08101845281546001600160a01b031681526001820154928101839052600282015460ff808216151595830195909552610100900490931660608401526003015460808301526106e990611b6b565b602082015292915050565b61ffff81165f908152609760205260408120546001600160a01b0316610746576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5061ffff165f9081526099602052604090205490565b5f61076c609c61ffff8416611b9e565b92915050565b61077a611bb5565b610782611c29565b61078f8585858585611c9c565b6107996001606555565b5050505050565b60605f6107ad609c611b58565b90505f815167ffffffffffffffff8111156107ca576107ca6126bc565b6040519080825280602002602001820160405280156107f3578160200160208202803683370190505b5090505f5b82518110156106015782818151811061081357610813612b5f565b602002602001015182828151811061082d5761082d612b5f565b61ffff909216602092830291909101909101526001016107f8565b610850611bb5565b6108595f61200c565b565b610863611bb5565b61086b611c29565b61ffff86165f908152609760205260409020546001600160a01b03166108bd576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0385166108fd576040517f1eb00b0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0385165f9081526098602052604090205461ffff16801580159061093057508661ffff168161ffff1614155b15610967576040517f7d4fffb200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60129050866001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa9250505080156109e4575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe01682019092526109e191810190612b8c565b60015b156109ec5790505b61ffff88165f9081526097602090815260409182902054825160a081019093526001600160a01b038a811684521691908101610a288989612075565b815286151560208083019190915260ff808616604080850191909152606093840189905261ffff8e165f90815260978452819020855181546001600160a01b039182167fffffffffffffffffffffffff00000000000000000000000000000000000000009091161782559386015160018201559085015160028201805495870151909316610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff911515919091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00009095169490941793909317905560809092015160039091015581811690891614610b74576001600160a01b038181165f9081526098602052604080822080547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000908116909155928b1682529020805490911661ffff8b161790555b876001600160a01b03168961ffff167f60281b1abf645864e8443ca11a3c3b51a6a9203a376da58db7919f7cfebc4aa989888689604051610bd19493929190938452911515602084015260ff166040830152606082015260800190565b60405180910390a3505050610be66001606555565b505050505050565b609b5460ff168015610c0f5750335f908152609a602052604090205460ff16155b8015610c2657506033546001600160a01b03163314155b15610c5d576040517f2af07d2000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8051825114610c98576040517f9d89020a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8251811015610dd8575f6001600160a01b031660975f858481518110610cc257610cc2612b5f565b60209081029190910181015161ffff1682528101919091526040015f20546001600160a01b031614610dd057818181518110610d0057610d00612b5f565b60200260200101515f0315610dd057818181518110610d2157610d21612b5f565b602002602001015160995f858481518110610d3e57610d3e612b5f565b602002602001015161ffff1661ffff1681526020019081526020015f2081905550828181518110610d7157610d71612b5f565b602002602001015161ffff167fd73999ac164146908368455e72209122b67c149b37aab024e2707394a2c70467838381518110610db057610db0612b5f565b6020026020010151604051610dc791815260200190565b60405180910390a25b600101610c9a565b505050565b6001600160a01b0381165f9081526098602052604081205461ffff1680158015610e0f57506001600160a01b03831615155b1561076c576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e4e611bb5565b828114610e87576040517f9d89020a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b83811015610799575f858583818110610ea457610ea4612b5f565b9050602002016020810190610eb9919061256b565b90505f848484818110610ece57610ece612b5f565b9050602002016020810190610ee39190612b46565b61ffff83165f908152609760205260409020549091506001600160a01b0316610f0d575050610fdf565b61ffff82165f9081526097602052604090206002015460ff1680151582151514610fdb5761ffff83165f90815260976020526040902060020180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168315801591909117909155610fac5760405161ffff8416907fba78a86bd882b78fb95715a0d827188ec0a8ad3f500310d33a39b94c9ff677b8905f90a2610fdb565b60405161ffff8416907fa625871090c2595895650b8e9222d1a3267cedf9de819bf446400962ce1357ef905f90a25b5050505b600101610e89565b610fef611bb5565b610ff7611c29565b8351855114158061100a57508251855114155b8061101757508151855114155b8061102457508051855114155b1561105b576040517f9d89020a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b85518110156110f8576110f086828151811061107b5761107b612b5f565b602002602001015186838151811061109557611095612b5f565b60200260200101518684815181106110af576110af612b5f565b60200260200101518685815181106110c9576110c9612b5f565b60200260200101518686815181106110e3576110e3612b5f565b6020026020010151611c9c565b60010161105d565b506107996001606555565b61ffff81165f908152609760205260408120546001600160a01b0316611155576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5061ffff165f9081526097602052604090206003015490565b609b5460ff16801561118f5750335f908152609a602052604090205460ff16155b80156111a657506033546001600160a01b03163314155b156111dd576040517f2af07d2000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff82165f908152609760205260409020546001600160a01b031661122f576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f03611267576040517ebfc92100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff82165f8181526099602052604090819020839055517fd73999ac164146908368455e72209122b67c149b37aab024e2707394a2c70467906112ae9084815260200190565b60405180910390a25050565b5f54610100900460ff16158080156112d857505f54600160ff909116105b806112f15750303b1580156112f157505f5460ff166001145b611382576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201527f647920696e697469616c697a656400000000000000000000000000000000000060648201526084015b60405180910390fd5b5f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0016600117905580156113de575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff166101001790555b6113e66120c4565b6113ee612162565b6113f78261200c565b609b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff001660011790558015611484575f80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b5050565b5f611493609c612200565b905090565b6114a0611bb5565b61ffff81165f908152609760205260409020546001600160a01b0316806114f3576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611502609c61ffff8416611b9e565b611538576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff82165f81815260976020908152604080832080547fffffffffffffffffffffffff0000000000000000000000000000000000000000168155600181018490556002810180547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff000090811690915560039091018490556001600160a01b0386168452609883528184208054909116905592825260999052908120556115dd82612209565b6040516001600160a01b0382169061ffff8416907f330282f89b53f03dfc62130ddb33062a147ad25d691915b575732f62fb6fce9a905f90a35050565b61ffff82165f908152609760205260408120546001600160a01b031661166c576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff83165f818152609760209081526040808320815160a08101835281546001600160a01b03168152600182015481850152600282015460ff808216151583860152610100909104166060820152600390910154608082015293835260999091528120549081900361170a576040517ebfc92100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f82608001518561171b9190612bd9565b905081600161172a8284612bf0565b6117349190612c03565b61173e9190612c16565b9350835f03611778576040517ebfc92100000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505092915050565b611789611bb5565b80518251146117c4576040517fd9183d2b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f5b8251811015610dd8578181815181106117e1576117e1612b5f565b6020026020010151609a5f8584815181106117fe576117fe612b5f565b60200260200101516001600160a01b03166001600160a01b031681526020019081526020015f205f6101000a81548160ff02191690831515021790555082818151811061184d5761184d612b5f565b60200260200101516001600160a01b03167f6dad0aed33f4b7f07095619b668698e17943fd9f4c83e7cfcc7f6dd880a1158883838151811061189157611891612b5f565b60200260200101516040516118aa911515815260200190565b60405180910390a26001016117c6565b609b5460ff1680156118db5750335f908152609a602052604090205460ff16155b80156118f257506033546001600160a01b03163314155b15611929576040517f2af07d2000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff82165f908152609760205260409020546001600160a01b031661197b576040517fcbdb7b3000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f036119b4576040517f70ce14bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff82165f8181526097602052604090819020600301839055517f7b614d0c690ae942aec30d9378eb72c3678dd8cb74a55343c87baf8dfe078e74906112ae9084815260200190565b611a06611bb5565b609b80547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00168215159081179091556040519081527f16435b45f7482047f839a6a19d291442627200f52cad2803c595150d0d440eb39060200160405180910390a150565b611a73611bb5565b6001600160a01b038116611b09576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401611379565b611b128161200c565b50565b61ffff81165f908152609760205260408120546001600160a01b0316611b3c57505f919050565b5061ffff165f9081526097602052604090206002015460ff1690565b60605f611b6483612218565b9392505050565b5f81611b7857505f919050565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0190565b5f8181526001830160205260408120541515611b64565b6033546001600160a01b03163314610859576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726044820152606401611379565b600260655403611c95576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401611379565b6002606555565b6001600160a01b038416611cdc576040517f1eb00b0600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8461ffff165f03611d19576040517f6aa2a93700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61ffff85165f908152609760205260409020546001600160a01b031615611d6c576040517f7d4fffb200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600160a01b0384165f9081526098602052604090205461ffff1615611dbf576040517f7d4fffb200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805f03611df8576040517f70ce14bb00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5f60129050846001600160a01b031663313ce5676040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015611e75575060408051601f3d9081017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0168201909252611e7291810190612b8c565b60015b15611e7d5790505b6040518060a00160405280866001600160a01b03168152602001611ea18686612075565b81525f602080830182905260ff808616604080860191909152606094850188905261ffff8c1680855260978452818520875181546001600160a01b039182167fffffffffffffffffffffffff000000000000000000000000000000000000000090911617825588860151600183015588840151600283018054998b0151909616610100027fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00ff911515919091167fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0000998a161717909455608090970151600390970196909655908a1683526098909152902080549091169091179055611fa486612271565b604080518581525f602082015260ff8316818301526060810184905290516001600160a01b0387169161ffff8916917fb9d0acb419ab21384716fbeaa0bcbc172f6347c9bf4fc0614c4e79fc47b36e119181900360800190a3505050505050565b6001606555565b603380546001600160a01b038381167fffffffffffffffffffffffff0000000000000000000000000000000000000000831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b5f8161208257505f61076c565b600183016120bc576040517feab9612d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505060010190565b5f54610100900460ff1661215a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401611379565b610859612280565b5f54610100900460ff166121f8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401611379565b61085961231f565b5f61076c825490565b611484609c61ffff83166123b5565b6060815f0180548060200260200160405190810160405280929190818152602001828054801561226557602002820191905f5260205f20905b815481526020019060010190808311612251575b50505050509050919050565b611484609c61ffff83166123c0565b5f54610100900460ff16612316576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401611379565b6108593361200c565b5f54610100900460ff16612005576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201527f6e697469616c697a696e670000000000000000000000000000000000000000006064820152608401611379565b5f611b6483836123cb565b5f611b6483836124ae565b5f81815260018301602052604081205480156124a5575f6123ed600183612c03565b85549091505f9061240090600190612c03565b905081811461245f575f865f01828154811061241e5761241e612b5f565b905f5260205f200154905080875f01848154811061243e5761243e612b5f565b5f918252602080832090910192909255918252600188019052604090208390555b855486908061247057612470612c4e565b600190038181905f5260205f20015f90559055856001015f8681526020019081526020015f205f90556001935050505061076c565b5f91505061076c565b5f8181526001830160205260408120546124f357508154600181810184555f84815260208082209093018490558454848252828601909352604090209190915561076c565b505f61076c565b602080825282518282018190525f919060409081850190868401855b82811015612548578151805161ffff1685528601516001600160a01b0316868501529284019290850190600101612516565b5091979650505050505050565b803561ffff81168114612566575f80fd5b919050565b5f6020828403121561257b575f80fd5b611b6482612555565b80356001600160a01b0381168114612566575f80fd5b5f602082840312156125aa575f80fd5b611b6482612584565b80358015158114612566575f80fd5b5f805f805f60a086880312156125d6575f80fd5b6125df86612555565b94506125ed60208701612584565b935060408601359250612602606087016125b3565b949793965091946080013592915050565b602080825282518282018190525f9190848201906040850190845b8181101561264e57835161ffff168352928401929184019160010161262e565b50909695505050505050565b5f805f805f8060c0878903121561266f575f80fd5b61267887612555565b955061268660208801612584565b94506040870135935061269b606088016125b3565b92506126a9608088016125b3565b915060a087013590509295509295509295565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016810167ffffffffffffffff81118282101715612730576127306126bc565b604052919050565b5f67ffffffffffffffff821115612751576127516126bc565b5060051b60200190565b5f82601f83011261276a575f80fd5b8135602061277f61277a83612738565b6126e9565b8083825260208201915060208460051b8701019350868411156127a0575f80fd5b602086015b848110156127c3576127b681612555565b83529183019183016127a5565b509695505050505050565b5f82601f8301126127dd575f80fd5b813560206127ed61277a83612738565b8083825260208201915060208460051b87010193508684111561280e575f80fd5b602086015b848110156127c35780358352918301918301612813565b5f806040838503121561283b575f80fd5b823567ffffffffffffffff80821115612852575f80fd5b61285e8683870161275b565b93506020850135915080821115612873575f80fd5b50612880858286016127ce565b9150509250929050565b5f8083601f84011261289a575f80fd5b50813567ffffffffffffffff8111156128b1575f80fd5b6020830191508360208260051b85010111156128cb575f80fd5b9250929050565b5f805f80604085870312156128e5575f80fd5b843567ffffffffffffffff808211156128fc575f80fd5b6129088883890161288a565b90965094506020870135915080821115612920575f80fd5b5061292d8782880161288a565b95989497509550505050565b5f82601f830112612948575f80fd5b8135602061295861277a83612738565b8083825260208201915060208460051b870101935086841115612979575f80fd5b602086015b848110156127c35761298f81612584565b835291830191830161297e565b5f82601f8301126129ab575f80fd5b813560206129bb61277a83612738565b8083825260208201915060208460051b8701019350868411156129dc575f80fd5b602086015b848110156127c3576129f2816125b3565b83529183019183016129e1565b5f805f805f60a08688031215612a13575f80fd5b853567ffffffffffffffff80821115612a2a575f80fd5b612a3689838a0161275b565b96506020880135915080821115612a4b575f80fd5b612a5789838a01612939565b95506040880135915080821115612a6c575f80fd5b612a7889838a016127ce565b94506060880135915080821115612a8d575f80fd5b612a9989838a0161299c565b93506080880135915080821115612aae575f80fd5b50612abb888289016127ce565b9150509295509295909350565b5f8060408385031215612ad9575f80fd5b612ae283612555565b946020939093013593505050565b5f8060408385031215612b01575f80fd5b823567ffffffffffffffff80821115612b18575f80fd5b612b2486838701612939565b93506020850135915080821115612b39575f80fd5b506128808582860161299c565b5f60208284031215612b56575f80fd5b611b64826125b3565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f60208284031215612b9c575f80fd5b815160ff81168114611b64575f80fd5b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b808202811582820484141761076c5761076c612bac565b8082018082111561076c5761076c612bac565b8181038181111561076c5761076c612bac565b5f82612c49577f4e487b71000000000000000000000000000000000000000000000000000000005f52601260045260245ffd5b500490565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603160045260245ffdfea164736f6c6343000818000a" + } + ], + "txStorageTraces": [ + { + "rootBefore": "0x2bdd19721d4454e55a87359621cdb678ed967220b6c99763289947c43aa91f4f", + "rootAfter": "0x0000000000000000000000000000000000000000000000000000000000000000", + "proofs": { + "0x3c58DBda457360a9B7D9c8713273608bd1Be59af": [ + "0x09236a77302583f53b4f50be116ee711f1446c731ce5fad55aa69d17da66c468cc083f31c46077cff3f32f02fff4c2952f72a4d384fdd9a32457a126834f31ac73", + "0x091d8263a8c1dfccd904d91b9911d1762d7e8a8771fe7d7ff05f69066511ad70f70b6600e39a4759942f41ce3ace7530502d4a000c2070c336d489d5cd0cec9ffa", + "0x0925c349f8fd600354b860853897df06673e055b80164e1fbaf3d16b28c241f9992725387247b73f2b6775bc465475b6d73c1ad699f3657d5187dbd95fc91cfaf6", + "0x092220d693e2d9895b96b0530dcb80a79f55102dd1143455513d520abbbba1435e06c0ef8a60eb13de2a024d46a58d75511c373a84706c65e7e590e7ec657afffc", + "0x092518f8d92281a123ca9f8c9a10ffa90bd4166de182aa8c4592176e177d458ebf08a35ae34ff65a9930ffe680f5184b556f1d92911a353d1b8d1840afc8bddea8", + "0x091c6258c6d7113965fa33cf47433176a0ea35c1012a8d1462b4ed521982b67e16283eeb7700302da736914d5f488b72d27191accd2c98343643f708bcc02c5add", + "0x072a941db58791cdd82561e2f2360c76f22ca32f9495acc14f4855069f870472680f0de72990e3dd0a3e749c70613bc3de4b1ac9a07d4e68199588fb40ccb1b630", + "0x09225c9237041df4c7b61dd1d0162f1ede5e947e13b067a4b6acdac845b5d951d606a780c5b07fb945d0da31456c6dadfdb4e9a683572f8783d51fce46fbd49626", + "0x081c00d84bef9c7d63f18dff5073c319b2545d7872ef745c6cd7212127196deb100000000000000000000000000000000000000000000000000000000000000000", + "0x0603d19675dc5d4852044dd5b334040c8653557486001ae05e70c3813d9dde083404a8ca4292860128fdc7e3d0d78621c121feed1726d8ed71918bb3fbc6b0e264", + "0x0415332f1e7c756905199e3e1821b812e853569e281f4d7b7d95ed06db34a6987005080000000000000000000000000000000000000000000000000783000000000000000100000000000000000000000000000000000000000000000000000000000000000cfbf69eb2cf2cfc56a58ee70f09856efe8cb7bc960de5d423f06f05f0b6ed318b37156d23eecc5f4dc725b655fd12920b9e594b2d7d707b006b2fc511519f5d0a1108cffae95ace28f77dee674975f9461bd7cc707c45dff3d151f10130f3cd203c58dbda457360a9b7d9c8713273608bd1be59af000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5add06F01e73b75A4184C8cb74485bB0A897b23E": [ + "0x09236a77302583f53b4f50be116ee711f1446c731ce5fad55aa69d17da66c468cc083f31c46077cff3f32f02fff4c2952f72a4d384fdd9a32457a126834f31ac73", + "0x092f8cad70b83a6343203d02e34289416059c47bffdddb3ca8b5e8348f97b292b81402d08328ff5a3ca884a55a109d087c50a9a89521102a505733870aa5d7667c", + "0x0920a6325386073c96f92f7ecb804871e5cdef9deaaaee7d92a3cc6d038be4dd77030f83fd46a40d224591afe4ff831180641ad6ac5e472e56a59f432a8a9f6595", + "0x09222a5e69086ef2a7c46b077993727085def25338ea0a98a2db1eed27e21c8e2429ef51add6ced0c0b8e4fffc383ae8084bdec66f54c6071a83c4270a51f318b3", + "0x091ac65ea4d9606a1f4f1f9dbdaf80ff5f48ca55a63965f1ba97c94429af2196f40ccaadf733376b76eb22ab103f97bd2dffbbd785fa127adf4446b1b59008b8c4", + "0x09292ef7d9e5c59efa6c571372579c4d2b0cbc622805577b083a63e95fb636a1da217af1283c8c8a7694708ca18bd6430333d4ab2d79420be8a5d6c767717adff8", + "0x070f48fcbcfe94d9e293618b428a44065dd774c063d8c1caefa5323018ec799d9f07adcfc32d2156fc2948be6a6dcb37a718f9f967c7971e85369865c6ebf918fb", + "0x0700000000000000000000000000000000000000000000000000000000000000000779e14271ee5111986cb521b565f55991d000cf5ba2ee0c04dacf801a44d201", + "0x0907fbff3626792b9fd73b39664bc11eb535b540b0a4eeb2d2ba1e7f22756d9b330de2336ed6cc6f7af14d35c543eed899daa6eb26214ee4642e037c0d071fffa9", + "0x06283465243b826f14bb66f7babd9dc61ea472872a89ef8a1e0859667f22971e352c211763cea4dfb702e9975509f9d3790e316d45c0c733026d33cb31efd2808a", + "0x041736e2ebcabec708f4ecce38cd9c16a8a1f6ebfa1df67ed285e8e2ef95f2aec105080000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000002a570d96d4d7cf30000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864205add06f01e73b75a4184c8cb74485bb0a897b23e000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x716170D0687c3d31CC10DebE0dAa1DDD3FE3D792": [ + "0x09236a77302583f53b4f50be116ee711f1446c731ce5fad55aa69d17da66c468cc083f31c46077cff3f32f02fff4c2952f72a4d384fdd9a32457a126834f31ac73", + "0x091d8263a8c1dfccd904d91b9911d1762d7e8a8771fe7d7ff05f69066511ad70f70b6600e39a4759942f41ce3ace7530502d4a000c2070c336d489d5cd0cec9ffa", + "0x0925c349f8fd600354b860853897df06673e055b80164e1fbaf3d16b28c241f9992725387247b73f2b6775bc465475b6d73c1ad699f3657d5187dbd95fc91cfaf6", + "0x0914b3df4048fc34a513e1c19fd47c2bd992b321bd1f0d1ca50a40af8920ecbab91ff6815f32091c3320ba81300163e9531393d5c0b903aa425a8ee14627de7b47", + "0x0913eff588f55e7c7a2f3fdb66c7e34afeb3eb8c83472b7ea6f3c5e20cfdaf27790edbd119400f8d026e7adde1b8066cf0598c7e1d77319854d06564dec8f41c7f", + "0x090fea719a68a48e9dd333707efbb005a4c81d29707e4eedad5babdbdb10448b080e76453c083d03a6e85406f198451801a9270399d74521dde8cfe2c4129acc4f", + "0x092d8cf9858ac296e55a357479747ad048821376d4f043407af9d043dd953dfb0c14e201117cb6d445d2dad0921101124c6de4e4464c9a2901e9fcf4354b8f7e0e", + "0x0700000000000000000000000000000000000000000000000000000000000000002a99f0c4bc934e47bab0edc377ae3e441e59738081016824793ddccd49793b73", + "0x062da1750dc9f7ebf795aa7f4d9ee6933579283a4242334ff38e298db642ba41722a97a2750ce48f2cb6dda838b668fe1cda73b9c484204645343effd87697d53f", + "0x0414b0bb4090afcdae623b69d996022ea82c221cd1a3c00c5b13acb37d750f87fc0508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fdcf5b84a5fca490000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420716170d0687c3d31cc10debe0daa1ddd3fe3d792000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xb055051fb2889Be5e9831524f1624941299C49bb": [ + "0x09236a77302583f53b4f50be116ee711f1446c731ce5fad55aa69d17da66c468cc083f31c46077cff3f32f02fff4c2952f72a4d384fdd9a32457a126834f31ac73", + "0x091d8263a8c1dfccd904d91b9911d1762d7e8a8771fe7d7ff05f69066511ad70f70b6600e39a4759942f41ce3ace7530502d4a000c2070c336d489d5cd0cec9ffa", + "0x0925c349f8fd600354b860853897df06673e055b80164e1fbaf3d16b28c241f9992725387247b73f2b6775bc465475b6d73c1ad699f3657d5187dbd95fc91cfaf6", + "0x092220d693e2d9895b96b0530dcb80a79f55102dd1143455513d520abbbba1435e06c0ef8a60eb13de2a024d46a58d75511c373a84706c65e7e590e7ec657afffc", + "0x0927720dabb5f35163812456ae15aa20f642527fac0b2a79ea4c9efc5746ada5a4194e4957538093c5fd1654d7566bec4d0c475ed3bc5c307b70d08e5820b7d54c", + "0x09302a4b53c54a6e6fd628592b269001c1e37d0024fa778e1a9dd4be8b49eeca592bee81201efc661b8170dd635aecf86d593e76e5f8e40458107b46bc91a8ab26", + "0x09117d192aeaa6311af3cf6179950c2d4664e3af8dc4fbf41100681584042a35dc26c224419d00af5893c652e7eb3667f802f9c98ed3b5eeb1083124c23b11c420", + "0x061d741b029db79b9631a6164c03568163e5598506df9846ca6fa2d281f2ce955812f19270e258360929b61244523c717f78bf7b785da7b0a5d4e06a8b3541641b", + "0x042309c8ab1f3c5435a473ea279640fbd4ebdde9ff680ac6b79971a0d96582fac805080000000000000000000000000000000000000000000000000000000000000000045a0000000000000000000000000000000000000000000000006dbc36546bf1c8a80000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420b055051fb2889be5e9831524f1624941299c49bb000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "storageProofs": { + "0x3c58DBda457360a9B7D9c8713273608bd1Be59af": { + "0x2bc0a6c7d79a49c3ae960abc1b08ccd6c0b844abaa810594f68fdefc701b92d6": [ + "0x090b6430fd521e866f260e03807db65b0fbf909435b3dc0101d735f8eb232ec77d0001f5fa8eee97a5f05ec191ee67362d6206b4bcbcca389ef12e3a0a6235b9b9", + "0x092f84cc51764db2ac29d9fa763d293a2318549dd50465819cad60f363f00fe47e1edf07db6d97b629ee7b052a2761056dea1e06d70da97de8d384a4a6e09b31b5", + "0x082630e39da8acbb5230d9d60a18ce34f26ed281c407597bf3706e11d138e8843a14439a4405f15064034fa91a5b8cdc2c43502aac67dc96e4293a451c5e1154fd", + "0x072df0a2b7734173fe5c633d61fed384f4435213f399f9007a240705ca99847b0d1a176f1033928de7ae92a6252392c0e025cb29f488a7df2649467cc36735301d", + "0x070000000000000000000000000000000000000000000000000000000000000000231581a4538be7a08e6f7fd655826cb1ff3abd22f546068b347add86c6ec17c7", + "0x062b1ad0bb5b1bd54576333a369deb329f171181273a47df481804407c54cf84082068676cb5fc3ee474e9d3a1ea873895d285664596e5dd3389cc9f7f761e6aa0", + "0x0429d8c87e5e7036a7ccbd5754f78c1d9a8cb750530e9a5a03d1c4a92b326ac35a0101000000000000000000000000000000000000000000000000000000000000024ba6c3202bc0a6c7d79a49c3ae960abc1b08ccd6c0b844abaa810594f68fdefc701b92d6", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xed3b720424f8e7d811b36ea6ea06ba9dbb304fb353fe36fff4d75ce3b5706137": [ + "0x090b6430fd521e866f260e03807db65b0fbf909435b3dc0101d735f8eb232ec77d0001f5fa8eee97a5f05ec191ee67362d6206b4bcbcca389ef12e3a0a6235b9b9", + "0x092f84cc51764db2ac29d9fa763d293a2318549dd50465819cad60f363f00fe47e1edf07db6d97b629ee7b052a2761056dea1e06d70da97de8d384a4a6e09b31b5", + "0x082630e39da8acbb5230d9d60a18ce34f26ed281c407597bf3706e11d138e8843a14439a4405f15064034fa91a5b8cdc2c43502aac67dc96e4293a451c5e1154fd", + "0x0424f6c97e04f23262b2b294f40f6a3972028a8f43c4b755fd9f5017d2cc3373c601010000000000000000000000000000000000000000000000000000000000e90da7e7fd20ed3b720424f8e7d811b36ea6ea06ba9dbb304fb353fe36fff4d75ce3b5706137", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x5300000000000000000000000000000000000021": { + "0x6d01ba8ffed4ce500f24b73f45df7dc163a96f64ced987d8ee795c34e371362e": [ + "0x090a0ad1904f86aedf87e971bec5a7c5fcf39b12d00a064560dcd2db2ef761c29c04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091cbcafd73a15869f9398bb2410de2817eeeff7a68be0f55e31ffc4c68d2348112e000bbeb0195d16d20b1c908aab77b8604b7d2e26717d9ba96a82d4b7a84bdf", + "0x0921bf8a30a3d1a684baafd49ee7a13f6eedbe9b52ce362520d8442f9fe29433bf09c3876c8274155eb6d51a79d942e22e9579509ce8fbfdc296ab24f6bac8a7cf", + "0x091ac18bfbb031365e7277465e677848506bc1f80089786c1b1893fee0f96464c709bd08cfb12c05c4f3ea2c7ebc03ee9a82f31b42ccf718fcef4649d64e9dd800", + "0x0829ce85ca1679232d4d1bb506c1a4b7974d8f38b6290131ec64653da8dc30d81128b3bf9a92d906051defc60a366063e6d133f3bb15dc661dad6b57e1f51f95e6", + "0x081f9b1d6040a2a81a670747cefe745efa1e65d2bd9147581fe96782278e4d0a380000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000002247aa69e009ac835666f64bcaf43bbb3f5a885a79f9e87e00bbd2c7bda14cde", + "0x062e4f8d4fe6ca5397cc102e59a85d43a7ea3a61c67962c510d3a09ba73a313f03078d656a65a456e82959aec42fa6f07b77bd98556b0115528907a4a95b969e0f", + "0x040959c4a1b3fc665dce20b30216d51dd0141a6738567cfbbf2054a1bc710af9480101000000000000000000000000000000000000000000000000000000010334bbc2d000206d01ba8ffed4ce500f24b73f45df7dc163a96f64ced987d8ee795c34e371362e", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c1f": [ + "0x090a0ad1904f86aedf87e971bec5a7c5fcf39b12d00a064560dcd2db2ef761c29c04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091cbcafd73a15869f9398bb2410de2817eeeff7a68be0f55e31ffc4c68d2348112e000bbeb0195d16d20b1c908aab77b8604b7d2e26717d9ba96a82d4b7a84bdf", + "0x091728f14a10a6f428096b080be070908cf9a43d3d2827eab3fb0e30dff43803be05ca23d77ef7e23741a051f6f8c2bbb3f23c6031554bda48758bfe0c30661921", + "0x09139b028a20238945226733d3dc957255b94fcec991a7fb62670e668670043dc615cef82615590561df79ba0aeb59c3805e1bf66450098b0632b0873e52acc119", + "0x090269c5b1c6b4b35151f850f0caa5105613d97b403010715c920529fa0d1ed74e1d65d478edf0bbaee142118730ef5ebed3117411d3c132cdd135d9533b2b6ff3", + "0x0917e6a0650e3f8bddd6b56e1012b4155e44d0afc307ced8a2b8261df4c655f8d42720829d5afeb87762b75baf003dc0d67d9a310e5fa04347401ee211411f3074", + "0x0628f4649cd3965ffdae9b8bb599ed02cecfb9a00bfea4627795420548d0d3d02b061de6c1cc11d78e6268c23e9658807bd2a78d0c25035ef619d94a1d629c0975", + "0x040e11aafee10c1ada84b19baca77f65014d45b4d26b4ce3aef99a36898199d986010100000000000000000000000000003c58dbda457360a9b7d9c8713273608bd1be59af20f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c1f", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c20": [ + "0x090a0ad1904f86aedf87e971bec5a7c5fcf39b12d00a064560dcd2db2ef761c29c04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091d97f1c4d55347b1d429c1c032640017976a1d5a4d9e7d267eaab810e76cde5410922a2f16b0d79199940d61d76b9a38b356ded2b55ef3cb9efd8d41b55cd9a1", + "0x0919192c804de24fd6bbeb6bbe3a9e3d60628368d05e485d6d5b2cb3c87db54bb6170b4d2136b00854310e3859a85e31de715b00bde4985a57d051677d2aaa0d6b", + "0x090c7116a446f80048f743bcbe5a6fd6f74a35235d70f146a2fbc28d39f581046a29c8e336d9a3512e280786a9936b24f5d21b7c06b079152fb0ae05cb9957b933", + "0x07183d6eaf5b24b3d61190d244d68d53775408e896f412fea55ada9ae82937d39e0224d9ff76c56f22b90576f73ddf574c54444ace601eccf441db7036c55d4815", + "0x042b481a9ad830b50496586f117cffd43e36bb39c800fe1041856fea045d6c164901010000000000000000000000000000fc0ba9431eb05cfb341e9af3ddc911f9544f8d3c208053690728cdd65bc3df04693ede9a54b0234d698fecfe95b20f98f490cc27c8", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c21": [ + "0x090a0ad1904f86aedf87e971bec5a7c5fcf39b12d00a064560dcd2db2ef761c29c04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091cbcafd73a15869f9398bb2410de2817eeeff7a68be0f55e31ffc4c68d2348112e000bbeb0195d16d20b1c908aab77b8604b7d2e26717d9ba96a82d4b7a84bdf", + "0x091728f14a10a6f428096b080be070908cf9a43d3d2827eab3fb0e30dff43803be05ca23d77ef7e23741a051f6f8c2bbb3f23c6031554bda48758bfe0c30661921", + "0x092844f9973c0091032065205aa3ee43dfb70a92a167f7eb4aa252eac32fe317001a70b927deef5b82b33f5984e1017152da226848ceaa921247ad871b078706d3", + "0x091837d3df34f0cd641a40c90699d8a5cd9f75d95284337fb6ad97d7d400cc11a0213840d432c9a896719a5e27ac8a33c881222f55bc257631e6a9b48092f6bac3", + "0x09187c68e93dbd497a6fd042e5d48d3ec07344334576df0f8ae2c4ab519d82456c006638b810ed97d5a6e2798b22105fb538145f44b4fdc2f6133ec19f284852b9", + "0x081a6da792fdca879a8e5a966cc677327a27a93d4e0e5b4b10736f495780a755420000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000001757d3b68fe5609bb417d69e844076087720fd9ac0615a4fd7259a1177892431", + "0x08183f814d072493364968e21dc8b99b81feb73e88d08622258ff4e9e5e3e6f9cb0000000000000000000000000000000000000000000000000000000000000000", + "0x0710bd56aa4fa4fe8c8a00021a98c7a560c42dca3a35a21f4ab0a92c1ef02709a32e595a6c3c1be5266c3c8e3b8990f8c12a3209356621aaa502c0564b65659eda", + "0x08052614f553ae26abda62741495cd00d44551df1fa8a81df3a21a2c0ee814350e1d2b12508501e2c638408b3226eaff5dae4959be9d85bf09363771fb46f78f96", + "0x0628153a925626ec6022f5d63f9be0640f202ede37cf09a961a03513eb89d377230154484431d37f9c311e65c4a516c144975b04c404eae5b908e141b3df6ccf92", + "0x0409130a06ba75cb64ae567f1af4e20969bcad96dedcf63d1e434f3f6dc966ca9201010000000000000000000000000000000000000000000000000000000000000000060120f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c21", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c22": [ + "0x090a0ad1904f86aedf87e971bec5a7c5fcf39b12d00a064560dcd2db2ef761c29c04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091d97f1c4d55347b1d429c1c032640017976a1d5a4d9e7d267eaab810e76cde5410922a2f16b0d79199940d61d76b9a38b356ded2b55ef3cb9efd8d41b55cd9a1", + "0x092883e6c9f8554b07276ac716a5b75dfea32ced6155a997e35b3f628f30b7dee42c3eaa894b3a3ce7148977abf5e239b1e92deabb870ebb0476962ad8d8f623ab", + "0x092a16326c64bc4d8f5a84a63b8e8393ce26a4f3d668969a2228f016fd1803884d251cf79c50546e5f56b08ac68ccd7bd4831d70d54c284f1b750dbb69f4feadf8", + "0x09052897e407fcbc56b0630c56428eae64abb5b7deadc370bc21f274a5bd35f14527876ddd9d75c6fcccd372762c3ad645195374953db62ebb3b0651fb3ddea3fa", + "0x070000000000000000000000000000000000000000000000000000000000000000136ecb21790bfcdbefecbd46fa7dbfea6b4ea3c78ebbc2d262a7ca19ea2b0235", + "0x0822b3c66f5387d999dc66891a75bb307c11efd4950e59925d90657dffed78603611a4b142f80899b94192f56c30e2545b0f60d45246f89520b827da4245440b0a", + "0x0426021fba3d566dfc3284c8ace6e55cbf07f0864ebec2f8f1a14e7d1d1294ecf70101000000000000000000000000000000000000000000000000000000000000000f424020f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c22", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + } + } + }, + { + "rootBefore": "0x0000000000000000000000000000000000000000000000000000000000000000", + "rootAfter": "0x0000000000000000000000000000000000000000000000000000000000000000", + "proofs": { + "0x18e57b943f4391249A3920b948FD76EF9Dbf53E4": [ + "0x09236a77302583f53b4f50be116ee711f1446c731ce5fad55aa69d17da66c468cc083f31c46077cff3f32f02fff4c2952f72a4d384fdd9a32457a126834f31ac73", + "0x091d8263a8c1dfccd904d91b9911d1762d7e8a8771fe7d7ff05f69066511ad70f70b6600e39a4759942f41ce3ace7530502d4a000c2070c336d489d5cd0cec9ffa", + "0x0925c349f8fd600354b860853897df06673e055b80164e1fbaf3d16b28c241f9992725387247b73f2b6775bc465475b6d73c1ad699f3657d5187dbd95fc91cfaf6", + "0x092220d693e2d9895b96b0530dcb80a79f55102dd1143455513d520abbbba1435e06c0ef8a60eb13de2a024d46a58d75511c373a84706c65e7e590e7ec657afffc", + "0x092518f8d92281a123ca9f8c9a10ffa90bd4166de182aa8c4592176e177d458ebf08a35ae34ff65a9930ffe680f5184b556f1d92911a353d1b8d1840afc8bddea8", + "0x091c6258c6d7113965fa33cf47433176a0ea35c1012a8d1462b4ed521982b67e16283eeb7700302da736914d5f488b72d27191accd2c98343643f708bcc02c5add", + "0x072a941db58791cdd82561e2f2360c76f22ca32f9495acc14f4855069f870472680f0de72990e3dd0a3e749c70613bc3de4b1ac9a07d4e68199588fb40ccb1b630", + "0x09225c9237041df4c7b61dd1d0162f1ede5e947e13b067a4b6acdac845b5d951d606a780c5b07fb945d0da31456c6dadfdb4e9a683572f8783d51fce46fbd49626", + "0x081c00d84bef9c7d63f18dff5073c319b2545d7872ef745c6cd7212127196deb100000000000000000000000000000000000000000000000000000000000000000", + "0x0603d19675dc5d4852044dd5b334040c8653557486001ae05e70c3813d9dde083404a8ca4292860128fdc7e3d0d78621c121feed1726d8ed71918bb3fbc6b0e264", + "0x04189581fea8e35deca7320d756b3c15dd45d71352feb811357c0db1cfd2976270050800000000000000000000000000000000000000000000000007830000000000000001000000000000000000000000000000000000000000000000000000000000000025654792a6c51fcdbf44b8872c3cf049940ceeddbb4e3383fbb80c25e11ce3c48b37156d23eecc5f4dc725b655fd12920b9e594b2d7d707b006b2fc511519f5d0a1108cffae95ace28f77dee674975f9461bd7cc707c45dff3d151f10130f3cd2018e57b943f4391249a3920b948fd76ef9dbf53e4000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5add06F01e73b75A4184C8cb74485bB0A897b23E": [ + "0x09236a77302583f53b4f50be116ee711f1446c731ce5fad55aa69d17da66c468cc083f31c46077cff3f32f02fff4c2952f72a4d384fdd9a32457a126834f31ac73", + "0x092f8cad70b83a6343203d02e34289416059c47bffdddb3ca8b5e8348f97b292b81402d08328ff5a3ca884a55a109d087c50a9a89521102a505733870aa5d7667c", + "0x0920a6325386073c96f92f7ecb804871e5cdef9deaaaee7d92a3cc6d038be4dd77030f83fd46a40d224591afe4ff831180641ad6ac5e472e56a59f432a8a9f6595", + "0x09222a5e69086ef2a7c46b077993727085def25338ea0a98a2db1eed27e21c8e2429ef51add6ced0c0b8e4fffc383ae8084bdec66f54c6071a83c4270a51f318b3", + "0x091ac65ea4d9606a1f4f1f9dbdaf80ff5f48ca55a63965f1ba97c94429af2196f40ccaadf733376b76eb22ab103f97bd2dffbbd785fa127adf4446b1b59008b8c4", + "0x09292ef7d9e5c59efa6c571372579c4d2b0cbc622805577b083a63e95fb636a1da217af1283c8c8a7694708ca18bd6430333d4ab2d79420be8a5d6c767717adff8", + "0x070f48fcbcfe94d9e293618b428a44065dd774c063d8c1caefa5323018ec799d9f07adcfc32d2156fc2948be6a6dcb37a718f9f967c7971e85369865c6ebf918fb", + "0x0700000000000000000000000000000000000000000000000000000000000000000779e14271ee5111986cb521b565f55991d000cf5ba2ee0c04dacf801a44d201", + "0x0907fbff3626792b9fd73b39664bc11eb535b540b0a4eeb2d2ba1e7f22756d9b330de2336ed6cc6f7af14d35c543eed899daa6eb26214ee4642e037c0d071fffa9", + "0x06283465243b826f14bb66f7babd9dc61ea472872a89ef8a1e0859667f22971e352c211763cea4dfb702e9975509f9d3790e316d45c0c733026d33cb31efd2808a", + "0x041736e2ebcabec708f4ecce38cd9c16a8a1f6ebfa1df67ed285e8e2ef95f2aec105080000000000000000000000000000000000000000000000000000000000000000000300000000000000000000000000000000000000000000000002a570d96d4d7cf30000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864205add06f01e73b75a4184c8cb74485bb0a897b23e000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x716170D0687c3d31CC10DebE0dAa1DDD3FE3D792": [ + "0x09236a77302583f53b4f50be116ee711f1446c731ce5fad55aa69d17da66c468cc083f31c46077cff3f32f02fff4c2952f72a4d384fdd9a32457a126834f31ac73", + "0x091d8263a8c1dfccd904d91b9911d1762d7e8a8771fe7d7ff05f69066511ad70f70b6600e39a4759942f41ce3ace7530502d4a000c2070c336d489d5cd0cec9ffa", + "0x0925c349f8fd600354b860853897df06673e055b80164e1fbaf3d16b28c241f9992725387247b73f2b6775bc465475b6d73c1ad699f3657d5187dbd95fc91cfaf6", + "0x0914b3df4048fc34a513e1c19fd47c2bd992b321bd1f0d1ca50a40af8920ecbab91ff6815f32091c3320ba81300163e9531393d5c0b903aa425a8ee14627de7b47", + "0x0913eff588f55e7c7a2f3fdb66c7e34afeb3eb8c83472b7ea6f3c5e20cfdaf27790edbd119400f8d026e7adde1b8066cf0598c7e1d77319854d06564dec8f41c7f", + "0x090fea719a68a48e9dd333707efbb005a4c81d29707e4eedad5babdbdb10448b080e76453c083d03a6e85406f198451801a9270399d74521dde8cfe2c4129acc4f", + "0x092d8cf9858ac296e55a357479747ad048821376d4f043407af9d043dd953dfb0c14e201117cb6d445d2dad0921101124c6de4e4464c9a2901e9fcf4354b8f7e0e", + "0x0700000000000000000000000000000000000000000000000000000000000000002a99f0c4bc934e47bab0edc377ae3e441e59738081016824793ddccd49793b73", + "0x062da1750dc9f7ebf795aa7f4d9ee6933579283a4242334ff38e298db642ba41722a97a2750ce48f2cb6dda838b668fe1cda73b9c484204645343effd87697d53f", + "0x0414b0bb4090afcdae623b69d996022ea82c221cd1a3c00c5b13acb37d750f87fc0508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fdcf5b84a5fca490000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420716170d0687c3d31cc10debe0daa1ddd3fe3d792000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xb055051fb2889Be5e9831524f1624941299C49bb": [ + "0x09236a77302583f53b4f50be116ee711f1446c731ce5fad55aa69d17da66c468cc083f31c46077cff3f32f02fff4c2952f72a4d384fdd9a32457a126834f31ac73", + "0x091d8263a8c1dfccd904d91b9911d1762d7e8a8771fe7d7ff05f69066511ad70f70b6600e39a4759942f41ce3ace7530502d4a000c2070c336d489d5cd0cec9ffa", + "0x0925c349f8fd600354b860853897df06673e055b80164e1fbaf3d16b28c241f9992725387247b73f2b6775bc465475b6d73c1ad699f3657d5187dbd95fc91cfaf6", + "0x092220d693e2d9895b96b0530dcb80a79f55102dd1143455513d520abbbba1435e06c0ef8a60eb13de2a024d46a58d75511c373a84706c65e7e590e7ec657afffc", + "0x0927720dabb5f35163812456ae15aa20f642527fac0b2a79ea4c9efc5746ada5a4194e4957538093c5fd1654d7566bec4d0c475ed3bc5c307b70d08e5820b7d54c", + "0x09302a4b53c54a6e6fd628592b269001c1e37d0024fa778e1a9dd4be8b49eeca592bee81201efc661b8170dd635aecf86d593e76e5f8e40458107b46bc91a8ab26", + "0x09117d192aeaa6311af3cf6179950c2d4664e3af8dc4fbf41100681584042a35dc26c224419d00af5893c652e7eb3667f802f9c98ed3b5eeb1083124c23b11c420", + "0x061d741b029db79b9631a6164c03568163e5598506df9846ca6fa2d281f2ce955812f19270e258360929b61244523c717f78bf7b785da7b0a5d4e06a8b3541641b", + "0x042309c8ab1f3c5435a473ea279640fbd4ebdde9ff680ac6b79971a0d96582fac805080000000000000000000000000000000000000000000000000000000000000000045a0000000000000000000000000000000000000000000000006dbc36546bf1c8a80000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420b055051fb2889be5e9831524f1624941299c49bb000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "storageProofs": { + "0x18e57b943f4391249A3920b948FD76EF9Dbf53E4": { + "0x2bc0a6c7d79a49c3ae960abc1b08ccd6c0b844abaa810594f68fdefc701b92d6": [ + "0x082480728d28108e9ca46ca627e3654f3e92bfe01063a80935ee4a458598d27e2d1d7b41377c4f47d97a66e28dc1efcc5662200fc2068c68c6e5da6c1e2e718ceb", + "0x090f493b23241b1fdc411a29bc147cc2f84e4a9cdfdc849731c2c13723960f16780be3f75d6b0d3cc7f5d8626d4afcc43a99e41c21781c607c7ebd8ce2e73bb6db", + "0x0803c2c911dc7b48cd1e8e3535d7cb0daa79691c1e1271e84397ab1dede3eabd622da624858764ed09f5ac01e6ceb4514458aa195b20938f536fc01dde090d21f7", + "0x06085ec2708f7e19a1e732ce314c463066c2d1ad9344d496bf48f86bd20ca4466d046e729135d69c474c6ba418106554114f18c52df92ac8b5da091bba68de7782", + "0x0429d8c87e5e7036a7ccbd5754f78c1d9a8cb750530e9a5a03d1c4a92b326ac35a010100000000000000000000000000000000000000000000000000001cea8ee3ae8dba80202bc0a6c7d79a49c3ae960abc1b08ccd6c0b844abaa810594f68fdefc701b92d6", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xed3b720424f8e7d811b36ea6ea06ba9dbb304fb353fe36fff4d75ce3b5706137": [ + "0x082480728d28108e9ca46ca627e3654f3e92bfe01063a80935ee4a458598d27e2d1d7b41377c4f47d97a66e28dc1efcc5662200fc2068c68c6e5da6c1e2e718ceb", + "0x090f493b23241b1fdc411a29bc147cc2f84e4a9cdfdc849731c2c13723960f16780be3f75d6b0d3cc7f5d8626d4afcc43a99e41c21781c607c7ebd8ce2e73bb6db", + "0x0803c2c911dc7b48cd1e8e3535d7cb0daa79691c1e1271e84397ab1dede3eabd622da624858764ed09f5ac01e6ceb4514458aa195b20938f536fc01dde090d21f7", + "0x0424f6c97e04f23262b2b294f40f6a3972028a8f43c4b755fd9f5017d2cc3373c60101000000000000000000000000000000000000000000000000d3f834adebcfd112458020ed3b720424f8e7d811b36ea6ea06ba9dbb304fb353fe36fff4d75ce3b5706137", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x5300000000000000000000000000000000000021": { + "0x475d269024c1af7d6d15838ca2130991aea4ae0944b3169917843465e0e8922a": [ + "0x090a0ad1904f86aedf87e971bec5a7c5fcf39b12d00a064560dcd2db2ef761c29c04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091cbcafd73a15869f9398bb2410de2817eeeff7a68be0f55e31ffc4c68d2348112e000bbeb0195d16d20b1c908aab77b8604b7d2e26717d9ba96a82d4b7a84bdf", + "0x091728f14a10a6f428096b080be070908cf9a43d3d2827eab3fb0e30dff43803be05ca23d77ef7e23741a051f6f8c2bbb3f23c6031554bda48758bfe0c30661921", + "0x09139b028a20238945226733d3dc957255b94fcec991a7fb62670e668670043dc615cef82615590561df79ba0aeb59c3805e1bf66450098b0632b0873e52acc119", + "0x09213d0b5974762004d5419d387195fafa850e032842da3c94905794e44b8c0c6219d87841da4e26d8c8db8ce6426f1c78154983ccbae3b067698c54e92cd77ae5", + "0x0620642846554360c92ba6cc2021322d90685f7ac8a3b643712504f049401fc0a008955648527ccb04b2081add32fa8bbd40e41a46016e22799a72edcc9ae1ac61", + "0x041e5b19ce6440ab2b0299338e72c03e30fe478f4b3c5b1a316ce256a6ac93f30e0101000000000000000000000000000018e57b943f4391249a3920b948fd76ef9dbf53e420475d269024c1af7d6d15838ca2130991aea4ae0944b3169917843465e0e8922a", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x475d269024c1af7d6d15838ca2130991aea4ae0944b3169917843465e0e8922b": [ + "0x090a0ad1904f86aedf87e971bec5a7c5fcf39b12d00a064560dcd2db2ef761c29c04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091d97f1c4d55347b1d429c1c032640017976a1d5a4d9e7d267eaab810e76cde5410922a2f16b0d79199940d61d76b9a38b356ded2b55ef3cb9efd8d41b55cd9a1", + "0x0919192c804de24fd6bbeb6bbe3a9e3d60628368d05e485d6d5b2cb3c87db54bb6170b4d2136b00854310e3859a85e31de715b00bde4985a57d051677d2aaa0d6b", + "0x090c7116a446f80048f743bcbe5a6fd6f74a35235d70f146a2fbc28d39f581046a29c8e336d9a3512e280786a9936b24f5d21b7c06b079152fb0ae05cb9957b933", + "0x09124072fdca11ff038a2f3e0b8b30b3b8161c440e140d3423e16574f9f5db567b2e3af29d1dcabf89f88e26e42b502f9529c81cafc3aa75fca95ed3170847fa22", + "0x08283843aa31ecb5a830c3b7d963133c08589d5ed7cc887a7c40adf6882e49610120868d00f9fb9cd7f6701ce327574fd144a88c975e8efb95a179b66cc86dde96", + "0x0801dae1feba524f3cbadb7ac82ff4180e30cadb97d449305f5675aa6f6f98c58601cf435fbe3f279de07efcef4676160bded9515cc7331a21106f4d860ffe214d", + "0x06143b9c8c8148bd69164c12fc9b4b8182968b3187a5956d69c2b97861d5ab20ca26d197d1292da1615e9e4e1fed61567e1107ac84d79deea8db3aa5b7b658d611", + "0x04208a963a771ed12d496e6a065bc90d069859365c1f2ff7eaf1b2162e63efa39101010000000000000000000000000000000000000000000000000000000000000000000520475d269024c1af7d6d15838ca2130991aea4ae0944b3169917843465e0e8922b", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x475d269024c1af7d6d15838ca2130991aea4ae0944b3169917843465e0e8922c": [ + "0x090a0ad1904f86aedf87e971bec5a7c5fcf39b12d00a064560dcd2db2ef761c29c04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091cbcafd73a15869f9398bb2410de2817eeeff7a68be0f55e31ffc4c68d2348112e000bbeb0195d16d20b1c908aab77b8604b7d2e26717d9ba96a82d4b7a84bdf", + "0x091728f14a10a6f428096b080be070908cf9a43d3d2827eab3fb0e30dff43803be05ca23d77ef7e23741a051f6f8c2bbb3f23c6031554bda48758bfe0c30661921", + "0x092844f9973c0091032065205aa3ee43dfb70a92a167f7eb4aa252eac32fe317001a70b927deef5b82b33f5984e1017152da226848ceaa921247ad871b078706d3", + "0x090be037e9fd4c2f92a2bdcb3a066a121e312873b9b8a01d269c1b08b908ca765e1abb3a2a14150ebb12955381af18d353b9fbe1eea0efefb0bde49c3ab1f68001", + "0x082046c4ef67110d984819c85a1170897bc3e42bc6a90c06f044a07eb096760a1b05b2225f0a857efdea03899f616eff13bc106bbfcad74e5111f7931e8da04107", + "0x081a3b50e39d1e0da2355c381d1a886d5d99c29945d0eeb0d2a7a925d5d0910ad50000000000000000000000000000000000000000000000000000000000000000", + "0x0824060fc7cc9544860c74634eebb1ab20d150153f682247b5aa742802a40803a40000000000000000000000000000000000000000000000000000000000000000", + "0x07000000000000000000000000000000000000000000000000000000000000000028e5d7b965e94d1f6efaacc58f962a3e0d1eda3c662649b7325e308106179a91", + "0x0604cad36862b9f470affd578703819ea27493f8b860f7296f49995e1cd5c4d4161064859534a8a9cb8251a998a70669cb1f6fb2f9d0e8cc463f140d76404ec506", + "0x040cf6d2e2b4781f877895882f7f888e8f9e4cad71a6ca3381dbfae6701a03650a01010000000000000000000000000000000000000000000000000000000000000000120120475d269024c1af7d6d15838ca2130991aea4ae0944b3169917843465e0e8922c", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x475d269024c1af7d6d15838ca2130991aea4ae0944b3169917843465e0e8922d": [ + "0x090a0ad1904f86aedf87e971bec5a7c5fcf39b12d00a064560dcd2db2ef761c29c04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091d97f1c4d55347b1d429c1c032640017976a1d5a4d9e7d267eaab810e76cde5410922a2f16b0d79199940d61d76b9a38b356ded2b55ef3cb9efd8d41b55cd9a1", + "0x092883e6c9f8554b07276ac716a5b75dfea32ced6155a997e35b3f628f30b7dee42c3eaa894b3a3ce7148977abf5e239b1e92deabb870ebb0476962ad8d8f623ab", + "0x092a16326c64bc4d8f5a84a63b8e8393ce26a4f3d668969a2228f016fd1803884d251cf79c50546e5f56b08ac68ccd7bd4831d70d54c284f1b750dbb69f4feadf8", + "0x09052897e407fcbc56b0630c56428eae64abb5b7deadc370bc21f274a5bd35f14527876ddd9d75c6fcccd372762c3ad645195374953db62ebb3b0651fb3ddea3fa", + "0x070000000000000000000000000000000000000000000000000000000000000000136ecb21790bfcdbefecbd46fa7dbfea6b4ea3c78ebbc2d262a7ca19ea2b0235", + "0x0822b3c66f5387d999dc66891a75bb307c11efd4950e59925d90657dffed78603611a4b142f80899b94192f56c30e2545b0f60d45246f89520b827da4245440b0a", + "0x0914abfd7d2c5057a6caa9bb7596832647a83615a061997cf544883ec247550dbc19d4415c0e4692c2a4741ccbfec986748be6701c68d18d0253f98579527ab990", + "0x0820d6f13c3cf07b67f35bde61eb4a87851c57793cea5e69c6a4f6d782556a8fe90000000000000000000000000000000000000000000000000000000000000000", + "0x060921b23da9e24c5e0f3bbb1eaf058c782472e949498c0ada18fa526626768f102833eaaf5c28e4d6347a8d0b374bcfe435f396bb381c7e1019a2ffbb0683296c", + "0x040cd065000f6cdb923ba93503de238f0ffc81e7a6a23f27c8f63a462be869d4b70101000000000000000000000000000000000000000000000000d3c21bcecceda100000020475d269024c1af7d6d15838ca2130991aea4ae0944b3169917843465e0e8922d", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xb7a48ed9640a96e6c9b1daf6c0ed7bfd79ab7588601da96bd1ada403da9dd88e": [ + "0x090a0ad1904f86aedf87e971bec5a7c5fcf39b12d00a064560dcd2db2ef761c29c04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091d97f1c4d55347b1d429c1c032640017976a1d5a4d9e7d267eaab810e76cde5410922a2f16b0d79199940d61d76b9a38b356ded2b55ef3cb9efd8d41b55cd9a1", + "0x0919192c804de24fd6bbeb6bbe3a9e3d60628368d05e485d6d5b2cb3c87db54bb6170b4d2136b00854310e3859a85e31de715b00bde4985a57d051677d2aaa0d6b", + "0x090c7116a446f80048f743bcbe5a6fd6f74a35235d70f146a2fbc28d39f581046a29c8e336d9a3512e280786a9936b24f5d21b7c06b079152fb0ae05cb9957b933", + "0x07183d6eaf5b24b3d61190d244d68d53775408e896f412fea55ada9ae82937d39e0224d9ff76c56f22b90576f73ddf574c54444ace601eccf441db7036c55d4815", + "0x08194ee15ea738761a8b4f2d95c3c654460aa709c9fede6ba30e609f0c1d626a7a238e1e89d5a55f2ba8a0db7dcac6a7543d92077fe7d606bd6697cb5e299a5f23", + "0x092d4cdbacf6b0ccf4a2381d0b1d36410107a545fcd481b92835bd4821f7ad38f1167bdce2a8005f777f193abef5662c63d4e898cde71527739c72bbbf42b7c04e", + "0x07000000000000000000000000000000000000000000000000000000000000000009358dcfbc4a1a04810bd6dee97b6253736170df90a6b538d1cc88f277750d8b", + "0x080d39d74fd9242e2d097858caa077ceb68ef268abaa2dee96d43666bd6927e2620000000000000000000000000000000000000000000000000000000000000000", + "0x070000000000000000000000000000000000000000000000000000000000000000094c5bfdebf5109b97c1a9994d6a4dee51529c3c444ce5643e3a22667c4af0e0", + "0x0700000000000000000000000000000000000000000000000000000000000000002cb840156544781ff360e733b727b48bafd38321ada3d554e957c6c0724ef9ca", + "0x0813375bb51f9485592504060e2f4cac7735c6914d225aecd5e24ca0a6c99392b80000000000000000000000000000000000000000000000000000000000000000", + "0x07000000000000000000000000000000000000000000000000000000000000000004cec16297d2ee84f8b1f6e6c69553d6f8b91791b3b973a39839fbc6dfb7b980", + "0x07000000000000000000000000000000000000000000000000000000000000000002ca00f93392cdf165f133a95f558dea57212bd62d3ee4ea03690b9338724589", + "0x062785217da3c639460b70c19c72fec4db611ae750aca1716c2c37c192081de96d1e8e3cd766f5474f54cbf4d75446de1eecf25086720da2f52f94c1d2024f64c8", + "0x04201e4570764169daaa275ddf0ce46bfe5a2b585544b8b6c2bd05297c9deb3699010100000000000000000000000000000000000000000000000000d8d726b7177a80000020b7a48ed9640a96e6c9b1daf6c0ed7bfd79ab7588601da96bd1ada403da9dd88e", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + } + } + }, + { + "rootBefore": "0x0000000000000000000000000000000000000000000000000000000000000000", + "rootAfter": "0x1449e3da6128f8e6ad61271ce88f904f87515efbc26816317a7b97570c74c357", + "proofs": { + "0x5160A103bb83C2c684FF621D7c707BC1B93920Ae": [ + "0x09236a77302583f53b4f50be116ee711f1446c731ce5fad55aa69d17da66c468cc083f31c46077cff3f32f02fff4c2952f72a4d384fdd9a32457a126834f31ac73", + "0x091d8263a8c1dfccd904d91b9911d1762d7e8a8771fe7d7ff05f69066511ad70f70b6600e39a4759942f41ce3ace7530502d4a000c2070c336d489d5cd0cec9ffa", + "0x0925c349f8fd600354b860853897df06673e055b80164e1fbaf3d16b28c241f9992725387247b73f2b6775bc465475b6d73c1ad699f3657d5187dbd95fc91cfaf6", + "0x092220d693e2d9895b96b0530dcb80a79f55102dd1143455513d520abbbba1435e06c0ef8a60eb13de2a024d46a58d75511c373a84706c65e7e590e7ec657afffc", + "0x0927720dabb5f35163812456ae15aa20f642527fac0b2a79ea4c9efc5746ada5a4194e4957538093c5fd1654d7566bec4d0c475ed3bc5c307b70d08e5820b7d54c", + "0x092412434d24a9d65009de307424953eb124685ad625c1211763471f5d8d1d5eae0a7f02449f7c1fb366b8281d794acb7ef2e2a3a91a0756ca4c6344dd3650e295", + "0x092f9f40f1ff4d0341ac5bcdadd720e3db4a6b0283e7069d552ee9da3408c224fd2f4948246688c12941566b01e0d32a762d924c7af9d0d1177b91159a412451dc", + "0x0612cbebe57b7eef7cc64130b8298d3264a44cd235883898eca786e984439f45fe0f29bd18b9da7113eb318cc4b6053302456a5d61b7fa5cc1f7391dea6de0996b", + "0x04020abe47f50e118bf630b2c91c7f6ba7bc977a43984d88a6db1ebb32382fc1b80508000000000000000000000000000000000000000000000000000000000000000011e10000000000000000000000000000000000000000000000000dc486a99a767bbe0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864205160a103bb83c2c684ff621d7c707bc1b93920ae000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5300000000000000000000000000000000000021": [ + "0x09236a77302583f53b4f50be116ee711f1446c731ce5fad55aa69d17da66c468cc083f31c46077cff3f32f02fff4c2952f72a4d384fdd9a32457a126834f31ac73", + "0x092f8cad70b83a6343203d02e34289416059c47bffdddb3ca8b5e8348f97b292b81402d08328ff5a3ca884a55a109d087c50a9a89521102a505733870aa5d7667c", + "0x091ba0ff6760b7f1d5618f55df9cc748b8ffdbba352f1dfdfb87f710c1ccbbf1660a78d2809714702439ae1b1793f6d96b606bd15251ff0bc458b71076cd8270f6", + "0x090c1ed4572015d1c8257513ce8a1ca7de9d7f8bf842c436ac3a129e1e48f5039e21fe37635685d1231c610d893dc50a6bbe186e51b1be0db428d58f78a3343346", + "0x092da65da78b3cff5b695f2bd3c275b7d4358024657d0e14cc3458f5a017c8fa801dc4bd21ef06c5ae6939bd20cfe0bb1be055c1010ce7c1ca4b4bb7787a45c6dc", + "0x0919fb1c690c67d149718ac5e778fd1145868e7b3ad457c76070d6ea77eb4ae47e22868b2e31c35e8bfa61b52616e7743ac4b5054f88325f516c78f7f2c5c82f36", + "0x071e0f39fdd4927dcc6d49cca915b11585c5bb0e9bacd226e5e24a6a6be3e7f4762a21e214d065739f78b8680adc4f64e8dd32477820809eac089843040d8f0564", + "0x040883d4562dfe8ba7ad8176bc2844d35ecc486199d589a152eabcee8398f3aebb05080000000000000000000000000000000000000000000000000aec000000000000000000000000000000000000000000000000000000000000000000000000000000002a60c2b4e313d1b3345626a3cf83b481f336ff4055ab13762d8cde84aaba465b44107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f84205300000000000000000000000000000000000021000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x716170D0687c3d31CC10DebE0dAa1DDD3FE3D792": [ + "0x09236a77302583f53b4f50be116ee711f1446c731ce5fad55aa69d17da66c468cc083f31c46077cff3f32f02fff4c2952f72a4d384fdd9a32457a126834f31ac73", + "0x091d8263a8c1dfccd904d91b9911d1762d7e8a8771fe7d7ff05f69066511ad70f70b6600e39a4759942f41ce3ace7530502d4a000c2070c336d489d5cd0cec9ffa", + "0x0925c349f8fd600354b860853897df06673e055b80164e1fbaf3d16b28c241f9992725387247b73f2b6775bc465475b6d73c1ad699f3657d5187dbd95fc91cfaf6", + "0x0914b3df4048fc34a513e1c19fd47c2bd992b321bd1f0d1ca50a40af8920ecbab91ff6815f32091c3320ba81300163e9531393d5c0b903aa425a8ee14627de7b47", + "0x0913eff588f55e7c7a2f3fdb66c7e34afeb3eb8c83472b7ea6f3c5e20cfdaf27790edbd119400f8d026e7adde1b8066cf0598c7e1d77319854d06564dec8f41c7f", + "0x090fea719a68a48e9dd333707efbb005a4c81d29707e4eedad5babdbdb10448b080e76453c083d03a6e85406f198451801a9270399d74521dde8cfe2c4129acc4f", + "0x092d8cf9858ac296e55a357479747ad048821376d4f043407af9d043dd953dfb0c14e201117cb6d445d2dad0921101124c6de4e4464c9a2901e9fcf4354b8f7e0e", + "0x0700000000000000000000000000000000000000000000000000000000000000002a99f0c4bc934e47bab0edc377ae3e441e59738081016824793ddccd49793b73", + "0x062da1750dc9f7ebf795aa7f4d9ee6933579283a4242334ff38e298db642ba41722a97a2750ce48f2cb6dda838b668fe1cda73b9c484204645343effd87697d53f", + "0x0414b0bb4090afcdae623b69d996022ea82c221cd1a3c00c5b13acb37d750f87fc0508000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001fdcf5b84a5fca490000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420716170d0687c3d31cc10debe0daa1ddd3fe3d792000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x96904fF7Fe8EED74d6Ec4c9bf7612d9f239D40c6": [ + "0x09236a77302583f53b4f50be116ee711f1446c731ce5fad55aa69d17da66c468cc083f31c46077cff3f32f02fff4c2952f72a4d384fdd9a32457a126834f31ac73", + "0x091d8263a8c1dfccd904d91b9911d1762d7e8a8771fe7d7ff05f69066511ad70f70b6600e39a4759942f41ce3ace7530502d4a000c2070c336d489d5cd0cec9ffa", + "0x0925c349f8fd600354b860853897df06673e055b80164e1fbaf3d16b28c241f9992725387247b73f2b6775bc465475b6d73c1ad699f3657d5187dbd95fc91cfaf6", + "0x092220d693e2d9895b96b0530dcb80a79f55102dd1143455513d520abbbba1435e06c0ef8a60eb13de2a024d46a58d75511c373a84706c65e7e590e7ec657afffc", + "0x092518f8d92281a123ca9f8c9a10ffa90bd4166de182aa8c4592176e177d458ebf08a35ae34ff65a9930ffe680f5184b556f1d92911a353d1b8d1840afc8bddea8", + "0x09252ed76f54141622be19600acca03942b31d6c01cdeca6137fe1b0e809c9eaa1098bc530cf79a832dff7d88ab9dc76d8be264223e36a35d189a819c1154488d8", + "0x070000000000000000000000000000000000000000000000000000000000000000061bc3e24c71b73660db3a390e66211882c79c070a7e7730a795555bf5ad9c78", + "0x08164c0a8baa575aa803c43bb73b1736ecba821c7095345da3684592416cc8d76021ec96ceb39aa73a1108a6c8ddda8235c3c5d72d0a50ac88105b5351bd49707e", + "0x04159dcb3f65a1b35d7ffbc5ab856fdca99998bb0511b47418de556bf06eb8d6e005080000000000000000000000000000000000000000000000002c88000000000000000100000000000000000000000000000000000000000000000000000000000000001e455d8a5bc34b0aee1e7b9a71436a26677ccc056f690495e9df897fc83a4d843980a80a13d540f6def3466df303bc40d3e8151815da811d40d5c9b5ea7c53481a4c85afd3fbba4136b2a89fb8b56b17b972ef37228330390e0e368ae175b9b22096904ff7fe8eed74d6ec4c9bf7612d9f239d40c6000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "storageProofs": { + "0x5300000000000000000000000000000000000021": { + "0x000000000000000000000000000000000000000000000000000000000000009b": [ + "0x090a0ad1904f86aedf87e971bec5a7c5fcf39b12d00a064560dcd2db2ef761c29c04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091d97f1c4d55347b1d429c1c032640017976a1d5a4d9e7d267eaab810e76cde5410922a2f16b0d79199940d61d76b9a38b356ded2b55ef3cb9efd8d41b55cd9a1", + "0x0919192c804de24fd6bbeb6bbe3a9e3d60628368d05e485d6d5b2cb3c87db54bb6170b4d2136b00854310e3859a85e31de715b00bde4985a57d051677d2aaa0d6b", + "0x090720a2f304bf61b54f366ca4caed0022df7af1225db39d3dcd93fd06dd18c0f4132f15615440de5771eeee9e780b422a916e3d15eab9373edd505c651b30845a", + "0x07000000000000000000000000000000000000000000000000000000000000000020f6ebe67ae77a1de87fb3e23808ec92429108aa24eabc303febcbb3b8bf75c5", + "0x0828efa182013c9def247ac7fcaa2638155dbe39178170f0b901db81e46e9b3ae40000000000000000000000000000000000000000000000000000000000000000", + "0x081e4264a1e981b7341b230a8b36b330b7c7f6c717fd7ae3ed431caa30eb3dbaab0000000000000000000000000000000000000000000000000000000000000000", + "0x0819504530d6a257bdf890fabab24c23042243b37a5f55d4f5d1d347fdfa7ef20d0000000000000000000000000000000000000000000000000000000000000000", + "0x082e58d7ad5b9586edc85a90f3ec67fd1e4a57d02592ac36b669a87577315fb5b60000000000000000000000000000000000000000000000000000000000000000", + "0x070000000000000000000000000000000000000000000000000000000000000000034ff551d0054caa3801453f74cea1553a8f99653f7775665cf81ec8ef2aba48", + "0x0817dfcd95c010bda4eb31762a94f386934a725a4b6d832ff526ab4214d3f28cec0000000000000000000000000000000000000000000000000000000000000000", + "0x081a2fca58cf05057f17e02f34159537d2a5143960baa651e448801bbeadd435d60000000000000000000000000000000000000000000000000000000000000000", + "0x061bb193e271b1ee345995c3b7a298a6793eaff80fceda7c89df6375a9e29f5d972e53e3e9599e20872ef480183a2e76d8ec41cf5728ac6aac4b029066c68124ac", + "0x0413ae6988481e7df831f5f128b1c99a13b227630c2b40a16163ce5cfebc0a621501010000000000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000009b", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x29bc3b2a60f4b394d528442f4e3154d1c48862d7f135fbad213b0abde2291098": [ + "0x090a0ad1904f86aedf87e971bec5a7c5fcf39b12d00a064560dcd2db2ef761c29c04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091d97f1c4d55347b1d429c1c032640017976a1d5a4d9e7d267eaab810e76cde5410922a2f16b0d79199940d61d76b9a38b356ded2b55ef3cb9efd8d41b55cd9a1", + "0x092883e6c9f8554b07276ac716a5b75dfea32ced6155a997e35b3f628f30b7dee42c3eaa894b3a3ce7148977abf5e239b1e92deabb870ebb0476962ad8d8f623ab", + "0x090c9bfd0ba6119fa753d5401f1c58d2d1278f48704fb52fdf3b5c42e597c0459c14228de0ef14e67c35dd5c5d97a6b0bbaf3dcdbf18548a3aad218f93b664b738", + "0x0918bd2abc34c290856d68178148b3d77f1545c65d1d6dcae59c70154e056e8e05197958bcaae91767bb4f290dbaba6228724e954fd0f18b1038b23bdda0112422", + "0x0826eaaa332363373ca07cfb98aeb0e13bacab8fc594e783db87cb830b88e6ada10000000000000000000000000000000000000000000000000000000000000000", + "0x061cde72db31da357b3785dbf15aa5f3a9ffa42346705a072d6deb9b8469ce56c71fb9287a64376c8226bf8411f424a2aa0f1f8e50abffc5b45e0f437ef21f0681", + "0x042c2826bf51833f9c3306e9b20a51e6492d7c3d8d50c0849123ea839facfdc4830101000000000000000000000000000000000000000000000000000000000000000000012029bc3b2a60f4b394d528442f4e3154d1c48862d7f135fbad213b0abde2291098", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": [ + "0x090a0ad1904f86aedf87e971bec5a7c5fcf39b12d00a064560dcd2db2ef761c29c04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091cbcafd73a15869f9398bb2410de2817eeeff7a68be0f55e31ffc4c68d2348112e000bbeb0195d16d20b1c908aab77b8604b7d2e26717d9ba96a82d4b7a84bdf", + "0x091728f14a10a6f428096b080be070908cf9a43d3d2827eab3fb0e30dff43803be05ca23d77ef7e23741a051f6f8c2bbb3f23c6031554bda48758bfe0c30661921", + "0x092844f9973c0091032065205aa3ee43dfb70a92a167f7eb4aa252eac32fe317001a70b927deef5b82b33f5984e1017152da226848ceaa921247ad871b078706d3", + "0x091837d3df34f0cd641a40c90699d8a5cd9f75d95284337fb6ad97d7d400cc11a0213840d432c9a896719a5e27ac8a33c881222f55bc257631e6a9b48092f6bac3", + "0x09187c68e93dbd497a6fd042e5d48d3ec07344334576df0f8ae2c4ab519d82456c006638b810ed97d5a6e2798b22105fb538145f44b4fdc2f6133ec19f284852b9", + "0x081a6da792fdca879a8e5a966cc677327a27a93d4e0e5b4b10736f495780a755420000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000001757d3b68fe5609bb417d69e844076087720fd9ac0615a4fd7259a1177892431", + "0x08183f814d072493364968e21dc8b99b81feb73e88d08622258ff4e9e5e3e6f9cb0000000000000000000000000000000000000000000000000000000000000000", + "0x0710bd56aa4fa4fe8c8a00021a98c7a560c42dca3a35a21f4ab0a92c1ef02709a32e595a6c3c1be5266c3c8e3b8990f8c12a3209356621aaa502c0564b65659eda", + "0x08052614f553ae26abda62741495cd00d44551df1fa8a81df3a21a2c0ee814350e1d2b12508501e2c638408b3226eaff5dae4959be9d85bf09363771fb46f78f96", + "0x041a1b3841cf3c67c998be3481e8289d447b74a9ddcb8aa7f3c251b049590f2e920101000000000000000000000000000096904ff7fe8eed74d6ec4c9bf7612d9f239d40c620360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x53bdca72fa8d2e145a1b3bd11cde5bd75428acd18eac3d6adf4e06e7e637706d": [ + "0x090a0ad1904f86aedf87e971bec5a7c5fcf39b12d00a064560dcd2db2ef761c29c04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091cbcafd73a15869f9398bb2410de2817eeeff7a68be0f55e31ffc4c68d2348112e000bbeb0195d16d20b1c908aab77b8604b7d2e26717d9ba96a82d4b7a84bdf", + "0x091728f14a10a6f428096b080be070908cf9a43d3d2827eab3fb0e30dff43803be05ca23d77ef7e23741a051f6f8c2bbb3f23c6031554bda48758bfe0c30661921", + "0x092844f9973c0091032065205aa3ee43dfb70a92a167f7eb4aa252eac32fe317001a70b927deef5b82b33f5984e1017152da226848ceaa921247ad871b078706d3", + "0x091837d3df34f0cd641a40c90699d8a5cd9f75d95284337fb6ad97d7d400cc11a0213840d432c9a896719a5e27ac8a33c881222f55bc257631e6a9b48092f6bac3", + "0x09187c68e93dbd497a6fd042e5d48d3ec07344334576df0f8ae2c4ab519d82456c006638b810ed97d5a6e2798b22105fb538145f44b4fdc2f6133ec19f284852b9", + "0x0716175660d07cd98be806c32cb2b66775b64e8aa543a8470d5d90d857f78b0b180486dc83f24b31d7a4833dbfbe26060363adbf850b4f8749cc2b44a3c052c8b1", + "0x082ecb9e18657f908e5ccdb4d6ac0fc65c6c60b7e86b33f8fc82134d1704f65e6823cf8c53ad039143dfbc1336aaf011c4b20d3c520d354216ae10ff4ea63f48bf", + "0x071f5094a0f866686490965819954304dcca1acbb5eba248966d76acccf11d1d6b1af61657ec5e7d789a9ac79ac1dd4eb4f298faf9a47a5f1560f0927f2bc6e71b", + "0x062b0c232103b6c82e6b5f588eab336a93526bf3ff6ad5dfa358f6c6e35e4ad865165bb2d134896148cdda711cf71517e576c920edd7f91f1c17a9b6b5fcb103ac", + "0x04032a62f2b11acbea541fd541ef6c2bd3e066df0a54f318716e6a6cf8bf627172010100000000000000000000000000004399eace6ab60893b789677b234762264e76a97c2053bdca72fa8d2e145a1b3bd11cde5bd75428acd18eac3d6adf4e06e7e637706d", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": [ + "0x090a0ad1904f86aedf87e971bec5a7c5fcf39b12d00a064560dcd2db2ef761c29c04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091d97f1c4d55347b1d429c1c032640017976a1d5a4d9e7d267eaab810e76cde5410922a2f16b0d79199940d61d76b9a38b356ded2b55ef3cb9efd8d41b55cd9a1", + "0x092883e6c9f8554b07276ac716a5b75dfea32ced6155a997e35b3f628f30b7dee42c3eaa894b3a3ce7148977abf5e239b1e92deabb870ebb0476962ad8d8f623ab", + "0x092a16326c64bc4d8f5a84a63b8e8393ce26a4f3d668969a2228f016fd1803884d251cf79c50546e5f56b08ac68ccd7bd4831d70d54c284f1b750dbb69f4feadf8", + "0x09052897e407fcbc56b0630c56428eae64abb5b7deadc370bc21f274a5bd35f14527876ddd9d75c6fcccd372762c3ad645195374953db62ebb3b0651fb3ddea3fa", + "0x092424d670bdb4826aecf7911e5ccf78551d9bdd981e4933e7add19fb1da35870c28232fc84ff5aff7c535ac343ad868ffbfe6df1769d9f321124c71253d19a355", + "0x0700000000000000000000000000000000000000000000000000000000000000002cff7d3f8cc946d984acb34f304a68e26dcb573ab3511fd9a2dea354a9da4e6c", + "0x08037d7dd711aa917aa750547c959ab60a71b230acb863a3edeb6d06e0269382100000000000000000000000000000000000000000000000000000000000000000", + "0x0600ed1c9aba2defd948754347649ec9263caf733d59fc0f12d709c2466395938e0e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200", + "0x0419a44eca69f8d5e3651ccf05934126419470106b4b51bb4b96b6230b7d80236701010000000000000000000000000000530000000000000000000000000000000000000b20b53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xbb86fbc034f4e382929974bcd8419ed626b0ea647f962d89ba2fb6bd28785ab9": [ + "0x090a0ad1904f86aedf87e971bec5a7c5fcf39b12d00a064560dcd2db2ef761c29c04c90d3f121a4716393ef23d31ad66370f666612e06aaba840af9d8591101e22", + "0x091cbcafd73a15869f9398bb2410de2817eeeff7a68be0f55e31ffc4c68d2348112e000bbeb0195d16d20b1c908aab77b8604b7d2e26717d9ba96a82d4b7a84bdf", + "0x091728f14a10a6f428096b080be070908cf9a43d3d2827eab3fb0e30dff43803be05ca23d77ef7e23741a051f6f8c2bbb3f23c6031554bda48758bfe0c30661921", + "0x092844f9973c0091032065205aa3ee43dfb70a92a167f7eb4aa252eac32fe317001a70b927deef5b82b33f5984e1017152da226848ceaa921247ad871b078706d3", + "0x090be037e9fd4c2f92a2bdcb3a066a121e312873b9b8a01d269c1b08b908ca765e1abb3a2a14150ebb12955381af18d353b9fbe1eea0efefb0bde49c3ab1f68001", + "0x06018547f2a640f76cc018f7e59e6138eb2e30836acee97a44785ad34c1bb7eb3c2f71fbc869fa7279137be24861651630c3f0ac92ecb725b6136d13b8c31705df", + "0x04089fc409063b92930d10be4d1dd9ef71b9df3816a432d70290e7c76919dedb5a01010000000000000000000000000000000000000000000000000000000000000000046720bb86fbc034f4e382929974bcd8419ed626b0ea647f962d89ba2fb6bd28785ab9", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + } + } + } + ], + "executionResults": [ + { + "l1DataFee": "0x50c0fad07a6d", + "feeTokenID": 4, + "feeRate": "0x10334bbc2d000", + "tokenScale": "0xf4240", + "feeLimit": "0x0", + "gas": 21000, + "failed": false, + "returnValue": "", + "from": { + "address": "0xb055051fb2889be5e9831524f1624941299c49bb", + "nonce": 1114, + "balance": "0x6dbc36546bf1c8a8", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + "to": { + "address": "0x5add06f01e73b75a4184c8cb74485bb0a897b23e", + "nonce": 3, + "balance": "0x2a570d96d4d7cf3", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + "accountAfter": [ + { + "address": "0xb055051fb2889be5e9831524f1624941299c49bb", + "nonce": 1115, + "balance": "0x6db8a8d5c72b48a8", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + { + "address": "0x5add06f01e73b75a4184c8cb74485bb0a897b23e", + "nonce": 3, + "balance": "0x2a8fe581213fcf3", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + { + "address": "0x716170d0687c3d31cc10debe0daa1ddd3fe3d792", + "nonce": 0, + "balance": "0x1fdcf5b84a5fca49", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + } + ], + "structLogs": [], + "callTrace": { + "from": "0xb055051fb2889be5e9831524f1624941299c49bb", + "gas": "0x5208", + "gasUsed": "0x5208", + "to": "0x5add06f01e73b75a4184c8cb74485bb0a897b23e", + "input": "0x", + "value": "0x38d7ea4c68000", + "type": "CALL" + } + }, + { + "l1DataFee": "0x516e9284c11d", + "feeTokenID": 10, + "feeRate": "0xd8d726b7177a800000", + "tokenScale": "0xd3c21bcecceda1000000", + "feeLimit": "0x0", + "gas": 21000, + "failed": false, + "returnValue": "", + "from": { + "address": "0xb055051fb2889be5e9831524f1624941299c49bb", + "nonce": 1115, + "balance": "0x6db8a8d5c72b48a8", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + "to": { + "address": "0x5add06f01e73b75a4184c8cb74485bb0a897b23e", + "nonce": 3, + "balance": "0x2a8fe581213fcf3", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + "accountAfter": [ + { + "address": "0xb055051fb2889be5e9831524f1624941299c49bb", + "nonce": 1116, + "balance": "0x6db51b572264c8a8", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + { + "address": "0x5add06f01e73b75a4184c8cb74485bb0a897b23e", + "nonce": 3, + "balance": "0x2ac8bd6b6da7cf3", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + { + "address": "0x716170d0687c3d31cc10debe0daa1ddd3fe3d792", + "nonce": 0, + "balance": "0x1fdcf5b84a5fca49", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + } + ], + "structLogs": [], + "callTrace": { + "from": "0xb055051fb2889be5e9831524f1624941299c49bb", + "gas": "0x5208", + "gasUsed": "0x5208", + "to": "0x5add06f01e73b75a4184c8cb74485bb0a897b23e", + "input": "0x", + "value": "0x38d7ea4c68000", + "type": "CALL" + } + }, + { + "l1DataFee": "0xd03c633463ad", + "gas": 44034, + "failed": false, + "returnValue": "", + "from": { + "address": "0x5160a103bb83c2c684ff621d7c707bc1b93920ae", + "nonce": 4577, + "balance": "0xdc486a99a767bbe", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + "to": { + "address": "0x5300000000000000000000000000000000000021", + "nonce": 0, + "balance": "0x0", + "keccakCodeHash": "0x44107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d5", + "poseidonCodeHash": "0x18d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f84", + "codeSize": 2796 + }, + "accountAfter": [ + { + "address": "0x5160a103bb83c2c684ff621d7c707bc1b93920ae", + "nonce": 4578, + "balance": "0xdc3b662f6a09391", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + { + "address": "0x5300000000000000000000000000000000000021", + "nonce": 0, + "balance": "0x0", + "keccakCodeHash": "0x44107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d5", + "poseidonCodeHash": "0x18d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f84", + "codeSize": 2796 + }, + { + "address": "0x716170d0687c3d31cc10debe0daa1ddd3fe3d792", + "nonce": 0, + "balance": "0x1fddc5feee35b276", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + } + ], + "structLogs": [ + { + "pc": 0, + "op": "PUSH1", + "gas": 44438, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2, + "op": "PUSH1", + "gas": 44435, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4, + "op": "MSTORE", + "gas": 44432, + "gasCost": 12, + "depth": 1 + }, + { + "pc": 5, + "op": "CALLDATASIZE", + "gas": 44420, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6, + "op": "PUSH2", + "gas": 44418, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 9, + "op": "JUMPI", + "gas": 44415, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 19, + "op": "JUMPDEST", + "gas": 44405, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 20, + "op": "PUSH2", + "gas": 44404, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 23, + "op": "JUMPDEST", + "gas": 44401, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 24, + "op": "PUSH2", + "gas": 44400, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 27, + "op": "PUSH2", + "gas": 44397, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 30, + "op": "JUMP", + "gas": 44394, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 672, + "op": "JUMPDEST", + "gas": 44386, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 673, + "op": "PUSH0", + "gas": 44385, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 674, + "op": "PUSH32", + "gas": 44383, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 707, + "op": "JUMPDEST", + "gas": 44380, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 708, + "op": "SLOAD", + "gas": 44379, + "gasCost": 2100, + "depth": 1, + "storage": { + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000530000000000000000000000000000000000000b" + } + }, + { + "pc": 709, + "op": "PUSH20", + "gas": 42279, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 730, + "op": "AND", + "gas": 42276, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 731, + "op": "SWAP2", + "gas": 42273, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 732, + "op": "SWAP1", + "gas": 42270, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 733, + "op": "POP", + "gas": 42267, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 734, + "op": "JUMP", + "gas": 42265, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 31, + "op": "JUMPDEST", + "gas": 42257, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 32, + "op": "PUSH20", + "gas": 42256, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 53, + "op": "AND", + "gas": 42253, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 54, + "op": "CALLER", + "gas": 42250, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 55, + "op": "SUB", + "gas": 42248, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 56, + "op": "PUSH2", + "gas": 42245, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 59, + "op": "JUMPI", + "gas": 42242, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 662, + "op": "JUMPDEST", + "gas": 42232, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 663, + "op": "PUSH2", + "gas": 42231, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 666, + "op": "PUSH2", + "gas": 42228, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 669, + "op": "JUMP", + "gas": 42225, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1029, + "op": "JUMPDEST", + "gas": 42217, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1030, + "op": "PUSH2", + "gas": 42216, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1033, + "op": "PUSH2", + "gas": 42213, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1036, + "op": "PUSH2", + "gas": 42210, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1039, + "op": "JUMP", + "gas": 42207, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1198, + "op": "JUMPDEST", + "gas": 42199, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1199, + "op": "PUSH0", + "gas": 42198, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1200, + "op": "PUSH2", + "gas": 42196, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1203, + "op": "PUSH2", + "gas": 42193, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1206, + "op": "JUMP", + "gas": 42190, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1630, + "op": "JUMPDEST", + "gas": 42182, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1631, + "op": "PUSH0", + "gas": 42181, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1632, + "op": "PUSH32", + "gas": 42179, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1665, + "op": "PUSH2", + "gas": 42176, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1668, + "op": "JUMP", + "gas": 42173, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 707, + "op": "JUMPDEST", + "gas": 42165, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 708, + "op": "SLOAD", + "gas": 42164, + "gasCost": 2100, + "depth": 1, + "storage": { + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x00000000000000000000000096904ff7fe8eed74d6ec4c9bf7612d9f239d40c6", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000530000000000000000000000000000000000000b" + } + }, + { + "pc": 709, + "op": "PUSH20", + "gas": 40064, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 730, + "op": "AND", + "gas": 40061, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 731, + "op": "SWAP2", + "gas": 40058, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 732, + "op": "SWAP1", + "gas": 40055, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 733, + "op": "POP", + "gas": 40052, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 734, + "op": "JUMP", + "gas": 40050, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1207, + "op": "JUMPDEST", + "gas": 40042, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1208, + "op": "SWAP1", + "gas": 40041, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1209, + "op": "POP", + "gas": 40038, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1210, + "op": "SWAP1", + "gas": 40036, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1211, + "op": "JUMP", + "gas": 40033, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1040, + "op": "JUMPDEST", + "gas": 40025, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1041, + "op": "PUSH2", + "gas": 40024, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1044, + "op": "JUMP", + "gas": 40021, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1212, + "op": "JUMPDEST", + "gas": 40013, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1213, + "op": "CALLDATASIZE", + "gas": 40012, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1214, + "op": "PUSH0", + "gas": 40010, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1215, + "op": "DUP1", + "gas": 40008, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1216, + "op": "CALLDATACOPY", + "gas": 40005, + "gasCost": 36, + "depth": 1 + }, + { + "pc": 1217, + "op": "PUSH0", + "gas": 39969, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1218, + "op": "DUP1", + "gas": 39967, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1219, + "op": "CALLDATASIZE", + "gas": 39964, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1220, + "op": "PUSH0", + "gas": 39962, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1221, + "op": "DUP5", + "gas": 39960, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1222, + "op": "GAS", + "gas": 39957, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1223, + "op": "DELEGATECALL", + "gas": 39955, + "gasCost": 39372, + "depth": 1 + }, + { + "pc": 0, + "op": "PUSH1", + "gas": 36772, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 2, + "op": "PUSH1", + "gas": 36769, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 4, + "op": "MSTORE", + "gas": 36766, + "gasCost": 12, + "depth": 2 + }, + { + "pc": 5, + "op": "CALLVALUE", + "gas": 36754, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 6, + "op": "DUP1", + "gas": 36752, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 7, + "op": "ISZERO", + "gas": 36749, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 8, + "op": "PUSH2", + "gas": 36746, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 11, + "op": "JUMPI", + "gas": 36743, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 15, + "op": "JUMPDEST", + "gas": 36733, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 16, + "op": "POP", + "gas": 36732, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 17, + "op": "PUSH1", + "gas": 36730, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 19, + "op": "CALLDATASIZE", + "gas": 36727, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 20, + "op": "LT", + "gas": 36725, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 21, + "op": "PUSH2", + "gas": 36722, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 24, + "op": "JUMPI", + "gas": 36719, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 25, + "op": "PUSH0", + "gas": 36709, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 26, + "op": "CALLDATALOAD", + "gas": 36707, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 27, + "op": "PUSH1", + "gas": 36704, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 29, + "op": "SHR", + "gas": 36701, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 30, + "op": "DUP1", + "gas": 36698, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 31, + "op": "PUSH4", + "gas": 36695, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 36, + "op": "GT", + "gas": 36692, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 37, + "op": "PUSH2", + "gas": 36689, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 40, + "op": "JUMPI", + "gas": 36686, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 254, + "op": "JUMPDEST", + "gas": 36676, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 255, + "op": "DUP1", + "gas": 36675, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 256, + "op": "PUSH4", + "gas": 36672, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 261, + "op": "GT", + "gas": 36669, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 262, + "op": "PUSH2", + "gas": 36666, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 265, + "op": "JUMPI", + "gas": 36663, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 266, + "op": "DUP1", + "gas": 36653, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 267, + "op": "PUSH4", + "gas": 36650, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 272, + "op": "GT", + "gas": 36647, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 273, + "op": "PUSH2", + "gas": 36644, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 276, + "op": "JUMPI", + "gas": 36641, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 277, + "op": "DUP1", + "gas": 36631, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 278, + "op": "PUSH4", + "gas": 36628, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 283, + "op": "EQ", + "gas": 36625, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 284, + "op": "PUSH2", + "gas": 36622, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 287, + "op": "JUMPI", + "gas": 36619, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 288, + "op": "DUP1", + "gas": 36609, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 289, + "op": "PUSH4", + "gas": 36606, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 294, + "op": "EQ", + "gas": 36603, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 295, + "op": "PUSH2", + "gas": 36600, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 298, + "op": "JUMPI", + "gas": 36597, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 299, + "op": "DUP1", + "gas": 36587, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 300, + "op": "PUSH4", + "gas": 36584, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 305, + "op": "EQ", + "gas": 36581, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 306, + "op": "PUSH2", + "gas": 36578, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 309, + "op": "JUMPI", + "gas": 36575, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 310, + "op": "DUP1", + "gas": 36565, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 311, + "op": "PUSH4", + "gas": 36562, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 316, + "op": "EQ", + "gas": 36559, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 317, + "op": "PUSH2", + "gas": 36556, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 320, + "op": "JUMPI", + "gas": 36553, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 988, + "op": "JUMPDEST", + "gas": 36543, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 989, + "op": "PUSH2", + "gas": 36542, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 992, + "op": "PUSH2", + "gas": 36539, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 995, + "op": "CALLDATASIZE", + "gas": 36536, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 996, + "op": "PUSH1", + "gas": 36534, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 998, + "op": "PUSH2", + "gas": 36531, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 1001, + "op": "JUMP", + "gas": 36528, + "gasCost": 8, + "depth": 2 + }, + { + "pc": 10282, + "op": "JUMPDEST", + "gas": 36520, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 10283, + "op": "PUSH0", + "gas": 36519, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 10284, + "op": "DUP1", + "gas": 36517, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10285, + "op": "PUSH1", + "gas": 36514, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10287, + "op": "DUP4", + "gas": 36511, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10288, + "op": "DUP6", + "gas": 36508, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10289, + "op": "SUB", + "gas": 36505, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10290, + "op": "SLT", + "gas": 36502, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10291, + "op": "ISZERO", + "gas": 36499, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10292, + "op": "PUSH2", + "gas": 36496, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10295, + "op": "JUMPI", + "gas": 36493, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 10299, + "op": "JUMPDEST", + "gas": 36483, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 10300, + "op": "DUP3", + "gas": 36482, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10301, + "op": "CALLDATALOAD", + "gas": 36479, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10302, + "op": "PUSH8", + "gas": 36476, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10311, + "op": "DUP1", + "gas": 36473, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10312, + "op": "DUP3", + "gas": 36470, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10313, + "op": "GT", + "gas": 36467, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10314, + "op": "ISZERO", + "gas": 36464, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10315, + "op": "PUSH2", + "gas": 36461, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10318, + "op": "JUMPI", + "gas": 36458, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 10322, + "op": "JUMPDEST", + "gas": 36448, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 10323, + "op": "PUSH2", + "gas": 36447, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10326, + "op": "DUP7", + "gas": 36444, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10327, + "op": "DUP4", + "gas": 36441, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10328, + "op": "DUP8", + "gas": 36438, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10329, + "op": "ADD", + "gas": 36435, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10330, + "op": "PUSH2", + "gas": 36432, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10333, + "op": "JUMP", + "gas": 36429, + "gasCost": 8, + "depth": 2 + }, + { + "pc": 10075, + "op": "JUMPDEST", + "gas": 36421, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 10076, + "op": "PUSH0", + "gas": 36420, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 10077, + "op": "DUP3", + "gas": 36418, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10078, + "op": "PUSH1", + "gas": 36415, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10080, + "op": "DUP4", + "gas": 36412, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10081, + "op": "ADD", + "gas": 36409, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10082, + "op": "SLT", + "gas": 36406, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10083, + "op": "PUSH2", + "gas": 36403, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10086, + "op": "JUMPI", + "gas": 36400, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 10090, + "op": "JUMPDEST", + "gas": 36390, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 10091, + "op": "DUP2", + "gas": 36389, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10092, + "op": "CALLDATALOAD", + "gas": 36386, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10093, + "op": "PUSH1", + "gas": 36383, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10095, + "op": "PUSH2", + "gas": 36380, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10098, + "op": "PUSH2", + "gas": 36377, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10101, + "op": "DUP4", + "gas": 36374, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10102, + "op": "PUSH2", + "gas": 36371, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10105, + "op": "JUMP", + "gas": 36368, + "gasCost": 8, + "depth": 2 + }, + { + "pc": 10040, + "op": "JUMPDEST", + "gas": 36360, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 10041, + "op": "PUSH0", + "gas": 36359, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 10042, + "op": "PUSH8", + "gas": 36357, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10051, + "op": "DUP3", + "gas": 36354, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10052, + "op": "GT", + "gas": 36351, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10053, + "op": "ISZERO", + "gas": 36348, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10054, + "op": "PUSH2", + "gas": 36345, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10057, + "op": "JUMPI", + "gas": 36342, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 10065, + "op": "JUMPDEST", + "gas": 36332, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 10066, + "op": "POP", + "gas": 36331, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 10067, + "op": "PUSH1", + "gas": 36329, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10069, + "op": "SHL", + "gas": 36326, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10070, + "op": "PUSH1", + "gas": 36323, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10072, + "op": "ADD", + "gas": 36320, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10073, + "op": "SWAP1", + "gas": 36317, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10074, + "op": "JUMP", + "gas": 36314, + "gasCost": 8, + "depth": 2 + }, + { + "pc": 10106, + "op": "JUMPDEST", + "gas": 36306, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 10107, + "op": "PUSH2", + "gas": 36305, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10110, + "op": "JUMP", + "gas": 36302, + "gasCost": 8, + "depth": 2 + }, + { + "pc": 9961, + "op": "JUMPDEST", + "gas": 36294, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 9962, + "op": "PUSH1", + "gas": 36293, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 9964, + "op": "MLOAD", + "gas": 36290, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 9965, + "op": "PUSH1", + "gas": 36287, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 9967, + "op": "DUP3", + "gas": 36284, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 9968, + "op": "ADD", + "gas": 36281, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 9969, + "op": "PUSH32", + "gas": 36278, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10002, + "op": "AND", + "gas": 36275, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10003, + "op": "DUP2", + "gas": 36272, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10004, + "op": "ADD", + "gas": 36269, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10005, + "op": "PUSH8", + "gas": 36266, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10014, + "op": "DUP2", + "gas": 36263, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10015, + "op": "GT", + "gas": 36260, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10016, + "op": "DUP3", + "gas": 36257, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10017, + "op": "DUP3", + "gas": 36254, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10018, + "op": "LT", + "gas": 36251, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10019, + "op": "OR", + "gas": 36248, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10020, + "op": "ISZERO", + "gas": 36245, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10021, + "op": "PUSH2", + "gas": 36242, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10024, + "op": "JUMPI", + "gas": 36239, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 10032, + "op": "JUMPDEST", + "gas": 36229, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 10033, + "op": "PUSH1", + "gas": 36228, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10035, + "op": "MSTORE", + "gas": 36225, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10036, + "op": "SWAP2", + "gas": 36222, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10037, + "op": "SWAP1", + "gas": 36219, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10038, + "op": "POP", + "gas": 36216, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 10039, + "op": "JUMP", + "gas": 36214, + "gasCost": 8, + "depth": 2 + }, + { + "pc": 10111, + "op": "JUMPDEST", + "gas": 36206, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 10112, + "op": "DUP1", + "gas": 36205, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10113, + "op": "DUP4", + "gas": 36202, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10114, + "op": "DUP3", + "gas": 36199, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10115, + "op": "MSTORE", + "gas": 36196, + "gasCost": 9, + "depth": 2 + }, + { + "pc": 10116, + "op": "PUSH1", + "gas": 36187, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10118, + "op": "DUP3", + "gas": 36184, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10119, + "op": "ADD", + "gas": 36181, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10120, + "op": "SWAP2", + "gas": 36178, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10121, + "op": "POP", + "gas": 36175, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 10122, + "op": "PUSH1", + "gas": 36173, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10124, + "op": "DUP5", + "gas": 36170, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10125, + "op": "PUSH1", + "gas": 36167, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10127, + "op": "SHL", + "gas": 36164, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10128, + "op": "DUP8", + "gas": 36161, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10129, + "op": "ADD", + "gas": 36158, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10130, + "op": "ADD", + "gas": 36155, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10131, + "op": "SWAP4", + "gas": 36152, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10132, + "op": "POP", + "gas": 36149, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 10133, + "op": "DUP7", + "gas": 36147, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10134, + "op": "DUP5", + "gas": 36144, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10135, + "op": "GT", + "gas": 36141, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10136, + "op": "ISZERO", + "gas": 36138, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10137, + "op": "PUSH2", + "gas": 36135, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10140, + "op": "JUMPI", + "gas": 36132, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 10144, + "op": "JUMPDEST", + "gas": 36122, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 10145, + "op": "PUSH1", + "gas": 36121, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10147, + "op": "DUP7", + "gas": 36118, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10148, + "op": "ADD", + "gas": 36115, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10149, + "op": "JUMPDEST", + "gas": 36112, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 10150, + "op": "DUP5", + "gas": 36111, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10151, + "op": "DUP2", + "gas": 36108, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10152, + "op": "LT", + "gas": 36105, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10153, + "op": "ISZERO", + "gas": 36102, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10154, + "op": "PUSH2", + "gas": 36099, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10157, + "op": "JUMPI", + "gas": 36096, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 10158, + "op": "PUSH2", + "gas": 36086, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10161, + "op": "DUP2", + "gas": 36083, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10162, + "op": "PUSH2", + "gas": 36080, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10165, + "op": "JUMP", + "gas": 36077, + "gasCost": 8, + "depth": 2 + }, + { + "pc": 9557, + "op": "JUMPDEST", + "gas": 36069, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 9558, + "op": "DUP1", + "gas": 36068, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 9559, + "op": "CALLDATALOAD", + "gas": 36065, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 9560, + "op": "PUSH2", + "gas": 36062, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 9563, + "op": "DUP2", + "gas": 36059, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 9564, + "op": "AND", + "gas": 36056, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 9565, + "op": "DUP2", + "gas": 36053, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 9566, + "op": "EQ", + "gas": 36050, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 9567, + "op": "PUSH2", + "gas": 36047, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 9570, + "op": "JUMPI", + "gas": 36044, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 9574, + "op": "JUMPDEST", + "gas": 36034, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 9575, + "op": "SWAP2", + "gas": 36033, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 9576, + "op": "SWAP1", + "gas": 36030, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 9577, + "op": "POP", + "gas": 36027, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 9578, + "op": "JUMP", + "gas": 36025, + "gasCost": 8, + "depth": 2 + }, + { + "pc": 10166, + "op": "JUMPDEST", + "gas": 36017, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 10167, + "op": "DUP4", + "gas": 36016, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10168, + "op": "MSTORE", + "gas": 36013, + "gasCost": 6, + "depth": 2 + }, + { + "pc": 10169, + "op": "SWAP2", + "gas": 36007, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10170, + "op": "DUP4", + "gas": 36004, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10171, + "op": "ADD", + "gas": 36001, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10172, + "op": "SWAP2", + "gas": 35998, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10173, + "op": "DUP4", + "gas": 35995, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10174, + "op": "ADD", + "gas": 35992, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10175, + "op": "PUSH2", + "gas": 35989, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10178, + "op": "JUMP", + "gas": 35986, + "gasCost": 8, + "depth": 2 + }, + { + "pc": 10149, + "op": "JUMPDEST", + "gas": 35978, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 10150, + "op": "DUP5", + "gas": 35977, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10151, + "op": "DUP2", + "gas": 35974, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10152, + "op": "LT", + "gas": 35971, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10153, + "op": "ISZERO", + "gas": 35968, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10154, + "op": "PUSH2", + "gas": 35965, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10157, + "op": "JUMPI", + "gas": 35962, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 10179, + "op": "JUMPDEST", + "gas": 35952, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 10180, + "op": "POP", + "gas": 35951, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 10181, + "op": "SWAP7", + "gas": 35949, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10182, + "op": "SWAP6", + "gas": 35946, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10183, + "op": "POP", + "gas": 35943, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 10184, + "op": "POP", + "gas": 35941, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 10185, + "op": "POP", + "gas": 35939, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 10186, + "op": "POP", + "gas": 35937, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 10187, + "op": "POP", + "gas": 35935, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 10188, + "op": "POP", + "gas": 35933, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 10189, + "op": "JUMP", + "gas": 35931, + "gasCost": 8, + "depth": 2 + }, + { + "pc": 10334, + "op": "JUMPDEST", + "gas": 35923, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 10335, + "op": "SWAP4", + "gas": 35922, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10336, + "op": "POP", + "gas": 35919, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 10337, + "op": "PUSH1", + "gas": 35917, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10339, + "op": "DUP6", + "gas": 35914, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10340, + "op": "ADD", + "gas": 35911, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10341, + "op": "CALLDATALOAD", + "gas": 35908, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10342, + "op": "SWAP2", + "gas": 35905, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10343, + "op": "POP", + "gas": 35902, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 10344, + "op": "DUP1", + "gas": 35900, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10345, + "op": "DUP3", + "gas": 35897, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10346, + "op": "GT", + "gas": 35894, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10347, + "op": "ISZERO", + "gas": 35891, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10348, + "op": "PUSH2", + "gas": 35888, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10351, + "op": "JUMPI", + "gas": 35885, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 10355, + "op": "JUMPDEST", + "gas": 35875, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 10356, + "op": "POP", + "gas": 35874, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 10357, + "op": "PUSH2", + "gas": 35872, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10360, + "op": "DUP6", + "gas": 35869, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10361, + "op": "DUP3", + "gas": 35866, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10362, + "op": "DUP7", + "gas": 35863, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10363, + "op": "ADD", + "gas": 35860, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10364, + "op": "PUSH2", + "gas": 35857, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10367, + "op": "JUMP", + "gas": 35854, + "gasCost": 8, + "depth": 2 + }, + { + "pc": 10190, + "op": "JUMPDEST", + "gas": 35846, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 10191, + "op": "PUSH0", + "gas": 35845, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 10192, + "op": "DUP3", + "gas": 35843, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10193, + "op": "PUSH1", + "gas": 35840, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10195, + "op": "DUP4", + "gas": 35837, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10196, + "op": "ADD", + "gas": 35834, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10197, + "op": "SLT", + "gas": 35831, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10198, + "op": "PUSH2", + "gas": 35828, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10201, + "op": "JUMPI", + "gas": 35825, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 10205, + "op": "JUMPDEST", + "gas": 35815, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 10206, + "op": "DUP2", + "gas": 35814, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10207, + "op": "CALLDATALOAD", + "gas": 35811, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10208, + "op": "PUSH1", + "gas": 35808, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10210, + "op": "PUSH2", + "gas": 35805, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10213, + "op": "PUSH2", + "gas": 35802, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10216, + "op": "DUP4", + "gas": 35799, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10217, + "op": "PUSH2", + "gas": 35796, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10220, + "op": "JUMP", + "gas": 35793, + "gasCost": 8, + "depth": 2 + }, + { + "pc": 10040, + "op": "JUMPDEST", + "gas": 35785, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 10041, + "op": "PUSH0", + "gas": 35784, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 10042, + "op": "PUSH8", + "gas": 35782, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10051, + "op": "DUP3", + "gas": 35779, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10052, + "op": "GT", + "gas": 35776, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10053, + "op": "ISZERO", + "gas": 35773, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10054, + "op": "PUSH2", + "gas": 35770, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10057, + "op": "JUMPI", + "gas": 35767, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 10065, + "op": "JUMPDEST", + "gas": 35757, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 10066, + "op": "POP", + "gas": 35756, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 10067, + "op": "PUSH1", + "gas": 35754, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10069, + "op": "SHL", + "gas": 35751, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10070, + "op": "PUSH1", + "gas": 35748, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10072, + "op": "ADD", + "gas": 35745, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10073, + "op": "SWAP1", + "gas": 35742, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10074, + "op": "JUMP", + "gas": 35739, + "gasCost": 8, + "depth": 2 + }, + { + "pc": 10106, + "op": "JUMPDEST", + "gas": 35731, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 10107, + "op": "PUSH2", + "gas": 35730, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10110, + "op": "JUMP", + "gas": 35727, + "gasCost": 8, + "depth": 2 + }, + { + "pc": 9961, + "op": "JUMPDEST", + "gas": 35719, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 9962, + "op": "PUSH1", + "gas": 35718, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 9964, + "op": "MLOAD", + "gas": 35715, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 9965, + "op": "PUSH1", + "gas": 35712, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 9967, + "op": "DUP3", + "gas": 35709, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 9968, + "op": "ADD", + "gas": 35706, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 9969, + "op": "PUSH32", + "gas": 35703, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10002, + "op": "AND", + "gas": 35700, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10003, + "op": "DUP2", + "gas": 35697, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10004, + "op": "ADD", + "gas": 35694, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10005, + "op": "PUSH8", + "gas": 35691, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10014, + "op": "DUP2", + "gas": 35688, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10015, + "op": "GT", + "gas": 35685, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10016, + "op": "DUP3", + "gas": 35682, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10017, + "op": "DUP3", + "gas": 35679, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10018, + "op": "LT", + "gas": 35676, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10019, + "op": "OR", + "gas": 35673, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10020, + "op": "ISZERO", + "gas": 35670, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10021, + "op": "PUSH2", + "gas": 35667, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10024, + "op": "JUMPI", + "gas": 35664, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 10032, + "op": "JUMPDEST", + "gas": 35654, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 10033, + "op": "PUSH1", + "gas": 35653, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10035, + "op": "MSTORE", + "gas": 35650, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10036, + "op": "SWAP2", + "gas": 35647, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10037, + "op": "SWAP1", + "gas": 35644, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10038, + "op": "POP", + "gas": 35641, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 10039, + "op": "JUMP", + "gas": 35639, + "gasCost": 8, + "depth": 2 + }, + { + "pc": 10221, + "op": "JUMPDEST", + "gas": 35631, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 10222, + "op": "DUP1", + "gas": 35630, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10223, + "op": "DUP4", + "gas": 35627, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10224, + "op": "DUP3", + "gas": 35624, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10225, + "op": "MSTORE", + "gas": 35621, + "gasCost": 6, + "depth": 2 + }, + { + "pc": 10226, + "op": "PUSH1", + "gas": 35615, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10228, + "op": "DUP3", + "gas": 35612, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10229, + "op": "ADD", + "gas": 35609, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10230, + "op": "SWAP2", + "gas": 35606, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10231, + "op": "POP", + "gas": 35603, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 10232, + "op": "PUSH1", + "gas": 35601, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10234, + "op": "DUP5", + "gas": 35598, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10235, + "op": "PUSH1", + "gas": 35595, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10237, + "op": "SHL", + "gas": 35592, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10238, + "op": "DUP8", + "gas": 35589, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10239, + "op": "ADD", + "gas": 35586, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10240, + "op": "ADD", + "gas": 35583, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10241, + "op": "SWAP4", + "gas": 35580, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10242, + "op": "POP", + "gas": 35577, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 10243, + "op": "DUP7", + "gas": 35575, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10244, + "op": "DUP5", + "gas": 35572, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10245, + "op": "GT", + "gas": 35569, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10246, + "op": "ISZERO", + "gas": 35566, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10247, + "op": "PUSH2", + "gas": 35563, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10250, + "op": "JUMPI", + "gas": 35560, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 10254, + "op": "JUMPDEST", + "gas": 35550, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 10255, + "op": "PUSH1", + "gas": 35549, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10257, + "op": "DUP7", + "gas": 35546, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10258, + "op": "ADD", + "gas": 35543, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10259, + "op": "JUMPDEST", + "gas": 35540, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 10260, + "op": "DUP5", + "gas": 35539, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10261, + "op": "DUP2", + "gas": 35536, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10262, + "op": "LT", + "gas": 35533, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10263, + "op": "ISZERO", + "gas": 35530, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10264, + "op": "PUSH2", + "gas": 35527, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10267, + "op": "JUMPI", + "gas": 35524, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 10268, + "op": "DUP1", + "gas": 35514, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10269, + "op": "CALLDATALOAD", + "gas": 35511, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10270, + "op": "DUP4", + "gas": 35508, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10271, + "op": "MSTORE", + "gas": 35505, + "gasCost": 6, + "depth": 2 + }, + { + "pc": 10272, + "op": "SWAP2", + "gas": 35499, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10273, + "op": "DUP4", + "gas": 35496, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10274, + "op": "ADD", + "gas": 35493, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10275, + "op": "SWAP2", + "gas": 35490, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10276, + "op": "DUP4", + "gas": 35487, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10277, + "op": "ADD", + "gas": 35484, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10278, + "op": "PUSH2", + "gas": 35481, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10281, + "op": "JUMP", + "gas": 35478, + "gasCost": 8, + "depth": 2 + }, + { + "pc": 10259, + "op": "JUMPDEST", + "gas": 35470, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 10260, + "op": "DUP5", + "gas": 35469, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10261, + "op": "DUP2", + "gas": 35466, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10262, + "op": "LT", + "gas": 35463, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10263, + "op": "ISZERO", + "gas": 35460, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10264, + "op": "PUSH2", + "gas": 35457, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10267, + "op": "JUMPI", + "gas": 35454, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 10179, + "op": "JUMPDEST", + "gas": 35444, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 10180, + "op": "POP", + "gas": 35443, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 10181, + "op": "SWAP7", + "gas": 35441, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10182, + "op": "SWAP6", + "gas": 35438, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10183, + "op": "POP", + "gas": 35435, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 10184, + "op": "POP", + "gas": 35433, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 10185, + "op": "POP", + "gas": 35431, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 10186, + "op": "POP", + "gas": 35429, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 10187, + "op": "POP", + "gas": 35427, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 10188, + "op": "POP", + "gas": 35425, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 10189, + "op": "JUMP", + "gas": 35423, + "gasCost": 8, + "depth": 2 + }, + { + "pc": 10368, + "op": "JUMPDEST", + "gas": 35415, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 10369, + "op": "SWAP2", + "gas": 35414, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10370, + "op": "POP", + "gas": 35411, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 10371, + "op": "POP", + "gas": 35409, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 10372, + "op": "SWAP3", + "gas": 35407, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10373, + "op": "POP", + "gas": 35404, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 10374, + "op": "SWAP3", + "gas": 35402, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10375, + "op": "SWAP1", + "gas": 35399, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 10376, + "op": "POP", + "gas": 35396, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 10377, + "op": "JUMP", + "gas": 35394, + "gasCost": 8, + "depth": 2 + }, + { + "pc": 1002, + "op": "JUMPDEST", + "gas": 35386, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 1003, + "op": "PUSH2", + "gas": 35385, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 1006, + "op": "JUMP", + "gas": 35382, + "gasCost": 8, + "depth": 2 + }, + { + "pc": 3054, + "op": "JUMPDEST", + "gas": 35374, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 3055, + "op": "PUSH1", + "gas": 35373, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3057, + "op": "SLOAD", + "gas": 35370, + "gasCost": 2100, + "depth": 2, + "storage": { + "0x000000000000000000000000000000000000000000000000000000000000009b": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x00000000000000000000000096904ff7fe8eed74d6ec4c9bf7612d9f239d40c6", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000530000000000000000000000000000000000000b" + } + }, + { + "pc": 3058, + "op": "PUSH1", + "gas": 33270, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3060, + "op": "AND", + "gas": 33267, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3061, + "op": "DUP1", + "gas": 33264, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3062, + "op": "ISZERO", + "gas": 33261, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3063, + "op": "PUSH2", + "gas": 33258, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3066, + "op": "JUMPI", + "gas": 33255, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 3067, + "op": "POP", + "gas": 33245, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 3068, + "op": "CALLER", + "gas": 33243, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 3069, + "op": "PUSH0", + "gas": 33241, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 3070, + "op": "SWAP1", + "gas": 33239, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3071, + "op": "DUP2", + "gas": 33236, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3072, + "op": "MSTORE", + "gas": 33233, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3073, + "op": "PUSH1", + "gas": 33230, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3075, + "op": "PUSH1", + "gas": 33227, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3077, + "op": "MSTORE", + "gas": 33224, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3078, + "op": "PUSH1", + "gas": 33221, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3080, + "op": "SWAP1", + "gas": 33218, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3081, + "op": "SHA3", + "gas": 33215, + "gasCost": 42, + "depth": 2 + }, + { + "pc": 3082, + "op": "SLOAD", + "gas": 33173, + "gasCost": 2100, + "depth": 2, + "storage": { + "0x000000000000000000000000000000000000000000000000000000000000009b": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x29bc3b2a60f4b394d528442f4e3154d1c48862d7f135fbad213b0abde2291098": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x00000000000000000000000096904ff7fe8eed74d6ec4c9bf7612d9f239d40c6", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000530000000000000000000000000000000000000b" + } + }, + { + "pc": 3083, + "op": "PUSH1", + "gas": 31073, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3085, + "op": "AND", + "gas": 31070, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3086, + "op": "ISZERO", + "gas": 31067, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3087, + "op": "JUMPDEST", + "gas": 31064, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 3088, + "op": "DUP1", + "gas": 31063, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3089, + "op": "ISZERO", + "gas": 31060, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3090, + "op": "PUSH2", + "gas": 31057, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3093, + "op": "JUMPI", + "gas": 31054, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 3110, + "op": "JUMPDEST", + "gas": 31044, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 3111, + "op": "ISZERO", + "gas": 31043, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3112, + "op": "PUSH2", + "gas": 31040, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3115, + "op": "JUMPI", + "gas": 31037, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 3165, + "op": "JUMPDEST", + "gas": 31027, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 3166, + "op": "DUP1", + "gas": 31026, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3167, + "op": "MLOAD", + "gas": 31023, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3168, + "op": "DUP3", + "gas": 31020, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3169, + "op": "MLOAD", + "gas": 31017, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3170, + "op": "EQ", + "gas": 31014, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3171, + "op": "PUSH2", + "gas": 31011, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3174, + "op": "JUMPI", + "gas": 31008, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 3224, + "op": "JUMPDEST", + "gas": 30998, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 3225, + "op": "PUSH0", + "gas": 30997, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 3226, + "op": "JUMPDEST", + "gas": 30995, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 3227, + "op": "DUP3", + "gas": 30994, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3228, + "op": "MLOAD", + "gas": 30991, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3229, + "op": "DUP2", + "gas": 30988, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3230, + "op": "LT", + "gas": 30985, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3231, + "op": "ISZERO", + "gas": 30982, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3232, + "op": "PUSH2", + "gas": 30979, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3235, + "op": "JUMPI", + "gas": 30976, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 3236, + "op": "PUSH0", + "gas": 30966, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 3237, + "op": "PUSH1", + "gas": 30964, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3239, + "op": "PUSH1", + "gas": 30961, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3241, + "op": "PUSH1", + "gas": 30958, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3243, + "op": "SHL", + "gas": 30955, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3244, + "op": "SUB", + "gas": 30952, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3245, + "op": "AND", + "gas": 30949, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3246, + "op": "PUSH1", + "gas": 30946, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3248, + "op": "PUSH0", + "gas": 30943, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 3249, + "op": "DUP6", + "gas": 30941, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3250, + "op": "DUP5", + "gas": 30938, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3251, + "op": "DUP2", + "gas": 30935, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3252, + "op": "MLOAD", + "gas": 30932, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3253, + "op": "DUP2", + "gas": 30929, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3254, + "op": "LT", + "gas": 30926, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3255, + "op": "PUSH2", + "gas": 30923, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3258, + "op": "JUMPI", + "gas": 30920, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 3266, + "op": "JUMPDEST", + "gas": 30910, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 3267, + "op": "PUSH1", + "gas": 30909, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3269, + "op": "SWAP1", + "gas": 30906, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3270, + "op": "DUP2", + "gas": 30903, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3271, + "op": "MUL", + "gas": 30900, + "gasCost": 5, + "depth": 2 + }, + { + "pc": 3272, + "op": "SWAP2", + "gas": 30895, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3273, + "op": "SWAP1", + "gas": 30892, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3274, + "op": "SWAP2", + "gas": 30889, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3275, + "op": "ADD", + "gas": 30886, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3276, + "op": "DUP2", + "gas": 30883, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3277, + "op": "ADD", + "gas": 30880, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3278, + "op": "MLOAD", + "gas": 30877, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3279, + "op": "PUSH2", + "gas": 30874, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3282, + "op": "AND", + "gas": 30871, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3283, + "op": "DUP3", + "gas": 30868, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3284, + "op": "MSTORE", + "gas": 30865, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3285, + "op": "DUP2", + "gas": 30862, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3286, + "op": "ADD", + "gas": 30859, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3287, + "op": "SWAP2", + "gas": 30856, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3288, + "op": "SWAP1", + "gas": 30853, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3289, + "op": "SWAP2", + "gas": 30850, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3290, + "op": "MSTORE", + "gas": 30847, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3291, + "op": "PUSH1", + "gas": 30844, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3293, + "op": "ADD", + "gas": 30841, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3294, + "op": "PUSH0", + "gas": 30838, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 3295, + "op": "SHA3", + "gas": 30836, + "gasCost": 42, + "depth": 2 + }, + { + "pc": 3296, + "op": "SLOAD", + "gas": 30794, + "gasCost": 2100, + "depth": 2, + "storage": { + "0x000000000000000000000000000000000000000000000000000000000000009b": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x29bc3b2a60f4b394d528442f4e3154d1c48862d7f135fbad213b0abde2291098": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x00000000000000000000000096904ff7fe8eed74d6ec4c9bf7612d9f239d40c6", + "0x53bdca72fa8d2e145a1b3bd11cde5bd75428acd18eac3d6adf4e06e7e637706d": "0x0000000000000000000000004399eace6ab60893b789677b234762264e76a97c", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000530000000000000000000000000000000000000b" + } + }, + { + "pc": 3297, + "op": "PUSH1", + "gas": 28694, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3299, + "op": "PUSH1", + "gas": 28691, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3301, + "op": "PUSH1", + "gas": 28688, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3303, + "op": "SHL", + "gas": 28685, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3304, + "op": "SUB", + "gas": 28682, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3305, + "op": "AND", + "gas": 28679, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3306, + "op": "EQ", + "gas": 28676, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3307, + "op": "PUSH2", + "gas": 28673, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3310, + "op": "JUMPI", + "gas": 28670, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 3311, + "op": "DUP2", + "gas": 28660, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3312, + "op": "DUP2", + "gas": 28657, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3313, + "op": "DUP2", + "gas": 28654, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3314, + "op": "MLOAD", + "gas": 28651, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3315, + "op": "DUP2", + "gas": 28648, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3316, + "op": "LT", + "gas": 28645, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3317, + "op": "PUSH2", + "gas": 28642, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3320, + "op": "JUMPI", + "gas": 28639, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 3328, + "op": "JUMPDEST", + "gas": 28629, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 3329, + "op": "PUSH1", + "gas": 28628, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3331, + "op": "MUL", + "gas": 28625, + "gasCost": 5, + "depth": 2 + }, + { + "pc": 3332, + "op": "PUSH1", + "gas": 28620, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3334, + "op": "ADD", + "gas": 28617, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3335, + "op": "ADD", + "gas": 28614, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3336, + "op": "MLOAD", + "gas": 28611, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3337, + "op": "PUSH0", + "gas": 28608, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 3338, + "op": "SUB", + "gas": 28606, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3339, + "op": "ISZERO", + "gas": 28603, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3340, + "op": "PUSH2", + "gas": 28600, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3343, + "op": "JUMPI", + "gas": 28597, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 3344, + "op": "DUP2", + "gas": 28587, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3345, + "op": "DUP2", + "gas": 28584, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3346, + "op": "DUP2", + "gas": 28581, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3347, + "op": "MLOAD", + "gas": 28578, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3348, + "op": "DUP2", + "gas": 28575, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3349, + "op": "LT", + "gas": 28572, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3350, + "op": "PUSH2", + "gas": 28569, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3353, + "op": "JUMPI", + "gas": 28566, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 3361, + "op": "JUMPDEST", + "gas": 28556, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 3362, + "op": "PUSH1", + "gas": 28555, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3364, + "op": "MUL", + "gas": 28552, + "gasCost": 5, + "depth": 2 + }, + { + "pc": 3365, + "op": "PUSH1", + "gas": 28547, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3367, + "op": "ADD", + "gas": 28544, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3368, + "op": "ADD", + "gas": 28541, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3369, + "op": "MLOAD", + "gas": 28538, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3370, + "op": "PUSH1", + "gas": 28535, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3372, + "op": "PUSH0", + "gas": 28532, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 3373, + "op": "DUP6", + "gas": 28530, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3374, + "op": "DUP5", + "gas": 28527, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3375, + "op": "DUP2", + "gas": 28524, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3376, + "op": "MLOAD", + "gas": 28521, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3377, + "op": "DUP2", + "gas": 28518, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3378, + "op": "LT", + "gas": 28515, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3379, + "op": "PUSH2", + "gas": 28512, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3382, + "op": "JUMPI", + "gas": 28509, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 3390, + "op": "JUMPDEST", + "gas": 28499, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 3391, + "op": "PUSH1", + "gas": 28498, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3393, + "op": "MUL", + "gas": 28495, + "gasCost": 5, + "depth": 2 + }, + { + "pc": 3394, + "op": "PUSH1", + "gas": 28490, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3396, + "op": "ADD", + "gas": 28487, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3397, + "op": "ADD", + "gas": 28484, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3398, + "op": "MLOAD", + "gas": 28481, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3399, + "op": "PUSH2", + "gas": 28478, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3402, + "op": "AND", + "gas": 28475, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3403, + "op": "PUSH2", + "gas": 28472, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3406, + "op": "AND", + "gas": 28469, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3407, + "op": "DUP2", + "gas": 28466, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3408, + "op": "MSTORE", + "gas": 28463, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3409, + "op": "PUSH1", + "gas": 28460, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3411, + "op": "ADD", + "gas": 28457, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3412, + "op": "SWAP1", + "gas": 28454, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3413, + "op": "DUP2", + "gas": 28451, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3414, + "op": "MSTORE", + "gas": 28448, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3415, + "op": "PUSH1", + "gas": 28445, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3417, + "op": "ADD", + "gas": 28442, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3418, + "op": "PUSH0", + "gas": 28439, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 3419, + "op": "SHA3", + "gas": 28437, + "gasCost": 42, + "depth": 2 + }, + { + "pc": 3420, + "op": "DUP2", + "gas": 28395, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3421, + "op": "SWAP1", + "gas": 28392, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3422, + "op": "SSTORE", + "gas": 28389, + "gasCost": 5000, + "depth": 2, + "storage": { + "0x000000000000000000000000000000000000000000000000000000000000009b": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x29bc3b2a60f4b394d528442f4e3154d1c48862d7f135fbad213b0abde2291098": "0x0000000000000000000000000000000000000000000000000000000000000001", + "0x360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc": "0x00000000000000000000000096904ff7fe8eed74d6ec4c9bf7612d9f239d40c6", + "0x53bdca72fa8d2e145a1b3bd11cde5bd75428acd18eac3d6adf4e06e7e637706d": "0x0000000000000000000000004399eace6ab60893b789677b234762264e76a97c", + "0xb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d6103": "0x000000000000000000000000530000000000000000000000000000000000000b", + "0xbb86fbc034f4e382929974bcd8419ed626b0ea647f962d89ba2fb6bd28785ab9": "0x0000000000000000000000000000000000000000000000000000000000000466" + } + }, + { + "pc": 3423, + "op": "POP", + "gas": 23389, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 3424, + "op": "DUP3", + "gas": 23387, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3425, + "op": "DUP2", + "gas": 23384, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3426, + "op": "DUP2", + "gas": 23381, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3427, + "op": "MLOAD", + "gas": 23378, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3428, + "op": "DUP2", + "gas": 23375, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3429, + "op": "LT", + "gas": 23372, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3430, + "op": "PUSH2", + "gas": 23369, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3433, + "op": "JUMPI", + "gas": 23366, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 3441, + "op": "JUMPDEST", + "gas": 23356, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 3442, + "op": "PUSH1", + "gas": 23355, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3444, + "op": "MUL", + "gas": 23352, + "gasCost": 5, + "depth": 2 + }, + { + "pc": 3445, + "op": "PUSH1", + "gas": 23347, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3447, + "op": "ADD", + "gas": 23344, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3448, + "op": "ADD", + "gas": 23341, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3449, + "op": "MLOAD", + "gas": 23338, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3450, + "op": "PUSH2", + "gas": 23335, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3453, + "op": "AND", + "gas": 23332, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3454, + "op": "PUSH32", + "gas": 23329, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3487, + "op": "DUP4", + "gas": 23326, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3488, + "op": "DUP4", + "gas": 23323, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3489, + "op": "DUP2", + "gas": 23320, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3490, + "op": "MLOAD", + "gas": 23317, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3491, + "op": "DUP2", + "gas": 23314, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3492, + "op": "LT", + "gas": 23311, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3493, + "op": "PUSH2", + "gas": 23308, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3496, + "op": "JUMPI", + "gas": 23305, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 3504, + "op": "JUMPDEST", + "gas": 23295, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 3505, + "op": "PUSH1", + "gas": 23294, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3507, + "op": "MUL", + "gas": 23291, + "gasCost": 5, + "depth": 2 + }, + { + "pc": 3508, + "op": "PUSH1", + "gas": 23286, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3510, + "op": "ADD", + "gas": 23283, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3511, + "op": "ADD", + "gas": 23280, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3512, + "op": "MLOAD", + "gas": 23277, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3513, + "op": "PUSH1", + "gas": 23274, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3515, + "op": "MLOAD", + "gas": 23271, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3516, + "op": "PUSH2", + "gas": 23268, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3519, + "op": "SWAP2", + "gas": 23265, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3520, + "op": "DUP2", + "gas": 23262, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3521, + "op": "MSTORE", + "gas": 23259, + "gasCost": 6, + "depth": 2 + }, + { + "pc": 3522, + "op": "PUSH1", + "gas": 23253, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3524, + "op": "ADD", + "gas": 23250, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3525, + "op": "SWAP1", + "gas": 23247, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3526, + "op": "JUMP", + "gas": 23244, + "gasCost": 8, + "depth": 2 + }, + { + "pc": 3527, + "op": "JUMPDEST", + "gas": 23236, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 3528, + "op": "PUSH1", + "gas": 23235, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3530, + "op": "MLOAD", + "gas": 23232, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3531, + "op": "DUP1", + "gas": 23229, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3532, + "op": "SWAP2", + "gas": 23226, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3533, + "op": "SUB", + "gas": 23223, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3534, + "op": "SWAP1", + "gas": 23220, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3535, + "op": "LOG2", + "gas": 23217, + "gasCost": 1381, + "depth": 2 + }, + { + "pc": 3536, + "op": "JUMPDEST", + "gas": 21836, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 3537, + "op": "PUSH1", + "gas": 21835, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3539, + "op": "ADD", + "gas": 21832, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3540, + "op": "PUSH2", + "gas": 21829, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3543, + "op": "JUMP", + "gas": 21826, + "gasCost": 8, + "depth": 2 + }, + { + "pc": 3226, + "op": "JUMPDEST", + "gas": 21818, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 3227, + "op": "DUP3", + "gas": 21817, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3228, + "op": "MLOAD", + "gas": 21814, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3229, + "op": "DUP2", + "gas": 21811, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3230, + "op": "LT", + "gas": 21808, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3231, + "op": "ISZERO", + "gas": 21805, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3232, + "op": "PUSH2", + "gas": 21802, + "gasCost": 3, + "depth": 2 + }, + { + "pc": 3235, + "op": "JUMPI", + "gas": 21799, + "gasCost": 10, + "depth": 2 + }, + { + "pc": 3544, + "op": "JUMPDEST", + "gas": 21789, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 3545, + "op": "POP", + "gas": 21788, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 3546, + "op": "POP", + "gas": 21786, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 3547, + "op": "POP", + "gas": 21784, + "gasCost": 2, + "depth": 2 + }, + { + "pc": 3548, + "op": "JUMP", + "gas": 21782, + "gasCost": 8, + "depth": 2 + }, + { + "pc": 751, + "op": "JUMPDEST", + "gas": 21774, + "gasCost": 1, + "depth": 2 + }, + { + "pc": 752, + "op": "STOP", + "gas": 21773, + "gasCost": 0, + "depth": 2 + }, + { + "pc": 1224, + "op": "RETURNDATASIZE", + "gas": 22356, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1225, + "op": "PUSH0", + "gas": 22354, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1226, + "op": "DUP1", + "gas": 22352, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1227, + "op": "RETURNDATACOPY", + "gas": 22349, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1228, + "op": "DUP1", + "gas": 22346, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1229, + "op": "DUP1", + "gas": 22343, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1230, + "op": "ISZERO", + "gas": 22340, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1231, + "op": "PUSH2", + "gas": 22337, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1234, + "op": "JUMPI", + "gas": 22334, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 1235, + "op": "RETURNDATASIZE", + "gas": 22324, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1236, + "op": "PUSH0", + "gas": 22322, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1237, + "op": "RETURN", + "gas": 22320, + "gasCost": 0, + "depth": 1 + } + ], + "callTrace": { + "from": "0x5160a103bb83c2c684ff621d7c707bc1b93920ae", + "gas": "0x10332", + "gasUsed": "0xac02", + "to": "0x5300000000000000000000000000000000000021", + "input": "0x8c399691000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000466", + "calls": [ + { + "from": "0x5300000000000000000000000000000000000021", + "gas": "0x8fa4", + "gasUsed": "0x3a97", + "to": "0x96904ff7fe8eed74d6ec4c9bf7612d9f239d40c6", + "input": "0x8c399691000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000466", + "value": "0x0", + "type": "DELEGATECALL" + } + ], + "value": "0x0", + "type": "CALL" + } + } + ], + "withdraw_trie_root": "0xd8b1ed3f4a01e26b20ae06ee54a673e1614431cb403597252f7a5caefa36da38", + "sequencer_set_verify_hash": "0x6d547e175e7a1d4b4da46abecd844564f5c7aa9da8d073003b73401042c50f80", + "startL1QueueIndex": 14 + } + ] +] diff --git a/prover/testdata/altfeetx/trace_call.json b/prover/testdata/altfeetx/trace_call.json new file mode 100644 index 000000000..add3fc2c1 --- /dev/null +++ b/prover/testdata/altfeetx/trace_call.json @@ -0,0 +1,598 @@ +[ + [ + { + "chainID": 53077, + "version": "2.0.8-mainnet-3f493f94", + "coinbase": { + "address": "0xfabb0ac9d68b0b445fb7357272ff202c5651694a", + "nonce": 0, + "balance": "0x200000000000000000000000000000000000000000000000000f76b616411d", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + "header": { + "parentHash": "0x01c2d5291c09dec3d4a667ea57dfeefd546a6d1c5c77d5ce488e3402c3b6118d", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "miner": "0x0000000000000000000000000000000000000000", + "stateRoot": "0x1b46ab6195208d1490fc1385b25bd13f7ca1e27cf9730c5e91df9d3f2663d4e8", + "transactionsRoot": "0x9a468bd1a736e8eca4c07921a632ad5bb23f9b06fc24ec2703cca3bc9acf938f", + "receiptsRoot": "0x7f61f257ff93f82296d2dce9d3461affc3f4092f098d1111f20c2d5d4ce62e40", + "logsBloom": "0x00000000000000000002000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000840000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000200000000008000000000000000000000000000000000000000000000000000000000000000002042000000000000000000000000000000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000", + "difficulty": "0x0", + "number": "0x2b83", + "gasLimit": "0x1c9c380", + "gasUsed": "0x5208", + "timestamp": "0x69240a4a", + "extraData": "0x", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x0000000000000000", + "nextL1MsgIndex": "0x0", + "batchHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "baseFeePerGas": "0xf4240", + "withdrawalsRoot": null, + "blobGasUsed": null, + "excessBlobGas": null, + "parentBeaconBlockRoot": null, + "requestsHash": null, + "hash": "0x5c6e7455149cd73b7bd8f4f79d23f0230350d45c58d5f7fac6b8dc3df0f7ffa1" + }, + "transactions": [ + { + "type": 127, + "nonce": 19, + "txHash": "0x532ed24902802a792e0734cc32de2ab21499a3ed9a9d14f839664e5d6208be00", + "gas": 21000, + "gasPrice": "0x3d0900", + "gasTipCap": "0x1e8480", + "gasFeeCap": "0x3d0900", + "feeTokenID": 1, + "from": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", + "to": "0x0742d35cc6634c0532925a3b844bc9e7595f0beb", + "chainId": "0xcf55", + "value": "0x1", + "data": "0x", + "isCreate": false, + "accessList": [], + "v": "0x0", + "r": "0xfae00afa0282fc30e6efbf13c4010e5a50065ce765931be46ffa7e6260ef5489", + "s": "0x4d7e9f64a48bcb8cd86dcd5c09b1a86d5a2bae8d30b5236439c4ae6e048fd7e2" + } + ], + "storageTrace": { + "rootBefore": "0x2251e5e3b690ff9f66bf1347e037ecd15f9e8fb99bd06f129f666ffdf8c4df76", + "rootAfter": "0x1b46ab6195208d1490fc1385b25bd13f7ca1e27cf9730c5e91df9d3f2663d4e8", + "proofs": { + "0x0742D35CC6634c0532925A3b844bc9E7595f0Beb": [ + "0x092bc7bfa35502df6c119d1a4d72180d21c4a7a96d281b81abcb30abd901120685166f06d8146b4cde5cc3609a5571bdf635c6ef105f7dbf101874acd9d79643d5", + "0x09286f7a9efa06895b7f63ef5d58ed8f8773eb3c91d67a68f34bcf96c32b2262211d8d30ebb8c0c0130854bff123cc77f0af71a766258ded75b1fe000738af773a", + "0x090c71e16607326135b9bf36e84d1521e456095303912ec486b1b2cafb353b99bc0f4be945f00183f6833f932e2021f6ff5698622457524a20ce21a3921aabce3a", + "0x090efe4540500f6c9bde2b747973c4dc8f1cfff8678a221260db70a056f9ac1a5714f4b04aad11a22d617370765cf6f9565a981470066b9992cf1100ba8ac98b5c", + "0x0903c58d513b8ac2d3babbf2f6202c04fe89af037e563477a0f2eabff214b06a8400d247dec7c5069fde342365b2f0a6d229665abb83917d06a43e60c740587af2", + "0x091410c403ec5d9752c2c72974f910345abf6a5afdbe2c187c10f9c5ff3b85f1a808f0e98ac5fe4f888d695f71cbb4331160d1f2da76bfe341d98894fd0d727a04", + "0x092b15971b522af8964f68be0ee71a6a27c9808fe6f21829536adeb7a44cb70c1a14d8ce13a4fabbf149d304360801b66d04e6afd03f7e872abd0e20c52f9c8b69", + "0x0911411e755306f50353deebe39a344092e6c10168609a12c7e84a1e8c84858c100bd7cd6e88dbf6870ccac3395d6257b103f59348d7bd5a2a6a533986d5c8b27c", + "0x0907b7a5079fb418510fd9221c5cac6f1c229f5e9f09f3728c7b9313700312876512aa1b74433f0b16ad1ed111c3fc12ba6f037d23859b2a6534bce8c357b43211", + "0x0700000000000000000000000000000000000000000000000000000000000000001c0f4bff64cbe2e6226f28fa0264db680c74239540f699e2dfbd043d9d96ccdd", + "0x0700000000000000000000000000000000000000000000000000000000000000002fdc0539559fb6404776042583f6df0e75ce1578a8974f60c2dd2eee2803493f", + "0x082ba663c950df1c13ddb2e231a276d589e5d068dbfe09c32dd5f2b5cc772178691cece90884518dd5016ccd2b79fbe00c1c2a3b67037a41508f7223b7b3d44ee1", + "0x0707102728cc2d7cee17cda77b92e494c404c24bcd11db9d102a4b6ef492ae4d53042db0541967a6441a3f826f5fcc7f091a0b07bc88d21d227ccd644d72b44a36", + "0x041a41a36901ec07e376de0d0d5409328f7c9ae666006cc427b1f8ad646ce147c105080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098a7d9b8314c00040000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864200742d35cc6634c0532925a3b844bc9e7595f0beb000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5300000000000000000000000000000000000001": [ + "0x092bc7bfa35502df6c119d1a4d72180d21c4a7a96d281b81abcb30abd901120685166f06d8146b4cde5cc3609a5571bdf635c6ef105f7dbf101874acd9d79643d5", + "0x091e469f1232f7069f7e3c946000e7bca1e51d47e0381cfb80d2917220d9421cfb10d4bdcd77d36c2a476be77c41376b8c2ee6a395d2429db01aad6d9035f4133d", + "0x091b86b3c268cc1d100cbd7b9710025ac45adc4e54a645838f5120ce0049cf78ad0a7e335771fa2c19e0bd11dd9604968aa7a81ed4ecf74bda066058c70cbaebf2", + "0x09059b71e5e7400f0f399a620633437fd2cf9596c932769a0a9d441f0542c334cd06921c2f3b60bbd12dae3fc369a599b847b18e90e7cbb03a76e5a43f895671df", + "0x091037dd57995a394370ce77d18031e7fdd716725f6cd90a047d8c84c88da15d2c23bf13d303d5bdc56054acac8d0bac45eefe243f465c4256e86fe2eae7d52ac5", + "0x090c311950521cda0cdca65f368c0fca2eae6b063232fb84eac9ed027e9834aac8183d898dec71e85c4ba675301636453030beea2a744967a50159574a47b0c9f6", + "0x091cde134960925ee62cea9c340d6241c548fa0978ceca2965c87acccaf8b2805322d288ea2a9d771a19771658abf5a64fd503f4ed277aa8d6f779137a88ea1c8d", + "0x091dba2418c5fdd917fcdeff144d6017c58fac6c5ab448ef2a790ab85e36f9099a20a8a95c49033e899476e2d9c2c98bf1ec0d3423c4d3f31ddea9af65a3a27945", + "0x09220b163279be211a426832f5ff47e0ecadb5bd5eaaf0d62189998fde4e14e629126d21b3294439db0a7819880feb71e44daa89510b4e7415bad226dafdba0c1d", + "0x08150feb81fe1639286c75adb93e5467d36ad52d9ff00e0c706bc5345f6dcd49500000000000000000000000000000000000000000000000000000000000000000", + "0x081cb430cbc5dd11f62a713fb3656184085386104dc53fc135fb3c56dba49670500000000000000000000000000000000000000000000000000000000000000000", + "0x060c320ff8f6c3907ae6df62a7fe70e2be093390bd246197d5f56b6bce56f513f812fac8f51e3812914c097147217411381b9b2dad76963ef63c261885d3a49223", + "0x0427cfcbd2fe87474008e199ef5bff09273803bbf38032c75a36a7726b3c88f8a205080000000000000000000000000000000000000000000000000aec000000000000000000000000000000000000000000000000000000000000000000000000000000002198e2c16011cd18ef5be82557ea4552a16cc88ed8026d68fc38a18776550fa944107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f8400", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x530000000000000000000000000000000000000f": [ + "0x092bc7bfa35502df6c119d1a4d72180d21c4a7a96d281b81abcb30abd901120685166f06d8146b4cde5cc3609a5571bdf635c6ef105f7dbf101874acd9d79643d5", + "0x091e469f1232f7069f7e3c946000e7bca1e51d47e0381cfb80d2917220d9421cfb10d4bdcd77d36c2a476be77c41376b8c2ee6a395d2429db01aad6d9035f4133d", + "0x0918ec3f04aa26dfe2fdb34122691277175ffeb34b57b96de91a11020d796b5b3703553048aa00bf7f05c1bca37b341775f3f2c0aeeb6ae245dbe5a00df1c3c9ce", + "0x092095e03a6c163738018ddb4e1cdc171ed8306b711a78a59e07798e60d974a8f52e51ae1fc969dfd817613e2e6ee8062cd343612928fc1f2a8be5a4053032a3e0", + "0x090430edc094dcb51bb128e4db1e27812218fcb3b88806da90445fe07b5ca18e3006767c9fc9e8eb4a72272bf69aef6ef5cf6ab77620acf76754cdff87c31dfa41", + "0x090d2955877b59dd23203eda776f580ddea39d387b90e4178cc7fb41f83080ab1c1558ebda9c7a671a601af519b323ca394a262519dacf80a90f66dc0ce90e6572", + "0x09101b44cf1f33794d2a3078cb1acdfc64b79980839d80127d34998e67a32c6aa42a16300f95ebb8c46e4e6ede02b7fa4944ecc1315bc8b7a2de274188b5f6f6d3", + "0x0923bfab6f7b9cc20bae8ca8989ad45df9625cf0c14ee54257ffd31b2593b8385f219d7fa978c4389f2ee5a1be328f17e3df180f18177925171afd5a1ae5493b93", + "0x06179596d8aa933023605d9c3eaad2b08f7893d5b65f8ddce4d36c97f541e11d892a868ae99ff40d43cff3f28ff0655bf467eaa89e3d3a1493203e4abb26099b3b", + "0x0418a86f98026d1a55f6fee616f04d51be16c033651ffaafb0514287ec067d04e805080000000000000000000000000000000000000000000000000aec0000000000000000000000000000000000000000000000000000000000000000000000000000000002f56e29848865e204296c51c2fa18997db9888d7dd5a3e9ed3c726e278c099744107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f8400", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5300000000000000000000000000000000000017": [ + "0x092bc7bfa35502df6c119d1a4d72180d21c4a7a96d281b81abcb30abd901120685166f06d8146b4cde5cc3609a5571bdf635c6ef105f7dbf101874acd9d79643d5", + "0x091e469f1232f7069f7e3c946000e7bca1e51d47e0381cfb80d2917220d9421cfb10d4bdcd77d36c2a476be77c41376b8c2ee6a395d2429db01aad6d9035f4133d", + "0x0918ec3f04aa26dfe2fdb34122691277175ffeb34b57b96de91a11020d796b5b3703553048aa00bf7f05c1bca37b341775f3f2c0aeeb6ae245dbe5a00df1c3c9ce", + "0x092095e03a6c163738018ddb4e1cdc171ed8306b711a78a59e07798e60d974a8f52e51ae1fc969dfd817613e2e6ee8062cd343612928fc1f2a8be5a4053032a3e0", + "0x0910b1ec1393c71d2fb5f6024dc8b3b21f75c8de647d481b0121dce322076582d82ca08ae593596704180b0f3f4c8f0bf9f9c8831cff2868f401b67a261813c939", + "0x0901603144c1255abe7e4dccedabde2d3acb83cccfc845602366ed7db86fcea8062dae21e4c5cee679a94325a7d6f9aa0b595a42f165e7bcda729f860111329f61", + "0x090e11cb818c1c31b2c42077bce95e1ac83faec4262e3d214f20345931b381488e1fa1e0f8d195352fc7dfdc1d2cca64062e326f1a44490fb1f715293dc5d56d67", + "0x071e7b646383bbd8defcc230d420cefddd4cae409681ef74ff98bb66527c23473c292161f39efa24ba2d072e47064c6d7ebc45e7890480005cd78d89dc640091c0", + "0x060e3d168eba427cee8d7be26b10e66d5d21b0301485d3cac9c45470fae67ad5031d49523b9f532097709c6c724d41ec10986bc0a4e5d078f5e9f861b56d91b773", + "0x041918c47a133f759975cc95c0dba82051d9b5cd65407e76ef1366a9deaa14f28005080000000000000000000000000000000000000000000000000aec000000000000000000000000000000000000000000000000000000000000000000000000000000002c3cbfa3d0183eb2e332389ef0c7a5e5d73cf155103c3ac0eddefa9e2beae91c44107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f8400", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5300000000000000000000000000000000000021": [ + "0x092bc7bfa35502df6c119d1a4d72180d21c4a7a96d281b81abcb30abd901120685166f06d8146b4cde5cc3609a5571bdf635c6ef105f7dbf101874acd9d79643d5", + "0x09286f7a9efa06895b7f63ef5d58ed8f8773eb3c91d67a68f34bcf96c32b2262211d8d30ebb8c0c0130854bff123cc77f0af71a766258ded75b1fe000738af773a", + "0x092a06163d398088f873c062a317a00fd3db764138a54e7cdc629709208dfa6c1f1ffa7282f31cb8686e18f6ef867ce8984e88aca684e8f3dca2b01557372bcf88", + "0x092cb3b11908a52cd926de960bc1605ba0ca074809eb4b4eeef23b306cdc8a8774049c9ba7546167504538f67af40a08189fe0b869af3172c62b4c748af3580b28", + "0x0913028f68e22d222f43ddc69482acfe4fffbbb3180065d5f00d63d2d839ab86c718be689dee79760972a42c9c0d3f6b4cc1acf518425ed10b445d1b3798822455", + "0x092638133fc9368332440781bda5fd3a9ab693ecb89f611f26acc785e68e181b7e0e520de80cc858c66d2f4dc02567bbe08c1a8f2bdfef6b10355fb2218c77ec0a", + "0x092166504c35825475687da93a700c997aadb255261bc6ce18ff61cd7182db14122cc3d3cf55c0beec2b0f09e350473bd703a8a84463f135d2c2d45ca19f34503a", + "0x091c746524ed2bcb228d6ebf9953357bb1b618a23fc2fe4302df1108a8a0e35ba122aeab44900556acd8bdd693a47952cb01f194cd72e12a550c7fcbc971ed742f", + "0x08244257efc46fd96db45b1505e03603f8b611a3e9ac4630d1fc9b01b4f5fd714117fac506dee79e5f7f52cb7b1eb174b441f0adee2a477e9c1680eeb5913a7eaf", + "0x071e6f5cd0c216a9cf74d9a8ce13256dd8970a07efacb2c61df9e3a4faab03c2de08738589134993085ec4962792e46613a66798325b297c93eca9ded9189ddfd2", + "0x07084f4e6b01a5eda178901c705a9a69b829618c6785a38c831ad467dc7c2d449115e4567e1f83d13a7fe610cca9aa17ba49bce22eb2edbc7f6242f42dc0c1dfd4", + "0x061dbb1f2fe996371625dbfaa5cd6ca070ed15c020c94e65344db5176087c17770242bf081ac926273432685f64c22d3603904df8edc4ddd3d1724817b14a6b8d6", + "0x040883d4562dfe8ba7ad8176bc2844d35ecc486199d589a152eabcee8398f3aebb05080000000000000000000000000000000000000000000000000aec00000000000000000000000000000000000000000000000000000000000000000000000000000000036c7b3f0434b9a4c98814ec5bfef913a8a785403fcc22d17f1adef51905db1a44107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f84205300000000000000000000000000000000000021000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5FbDB2315678afecb367f032d93F642f64180aa3": [ + "0x092bc7bfa35502df6c119d1a4d72180d21c4a7a96d281b81abcb30abd901120685166f06d8146b4cde5cc3609a5571bdf635c6ef105f7dbf101874acd9d79643d5", + "0x091e469f1232f7069f7e3c946000e7bca1e51d47e0381cfb80d2917220d9421cfb10d4bdcd77d36c2a476be77c41376b8c2ee6a395d2429db01aad6d9035f4133d", + "0x091b86b3c268cc1d100cbd7b9710025ac45adc4e54a645838f5120ce0049cf78ad0a7e335771fa2c19e0bd11dd9604968aa7a81ed4ecf74bda066058c70cbaebf2", + "0x09059b71e5e7400f0f399a620633437fd2cf9596c932769a0a9d441f0542c334cd06921c2f3b60bbd12dae3fc369a599b847b18e90e7cbb03a76e5a43f895671df", + "0x091037dd57995a394370ce77d18031e7fdd716725f6cd90a047d8c84c88da15d2c23bf13d303d5bdc56054acac8d0bac45eefe243f465c4256e86fe2eae7d52ac5", + "0x0915afa4f9f2fc1504da0fd705382cc4d5d67c1f1827173cb86d0aaf8370a087a12d577f8c4c0038e39cc3f2c1fbe61545c1e7646df9bdacb8e3a696e187d85395", + "0x090029e3d16c5cb218d7c1e33c52956e04aacb44097c750db1afc8379e9c7cd7e31e5c4456fefe638088cdfacd0458b26dc1b29615585afaa2c8c024c2aa520259", + "0x0700000000000000000000000000000000000000000000000000000000000000000ad2202bc030a92456c8ef95d7da0207feb2a1c5228228741ea6c69c9aa74feb", + "0x091e6693a57c457d669d77b4881946cfe5984476d992fa2bb87761eb034799521220a744f0245c29a8d376f6e531eca3da22480a09ef622d14fbe8ce0ae3349e81", + "0x060eebafdd2c4ba4d19eeb5b468fb911d38f3575ed7a9804e4c33fde82a93ef3c2204176cc02b91cb72c3da7726fdad8306b848cc9f829fc92b7d66fa7d5f2ca56", + "0x040fd4be443a84a4d1d346fbeb8a1a0f574f53161324ff3ff03f6a820b5f3376f205080000000000000000000000000000000000000000000000000d89000000000000000100000000000000000000000000000000000000000000000000000000000000001bd4f082fe61b3e74edaf90873f2c2e2019e7f2c08460b2ee887a19509f9f8be3930291465b96673fe5a4a4889b82e5c88006821f7c1c282ccc6b94d18d5012008234974b1436c0a3925a1d7bdcc36d591168d966d811bb01fcd50e1ada92680205fbdb2315678afecb367f032d93f642f64180aa3000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8": [ + "0x092bc7bfa35502df6c119d1a4d72180d21c4a7a96d281b81abcb30abd901120685166f06d8146b4cde5cc3609a5571bdf635c6ef105f7dbf101874acd9d79643d5", + "0x091e469f1232f7069f7e3c946000e7bca1e51d47e0381cfb80d2917220d9421cfb10d4bdcd77d36c2a476be77c41376b8c2ee6a395d2429db01aad6d9035f4133d", + "0x0918ec3f04aa26dfe2fdb34122691277175ffeb34b57b96de91a11020d796b5b3703553048aa00bf7f05c1bca37b341775f3f2c0aeeb6ae245dbe5a00df1c3c9ce", + "0x0908ba2ba7af260c4f991d6b2e05a1335290d382ce59a6fcd5aa2a4b137021fc2824931ced24212206fa48a12d2f13412c1308ab073b7b877a7ccde133989601e9", + "0x09036c4fee62bb83d523b25829a9143501aea11f0d248381af88746cddffffcb1528b3de1cd6e7bbce58cb5b1fe617111eb5e12535887ee25646b9a1290df18e2d", + "0x092bacc030e7201c95030a1aea2839ee9bfee02262d8e0675495fea4338bdfa5062642ee27f235e654c3a23b793e801a546316ad07406618e4ee01302b63566cbc", + "0x0900f088c016ba77fd9f92ce70ea2a1d105cdfc6c6a5d9186a2c187134d4c5a4ee2134a3e42983e0b7b592873d4f96f0d230bb520a42575a4b22a04a3fc50f1a23", + "0x080f403be4a306e51eab11f0e46ec27886df0b919ee205bd3fa6fb3b0b2b7e6e670000000000000000000000000000000000000000000000000000000000000000", + "0x0822d381e78bb6e50e7ba420e48dd800c957d5cfb3c12f7bb8b886c2cf7fac5e3b09399ba9b0e1c80d7f129d5545b2bb9932c4fdaf7b0e8e0c5fbb0cfe46f78783", + "0x0407edffb2f516756416f9cd6da120841b708d8ba8e0ae76133c0022b273252174050800000000000000000000000000000000000000000000000000000000000000000013001fffffffffffffffffffffffffffffffffffffffffffff59776f638fc0477f0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b648642070997970c51812dc3a010c7d01b50e0d17dc79c8000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xFABB0ac9d68B0B445fB7357272Ff202C5651694a": [ + "0x092bc7bfa35502df6c119d1a4d72180d21c4a7a96d281b81abcb30abd901120685166f06d8146b4cde5cc3609a5571bdf635c6ef105f7dbf101874acd9d79643d5", + "0x09286f7a9efa06895b7f63ef5d58ed8f8773eb3c91d67a68f34bcf96c32b2262211d8d30ebb8c0c0130854bff123cc77f0af71a766258ded75b1fe000738af773a", + "0x090c71e16607326135b9bf36e84d1521e456095303912ec486b1b2cafb353b99bc0f4be945f00183f6833f932e2021f6ff5698622457524a20ce21a3921aabce3a", + "0x092ee6a5cff1508574915e5c5fa61134dcb9946427ead4b12c3273e9b97a0b77a6001854e8380fbd58620925780f3ed2d0abeea5a13b4e0a4e0a51f59b9b5ec3c0", + "0x09174cfdf2f1e0c6fe4cab85c20ea084898c0e359ada326bd1d38abce77a6ea2492137ebae927de9055c704eaf20176efd3688db2f24e0b7e0a197ed67abc806f0", + "0x0921e218fe94e8e55e46d83b3c61bc6d8f60c2262bf59669299b70dcfe52d8b7442cd91c7a4c36943da038bcb35dde8dd004b83e190a17e35d1bda9011ae062f99", + "0x092173e847844f75d655ac0690b26ee3bf3e65a3c0062f9b9be566e74cd41927df12b7fd5527c406a10b999c59c3c6a1f781797558a36b7fbdadd2d2cf435c1e25", + "0x07000000000000000000000000000000000000000000000000000000000000000002c01b849e25a91dd222e8d006ae918579a6bff12484cc758a8c43c8d6ce0017", + "0x080931f89fedde2fe071003121dcbbc15662cc71fc96127a81b17ca72f1dc81d620000000000000000000000000000000000000000000000000000000000000000", + "0x070d53acb57a8c223e5af81f5dbf1d80922525be5a8d4e45f5f09ff8580a16e210159ad10b4c89ff16157cc364c81f6039eeea9a8eb87e4b4700249219e71cc3ef", + "0x0403d2c88868dc8b5f7994604147a8246c48cc905235de980c42c3e78f351f00c505080000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000f76b616411d0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420fabb0ac9d68b0b445fb7357272ff202c5651694a000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "storageProofs": { + "0x5300000000000000000000000000000000000001": { + "0x0000000000000000000000000000000000000000000000000000000000000021": [ + "0x0825bcd8ed4a7e39c0f0e835761cda36131dd34f16de95765d2216d997923a52f60e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200", + "0x06216372aa3165a29ee67494a5a9680358be92c254cc5724949e4d52742ba8d57f02a40b5614637fca2783d673559f035f5f5a0588ee27d164bb5375568493200a", + "0x042f683d080c393f5fb2ade2190fd56e8a5e8fa26533acdea8cce25caa236027cc0101000027ae5ba08d7291c96c8cbddcc148bf48a6d68c7974b94356f53754ef6171d75700", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x530000000000000000000000000000000000000f": { + "0x0000000000000000000000000000000000000000000000000000000000000001": [ + "0x09250fbf2587e7f07f1dd72ac26e3245705f67157a2e402a60bcb9c861b5a4d3f7256fbb55c0a0ca65679134f25a5a893427348f9086273c801ff4633c50899f1e", + "0x0904657f17b545183e86b0545adff05a99f8efe788d72e90e01784a1b9f986e35a162b4d479ff13f2af3f0cfaadc6bccc8622dd980f83c7014e947f50577eedaba", + "0x0804422082d7197f691b32c2c4120b44e674d5bd50d4b210f0d4525906237d29871e144bbeb8f4c147dafacf9567e13b1b15e4804a9d74df2da7619735d765c1be", + "0x081341967c7422e5508fc72463c51ace718e18440d00db082bf2184d906f2c9ad90000000000000000000000000000000000000000000000000000000000000000", + "0x07000000000000000000000000000000000000000000000000000000000000000006e79d86dd9c9fa893eb97cd43df98e2d19487b963520202b144a3f4b84f0c45", + "0x080e0f66ccb838bd67cbf343dadf696b6d2aa46137c6c82c4fd6ceaf8d60fe80d60000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000002634b0768a20cec85ef53630d7f4dfc6d1c8c8f76dad4d9014828fc94bf0ded8", + "0x080b10db1b542a2f6c809a2d2cd03aa0c4d4ddcdfd2a1c8a00dc06cdc12bbb976c0000000000000000000000000000000000000000000000000000000000000000", + "0x08144e4aeb02298f8f0545b923bc88172527f7ffdd24eb31a2dccfe887757beb0f0000000000000000000000000000000000000000000000000000000000000000", + "0x07000000000000000000000000000000000000000000000000000000000000000023413c0bd51b56dc557426037ffd25cae18e73e8f116ad6aa3a46aaba671f1e4", + "0x0628e14710ef1f9a6f539110a2d6c693d9389d38836eb9f0e0ea449d3afaede2a6156a0960a84fa4287f66d18b9c39ab9d403fa6b6dddd126f47758aadcb82e122", + "0x0426049ba6de63003492eb078a01a8aa4f4a0e67f28f0955c2eba9101d5d2eea5001010000000000000000000000000000000000000000000000000000000000003b9aca00200000000000000000000000000000000000000000000000000000000000000001", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000002": [ + "0x09250fbf2587e7f07f1dd72ac26e3245705f67157a2e402a60bcb9c861b5a4d3f7256fbb55c0a0ca65679134f25a5a893427348f9086273c801ff4633c50899f1e", + "0x0904657f17b545183e86b0545adff05a99f8efe788d72e90e01784a1b9f986e35a162b4d479ff13f2af3f0cfaadc6bccc8622dd980f83c7014e947f50577eedaba", + "0x0804422082d7197f691b32c2c4120b44e674d5bd50d4b210f0d4525906237d29871e144bbeb8f4c147dafacf9567e13b1b15e4804a9d74df2da7619735d765c1be", + "0x04020953ad52de135367a1ba2629636216ed5174cce5629d11b5d97fe733f07dcc0101000000000000000000000000000000000000000000000000000000000000000009c4200000000000000000000000000000000000000000000000000000000000000002", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000003": [ + "0x09250fbf2587e7f07f1dd72ac26e3245705f67157a2e402a60bcb9c861b5a4d3f7256fbb55c0a0ca65679134f25a5a893427348f9086273c801ff4633c50899f1e", + "0x0700000000000000000000000000000000000000000000000000000000000000002c627348b5769391cdf27c1c6ccd9e7363936623501503e7549c1df6542031b9", + "0x060ee2ca3e190e48951aa8d5bb00d33ba76a92de69a807dfa6f2eaa9881e303f320e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200", + "0x0406c50541f08911ad149aa545dd3d606f86ee63c751a795c7d57f0d3f85e6bdeb01010000000000000000000000000000000000000000000000000000000000003b9aca0000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000006": [ + "0x09250fbf2587e7f07f1dd72ac26e3245705f67157a2e402a60bcb9c861b5a4d3f7256fbb55c0a0ca65679134f25a5a893427348f9086273c801ff4633c50899f1e", + "0x0904657f17b545183e86b0545adff05a99f8efe788d72e90e01784a1b9f986e35a162b4d479ff13f2af3f0cfaadc6bccc8622dd980f83c7014e947f50577eedaba", + "0x0804422082d7197f691b32c2c4120b44e674d5bd50d4b210f0d4525906237d29871e144bbeb8f4c147dafacf9567e13b1b15e4804a9d74df2da7619735d765c1be", + "0x04020953ad52de135367a1ba2629636216ed5174cce5629d11b5d97fe733f07dcc0101000000000000000000000000000000000000000000000000000000000000000009c4200000000000000000000000000000000000000000000000000000000000000002", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000007": [ + "0x09250fbf2587e7f07f1dd72ac26e3245705f67157a2e402a60bcb9c861b5a4d3f7256fbb55c0a0ca65679134f25a5a893427348f9086273c801ff4633c50899f1e", + "0x0904657f17b545183e86b0545adff05a99f8efe788d72e90e01784a1b9f986e35a162b4d479ff13f2af3f0cfaadc6bccc8622dd980f83c7014e947f50577eedaba", + "0x0803f6f6d47db3a7888f229ead7798b1ae14eb8855585ebb4d70f6a2020ac30dbf0000000000000000000000000000000000000000000000000000000000000000", + "0x081824025e42aefa5d18b0a0c39ba03d737dc20b78e6574d948d80d82a52f727d80000000000000000000000000000000000000000000000000000000000000000", + "0x05", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000008": [ + "0x09250fbf2587e7f07f1dd72ac26e3245705f67157a2e402a60bcb9c861b5a4d3f7256fbb55c0a0ca65679134f25a5a893427348f9086273c801ff4633c50899f1e", + "0x0700000000000000000000000000000000000000000000000000000000000000002c627348b5769391cdf27c1c6ccd9e7363936623501503e7549c1df6542031b9", + "0x060ee2ca3e190e48951aa8d5bb00d33ba76a92de69a807dfa6f2eaa9881e303f320e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200", + "0x0419a44eca69f8d5e3651ccf05934126419470106b4b51bb4b96b6230b7d80236701010000000000000000000000000000530000000000000000000000000000000000000b00", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000009": [ + "0x09250fbf2587e7f07f1dd72ac26e3245705f67157a2e402a60bcb9c861b5a4d3f7256fbb55c0a0ca65679134f25a5a893427348f9086273c801ff4633c50899f1e", + "0x0700000000000000000000000000000000000000000000000000000000000000002c627348b5769391cdf27c1c6ccd9e7363936623501503e7549c1df6542031b9", + "0x05", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x5300000000000000000000000000000000000017": { + "0x0000000000000000000000000000000000000000000000000000000000000065": [ + "0x09295b90a00505079f65623858f8e164c095a86cfbb449412829e1fc988749139c2c08ec36e0b240f28727cc2f0e93b4b55b1214857f62e93cd895cd25d6b1fca3", + "0x0924e760587c9b1db469c29fecb46a7a69bf5102811e52577a0be8379118e3506115e6e9020712f91f6ee3d7b78613fdb79c35a4f68cf0438bb49ff403e3d93296", + "0x081e5ac2ec2032e7f34af7c72542b1ff463f5590272545e8a2f4f32e3b5a63eda30e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200", + "0x07165d00aa7e206c00402a408f8fd7708cade38a4505b733034b0395a63d9972db1ddc1c901911c636efb3e2c53251d143b3f5bb4271fb6b9e8837fc0c1f739212", + "0x0700000000000000000000000000000000000000000000000000000000000000002b22b7103e3a83cc758c8e8997b79b6e30988fbe8aa1924fdbe675cd6d5ceed0", + "0x0700000000000000000000000000000000000000000000000000000000000000001f4b453328057d0249978fe5ee1e635e4671f325a2bcf3449ef1637170859c43", + "0x0623965bae207a394b8516562f391edb1cdc19cad8d2aa324db42a44fd0810fd550a36302dbd0bcb8ba381bd22b85ded888e754404629c06c2b7801c87978dfd6f", + "0x042115c9b0a0938aa1ce2e8c01581e5aa931288249a453588de70cf2c5dae26a7b0101000022efe8537c043bf1a471893cba84c8cd29a0d3ea62ad7c4ada032136254ad6c9200000000000000000000000000000000000000000000000000000000000000065", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x5300000000000000000000000000000000000021": { + "0x000000000000000000000000000000000000000000000000000000000000009a": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x091e999ad0969a892635449070e98a13e662492f946d6ba9efaccf52ab53e7875e2cbbe5bbc301a45411f8c9d9639b312ddcaffd9fb0598f3bf73f656f309fcb4d", + "0x0904314d470dc20d9ee18b9434c6fff6e9cc5c211a2e469cdeb00b69942bccfb7c0b567c74e6484b887c320ed6b5c14a50a89fe400b3eb13ed5a5e86880a65aea0", + "0x061c7c2370b89156b28f4141e6320159e799f8353ac328f91eadd9c65a06fad2a628b3bf9a92d906051defc60a366063e6d133f3bb15dc661dad6b57e1f51f95e6", + "0x040959c4a1b3fc665dce20b30216d51dd0141a6738567cfbbf2054a1bc710af948010100000000000000000000000000000000000000000000000000049824fc6fcac9f3ba206d01ba8ffed4ce500f24b73f45df7dc163a96f64ced987d8ee795c34e371362e", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x53bdca72fa8d2e145a1b3bd11cde5bd75428acd18eac3d6adf4e06e7e637706d": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x0919e44f4c1854907175b4b2b5a0c96536103adcca1baf40cffa44b0331a8901db2603c9a992dc69a6b684dc301f77cc1c4e9e8a4dd972d15f4cd2ed974c4a79cc", + "0x0925ffe896678956add403385939c3f41f2db8bff412c9cc8d8f0590cef223288f1bbbbc549a61adc7a091da47883f9c34951e785f75cce8226f3ffdd7189d71b4", + "0x09282aa159b4c043af9c744e12ae4c4836a6fad029715cd87972d9b86e31466cf505f95afda0666a080bb144051a34ee842f918d97623213ca6c0b3537d6aab3d5", + "0x0923dcac699b2bc22dc2f7fa81bf06b44a951d3142c20fc0663b738e658d07ad6204469cd5cb700f31d2934e01feb4321e5be7476821bf1dde82369b6d764ec9dd", + "0x0718516cefef69870b53417b7c003d6709cc8a2d2ac60c0a40ddde0a202f50c2fa09d788b871509032fe6ae9e2a3afd360f0a64e334f6b7292f4ca67e768080a7d", + "0x082d377b1e7595023bc12cb372660478fb6dbddd7e9c8d2825d16fe6173ce40f1402b0a149ad95701bfaf35efccee704cf4d7fb96bf553ec35c226dea457a8314e", + "0x071e237cabf7ea38460ebad07de0173f7d8ed59d61314f24480d0afef0f81b258a142fb055691f7e50c943bd4d204714a4481cc47ffd6c8866c20398300c422a74", + "0x061fce356ebc63530766d5ce9779ab52b1992afc5493ded9d69cf796d099ecc606165bb2d134896148cdda711cf71517e576c920edd7f91f1c17a9b6b5fcb103ac", + "0x04032a62f2b11acbea541fd541ef6c2bd3e066df0a54f318716e6a6cf8bf627172010100000000000000000000000000005fbdb2315678afecb367f032d93f642f64180aa32053bdca72fa8d2e145a1b3bd11cde5bd75428acd18eac3d6adf4e06e7e637706d", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x53bdca72fa8d2e145a1b3bd11cde5bd75428acd18eac3d6adf4e06e7e637706e": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x0919e44f4c1854907175b4b2b5a0c96536103adcca1baf40cffa44b0331a8901db2603c9a992dc69a6b684dc301f77cc1c4e9e8a4dd972d15f4cd2ed974c4a79cc", + "0x090dec3fded5debc4bba8aa761a657e8f3bbf01043cb27c6fe8889998a0887b24718683552e0d0dfb464626d6d970adb45c97d9934acaa537b7d7ac0539b53d359", + "0x072fab487feb2804c570d4c230a261bf06688aa22185961b4b6de0d37b7c64a17416b9ae388ad3000c13706c145ec06d18996c83237dbad807e2f054617d1421af", + "0x060a9115f6f4ac004a1f89e636524bd1ca72ee9b0fb8d876a6e737fbe724c8ce3819590ab74fe53efadbd7c3d716ab13abe9760eb4295faa109eb50ad7077366b6", + "0x041a884ed75d5adc0652b3bf5619f8b6b7e2fa032760a16ecc97d22323a8188a1e01010000000000000000000000000000000000000000000000000000000000000000000220f70b925c60c2c7a12b3e2dab5723c6b621d715d3507a65116f8504431cc85cbc", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x53bdca72fa8d2e145a1b3bd11cde5bd75428acd18eac3d6adf4e06e7e637706f": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0910baa0679dfabc98a749e2cf19cf380cf168c5963ed340eb8793275881f1aab91a61ae832a78b0c5b49d6624e781530d6b4a5ae6747aa8024bb5e00238b397e8", + "0x09128488b0bbdf573df71a726be2ff9a53c1c3ebea2d83da9bc818082d6114154e2f22abdf8825ed09c438ab5e357d601c5008c108986a0f79604020d03dd5658e", + "0x09183a3016f0942f02569b44fb780df08b481eefeed6e86f1cd87fa874403057db16e033955a55517d77bfc107247c871dde1fe1444483efa5217ac206cce98c59", + "0x093011e58bbbd2fe67ae18c26c590fed989df5820abd519a1553072f2146d176c1021e3ca53f692195d98a90ce2b5eeb8aae100cc3bb66fae02d1112cb7e7ee96c", + "0x070000000000000000000000000000000000000000000000000000000000000000249f55970d4dec56ed724d7088495d3b39d593d559276cc4b9e181eae7fcacf3", + "0x0913ea27149713e10e2b5e1b74ea28df6a0cf59b5b727889adb19d81959c277b7425d1f2ee81dfac18e91ae4abd122922819d43da56e7bd91c6d66077b77dcde4c", + "0x062d500695d8fdc5aca348d8cbee11f606af572daabaa49643ef836a93a41279121f6147b6afb8caa45cad2613809dfca1b1f4b32d5b4370515204c762ea85d4ea", + "0x0410a5e090fdd038132021f13bfd11de155d9c7114883c2597a52904096531656d0101000000000000000000000000000000000000000000000000000000000000000006012053bdca72fa8d2e145a1b3bd11cde5bd75428acd18eac3d6adf4e06e7e637706f", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x53bdca72fa8d2e145a1b3bd11cde5bd75428acd18eac3d6adf4e06e7e6377070": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x0919e44f4c1854907175b4b2b5a0c96536103adcca1baf40cffa44b0331a8901db2603c9a992dc69a6b684dc301f77cc1c4e9e8a4dd972d15f4cd2ed974c4a79cc", + "0x0925ffe896678956add403385939c3f41f2db8bff412c9cc8d8f0590cef223288f1bbbbc549a61adc7a091da47883f9c34951e785f75cce8226f3ffdd7189d71b4", + "0x091fbcc06aef47c26f9f9e029bedbc26e9bc5f21a3a3a9c3c0dcbbe3f3ebb4eeaa1955eec4ae4b1edc428cfbe3340703b885426bdd0ca953165bfde3772e59ba28", + "0x0911372be103e5e853688a33e63799c6a537a3605ca7c65572976898c661c9ed47187d6301a117179ea4ee3481d18bbb96806a672d58dd75c573e85614aaf20e0c", + "0x0802029d08a1d4eb3172e743908527f05e331958a97ee408f6b8337b4a9de92c690000000000000000000000000000000000000000000000000000000000000000", + "0x0802fdd6b7a311e24ca00e961f109916ebe3ea220ca9b14d4deb051ec20da7ff640000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000000a9bb953ceb7ef8b95077591df94c6609a3f1f91ffc8af633eddef11fa440721", + "0x0628748ed8b13291d62344eec5a8ec4476db3e4f5b0b0cdef8918c1f678fc016561064859534a8a9cb8251a998a70669cb1f6fb2f9d0e8cc463f140d76404ec506", + "0x042b6463a05c8cbece0209d0693421ce5386e1a8c01bd15265f8c8f2bfb3a2a30a0101000000000000000000000000000000000000000000000000000000000000000f42402053bdca72fa8d2e145a1b3bd11cde5bd75428acd18eac3d6adf4e06e7e6377070", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xbb86fbc034f4e382929974bcd8419ed626b0ea647f962d89ba2fb6bd28785ab9": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x0919e44f4c1854907175b4b2b5a0c96536103adcca1baf40cffa44b0331a8901db2603c9a992dc69a6b684dc301f77cc1c4e9e8a4dd972d15f4cd2ed974c4a79cc", + "0x0925ffe896678956add403385939c3f41f2db8bff412c9cc8d8f0590cef223288f1bbbbc549a61adc7a091da47883f9c34951e785f75cce8226f3ffdd7189d71b4", + "0x091fbcc06aef47c26f9f9e029bedbc26e9bc5f21a3a3a9c3c0dcbbe3f3ebb4eeaa1955eec4ae4b1edc428cfbe3340703b885426bdd0ca953165bfde3772e59ba28", + "0x061c6360e4bbbfceb719eb93354e3ca74aa59d2d6483921217d268a70e6956ab911e1cab7b1dfa7d05c5b6d5ab15c15391ca830260cb08e1a1008b3bf3ce24ec85", + "0x04089fc409063b92930d10be4d1dd9ef71b9df3816a432d70290e7c76919dedb5a01010000000000000000000000000000000000000000000000000003bce687f816c68a8a20bb86fbc034f4e382929974bcd8419ed626b0ea647f962d89ba2fb6bd28785ab9", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x5FbDB2315678afecb367f032d93F642f64180aa3": { + "0x8c37336c8eae88ad7bbf871a6a05192bff663bf13ee0773449221a2afccbd95a": [ + "0x08122e403a27233d8c3b320e343dbd71b1df58ca8d85c92242ed0356ff110182490000000000000000000000000000000000000000000000000000000000000000", + "0x092103763eebf072acb5e0f7508ed460aec75644a444a3302e616082c48f4b6ffc1b0aef79fcf757b387b248c30765ab71d767fdf9d559f86bbc0b6c95edd9e69d", + "0x080ceda2c929883a5e7b435c9a28e4b0f0f60618a79b6a50a7783d17b4368756d001b02e504fc703b72972dd67560d3bb1b8006efa0768b5366d57a14d505c9918", + "0x062eaa4f4cc50c082abf30eb82318482b8ae6ea8db7193aa3536d29c43556b76cf18619af16e2a890e7ce203ed768d24f6ed291ab78716c64a952b115357be0a95", + "0x04123a9464ab167aa30076139d8d977b716a85918f12de86764c00ee1a7c603f9a0101000000000000000000000000000000000000000000000000000000000000000000bf208c37336c8eae88ad7bbf871a6a05192bff663bf13ee0773449221a2afccbd95a", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x9c35da83f88043b3115f30d93beacec49ca14b6238430bdff196a249c29baa80": [ + "0x08122e403a27233d8c3b320e343dbd71b1df58ca8d85c92242ed0356ff110182490000000000000000000000000000000000000000000000000000000000000000", + "0x092103763eebf072acb5e0f7508ed460aec75644a444a3302e616082c48f4b6ffc1b0aef79fcf757b387b248c30765ab71d767fdf9d559f86bbc0b6c95edd9e69d", + "0x07209511d30c65f026fba94c83e61e2387d1686913d7c1d3b39da56170c652ff992c73c2ea0cb56572d1b822f551c41e30fdd3f79da0f0cca1ced4a05595345420", + "0x0603a1d5d0a16f05748891905ea410a6d7d26800882328c6456be8b0af42cc6e8f11ee78599f325a27ce51da8fab66cbf9e50051abcd6243cc6b73c95a32c56daa", + "0x0408fce273ee0c1553e3b2eebd59ca7cb8a863be1f26eaefad72094e7d72212a94010100000000000000000000000000000000000000000000000000000de0b6b3a763fff8209c35da83f88043b3115f30d93beacec49ca14b6238430bdff196a249c29baa80", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + } + } + }, + "codes": [ + { + "codeSize": 0, + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "code": "0x" + }, + { + "codeSize": 2796, + "keccakCodeHash": "0x44107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d5", + "hash": "0x18d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f84", + "code": "0x60806040523661001357610011610017565b005b6100115b61001f6102a0565b73ffffffffffffffffffffffffffffffffffffffff1633036102965760607fffffffff000000000000000000000000000000000000000000000000000000005f35167fc9a6301a000000000000000000000000000000000000000000000000000000008101610097576100906102df565b915061028e565b7fb0e10d7a000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216016100e857610090610332565b7f70d7c690000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160161013957610090610376565b7f07ae5bc0000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160161018a576100906103a6565b7fa39f25e5000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216016101db576100906103f2565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b815160208301f35b61029e610405565b565b5f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b60606102e9610415565b5f6102f736600481846108bc565b810190610304919061090b565b905061031f8160405180602001604052805f8152505f61041f565b505060408051602081019091525f815290565b60605f8061034336600481846108bc565b8101906103509190610951565b915091506103608282600161041f565b60405180602001604052805f8152509250505090565b6060610380610415565b5f61038e36600481846108bc565b81019061039b919061090b565b905061031f8161044a565b60606103b0610415565b5f6103b96102a0565b6040805173ffffffffffffffffffffffffffffffffffffffff831660208201529192500160405160208183030381529060405291505090565b60606103fc610415565b5f6103b96104ae565b61029e6104106104ae565b6104bc565b341561029e575f80fd5b610428836104da565b5f825111806104345750805b15610445576104438383610526565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6104736102a0565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a16104ab81610552565b50565b5f6104b761065e565b905090565b365f80375f80365f845af43d5f803e8080156104d6573d5ff35b3d5ffd5b6104e381610685565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b606061054b8383604051806060016040528060278152602001610ab960279139610750565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81166105f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610285565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6102c3565b73ffffffffffffffffffffffffffffffffffffffff81163b610729576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610285565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610618565b60605f808573ffffffffffffffffffffffffffffffffffffffff16856040516107799190610a4d565b5f60405180830381855af49150503d805f81146107b1576040519150601f19603f3d011682016040523d82523d5f602084013e6107b6565b606091505b50915091506107c7868383876107d1565b9695505050505050565b606083156108665782515f0361085f5773ffffffffffffffffffffffffffffffffffffffff85163b61085f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610285565b5081610870565b6108708383610878565b949350505050565b8151156108885781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102859190610a68565b5f80858511156108ca575f80fd5b838611156108d6575f80fd5b5050820193919092039150565b803573ffffffffffffffffffffffffffffffffffffffff81168114610906575f80fd5b919050565b5f6020828403121561091b575f80fd5b61054b826108e3565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f8060408385031215610962575f80fd5b61096b836108e3565b9150602083013567ffffffffffffffff80821115610987575f80fd5b818501915085601f83011261099a575f80fd5b8135818111156109ac576109ac610924565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156109f2576109f2610924565b81604052828152886020848701011115610a0a575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f5b83811015610a45578181015183820152602001610a2d565b50505f910152565b5f8251610a5e818460208701610a2b565b9190910192915050565b602081525f8251806020840152610a86816040850160208701610a2b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a164736f6c6343000818000a" + }, + { + "codeSize": 0, + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "code": "0x" + }, + { + "codeSize": 3465, + "keccakCodeHash": "0x3930291465b96673fe5a4a4889b82e5c88006821f7c1c282ccc6b94d18d50120", + "hash": "0x08234974b1436c0a3925a1d7bdcc36d591168d966d811bb01fcd50e1ada92680", + "code": "0x608060405234801561000f575f80fd5b50600436106100e5575f3560e01c806370a08231116100885780639dc29fac116100635780639dc29fac146101f0578063a9059cbb14610203578063d505accf14610216578063dd62ed3e14610229575f80fd5b806370a08231146101aa5780637ecebe00146101c957806395d89b41146101e8575f80fd5b806323b872dd116100c357806323b872dd14610141578063313ce567146101545780633644e5151461018d57806340c10f1914610195575f80fd5b806306fdde03146100e9578063095ea7b31461010757806318160ddd1461012a575b5f80fd5b6100f1610253565b6040516100fe9190610a52565b60405180910390f35b61011a610115366004610ae4565b6102de565b60405190151581526020016100fe565b61013360025481565b6040519081526020016100fe565b61011a61014f366004610b0c565b610357565b61017b7f000000000000000000000000000000000000000000000000000000000000000681565b60405160ff90911681526020016100fe565b610133610497565b6101a86101a3366004610ae4565b6104f1565b005b6101336101b8366004610b45565b60036020525f908152604090205481565b6101336101d7366004610b45565b60056020525f908152604090205481565b6100f16104ff565b6101a86101fe366004610ae4565b61050c565b61011a610211366004610ae4565b610516565b6101a8610224366004610b65565b610599565b610133610237366004610bd2565b600460209081525f928352604080842090915290825290205481565b5f805461025f90610c03565b80601f016020809104026020016040519081016040528092919081815260200182805461028b90610c03565b80156102d65780601f106102ad576101008083540402835291602001916102d6565b820191905f5260205f20905b8154815290600101906020018083116102b957829003601f168201915b505050505081565b335f81815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103459086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103e9576103b88382610c81565b73ffffffffffffffffffffffffffffffffffffffff86165f9081526004602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff85165f908152600360205260408120805485929061041d908490610c81565b909155505073ffffffffffffffffffffffffffffffffffffffff8085165f81815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104849087815260200190565b60405180910390a3506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000cf5546146104cc576104c76108b7565b905090565b507f3cb26d6162ec196b8b041e454d58ccdd842af821ab2b1643f4be8bb4f1f1a42790565b6104fb828261094f565b5050565b6001805461025f90610c03565b6104fb82826109c6565b335f90815260036020526040812080548391908390610536908490610c81565b909155505073ffffffffffffffffffffffffffffffffffffffff83165f81815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103459086815260200190565b42841015610608576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b5f6001610613610497565b73ffffffffffffffffffffffffffffffffffffffff8a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610761573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906107dc57508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016105ff565b73ffffffffffffffffffffffffffffffffffffffff9081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516108e79190610c94565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060025f8282546109609190610d69565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260036020526040812080548392906109fa908490610c81565b90915550506002805482900390556040518181525f9073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016109ba565b5f602080835283518060208501525f5b81811015610a7e57858101830151858201604001528201610a62565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610adf575f80fd5b919050565b5f8060408385031215610af5575f80fd5b610afe83610abc565b946020939093013593505050565b5f805f60608486031215610b1e575f80fd5b610b2784610abc565b9250610b3560208501610abc565b9150604084013590509250925092565b5f60208284031215610b55575f80fd5b610b5e82610abc565b9392505050565b5f805f805f805f60e0888a031215610b7b575f80fd5b610b8488610abc565b9650610b9260208901610abc565b95506040880135945060608801359350608088013560ff81168114610bb5575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215610be3575f80fd5b610bec83610abc565b9150610bfa60208401610abc565b90509250929050565b600181811c90821680610c1757607f821691505b602082108103610c4e577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181038181111561035157610351610c54565b5f8083545f60018260011c91506001831680610cb157607f831692505b60208084108203610ce9577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b818015610cfd5760018114610d3057610d5b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0086168952841515850289019650610d5b565b5f8a8152602090205f5b86811015610d535781548b820152908501908301610d3a565b505084890196505b509498975050505050505050565b8082018082111561035157610351610c5456fea164736f6c6343000818000a" + } + ], + "txStorageTraces": [ + { + "rootBefore": "0x2251e5e3b690ff9f66bf1347e037ecd15f9e8fb99bd06f129f666ffdf8c4df76", + "rootAfter": "0x1b46ab6195208d1490fc1385b25bd13f7ca1e27cf9730c5e91df9d3f2663d4e8", + "proofs": { + "0x0742D35CC6634c0532925A3b844bc9E7595f0Beb": [ + "0x092bc7bfa35502df6c119d1a4d72180d21c4a7a96d281b81abcb30abd901120685166f06d8146b4cde5cc3609a5571bdf635c6ef105f7dbf101874acd9d79643d5", + "0x09286f7a9efa06895b7f63ef5d58ed8f8773eb3c91d67a68f34bcf96c32b2262211d8d30ebb8c0c0130854bff123cc77f0af71a766258ded75b1fe000738af773a", + "0x090c71e16607326135b9bf36e84d1521e456095303912ec486b1b2cafb353b99bc0f4be945f00183f6833f932e2021f6ff5698622457524a20ce21a3921aabce3a", + "0x090efe4540500f6c9bde2b747973c4dc8f1cfff8678a221260db70a056f9ac1a5714f4b04aad11a22d617370765cf6f9565a981470066b9992cf1100ba8ac98b5c", + "0x0903c58d513b8ac2d3babbf2f6202c04fe89af037e563477a0f2eabff214b06a8400d247dec7c5069fde342365b2f0a6d229665abb83917d06a43e60c740587af2", + "0x091410c403ec5d9752c2c72974f910345abf6a5afdbe2c187c10f9c5ff3b85f1a808f0e98ac5fe4f888d695f71cbb4331160d1f2da76bfe341d98894fd0d727a04", + "0x092b15971b522af8964f68be0ee71a6a27c9808fe6f21829536adeb7a44cb70c1a14d8ce13a4fabbf149d304360801b66d04e6afd03f7e872abd0e20c52f9c8b69", + "0x0911411e755306f50353deebe39a344092e6c10168609a12c7e84a1e8c84858c100bd7cd6e88dbf6870ccac3395d6257b103f59348d7bd5a2a6a533986d5c8b27c", + "0x0907b7a5079fb418510fd9221c5cac6f1c229f5e9f09f3728c7b9313700312876512aa1b74433f0b16ad1ed111c3fc12ba6f037d23859b2a6534bce8c357b43211", + "0x0700000000000000000000000000000000000000000000000000000000000000001c0f4bff64cbe2e6226f28fa0264db680c74239540f699e2dfbd043d9d96ccdd", + "0x0700000000000000000000000000000000000000000000000000000000000000002fdc0539559fb6404776042583f6df0e75ce1578a8974f60c2dd2eee2803493f", + "0x082ba663c950df1c13ddb2e231a276d589e5d068dbfe09c32dd5f2b5cc772178691cece90884518dd5016ccd2b79fbe00c1c2a3b67037a41508f7223b7b3d44ee1", + "0x0707102728cc2d7cee17cda77b92e494c404c24bcd11db9d102a4b6ef492ae4d53042db0541967a6441a3f826f5fcc7f091a0b07bc88d21d227ccd644d72b44a36", + "0x041a41a36901ec07e376de0d0d5409328f7c9ae666006cc427b1f8ad646ce147c105080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098a7d9b8314c00040000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864200742d35cc6634c0532925a3b844bc9e7595f0beb000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5FbDB2315678afecb367f032d93F642f64180aa3": [ + "0x092bc7bfa35502df6c119d1a4d72180d21c4a7a96d281b81abcb30abd901120685166f06d8146b4cde5cc3609a5571bdf635c6ef105f7dbf101874acd9d79643d5", + "0x091e469f1232f7069f7e3c946000e7bca1e51d47e0381cfb80d2917220d9421cfb10d4bdcd77d36c2a476be77c41376b8c2ee6a395d2429db01aad6d9035f4133d", + "0x091b86b3c268cc1d100cbd7b9710025ac45adc4e54a645838f5120ce0049cf78ad0a7e335771fa2c19e0bd11dd9604968aa7a81ed4ecf74bda066058c70cbaebf2", + "0x09059b71e5e7400f0f399a620633437fd2cf9596c932769a0a9d441f0542c334cd06921c2f3b60bbd12dae3fc369a599b847b18e90e7cbb03a76e5a43f895671df", + "0x091037dd57995a394370ce77d18031e7fdd716725f6cd90a047d8c84c88da15d2c23bf13d303d5bdc56054acac8d0bac45eefe243f465c4256e86fe2eae7d52ac5", + "0x0915afa4f9f2fc1504da0fd705382cc4d5d67c1f1827173cb86d0aaf8370a087a12d577f8c4c0038e39cc3f2c1fbe61545c1e7646df9bdacb8e3a696e187d85395", + "0x090029e3d16c5cb218d7c1e33c52956e04aacb44097c750db1afc8379e9c7cd7e31e5c4456fefe638088cdfacd0458b26dc1b29615585afaa2c8c024c2aa520259", + "0x0700000000000000000000000000000000000000000000000000000000000000000ad2202bc030a92456c8ef95d7da0207feb2a1c5228228741ea6c69c9aa74feb", + "0x091e6693a57c457d669d77b4881946cfe5984476d992fa2bb87761eb034799521220a744f0245c29a8d376f6e531eca3da22480a09ef622d14fbe8ce0ae3349e81", + "0x060eebafdd2c4ba4d19eeb5b468fb911d38f3575ed7a9804e4c33fde82a93ef3c2204176cc02b91cb72c3da7726fdad8306b848cc9f829fc92b7d66fa7d5f2ca56", + "0x040fd4be443a84a4d1d346fbeb8a1a0f574f53161324ff3ff03f6a820b5f3376f205080000000000000000000000000000000000000000000000000d89000000000000000100000000000000000000000000000000000000000000000000000000000000001bd4f082fe61b3e74edaf90873f2c2e2019e7f2c08460b2ee887a19509f9f8be3930291465b96673fe5a4a4889b82e5c88006821f7c1c282ccc6b94d18d5012008234974b1436c0a3925a1d7bdcc36d591168d966d811bb01fcd50e1ada92680205fbdb2315678afecb367f032d93f642f64180aa3000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8": [ + "0x092bc7bfa35502df6c119d1a4d72180d21c4a7a96d281b81abcb30abd901120685166f06d8146b4cde5cc3609a5571bdf635c6ef105f7dbf101874acd9d79643d5", + "0x091e469f1232f7069f7e3c946000e7bca1e51d47e0381cfb80d2917220d9421cfb10d4bdcd77d36c2a476be77c41376b8c2ee6a395d2429db01aad6d9035f4133d", + "0x0918ec3f04aa26dfe2fdb34122691277175ffeb34b57b96de91a11020d796b5b3703553048aa00bf7f05c1bca37b341775f3f2c0aeeb6ae245dbe5a00df1c3c9ce", + "0x0908ba2ba7af260c4f991d6b2e05a1335290d382ce59a6fcd5aa2a4b137021fc2824931ced24212206fa48a12d2f13412c1308ab073b7b877a7ccde133989601e9", + "0x09036c4fee62bb83d523b25829a9143501aea11f0d248381af88746cddffffcb1528b3de1cd6e7bbce58cb5b1fe617111eb5e12535887ee25646b9a1290df18e2d", + "0x092bacc030e7201c95030a1aea2839ee9bfee02262d8e0675495fea4338bdfa5062642ee27f235e654c3a23b793e801a546316ad07406618e4ee01302b63566cbc", + "0x0900f088c016ba77fd9f92ce70ea2a1d105cdfc6c6a5d9186a2c187134d4c5a4ee2134a3e42983e0b7b592873d4f96f0d230bb520a42575a4b22a04a3fc50f1a23", + "0x080f403be4a306e51eab11f0e46ec27886df0b919ee205bd3fa6fb3b0b2b7e6e670000000000000000000000000000000000000000000000000000000000000000", + "0x0822d381e78bb6e50e7ba420e48dd800c957d5cfb3c12f7bb8b886c2cf7fac5e3b09399ba9b0e1c80d7f129d5545b2bb9932c4fdaf7b0e8e0c5fbb0cfe46f78783", + "0x0407edffb2f516756416f9cd6da120841b708d8ba8e0ae76133c0022b273252174050800000000000000000000000000000000000000000000000000000000000000000013001fffffffffffffffffffffffffffffffffffffffffffff59776f638fc0477f0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b648642070997970c51812dc3a010c7d01b50e0d17dc79c8000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xFABB0ac9d68B0B445fB7357272Ff202C5651694a": [ + "0x092bc7bfa35502df6c119d1a4d72180d21c4a7a96d281b81abcb30abd901120685166f06d8146b4cde5cc3609a5571bdf635c6ef105f7dbf101874acd9d79643d5", + "0x09286f7a9efa06895b7f63ef5d58ed8f8773eb3c91d67a68f34bcf96c32b2262211d8d30ebb8c0c0130854bff123cc77f0af71a766258ded75b1fe000738af773a", + "0x090c71e16607326135b9bf36e84d1521e456095303912ec486b1b2cafb353b99bc0f4be945f00183f6833f932e2021f6ff5698622457524a20ce21a3921aabce3a", + "0x092ee6a5cff1508574915e5c5fa61134dcb9946427ead4b12c3273e9b97a0b77a6001854e8380fbd58620925780f3ed2d0abeea5a13b4e0a4e0a51f59b9b5ec3c0", + "0x09174cfdf2f1e0c6fe4cab85c20ea084898c0e359ada326bd1d38abce77a6ea2492137ebae927de9055c704eaf20176efd3688db2f24e0b7e0a197ed67abc806f0", + "0x0921e218fe94e8e55e46d83b3c61bc6d8f60c2262bf59669299b70dcfe52d8b7442cd91c7a4c36943da038bcb35dde8dd004b83e190a17e35d1bda9011ae062f99", + "0x092173e847844f75d655ac0690b26ee3bf3e65a3c0062f9b9be566e74cd41927df12b7fd5527c406a10b999c59c3c6a1f781797558a36b7fbdadd2d2cf435c1e25", + "0x07000000000000000000000000000000000000000000000000000000000000000002c01b849e25a91dd222e8d006ae918579a6bff12484cc758a8c43c8d6ce0017", + "0x080931f89fedde2fe071003121dcbbc15662cc71fc96127a81b17ca72f1dc81d620000000000000000000000000000000000000000000000000000000000000000", + "0x070d53acb57a8c223e5af81f5dbf1d80922525be5a8d4e45f5f09ff8580a16e210159ad10b4c89ff16157cc364c81f6039eeea9a8eb87e4b4700249219e71cc3ef", + "0x0403d2c88868dc8b5f7994604147a8246c48cc905235de980c42c3e78f351f00c505080000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000f76b616411d0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420fabb0ac9d68b0b445fb7357272ff202c5651694a000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "storageProofs": { + "0x5300000000000000000000000000000000000021": { + "0x53bdca72fa8d2e145a1b3bd11cde5bd75428acd18eac3d6adf4e06e7e637706d": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x0919e44f4c1854907175b4b2b5a0c96536103adcca1baf40cffa44b0331a8901db2603c9a992dc69a6b684dc301f77cc1c4e9e8a4dd972d15f4cd2ed974c4a79cc", + "0x0925ffe896678956add403385939c3f41f2db8bff412c9cc8d8f0590cef223288f1bbbbc549a61adc7a091da47883f9c34951e785f75cce8226f3ffdd7189d71b4", + "0x09282aa159b4c043af9c744e12ae4c4836a6fad029715cd87972d9b86e31466cf505f95afda0666a080bb144051a34ee842f918d97623213ca6c0b3537d6aab3d5", + "0x0923dcac699b2bc22dc2f7fa81bf06b44a951d3142c20fc0663b738e658d07ad6204469cd5cb700f31d2934e01feb4321e5be7476821bf1dde82369b6d764ec9dd", + "0x0718516cefef69870b53417b7c003d6709cc8a2d2ac60c0a40ddde0a202f50c2fa09d788b871509032fe6ae9e2a3afd360f0a64e334f6b7292f4ca67e768080a7d", + "0x082d377b1e7595023bc12cb372660478fb6dbddd7e9c8d2825d16fe6173ce40f1402b0a149ad95701bfaf35efccee704cf4d7fb96bf553ec35c226dea457a8314e", + "0x071e237cabf7ea38460ebad07de0173f7d8ed59d61314f24480d0afef0f81b258a142fb055691f7e50c943bd4d204714a4481cc47ffd6c8866c20398300c422a74", + "0x061fce356ebc63530766d5ce9779ab52b1992afc5493ded9d69cf796d099ecc606165bb2d134896148cdda711cf71517e576c920edd7f91f1c17a9b6b5fcb103ac", + "0x04032a62f2b11acbea541fd541ef6c2bd3e066df0a54f318716e6a6cf8bf627172010100000000000000000000000000005fbdb2315678afecb367f032d93f642f64180aa32053bdca72fa8d2e145a1b3bd11cde5bd75428acd18eac3d6adf4e06e7e637706d", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x53bdca72fa8d2e145a1b3bd11cde5bd75428acd18eac3d6adf4e06e7e637706e": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x0919e44f4c1854907175b4b2b5a0c96536103adcca1baf40cffa44b0331a8901db2603c9a992dc69a6b684dc301f77cc1c4e9e8a4dd972d15f4cd2ed974c4a79cc", + "0x090dec3fded5debc4bba8aa761a657e8f3bbf01043cb27c6fe8889998a0887b24718683552e0d0dfb464626d6d970adb45c97d9934acaa537b7d7ac0539b53d359", + "0x072fab487feb2804c570d4c230a261bf06688aa22185961b4b6de0d37b7c64a17416b9ae388ad3000c13706c145ec06d18996c83237dbad807e2f054617d1421af", + "0x060a9115f6f4ac004a1f89e636524bd1ca72ee9b0fb8d876a6e737fbe724c8ce3819590ab74fe53efadbd7c3d716ab13abe9760eb4295faa109eb50ad7077366b6", + "0x041a884ed75d5adc0652b3bf5619f8b6b7e2fa032760a16ecc97d22323a8188a1e01010000000000000000000000000000000000000000000000000000000000000000000220f70b925c60c2c7a12b3e2dab5723c6b621d715d3507a65116f8504431cc85cbc", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x53bdca72fa8d2e145a1b3bd11cde5bd75428acd18eac3d6adf4e06e7e637706f": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0910baa0679dfabc98a749e2cf19cf380cf168c5963ed340eb8793275881f1aab91a61ae832a78b0c5b49d6624e781530d6b4a5ae6747aa8024bb5e00238b397e8", + "0x09128488b0bbdf573df71a726be2ff9a53c1c3ebea2d83da9bc818082d6114154e2f22abdf8825ed09c438ab5e357d601c5008c108986a0f79604020d03dd5658e", + "0x09183a3016f0942f02569b44fb780df08b481eefeed6e86f1cd87fa874403057db16e033955a55517d77bfc107247c871dde1fe1444483efa5217ac206cce98c59", + "0x093011e58bbbd2fe67ae18c26c590fed989df5820abd519a1553072f2146d176c1021e3ca53f692195d98a90ce2b5eeb8aae100cc3bb66fae02d1112cb7e7ee96c", + "0x070000000000000000000000000000000000000000000000000000000000000000249f55970d4dec56ed724d7088495d3b39d593d559276cc4b9e181eae7fcacf3", + "0x0913ea27149713e10e2b5e1b74ea28df6a0cf59b5b727889adb19d81959c277b7425d1f2ee81dfac18e91ae4abd122922819d43da56e7bd91c6d66077b77dcde4c", + "0x062d500695d8fdc5aca348d8cbee11f606af572daabaa49643ef836a93a41279121f6147b6afb8caa45cad2613809dfca1b1f4b32d5b4370515204c762ea85d4ea", + "0x0410a5e090fdd038132021f13bfd11de155d9c7114883c2597a52904096531656d0101000000000000000000000000000000000000000000000000000000000000000006012053bdca72fa8d2e145a1b3bd11cde5bd75428acd18eac3d6adf4e06e7e637706f", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x53bdca72fa8d2e145a1b3bd11cde5bd75428acd18eac3d6adf4e06e7e6377070": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x0919e44f4c1854907175b4b2b5a0c96536103adcca1baf40cffa44b0331a8901db2603c9a992dc69a6b684dc301f77cc1c4e9e8a4dd972d15f4cd2ed974c4a79cc", + "0x0925ffe896678956add403385939c3f41f2db8bff412c9cc8d8f0590cef223288f1bbbbc549a61adc7a091da47883f9c34951e785f75cce8226f3ffdd7189d71b4", + "0x091fbcc06aef47c26f9f9e029bedbc26e9bc5f21a3a3a9c3c0dcbbe3f3ebb4eeaa1955eec4ae4b1edc428cfbe3340703b885426bdd0ca953165bfde3772e59ba28", + "0x0911372be103e5e853688a33e63799c6a537a3605ca7c65572976898c661c9ed47187d6301a117179ea4ee3481d18bbb96806a672d58dd75c573e85614aaf20e0c", + "0x0802029d08a1d4eb3172e743908527f05e331958a97ee408f6b8337b4a9de92c690000000000000000000000000000000000000000000000000000000000000000", + "0x0802fdd6b7a311e24ca00e961f109916ebe3ea220ca9b14d4deb051ec20da7ff640000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000000a9bb953ceb7ef8b95077591df94c6609a3f1f91ffc8af633eddef11fa440721", + "0x0628748ed8b13291d62344eec5a8ec4476db3e4f5b0b0cdef8918c1f678fc016561064859534a8a9cb8251a998a70669cb1f6fb2f9d0e8cc463f140d76404ec506", + "0x042b6463a05c8cbece0209d0693421ce5386e1a8c01bd15265f8c8f2bfb3a2a30a0101000000000000000000000000000000000000000000000000000000000000000f42402053bdca72fa8d2e145a1b3bd11cde5bd75428acd18eac3d6adf4e06e7e6377070", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xbb86fbc034f4e382929974bcd8419ed626b0ea647f962d89ba2fb6bd28785ab9": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x0919e44f4c1854907175b4b2b5a0c96536103adcca1baf40cffa44b0331a8901db2603c9a992dc69a6b684dc301f77cc1c4e9e8a4dd972d15f4cd2ed974c4a79cc", + "0x0925ffe896678956add403385939c3f41f2db8bff412c9cc8d8f0590cef223288f1bbbbc549a61adc7a091da47883f9c34951e785f75cce8226f3ffdd7189d71b4", + "0x091fbcc06aef47c26f9f9e029bedbc26e9bc5f21a3a3a9c3c0dcbbe3f3ebb4eeaa1955eec4ae4b1edc428cfbe3340703b885426bdd0ca953165bfde3772e59ba28", + "0x061c6360e4bbbfceb719eb93354e3ca74aa59d2d6483921217d268a70e6956ab911e1cab7b1dfa7d05c5b6d5ab15c15391ca830260cb08e1a1008b3bf3ce24ec85", + "0x04089fc409063b92930d10be4d1dd9ef71b9df3816a432d70290e7c76919dedb5a01010000000000000000000000000000000000000000000000000003bce687f816c68a8a20bb86fbc034f4e382929974bcd8419ed626b0ea647f962d89ba2fb6bd28785ab9", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x5FbDB2315678afecb367f032d93F642f64180aa3": { + "0x8c37336c8eae88ad7bbf871a6a05192bff663bf13ee0773449221a2afccbd95a": [ + "0x08122e403a27233d8c3b320e343dbd71b1df58ca8d85c92242ed0356ff110182490000000000000000000000000000000000000000000000000000000000000000", + "0x092103763eebf072acb5e0f7508ed460aec75644a444a3302e616082c48f4b6ffc1b0aef79fcf757b387b248c30765ab71d767fdf9d559f86bbc0b6c95edd9e69d", + "0x080ceda2c929883a5e7b435c9a28e4b0f0f60618a79b6a50a7783d17b4368756d001b02e504fc703b72972dd67560d3bb1b8006efa0768b5366d57a14d505c9918", + "0x062eaa4f4cc50c082abf30eb82318482b8ae6ea8db7193aa3536d29c43556b76cf18619af16e2a890e7ce203ed768d24f6ed291ab78716c64a952b115357be0a95", + "0x04123a9464ab167aa30076139d8d977b716a85918f12de86764c00ee1a7c603f9a0101000000000000000000000000000000000000000000000000000000000000000000bf208c37336c8eae88ad7bbf871a6a05192bff663bf13ee0773449221a2afccbd95a", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x9c35da83f88043b3115f30d93beacec49ca14b6238430bdff196a249c29baa80": [ + "0x08122e403a27233d8c3b320e343dbd71b1df58ca8d85c92242ed0356ff110182490000000000000000000000000000000000000000000000000000000000000000", + "0x092103763eebf072acb5e0f7508ed460aec75644a444a3302e616082c48f4b6ffc1b0aef79fcf757b387b248c30765ab71d767fdf9d559f86bbc0b6c95edd9e69d", + "0x07209511d30c65f026fba94c83e61e2387d1686913d7c1d3b39da56170c652ff992c73c2ea0cb56572d1b822f551c41e30fdd3f79da0f0cca1ced4a05595345420", + "0x0603a1d5d0a16f05748891905ea410a6d7d26800882328c6456be8b0af42cc6e8f11ee78599f325a27ce51da8fab66cbf9e50051abcd6243cc6b73c95a32c56daa", + "0x0408fce273ee0c1553e3b2eebd59ca7cb8a863be1f26eaefad72094e7d72212a94010100000000000000000000000000000000000000000000000000000de0b6b3a763fff8209c35da83f88043b3115f30d93beacec49ca14b6238430bdff196a249c29baa80", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + } + } + } + ], + "executionResults": [ + { + "l1DataFee": "0x0", + "feeTokenID": 1, + "feeRate": "0x3bce687f816c68a8a", + "tokenScale": "0xf4240", + "feeLimit": "0x0", + "gas": 21000, + "failed": false, + "returnValue": "", + "from": { + "address": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", + "nonce": 19, + "balance": "0x1fffffffffffffffffffffffffffffffffffffffffffff59776f638fc0477f", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + "to": { + "address": "0x0742d35cc6634c0532925a3b844bc9e7595f0beb", + "nonce": 0, + "balance": "0x98a7d9b8314c0004", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + "accountAfter": [ + { + "address": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", + "nonce": 20, + "balance": "0x1fffffffffffffffffffffffffffffffffffffffffffff59776f638fc0477e", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + { + "address": "0x0742d35cc6634c0532925a3b844bc9e7595f0beb", + "nonce": 0, + "balance": "0x98a7d9b8314c0005", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + { + "address": "0xfabb0ac9d68b0b445fb7357272ff202c5651694a", + "nonce": 0, + "balance": "0x200000000000000000000000000000000000000000000000000f76b616411d", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + } + ], + "structLogs": [], + "callTrace": { + "from": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", + "gas": "0x5208", + "gasUsed": "0x5208", + "to": "0x0742d35cc6634c0532925a3b844bc9e7595f0beb", + "input": "0x", + "value": "0x1", + "type": "CALL" + } + } + ], + "withdraw_trie_root": "0x27ae5ba08d7291c96c8cbddcc148bf48a6d68c7974b94356f53754ef6171d757", + "sequencer_set_verify_hash": "0x22efe8537c043bf1a471893cba84c8cd29a0d3ea62ad7c4ada032136254ad6c9", + "startL1QueueIndex": 0 + } + ] +] \ No newline at end of file diff --git a/prover/testdata/altfeetx/trace_create.json b/prover/testdata/altfeetx/trace_create.json new file mode 100644 index 000000000..7b723f1f9 --- /dev/null +++ b/prover/testdata/altfeetx/trace_create.json @@ -0,0 +1,698 @@ +[ + [ + { + "chainID": 53077, + "version": "2.0.8-mainnet-a99f2d52", + "coinbase": { + "address": "0xfabb0ac9d68b0b445fb7357272ff202c5651694a", + "nonce": 0, + "balance": "0x200000000000000000000000000000000000000000000000000f76b616411d", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + "header": { + "parentHash": "0x9b78e6d407dc9f66884547b058a6048745aa61adf5eed84b0a8f610534723592", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "miner": "0x0000000000000000000000000000000000000000", + "stateRoot": "0x1650799b9402a97649f2f6a7688f5877fb0da572f638f2966d1b43ef40a94784", + "transactionsRoot": "0x2f188cc265c6ea115ca3b294911b15e665999dca1ad3c433f6df8a85492025f5", + "receiptsRoot": "0x041ebe5efeae8f7feb69f013effaae8a678bb5f04c31da7f0f97f041b26142a3", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "difficulty": "0x0", + "number": "0x8587", + "gasLimit": "0x1c9c380", + "gasUsed": "0xe289", + "timestamp": "0x6926a097", + "extraData": "0x", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x0000000000000000", + "nextL1MsgIndex": "0x0", + "batchHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "baseFeePerGas": "0xf4240", + "withdrawalsRoot": null, + "blobGasUsed": null, + "excessBlobGas": null, + "parentBeaconBlockRoot": null, + "requestsHash": null, + "hash": "0x0ba1ea77ffe9b795c39a182eb6b7583518f2e28fbafc2a84856b2e4e78bce7d0" + }, + "transactions": [ + { + "type": 127, + "nonce": 34, + "txHash": "0x69f74ee9bb4cc4316be530b4b7c0bc6cb8bcfea062d9ad920cf8221ecc356f98", + "gas": 10000000, + "gasPrice": "0x3d0900", + "gasTipCap": "0x1e8480", + "gasFeeCap": "0x3d0900", + "feeTokenID": 4, + "feeLimit": "0x9184e72a000", + "from": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", + "to": null, + "chainId": "0xcf55", + "value": "0x0", + "data": "0x6080604052348015600e575f80fd5b50601580601a5f395ff3fe60806040525f80fdfea164736f6c6343000818000a", + "isCreate": true, + "accessList": [], + "v": "0x1", + "r": "0x82a83c63cf1e7a45d76c18888eef3aeb851b085f7d77bad4f5da188f0b535b22", + "s": "0x5dd650c721fd258db30b98c33aaa9679a774ce940276eb1dc7042703b1cfc2d5" + } + ], + "storageTrace": { + "rootBefore": "0x25da38de640f0d10689d4ee046a22eac930f10e47303e00b28490bb420ec0d8a", + "rootAfter": "0x1650799b9402a97649f2f6a7688f5877fb0da572f638f2966d1b43ef40a94784", + "proofs": { + "0x5300000000000000000000000000000000000001": [ + "0x09216a6bbacd13a635ed028c3456f0127403cb3a1875a02fcdc9f84bec7365f9f414bce13a0efa58946ea2bd4b706d2c2461c213cb1fbcc9749729b92a67e62bbe", + "0x092e58222e33bd8583ad4f8bcd9d3ebeecc73025ea8e016016faf0f8fa78f417251cb5cc6a65c39e4dc77fb5ca4a373776e04efd978f95e05b65cb884ffc1ed65e", + "0x092dc8bcc52b5bf24ee1ae627059ebfde2c83d3c3389610f08050f11e9f6a437721b1fd72b675e8788487a58b984110695e54d88d84398c6e91e6dd18e3cd4fcef", + "0x090148e32ea3877d9a2f510bf3ebeb1c9c3d90d79033bf6a2a912db89122983e1006921c2f3b60bbd12dae3fc369a599b847b18e90e7cbb03a76e5a43f895671df", + "0x091037dd57995a394370ce77d18031e7fdd716725f6cd90a047d8c84c88da15d2c05439eeedb12605248ea72151df5e0b74353566dadc219214393e36290243f63", + "0x090c311950521cda0cdca65f368c0fca2eae6b063232fb84eac9ed027e9834aac8183d898dec71e85c4ba675301636453030beea2a744967a50159574a47b0c9f6", + "0x091cde134960925ee62cea9c340d6241c548fa0978ceca2965c87acccaf8b2805322d288ea2a9d771a19771658abf5a64fd503f4ed277aa8d6f779137a88ea1c8d", + "0x091dba2418c5fdd917fcdeff144d6017c58fac6c5ab448ef2a790ab85e36f9099a20a8a95c49033e899476e2d9c2c98bf1ec0d3423c4d3f31ddea9af65a3a27945", + "0x09220b163279be211a426832f5ff47e0ecadb5bd5eaaf0d62189998fde4e14e629126d21b3294439db0a7819880feb71e44daa89510b4e7415bad226dafdba0c1d", + "0x08150feb81fe1639286c75adb93e5467d36ad52d9ff00e0c706bc5345f6dcd49500000000000000000000000000000000000000000000000000000000000000000", + "0x081cb430cbc5dd11f62a713fb3656184085386104dc53fc135fb3c56dba49670500000000000000000000000000000000000000000000000000000000000000000", + "0x060c320ff8f6c3907ae6df62a7fe70e2be093390bd246197d5f56b6bce56f513f812fac8f51e3812914c097147217411381b9b2dad76963ef63c261885d3a49223", + "0x0427cfcbd2fe87474008e199ef5bff09273803bbf38032c75a36a7726b3c88f8a205080000000000000000000000000000000000000000000000000aec000000000000000000000000000000000000000000000000000000000000000000000000000000002198e2c16011cd18ef5be82557ea4552a16cc88ed8026d68fc38a18776550fa944107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f8400", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x530000000000000000000000000000000000000f": [ + "0x09216a6bbacd13a635ed028c3456f0127403cb3a1875a02fcdc9f84bec7365f9f414bce13a0efa58946ea2bd4b706d2c2461c213cb1fbcc9749729b92a67e62bbe", + "0x092e58222e33bd8583ad4f8bcd9d3ebeecc73025ea8e016016faf0f8fa78f417251cb5cc6a65c39e4dc77fb5ca4a373776e04efd978f95e05b65cb884ffc1ed65e", + "0x0918ec3f04aa26dfe2fdb34122691277175ffeb34b57b96de91a11020d796b5b372a7042009d01ea9130232e3a9addb9b4a041d662dfc46dc99c83ada048dccca5", + "0x092095e03a6c163738018ddb4e1cdc171ed8306b711a78a59e07798e60d974a8f52e51ae1fc969dfd817613e2e6ee8062cd343612928fc1f2a8be5a4053032a3e0", + "0x090430edc094dcb51bb128e4db1e27812218fcb3b88806da90445fe07b5ca18e3006767c9fc9e8eb4a72272bf69aef6ef5cf6ab77620acf76754cdff87c31dfa41", + "0x090d2955877b59dd23203eda776f580ddea39d387b90e4178cc7fb41f83080ab1c1558ebda9c7a671a601af519b323ca394a262519dacf80a90f66dc0ce90e6572", + "0x09101b44cf1f33794d2a3078cb1acdfc64b79980839d80127d34998e67a32c6aa42a16300f95ebb8c46e4e6ede02b7fa4944ecc1315bc8b7a2de274188b5f6f6d3", + "0x0923bfab6f7b9cc20bae8ca8989ad45df9625cf0c14ee54257ffd31b2593b8385f219d7fa978c4389f2ee5a1be328f17e3df180f18177925171afd5a1ae5493b93", + "0x06179596d8aa933023605d9c3eaad2b08f7893d5b65f8ddce4d36c97f541e11d892a868ae99ff40d43cff3f28ff0655bf467eaa89e3d3a1493203e4abb26099b3b", + "0x0418a86f98026d1a55f6fee616f04d51be16c033651ffaafb0514287ec067d04e805080000000000000000000000000000000000000000000000000aec0000000000000000000000000000000000000000000000000000000000000000000000000000000002f56e29848865e204296c51c2fa18997db9888d7dd5a3e9ed3c726e278c099744107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f8400", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5300000000000000000000000000000000000017": [ + "0x09216a6bbacd13a635ed028c3456f0127403cb3a1875a02fcdc9f84bec7365f9f414bce13a0efa58946ea2bd4b706d2c2461c213cb1fbcc9749729b92a67e62bbe", + "0x092e58222e33bd8583ad4f8bcd9d3ebeecc73025ea8e016016faf0f8fa78f417251cb5cc6a65c39e4dc77fb5ca4a373776e04efd978f95e05b65cb884ffc1ed65e", + "0x0918ec3f04aa26dfe2fdb34122691277175ffeb34b57b96de91a11020d796b5b372a7042009d01ea9130232e3a9addb9b4a041d662dfc46dc99c83ada048dccca5", + "0x092095e03a6c163738018ddb4e1cdc171ed8306b711a78a59e07798e60d974a8f52e51ae1fc969dfd817613e2e6ee8062cd343612928fc1f2a8be5a4053032a3e0", + "0x0910b1ec1393c71d2fb5f6024dc8b3b21f75c8de647d481b0121dce322076582d82ca08ae593596704180b0f3f4c8f0bf9f9c8831cff2868f401b67a261813c939", + "0x0901603144c1255abe7e4dccedabde2d3acb83cccfc845602366ed7db86fcea8062dae21e4c5cee679a94325a7d6f9aa0b595a42f165e7bcda729f860111329f61", + "0x090e11cb818c1c31b2c42077bce95e1ac83faec4262e3d214f20345931b381488e1fa1e0f8d195352fc7dfdc1d2cca64062e326f1a44490fb1f715293dc5d56d67", + "0x071e7b646383bbd8defcc230d420cefddd4cae409681ef74ff98bb66527c23473c292161f39efa24ba2d072e47064c6d7ebc45e7890480005cd78d89dc640091c0", + "0x060e3d168eba427cee8d7be26b10e66d5d21b0301485d3cac9c45470fae67ad5031d49523b9f532097709c6c724d41ec10986bc0a4e5d078f5e9f861b56d91b773", + "0x041918c47a133f759975cc95c0dba82051d9b5cd65407e76ef1366a9deaa14f28005080000000000000000000000000000000000000000000000000aec000000000000000000000000000000000000000000000000000000000000000000000000000000002c3cbfa3d0183eb2e332389ef0c7a5e5d73cf155103c3ac0eddefa9e2beae91c44107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f8400", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5300000000000000000000000000000000000021": [ + "0x09216a6bbacd13a635ed028c3456f0127403cb3a1875a02fcdc9f84bec7365f9f414bce13a0efa58946ea2bd4b706d2c2461c213cb1fbcc9749729b92a67e62bbe", + "0x0903ccd7dc4f1c41883f8de90dde6ab2f83ad2c7f12f1c4b566b72b43ea277a85f05f5defed09a32bbf4f7fd47476dc172173d27c2b98fd0112ee8b94fc2ab72e2", + "0x092a06163d398088f873c062a317a00fd3db764138a54e7cdc629709208dfa6c1f02b239309942c962d21cb1ac0be0a0136f6113dfce49deb328eb708c6804e7f5", + "0x092cb3b11908a52cd926de960bc1605ba0ca074809eb4b4eeef23b306cdc8a8774049c9ba7546167504538f67af40a08189fe0b869af3172c62b4c748af3580b28", + "0x0913028f68e22d222f43ddc69482acfe4fffbbb3180065d5f00d63d2d839ab86c718be689dee79760972a42c9c0d3f6b4cc1acf518425ed10b445d1b3798822455", + "0x092638133fc9368332440781bda5fd3a9ab693ecb89f611f26acc785e68e181b7e0e520de80cc858c66d2f4dc02567bbe08c1a8f2bdfef6b10355fb2218c77ec0a", + "0x092166504c35825475687da93a700c997aadb255261bc6ce18ff61cd7182db14122cc3d3cf55c0beec2b0f09e350473bd703a8a84463f135d2c2d45ca19f34503a", + "0x091c746524ed2bcb228d6ebf9953357bb1b618a23fc2fe4302df1108a8a0e35ba122aeab44900556acd8bdd693a47952cb01f194cd72e12a550c7fcbc971ed742f", + "0x08244257efc46fd96db45b1505e03603f8b611a3e9ac4630d1fc9b01b4f5fd714117fac506dee79e5f7f52cb7b1eb174b441f0adee2a477e9c1680eeb5913a7eaf", + "0x071e6f5cd0c216a9cf74d9a8ce13256dd8970a07efacb2c61df9e3a4faab03c2de08738589134993085ec4962792e46613a66798325b297c93eca9ded9189ddfd2", + "0x07084f4e6b01a5eda178901c705a9a69b829618c6785a38c831ad467dc7c2d449115e4567e1f83d13a7fe610cca9aa17ba49bce22eb2edbc7f6242f42dc0c1dfd4", + "0x061dbb1f2fe996371625dbfaa5cd6ca070ed15c020c94e65344db5176087c17770242bf081ac926273432685f64c22d3603904df8edc4ddd3d1724817b14a6b8d6", + "0x040883d4562dfe8ba7ad8176bc2844d35ecc486199d589a152eabcee8398f3aebb05080000000000000000000000000000000000000000000000000aec00000000000000000000000000000000000000000000000000000000000000000000000000000000036c7b3f0434b9a4c98814ec5bfef913a8a785403fcc22d17f1adef51905db1a44107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f84205300000000000000000000000000000000000021000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8": [ + "0x09216a6bbacd13a635ed028c3456f0127403cb3a1875a02fcdc9f84bec7365f9f414bce13a0efa58946ea2bd4b706d2c2461c213cb1fbcc9749729b92a67e62bbe", + "0x092e58222e33bd8583ad4f8bcd9d3ebeecc73025ea8e016016faf0f8fa78f417251cb5cc6a65c39e4dc77fb5ca4a373776e04efd978f95e05b65cb884ffc1ed65e", + "0x0918ec3f04aa26dfe2fdb34122691277175ffeb34b57b96de91a11020d796b5b372a7042009d01ea9130232e3a9addb9b4a041d662dfc46dc99c83ada048dccca5", + "0x0918c7522784b2be5b3a370d083be715317f809eaa52cbf1b2aa372be3a744298924931ced24212206fa48a12d2f13412c1308ab073b7b877a7ccde133989601e9", + "0x09036c4fee62bb83d523b25829a9143501aea11f0d248381af88746cddffffcb1517c978df89fcd1dc931127336b356aacd0170ec91c226d6d1f9bc6661fc50114", + "0x092bacc030e7201c95030a1aea2839ee9bfee02262d8e0675495fea4338bdfa5061f94cad31b8c43d1b6144c213d812ad65da5fde12e373f1cf5a4b9429f9e4ab1", + "0x0900f088c016ba77fd9f92ce70ea2a1d105cdfc6c6a5d9186a2c187134d4c5a4ee17edd77e60f003f3d6b588651e70d7f1a04d596c8fbc0b00ff94edbb06fd5685", + "0x0820e6415fa24d523027c7fb18f091ff3c72fd02f198bc0266ae942c766072ac6f0000000000000000000000000000000000000000000000000000000000000000", + "0x0822d381e78bb6e50e7ba420e48dd800c957d5cfb3c12f7bb8b886c2cf7fac5e3b121c33745a1c061d6a4f9537b34c7de77c7dd352e7ed84d3d92031f2480d7def", + "0x0407edffb2f516756416f9cd6da120841b708d8ba8e0ae76133c0022b273252174050800000000000000000000000000000000000000000000000000000000000000000022001fffffffffffffffffffffffffffffffffffffffffffff59776f638fc0477a0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b648642070997970c51812dc3a010c7d01b50e0d17dc79c8000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x8613A4029EaA95dA61AE65380aC2e7366451bF2b": [ + "0x09216a6bbacd13a635ed028c3456f0127403cb3a1875a02fcdc9f84bec7365f9f414bce13a0efa58946ea2bd4b706d2c2461c213cb1fbcc9749729b92a67e62bbe", + "0x0903ccd7dc4f1c41883f8de90dde6ab2f83ad2c7f12f1c4b566b72b43ea277a85f05f5defed09a32bbf4f7fd47476dc172173d27c2b98fd0112ee8b94fc2ab72e2", + "0x092a06163d398088f873c062a317a00fd3db764138a54e7cdc629709208dfa6c1f02b239309942c962d21cb1ac0be0a0136f6113dfce49deb328eb708c6804e7f5", + "0x09055073efa8d18f7b39ca93783a3d0757684b088fa9c40989ecdd11a6582d7d2207fcd613205d81e82d227b023b3ef52412945210333f7499a94b7a2bd1712f1a", + "0x092c8c3677c410742ee26dae3cef5cdccbbcd827519b99eb03b5eefbeade86eec50e71e68d265efdd3b7cfd43589f133e8bc7a3446077e6cb3baa6d1f4c5330c4a", + "0x0913c5cc2cceb6b8a47f6cd1129ae95fcf106a3118b7e995e71d7463363cc18a45060d15cf17a14dccb1f951fe4da45e7e9d9ae11c4913659eeba0705315932595", + "0x0700000000000000000000000000000000000000000000000000000000000000000546eddc212aa24fe82929a110cb05394c113cf21c33e7319d4b343dd9c9c28c", + "0x0829e8adfe6b0110009211d061f2151f204ea5064c29b60a86ebfc1bd920aadc410000000000000000000000000000000000000000000000000000000000000000", + "0x081db6e2bcabf093b16569be5338b911154cee2d7e92be0c9b7e301304e1ee01b20000000000000000000000000000000000000000000000000000000000000000", + "0x061aa35fa484ee7fa884da99d974078a36000ec962b7cc7e0f3dafc9558ab098f9038fd4b5c930ce9f21c0afefbde838592882b83d08fb8df3d142d70bd86ea321", + "0x040afb2274ad34383fe94688a6d7f6b33d1327d31b22683dcc480d94081869185705080000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486400", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9": [ + "0x09216a6bbacd13a635ed028c3456f0127403cb3a1875a02fcdc9f84bec7365f9f414bce13a0efa58946ea2bd4b706d2c2461c213cb1fbcc9749729b92a67e62bbe", + "0x0903ccd7dc4f1c41883f8de90dde6ab2f83ad2c7f12f1c4b566b72b43ea277a85f05f5defed09a32bbf4f7fd47476dc172173d27c2b98fd0112ee8b94fc2ab72e2", + "0x092a06163d398088f873c062a317a00fd3db764138a54e7cdc629709208dfa6c1f02b239309942c962d21cb1ac0be0a0136f6113dfce49deb328eb708c6804e7f5", + "0x09055073efa8d18f7b39ca93783a3d0757684b088fa9c40989ecdd11a6582d7d2207fcd613205d81e82d227b023b3ef52412945210333f7499a94b7a2bd1712f1a", + "0x0915cba504981b19d6f53c995ba3604bf3de616a1a6bd3759b398a5d90e24e176a05e9dc638978400983b610b9f7501e49155663714a078df378de55d05316b29c", + "0x092117dac84ff3dc2cdee910557bf7a16284dbe01c4f931825930b624db9d6fd82291b27340a19a4fd864d09d06d3960aa68eea31f1e2602e59174b0393eee25dc", + "0x0920cef06fe19630bda74593c0275f99d338e1e8834104bd8521bc105fd244da940879c20326089af5838976b5e646a16d9394299fda517fc5a4021bcb9a32bf14", + "0x060f06127668bb1bdd54f6294e02b62b0098b7cc5ed0140cbcf437bb5a55a7412b0e389db460936612ba19bf09059808e82687225b4c0d7fc30ec6615020c6c43a", + "0x041578b561ae8e97e3c6cdd2fe55167ee977e55548f3010b69ed60bf9e61c9eaaf05080000000000000000000000000000000000000000000000000d890000000000000001000000000000000000000000000000000000000000000000000000000000000000d104141476a49d03dbb3095d98279c508eac76c42280d89037984dea0f18fa1747624a26df7a2ccc64170f9fdf64b98868e36285f4f3d3418bc63b1cac3a4522077695cc1515e749aea246da1c0832429ec8db834be69a840c496c187d5bd520cf7ed3acca5a467e9e704c703e8d87f634fb0fc9000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xFABB0ac9d68B0B445fB7357272Ff202C5651694a": [ + "0x09216a6bbacd13a635ed028c3456f0127403cb3a1875a02fcdc9f84bec7365f9f414bce13a0efa58946ea2bd4b706d2c2461c213cb1fbcc9749729b92a67e62bbe", + "0x0903ccd7dc4f1c41883f8de90dde6ab2f83ad2c7f12f1c4b566b72b43ea277a85f05f5defed09a32bbf4f7fd47476dc172173d27c2b98fd0112ee8b94fc2ab72e2", + "0x090e16a3f7fafe552e7e8f49deee6d7a1fa93ac9df65ee242cefbabd50568539610f4be945f00183f6833f932e2021f6ff5698622457524a20ce21a3921aabce3a", + "0x092ee6a5cff1508574915e5c5fa61134dcb9946427ead4b12c3273e9b97a0b77a6001854e8380fbd58620925780f3ed2d0abeea5a13b4e0a4e0a51f59b9b5ec3c0", + "0x09174cfdf2f1e0c6fe4cab85c20ea084898c0e359ada326bd1d38abce77a6ea2492137ebae927de9055c704eaf20176efd3688db2f24e0b7e0a197ed67abc806f0", + "0x0921e218fe94e8e55e46d83b3c61bc6d8f60c2262bf59669299b70dcfe52d8b7442cd91c7a4c36943da038bcb35dde8dd004b83e190a17e35d1bda9011ae062f99", + "0x092173e847844f75d655ac0690b26ee3bf3e65a3c0062f9b9be566e74cd41927df12b7fd5527c406a10b999c59c3c6a1f781797558a36b7fbdadd2d2cf435c1e25", + "0x07000000000000000000000000000000000000000000000000000000000000000002c01b849e25a91dd222e8d006ae918579a6bff12484cc758a8c43c8d6ce0017", + "0x080931f89fedde2fe071003121dcbbc15662cc71fc96127a81b17ca72f1dc81d620000000000000000000000000000000000000000000000000000000000000000", + "0x070d53acb57a8c223e5af81f5dbf1d80922525be5a8d4e45f5f09ff8580a16e210159ad10b4c89ff16157cc364c81f6039eeea9a8eb87e4b4700249219e71cc3ef", + "0x0403d2c88868dc8b5f7994604147a8246c48cc905235de980c42c3e78f351f00c505080000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000f76b616411d0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420fabb0ac9d68b0b445fb7357272ff202c5651694a000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "storageProofs": { + "0x5300000000000000000000000000000000000001": { + "0x0000000000000000000000000000000000000000000000000000000000000021": [ + "0x0825bcd8ed4a7e39c0f0e835761cda36131dd34f16de95765d2216d997923a52f60e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200", + "0x06216372aa3165a29ee67494a5a9680358be92c254cc5724949e4d52742ba8d57f02a40b5614637fca2783d673559f035f5f5a0588ee27d164bb5375568493200a", + "0x042f683d080c393f5fb2ade2190fd56e8a5e8fa26533acdea8cce25caa236027cc0101000027ae5ba08d7291c96c8cbddcc148bf48a6d68c7974b94356f53754ef6171d75700", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x530000000000000000000000000000000000000f": { + "0x0000000000000000000000000000000000000000000000000000000000000001": [ + "0x09250fbf2587e7f07f1dd72ac26e3245705f67157a2e402a60bcb9c861b5a4d3f7256fbb55c0a0ca65679134f25a5a893427348f9086273c801ff4633c50899f1e", + "0x0904657f17b545183e86b0545adff05a99f8efe788d72e90e01784a1b9f986e35a162b4d479ff13f2af3f0cfaadc6bccc8622dd980f83c7014e947f50577eedaba", + "0x0804422082d7197f691b32c2c4120b44e674d5bd50d4b210f0d4525906237d29871e144bbeb8f4c147dafacf9567e13b1b15e4804a9d74df2da7619735d765c1be", + "0x081341967c7422e5508fc72463c51ace718e18440d00db082bf2184d906f2c9ad90000000000000000000000000000000000000000000000000000000000000000", + "0x07000000000000000000000000000000000000000000000000000000000000000006e79d86dd9c9fa893eb97cd43df98e2d19487b963520202b144a3f4b84f0c45", + "0x080e0f66ccb838bd67cbf343dadf696b6d2aa46137c6c82c4fd6ceaf8d60fe80d60000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000002634b0768a20cec85ef53630d7f4dfc6d1c8c8f76dad4d9014828fc94bf0ded8", + "0x080b10db1b542a2f6c809a2d2cd03aa0c4d4ddcdfd2a1c8a00dc06cdc12bbb976c0000000000000000000000000000000000000000000000000000000000000000", + "0x08144e4aeb02298f8f0545b923bc88172527f7ffdd24eb31a2dccfe887757beb0f0000000000000000000000000000000000000000000000000000000000000000", + "0x07000000000000000000000000000000000000000000000000000000000000000023413c0bd51b56dc557426037ffd25cae18e73e8f116ad6aa3a46aaba671f1e4", + "0x0628e14710ef1f9a6f539110a2d6c693d9389d38836eb9f0e0ea449d3afaede2a6156a0960a84fa4287f66d18b9c39ab9d403fa6b6dddd126f47758aadcb82e122", + "0x0426049ba6de63003492eb078a01a8aa4f4a0e67f28f0955c2eba9101d5d2eea5001010000000000000000000000000000000000000000000000000000000000003b9aca00200000000000000000000000000000000000000000000000000000000000000001", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000002": [ + "0x09250fbf2587e7f07f1dd72ac26e3245705f67157a2e402a60bcb9c861b5a4d3f7256fbb55c0a0ca65679134f25a5a893427348f9086273c801ff4633c50899f1e", + "0x0904657f17b545183e86b0545adff05a99f8efe788d72e90e01784a1b9f986e35a162b4d479ff13f2af3f0cfaadc6bccc8622dd980f83c7014e947f50577eedaba", + "0x0804422082d7197f691b32c2c4120b44e674d5bd50d4b210f0d4525906237d29871e144bbeb8f4c147dafacf9567e13b1b15e4804a9d74df2da7619735d765c1be", + "0x04020953ad52de135367a1ba2629636216ed5174cce5629d11b5d97fe733f07dcc0101000000000000000000000000000000000000000000000000000000000000000009c4200000000000000000000000000000000000000000000000000000000000000002", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000003": [ + "0x09250fbf2587e7f07f1dd72ac26e3245705f67157a2e402a60bcb9c861b5a4d3f7256fbb55c0a0ca65679134f25a5a893427348f9086273c801ff4633c50899f1e", + "0x0700000000000000000000000000000000000000000000000000000000000000002c627348b5769391cdf27c1c6ccd9e7363936623501503e7549c1df6542031b9", + "0x060ee2ca3e190e48951aa8d5bb00d33ba76a92de69a807dfa6f2eaa9881e303f320e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200", + "0x0406c50541f08911ad149aa545dd3d606f86ee63c751a795c7d57f0d3f85e6bdeb01010000000000000000000000000000000000000000000000000000000000003b9aca0000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000006": [ + "0x09250fbf2587e7f07f1dd72ac26e3245705f67157a2e402a60bcb9c861b5a4d3f7256fbb55c0a0ca65679134f25a5a893427348f9086273c801ff4633c50899f1e", + "0x0904657f17b545183e86b0545adff05a99f8efe788d72e90e01784a1b9f986e35a162b4d479ff13f2af3f0cfaadc6bccc8622dd980f83c7014e947f50577eedaba", + "0x0804422082d7197f691b32c2c4120b44e674d5bd50d4b210f0d4525906237d29871e144bbeb8f4c147dafacf9567e13b1b15e4804a9d74df2da7619735d765c1be", + "0x04020953ad52de135367a1ba2629636216ed5174cce5629d11b5d97fe733f07dcc0101000000000000000000000000000000000000000000000000000000000000000009c4200000000000000000000000000000000000000000000000000000000000000002", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000007": [ + "0x09250fbf2587e7f07f1dd72ac26e3245705f67157a2e402a60bcb9c861b5a4d3f7256fbb55c0a0ca65679134f25a5a893427348f9086273c801ff4633c50899f1e", + "0x0904657f17b545183e86b0545adff05a99f8efe788d72e90e01784a1b9f986e35a162b4d479ff13f2af3f0cfaadc6bccc8622dd980f83c7014e947f50577eedaba", + "0x0803f6f6d47db3a7888f229ead7798b1ae14eb8855585ebb4d70f6a2020ac30dbf0000000000000000000000000000000000000000000000000000000000000000", + "0x081824025e42aefa5d18b0a0c39ba03d737dc20b78e6574d948d80d82a52f727d80000000000000000000000000000000000000000000000000000000000000000", + "0x05", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000008": [ + "0x09250fbf2587e7f07f1dd72ac26e3245705f67157a2e402a60bcb9c861b5a4d3f7256fbb55c0a0ca65679134f25a5a893427348f9086273c801ff4633c50899f1e", + "0x0700000000000000000000000000000000000000000000000000000000000000002c627348b5769391cdf27c1c6ccd9e7363936623501503e7549c1df6542031b9", + "0x060ee2ca3e190e48951aa8d5bb00d33ba76a92de69a807dfa6f2eaa9881e303f320e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200", + "0x0419a44eca69f8d5e3651ccf05934126419470106b4b51bb4b96b6230b7d80236701010000000000000000000000000000530000000000000000000000000000000000000b00", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000009": [ + "0x09250fbf2587e7f07f1dd72ac26e3245705f67157a2e402a60bcb9c861b5a4d3f7256fbb55c0a0ca65679134f25a5a893427348f9086273c801ff4633c50899f1e", + "0x0700000000000000000000000000000000000000000000000000000000000000002c627348b5769391cdf27c1c6ccd9e7363936623501503e7549c1df6542031b9", + "0x05", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x5300000000000000000000000000000000000017": { + "0x0000000000000000000000000000000000000000000000000000000000000065": [ + "0x09295b90a00505079f65623858f8e164c095a86cfbb449412829e1fc988749139c2c08ec36e0b240f28727cc2f0e93b4b55b1214857f62e93cd895cd25d6b1fca3", + "0x0924e760587c9b1db469c29fecb46a7a69bf5102811e52577a0be8379118e3506115e6e9020712f91f6ee3d7b78613fdb79c35a4f68cf0438bb49ff403e3d93296", + "0x081e5ac2ec2032e7f34af7c72542b1ff463f5590272545e8a2f4f32e3b5a63eda30e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200", + "0x07165d00aa7e206c00402a408f8fd7708cade38a4505b733034b0395a63d9972db1ddc1c901911c636efb3e2c53251d143b3f5bb4271fb6b9e8837fc0c1f739212", + "0x0700000000000000000000000000000000000000000000000000000000000000002b22b7103e3a83cc758c8e8997b79b6e30988fbe8aa1924fdbe675cd6d5ceed0", + "0x0700000000000000000000000000000000000000000000000000000000000000001f4b453328057d0249978fe5ee1e635e4671f325a2bcf3449ef1637170859c43", + "0x0623965bae207a394b8516562f391edb1cdc19cad8d2aa324db42a44fd0810fd550a36302dbd0bcb8ba381bd22b85ded888e754404629c06c2b7801c87978dfd6f", + "0x042115c9b0a0938aa1ce2e8c01581e5aa931288249a453588de70cf2c5dae26a7b0101000022efe8537c043bf1a471893cba84c8cd29a0d3ea62ad7c4ada032136254ad6c9200000000000000000000000000000000000000000000000000000000000000065", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x5300000000000000000000000000000000000021": { + "0x000000000000000000000000000000000000000000000000000000000000009a": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x091e999ad0969a892635449070e98a13e662492f946d6ba9efaccf52ab53e7875e2cbbe5bbc301a45411f8c9d9639b312ddcaffd9fb0598f3bf73f656f309fcb4d", + "0x0904314d470dc20d9ee18b9434c6fff6e9cc5c211a2e469cdeb00b69942bccfb7c0b567c74e6484b887c320ed6b5c14a50a89fe400b3eb13ed5a5e86880a65aea0", + "0x061c7c2370b89156b28f4141e6320159e799f8353ac328f91eadd9c65a06fad2a628b3bf9a92d906051defc60a366063e6d133f3bb15dc661dad6b57e1f51f95e6", + "0x040959c4a1b3fc665dce20b30216d51dd0141a6738567cfbbf2054a1bc710af948010100000000000000000000000000000000000000000000000000049824fc6fcac9f3ba206d01ba8ffed4ce500f24b73f45df7dc163a96f64ced987d8ee795c34e371362e", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x6d01ba8ffed4ce500f24b73f45df7dc163a96f64ced987d8ee795c34e371362e": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x091e999ad0969a892635449070e98a13e662492f946d6ba9efaccf52ab53e7875e2cbbe5bbc301a45411f8c9d9639b312ddcaffd9fb0598f3bf73f656f309fcb4d", + "0x0904314d470dc20d9ee18b9434c6fff6e9cc5c211a2e469cdeb00b69942bccfb7c0b567c74e6484b887c320ed6b5c14a50a89fe400b3eb13ed5a5e86880a65aea0", + "0x061c7c2370b89156b28f4141e6320159e799f8353ac328f91eadd9c65a06fad2a628b3bf9a92d906051defc60a366063e6d133f3bb15dc661dad6b57e1f51f95e6", + "0x040959c4a1b3fc665dce20b30216d51dd0141a6738567cfbbf2054a1bc710af948010100000000000000000000000000000000000000000000000000049824fc6fcac9f3ba206d01ba8ffed4ce500f24b73f45df7dc163a96f64ced987d8ee795c34e371362e", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c1f": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x0919e44f4c1854907175b4b2b5a0c96536103adcca1baf40cffa44b0331a8901db2603c9a992dc69a6b684dc301f77cc1c4e9e8a4dd972d15f4cd2ed974c4a79cc", + "0x090dec3fded5debc4bba8aa761a657e8f3bbf01043cb27c6fe8889998a0887b24718683552e0d0dfb464626d6d970adb45c97d9934acaa537b7d7ac0539b53d359", + "0x0813405dada82f833e1a1f8a09f3d0272ad6b162baccede0af919f196392fcd8920000000000000000000000000000000000000000000000000000000000000000", + "0x0723e0dc8d0a6f591ebd77a74f4ee964c81484fbcd8ae0c8bada311e7bc460d959281d441c8ab855399e0f22d4ebf178922d8477c39622fc2c4d9eac325eef6f12", + "0x040e11aafee10c1ada84b19baca77f65014d45b4d26b4ce3aef99a36898199d98601010000000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc920f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c1f", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c20": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0910baa0679dfabc98a749e2cf19cf380cf168c5963ed340eb8793275881f1aab91a61ae832a78b0c5b49d6624e781530d6b4a5ae6747aa8024bb5e00238b397e8", + "0x09128488b0bbdf573df71a726be2ff9a53c1c3ebea2d83da9bc818082d6114154e2f22abdf8825ed09c438ab5e357d601c5008c108986a0f79604020d03dd5658e", + "0x092ce0544b0f1037241d83b784217e1db71aed02f6bb6cbae678f12d8193e6fa561125c8bd98a62433fd57539d6de2d621f4f27c9a5a0a131df210d20fd063a298", + "0x0914bb75030a49de47a3568a2e726e3917e1508d35184c4436116ab72a8d57e65d08d136d73cfd57d8c8015158a423a463519cf14810f6d417259b71dd7bf648d6", + "0x0803dcf8e3b0f9009bdb5cc45234cdc34d8b90bc39e93768b8e8ff8688e950f15f0000000000000000000000000000000000000000000000000000000000000000", + "0x0617b0f320c1804f82f63a90e5e742227da35743a460ca351c5b6fd9481941d68a300c25969dcd82b2b69e782cd8d7535ea8d97f409cadb1187efbe5d940dce947", + "0x040ce6415daf9119eaa403a2266a11c8e6ea133c74e056da323547a0115ecd9f8901010000000000000000000000000000000000000000000000000000000000000000000420f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c20", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c21": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x0919e44f4c1854907175b4b2b5a0c96536103adcca1baf40cffa44b0331a8901db2603c9a992dc69a6b684dc301f77cc1c4e9e8a4dd972d15f4cd2ed974c4a79cc", + "0x0925ffe896678956add403385939c3f41f2db8bff412c9cc8d8f0590cef223288f1bbbbc549a61adc7a091da47883f9c34951e785f75cce8226f3ffdd7189d71b4", + "0x09282aa159b4c043af9c744e12ae4c4836a6fad029715cd87972d9b86e31466cf505f95afda0666a080bb144051a34ee842f918d97623213ca6c0b3537d6aab3d5", + "0x0923dcac699b2bc22dc2f7fa81bf06b44a951d3142c20fc0663b738e658d07ad6204469cd5cb700f31d2934e01feb4321e5be7476821bf1dde82369b6d764ec9dd", + "0x081ecccb20e28882de75addf9eec71a1b14d8fa7b4bd8d7322c4a3dc98c2e085d70000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000001a4fed6b9ad33da7ca3fff4cfb1669e16d80ea7547466dc8dcd67313b34b8787", + "0x082e81ca75173eddf06730891a8f9596f671a7d43cfff11669d4dbfda376538f3e0000000000000000000000000000000000000000000000000000000000000000", + "0x070000000000000000000000000000000000000000000000000000000000000000045d9db03e27071fd4b78117e0e472e06a4eb440617f3ed1e684a5f352856f1f", + "0x080b54e05661b49468d95e43a2ea570347ee51cf309b34b76425adde9b4811b50a18d1292738ab018ea00b3f5f4def62bd9396f9d1caadf29c4be6f2c4833e8035", + "0x062b11db9f1c375e2991097c0da6db9f65ee67825fec9a9613755ca0814cab2fc10154484431d37f9c311e65c4a516c144975b04c404eae5b908e141b3df6ccf92", + "0x0409130a06ba75cb64ae567f1af4e20969bcad96dedcf63d1e434f3f6dc966ca9201010000000000000000000000000000000000000000000000000000000000000000060120f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c21", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c22": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0910baa0679dfabc98a749e2cf19cf380cf168c5963ed340eb8793275881f1aab91a61ae832a78b0c5b49d6624e781530d6b4a5ae6747aa8024bb5e00238b397e8", + "0x0901dd7acbf5ebcbdec718df5774b877e62c16725cd43f07a7bbed7920c5825bb827d74048a99c16ca943362467a7232acba34083af75d10df8c6db36857d01b4c", + "0x0900dc2acf77d008cd9bc982319f8ecdd4d2ecff285b0b66882f4fa9eb1dff1f29183cf679b7f04d5c7327a1bfbd66754f84cc0a9e47ece70d5a7369ab612aed42", + "0x090b90fc0f2f16ef66c025e559d404c4d5fc49562899599a5348d307090c6a4e75078a35b037fa17e0b7801e7df716d17bf9015921ba9961df657c5776da6cc41f", + "0x072415b967f38129cf7e76297d7eb0462e470ee8a443503d59b3b1faecb081590829ea4234c57072a69a28d9575d618f0432d8cc99c29689bd3fda0e3954fa1918", + "0x08028439355a6f136af7432fe618a91dca0933acbc2375aa0a1ca90633b928815811a4b142f80899b94192f56c30e2545b0f60d45246f89520b827da4245440b0a", + "0x0426021fba3d566dfc3284c8ace6e55cbf07f0864ebec2f8f1a14e7d1d1294ecf70101000000000000000000000000000000000000000000000000000000000000000f424020f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c22", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9": { + "0x8c37336c8eae88ad7bbf871a6a05192bff663bf13ee0773449221a2afccbd95a": [ + "0x08186261f164d172d86030901884e0e0894df14c5868734e9524e241efdcae59ef16e1d5770cd48f89026856129d8563d65d8b9d76dc4c6f184b78343336d17e5c", + "0x092fb4940211e18006dd4e7541ae6e25a62a35287d755f00ad8f739309226c57630642e0e45ae73a2e452361460d3b6298d6c52b81b5da63a8abe5182d3ef796ed", + "0x081d82c353120820209adce6bf429c0a355b06ba2c90d3f0d8044234409e471b820000000000000000000000000000000000000000000000000000000000000000", + "0x0607bb43435f21e2a4a7cf97e33ed02ffdd2d10733adbe4d98fd4b9530224b20f51d9020a017be10f06ff76ca3fe3902686c00672bf7f5efc10c05bee5cf88053f", + "0x04123a9464ab167aa30076139d8d977b716a85918f12de86764c00ee1a7c603f9a01010000000000000000000000000000000000000000000000000000000000000000000e208c37336c8eae88ad7bbf871a6a05192bff663bf13ee0773449221a2afccbd95a", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x9c35da83f88043b3115f30d93beacec49ca14b6238430bdff196a249c29baa80": [ + "0x08186261f164d172d86030901884e0e0894df14c5868734e9524e241efdcae59ef16e1d5770cd48f89026856129d8563d65d8b9d76dc4c6f184b78343336d17e5c", + "0x092fb4940211e18006dd4e7541ae6e25a62a35287d755f00ad8f739309226c57630642e0e45ae73a2e452361460d3b6298d6c52b81b5da63a8abe5182d3ef796ed", + "0x0725e5bc9d7850b93ca1a3491589373e5bfa543dab27fbe55d9379b661118d0ebc2ed7f4a01326364719bab2066d9f93e0d2ae52beb7b9bdd71a8f562c1d327342", + "0x062fb09da9a43db97179c9fd3b6a67827b5526e5978e1df1d7967a23deafdd5c1211af9d72891936e057a6fcc3c5e5973bd7fb35481b0c0f63ef4491427d5f230a", + "0x0408fce273ee0c1553e3b2eebd59ca7cb8a863be1f26eaefad72094e7d72212a94010100000000000000000000000000000000000000000000000000000de0b6b3a763fff1209c35da83f88043b3115f30d93beacec49ca14b6238430bdff196a249c29baa80", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + } + } + }, + "codes": [ + { + "codeSize": 0, + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "code": "0x" + }, + { + "codeSize": 3465, + "keccakCodeHash": "0x1747624a26df7a2ccc64170f9fdf64b98868e36285f4f3d3418bc63b1cac3a45", + "hash": "0x22077695cc1515e749aea246da1c0832429ec8db834be69a840c496c187d5bd5", + "code": "0x608060405234801561000f575f80fd5b50600436106100e5575f3560e01c806370a08231116100885780639dc29fac116100635780639dc29fac146101f0578063a9059cbb14610203578063d505accf14610216578063dd62ed3e14610229575f80fd5b806370a08231146101aa5780637ecebe00146101c957806395d89b41146101e8575f80fd5b806323b872dd116100c357806323b872dd14610141578063313ce567146101545780633644e5151461018d57806340c10f1914610195575f80fd5b806306fdde03146100e9578063095ea7b31461010757806318160ddd1461012a575b5f80fd5b6100f1610253565b6040516100fe9190610a52565b60405180910390f35b61011a610115366004610ae4565b6102de565b60405190151581526020016100fe565b61013360025481565b6040519081526020016100fe565b61011a61014f366004610b0c565b610357565b61017b7f000000000000000000000000000000000000000000000000000000000000000681565b60405160ff90911681526020016100fe565b610133610497565b6101a86101a3366004610ae4565b6104f1565b005b6101336101b8366004610b45565b60036020525f908152604090205481565b6101336101d7366004610b45565b60056020525f908152604090205481565b6100f16104ff565b6101a86101fe366004610ae4565b61050c565b61011a610211366004610ae4565b610516565b6101a8610224366004610b65565b610599565b610133610237366004610bd2565b600460209081525f928352604080842090915290825290205481565b5f805461025f90610c03565b80601f016020809104026020016040519081016040528092919081815260200182805461028b90610c03565b80156102d65780601f106102ad576101008083540402835291602001916102d6565b820191905f5260205f20905b8154815290600101906020018083116102b957829003601f168201915b505050505081565b335f81815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103459086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103e9576103b88382610c81565b73ffffffffffffffffffffffffffffffffffffffff86165f9081526004602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff85165f908152600360205260408120805485929061041d908490610c81565b909155505073ffffffffffffffffffffffffffffffffffffffff8085165f81815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104849087815260200190565b60405180910390a3506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000cf5546146104cc576104c76108b7565b905090565b507fdc3435dca418b10e0cd044263a037691aa7a3f09458c668c777ab43e880f269890565b6104fb828261094f565b5050565b6001805461025f90610c03565b6104fb82826109c6565b335f90815260036020526040812080548391908390610536908490610c81565b909155505073ffffffffffffffffffffffffffffffffffffffff83165f81815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103459086815260200190565b42841015610608576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b5f6001610613610497565b73ffffffffffffffffffffffffffffffffffffffff8a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610761573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906107dc57508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016105ff565b73ffffffffffffffffffffffffffffffffffffffff9081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516108e79190610c94565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060025f8282546109609190610d69565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260036020526040812080548392906109fa908490610c81565b90915550506002805482900390556040518181525f9073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016109ba565b5f602080835283518060208501525f5b81811015610a7e57858101830151858201604001528201610a62565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610adf575f80fd5b919050565b5f8060408385031215610af5575f80fd5b610afe83610abc565b946020939093013593505050565b5f805f60608486031215610b1e575f80fd5b610b2784610abc565b9250610b3560208501610abc565b9150604084013590509250925092565b5f60208284031215610b55575f80fd5b610b5e82610abc565b9392505050565b5f805f805f805f60e0888a031215610b7b575f80fd5b610b8488610abc565b9650610b9260208901610abc565b95506040880135945060608801359350608088013560ff81168114610bb5575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215610be3575f80fd5b610bec83610abc565b9150610bfa60208401610abc565b90509250929050565b600181811c90821680610c1757607f821691505b602082108103610c4e577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181038181111561035157610351610c54565b5f8083545f60018260011c91506001831680610cb157607f831692505b60208084108203610ce9577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b818015610cfd5760018114610d3057610d5b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0086168952841515850289019650610d5b565b5f8a8152602090205f5b86811015610d535781548b820152908501908301610d3a565b505084890196505b509498975050505050505050565b8082018082111561035157610351610c5456fea164736f6c6343000818000a" + }, + { + "codeSize": 2796, + "keccakCodeHash": "0x44107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d5", + "hash": "0x18d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f84", + "code": "0x60806040523661001357610011610017565b005b6100115b61001f6102a0565b73ffffffffffffffffffffffffffffffffffffffff1633036102965760607fffffffff000000000000000000000000000000000000000000000000000000005f35167fc9a6301a000000000000000000000000000000000000000000000000000000008101610097576100906102df565b915061028e565b7fb0e10d7a000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216016100e857610090610332565b7f70d7c690000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160161013957610090610376565b7f07ae5bc0000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160161018a576100906103a6565b7fa39f25e5000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216016101db576100906103f2565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b815160208301f35b61029e610405565b565b5f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b60606102e9610415565b5f6102f736600481846108bc565b810190610304919061090b565b905061031f8160405180602001604052805f8152505f61041f565b505060408051602081019091525f815290565b60605f8061034336600481846108bc565b8101906103509190610951565b915091506103608282600161041f565b60405180602001604052805f8152509250505090565b6060610380610415565b5f61038e36600481846108bc565b81019061039b919061090b565b905061031f8161044a565b60606103b0610415565b5f6103b96102a0565b6040805173ffffffffffffffffffffffffffffffffffffffff831660208201529192500160405160208183030381529060405291505090565b60606103fc610415565b5f6103b96104ae565b61029e6104106104ae565b6104bc565b341561029e575f80fd5b610428836104da565b5f825111806104345750805b15610445576104438383610526565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6104736102a0565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a16104ab81610552565b50565b5f6104b761065e565b905090565b365f80375f80365f845af43d5f803e8080156104d6573d5ff35b3d5ffd5b6104e381610685565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b606061054b8383604051806060016040528060278152602001610ab960279139610750565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81166105f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610285565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6102c3565b73ffffffffffffffffffffffffffffffffffffffff81163b610729576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610285565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610618565b60605f808573ffffffffffffffffffffffffffffffffffffffff16856040516107799190610a4d565b5f60405180830381855af49150503d805f81146107b1576040519150601f19603f3d011682016040523d82523d5f602084013e6107b6565b606091505b50915091506107c7868383876107d1565b9695505050505050565b606083156108665782515f0361085f5773ffffffffffffffffffffffffffffffffffffffff85163b61085f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610285565b5081610870565b6108708383610878565b949350505050565b8151156108885781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102859190610a68565b5f80858511156108ca575f80fd5b838611156108d6575f80fd5b5050820193919092039150565b803573ffffffffffffffffffffffffffffffffffffffff81168114610906575f80fd5b919050565b5f6020828403121561091b575f80fd5b61054b826108e3565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f8060408385031215610962575f80fd5b61096b836108e3565b9150602083013567ffffffffffffffff80821115610987575f80fd5b818501915085601f83011261099a575f80fd5b8135818111156109ac576109ac610924565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156109f2576109f2610924565b81604052828152886020848701011115610a0a575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f5b83811015610a45578181015183820152602001610a2d565b50505f910152565b5f8251610a5e818460208701610a2b565b9190910192915050565b602081525f8251806020840152610a86816040850160208701610a2b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a164736f6c6343000818000a" + } + ], + "txStorageTraces": [ + { + "rootBefore": "0x25da38de640f0d10689d4ee046a22eac930f10e47303e00b28490bb420ec0d8a", + "rootAfter": "0x1650799b9402a97649f2f6a7688f5877fb0da572f638f2966d1b43ef40a94784", + "proofs": { + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8": [ + "0x09216a6bbacd13a635ed028c3456f0127403cb3a1875a02fcdc9f84bec7365f9f414bce13a0efa58946ea2bd4b706d2c2461c213cb1fbcc9749729b92a67e62bbe", + "0x092e58222e33bd8583ad4f8bcd9d3ebeecc73025ea8e016016faf0f8fa78f417251cb5cc6a65c39e4dc77fb5ca4a373776e04efd978f95e05b65cb884ffc1ed65e", + "0x0918ec3f04aa26dfe2fdb34122691277175ffeb34b57b96de91a11020d796b5b372a7042009d01ea9130232e3a9addb9b4a041d662dfc46dc99c83ada048dccca5", + "0x0918c7522784b2be5b3a370d083be715317f809eaa52cbf1b2aa372be3a744298924931ced24212206fa48a12d2f13412c1308ab073b7b877a7ccde133989601e9", + "0x09036c4fee62bb83d523b25829a9143501aea11f0d248381af88746cddffffcb1517c978df89fcd1dc931127336b356aacd0170ec91c226d6d1f9bc6661fc50114", + "0x092bacc030e7201c95030a1aea2839ee9bfee02262d8e0675495fea4338bdfa5061f94cad31b8c43d1b6144c213d812ad65da5fde12e373f1cf5a4b9429f9e4ab1", + "0x0900f088c016ba77fd9f92ce70ea2a1d105cdfc6c6a5d9186a2c187134d4c5a4ee17edd77e60f003f3d6b588651e70d7f1a04d596c8fbc0b00ff94edbb06fd5685", + "0x0820e6415fa24d523027c7fb18f091ff3c72fd02f198bc0266ae942c766072ac6f0000000000000000000000000000000000000000000000000000000000000000", + "0x0822d381e78bb6e50e7ba420e48dd800c957d5cfb3c12f7bb8b886c2cf7fac5e3b121c33745a1c061d6a4f9537b34c7de77c7dd352e7ed84d3d92031f2480d7def", + "0x0407edffb2f516756416f9cd6da120841b708d8ba8e0ae76133c0022b273252174050800000000000000000000000000000000000000000000000000000000000000000022001fffffffffffffffffffffffffffffffffffffffffffff59776f638fc0477a0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b648642070997970c51812dc3a010c7d01b50e0d17dc79c8000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x8613A4029EaA95dA61AE65380aC2e7366451bF2b": [ + "0x09216a6bbacd13a635ed028c3456f0127403cb3a1875a02fcdc9f84bec7365f9f414bce13a0efa58946ea2bd4b706d2c2461c213cb1fbcc9749729b92a67e62bbe", + "0x0903ccd7dc4f1c41883f8de90dde6ab2f83ad2c7f12f1c4b566b72b43ea277a85f05f5defed09a32bbf4f7fd47476dc172173d27c2b98fd0112ee8b94fc2ab72e2", + "0x092a06163d398088f873c062a317a00fd3db764138a54e7cdc629709208dfa6c1f02b239309942c962d21cb1ac0be0a0136f6113dfce49deb328eb708c6804e7f5", + "0x09055073efa8d18f7b39ca93783a3d0757684b088fa9c40989ecdd11a6582d7d2207fcd613205d81e82d227b023b3ef52412945210333f7499a94b7a2bd1712f1a", + "0x092c8c3677c410742ee26dae3cef5cdccbbcd827519b99eb03b5eefbeade86eec50e71e68d265efdd3b7cfd43589f133e8bc7a3446077e6cb3baa6d1f4c5330c4a", + "0x0913c5cc2cceb6b8a47f6cd1129ae95fcf106a3118b7e995e71d7463363cc18a45060d15cf17a14dccb1f951fe4da45e7e9d9ae11c4913659eeba0705315932595", + "0x0700000000000000000000000000000000000000000000000000000000000000000546eddc212aa24fe82929a110cb05394c113cf21c33e7319d4b343dd9c9c28c", + "0x0829e8adfe6b0110009211d061f2151f204ea5064c29b60a86ebfc1bd920aadc410000000000000000000000000000000000000000000000000000000000000000", + "0x081db6e2bcabf093b16569be5338b911154cee2d7e92be0c9b7e301304e1ee01b20000000000000000000000000000000000000000000000000000000000000000", + "0x061aa35fa484ee7fa884da99d974078a36000ec962b7cc7e0f3dafc9558ab098f9038fd4b5c930ce9f21c0afefbde838592882b83d08fb8df3d142d70bd86ea321", + "0x040afb2274ad34383fe94688a6d7f6b33d1327d31b22683dcc480d94081869185705080000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486400", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9": [ + "0x09216a6bbacd13a635ed028c3456f0127403cb3a1875a02fcdc9f84bec7365f9f414bce13a0efa58946ea2bd4b706d2c2461c213cb1fbcc9749729b92a67e62bbe", + "0x0903ccd7dc4f1c41883f8de90dde6ab2f83ad2c7f12f1c4b566b72b43ea277a85f05f5defed09a32bbf4f7fd47476dc172173d27c2b98fd0112ee8b94fc2ab72e2", + "0x092a06163d398088f873c062a317a00fd3db764138a54e7cdc629709208dfa6c1f02b239309942c962d21cb1ac0be0a0136f6113dfce49deb328eb708c6804e7f5", + "0x09055073efa8d18f7b39ca93783a3d0757684b088fa9c40989ecdd11a6582d7d2207fcd613205d81e82d227b023b3ef52412945210333f7499a94b7a2bd1712f1a", + "0x0915cba504981b19d6f53c995ba3604bf3de616a1a6bd3759b398a5d90e24e176a05e9dc638978400983b610b9f7501e49155663714a078df378de55d05316b29c", + "0x092117dac84ff3dc2cdee910557bf7a16284dbe01c4f931825930b624db9d6fd82291b27340a19a4fd864d09d06d3960aa68eea31f1e2602e59174b0393eee25dc", + "0x0920cef06fe19630bda74593c0275f99d338e1e8834104bd8521bc105fd244da940879c20326089af5838976b5e646a16d9394299fda517fc5a4021bcb9a32bf14", + "0x060f06127668bb1bdd54f6294e02b62b0098b7cc5ed0140cbcf437bb5a55a7412b0e389db460936612ba19bf09059808e82687225b4c0d7fc30ec6615020c6c43a", + "0x041578b561ae8e97e3c6cdd2fe55167ee977e55548f3010b69ed60bf9e61c9eaaf05080000000000000000000000000000000000000000000000000d890000000000000001000000000000000000000000000000000000000000000000000000000000000000d104141476a49d03dbb3095d98279c508eac76c42280d89037984dea0f18fa1747624a26df7a2ccc64170f9fdf64b98868e36285f4f3d3418bc63b1cac3a4522077695cc1515e749aea246da1c0832429ec8db834be69a840c496c187d5bd520cf7ed3acca5a467e9e704c703e8d87f634fb0fc9000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xFABB0ac9d68B0B445fB7357272Ff202C5651694a": [ + "0x09216a6bbacd13a635ed028c3456f0127403cb3a1875a02fcdc9f84bec7365f9f414bce13a0efa58946ea2bd4b706d2c2461c213cb1fbcc9749729b92a67e62bbe", + "0x0903ccd7dc4f1c41883f8de90dde6ab2f83ad2c7f12f1c4b566b72b43ea277a85f05f5defed09a32bbf4f7fd47476dc172173d27c2b98fd0112ee8b94fc2ab72e2", + "0x090e16a3f7fafe552e7e8f49deee6d7a1fa93ac9df65ee242cefbabd50568539610f4be945f00183f6833f932e2021f6ff5698622457524a20ce21a3921aabce3a", + "0x092ee6a5cff1508574915e5c5fa61134dcb9946427ead4b12c3273e9b97a0b77a6001854e8380fbd58620925780f3ed2d0abeea5a13b4e0a4e0a51f59b9b5ec3c0", + "0x09174cfdf2f1e0c6fe4cab85c20ea084898c0e359ada326bd1d38abce77a6ea2492137ebae927de9055c704eaf20176efd3688db2f24e0b7e0a197ed67abc806f0", + "0x0921e218fe94e8e55e46d83b3c61bc6d8f60c2262bf59669299b70dcfe52d8b7442cd91c7a4c36943da038bcb35dde8dd004b83e190a17e35d1bda9011ae062f99", + "0x092173e847844f75d655ac0690b26ee3bf3e65a3c0062f9b9be566e74cd41927df12b7fd5527c406a10b999c59c3c6a1f781797558a36b7fbdadd2d2cf435c1e25", + "0x07000000000000000000000000000000000000000000000000000000000000000002c01b849e25a91dd222e8d006ae918579a6bff12484cc758a8c43c8d6ce0017", + "0x080931f89fedde2fe071003121dcbbc15662cc71fc96127a81b17ca72f1dc81d620000000000000000000000000000000000000000000000000000000000000000", + "0x070d53acb57a8c223e5af81f5dbf1d80922525be5a8d4e45f5f09ff8580a16e210159ad10b4c89ff16157cc364c81f6039eeea9a8eb87e4b4700249219e71cc3ef", + "0x0403d2c88868dc8b5f7994604147a8246c48cc905235de980c42c3e78f351f00c505080000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000f76b616411d0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420fabb0ac9d68b0b445fb7357272ff202c5651694a000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "storageProofs": { + "0x5300000000000000000000000000000000000021": { + "0x6d01ba8ffed4ce500f24b73f45df7dc163a96f64ced987d8ee795c34e371362e": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x091e999ad0969a892635449070e98a13e662492f946d6ba9efaccf52ab53e7875e2cbbe5bbc301a45411f8c9d9639b312ddcaffd9fb0598f3bf73f656f309fcb4d", + "0x0904314d470dc20d9ee18b9434c6fff6e9cc5c211a2e469cdeb00b69942bccfb7c0b567c74e6484b887c320ed6b5c14a50a89fe400b3eb13ed5a5e86880a65aea0", + "0x061c7c2370b89156b28f4141e6320159e799f8353ac328f91eadd9c65a06fad2a628b3bf9a92d906051defc60a366063e6d133f3bb15dc661dad6b57e1f51f95e6", + "0x040959c4a1b3fc665dce20b30216d51dd0141a6738567cfbbf2054a1bc710af948010100000000000000000000000000000000000000000000000000049824fc6fcac9f3ba206d01ba8ffed4ce500f24b73f45df7dc163a96f64ced987d8ee795c34e371362e", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c1f": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x0919e44f4c1854907175b4b2b5a0c96536103adcca1baf40cffa44b0331a8901db2603c9a992dc69a6b684dc301f77cc1c4e9e8a4dd972d15f4cd2ed974c4a79cc", + "0x090dec3fded5debc4bba8aa761a657e8f3bbf01043cb27c6fe8889998a0887b24718683552e0d0dfb464626d6d970adb45c97d9934acaa537b7d7ac0539b53d359", + "0x0813405dada82f833e1a1f8a09f3d0272ad6b162baccede0af919f196392fcd8920000000000000000000000000000000000000000000000000000000000000000", + "0x0723e0dc8d0a6f591ebd77a74f4ee964c81484fbcd8ae0c8bada311e7bc460d959281d441c8ab855399e0f22d4ebf178922d8477c39622fc2c4d9eac325eef6f12", + "0x040e11aafee10c1ada84b19baca77f65014d45b4d26b4ce3aef99a36898199d98601010000000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc920f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c1f", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c20": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0910baa0679dfabc98a749e2cf19cf380cf168c5963ed340eb8793275881f1aab91a61ae832a78b0c5b49d6624e781530d6b4a5ae6747aa8024bb5e00238b397e8", + "0x09128488b0bbdf573df71a726be2ff9a53c1c3ebea2d83da9bc818082d6114154e2f22abdf8825ed09c438ab5e357d601c5008c108986a0f79604020d03dd5658e", + "0x092ce0544b0f1037241d83b784217e1db71aed02f6bb6cbae678f12d8193e6fa561125c8bd98a62433fd57539d6de2d621f4f27c9a5a0a131df210d20fd063a298", + "0x0914bb75030a49de47a3568a2e726e3917e1508d35184c4436116ab72a8d57e65d08d136d73cfd57d8c8015158a423a463519cf14810f6d417259b71dd7bf648d6", + "0x0803dcf8e3b0f9009bdb5cc45234cdc34d8b90bc39e93768b8e8ff8688e950f15f0000000000000000000000000000000000000000000000000000000000000000", + "0x0617b0f320c1804f82f63a90e5e742227da35743a460ca351c5b6fd9481941d68a300c25969dcd82b2b69e782cd8d7535ea8d97f409cadb1187efbe5d940dce947", + "0x040ce6415daf9119eaa403a2266a11c8e6ea133c74e056da323547a0115ecd9f8901010000000000000000000000000000000000000000000000000000000000000000000420f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c20", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c21": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x0919e44f4c1854907175b4b2b5a0c96536103adcca1baf40cffa44b0331a8901db2603c9a992dc69a6b684dc301f77cc1c4e9e8a4dd972d15f4cd2ed974c4a79cc", + "0x0925ffe896678956add403385939c3f41f2db8bff412c9cc8d8f0590cef223288f1bbbbc549a61adc7a091da47883f9c34951e785f75cce8226f3ffdd7189d71b4", + "0x09282aa159b4c043af9c744e12ae4c4836a6fad029715cd87972d9b86e31466cf505f95afda0666a080bb144051a34ee842f918d97623213ca6c0b3537d6aab3d5", + "0x0923dcac699b2bc22dc2f7fa81bf06b44a951d3142c20fc0663b738e658d07ad6204469cd5cb700f31d2934e01feb4321e5be7476821bf1dde82369b6d764ec9dd", + "0x081ecccb20e28882de75addf9eec71a1b14d8fa7b4bd8d7322c4a3dc98c2e085d70000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000001a4fed6b9ad33da7ca3fff4cfb1669e16d80ea7547466dc8dcd67313b34b8787", + "0x082e81ca75173eddf06730891a8f9596f671a7d43cfff11669d4dbfda376538f3e0000000000000000000000000000000000000000000000000000000000000000", + "0x070000000000000000000000000000000000000000000000000000000000000000045d9db03e27071fd4b78117e0e472e06a4eb440617f3ed1e684a5f352856f1f", + "0x080b54e05661b49468d95e43a2ea570347ee51cf309b34b76425adde9b4811b50a18d1292738ab018ea00b3f5f4def62bd9396f9d1caadf29c4be6f2c4833e8035", + "0x062b11db9f1c375e2991097c0da6db9f65ee67825fec9a9613755ca0814cab2fc10154484431d37f9c311e65c4a516c144975b04c404eae5b908e141b3df6ccf92", + "0x0409130a06ba75cb64ae567f1af4e20969bcad96dedcf63d1e434f3f6dc966ca9201010000000000000000000000000000000000000000000000000000000000000000060120f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c21", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c22": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0910baa0679dfabc98a749e2cf19cf380cf168c5963ed340eb8793275881f1aab91a61ae832a78b0c5b49d6624e781530d6b4a5ae6747aa8024bb5e00238b397e8", + "0x0901dd7acbf5ebcbdec718df5774b877e62c16725cd43f07a7bbed7920c5825bb827d74048a99c16ca943362467a7232acba34083af75d10df8c6db36857d01b4c", + "0x0900dc2acf77d008cd9bc982319f8ecdd4d2ecff285b0b66882f4fa9eb1dff1f29183cf679b7f04d5c7327a1bfbd66754f84cc0a9e47ece70d5a7369ab612aed42", + "0x090b90fc0f2f16ef66c025e559d404c4d5fc49562899599a5348d307090c6a4e75078a35b037fa17e0b7801e7df716d17bf9015921ba9961df657c5776da6cc41f", + "0x072415b967f38129cf7e76297d7eb0462e470ee8a443503d59b3b1faecb081590829ea4234c57072a69a28d9575d618f0432d8cc99c29689bd3fda0e3954fa1918", + "0x08028439355a6f136af7432fe618a91dca0933acbc2375aa0a1ca90633b928815811a4b142f80899b94192f56c30e2545b0f60d45246f89520b827da4245440b0a", + "0x0426021fba3d566dfc3284c8ace6e55cbf07f0864ebec2f8f1a14e7d1d1294ecf70101000000000000000000000000000000000000000000000000000000000000000f424020f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c22", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9": { + "0x8c37336c8eae88ad7bbf871a6a05192bff663bf13ee0773449221a2afccbd95a": [ + "0x08186261f164d172d86030901884e0e0894df14c5868734e9524e241efdcae59ef16e1d5770cd48f89026856129d8563d65d8b9d76dc4c6f184b78343336d17e5c", + "0x092fb4940211e18006dd4e7541ae6e25a62a35287d755f00ad8f739309226c57630642e0e45ae73a2e452361460d3b6298d6c52b81b5da63a8abe5182d3ef796ed", + "0x081d82c353120820209adce6bf429c0a355b06ba2c90d3f0d8044234409e471b820000000000000000000000000000000000000000000000000000000000000000", + "0x0607bb43435f21e2a4a7cf97e33ed02ffdd2d10733adbe4d98fd4b9530224b20f51d9020a017be10f06ff76ca3fe3902686c00672bf7f5efc10c05bee5cf88053f", + "0x04123a9464ab167aa30076139d8d977b716a85918f12de86764c00ee1a7c603f9a01010000000000000000000000000000000000000000000000000000000000000000000e208c37336c8eae88ad7bbf871a6a05192bff663bf13ee0773449221a2afccbd95a", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x9c35da83f88043b3115f30d93beacec49ca14b6238430bdff196a249c29baa80": [ + "0x08186261f164d172d86030901884e0e0894df14c5868734e9524e241efdcae59ef16e1d5770cd48f89026856129d8563d65d8b9d76dc4c6f184b78343336d17e5c", + "0x092fb4940211e18006dd4e7541ae6e25a62a35287d755f00ad8f739309226c57630642e0e45ae73a2e452361460d3b6298d6c52b81b5da63a8abe5182d3ef796ed", + "0x0725e5bc9d7850b93ca1a3491589373e5bfa543dab27fbe55d9379b661118d0ebc2ed7f4a01326364719bab2066d9f93e0d2ae52beb7b9bdd71a8f562c1d327342", + "0x062fb09da9a43db97179c9fd3b6a67827b5526e5978e1df1d7967a23deafdd5c1211af9d72891936e057a6fcc3c5e5973bd7fb35481b0c0f63ef4491427d5f230a", + "0x0408fce273ee0c1553e3b2eebd59ca7cb8a863be1f26eaefad72094e7d72212a94010100000000000000000000000000000000000000000000000000000de0b6b3a763fff1209c35da83f88043b3115f30d93beacec49ca14b6238430bdff196a249c29baa80", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + } + } + } + ], + "executionResults": [ + { + "l1DataFee": "0x0", + "feeTokenID": 4, + "feeRate": "0x49824fc6fcac9f3ba", + "tokenScale": "0xf4240", + "feeLimit": "0x9184e72a000", + "gas": 57993, + "failed": false, + "returnValue": "60806040525f80fdfea164736f6c6343000818000a", + "from": { + "address": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", + "nonce": 34, + "balance": "0x1fffffffffffffffffffffffffffffffffffffffffffff59776f638fc0477a", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + "accountCreated": { + "address": "0x8613a4029eaa95da61ae65380ac2e7366451bf2b", + "nonce": 0, + "balance": "0x0", + "keccakCodeHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "poseidonCodeHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "codeSize": 0 + }, + "accountAfter": [ + { + "address": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", + "nonce": 35, + "balance": "0x1fffffffffffffffffffffffffffffffffffffffffffff59776f638fc0477a", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + { + "address": "0x8613a4029eaa95da61ae65380ac2e7366451bf2b", + "nonce": 1, + "balance": "0x0", + "keccakCodeHash": "0xc7b27ee302d9a14a60d6350edff6b2b65e3dcd5eb2b3329fb9253abb467b81ac", + "poseidonCodeHash": "0x2dcbb172d9fd5ff2265fb005c1d57f6b6082d02d7422f22554ae26a2963993fd", + "codeSize": 21 + }, + { + "address": "0xfabb0ac9d68b0b445fb7357272ff202c5651694a", + "nonce": 0, + "balance": "0x200000000000000000000000000000000000000000000000000f76b616411d", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + } + ], + "structLogs": [ + { + "pc": 0, + "op": "PUSH1", + "gas": 9946268, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2, + "op": "PUSH1", + "gas": 9946265, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4, + "op": "MSTORE", + "gas": 9946262, + "gasCost": 12, + "depth": 1 + }, + { + "pc": 5, + "op": "CALLVALUE", + "gas": 9946250, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6, + "op": "DUP1", + "gas": 9946248, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7, + "op": "ISZERO", + "gas": 9946245, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 8, + "op": "PUSH1", + "gas": 9946242, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 10, + "op": "JUMPI", + "gas": 9946239, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 14, + "op": "JUMPDEST", + "gas": 9946229, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 15, + "op": "POP", + "gas": 9946228, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 16, + "op": "PUSH1", + "gas": 9946226, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 18, + "op": "DUP1", + "gas": 9946223, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 19, + "op": "PUSH1", + "gas": 9946220, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 21, + "op": "PUSH0", + "gas": 9946217, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 22, + "op": "CODECOPY", + "gas": 9946215, + "gasCost": 6, + "depth": 1 + }, + { + "pc": 23, + "op": "PUSH0", + "gas": 9946209, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 24, + "op": "RETURN", + "gas": 9946207, + "gasCost": 0, + "depth": 1 + } + ], + "callTrace": { + "from": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", + "gas": "0x989680", + "gasUsed": "0xe289", + "to": "0x8613a4029eaa95da61ae65380ac2e7366451bf2b", + "input": "0x6080604052348015600e575f80fd5b50601580601a5f395ff3fe60806040525f80fdfea164736f6c6343000818000a", + "output": "0x60806040525f80fdfea164736f6c6343000818000a", + "value": "0x0", + "type": "CREATE" + } + } + ], + "withdraw_trie_root": "0x27ae5ba08d7291c96c8cbddcc148bf48a6d68c7974b94356f53754ef6171d757", + "sequencer_set_verify_hash": "0x22efe8537c043bf1a471893cba84c8cd29a0d3ea62ad7c4ada032136254ad6c9", + "startL1QueueIndex": 0 + } + ] +] \ No newline at end of file diff --git a/prover/testdata/altfeetx/trace_failed.json b/prover/testdata/altfeetx/trace_failed.json new file mode 100644 index 000000000..4ccb5569b --- /dev/null +++ b/prover/testdata/altfeetx/trace_failed.json @@ -0,0 +1,1543 @@ +[ + [ + { + "chainID": 53077, + "version": "2.0.8-mainnet-a99f2d52", + "coinbase": { + "address": "0xfabb0ac9d68b0b445fb7357272ff202c5651694a", + "nonce": 0, + "balance": "0x200000000000000000000000000000000000000000000000000f76b616411d", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + "header": { + "parentHash": "0x14c777888f322d1b156c0207be76ce4e40132e833f756651acec589500598651", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "miner": "0x0000000000000000000000000000000000000000", + "stateRoot": "0x10563d4bea8f2e78fe23915bb68ced24fcbd825adea848912395082e568ca73f", + "transactionsRoot": "0x3b1c19edf582497290c5ca07b053feb41b25f583e9202d14fbb3e16bcd832b24", + "receiptsRoot": "0xf506ac5fe0a1ba2c64cce9470432b568590d4e6a0fa7f5d5c6b0013831eaa2a2", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "difficulty": "0x0", + "number": "0x849b", + "gasLimit": "0x1c9c380", + "gasUsed": "0x5ec3", + "timestamp": "0x69269d86", + "extraData": "0x", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x0000000000000000", + "nextL1MsgIndex": "0x0", + "batchHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "baseFeePerGas": "0xf4240", + "withdrawalsRoot": null, + "blobGasUsed": null, + "excessBlobGas": null, + "parentBeaconBlockRoot": null, + "requestsHash": null, + "hash": "0xb630b188d1c1fdb4bc7589edf763c3287629d0c27536e6a55a34009514dd9149" + }, + "transactions": [ + { + "type": 127, + "nonce": 25, + "txHash": "0x324a6a138627ea6712bfe567b06cb231b6472e10c95bbd5eff12ee3e1141aa14", + "gas": 60000, + "gasPrice": "0x3d0900", + "gasTipCap": "0x1e8480", + "gasFeeCap": "0x3d0900", + "feeTokenID": 4, + "feeLimit": "0x9184e72a000", + "from": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", + "to": "0xcf7ed3acca5a467e9e704c703e8d87f634fb0fc9", + "chainId": "0xcf55", + "value": "0x0", + "data": "0xa9059cbb0000000000000000000000000742d35cc6634c0532925a3b844bc9e7595f0beb0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "isCreate": false, + "accessList": [], + "v": "0x1", + "r": "0x1c840d8b5225024696003c0319eb13d0b56ad0ca5d90712ae9b9d86c7bce02cb", + "s": "0x4c323a7f293f7e0cb66effe3fda1626c6f2137bff3170425ae00916928f83891" + } + ], + "storageTrace": { + "rootBefore": "0x20ef55b0db0ceef9a8b7567f1c91a5f56fd685a6823a82b5cbdb0d477fcce917", + "rootAfter": "0x10563d4bea8f2e78fe23915bb68ced24fcbd825adea848912395082e568ca73f", + "proofs": { + "0x5300000000000000000000000000000000000001": [ + "0x090d5f0601492d2b40aed1c16c212d6d69625a86cd71db3775ad04ec096bf69d9c0945a68442de32a3681726f799768fdb2df560c690137da3cab36db05a1800e2", + "0x091113f1a3b0be7618ebd2f7c7c82c02ddb86240a7449a744e9ba58c0415b3c0c40e70eb8c482f863b571a8f7df494058ed161b481c623557e575b3cbf9ace6744", + "0x092dc8bcc52b5bf24ee1ae627059ebfde2c83d3c3389610f08050f11e9f6a437720a7e335771fa2c19e0bd11dd9604968aa7a81ed4ecf74bda066058c70cbaebf2", + "0x090148e32ea3877d9a2f510bf3ebeb1c9c3d90d79033bf6a2a912db89122983e1006921c2f3b60bbd12dae3fc369a599b847b18e90e7cbb03a76e5a43f895671df", + "0x091037dd57995a394370ce77d18031e7fdd716725f6cd90a047d8c84c88da15d2c05439eeedb12605248ea72151df5e0b74353566dadc219214393e36290243f63", + "0x090c311950521cda0cdca65f368c0fca2eae6b063232fb84eac9ed027e9834aac8183d898dec71e85c4ba675301636453030beea2a744967a50159574a47b0c9f6", + "0x091cde134960925ee62cea9c340d6241c548fa0978ceca2965c87acccaf8b2805322d288ea2a9d771a19771658abf5a64fd503f4ed277aa8d6f779137a88ea1c8d", + "0x091dba2418c5fdd917fcdeff144d6017c58fac6c5ab448ef2a790ab85e36f9099a20a8a95c49033e899476e2d9c2c98bf1ec0d3423c4d3f31ddea9af65a3a27945", + "0x09220b163279be211a426832f5ff47e0ecadb5bd5eaaf0d62189998fde4e14e629126d21b3294439db0a7819880feb71e44daa89510b4e7415bad226dafdba0c1d", + "0x08150feb81fe1639286c75adb93e5467d36ad52d9ff00e0c706bc5345f6dcd49500000000000000000000000000000000000000000000000000000000000000000", + "0x081cb430cbc5dd11f62a713fb3656184085386104dc53fc135fb3c56dba49670500000000000000000000000000000000000000000000000000000000000000000", + "0x060c320ff8f6c3907ae6df62a7fe70e2be093390bd246197d5f56b6bce56f513f812fac8f51e3812914c097147217411381b9b2dad76963ef63c261885d3a49223", + "0x0427cfcbd2fe87474008e199ef5bff09273803bbf38032c75a36a7726b3c88f8a205080000000000000000000000000000000000000000000000000aec000000000000000000000000000000000000000000000000000000000000000000000000000000002198e2c16011cd18ef5be82557ea4552a16cc88ed8026d68fc38a18776550fa944107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f8400", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x530000000000000000000000000000000000000f": [ + "0x090d5f0601492d2b40aed1c16c212d6d69625a86cd71db3775ad04ec096bf69d9c0945a68442de32a3681726f799768fdb2df560c690137da3cab36db05a1800e2", + "0x091113f1a3b0be7618ebd2f7c7c82c02ddb86240a7449a744e9ba58c0415b3c0c40e70eb8c482f863b571a8f7df494058ed161b481c623557e575b3cbf9ace6744", + "0x0918ec3f04aa26dfe2fdb34122691277175ffeb34b57b96de91a11020d796b5b3713902a3a20e59ede1f0a63ec1691b4b04331d2973b13110a566b6dd7029f3276", + "0x092095e03a6c163738018ddb4e1cdc171ed8306b711a78a59e07798e60d974a8f52e51ae1fc969dfd817613e2e6ee8062cd343612928fc1f2a8be5a4053032a3e0", + "0x090430edc094dcb51bb128e4db1e27812218fcb3b88806da90445fe07b5ca18e3006767c9fc9e8eb4a72272bf69aef6ef5cf6ab77620acf76754cdff87c31dfa41", + "0x090d2955877b59dd23203eda776f580ddea39d387b90e4178cc7fb41f83080ab1c1558ebda9c7a671a601af519b323ca394a262519dacf80a90f66dc0ce90e6572", + "0x09101b44cf1f33794d2a3078cb1acdfc64b79980839d80127d34998e67a32c6aa42a16300f95ebb8c46e4e6ede02b7fa4944ecc1315bc8b7a2de274188b5f6f6d3", + "0x0923bfab6f7b9cc20bae8ca8989ad45df9625cf0c14ee54257ffd31b2593b8385f219d7fa978c4389f2ee5a1be328f17e3df180f18177925171afd5a1ae5493b93", + "0x06179596d8aa933023605d9c3eaad2b08f7893d5b65f8ddce4d36c97f541e11d892a868ae99ff40d43cff3f28ff0655bf467eaa89e3d3a1493203e4abb26099b3b", + "0x0418a86f98026d1a55f6fee616f04d51be16c033651ffaafb0514287ec067d04e805080000000000000000000000000000000000000000000000000aec0000000000000000000000000000000000000000000000000000000000000000000000000000000002f56e29848865e204296c51c2fa18997db9888d7dd5a3e9ed3c726e278c099744107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f8400", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5300000000000000000000000000000000000017": [ + "0x090d5f0601492d2b40aed1c16c212d6d69625a86cd71db3775ad04ec096bf69d9c0945a68442de32a3681726f799768fdb2df560c690137da3cab36db05a1800e2", + "0x091113f1a3b0be7618ebd2f7c7c82c02ddb86240a7449a744e9ba58c0415b3c0c40e70eb8c482f863b571a8f7df494058ed161b481c623557e575b3cbf9ace6744", + "0x0918ec3f04aa26dfe2fdb34122691277175ffeb34b57b96de91a11020d796b5b3713902a3a20e59ede1f0a63ec1691b4b04331d2973b13110a566b6dd7029f3276", + "0x092095e03a6c163738018ddb4e1cdc171ed8306b711a78a59e07798e60d974a8f52e51ae1fc969dfd817613e2e6ee8062cd343612928fc1f2a8be5a4053032a3e0", + "0x0910b1ec1393c71d2fb5f6024dc8b3b21f75c8de647d481b0121dce322076582d82ca08ae593596704180b0f3f4c8f0bf9f9c8831cff2868f401b67a261813c939", + "0x0901603144c1255abe7e4dccedabde2d3acb83cccfc845602366ed7db86fcea8062dae21e4c5cee679a94325a7d6f9aa0b595a42f165e7bcda729f860111329f61", + "0x090e11cb818c1c31b2c42077bce95e1ac83faec4262e3d214f20345931b381488e1fa1e0f8d195352fc7dfdc1d2cca64062e326f1a44490fb1f715293dc5d56d67", + "0x071e7b646383bbd8defcc230d420cefddd4cae409681ef74ff98bb66527c23473c292161f39efa24ba2d072e47064c6d7ebc45e7890480005cd78d89dc640091c0", + "0x060e3d168eba427cee8d7be26b10e66d5d21b0301485d3cac9c45470fae67ad5031d49523b9f532097709c6c724d41ec10986bc0a4e5d078f5e9f861b56d91b773", + "0x041918c47a133f759975cc95c0dba82051d9b5cd65407e76ef1366a9deaa14f28005080000000000000000000000000000000000000000000000000aec000000000000000000000000000000000000000000000000000000000000000000000000000000002c3cbfa3d0183eb2e332389ef0c7a5e5d73cf155103c3ac0eddefa9e2beae91c44107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f8400", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5300000000000000000000000000000000000021": [ + "0x090d5f0601492d2b40aed1c16c212d6d69625a86cd71db3775ad04ec096bf69d9c0945a68442de32a3681726f799768fdb2df560c690137da3cab36db05a1800e2", + "0x0909c057bf1d02da7c2b51c75e0338b3c80358ba4c3af465e6318648e9868b7be6208462254e9177dbf08a29ff9494095ec64e93bec2ec796e217563145f0fad72", + "0x092a06163d398088f873c062a317a00fd3db764138a54e7cdc629709208dfa6c1f2ab7c93f4ebade6be1bc046106f925db37fed7a446cd293c3ddcbd27f4cef213", + "0x092cb3b11908a52cd926de960bc1605ba0ca074809eb4b4eeef23b306cdc8a8774049c9ba7546167504538f67af40a08189fe0b869af3172c62b4c748af3580b28", + "0x0913028f68e22d222f43ddc69482acfe4fffbbb3180065d5f00d63d2d839ab86c718be689dee79760972a42c9c0d3f6b4cc1acf518425ed10b445d1b3798822455", + "0x092638133fc9368332440781bda5fd3a9ab693ecb89f611f26acc785e68e181b7e0e520de80cc858c66d2f4dc02567bbe08c1a8f2bdfef6b10355fb2218c77ec0a", + "0x092166504c35825475687da93a700c997aadb255261bc6ce18ff61cd7182db14122cc3d3cf55c0beec2b0f09e350473bd703a8a84463f135d2c2d45ca19f34503a", + "0x091c746524ed2bcb228d6ebf9953357bb1b618a23fc2fe4302df1108a8a0e35ba122aeab44900556acd8bdd693a47952cb01f194cd72e12a550c7fcbc971ed742f", + "0x08244257efc46fd96db45b1505e03603f8b611a3e9ac4630d1fc9b01b4f5fd714117fac506dee79e5f7f52cb7b1eb174b441f0adee2a477e9c1680eeb5913a7eaf", + "0x071e6f5cd0c216a9cf74d9a8ce13256dd8970a07efacb2c61df9e3a4faab03c2de08738589134993085ec4962792e46613a66798325b297c93eca9ded9189ddfd2", + "0x07084f4e6b01a5eda178901c705a9a69b829618c6785a38c831ad467dc7c2d449115e4567e1f83d13a7fe610cca9aa17ba49bce22eb2edbc7f6242f42dc0c1dfd4", + "0x061dbb1f2fe996371625dbfaa5cd6ca070ed15c020c94e65344db5176087c17770242bf081ac926273432685f64c22d3603904df8edc4ddd3d1724817b14a6b8d6", + "0x040883d4562dfe8ba7ad8176bc2844d35ecc486199d589a152eabcee8398f3aebb05080000000000000000000000000000000000000000000000000aec00000000000000000000000000000000000000000000000000000000000000000000000000000000036c7b3f0434b9a4c98814ec5bfef913a8a785403fcc22d17f1adef51905db1a44107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f84205300000000000000000000000000000000000021000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8": [ + "0x090d5f0601492d2b40aed1c16c212d6d69625a86cd71db3775ad04ec096bf69d9c0945a68442de32a3681726f799768fdb2df560c690137da3cab36db05a1800e2", + "0x091113f1a3b0be7618ebd2f7c7c82c02ddb86240a7449a744e9ba58c0415b3c0c40e70eb8c482f863b571a8f7df494058ed161b481c623557e575b3cbf9ace6744", + "0x0918ec3f04aa26dfe2fdb34122691277175ffeb34b57b96de91a11020d796b5b3713902a3a20e59ede1f0a63ec1691b4b04331d2973b13110a566b6dd7029f3276", + "0x0903ec5f5935cbbb8710bce493dc1db7fd8548bee5e73d70f79a8c399c74d0d17224931ced24212206fa48a12d2f13412c1308ab073b7b877a7ccde133989601e9", + "0x09036c4fee62bb83d523b25829a9143501aea11f0d248381af88746cddffffcb151fde04aea918ea5662d47d91e3d2374cf1f8f5b127345f3c91878076707c70f4", + "0x092bacc030e7201c95030a1aea2839ee9bfee02262d8e0675495fea4338bdfa5060165dc730091c620f135abb2a8069f70d111fe7347753cef01b1d61a76d26a29", + "0x0900f088c016ba77fd9f92ce70ea2a1d105cdfc6c6a5d9186a2c187134d4c5a4ee1c24d91bc55f73a0b5da1533c06933b2329fedbb94bfaf55bf9b54979d6090a1", + "0x0819130f07c5df8015d7f52df82617bbc4386b789449b8d4a3a7ce5d787b0b785a0000000000000000000000000000000000000000000000000000000000000000", + "0x0822d381e78bb6e50e7ba420e48dd800c957d5cfb3c12f7bb8b886c2cf7fac5e3b06e472ddd7d943df55f637fe19920ec05ca83ee7545c04414fc9f95934235b09", + "0x0407edffb2f516756416f9cd6da120841b708d8ba8e0ae76133c0022b273252174050800000000000000000000000000000000000000000000000000000000000000000019001fffffffffffffffffffffffffffffffffffffffffffff59776f638fc0477a0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b648642070997970c51812dc3a010c7d01b50e0d17dc79c8000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9": [ + "0x090d5f0601492d2b40aed1c16c212d6d69625a86cd71db3775ad04ec096bf69d9c0945a68442de32a3681726f799768fdb2df560c690137da3cab36db05a1800e2", + "0x0909c057bf1d02da7c2b51c75e0338b3c80358ba4c3af465e6318648e9868b7be6208462254e9177dbf08a29ff9494095ec64e93bec2ec796e217563145f0fad72", + "0x092a06163d398088f873c062a317a00fd3db764138a54e7cdc629709208dfa6c1f2ab7c93f4ebade6be1bc046106f925db37fed7a446cd293c3ddcbd27f4cef213", + "0x09055073efa8d18f7b39ca93783a3d0757684b088fa9c40989ecdd11a6582d7d2203130a72203b5ddefeb301051872b6b7e9fb6cea3475f6bb07f17ae75a1c4586", + "0x0926ec68edc4b0334a2c828d20135465779c5cad735775d05d3a6ce7517424b0d705e9dc638978400983b610b9f7501e49155663714a078df378de55d05316b29c", + "0x092117dac84ff3dc2cdee910557bf7a16284dbe01c4f931825930b624db9d6fd8219c1814d6313ad2f209e1944787ce32aef9b15a13cfc2335fc30b41ec8c1e87c", + "0x09134e9c9bbb21aaf7377005e95bde32a73c78868f650a37445bffc890028419e50879c20326089af5838976b5e646a16d9394299fda517fc5a4021bcb9a32bf14", + "0x060f06127668bb1bdd54f6294e02b62b0098b7cc5ed0140cbcf437bb5a55a7412b10c278205ae9d0cee240f9803048e6c494445bae51cea6b345052dad60527b8c", + "0x041578b561ae8e97e3c6cdd2fe55167ee977e55548f3010b69ed60bf9e61c9eaaf05080000000000000000000000000000000000000000000000000d890000000000000001000000000000000000000000000000000000000000000000000000000000000018ee20cb49420acf288e7d3b22e0084da13ebbe7e803d5429b5b483d72f402551747624a26df7a2ccc64170f9fdf64b98868e36285f4f3d3418bc63b1cac3a4522077695cc1515e749aea246da1c0832429ec8db834be69a840c496c187d5bd520cf7ed3acca5a467e9e704c703e8d87f634fb0fc9000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xFABB0ac9d68B0B445fB7357272Ff202C5651694a": [ + "0x090d5f0601492d2b40aed1c16c212d6d69625a86cd71db3775ad04ec096bf69d9c0945a68442de32a3681726f799768fdb2df560c690137da3cab36db05a1800e2", + "0x0909c057bf1d02da7c2b51c75e0338b3c80358ba4c3af465e6318648e9868b7be6208462254e9177dbf08a29ff9494095ec64e93bec2ec796e217563145f0fad72", + "0x092d621412af735183b4c159eec9e06b27b454b936b945115f719a8150cd199b190f4be945f00183f6833f932e2021f6ff5698622457524a20ce21a3921aabce3a", + "0x092ee6a5cff1508574915e5c5fa61134dcb9946427ead4b12c3273e9b97a0b77a6001854e8380fbd58620925780f3ed2d0abeea5a13b4e0a4e0a51f59b9b5ec3c0", + "0x09174cfdf2f1e0c6fe4cab85c20ea084898c0e359ada326bd1d38abce77a6ea2492137ebae927de9055c704eaf20176efd3688db2f24e0b7e0a197ed67abc806f0", + "0x0921e218fe94e8e55e46d83b3c61bc6d8f60c2262bf59669299b70dcfe52d8b7442cd91c7a4c36943da038bcb35dde8dd004b83e190a17e35d1bda9011ae062f99", + "0x092173e847844f75d655ac0690b26ee3bf3e65a3c0062f9b9be566e74cd41927df12b7fd5527c406a10b999c59c3c6a1f781797558a36b7fbdadd2d2cf435c1e25", + "0x07000000000000000000000000000000000000000000000000000000000000000002c01b849e25a91dd222e8d006ae918579a6bff12484cc758a8c43c8d6ce0017", + "0x080931f89fedde2fe071003121dcbbc15662cc71fc96127a81b17ca72f1dc81d620000000000000000000000000000000000000000000000000000000000000000", + "0x070d53acb57a8c223e5af81f5dbf1d80922525be5a8d4e45f5f09ff8580a16e210159ad10b4c89ff16157cc364c81f6039eeea9a8eb87e4b4700249219e71cc3ef", + "0x0403d2c88868dc8b5f7994604147a8246c48cc905235de980c42c3e78f351f00c505080000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000f76b616411d0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420fabb0ac9d68b0b445fb7357272ff202c5651694a000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "storageProofs": { + "0x5300000000000000000000000000000000000001": { + "0x0000000000000000000000000000000000000000000000000000000000000021": [ + "0x0825bcd8ed4a7e39c0f0e835761cda36131dd34f16de95765d2216d997923a52f60e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200", + "0x06216372aa3165a29ee67494a5a9680358be92c254cc5724949e4d52742ba8d57f02a40b5614637fca2783d673559f035f5f5a0588ee27d164bb5375568493200a", + "0x042f683d080c393f5fb2ade2190fd56e8a5e8fa26533acdea8cce25caa236027cc0101000027ae5ba08d7291c96c8cbddcc148bf48a6d68c7974b94356f53754ef6171d75700", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x530000000000000000000000000000000000000f": { + "0x0000000000000000000000000000000000000000000000000000000000000001": [ + "0x09250fbf2587e7f07f1dd72ac26e3245705f67157a2e402a60bcb9c861b5a4d3f7256fbb55c0a0ca65679134f25a5a893427348f9086273c801ff4633c50899f1e", + "0x0904657f17b545183e86b0545adff05a99f8efe788d72e90e01784a1b9f986e35a162b4d479ff13f2af3f0cfaadc6bccc8622dd980f83c7014e947f50577eedaba", + "0x0804422082d7197f691b32c2c4120b44e674d5bd50d4b210f0d4525906237d29871e144bbeb8f4c147dafacf9567e13b1b15e4804a9d74df2da7619735d765c1be", + "0x081341967c7422e5508fc72463c51ace718e18440d00db082bf2184d906f2c9ad90000000000000000000000000000000000000000000000000000000000000000", + "0x07000000000000000000000000000000000000000000000000000000000000000006e79d86dd9c9fa893eb97cd43df98e2d19487b963520202b144a3f4b84f0c45", + "0x080e0f66ccb838bd67cbf343dadf696b6d2aa46137c6c82c4fd6ceaf8d60fe80d60000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000002634b0768a20cec85ef53630d7f4dfc6d1c8c8f76dad4d9014828fc94bf0ded8", + "0x080b10db1b542a2f6c809a2d2cd03aa0c4d4ddcdfd2a1c8a00dc06cdc12bbb976c0000000000000000000000000000000000000000000000000000000000000000", + "0x08144e4aeb02298f8f0545b923bc88172527f7ffdd24eb31a2dccfe887757beb0f0000000000000000000000000000000000000000000000000000000000000000", + "0x07000000000000000000000000000000000000000000000000000000000000000023413c0bd51b56dc557426037ffd25cae18e73e8f116ad6aa3a46aaba671f1e4", + "0x0628e14710ef1f9a6f539110a2d6c693d9389d38836eb9f0e0ea449d3afaede2a6156a0960a84fa4287f66d18b9c39ab9d403fa6b6dddd126f47758aadcb82e122", + "0x0426049ba6de63003492eb078a01a8aa4f4a0e67f28f0955c2eba9101d5d2eea5001010000000000000000000000000000000000000000000000000000000000003b9aca00200000000000000000000000000000000000000000000000000000000000000001", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000002": [ + "0x09250fbf2587e7f07f1dd72ac26e3245705f67157a2e402a60bcb9c861b5a4d3f7256fbb55c0a0ca65679134f25a5a893427348f9086273c801ff4633c50899f1e", + "0x0904657f17b545183e86b0545adff05a99f8efe788d72e90e01784a1b9f986e35a162b4d479ff13f2af3f0cfaadc6bccc8622dd980f83c7014e947f50577eedaba", + "0x0804422082d7197f691b32c2c4120b44e674d5bd50d4b210f0d4525906237d29871e144bbeb8f4c147dafacf9567e13b1b15e4804a9d74df2da7619735d765c1be", + "0x04020953ad52de135367a1ba2629636216ed5174cce5629d11b5d97fe733f07dcc0101000000000000000000000000000000000000000000000000000000000000000009c4200000000000000000000000000000000000000000000000000000000000000002", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000003": [ + "0x09250fbf2587e7f07f1dd72ac26e3245705f67157a2e402a60bcb9c861b5a4d3f7256fbb55c0a0ca65679134f25a5a893427348f9086273c801ff4633c50899f1e", + "0x0700000000000000000000000000000000000000000000000000000000000000002c627348b5769391cdf27c1c6ccd9e7363936623501503e7549c1df6542031b9", + "0x060ee2ca3e190e48951aa8d5bb00d33ba76a92de69a807dfa6f2eaa9881e303f320e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200", + "0x0406c50541f08911ad149aa545dd3d606f86ee63c751a795c7d57f0d3f85e6bdeb01010000000000000000000000000000000000000000000000000000000000003b9aca0000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000006": [ + "0x09250fbf2587e7f07f1dd72ac26e3245705f67157a2e402a60bcb9c861b5a4d3f7256fbb55c0a0ca65679134f25a5a893427348f9086273c801ff4633c50899f1e", + "0x0904657f17b545183e86b0545adff05a99f8efe788d72e90e01784a1b9f986e35a162b4d479ff13f2af3f0cfaadc6bccc8622dd980f83c7014e947f50577eedaba", + "0x0804422082d7197f691b32c2c4120b44e674d5bd50d4b210f0d4525906237d29871e144bbeb8f4c147dafacf9567e13b1b15e4804a9d74df2da7619735d765c1be", + "0x04020953ad52de135367a1ba2629636216ed5174cce5629d11b5d97fe733f07dcc0101000000000000000000000000000000000000000000000000000000000000000009c4200000000000000000000000000000000000000000000000000000000000000002", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000007": [ + "0x09250fbf2587e7f07f1dd72ac26e3245705f67157a2e402a60bcb9c861b5a4d3f7256fbb55c0a0ca65679134f25a5a893427348f9086273c801ff4633c50899f1e", + "0x0904657f17b545183e86b0545adff05a99f8efe788d72e90e01784a1b9f986e35a162b4d479ff13f2af3f0cfaadc6bccc8622dd980f83c7014e947f50577eedaba", + "0x0803f6f6d47db3a7888f229ead7798b1ae14eb8855585ebb4d70f6a2020ac30dbf0000000000000000000000000000000000000000000000000000000000000000", + "0x081824025e42aefa5d18b0a0c39ba03d737dc20b78e6574d948d80d82a52f727d80000000000000000000000000000000000000000000000000000000000000000", + "0x05", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000008": [ + "0x09250fbf2587e7f07f1dd72ac26e3245705f67157a2e402a60bcb9c861b5a4d3f7256fbb55c0a0ca65679134f25a5a893427348f9086273c801ff4633c50899f1e", + "0x0700000000000000000000000000000000000000000000000000000000000000002c627348b5769391cdf27c1c6ccd9e7363936623501503e7549c1df6542031b9", + "0x060ee2ca3e190e48951aa8d5bb00d33ba76a92de69a807dfa6f2eaa9881e303f320e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200", + "0x0419a44eca69f8d5e3651ccf05934126419470106b4b51bb4b96b6230b7d80236701010000000000000000000000000000530000000000000000000000000000000000000b00", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000009": [ + "0x09250fbf2587e7f07f1dd72ac26e3245705f67157a2e402a60bcb9c861b5a4d3f7256fbb55c0a0ca65679134f25a5a893427348f9086273c801ff4633c50899f1e", + "0x0700000000000000000000000000000000000000000000000000000000000000002c627348b5769391cdf27c1c6ccd9e7363936623501503e7549c1df6542031b9", + "0x05", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x5300000000000000000000000000000000000017": { + "0x0000000000000000000000000000000000000000000000000000000000000065": [ + "0x09295b90a00505079f65623858f8e164c095a86cfbb449412829e1fc988749139c2c08ec36e0b240f28727cc2f0e93b4b55b1214857f62e93cd895cd25d6b1fca3", + "0x0924e760587c9b1db469c29fecb46a7a69bf5102811e52577a0be8379118e3506115e6e9020712f91f6ee3d7b78613fdb79c35a4f68cf0438bb49ff403e3d93296", + "0x081e5ac2ec2032e7f34af7c72542b1ff463f5590272545e8a2f4f32e3b5a63eda30e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200", + "0x07165d00aa7e206c00402a408f8fd7708cade38a4505b733034b0395a63d9972db1ddc1c901911c636efb3e2c53251d143b3f5bb4271fb6b9e8837fc0c1f739212", + "0x0700000000000000000000000000000000000000000000000000000000000000002b22b7103e3a83cc758c8e8997b79b6e30988fbe8aa1924fdbe675cd6d5ceed0", + "0x0700000000000000000000000000000000000000000000000000000000000000001f4b453328057d0249978fe5ee1e635e4671f325a2bcf3449ef1637170859c43", + "0x0623965bae207a394b8516562f391edb1cdc19cad8d2aa324db42a44fd0810fd550a36302dbd0bcb8ba381bd22b85ded888e754404629c06c2b7801c87978dfd6f", + "0x042115c9b0a0938aa1ce2e8c01581e5aa931288249a453588de70cf2c5dae26a7b0101000022efe8537c043bf1a471893cba84c8cd29a0d3ea62ad7c4ada032136254ad6c9200000000000000000000000000000000000000000000000000000000000000065", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x5300000000000000000000000000000000000021": { + "0x000000000000000000000000000000000000000000000000000000000000009a": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x091e999ad0969a892635449070e98a13e662492f946d6ba9efaccf52ab53e7875e2cbbe5bbc301a45411f8c9d9639b312ddcaffd9fb0598f3bf73f656f309fcb4d", + "0x0904314d470dc20d9ee18b9434c6fff6e9cc5c211a2e469cdeb00b69942bccfb7c0b567c74e6484b887c320ed6b5c14a50a89fe400b3eb13ed5a5e86880a65aea0", + "0x061c7c2370b89156b28f4141e6320159e799f8353ac328f91eadd9c65a06fad2a628b3bf9a92d906051defc60a366063e6d133f3bb15dc661dad6b57e1f51f95e6", + "0x040959c4a1b3fc665dce20b30216d51dd0141a6738567cfbbf2054a1bc710af948010100000000000000000000000000000000000000000000000000049824fc6fcac9f3ba206d01ba8ffed4ce500f24b73f45df7dc163a96f64ced987d8ee795c34e371362e", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x6d01ba8ffed4ce500f24b73f45df7dc163a96f64ced987d8ee795c34e371362e": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x091e999ad0969a892635449070e98a13e662492f946d6ba9efaccf52ab53e7875e2cbbe5bbc301a45411f8c9d9639b312ddcaffd9fb0598f3bf73f656f309fcb4d", + "0x0904314d470dc20d9ee18b9434c6fff6e9cc5c211a2e469cdeb00b69942bccfb7c0b567c74e6484b887c320ed6b5c14a50a89fe400b3eb13ed5a5e86880a65aea0", + "0x061c7c2370b89156b28f4141e6320159e799f8353ac328f91eadd9c65a06fad2a628b3bf9a92d906051defc60a366063e6d133f3bb15dc661dad6b57e1f51f95e6", + "0x040959c4a1b3fc665dce20b30216d51dd0141a6738567cfbbf2054a1bc710af948010100000000000000000000000000000000000000000000000000049824fc6fcac9f3ba206d01ba8ffed4ce500f24b73f45df7dc163a96f64ced987d8ee795c34e371362e", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c1f": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x0919e44f4c1854907175b4b2b5a0c96536103adcca1baf40cffa44b0331a8901db2603c9a992dc69a6b684dc301f77cc1c4e9e8a4dd972d15f4cd2ed974c4a79cc", + "0x090dec3fded5debc4bba8aa761a657e8f3bbf01043cb27c6fe8889998a0887b24718683552e0d0dfb464626d6d970adb45c97d9934acaa537b7d7ac0539b53d359", + "0x0813405dada82f833e1a1f8a09f3d0272ad6b162baccede0af919f196392fcd8920000000000000000000000000000000000000000000000000000000000000000", + "0x0723e0dc8d0a6f591ebd77a74f4ee964c81484fbcd8ae0c8bada311e7bc460d959281d441c8ab855399e0f22d4ebf178922d8477c39622fc2c4d9eac325eef6f12", + "0x040e11aafee10c1ada84b19baca77f65014d45b4d26b4ce3aef99a36898199d98601010000000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc920f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c1f", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c20": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0910baa0679dfabc98a749e2cf19cf380cf168c5963ed340eb8793275881f1aab91a61ae832a78b0c5b49d6624e781530d6b4a5ae6747aa8024bb5e00238b397e8", + "0x09128488b0bbdf573df71a726be2ff9a53c1c3ebea2d83da9bc818082d6114154e2f22abdf8825ed09c438ab5e357d601c5008c108986a0f79604020d03dd5658e", + "0x092ce0544b0f1037241d83b784217e1db71aed02f6bb6cbae678f12d8193e6fa561125c8bd98a62433fd57539d6de2d621f4f27c9a5a0a131df210d20fd063a298", + "0x0914bb75030a49de47a3568a2e726e3917e1508d35184c4436116ab72a8d57e65d08d136d73cfd57d8c8015158a423a463519cf14810f6d417259b71dd7bf648d6", + "0x0803dcf8e3b0f9009bdb5cc45234cdc34d8b90bc39e93768b8e8ff8688e950f15f0000000000000000000000000000000000000000000000000000000000000000", + "0x0617b0f320c1804f82f63a90e5e742227da35743a460ca351c5b6fd9481941d68a300c25969dcd82b2b69e782cd8d7535ea8d97f409cadb1187efbe5d940dce947", + "0x040ce6415daf9119eaa403a2266a11c8e6ea133c74e056da323547a0115ecd9f8901010000000000000000000000000000000000000000000000000000000000000000000420f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c20", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c21": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x0919e44f4c1854907175b4b2b5a0c96536103adcca1baf40cffa44b0331a8901db2603c9a992dc69a6b684dc301f77cc1c4e9e8a4dd972d15f4cd2ed974c4a79cc", + "0x0925ffe896678956add403385939c3f41f2db8bff412c9cc8d8f0590cef223288f1bbbbc549a61adc7a091da47883f9c34951e785f75cce8226f3ffdd7189d71b4", + "0x09282aa159b4c043af9c744e12ae4c4836a6fad029715cd87972d9b86e31466cf505f95afda0666a080bb144051a34ee842f918d97623213ca6c0b3537d6aab3d5", + "0x0923dcac699b2bc22dc2f7fa81bf06b44a951d3142c20fc0663b738e658d07ad6204469cd5cb700f31d2934e01feb4321e5be7476821bf1dde82369b6d764ec9dd", + "0x081ecccb20e28882de75addf9eec71a1b14d8fa7b4bd8d7322c4a3dc98c2e085d70000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000001a4fed6b9ad33da7ca3fff4cfb1669e16d80ea7547466dc8dcd67313b34b8787", + "0x082e81ca75173eddf06730891a8f9596f671a7d43cfff11669d4dbfda376538f3e0000000000000000000000000000000000000000000000000000000000000000", + "0x070000000000000000000000000000000000000000000000000000000000000000045d9db03e27071fd4b78117e0e472e06a4eb440617f3ed1e684a5f352856f1f", + "0x080b54e05661b49468d95e43a2ea570347ee51cf309b34b76425adde9b4811b50a18d1292738ab018ea00b3f5f4def62bd9396f9d1caadf29c4be6f2c4833e8035", + "0x062b11db9f1c375e2991097c0da6db9f65ee67825fec9a9613755ca0814cab2fc10154484431d37f9c311e65c4a516c144975b04c404eae5b908e141b3df6ccf92", + "0x0409130a06ba75cb64ae567f1af4e20969bcad96dedcf63d1e434f3f6dc966ca9201010000000000000000000000000000000000000000000000000000000000000000060120f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c21", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c22": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0910baa0679dfabc98a749e2cf19cf380cf168c5963ed340eb8793275881f1aab91a61ae832a78b0c5b49d6624e781530d6b4a5ae6747aa8024bb5e00238b397e8", + "0x0901dd7acbf5ebcbdec718df5774b877e62c16725cd43f07a7bbed7920c5825bb827d74048a99c16ca943362467a7232acba34083af75d10df8c6db36857d01b4c", + "0x0900dc2acf77d008cd9bc982319f8ecdd4d2ecff285b0b66882f4fa9eb1dff1f29183cf679b7f04d5c7327a1bfbd66754f84cc0a9e47ece70d5a7369ab612aed42", + "0x090b90fc0f2f16ef66c025e559d404c4d5fc49562899599a5348d307090c6a4e75078a35b037fa17e0b7801e7df716d17bf9015921ba9961df657c5776da6cc41f", + "0x072415b967f38129cf7e76297d7eb0462e470ee8a443503d59b3b1faecb081590829ea4234c57072a69a28d9575d618f0432d8cc99c29689bd3fda0e3954fa1918", + "0x08028439355a6f136af7432fe618a91dca0933acbc2375aa0a1ca90633b928815811a4b142f80899b94192f56c30e2545b0f60d45246f89520b827da4245440b0a", + "0x0426021fba3d566dfc3284c8ace6e55cbf07f0864ebec2f8f1a14e7d1d1294ecf70101000000000000000000000000000000000000000000000000000000000000000f424020f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c22", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9": { + "0x8c37336c8eae88ad7bbf871a6a05192bff663bf13ee0773449221a2afccbd95a": [ + "0x080964ecbb51d64094366bf306459036c40c38542671461e90c73e235467fe010e16e1d5770cd48f89026856129d8563d65d8b9d76dc4c6f184b78343336d17e5c", + "0x090820650dc3e6ffef62d01299f6925ad8f4270e55deb53be2a39967ad550087930b8834b7bd42d2e79e249d9af970806951cb2060076605e66bd88bd46741a07d", + "0x081b08f08c1e27f3dffc26e587725cd74648ab8b957822265bcd51d8e028b683a80000000000000000000000000000000000000000000000000000000000000000", + "0x0607bb43435f21e2a4a7cf97e33ed02ffdd2d10733adbe4d98fd4b9530224b20f5028cff11be9da54d23c3aeea119475f9d27deb4a30d8619806d69ab5faeb8ee5", + "0x04123a9464ab167aa30076139d8d977b716a85918f12de86764c00ee1a7c603f9a01010000000000000000000000000000000000000000000000000000000000000000000b208c37336c8eae88ad7bbf871a6a05192bff663bf13ee0773449221a2afccbd95a", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x9c35da83f88043b3115f30d93beacec49ca14b6238430bdff196a249c29baa80": [ + "0x080964ecbb51d64094366bf306459036c40c38542671461e90c73e235467fe010e16e1d5770cd48f89026856129d8563d65d8b9d76dc4c6f184b78343336d17e5c", + "0x090820650dc3e6ffef62d01299f6925ad8f4270e55deb53be2a39967ad550087930b8834b7bd42d2e79e249d9af970806951cb2060076605e66bd88bd46741a07d", + "0x0725e5bc9d7850b93ca1a3491589373e5bfa543dab27fbe55d9379b661118d0ebc0c97be1c5db02d8af7ea3efc000d044b5445a7a9bc47e3606248a88d9862f43a", + "0x062ca036ccf19e96bdf99e61eed68723c402b477ee4cd8648e09e278e79d90436d11af9d72891936e057a6fcc3c5e5973bd7fb35481b0c0f63ef4491427d5f230a", + "0x0408fce273ee0c1553e3b2eebd59ca7cb8a863be1f26eaefad72094e7d72212a94010100000000000000000000000000000000000000000000000000000de0b6b3a763fff4209c35da83f88043b3115f30d93beacec49ca14b6238430bdff196a249c29baa80", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + } + } + }, + "codes": [ + { + "codeSize": 0, + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "code": "0x" + }, + { + "codeSize": 3465, + "keccakCodeHash": "0x1747624a26df7a2ccc64170f9fdf64b98868e36285f4f3d3418bc63b1cac3a45", + "hash": "0x22077695cc1515e749aea246da1c0832429ec8db834be69a840c496c187d5bd5", + "code": "0x608060405234801561000f575f80fd5b50600436106100e5575f3560e01c806370a08231116100885780639dc29fac116100635780639dc29fac146101f0578063a9059cbb14610203578063d505accf14610216578063dd62ed3e14610229575f80fd5b806370a08231146101aa5780637ecebe00146101c957806395d89b41146101e8575f80fd5b806323b872dd116100c357806323b872dd14610141578063313ce567146101545780633644e5151461018d57806340c10f1914610195575f80fd5b806306fdde03146100e9578063095ea7b31461010757806318160ddd1461012a575b5f80fd5b6100f1610253565b6040516100fe9190610a52565b60405180910390f35b61011a610115366004610ae4565b6102de565b60405190151581526020016100fe565b61013360025481565b6040519081526020016100fe565b61011a61014f366004610b0c565b610357565b61017b7f000000000000000000000000000000000000000000000000000000000000000681565b60405160ff90911681526020016100fe565b610133610497565b6101a86101a3366004610ae4565b6104f1565b005b6101336101b8366004610b45565b60036020525f908152604090205481565b6101336101d7366004610b45565b60056020525f908152604090205481565b6100f16104ff565b6101a86101fe366004610ae4565b61050c565b61011a610211366004610ae4565b610516565b6101a8610224366004610b65565b610599565b610133610237366004610bd2565b600460209081525f928352604080842090915290825290205481565b5f805461025f90610c03565b80601f016020809104026020016040519081016040528092919081815260200182805461028b90610c03565b80156102d65780601f106102ad576101008083540402835291602001916102d6565b820191905f5260205f20905b8154815290600101906020018083116102b957829003601f168201915b505050505081565b335f81815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103459086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103e9576103b88382610c81565b73ffffffffffffffffffffffffffffffffffffffff86165f9081526004602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff85165f908152600360205260408120805485929061041d908490610c81565b909155505073ffffffffffffffffffffffffffffffffffffffff8085165f81815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104849087815260200190565b60405180910390a3506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000cf5546146104cc576104c76108b7565b905090565b507fdc3435dca418b10e0cd044263a037691aa7a3f09458c668c777ab43e880f269890565b6104fb828261094f565b5050565b6001805461025f90610c03565b6104fb82826109c6565b335f90815260036020526040812080548391908390610536908490610c81565b909155505073ffffffffffffffffffffffffffffffffffffffff83165f81815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103459086815260200190565b42841015610608576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b5f6001610613610497565b73ffffffffffffffffffffffffffffffffffffffff8a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610761573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906107dc57508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016105ff565b73ffffffffffffffffffffffffffffffffffffffff9081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516108e79190610c94565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060025f8282546109609190610d69565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260036020526040812080548392906109fa908490610c81565b90915550506002805482900390556040518181525f9073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016109ba565b5f602080835283518060208501525f5b81811015610a7e57858101830151858201604001528201610a62565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610adf575f80fd5b919050565b5f8060408385031215610af5575f80fd5b610afe83610abc565b946020939093013593505050565b5f805f60608486031215610b1e575f80fd5b610b2784610abc565b9250610b3560208501610abc565b9150604084013590509250925092565b5f60208284031215610b55575f80fd5b610b5e82610abc565b9392505050565b5f805f805f805f60e0888a031215610b7b575f80fd5b610b8488610abc565b9650610b9260208901610abc565b95506040880135945060608801359350608088013560ff81168114610bb5575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215610be3575f80fd5b610bec83610abc565b9150610bfa60208401610abc565b90509250929050565b600181811c90821680610c1757607f821691505b602082108103610c4e577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181038181111561035157610351610c54565b5f8083545f60018260011c91506001831680610cb157607f831692505b60208084108203610ce9577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b818015610cfd5760018114610d3057610d5b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0086168952841515850289019650610d5b565b5f8a8152602090205f5b86811015610d535781548b820152908501908301610d3a565b505084890196505b509498975050505050505050565b8082018082111561035157610351610c5456fea164736f6c6343000818000a" + }, + { + "codeSize": 2796, + "keccakCodeHash": "0x44107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d5", + "hash": "0x18d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f84", + "code": "0x60806040523661001357610011610017565b005b6100115b61001f6102a0565b73ffffffffffffffffffffffffffffffffffffffff1633036102965760607fffffffff000000000000000000000000000000000000000000000000000000005f35167fc9a6301a000000000000000000000000000000000000000000000000000000008101610097576100906102df565b915061028e565b7fb0e10d7a000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216016100e857610090610332565b7f70d7c690000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160161013957610090610376565b7f07ae5bc0000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160161018a576100906103a6565b7fa39f25e5000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216016101db576100906103f2565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b815160208301f35b61029e610405565b565b5f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b60606102e9610415565b5f6102f736600481846108bc565b810190610304919061090b565b905061031f8160405180602001604052805f8152505f61041f565b505060408051602081019091525f815290565b60605f8061034336600481846108bc565b8101906103509190610951565b915091506103608282600161041f565b60405180602001604052805f8152509250505090565b6060610380610415565b5f61038e36600481846108bc565b81019061039b919061090b565b905061031f8161044a565b60606103b0610415565b5f6103b96102a0565b6040805173ffffffffffffffffffffffffffffffffffffffff831660208201529192500160405160208183030381529060405291505090565b60606103fc610415565b5f6103b96104ae565b61029e6104106104ae565b6104bc565b341561029e575f80fd5b610428836104da565b5f825111806104345750805b15610445576104438383610526565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6104736102a0565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a16104ab81610552565b50565b5f6104b761065e565b905090565b365f80375f80365f845af43d5f803e8080156104d6573d5ff35b3d5ffd5b6104e381610685565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b606061054b8383604051806060016040528060278152602001610ab960279139610750565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81166105f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610285565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6102c3565b73ffffffffffffffffffffffffffffffffffffffff81163b610729576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610285565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610618565b60605f808573ffffffffffffffffffffffffffffffffffffffff16856040516107799190610a4d565b5f60405180830381855af49150503d805f81146107b1576040519150601f19603f3d011682016040523d82523d5f602084013e6107b6565b606091505b50915091506107c7868383876107d1565b9695505050505050565b606083156108665782515f0361085f5773ffffffffffffffffffffffffffffffffffffffff85163b61085f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610285565b5081610870565b6108708383610878565b949350505050565b8151156108885781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102859190610a68565b5f80858511156108ca575f80fd5b838611156108d6575f80fd5b5050820193919092039150565b803573ffffffffffffffffffffffffffffffffffffffff81168114610906575f80fd5b919050565b5f6020828403121561091b575f80fd5b61054b826108e3565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f8060408385031215610962575f80fd5b61096b836108e3565b9150602083013567ffffffffffffffff80821115610987575f80fd5b818501915085601f83011261099a575f80fd5b8135818111156109ac576109ac610924565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156109f2576109f2610924565b81604052828152886020848701011115610a0a575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f5b83811015610a45578181015183820152602001610a2d565b50505f910152565b5f8251610a5e818460208701610a2b565b9190910192915050565b602081525f8251806020840152610a86816040850160208701610a2b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a164736f6c6343000818000a" + } + ], + "txStorageTraces": [ + { + "rootBefore": "0x20ef55b0db0ceef9a8b7567f1c91a5f56fd685a6823a82b5cbdb0d477fcce917", + "rootAfter": "0x10563d4bea8f2e78fe23915bb68ced24fcbd825adea848912395082e568ca73f", + "proofs": { + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8": [ + "0x090d5f0601492d2b40aed1c16c212d6d69625a86cd71db3775ad04ec096bf69d9c0945a68442de32a3681726f799768fdb2df560c690137da3cab36db05a1800e2", + "0x091113f1a3b0be7618ebd2f7c7c82c02ddb86240a7449a744e9ba58c0415b3c0c40e70eb8c482f863b571a8f7df494058ed161b481c623557e575b3cbf9ace6744", + "0x0918ec3f04aa26dfe2fdb34122691277175ffeb34b57b96de91a11020d796b5b3713902a3a20e59ede1f0a63ec1691b4b04331d2973b13110a566b6dd7029f3276", + "0x0903ec5f5935cbbb8710bce493dc1db7fd8548bee5e73d70f79a8c399c74d0d17224931ced24212206fa48a12d2f13412c1308ab073b7b877a7ccde133989601e9", + "0x09036c4fee62bb83d523b25829a9143501aea11f0d248381af88746cddffffcb151fde04aea918ea5662d47d91e3d2374cf1f8f5b127345f3c91878076707c70f4", + "0x092bacc030e7201c95030a1aea2839ee9bfee02262d8e0675495fea4338bdfa5060165dc730091c620f135abb2a8069f70d111fe7347753cef01b1d61a76d26a29", + "0x0900f088c016ba77fd9f92ce70ea2a1d105cdfc6c6a5d9186a2c187134d4c5a4ee1c24d91bc55f73a0b5da1533c06933b2329fedbb94bfaf55bf9b54979d6090a1", + "0x0819130f07c5df8015d7f52df82617bbc4386b789449b8d4a3a7ce5d787b0b785a0000000000000000000000000000000000000000000000000000000000000000", + "0x0822d381e78bb6e50e7ba420e48dd800c957d5cfb3c12f7bb8b886c2cf7fac5e3b06e472ddd7d943df55f637fe19920ec05ca83ee7545c04414fc9f95934235b09", + "0x0407edffb2f516756416f9cd6da120841b708d8ba8e0ae76133c0022b273252174050800000000000000000000000000000000000000000000000000000000000000000019001fffffffffffffffffffffffffffffffffffffffffffff59776f638fc0477a0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b648642070997970c51812dc3a010c7d01b50e0d17dc79c8000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9": [ + "0x090d5f0601492d2b40aed1c16c212d6d69625a86cd71db3775ad04ec096bf69d9c0945a68442de32a3681726f799768fdb2df560c690137da3cab36db05a1800e2", + "0x0909c057bf1d02da7c2b51c75e0338b3c80358ba4c3af465e6318648e9868b7be6208462254e9177dbf08a29ff9494095ec64e93bec2ec796e217563145f0fad72", + "0x092a06163d398088f873c062a317a00fd3db764138a54e7cdc629709208dfa6c1f2ab7c93f4ebade6be1bc046106f925db37fed7a446cd293c3ddcbd27f4cef213", + "0x09055073efa8d18f7b39ca93783a3d0757684b088fa9c40989ecdd11a6582d7d2203130a72203b5ddefeb301051872b6b7e9fb6cea3475f6bb07f17ae75a1c4586", + "0x0926ec68edc4b0334a2c828d20135465779c5cad735775d05d3a6ce7517424b0d705e9dc638978400983b610b9f7501e49155663714a078df378de55d05316b29c", + "0x092117dac84ff3dc2cdee910557bf7a16284dbe01c4f931825930b624db9d6fd8219c1814d6313ad2f209e1944787ce32aef9b15a13cfc2335fc30b41ec8c1e87c", + "0x09134e9c9bbb21aaf7377005e95bde32a73c78868f650a37445bffc890028419e50879c20326089af5838976b5e646a16d9394299fda517fc5a4021bcb9a32bf14", + "0x060f06127668bb1bdd54f6294e02b62b0098b7cc5ed0140cbcf437bb5a55a7412b10c278205ae9d0cee240f9803048e6c494445bae51cea6b345052dad60527b8c", + "0x041578b561ae8e97e3c6cdd2fe55167ee977e55548f3010b69ed60bf9e61c9eaaf05080000000000000000000000000000000000000000000000000d890000000000000001000000000000000000000000000000000000000000000000000000000000000018ee20cb49420acf288e7d3b22e0084da13ebbe7e803d5429b5b483d72f402551747624a26df7a2ccc64170f9fdf64b98868e36285f4f3d3418bc63b1cac3a4522077695cc1515e749aea246da1c0832429ec8db834be69a840c496c187d5bd520cf7ed3acca5a467e9e704c703e8d87f634fb0fc9000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xFABB0ac9d68B0B445fB7357272Ff202C5651694a": [ + "0x090d5f0601492d2b40aed1c16c212d6d69625a86cd71db3775ad04ec096bf69d9c0945a68442de32a3681726f799768fdb2df560c690137da3cab36db05a1800e2", + "0x0909c057bf1d02da7c2b51c75e0338b3c80358ba4c3af465e6318648e9868b7be6208462254e9177dbf08a29ff9494095ec64e93bec2ec796e217563145f0fad72", + "0x092d621412af735183b4c159eec9e06b27b454b936b945115f719a8150cd199b190f4be945f00183f6833f932e2021f6ff5698622457524a20ce21a3921aabce3a", + "0x092ee6a5cff1508574915e5c5fa61134dcb9946427ead4b12c3273e9b97a0b77a6001854e8380fbd58620925780f3ed2d0abeea5a13b4e0a4e0a51f59b9b5ec3c0", + "0x09174cfdf2f1e0c6fe4cab85c20ea084898c0e359ada326bd1d38abce77a6ea2492137ebae927de9055c704eaf20176efd3688db2f24e0b7e0a197ed67abc806f0", + "0x0921e218fe94e8e55e46d83b3c61bc6d8f60c2262bf59669299b70dcfe52d8b7442cd91c7a4c36943da038bcb35dde8dd004b83e190a17e35d1bda9011ae062f99", + "0x092173e847844f75d655ac0690b26ee3bf3e65a3c0062f9b9be566e74cd41927df12b7fd5527c406a10b999c59c3c6a1f781797558a36b7fbdadd2d2cf435c1e25", + "0x07000000000000000000000000000000000000000000000000000000000000000002c01b849e25a91dd222e8d006ae918579a6bff12484cc758a8c43c8d6ce0017", + "0x080931f89fedde2fe071003121dcbbc15662cc71fc96127a81b17ca72f1dc81d620000000000000000000000000000000000000000000000000000000000000000", + "0x070d53acb57a8c223e5af81f5dbf1d80922525be5a8d4e45f5f09ff8580a16e210159ad10b4c89ff16157cc364c81f6039eeea9a8eb87e4b4700249219e71cc3ef", + "0x0403d2c88868dc8b5f7994604147a8246c48cc905235de980c42c3e78f351f00c505080000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000f76b616411d0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420fabb0ac9d68b0b445fb7357272ff202c5651694a000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "storageProofs": { + "0x5300000000000000000000000000000000000021": { + "0x6d01ba8ffed4ce500f24b73f45df7dc163a96f64ced987d8ee795c34e371362e": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x091e999ad0969a892635449070e98a13e662492f946d6ba9efaccf52ab53e7875e2cbbe5bbc301a45411f8c9d9639b312ddcaffd9fb0598f3bf73f656f309fcb4d", + "0x0904314d470dc20d9ee18b9434c6fff6e9cc5c211a2e469cdeb00b69942bccfb7c0b567c74e6484b887c320ed6b5c14a50a89fe400b3eb13ed5a5e86880a65aea0", + "0x061c7c2370b89156b28f4141e6320159e799f8353ac328f91eadd9c65a06fad2a628b3bf9a92d906051defc60a366063e6d133f3bb15dc661dad6b57e1f51f95e6", + "0x040959c4a1b3fc665dce20b30216d51dd0141a6738567cfbbf2054a1bc710af948010100000000000000000000000000000000000000000000000000049824fc6fcac9f3ba206d01ba8ffed4ce500f24b73f45df7dc163a96f64ced987d8ee795c34e371362e", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c1f": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x0919e44f4c1854907175b4b2b5a0c96536103adcca1baf40cffa44b0331a8901db2603c9a992dc69a6b684dc301f77cc1c4e9e8a4dd972d15f4cd2ed974c4a79cc", + "0x090dec3fded5debc4bba8aa761a657e8f3bbf01043cb27c6fe8889998a0887b24718683552e0d0dfb464626d6d970adb45c97d9934acaa537b7d7ac0539b53d359", + "0x0813405dada82f833e1a1f8a09f3d0272ad6b162baccede0af919f196392fcd8920000000000000000000000000000000000000000000000000000000000000000", + "0x0723e0dc8d0a6f591ebd77a74f4ee964c81484fbcd8ae0c8bada311e7bc460d959281d441c8ab855399e0f22d4ebf178922d8477c39622fc2c4d9eac325eef6f12", + "0x040e11aafee10c1ada84b19baca77f65014d45b4d26b4ce3aef99a36898199d98601010000000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc920f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c1f", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c20": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0910baa0679dfabc98a749e2cf19cf380cf168c5963ed340eb8793275881f1aab91a61ae832a78b0c5b49d6624e781530d6b4a5ae6747aa8024bb5e00238b397e8", + "0x09128488b0bbdf573df71a726be2ff9a53c1c3ebea2d83da9bc818082d6114154e2f22abdf8825ed09c438ab5e357d601c5008c108986a0f79604020d03dd5658e", + "0x092ce0544b0f1037241d83b784217e1db71aed02f6bb6cbae678f12d8193e6fa561125c8bd98a62433fd57539d6de2d621f4f27c9a5a0a131df210d20fd063a298", + "0x0914bb75030a49de47a3568a2e726e3917e1508d35184c4436116ab72a8d57e65d08d136d73cfd57d8c8015158a423a463519cf14810f6d417259b71dd7bf648d6", + "0x0803dcf8e3b0f9009bdb5cc45234cdc34d8b90bc39e93768b8e8ff8688e950f15f0000000000000000000000000000000000000000000000000000000000000000", + "0x0617b0f320c1804f82f63a90e5e742227da35743a460ca351c5b6fd9481941d68a300c25969dcd82b2b69e782cd8d7535ea8d97f409cadb1187efbe5d940dce947", + "0x040ce6415daf9119eaa403a2266a11c8e6ea133c74e056da323547a0115ecd9f8901010000000000000000000000000000000000000000000000000000000000000000000420f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c20", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c21": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x0919e44f4c1854907175b4b2b5a0c96536103adcca1baf40cffa44b0331a8901db2603c9a992dc69a6b684dc301f77cc1c4e9e8a4dd972d15f4cd2ed974c4a79cc", + "0x0925ffe896678956add403385939c3f41f2db8bff412c9cc8d8f0590cef223288f1bbbbc549a61adc7a091da47883f9c34951e785f75cce8226f3ffdd7189d71b4", + "0x09282aa159b4c043af9c744e12ae4c4836a6fad029715cd87972d9b86e31466cf505f95afda0666a080bb144051a34ee842f918d97623213ca6c0b3537d6aab3d5", + "0x0923dcac699b2bc22dc2f7fa81bf06b44a951d3142c20fc0663b738e658d07ad6204469cd5cb700f31d2934e01feb4321e5be7476821bf1dde82369b6d764ec9dd", + "0x081ecccb20e28882de75addf9eec71a1b14d8fa7b4bd8d7322c4a3dc98c2e085d70000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000001a4fed6b9ad33da7ca3fff4cfb1669e16d80ea7547466dc8dcd67313b34b8787", + "0x082e81ca75173eddf06730891a8f9596f671a7d43cfff11669d4dbfda376538f3e0000000000000000000000000000000000000000000000000000000000000000", + "0x070000000000000000000000000000000000000000000000000000000000000000045d9db03e27071fd4b78117e0e472e06a4eb440617f3ed1e684a5f352856f1f", + "0x080b54e05661b49468d95e43a2ea570347ee51cf309b34b76425adde9b4811b50a18d1292738ab018ea00b3f5f4def62bd9396f9d1caadf29c4be6f2c4833e8035", + "0x062b11db9f1c375e2991097c0da6db9f65ee67825fec9a9613755ca0814cab2fc10154484431d37f9c311e65c4a516c144975b04c404eae5b908e141b3df6ccf92", + "0x0409130a06ba75cb64ae567f1af4e20969bcad96dedcf63d1e434f3f6dc966ca9201010000000000000000000000000000000000000000000000000000000000000000060120f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c21", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c22": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0910baa0679dfabc98a749e2cf19cf380cf168c5963ed340eb8793275881f1aab91a61ae832a78b0c5b49d6624e781530d6b4a5ae6747aa8024bb5e00238b397e8", + "0x0901dd7acbf5ebcbdec718df5774b877e62c16725cd43f07a7bbed7920c5825bb827d74048a99c16ca943362467a7232acba34083af75d10df8c6db36857d01b4c", + "0x0900dc2acf77d008cd9bc982319f8ecdd4d2ecff285b0b66882f4fa9eb1dff1f29183cf679b7f04d5c7327a1bfbd66754f84cc0a9e47ece70d5a7369ab612aed42", + "0x090b90fc0f2f16ef66c025e559d404c4d5fc49562899599a5348d307090c6a4e75078a35b037fa17e0b7801e7df716d17bf9015921ba9961df657c5776da6cc41f", + "0x072415b967f38129cf7e76297d7eb0462e470ee8a443503d59b3b1faecb081590829ea4234c57072a69a28d9575d618f0432d8cc99c29689bd3fda0e3954fa1918", + "0x08028439355a6f136af7432fe618a91dca0933acbc2375aa0a1ca90633b928815811a4b142f80899b94192f56c30e2545b0f60d45246f89520b827da4245440b0a", + "0x0426021fba3d566dfc3284c8ace6e55cbf07f0864ebec2f8f1a14e7d1d1294ecf70101000000000000000000000000000000000000000000000000000000000000000f424020f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c22", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9": { + "0x8c37336c8eae88ad7bbf871a6a05192bff663bf13ee0773449221a2afccbd95a": [ + "0x080964ecbb51d64094366bf306459036c40c38542671461e90c73e235467fe010e16e1d5770cd48f89026856129d8563d65d8b9d76dc4c6f184b78343336d17e5c", + "0x090820650dc3e6ffef62d01299f6925ad8f4270e55deb53be2a39967ad550087930b8834b7bd42d2e79e249d9af970806951cb2060076605e66bd88bd46741a07d", + "0x081b08f08c1e27f3dffc26e587725cd74648ab8b957822265bcd51d8e028b683a80000000000000000000000000000000000000000000000000000000000000000", + "0x0607bb43435f21e2a4a7cf97e33ed02ffdd2d10733adbe4d98fd4b9530224b20f5028cff11be9da54d23c3aeea119475f9d27deb4a30d8619806d69ab5faeb8ee5", + "0x04123a9464ab167aa30076139d8d977b716a85918f12de86764c00ee1a7c603f9a01010000000000000000000000000000000000000000000000000000000000000000000b208c37336c8eae88ad7bbf871a6a05192bff663bf13ee0773449221a2afccbd95a", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x9c35da83f88043b3115f30d93beacec49ca14b6238430bdff196a249c29baa80": [ + "0x080964ecbb51d64094366bf306459036c40c38542671461e90c73e235467fe010e16e1d5770cd48f89026856129d8563d65d8b9d76dc4c6f184b78343336d17e5c", + "0x090820650dc3e6ffef62d01299f6925ad8f4270e55deb53be2a39967ad550087930b8834b7bd42d2e79e249d9af970806951cb2060076605e66bd88bd46741a07d", + "0x0725e5bc9d7850b93ca1a3491589373e5bfa543dab27fbe55d9379b661118d0ebc0c97be1c5db02d8af7ea3efc000d044b5445a7a9bc47e3606248a88d9862f43a", + "0x062ca036ccf19e96bdf99e61eed68723c402b477ee4cd8648e09e278e79d90436d11af9d72891936e057a6fcc3c5e5973bd7fb35481b0c0f63ef4491427d5f230a", + "0x0408fce273ee0c1553e3b2eebd59ca7cb8a863be1f26eaefad72094e7d72212a94010100000000000000000000000000000000000000000000000000000de0b6b3a763fff4209c35da83f88043b3115f30d93beacec49ca14b6238430bdff196a249c29baa80", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + } + } + } + ], + "executionResults": [ + { + "l1DataFee": "0x0", + "feeTokenID": 4, + "feeRate": "0x49824fc6fcac9f3ba", + "tokenScale": "0xf4240", + "feeLimit": "0x9184e72a000", + "gas": 24259, + "failed": true, + "returnValue": "4e487b710000000000000000000000000000000000000000000000000000000000000011", + "from": { + "address": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", + "nonce": 25, + "balance": "0x1fffffffffffffffffffffffffffffffffffffffffffff59776f638fc0477a", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + "to": { + "address": "0xcf7ed3acca5a467e9e704c703e8d87f634fb0fc9", + "nonce": 1, + "balance": "0x0", + "keccakCodeHash": "0x1747624a26df7a2ccc64170f9fdf64b98868e36285f4f3d3418bc63b1cac3a45", + "poseidonCodeHash": "0x22077695cc1515e749aea246da1c0832429ec8db834be69a840c496c187d5bd5", + "codeSize": 3465 + }, + "accountAfter": [ + { + "address": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", + "nonce": 26, + "balance": "0x1fffffffffffffffffffffffffffffffffffffffffffff59776f638fc0477a", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + { + "address": "0xcf7ed3acca5a467e9e704c703e8d87f634fb0fc9", + "nonce": 1, + "balance": "0x0", + "keccakCodeHash": "0x1747624a26df7a2ccc64170f9fdf64b98868e36285f4f3d3418bc63b1cac3a45", + "poseidonCodeHash": "0x22077695cc1515e749aea246da1c0832429ec8db834be69a840c496c187d5bd5", + "codeSize": 3465 + }, + { + "address": "0xfabb0ac9d68b0b445fb7357272ff202c5651694a", + "nonce": 0, + "balance": "0x200000000000000000000000000000000000000000000000000f76b616411d", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + } + ], + "structLogs": [ + { + "pc": 0, + "op": "PUSH1", + "gas": 38368, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2, + "op": "PUSH1", + "gas": 38365, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 4, + "op": "MSTORE", + "gas": 38362, + "gasCost": 12, + "depth": 1 + }, + { + "pc": 5, + "op": "CALLVALUE", + "gas": 38350, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 6, + "op": "DUP1", + "gas": 38348, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 7, + "op": "ISZERO", + "gas": 38345, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 8, + "op": "PUSH2", + "gas": 38342, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 11, + "op": "JUMPI", + "gas": 38339, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 15, + "op": "JUMPDEST", + "gas": 38329, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 16, + "op": "POP", + "gas": 38328, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 17, + "op": "PUSH1", + "gas": 38326, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 19, + "op": "CALLDATASIZE", + "gas": 38323, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 20, + "op": "LT", + "gas": 38321, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 21, + "op": "PUSH2", + "gas": 38318, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 24, + "op": "JUMPI", + "gas": 38315, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 25, + "op": "PUSH0", + "gas": 38305, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 26, + "op": "CALLDATALOAD", + "gas": 38303, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 27, + "op": "PUSH1", + "gas": 38300, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 29, + "op": "SHR", + "gas": 38297, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 30, + "op": "DUP1", + "gas": 38294, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 31, + "op": "PUSH4", + "gas": 38291, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 36, + "op": "GT", + "gas": 38288, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 37, + "op": "PUSH2", + "gas": 38285, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 40, + "op": "JUMPI", + "gas": 38282, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 41, + "op": "DUP1", + "gas": 38272, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 42, + "op": "PUSH4", + "gas": 38269, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 47, + "op": "GT", + "gas": 38266, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 48, + "op": "PUSH2", + "gas": 38263, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 51, + "op": "JUMPI", + "gas": 38260, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 52, + "op": "DUP1", + "gas": 38250, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 53, + "op": "PUSH4", + "gas": 38247, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 58, + "op": "EQ", + "gas": 38244, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 59, + "op": "PUSH2", + "gas": 38241, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 62, + "op": "JUMPI", + "gas": 38238, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 63, + "op": "DUP1", + "gas": 38228, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 64, + "op": "PUSH4", + "gas": 38225, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 69, + "op": "EQ", + "gas": 38222, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 70, + "op": "PUSH2", + "gas": 38219, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 73, + "op": "JUMPI", + "gas": 38216, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 515, + "op": "JUMPDEST", + "gas": 38206, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 516, + "op": "PUSH2", + "gas": 38205, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 519, + "op": "PUSH2", + "gas": 38202, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 522, + "op": "CALLDATASIZE", + "gas": 38199, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 523, + "op": "PUSH1", + "gas": 38197, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 525, + "op": "PUSH2", + "gas": 38194, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 528, + "op": "JUMP", + "gas": 38191, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 2788, + "op": "JUMPDEST", + "gas": 38183, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 2789, + "op": "PUSH0", + "gas": 38182, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2790, + "op": "DUP1", + "gas": 38180, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2791, + "op": "PUSH1", + "gas": 38177, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2793, + "op": "DUP4", + "gas": 38174, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2794, + "op": "DUP6", + "gas": 38171, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2795, + "op": "SUB", + "gas": 38168, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2796, + "op": "SLT", + "gas": 38165, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2797, + "op": "ISZERO", + "gas": 38162, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2798, + "op": "PUSH2", + "gas": 38159, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2801, + "op": "JUMPI", + "gas": 38156, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 2805, + "op": "JUMPDEST", + "gas": 38146, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 2806, + "op": "PUSH2", + "gas": 38145, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2809, + "op": "DUP4", + "gas": 38142, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2810, + "op": "PUSH2", + "gas": 38139, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2813, + "op": "JUMP", + "gas": 38136, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 2748, + "op": "JUMPDEST", + "gas": 38128, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 2749, + "op": "DUP1", + "gas": 38127, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2750, + "op": "CALLDATALOAD", + "gas": 38124, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2751, + "op": "PUSH20", + "gas": 38121, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2772, + "op": "DUP2", + "gas": 38118, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2773, + "op": "AND", + "gas": 38115, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2774, + "op": "DUP2", + "gas": 38112, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2775, + "op": "EQ", + "gas": 38109, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2776, + "op": "PUSH2", + "gas": 38106, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2779, + "op": "JUMPI", + "gas": 38103, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 2783, + "op": "JUMPDEST", + "gas": 38093, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 2784, + "op": "SWAP2", + "gas": 38092, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2785, + "op": "SWAP1", + "gas": 38089, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2786, + "op": "POP", + "gas": 38086, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2787, + "op": "JUMP", + "gas": 38084, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 2814, + "op": "JUMPDEST", + "gas": 38076, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 2815, + "op": "SWAP5", + "gas": 38075, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2816, + "op": "PUSH1", + "gas": 38072, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2818, + "op": "SWAP4", + "gas": 38069, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2819, + "op": "SWAP1", + "gas": 38066, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2820, + "op": "SWAP4", + "gas": 38063, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2821, + "op": "ADD", + "gas": 38060, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2822, + "op": "CALLDATALOAD", + "gas": 38057, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2823, + "op": "SWAP4", + "gas": 38054, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 2824, + "op": "POP", + "gas": 38051, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2825, + "op": "POP", + "gas": 38049, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2826, + "op": "POP", + "gas": 38047, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 2827, + "op": "JUMP", + "gas": 38045, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 529, + "op": "JUMPDEST", + "gas": 38037, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 530, + "op": "PUSH2", + "gas": 38036, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 533, + "op": "JUMP", + "gas": 38033, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 1302, + "op": "JUMPDEST", + "gas": 38025, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 1303, + "op": "CALLER", + "gas": 38024, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1304, + "op": "PUSH0", + "gas": 38022, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 1305, + "op": "SWAP1", + "gas": 38020, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1306, + "op": "DUP2", + "gas": 38017, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1307, + "op": "MSTORE", + "gas": 38014, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1308, + "op": "PUSH1", + "gas": 38011, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1310, + "op": "PUSH1", + "gas": 38008, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1312, + "op": "MSTORE", + "gas": 38005, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1313, + "op": "PUSH1", + "gas": 38002, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1315, + "op": "DUP2", + "gas": 37999, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1316, + "op": "SHA3", + "gas": 37996, + "gasCost": 42, + "depth": 1 + }, + { + "pc": 1317, + "op": "DUP1", + "gas": 37954, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1318, + "op": "SLOAD", + "gas": 37951, + "gasCost": 2100, + "depth": 1, + "storage": { + "0x8c37336c8eae88ad7bbf871a6a05192bff663bf13ee0773449221a2afccbd95a": "0x000000000000000000000000000000000000000000000000000000000000000c", + "0x9c35da83f88043b3115f30d93beacec49ca14b6238430bdff196a249c29baa80": "0x0000000000000000000000000000000000000000000000000de0b6b3a763fff3" + } + }, + { + "pc": 1319, + "op": "DUP4", + "gas": 35851, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1320, + "op": "SWAP2", + "gas": 35848, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1321, + "op": "SWAP1", + "gas": 35845, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1322, + "op": "DUP4", + "gas": 35842, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1323, + "op": "SWAP1", + "gas": 35839, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1324, + "op": "PUSH2", + "gas": 35836, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1327, + "op": "SWAP1", + "gas": 35833, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1328, + "op": "DUP5", + "gas": 35830, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1329, + "op": "SWAP1", + "gas": 35827, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1330, + "op": "PUSH2", + "gas": 35824, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 1333, + "op": "JUMP", + "gas": 35821, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 3201, + "op": "JUMPDEST", + "gas": 35813, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 3202, + "op": "DUP2", + "gas": 35812, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3203, + "op": "DUP2", + "gas": 35809, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3204, + "op": "SUB", + "gas": 35806, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3205, + "op": "DUP2", + "gas": 35803, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3206, + "op": "DUP2", + "gas": 35800, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3207, + "op": "GT", + "gas": 35797, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3208, + "op": "ISZERO", + "gas": 35794, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3209, + "op": "PUSH2", + "gas": 35791, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3212, + "op": "JUMPI", + "gas": 35788, + "gasCost": 10, + "depth": 1 + }, + { + "pc": 3213, + "op": "PUSH2", + "gas": 35778, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3216, + "op": "PUSH2", + "gas": 35775, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3219, + "op": "JUMP", + "gas": 35772, + "gasCost": 8, + "depth": 1 + }, + { + "pc": 3156, + "op": "JUMPDEST", + "gas": 35764, + "gasCost": 1, + "depth": 1 + }, + { + "pc": 3157, + "op": "PUSH32", + "gas": 35763, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3190, + "op": "PUSH0", + "gas": 35760, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3191, + "op": "MSTORE", + "gas": 35758, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3192, + "op": "PUSH1", + "gas": 35755, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3194, + "op": "PUSH1", + "gas": 35752, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3196, + "op": "MSTORE", + "gas": 35749, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3197, + "op": "PUSH1", + "gas": 35746, + "gasCost": 3, + "depth": 1 + }, + { + "pc": 3199, + "op": "PUSH0", + "gas": 35743, + "gasCost": 2, + "depth": 1 + }, + { + "pc": 3200, + "op": "REVERT", + "gas": 35741, + "gasCost": 0, + "depth": 1 + } + ], + "callTrace": { + "from": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", + "gas": "0xea60", + "gasUsed": "0x5ec3", + "to": "0xcf7ed3acca5a467e9e704c703e8d87f634fb0fc9", + "input": "0xa9059cbb0000000000000000000000000742d35cc6634c0532925a3b844bc9e7595f0beb0000000000000000000000000000000000000000000000000de0b6b3a7640000", + "output": "0x4e487b710000000000000000000000000000000000000000000000000000000000000011", + "error": "execution reverted", + "value": "0x0", + "type": "CALL" + } + } + ], + "withdraw_trie_root": "0x27ae5ba08d7291c96c8cbddcc148bf48a6d68c7974b94356f53754ef6171d757", + "sequencer_set_verify_hash": "0x22efe8537c043bf1a471893cba84c8cd29a0d3ea62ad7c4ada032136254ad6c9", + "startL1QueueIndex": 0 + } + ] +] \ No newline at end of file diff --git a/prover/testdata/altfeetx/trace_slot.json b/prover/testdata/altfeetx/trace_slot.json new file mode 100644 index 000000000..1081c7a59 --- /dev/null +++ b/prover/testdata/altfeetx/trace_slot.json @@ -0,0 +1,588 @@ +[ + [ + { + "chainID": 53077, + "version": "2.0.8-mainnet-3f493f94", + "coinbase": { + "address": "0xfabb0ac9d68b0b445fb7357272ff202c5651694a", + "nonce": 0, + "balance": "0x200000000000000000000000000000000000000000000000000f76b616411d", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + "header": { + "parentHash": "0x93443c352797057dd194379bb82bcf7f0b8e981d4a12837dc691007329fb837a", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "miner": "0x0000000000000000000000000000000000000000", + "stateRoot": "0x230f43beef5afc19a07f6346d6d00eb33f614dc0b112683904577c096e4b45ee", + "transactionsRoot": "0x4048050a9215b5bbe9d44ad8db17d5511757fd79c4439529c5467d2598007e06", + "receiptsRoot": "0x9e157a1373d72468d334ef1a03289b11fd0cf9cde7e19a92556ac18acff21d74", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "difficulty": "0x0", + "number": "0x2b93", + "gasLimit": "0x1c9c380", + "gasUsed": "0x5208", + "timestamp": "0x69240a7c", + "extraData": "0x", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x0000000000000000", + "nextL1MsgIndex": "0x0", + "batchHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "baseFeePerGas": "0xf4240", + "withdrawalsRoot": null, + "blobGasUsed": null, + "excessBlobGas": null, + "parentBeaconBlockRoot": null, + "requestsHash": null, + "hash": "0xc0e639902cd3655f42882d967abac0fcd3ae09e87e0cde1d6431a1bc4726e185" + }, + "transactions": [ + { + "type": 127, + "nonce": 20, + "txHash": "0xa2d4fa77fbabafb0c3b24da60f1ca8bf36fa34d8380cf2336eb51b11acab0e28", + "gas": 21000, + "gasPrice": "0x3d0900", + "gasTipCap": "0x1e8480", + "gasFeeCap": "0x3d0900", + "feeTokenID": 4, + "from": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", + "to": "0x0742d35cc6634c0532925a3b844bc9e7595f0beb", + "chainId": "0xcf55", + "value": "0x1", + "data": "0x", + "isCreate": false, + "accessList": [], + "v": "0x0", + "r": "0xdfe0801bf74ffd92edb1437f07f5ff42c6a2fdcab21976835c553957f083cd95", + "s": "0x274e4d01b3219224bef89c0986f6019f8d42abc3eee56dc9a474ab85454c7d86" + } + ], + "storageTrace": { + "rootBefore": "0x1b46ab6195208d1490fc1385b25bd13f7ca1e27cf9730c5e91df9d3f2663d4e8", + "rootAfter": "0x230f43beef5afc19a07f6346d6d00eb33f614dc0b112683904577c096e4b45ee", + "proofs": { + "0x0742D35CC6634c0532925A3b844bc9E7595f0Beb": [ + "0x092d994d77a291a903e170d9be1493d769fef99791d5206b705bb5fa50f19f33eb0010657c33780cb6768bcefa60a43ab666a0fb6328a426ab982dd02dc01bc58c", + "0x091405014f6aee6bb9610c50007e9480c642a558e8606a2116249954aeba12ebb61d8d30ebb8c0c0130854bff123cc77f0af71a766258ded75b1fe000738af773a", + "0x092a457d1df75eac2b6b79a292cc238e0b25372325f6ee437c0b192e80541169900f4be945f00183f6833f932e2021f6ff5698622457524a20ce21a3921aabce3a", + "0x0921bb6632130832c8d3322922868ec6885988676a015dc8cddaa4a9ad925884f214f4b04aad11a22d617370765cf6f9565a981470066b9992cf1100ba8ac98b5c", + "0x0930156495006c643c429bddeb1525c54237055942ce06d2c649fb92ff38f516d400d247dec7c5069fde342365b2f0a6d229665abb83917d06a43e60c740587af2", + "0x0926ef270d898bf7aab739cb6ce3ee9f34dc532c3b48b39ce0a9f654c48f3ab67008f0e98ac5fe4f888d695f71cbb4331160d1f2da76bfe341d98894fd0d727a04", + "0x092b15971b522af8964f68be0ee71a6a27c9808fe6f21829536adeb7a44cb70c1a1319039112f28c46659061c280f7f7cc6d89f5628788dd34f985a6ef3d4bee5b", + "0x0911411e755306f50353deebe39a344092e6c10168609a12c7e84a1e8c84858c10023eb4873405afbf65168cbc0397b4d5e96801e8c5e21bf41c46bc1d1607e20b", + "0x0907b7a5079fb418510fd9221c5cac6f1c229f5e9f09f3728c7b931370031287652d2fdb5066cbfaef2de67de94cff85a30c5ca2566dc0904f7884850833fe929e", + "0x0700000000000000000000000000000000000000000000000000000000000000001001869b64b2c7ebeb72e535fb80979c828afe40e078aee868d7df1d2b01ac26", + "0x07000000000000000000000000000000000000000000000000000000000000000001462f3af92a7447794c6cd5e0e0dba5a9f92c81db5909d66215c9b1acf05131", + "0x0828baa30d933027f4ac26e25932e1f8dc997753c5d23bc03cfc97500823eb678f1cece90884518dd5016ccd2b79fbe00c1c2a3b67037a41508f7223b7b3d44ee1", + "0x070a5a5ceca262b4d50d9138234e4451711aecf26de2d053af6882c261690ca027042db0541967a6441a3f826f5fcc7f091a0b07bc88d21d227ccd644d72b44a36", + "0x041a41a36901ec07e376de0d0d5409328f7c9ae666006cc427b1f8ad646ce147c105080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098a7d9b8314c00050000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864200742d35cc6634c0532925a3b844bc9e7595f0beb000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5300000000000000000000000000000000000001": [ + "0x092d994d77a291a903e170d9be1493d769fef99791d5206b705bb5fa50f19f33eb0010657c33780cb6768bcefa60a43ab666a0fb6328a426ab982dd02dc01bc58c", + "0x0902b7ef64363f91bfb0560c21d5fce791a7b3ed2a4987d3a7b74677f5e83562500e70eb8c482f863b571a8f7df494058ed161b481c623557e575b3cbf9ace6744", + "0x092dc8bcc52b5bf24ee1ae627059ebfde2c83d3c3389610f08050f11e9f6a437720a7e335771fa2c19e0bd11dd9604968aa7a81ed4ecf74bda066058c70cbaebf2", + "0x090148e32ea3877d9a2f510bf3ebeb1c9c3d90d79033bf6a2a912db89122983e1006921c2f3b60bbd12dae3fc369a599b847b18e90e7cbb03a76e5a43f895671df", + "0x091037dd57995a394370ce77d18031e7fdd716725f6cd90a047d8c84c88da15d2c05439eeedb12605248ea72151df5e0b74353566dadc219214393e36290243f63", + "0x090c311950521cda0cdca65f368c0fca2eae6b063232fb84eac9ed027e9834aac8183d898dec71e85c4ba675301636453030beea2a744967a50159574a47b0c9f6", + "0x091cde134960925ee62cea9c340d6241c548fa0978ceca2965c87acccaf8b2805322d288ea2a9d771a19771658abf5a64fd503f4ed277aa8d6f779137a88ea1c8d", + "0x091dba2418c5fdd917fcdeff144d6017c58fac6c5ab448ef2a790ab85e36f9099a20a8a95c49033e899476e2d9c2c98bf1ec0d3423c4d3f31ddea9af65a3a27945", + "0x09220b163279be211a426832f5ff47e0ecadb5bd5eaaf0d62189998fde4e14e629126d21b3294439db0a7819880feb71e44daa89510b4e7415bad226dafdba0c1d", + "0x08150feb81fe1639286c75adb93e5467d36ad52d9ff00e0c706bc5345f6dcd49500000000000000000000000000000000000000000000000000000000000000000", + "0x081cb430cbc5dd11f62a713fb3656184085386104dc53fc135fb3c56dba49670500000000000000000000000000000000000000000000000000000000000000000", + "0x060c320ff8f6c3907ae6df62a7fe70e2be093390bd246197d5f56b6bce56f513f812fac8f51e3812914c097147217411381b9b2dad76963ef63c261885d3a49223", + "0x0427cfcbd2fe87474008e199ef5bff09273803bbf38032c75a36a7726b3c88f8a205080000000000000000000000000000000000000000000000000aec000000000000000000000000000000000000000000000000000000000000000000000000000000002198e2c16011cd18ef5be82557ea4552a16cc88ed8026d68fc38a18776550fa944107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f8400", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x530000000000000000000000000000000000000f": [ + "0x092d994d77a291a903e170d9be1493d769fef99791d5206b705bb5fa50f19f33eb0010657c33780cb6768bcefa60a43ab666a0fb6328a426ab982dd02dc01bc58c", + "0x0902b7ef64363f91bfb0560c21d5fce791a7b3ed2a4987d3a7b74677f5e83562500e70eb8c482f863b571a8f7df494058ed161b481c623557e575b3cbf9ace6744", + "0x0918ec3f04aa26dfe2fdb34122691277175ffeb34b57b96de91a11020d796b5b372d356a6b810738c488374f48d61c198a5ac8e1a3ba4f2d61f08c3865eb4d757b", + "0x092095e03a6c163738018ddb4e1cdc171ed8306b711a78a59e07798e60d974a8f52e51ae1fc969dfd817613e2e6ee8062cd343612928fc1f2a8be5a4053032a3e0", + "0x090430edc094dcb51bb128e4db1e27812218fcb3b88806da90445fe07b5ca18e3006767c9fc9e8eb4a72272bf69aef6ef5cf6ab77620acf76754cdff87c31dfa41", + "0x090d2955877b59dd23203eda776f580ddea39d387b90e4178cc7fb41f83080ab1c1558ebda9c7a671a601af519b323ca394a262519dacf80a90f66dc0ce90e6572", + "0x09101b44cf1f33794d2a3078cb1acdfc64b79980839d80127d34998e67a32c6aa42a16300f95ebb8c46e4e6ede02b7fa4944ecc1315bc8b7a2de274188b5f6f6d3", + "0x0923bfab6f7b9cc20bae8ca8989ad45df9625cf0c14ee54257ffd31b2593b8385f219d7fa978c4389f2ee5a1be328f17e3df180f18177925171afd5a1ae5493b93", + "0x06179596d8aa933023605d9c3eaad2b08f7893d5b65f8ddce4d36c97f541e11d892a868ae99ff40d43cff3f28ff0655bf467eaa89e3d3a1493203e4abb26099b3b", + "0x0418a86f98026d1a55f6fee616f04d51be16c033651ffaafb0514287ec067d04e805080000000000000000000000000000000000000000000000000aec0000000000000000000000000000000000000000000000000000000000000000000000000000000002f56e29848865e204296c51c2fa18997db9888d7dd5a3e9ed3c726e278c099744107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f8400", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5300000000000000000000000000000000000017": [ + "0x092d994d77a291a903e170d9be1493d769fef99791d5206b705bb5fa50f19f33eb0010657c33780cb6768bcefa60a43ab666a0fb6328a426ab982dd02dc01bc58c", + "0x0902b7ef64363f91bfb0560c21d5fce791a7b3ed2a4987d3a7b74677f5e83562500e70eb8c482f863b571a8f7df494058ed161b481c623557e575b3cbf9ace6744", + "0x0918ec3f04aa26dfe2fdb34122691277175ffeb34b57b96de91a11020d796b5b372d356a6b810738c488374f48d61c198a5ac8e1a3ba4f2d61f08c3865eb4d757b", + "0x092095e03a6c163738018ddb4e1cdc171ed8306b711a78a59e07798e60d974a8f52e51ae1fc969dfd817613e2e6ee8062cd343612928fc1f2a8be5a4053032a3e0", + "0x0910b1ec1393c71d2fb5f6024dc8b3b21f75c8de647d481b0121dce322076582d82ca08ae593596704180b0f3f4c8f0bf9f9c8831cff2868f401b67a261813c939", + "0x0901603144c1255abe7e4dccedabde2d3acb83cccfc845602366ed7db86fcea8062dae21e4c5cee679a94325a7d6f9aa0b595a42f165e7bcda729f860111329f61", + "0x090e11cb818c1c31b2c42077bce95e1ac83faec4262e3d214f20345931b381488e1fa1e0f8d195352fc7dfdc1d2cca64062e326f1a44490fb1f715293dc5d56d67", + "0x071e7b646383bbd8defcc230d420cefddd4cae409681ef74ff98bb66527c23473c292161f39efa24ba2d072e47064c6d7ebc45e7890480005cd78d89dc640091c0", + "0x060e3d168eba427cee8d7be26b10e66d5d21b0301485d3cac9c45470fae67ad5031d49523b9f532097709c6c724d41ec10986bc0a4e5d078f5e9f861b56d91b773", + "0x041918c47a133f759975cc95c0dba82051d9b5cd65407e76ef1366a9deaa14f28005080000000000000000000000000000000000000000000000000aec000000000000000000000000000000000000000000000000000000000000000000000000000000002c3cbfa3d0183eb2e332389ef0c7a5e5d73cf155103c3ac0eddefa9e2beae91c44107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f8400", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5300000000000000000000000000000000000021": [ + "0x092d994d77a291a903e170d9be1493d769fef99791d5206b705bb5fa50f19f33eb0010657c33780cb6768bcefa60a43ab666a0fb6328a426ab982dd02dc01bc58c", + "0x091405014f6aee6bb9610c50007e9480c642a558e8606a2116249954aeba12ebb61d8d30ebb8c0c0130854bff123cc77f0af71a766258ded75b1fe000738af773a", + "0x092a06163d398088f873c062a317a00fd3db764138a54e7cdc629709208dfa6c1f1ffa7282f31cb8686e18f6ef867ce8984e88aca684e8f3dca2b01557372bcf88", + "0x092cb3b11908a52cd926de960bc1605ba0ca074809eb4b4eeef23b306cdc8a8774049c9ba7546167504538f67af40a08189fe0b869af3172c62b4c748af3580b28", + "0x0913028f68e22d222f43ddc69482acfe4fffbbb3180065d5f00d63d2d839ab86c718be689dee79760972a42c9c0d3f6b4cc1acf518425ed10b445d1b3798822455", + "0x092638133fc9368332440781bda5fd3a9ab693ecb89f611f26acc785e68e181b7e0e520de80cc858c66d2f4dc02567bbe08c1a8f2bdfef6b10355fb2218c77ec0a", + "0x092166504c35825475687da93a700c997aadb255261bc6ce18ff61cd7182db14122cc3d3cf55c0beec2b0f09e350473bd703a8a84463f135d2c2d45ca19f34503a", + "0x091c746524ed2bcb228d6ebf9953357bb1b618a23fc2fe4302df1108a8a0e35ba122aeab44900556acd8bdd693a47952cb01f194cd72e12a550c7fcbc971ed742f", + "0x08244257efc46fd96db45b1505e03603f8b611a3e9ac4630d1fc9b01b4f5fd714117fac506dee79e5f7f52cb7b1eb174b441f0adee2a477e9c1680eeb5913a7eaf", + "0x071e6f5cd0c216a9cf74d9a8ce13256dd8970a07efacb2c61df9e3a4faab03c2de08738589134993085ec4962792e46613a66798325b297c93eca9ded9189ddfd2", + "0x07084f4e6b01a5eda178901c705a9a69b829618c6785a38c831ad467dc7c2d449115e4567e1f83d13a7fe610cca9aa17ba49bce22eb2edbc7f6242f42dc0c1dfd4", + "0x061dbb1f2fe996371625dbfaa5cd6ca070ed15c020c94e65344db5176087c17770242bf081ac926273432685f64c22d3603904df8edc4ddd3d1724817b14a6b8d6", + "0x040883d4562dfe8ba7ad8176bc2844d35ecc486199d589a152eabcee8398f3aebb05080000000000000000000000000000000000000000000000000aec00000000000000000000000000000000000000000000000000000000000000000000000000000000036c7b3f0434b9a4c98814ec5bfef913a8a785403fcc22d17f1adef51905db1a44107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f84205300000000000000000000000000000000000021000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8": [ + "0x092d994d77a291a903e170d9be1493d769fef99791d5206b705bb5fa50f19f33eb0010657c33780cb6768bcefa60a43ab666a0fb6328a426ab982dd02dc01bc58c", + "0x0902b7ef64363f91bfb0560c21d5fce791a7b3ed2a4987d3a7b74677f5e83562500e70eb8c482f863b571a8f7df494058ed161b481c623557e575b3cbf9ace6744", + "0x0918ec3f04aa26dfe2fdb34122691277175ffeb34b57b96de91a11020d796b5b372d356a6b810738c488374f48d61c198a5ac8e1a3ba4f2d61f08c3865eb4d757b", + "0x090b330507460f308cae1a19c5dd42fc32de643ad23fa3f6cd92d19767de53bb1a24931ced24212206fa48a12d2f13412c1308ab073b7b877a7ccde133989601e9", + "0x09036c4fee62bb83d523b25829a9143501aea11f0d248381af88746cddffffcb152a55320db3d7b4e9f1b705077d403048b3c33c1916b5d8de233d7472c07435d5", + "0x092bacc030e7201c95030a1aea2839ee9bfee02262d8e0675495fea4338bdfa5060b93139b2487f819fdffdec151f2818018e386879ad255eea57f469d7f164ff6", + "0x0900f088c016ba77fd9f92ce70ea2a1d105cdfc6c6a5d9186a2c187134d4c5a4ee1f827a01e0f0bd9150e982674ab82c9a22ce95795a9ed10a9a835d0bcf661a10", + "0x08226fcdc8a51015fed72c5a80338b3148ab72c12ebb656d6c819ff7360e423b6a0000000000000000000000000000000000000000000000000000000000000000", + "0x0822d381e78bb6e50e7ba420e48dd800c957d5cfb3c12f7bb8b886c2cf7fac5e3b279d4cc5e7505586cc8589f4ea81af6d0dc4cf1a13b35fb8130cd836b8464d54", + "0x0407edffb2f516756416f9cd6da120841b708d8ba8e0ae76133c0022b273252174050800000000000000000000000000000000000000000000000000000000000000000014001fffffffffffffffffffffffffffffffffffffffffffff59776f638fc0477e0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b648642070997970c51812dc3a010c7d01b50e0d17dc79c8000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9": [ + "0x092d994d77a291a903e170d9be1493d769fef99791d5206b705bb5fa50f19f33eb0010657c33780cb6768bcefa60a43ab666a0fb6328a426ab982dd02dc01bc58c", + "0x091405014f6aee6bb9610c50007e9480c642a558e8606a2116249954aeba12ebb61d8d30ebb8c0c0130854bff123cc77f0af71a766258ded75b1fe000738af773a", + "0x092a06163d398088f873c062a317a00fd3db764138a54e7cdc629709208dfa6c1f1ffa7282f31cb8686e18f6ef867ce8984e88aca684e8f3dca2b01557372bcf88", + "0x09055073efa8d18f7b39ca93783a3d0757684b088fa9c40989ecdd11a6582d7d2211e1dbe277107125aabb9d8ba78abedc4f4f2468f4c3cfc894b086f9f5616b6b", + "0x090a7c3800a5755f417498f13fdf72cfb79d5fb1d507126644dbd95c01a9c7cd6605e9dc638978400983b610b9f7501e49155663714a078df378de55d05316b29c", + "0x092117dac84ff3dc2cdee910557bf7a16284dbe01c4f931825930b624db9d6fd82191b540896cb0110ce00fab2146b62ad305feb062c1b4b6a61d98073b5f2e5ae", + "0x0924707b7d8c5c174b74155afb69b00d311be63554d796c1882c7f105564e0c0dd0879c20326089af5838976b5e646a16d9394299fda517fc5a4021bcb9a32bf14", + "0x060f06127668bb1bdd54f6294e02b62b0098b7cc5ed0140cbcf437bb5a55a7412b2a0737c2deb147ec81ef8b9412458b632afa5b67f05777285de308dfa4911a11", + "0x041578b561ae8e97e3c6cdd2fe55167ee977e55548f3010b69ed60bf9e61c9eaaf05080000000000000000000000000000000000000000000000000d8900000000000000010000000000000000000000000000000000000000000000000000000000000000249d8e9ce6f409bde3615b3cdd25b795e4cedbbcaad5b2ec78f52dcdde0c0fc31747624a26df7a2ccc64170f9fdf64b98868e36285f4f3d3418bc63b1cac3a4522077695cc1515e749aea246da1c0832429ec8db834be69a840c496c187d5bd520cf7ed3acca5a467e9e704c703e8d87f634fb0fc9000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xFABB0ac9d68B0B445fB7357272Ff202C5651694a": [ + "0x092d994d77a291a903e170d9be1493d769fef99791d5206b705bb5fa50f19f33eb0010657c33780cb6768bcefa60a43ab666a0fb6328a426ab982dd02dc01bc58c", + "0x091405014f6aee6bb9610c50007e9480c642a558e8606a2116249954aeba12ebb61d8d30ebb8c0c0130854bff123cc77f0af71a766258ded75b1fe000738af773a", + "0x092a457d1df75eac2b6b79a292cc238e0b25372325f6ee437c0b192e80541169900f4be945f00183f6833f932e2021f6ff5698622457524a20ce21a3921aabce3a", + "0x092ee6a5cff1508574915e5c5fa61134dcb9946427ead4b12c3273e9b97a0b77a6001854e8380fbd58620925780f3ed2d0abeea5a13b4e0a4e0a51f59b9b5ec3c0", + "0x09174cfdf2f1e0c6fe4cab85c20ea084898c0e359ada326bd1d38abce77a6ea2492137ebae927de9055c704eaf20176efd3688db2f24e0b7e0a197ed67abc806f0", + "0x0921e218fe94e8e55e46d83b3c61bc6d8f60c2262bf59669299b70dcfe52d8b7442cd91c7a4c36943da038bcb35dde8dd004b83e190a17e35d1bda9011ae062f99", + "0x092173e847844f75d655ac0690b26ee3bf3e65a3c0062f9b9be566e74cd41927df12b7fd5527c406a10b999c59c3c6a1f781797558a36b7fbdadd2d2cf435c1e25", + "0x07000000000000000000000000000000000000000000000000000000000000000002c01b849e25a91dd222e8d006ae918579a6bff12484cc758a8c43c8d6ce0017", + "0x080931f89fedde2fe071003121dcbbc15662cc71fc96127a81b17ca72f1dc81d620000000000000000000000000000000000000000000000000000000000000000", + "0x070d53acb57a8c223e5af81f5dbf1d80922525be5a8d4e45f5f09ff8580a16e210159ad10b4c89ff16157cc364c81f6039eeea9a8eb87e4b4700249219e71cc3ef", + "0x0403d2c88868dc8b5f7994604147a8246c48cc905235de980c42c3e78f351f00c505080000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000f76b616411d0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420fabb0ac9d68b0b445fb7357272ff202c5651694a000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "storageProofs": { + "0x5300000000000000000000000000000000000001": { + "0x0000000000000000000000000000000000000000000000000000000000000021": [ + "0x0825bcd8ed4a7e39c0f0e835761cda36131dd34f16de95765d2216d997923a52f60e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200", + "0x06216372aa3165a29ee67494a5a9680358be92c254cc5724949e4d52742ba8d57f02a40b5614637fca2783d673559f035f5f5a0588ee27d164bb5375568493200a", + "0x042f683d080c393f5fb2ade2190fd56e8a5e8fa26533acdea8cce25caa236027cc0101000027ae5ba08d7291c96c8cbddcc148bf48a6d68c7974b94356f53754ef6171d75700", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x530000000000000000000000000000000000000f": { + "0x0000000000000000000000000000000000000000000000000000000000000001": [ + "0x09250fbf2587e7f07f1dd72ac26e3245705f67157a2e402a60bcb9c861b5a4d3f7256fbb55c0a0ca65679134f25a5a893427348f9086273c801ff4633c50899f1e", + "0x0904657f17b545183e86b0545adff05a99f8efe788d72e90e01784a1b9f986e35a162b4d479ff13f2af3f0cfaadc6bccc8622dd980f83c7014e947f50577eedaba", + "0x0804422082d7197f691b32c2c4120b44e674d5bd50d4b210f0d4525906237d29871e144bbeb8f4c147dafacf9567e13b1b15e4804a9d74df2da7619735d765c1be", + "0x081341967c7422e5508fc72463c51ace718e18440d00db082bf2184d906f2c9ad90000000000000000000000000000000000000000000000000000000000000000", + "0x07000000000000000000000000000000000000000000000000000000000000000006e79d86dd9c9fa893eb97cd43df98e2d19487b963520202b144a3f4b84f0c45", + "0x080e0f66ccb838bd67cbf343dadf696b6d2aa46137c6c82c4fd6ceaf8d60fe80d60000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000002634b0768a20cec85ef53630d7f4dfc6d1c8c8f76dad4d9014828fc94bf0ded8", + "0x080b10db1b542a2f6c809a2d2cd03aa0c4d4ddcdfd2a1c8a00dc06cdc12bbb976c0000000000000000000000000000000000000000000000000000000000000000", + "0x08144e4aeb02298f8f0545b923bc88172527f7ffdd24eb31a2dccfe887757beb0f0000000000000000000000000000000000000000000000000000000000000000", + "0x07000000000000000000000000000000000000000000000000000000000000000023413c0bd51b56dc557426037ffd25cae18e73e8f116ad6aa3a46aaba671f1e4", + "0x0628e14710ef1f9a6f539110a2d6c693d9389d38836eb9f0e0ea449d3afaede2a6156a0960a84fa4287f66d18b9c39ab9d403fa6b6dddd126f47758aadcb82e122", + "0x0426049ba6de63003492eb078a01a8aa4f4a0e67f28f0955c2eba9101d5d2eea5001010000000000000000000000000000000000000000000000000000000000003b9aca00200000000000000000000000000000000000000000000000000000000000000001", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000002": [ + "0x09250fbf2587e7f07f1dd72ac26e3245705f67157a2e402a60bcb9c861b5a4d3f7256fbb55c0a0ca65679134f25a5a893427348f9086273c801ff4633c50899f1e", + "0x0904657f17b545183e86b0545adff05a99f8efe788d72e90e01784a1b9f986e35a162b4d479ff13f2af3f0cfaadc6bccc8622dd980f83c7014e947f50577eedaba", + "0x0804422082d7197f691b32c2c4120b44e674d5bd50d4b210f0d4525906237d29871e144bbeb8f4c147dafacf9567e13b1b15e4804a9d74df2da7619735d765c1be", + "0x04020953ad52de135367a1ba2629636216ed5174cce5629d11b5d97fe733f07dcc0101000000000000000000000000000000000000000000000000000000000000000009c4200000000000000000000000000000000000000000000000000000000000000002", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000003": [ + "0x09250fbf2587e7f07f1dd72ac26e3245705f67157a2e402a60bcb9c861b5a4d3f7256fbb55c0a0ca65679134f25a5a893427348f9086273c801ff4633c50899f1e", + "0x0700000000000000000000000000000000000000000000000000000000000000002c627348b5769391cdf27c1c6ccd9e7363936623501503e7549c1df6542031b9", + "0x060ee2ca3e190e48951aa8d5bb00d33ba76a92de69a807dfa6f2eaa9881e303f320e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200", + "0x0406c50541f08911ad149aa545dd3d606f86ee63c751a795c7d57f0d3f85e6bdeb01010000000000000000000000000000000000000000000000000000000000003b9aca0000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000006": [ + "0x09250fbf2587e7f07f1dd72ac26e3245705f67157a2e402a60bcb9c861b5a4d3f7256fbb55c0a0ca65679134f25a5a893427348f9086273c801ff4633c50899f1e", + "0x0904657f17b545183e86b0545adff05a99f8efe788d72e90e01784a1b9f986e35a162b4d479ff13f2af3f0cfaadc6bccc8622dd980f83c7014e947f50577eedaba", + "0x0804422082d7197f691b32c2c4120b44e674d5bd50d4b210f0d4525906237d29871e144bbeb8f4c147dafacf9567e13b1b15e4804a9d74df2da7619735d765c1be", + "0x04020953ad52de135367a1ba2629636216ed5174cce5629d11b5d97fe733f07dcc0101000000000000000000000000000000000000000000000000000000000000000009c4200000000000000000000000000000000000000000000000000000000000000002", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000007": [ + "0x09250fbf2587e7f07f1dd72ac26e3245705f67157a2e402a60bcb9c861b5a4d3f7256fbb55c0a0ca65679134f25a5a893427348f9086273c801ff4633c50899f1e", + "0x0904657f17b545183e86b0545adff05a99f8efe788d72e90e01784a1b9f986e35a162b4d479ff13f2af3f0cfaadc6bccc8622dd980f83c7014e947f50577eedaba", + "0x0803f6f6d47db3a7888f229ead7798b1ae14eb8855585ebb4d70f6a2020ac30dbf0000000000000000000000000000000000000000000000000000000000000000", + "0x081824025e42aefa5d18b0a0c39ba03d737dc20b78e6574d948d80d82a52f727d80000000000000000000000000000000000000000000000000000000000000000", + "0x05", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000008": [ + "0x09250fbf2587e7f07f1dd72ac26e3245705f67157a2e402a60bcb9c861b5a4d3f7256fbb55c0a0ca65679134f25a5a893427348f9086273c801ff4633c50899f1e", + "0x0700000000000000000000000000000000000000000000000000000000000000002c627348b5769391cdf27c1c6ccd9e7363936623501503e7549c1df6542031b9", + "0x060ee2ca3e190e48951aa8d5bb00d33ba76a92de69a807dfa6f2eaa9881e303f320e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200", + "0x0419a44eca69f8d5e3651ccf05934126419470106b4b51bb4b96b6230b7d80236701010000000000000000000000000000530000000000000000000000000000000000000b00", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000009": [ + "0x09250fbf2587e7f07f1dd72ac26e3245705f67157a2e402a60bcb9c861b5a4d3f7256fbb55c0a0ca65679134f25a5a893427348f9086273c801ff4633c50899f1e", + "0x0700000000000000000000000000000000000000000000000000000000000000002c627348b5769391cdf27c1c6ccd9e7363936623501503e7549c1df6542031b9", + "0x05", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x5300000000000000000000000000000000000017": { + "0x0000000000000000000000000000000000000000000000000000000000000065": [ + "0x09295b90a00505079f65623858f8e164c095a86cfbb449412829e1fc988749139c2c08ec36e0b240f28727cc2f0e93b4b55b1214857f62e93cd895cd25d6b1fca3", + "0x0924e760587c9b1db469c29fecb46a7a69bf5102811e52577a0be8379118e3506115e6e9020712f91f6ee3d7b78613fdb79c35a4f68cf0438bb49ff403e3d93296", + "0x081e5ac2ec2032e7f34af7c72542b1ff463f5590272545e8a2f4f32e3b5a63eda30e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200", + "0x07165d00aa7e206c00402a408f8fd7708cade38a4505b733034b0395a63d9972db1ddc1c901911c636efb3e2c53251d143b3f5bb4271fb6b9e8837fc0c1f739212", + "0x0700000000000000000000000000000000000000000000000000000000000000002b22b7103e3a83cc758c8e8997b79b6e30988fbe8aa1924fdbe675cd6d5ceed0", + "0x0700000000000000000000000000000000000000000000000000000000000000001f4b453328057d0249978fe5ee1e635e4671f325a2bcf3449ef1637170859c43", + "0x0623965bae207a394b8516562f391edb1cdc19cad8d2aa324db42a44fd0810fd550a36302dbd0bcb8ba381bd22b85ded888e754404629c06c2b7801c87978dfd6f", + "0x042115c9b0a0938aa1ce2e8c01581e5aa931288249a453588de70cf2c5dae26a7b0101000022efe8537c043bf1a471893cba84c8cd29a0d3ea62ad7c4ada032136254ad6c9200000000000000000000000000000000000000000000000000000000000000065", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x5300000000000000000000000000000000000021": { + "0x000000000000000000000000000000000000000000000000000000000000009a": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x091e999ad0969a892635449070e98a13e662492f946d6ba9efaccf52ab53e7875e2cbbe5bbc301a45411f8c9d9639b312ddcaffd9fb0598f3bf73f656f309fcb4d", + "0x0904314d470dc20d9ee18b9434c6fff6e9cc5c211a2e469cdeb00b69942bccfb7c0b567c74e6484b887c320ed6b5c14a50a89fe400b3eb13ed5a5e86880a65aea0", + "0x061c7c2370b89156b28f4141e6320159e799f8353ac328f91eadd9c65a06fad2a628b3bf9a92d906051defc60a366063e6d133f3bb15dc661dad6b57e1f51f95e6", + "0x040959c4a1b3fc665dce20b30216d51dd0141a6738567cfbbf2054a1bc710af948010100000000000000000000000000000000000000000000000000049824fc6fcac9f3ba206d01ba8ffed4ce500f24b73f45df7dc163a96f64ced987d8ee795c34e371362e", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x6d01ba8ffed4ce500f24b73f45df7dc163a96f64ced987d8ee795c34e371362e": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x091e999ad0969a892635449070e98a13e662492f946d6ba9efaccf52ab53e7875e2cbbe5bbc301a45411f8c9d9639b312ddcaffd9fb0598f3bf73f656f309fcb4d", + "0x0904314d470dc20d9ee18b9434c6fff6e9cc5c211a2e469cdeb00b69942bccfb7c0b567c74e6484b887c320ed6b5c14a50a89fe400b3eb13ed5a5e86880a65aea0", + "0x061c7c2370b89156b28f4141e6320159e799f8353ac328f91eadd9c65a06fad2a628b3bf9a92d906051defc60a366063e6d133f3bb15dc661dad6b57e1f51f95e6", + "0x040959c4a1b3fc665dce20b30216d51dd0141a6738567cfbbf2054a1bc710af948010100000000000000000000000000000000000000000000000000049824fc6fcac9f3ba206d01ba8ffed4ce500f24b73f45df7dc163a96f64ced987d8ee795c34e371362e", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c1f": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x0919e44f4c1854907175b4b2b5a0c96536103adcca1baf40cffa44b0331a8901db2603c9a992dc69a6b684dc301f77cc1c4e9e8a4dd972d15f4cd2ed974c4a79cc", + "0x090dec3fded5debc4bba8aa761a657e8f3bbf01043cb27c6fe8889998a0887b24718683552e0d0dfb464626d6d970adb45c97d9934acaa537b7d7ac0539b53d359", + "0x0813405dada82f833e1a1f8a09f3d0272ad6b162baccede0af919f196392fcd8920000000000000000000000000000000000000000000000000000000000000000", + "0x0723e0dc8d0a6f591ebd77a74f4ee964c81484fbcd8ae0c8bada311e7bc460d959281d441c8ab855399e0f22d4ebf178922d8477c39622fc2c4d9eac325eef6f12", + "0x040e11aafee10c1ada84b19baca77f65014d45b4d26b4ce3aef99a36898199d98601010000000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc920f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c1f", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c20": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0910baa0679dfabc98a749e2cf19cf380cf168c5963ed340eb8793275881f1aab91a61ae832a78b0c5b49d6624e781530d6b4a5ae6747aa8024bb5e00238b397e8", + "0x09128488b0bbdf573df71a726be2ff9a53c1c3ebea2d83da9bc818082d6114154e2f22abdf8825ed09c438ab5e357d601c5008c108986a0f79604020d03dd5658e", + "0x092ce0544b0f1037241d83b784217e1db71aed02f6bb6cbae678f12d8193e6fa561125c8bd98a62433fd57539d6de2d621f4f27c9a5a0a131df210d20fd063a298", + "0x0914bb75030a49de47a3568a2e726e3917e1508d35184c4436116ab72a8d57e65d08d136d73cfd57d8c8015158a423a463519cf14810f6d417259b71dd7bf648d6", + "0x0803dcf8e3b0f9009bdb5cc45234cdc34d8b90bc39e93768b8e8ff8688e950f15f0000000000000000000000000000000000000000000000000000000000000000", + "0x0617b0f320c1804f82f63a90e5e742227da35743a460ca351c5b6fd9481941d68a300c25969dcd82b2b69e782cd8d7535ea8d97f409cadb1187efbe5d940dce947", + "0x040ce6415daf9119eaa403a2266a11c8e6ea133c74e056da323547a0115ecd9f8901010000000000000000000000000000000000000000000000000000000000000000000420f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c20", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c21": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x0919e44f4c1854907175b4b2b5a0c96536103adcca1baf40cffa44b0331a8901db2603c9a992dc69a6b684dc301f77cc1c4e9e8a4dd972d15f4cd2ed974c4a79cc", + "0x0925ffe896678956add403385939c3f41f2db8bff412c9cc8d8f0590cef223288f1bbbbc549a61adc7a091da47883f9c34951e785f75cce8226f3ffdd7189d71b4", + "0x09282aa159b4c043af9c744e12ae4c4836a6fad029715cd87972d9b86e31466cf505f95afda0666a080bb144051a34ee842f918d97623213ca6c0b3537d6aab3d5", + "0x0923dcac699b2bc22dc2f7fa81bf06b44a951d3142c20fc0663b738e658d07ad6204469cd5cb700f31d2934e01feb4321e5be7476821bf1dde82369b6d764ec9dd", + "0x081ecccb20e28882de75addf9eec71a1b14d8fa7b4bd8d7322c4a3dc98c2e085d70000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000001a4fed6b9ad33da7ca3fff4cfb1669e16d80ea7547466dc8dcd67313b34b8787", + "0x082e81ca75173eddf06730891a8f9596f671a7d43cfff11669d4dbfda376538f3e0000000000000000000000000000000000000000000000000000000000000000", + "0x070000000000000000000000000000000000000000000000000000000000000000045d9db03e27071fd4b78117e0e472e06a4eb440617f3ed1e684a5f352856f1f", + "0x080b54e05661b49468d95e43a2ea570347ee51cf309b34b76425adde9b4811b50a18d1292738ab018ea00b3f5f4def62bd9396f9d1caadf29c4be6f2c4833e8035", + "0x062b11db9f1c375e2991097c0da6db9f65ee67825fec9a9613755ca0814cab2fc10154484431d37f9c311e65c4a516c144975b04c404eae5b908e141b3df6ccf92", + "0x0409130a06ba75cb64ae567f1af4e20969bcad96dedcf63d1e434f3f6dc966ca9201010000000000000000000000000000000000000000000000000000000000000000060120f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c21", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c22": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0910baa0679dfabc98a749e2cf19cf380cf168c5963ed340eb8793275881f1aab91a61ae832a78b0c5b49d6624e781530d6b4a5ae6747aa8024bb5e00238b397e8", + "0x0901dd7acbf5ebcbdec718df5774b877e62c16725cd43f07a7bbed7920c5825bb827d74048a99c16ca943362467a7232acba34083af75d10df8c6db36857d01b4c", + "0x0900dc2acf77d008cd9bc982319f8ecdd4d2ecff285b0b66882f4fa9eb1dff1f29183cf679b7f04d5c7327a1bfbd66754f84cc0a9e47ece70d5a7369ab612aed42", + "0x090b90fc0f2f16ef66c025e559d404c4d5fc49562899599a5348d307090c6a4e75078a35b037fa17e0b7801e7df716d17bf9015921ba9961df657c5776da6cc41f", + "0x072415b967f38129cf7e76297d7eb0462e470ee8a443503d59b3b1faecb081590829ea4234c57072a69a28d9575d618f0432d8cc99c29689bd3fda0e3954fa1918", + "0x08028439355a6f136af7432fe618a91dca0933acbc2375aa0a1ca90633b928815811a4b142f80899b94192f56c30e2545b0f60d45246f89520b827da4245440b0a", + "0x0426021fba3d566dfc3284c8ace6e55cbf07f0864ebec2f8f1a14e7d1d1294ecf70101000000000000000000000000000000000000000000000000000000000000000f424020f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c22", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9": { + "0x8c37336c8eae88ad7bbf871a6a05192bff663bf13ee0773449221a2afccbd95a": [ + "0x0800915baebf56d5795973b2d857139671c2b63adb7ae7b7d1b530a1d93c56ff2a0000000000000000000000000000000000000000000000000000000000000000", + "0x0907a8e57a4c474845196cf4c491399250f3f5de34ee47ff66a2b47ca42efe3ed31464559090b2754d912210b5bd9ece696e0cda8a765e361d40d29483809523ba", + "0x0806d0912eeffce1e8be7f0aa32776cb18f295a1ddfe4db5a11b8cc6fb71d1ddf60000000000000000000000000000000000000000000000000000000000000000", + "0x0607bb43435f21e2a4a7cf97e33ed02ffdd2d10733adbe4d98fd4b9530224b20f5021e08e95705991cf143a92d0d84f0bcc5d30a5893f42451bb0ec10134325788", + "0x04123a9464ab167aa30076139d8d977b716a85918f12de86764c00ee1a7c603f9a010100000000000000000000000000000000000000000000000000000000000000000007208c37336c8eae88ad7bbf871a6a05192bff663bf13ee0773449221a2afccbd95a", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x9c35da83f88043b3115f30d93beacec49ca14b6238430bdff196a249c29baa80": [ + "0x0800915baebf56d5795973b2d857139671c2b63adb7ae7b7d1b530a1d93c56ff2a0000000000000000000000000000000000000000000000000000000000000000", + "0x0907a8e57a4c474845196cf4c491399250f3f5de34ee47ff66a2b47ca42efe3ed31464559090b2754d912210b5bd9ece696e0cda8a765e361d40d29483809523ba", + "0x0725e5bc9d7850b93ca1a3491589373e5bfa543dab27fbe55d9379b661118d0ebc07fd9dd001deac489ff78db076a7bf72129a8102dbf623ccc46017c92d871f17", + "0x062e74177eaa9a001aec73ab082780884e38093bc032db314ab7414af140e3536911af9d72891936e057a6fcc3c5e5973bd7fb35481b0c0f63ef4491427d5f230a", + "0x0408fce273ee0c1553e3b2eebd59ca7cb8a863be1f26eaefad72094e7d72212a94010100000000000000000000000000000000000000000000000000000de0b6b3a763fff9209c35da83f88043b3115f30d93beacec49ca14b6238430bdff196a249c29baa80", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + } + } + }, + "codes": [ + { + "codeSize": 0, + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "code": "0x" + }, + { + "codeSize": 0, + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "code": "0x" + }, + { + "codeSize": 3465, + "keccakCodeHash": "0x1747624a26df7a2ccc64170f9fdf64b98868e36285f4f3d3418bc63b1cac3a45", + "hash": "0x22077695cc1515e749aea246da1c0832429ec8db834be69a840c496c187d5bd5", + "code": "0x608060405234801561000f575f80fd5b50600436106100e5575f3560e01c806370a08231116100885780639dc29fac116100635780639dc29fac146101f0578063a9059cbb14610203578063d505accf14610216578063dd62ed3e14610229575f80fd5b806370a08231146101aa5780637ecebe00146101c957806395d89b41146101e8575f80fd5b806323b872dd116100c357806323b872dd14610141578063313ce567146101545780633644e5151461018d57806340c10f1914610195575f80fd5b806306fdde03146100e9578063095ea7b31461010757806318160ddd1461012a575b5f80fd5b6100f1610253565b6040516100fe9190610a52565b60405180910390f35b61011a610115366004610ae4565b6102de565b60405190151581526020016100fe565b61013360025481565b6040519081526020016100fe565b61011a61014f366004610b0c565b610357565b61017b7f000000000000000000000000000000000000000000000000000000000000000681565b60405160ff90911681526020016100fe565b610133610497565b6101a86101a3366004610ae4565b6104f1565b005b6101336101b8366004610b45565b60036020525f908152604090205481565b6101336101d7366004610b45565b60056020525f908152604090205481565b6100f16104ff565b6101a86101fe366004610ae4565b61050c565b61011a610211366004610ae4565b610516565b6101a8610224366004610b65565b610599565b610133610237366004610bd2565b600460209081525f928352604080842090915290825290205481565b5f805461025f90610c03565b80601f016020809104026020016040519081016040528092919081815260200182805461028b90610c03565b80156102d65780601f106102ad576101008083540402835291602001916102d6565b820191905f5260205f20905b8154815290600101906020018083116102b957829003601f168201915b505050505081565b335f81815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103459086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103e9576103b88382610c81565b73ffffffffffffffffffffffffffffffffffffffff86165f9081526004602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff85165f908152600360205260408120805485929061041d908490610c81565b909155505073ffffffffffffffffffffffffffffffffffffffff8085165f81815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104849087815260200190565b60405180910390a3506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000cf5546146104cc576104c76108b7565b905090565b507fdc3435dca418b10e0cd044263a037691aa7a3f09458c668c777ab43e880f269890565b6104fb828261094f565b5050565b6001805461025f90610c03565b6104fb82826109c6565b335f90815260036020526040812080548391908390610536908490610c81565b909155505073ffffffffffffffffffffffffffffffffffffffff83165f81815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103459086815260200190565b42841015610608576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b5f6001610613610497565b73ffffffffffffffffffffffffffffffffffffffff8a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610761573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906107dc57508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016105ff565b73ffffffffffffffffffffffffffffffffffffffff9081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516108e79190610c94565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060025f8282546109609190610d69565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260036020526040812080548392906109fa908490610c81565b90915550506002805482900390556040518181525f9073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016109ba565b5f602080835283518060208501525f5b81811015610a7e57858101830151858201604001528201610a62565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610adf575f80fd5b919050565b5f8060408385031215610af5575f80fd5b610afe83610abc565b946020939093013593505050565b5f805f60608486031215610b1e575f80fd5b610b2784610abc565b9250610b3560208501610abc565b9150604084013590509250925092565b5f60208284031215610b55575f80fd5b610b5e82610abc565b9392505050565b5f805f805f805f60e0888a031215610b7b575f80fd5b610b8488610abc565b9650610b9260208901610abc565b95506040880135945060608801359350608088013560ff81168114610bb5575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215610be3575f80fd5b610bec83610abc565b9150610bfa60208401610abc565b90509250929050565b600181811c90821680610c1757607f821691505b602082108103610c4e577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181038181111561035157610351610c54565b5f8083545f60018260011c91506001831680610cb157607f831692505b60208084108203610ce9577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b818015610cfd5760018114610d3057610d5b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0086168952841515850289019650610d5b565b5f8a8152602090205f5b86811015610d535781548b820152908501908301610d3a565b505084890196505b509498975050505050505050565b8082018082111561035157610351610c5456fea164736f6c6343000818000a" + }, + { + "codeSize": 2796, + "keccakCodeHash": "0x44107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d5", + "hash": "0x18d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f84", + "code": "0x60806040523661001357610011610017565b005b6100115b61001f6102a0565b73ffffffffffffffffffffffffffffffffffffffff1633036102965760607fffffffff000000000000000000000000000000000000000000000000000000005f35167fc9a6301a000000000000000000000000000000000000000000000000000000008101610097576100906102df565b915061028e565b7fb0e10d7a000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216016100e857610090610332565b7f70d7c690000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160161013957610090610376565b7f07ae5bc0000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160161018a576100906103a6565b7fa39f25e5000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216016101db576100906103f2565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b815160208301f35b61029e610405565b565b5f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b60606102e9610415565b5f6102f736600481846108bc565b810190610304919061090b565b905061031f8160405180602001604052805f8152505f61041f565b505060408051602081019091525f815290565b60605f8061034336600481846108bc565b8101906103509190610951565b915091506103608282600161041f565b60405180602001604052805f8152509250505090565b6060610380610415565b5f61038e36600481846108bc565b81019061039b919061090b565b905061031f8161044a565b60606103b0610415565b5f6103b96102a0565b6040805173ffffffffffffffffffffffffffffffffffffffff831660208201529192500160405160208183030381529060405291505090565b60606103fc610415565b5f6103b96104ae565b61029e6104106104ae565b6104bc565b341561029e575f80fd5b610428836104da565b5f825111806104345750805b15610445576104438383610526565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6104736102a0565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a16104ab81610552565b50565b5f6104b761065e565b905090565b365f80375f80365f845af43d5f803e8080156104d6573d5ff35b3d5ffd5b6104e381610685565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b606061054b8383604051806060016040528060278152602001610ab960279139610750565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81166105f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610285565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6102c3565b73ffffffffffffffffffffffffffffffffffffffff81163b610729576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610285565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610618565b60605f808573ffffffffffffffffffffffffffffffffffffffff16856040516107799190610a4d565b5f60405180830381855af49150503d805f81146107b1576040519150601f19603f3d011682016040523d82523d5f602084013e6107b6565b606091505b50915091506107c7868383876107d1565b9695505050505050565b606083156108665782515f0361085f5773ffffffffffffffffffffffffffffffffffffffff85163b61085f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610285565b5081610870565b6108708383610878565b949350505050565b8151156108885781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102859190610a68565b5f80858511156108ca575f80fd5b838611156108d6575f80fd5b5050820193919092039150565b803573ffffffffffffffffffffffffffffffffffffffff81168114610906575f80fd5b919050565b5f6020828403121561091b575f80fd5b61054b826108e3565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f8060408385031215610962575f80fd5b61096b836108e3565b9150602083013567ffffffffffffffff80821115610987575f80fd5b818501915085601f83011261099a575f80fd5b8135818111156109ac576109ac610924565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156109f2576109f2610924565b81604052828152886020848701011115610a0a575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f5b83811015610a45578181015183820152602001610a2d565b50505f910152565b5f8251610a5e818460208701610a2b565b9190910192915050565b602081525f8251806020840152610a86816040850160208701610a2b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a164736f6c6343000818000a" + } + ], + "txStorageTraces": [ + { + "rootBefore": "0x1b46ab6195208d1490fc1385b25bd13f7ca1e27cf9730c5e91df9d3f2663d4e8", + "rootAfter": "0x230f43beef5afc19a07f6346d6d00eb33f614dc0b112683904577c096e4b45ee", + "proofs": { + "0x0742D35CC6634c0532925A3b844bc9E7595f0Beb": [ + "0x092d994d77a291a903e170d9be1493d769fef99791d5206b705bb5fa50f19f33eb0010657c33780cb6768bcefa60a43ab666a0fb6328a426ab982dd02dc01bc58c", + "0x091405014f6aee6bb9610c50007e9480c642a558e8606a2116249954aeba12ebb61d8d30ebb8c0c0130854bff123cc77f0af71a766258ded75b1fe000738af773a", + "0x092a457d1df75eac2b6b79a292cc238e0b25372325f6ee437c0b192e80541169900f4be945f00183f6833f932e2021f6ff5698622457524a20ce21a3921aabce3a", + "0x0921bb6632130832c8d3322922868ec6885988676a015dc8cddaa4a9ad925884f214f4b04aad11a22d617370765cf6f9565a981470066b9992cf1100ba8ac98b5c", + "0x0930156495006c643c429bddeb1525c54237055942ce06d2c649fb92ff38f516d400d247dec7c5069fde342365b2f0a6d229665abb83917d06a43e60c740587af2", + "0x0926ef270d898bf7aab739cb6ce3ee9f34dc532c3b48b39ce0a9f654c48f3ab67008f0e98ac5fe4f888d695f71cbb4331160d1f2da76bfe341d98894fd0d727a04", + "0x092b15971b522af8964f68be0ee71a6a27c9808fe6f21829536adeb7a44cb70c1a1319039112f28c46659061c280f7f7cc6d89f5628788dd34f985a6ef3d4bee5b", + "0x0911411e755306f50353deebe39a344092e6c10168609a12c7e84a1e8c84858c10023eb4873405afbf65168cbc0397b4d5e96801e8c5e21bf41c46bc1d1607e20b", + "0x0907b7a5079fb418510fd9221c5cac6f1c229f5e9f09f3728c7b931370031287652d2fdb5066cbfaef2de67de94cff85a30c5ca2566dc0904f7884850833fe929e", + "0x0700000000000000000000000000000000000000000000000000000000000000001001869b64b2c7ebeb72e535fb80979c828afe40e078aee868d7df1d2b01ac26", + "0x07000000000000000000000000000000000000000000000000000000000000000001462f3af92a7447794c6cd5e0e0dba5a9f92c81db5909d66215c9b1acf05131", + "0x0828baa30d933027f4ac26e25932e1f8dc997753c5d23bc03cfc97500823eb678f1cece90884518dd5016ccd2b79fbe00c1c2a3b67037a41508f7223b7b3d44ee1", + "0x070a5a5ceca262b4d50d9138234e4451711aecf26de2d053af6882c261690ca027042db0541967a6441a3f826f5fcc7f091a0b07bc88d21d227ccd644d72b44a36", + "0x041a41a36901ec07e376de0d0d5409328f7c9ae666006cc427b1f8ad646ce147c105080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098a7d9b8314c00050000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864200742d35cc6634c0532925a3b844bc9e7595f0beb000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8": [ + "0x092d994d77a291a903e170d9be1493d769fef99791d5206b705bb5fa50f19f33eb0010657c33780cb6768bcefa60a43ab666a0fb6328a426ab982dd02dc01bc58c", + "0x0902b7ef64363f91bfb0560c21d5fce791a7b3ed2a4987d3a7b74677f5e83562500e70eb8c482f863b571a8f7df494058ed161b481c623557e575b3cbf9ace6744", + "0x0918ec3f04aa26dfe2fdb34122691277175ffeb34b57b96de91a11020d796b5b372d356a6b810738c488374f48d61c198a5ac8e1a3ba4f2d61f08c3865eb4d757b", + "0x090b330507460f308cae1a19c5dd42fc32de643ad23fa3f6cd92d19767de53bb1a24931ced24212206fa48a12d2f13412c1308ab073b7b877a7ccde133989601e9", + "0x09036c4fee62bb83d523b25829a9143501aea11f0d248381af88746cddffffcb152a55320db3d7b4e9f1b705077d403048b3c33c1916b5d8de233d7472c07435d5", + "0x092bacc030e7201c95030a1aea2839ee9bfee02262d8e0675495fea4338bdfa5060b93139b2487f819fdffdec151f2818018e386879ad255eea57f469d7f164ff6", + "0x0900f088c016ba77fd9f92ce70ea2a1d105cdfc6c6a5d9186a2c187134d4c5a4ee1f827a01e0f0bd9150e982674ab82c9a22ce95795a9ed10a9a835d0bcf661a10", + "0x08226fcdc8a51015fed72c5a80338b3148ab72c12ebb656d6c819ff7360e423b6a0000000000000000000000000000000000000000000000000000000000000000", + "0x0822d381e78bb6e50e7ba420e48dd800c957d5cfb3c12f7bb8b886c2cf7fac5e3b279d4cc5e7505586cc8589f4ea81af6d0dc4cf1a13b35fb8130cd836b8464d54", + "0x0407edffb2f516756416f9cd6da120841b708d8ba8e0ae76133c0022b273252174050800000000000000000000000000000000000000000000000000000000000000000014001fffffffffffffffffffffffffffffffffffffffffffff59776f638fc0477e0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b648642070997970c51812dc3a010c7d01b50e0d17dc79c8000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9": [ + "0x092d994d77a291a903e170d9be1493d769fef99791d5206b705bb5fa50f19f33eb0010657c33780cb6768bcefa60a43ab666a0fb6328a426ab982dd02dc01bc58c", + "0x091405014f6aee6bb9610c50007e9480c642a558e8606a2116249954aeba12ebb61d8d30ebb8c0c0130854bff123cc77f0af71a766258ded75b1fe000738af773a", + "0x092a06163d398088f873c062a317a00fd3db764138a54e7cdc629709208dfa6c1f1ffa7282f31cb8686e18f6ef867ce8984e88aca684e8f3dca2b01557372bcf88", + "0x09055073efa8d18f7b39ca93783a3d0757684b088fa9c40989ecdd11a6582d7d2211e1dbe277107125aabb9d8ba78abedc4f4f2468f4c3cfc894b086f9f5616b6b", + "0x090a7c3800a5755f417498f13fdf72cfb79d5fb1d507126644dbd95c01a9c7cd6605e9dc638978400983b610b9f7501e49155663714a078df378de55d05316b29c", + "0x092117dac84ff3dc2cdee910557bf7a16284dbe01c4f931825930b624db9d6fd82191b540896cb0110ce00fab2146b62ad305feb062c1b4b6a61d98073b5f2e5ae", + "0x0924707b7d8c5c174b74155afb69b00d311be63554d796c1882c7f105564e0c0dd0879c20326089af5838976b5e646a16d9394299fda517fc5a4021bcb9a32bf14", + "0x060f06127668bb1bdd54f6294e02b62b0098b7cc5ed0140cbcf437bb5a55a7412b2a0737c2deb147ec81ef8b9412458b632afa5b67f05777285de308dfa4911a11", + "0x041578b561ae8e97e3c6cdd2fe55167ee977e55548f3010b69ed60bf9e61c9eaaf05080000000000000000000000000000000000000000000000000d8900000000000000010000000000000000000000000000000000000000000000000000000000000000249d8e9ce6f409bde3615b3cdd25b795e4cedbbcaad5b2ec78f52dcdde0c0fc31747624a26df7a2ccc64170f9fdf64b98868e36285f4f3d3418bc63b1cac3a4522077695cc1515e749aea246da1c0832429ec8db834be69a840c496c187d5bd520cf7ed3acca5a467e9e704c703e8d87f634fb0fc9000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xFABB0ac9d68B0B445fB7357272Ff202C5651694a": [ + "0x092d994d77a291a903e170d9be1493d769fef99791d5206b705bb5fa50f19f33eb0010657c33780cb6768bcefa60a43ab666a0fb6328a426ab982dd02dc01bc58c", + "0x091405014f6aee6bb9610c50007e9480c642a558e8606a2116249954aeba12ebb61d8d30ebb8c0c0130854bff123cc77f0af71a766258ded75b1fe000738af773a", + "0x092a457d1df75eac2b6b79a292cc238e0b25372325f6ee437c0b192e80541169900f4be945f00183f6833f932e2021f6ff5698622457524a20ce21a3921aabce3a", + "0x092ee6a5cff1508574915e5c5fa61134dcb9946427ead4b12c3273e9b97a0b77a6001854e8380fbd58620925780f3ed2d0abeea5a13b4e0a4e0a51f59b9b5ec3c0", + "0x09174cfdf2f1e0c6fe4cab85c20ea084898c0e359ada326bd1d38abce77a6ea2492137ebae927de9055c704eaf20176efd3688db2f24e0b7e0a197ed67abc806f0", + "0x0921e218fe94e8e55e46d83b3c61bc6d8f60c2262bf59669299b70dcfe52d8b7442cd91c7a4c36943da038bcb35dde8dd004b83e190a17e35d1bda9011ae062f99", + "0x092173e847844f75d655ac0690b26ee3bf3e65a3c0062f9b9be566e74cd41927df12b7fd5527c406a10b999c59c3c6a1f781797558a36b7fbdadd2d2cf435c1e25", + "0x07000000000000000000000000000000000000000000000000000000000000000002c01b849e25a91dd222e8d006ae918579a6bff12484cc758a8c43c8d6ce0017", + "0x080931f89fedde2fe071003121dcbbc15662cc71fc96127a81b17ca72f1dc81d620000000000000000000000000000000000000000000000000000000000000000", + "0x070d53acb57a8c223e5af81f5dbf1d80922525be5a8d4e45f5f09ff8580a16e210159ad10b4c89ff16157cc364c81f6039eeea9a8eb87e4b4700249219e71cc3ef", + "0x0403d2c88868dc8b5f7994604147a8246c48cc905235de980c42c3e78f351f00c505080000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000f76b616411d0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420fabb0ac9d68b0b445fb7357272ff202c5651694a000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "storageProofs": { + "0x5300000000000000000000000000000000000021": { + "0x6d01ba8ffed4ce500f24b73f45df7dc163a96f64ced987d8ee795c34e371362e": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x091e999ad0969a892635449070e98a13e662492f946d6ba9efaccf52ab53e7875e2cbbe5bbc301a45411f8c9d9639b312ddcaffd9fb0598f3bf73f656f309fcb4d", + "0x0904314d470dc20d9ee18b9434c6fff6e9cc5c211a2e469cdeb00b69942bccfb7c0b567c74e6484b887c320ed6b5c14a50a89fe400b3eb13ed5a5e86880a65aea0", + "0x061c7c2370b89156b28f4141e6320159e799f8353ac328f91eadd9c65a06fad2a628b3bf9a92d906051defc60a366063e6d133f3bb15dc661dad6b57e1f51f95e6", + "0x040959c4a1b3fc665dce20b30216d51dd0141a6738567cfbbf2054a1bc710af948010100000000000000000000000000000000000000000000000000049824fc6fcac9f3ba206d01ba8ffed4ce500f24b73f45df7dc163a96f64ced987d8ee795c34e371362e", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c1f": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x0919e44f4c1854907175b4b2b5a0c96536103adcca1baf40cffa44b0331a8901db2603c9a992dc69a6b684dc301f77cc1c4e9e8a4dd972d15f4cd2ed974c4a79cc", + "0x090dec3fded5debc4bba8aa761a657e8f3bbf01043cb27c6fe8889998a0887b24718683552e0d0dfb464626d6d970adb45c97d9934acaa537b7d7ac0539b53d359", + "0x0813405dada82f833e1a1f8a09f3d0272ad6b162baccede0af919f196392fcd8920000000000000000000000000000000000000000000000000000000000000000", + "0x0723e0dc8d0a6f591ebd77a74f4ee964c81484fbcd8ae0c8bada311e7bc460d959281d441c8ab855399e0f22d4ebf178922d8477c39622fc2c4d9eac325eef6f12", + "0x040e11aafee10c1ada84b19baca77f65014d45b4d26b4ce3aef99a36898199d98601010000000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc920f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c1f", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c20": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0910baa0679dfabc98a749e2cf19cf380cf168c5963ed340eb8793275881f1aab91a61ae832a78b0c5b49d6624e781530d6b4a5ae6747aa8024bb5e00238b397e8", + "0x09128488b0bbdf573df71a726be2ff9a53c1c3ebea2d83da9bc818082d6114154e2f22abdf8825ed09c438ab5e357d601c5008c108986a0f79604020d03dd5658e", + "0x092ce0544b0f1037241d83b784217e1db71aed02f6bb6cbae678f12d8193e6fa561125c8bd98a62433fd57539d6de2d621f4f27c9a5a0a131df210d20fd063a298", + "0x0914bb75030a49de47a3568a2e726e3917e1508d35184c4436116ab72a8d57e65d08d136d73cfd57d8c8015158a423a463519cf14810f6d417259b71dd7bf648d6", + "0x0803dcf8e3b0f9009bdb5cc45234cdc34d8b90bc39e93768b8e8ff8688e950f15f0000000000000000000000000000000000000000000000000000000000000000", + "0x0617b0f320c1804f82f63a90e5e742227da35743a460ca351c5b6fd9481941d68a300c25969dcd82b2b69e782cd8d7535ea8d97f409cadb1187efbe5d940dce947", + "0x040ce6415daf9119eaa403a2266a11c8e6ea133c74e056da323547a0115ecd9f8901010000000000000000000000000000000000000000000000000000000000000000000420f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c20", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c21": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x0919e44f4c1854907175b4b2b5a0c96536103adcca1baf40cffa44b0331a8901db2603c9a992dc69a6b684dc301f77cc1c4e9e8a4dd972d15f4cd2ed974c4a79cc", + "0x0925ffe896678956add403385939c3f41f2db8bff412c9cc8d8f0590cef223288f1bbbbc549a61adc7a091da47883f9c34951e785f75cce8226f3ffdd7189d71b4", + "0x09282aa159b4c043af9c744e12ae4c4836a6fad029715cd87972d9b86e31466cf505f95afda0666a080bb144051a34ee842f918d97623213ca6c0b3537d6aab3d5", + "0x0923dcac699b2bc22dc2f7fa81bf06b44a951d3142c20fc0663b738e658d07ad6204469cd5cb700f31d2934e01feb4321e5be7476821bf1dde82369b6d764ec9dd", + "0x081ecccb20e28882de75addf9eec71a1b14d8fa7b4bd8d7322c4a3dc98c2e085d70000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000001a4fed6b9ad33da7ca3fff4cfb1669e16d80ea7547466dc8dcd67313b34b8787", + "0x082e81ca75173eddf06730891a8f9596f671a7d43cfff11669d4dbfda376538f3e0000000000000000000000000000000000000000000000000000000000000000", + "0x070000000000000000000000000000000000000000000000000000000000000000045d9db03e27071fd4b78117e0e472e06a4eb440617f3ed1e684a5f352856f1f", + "0x080b54e05661b49468d95e43a2ea570347ee51cf309b34b76425adde9b4811b50a18d1292738ab018ea00b3f5f4def62bd9396f9d1caadf29c4be6f2c4833e8035", + "0x062b11db9f1c375e2991097c0da6db9f65ee67825fec9a9613755ca0814cab2fc10154484431d37f9c311e65c4a516c144975b04c404eae5b908e141b3df6ccf92", + "0x0409130a06ba75cb64ae567f1af4e20969bcad96dedcf63d1e434f3f6dc966ca9201010000000000000000000000000000000000000000000000000000000000000000060120f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c21", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c22": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0910baa0679dfabc98a749e2cf19cf380cf168c5963ed340eb8793275881f1aab91a61ae832a78b0c5b49d6624e781530d6b4a5ae6747aa8024bb5e00238b397e8", + "0x0901dd7acbf5ebcbdec718df5774b877e62c16725cd43f07a7bbed7920c5825bb827d74048a99c16ca943362467a7232acba34083af75d10df8c6db36857d01b4c", + "0x0900dc2acf77d008cd9bc982319f8ecdd4d2ecff285b0b66882f4fa9eb1dff1f29183cf679b7f04d5c7327a1bfbd66754f84cc0a9e47ece70d5a7369ab612aed42", + "0x090b90fc0f2f16ef66c025e559d404c4d5fc49562899599a5348d307090c6a4e75078a35b037fa17e0b7801e7df716d17bf9015921ba9961df657c5776da6cc41f", + "0x072415b967f38129cf7e76297d7eb0462e470ee8a443503d59b3b1faecb081590829ea4234c57072a69a28d9575d618f0432d8cc99c29689bd3fda0e3954fa1918", + "0x08028439355a6f136af7432fe618a91dca0933acbc2375aa0a1ca90633b928815811a4b142f80899b94192f56c30e2545b0f60d45246f89520b827da4245440b0a", + "0x0426021fba3d566dfc3284c8ace6e55cbf07f0864ebec2f8f1a14e7d1d1294ecf70101000000000000000000000000000000000000000000000000000000000000000f424020f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c22", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9": { + "0x8c37336c8eae88ad7bbf871a6a05192bff663bf13ee0773449221a2afccbd95a": [ + "0x0800915baebf56d5795973b2d857139671c2b63adb7ae7b7d1b530a1d93c56ff2a0000000000000000000000000000000000000000000000000000000000000000", + "0x0907a8e57a4c474845196cf4c491399250f3f5de34ee47ff66a2b47ca42efe3ed31464559090b2754d912210b5bd9ece696e0cda8a765e361d40d29483809523ba", + "0x0806d0912eeffce1e8be7f0aa32776cb18f295a1ddfe4db5a11b8cc6fb71d1ddf60000000000000000000000000000000000000000000000000000000000000000", + "0x0607bb43435f21e2a4a7cf97e33ed02ffdd2d10733adbe4d98fd4b9530224b20f5021e08e95705991cf143a92d0d84f0bcc5d30a5893f42451bb0ec10134325788", + "0x04123a9464ab167aa30076139d8d977b716a85918f12de86764c00ee1a7c603f9a010100000000000000000000000000000000000000000000000000000000000000000007208c37336c8eae88ad7bbf871a6a05192bff663bf13ee0773449221a2afccbd95a", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x9c35da83f88043b3115f30d93beacec49ca14b6238430bdff196a249c29baa80": [ + "0x0800915baebf56d5795973b2d857139671c2b63adb7ae7b7d1b530a1d93c56ff2a0000000000000000000000000000000000000000000000000000000000000000", + "0x0907a8e57a4c474845196cf4c491399250f3f5de34ee47ff66a2b47ca42efe3ed31464559090b2754d912210b5bd9ece696e0cda8a765e361d40d29483809523ba", + "0x0725e5bc9d7850b93ca1a3491589373e5bfa543dab27fbe55d9379b661118d0ebc07fd9dd001deac489ff78db076a7bf72129a8102dbf623ccc46017c92d871f17", + "0x062e74177eaa9a001aec73ab082780884e38093bc032db314ab7414af140e3536911af9d72891936e057a6fcc3c5e5973bd7fb35481b0c0f63ef4491427d5f230a", + "0x0408fce273ee0c1553e3b2eebd59ca7cb8a863be1f26eaefad72094e7d72212a94010100000000000000000000000000000000000000000000000000000de0b6b3a763fff9209c35da83f88043b3115f30d93beacec49ca14b6238430bdff196a249c29baa80", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + } + } + } + ], + "executionResults": [ + { + "l1DataFee": "0x0", + "feeTokenID": 4, + "feeRate": "0x49824fc6fcac9f3ba", + "tokenScale": "0xf4240", + "feeLimit": "0x0", + "gas": 21000, + "failed": false, + "returnValue": "", + "from": { + "address": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", + "nonce": 20, + "balance": "0x1fffffffffffffffffffffffffffffffffffffffffffff59776f638fc0477e", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + "to": { + "address": "0x0742d35cc6634c0532925a3b844bc9e7595f0beb", + "nonce": 0, + "balance": "0x98a7d9b8314c0005", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + "accountAfter": [ + { + "address": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", + "nonce": 21, + "balance": "0x1fffffffffffffffffffffffffffffffffffffffffffff59776f638fc0477d", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + { + "address": "0x0742d35cc6634c0532925a3b844bc9e7595f0beb", + "nonce": 0, + "balance": "0x98a7d9b8314c0006", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + { + "address": "0xfabb0ac9d68b0b445fb7357272ff202c5651694a", + "nonce": 0, + "balance": "0x200000000000000000000000000000000000000000000000000f76b616411d", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + } + ], + "structLogs": [], + "callTrace": { + "from": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", + "gas": "0x5208", + "gasUsed": "0x5208", + "to": "0x0742d35cc6634c0532925a3b844bc9e7595f0beb", + "input": "0x", + "value": "0x1", + "type": "CALL" + } + } + ], + "withdraw_trie_root": "0x27ae5ba08d7291c96c8cbddcc148bf48a6d68c7974b94356f53754ef6171d757", + "sequencer_set_verify_hash": "0x22efe8537c043bf1a471893cba84c8cd29a0d3ea62ad7c4ada032136254ad6c9", + "startL1QueueIndex": 0 + } + ] +] \ No newline at end of file diff --git a/prover/testdata/altfeetx/trace_slot_another.json b/prover/testdata/altfeetx/trace_slot_another.json new file mode 100644 index 000000000..39f514d85 --- /dev/null +++ b/prover/testdata/altfeetx/trace_slot_another.json @@ -0,0 +1,589 @@ +[ + [ + { + "chainID": 53077, + "version": "2.0.8-mainnet-a99f2d52", + "coinbase": { + "address": "0xfabb0ac9d68b0b445fb7357272ff202c5651694a", + "nonce": 0, + "balance": "0x200000000000000000000000000000000000000000000000000f76b616411d", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + "header": { + "parentHash": "0x6db0ae465191a5e6bf48946369aa513edaaf5de4aa79fe62e88102be4afe7cdb", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "miner": "0x0000000000000000000000000000000000000000", + "stateRoot": "0x0fb51f966fc7e8d78378d3221b0477b93da05dbbd17b0aa1b95acdeb65f61cb1", + "transactionsRoot": "0x70ee3a7a5de9cfbc1911c9f0927445eb8b15a1e3ddb5e207fc8f8d735e9105e4", + "receiptsRoot": "0x9e157a1373d72468d334ef1a03289b11fd0cf9cde7e19a92556ac18acff21d74", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000", + "difficulty": "0x0", + "number": "0x72e0", + "gasLimit": "0x1c9c380", + "gasUsed": "0x5208", + "timestamp": "0x69257729", + "extraData": "0x", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x0000000000000000", + "nextL1MsgIndex": "0x0", + "batchHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "baseFeePerGas": "0xf4240", + "withdrawalsRoot": null, + "blobGasUsed": null, + "excessBlobGas": null, + "parentBeaconBlockRoot": null, + "requestsHash": null, + "hash": "0x450336112ac680405aeb183926b7dd6240bb15a125b05cfefc2ba64c8c57b29f" + }, + "transactions": [ + { + "type": 127, + "nonce": 23, + "txHash": "0x1679201f9d05a5a710447dec778cf4a773a64971386d399e3b6b79b42394150d", + "gas": 21000, + "gasPrice": "0x3d0900", + "gasTipCap": "0x1e8480", + "gasFeeCap": "0x3d0900", + "feeTokenID": 4, + "feeLimit": "0x9184e72a000", + "from": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", + "to": "0x0742d35cc6634c0532925a3b844bc9e7595f0beb", + "chainId": "0xcf55", + "value": "0x1", + "data": "0x", + "isCreate": false, + "accessList": [], + "v": "0x0", + "r": "0x9fbcf985868bc436864ccfef7e9ef59c4857a4976cc834a95bb83850e5a20da6", + "s": "0x445cdfa2e9ae9d0911099c19c7363322d4c3f572885e7edd6bc9f1af3d80636" + } + ], + "storageTrace": { + "rootBefore": "0x0f75dac4d10978f55932475e3ab1041d657666720d877e808c87317d9de12e7f", + "rootAfter": "0x0fb51f966fc7e8d78378d3221b0477b93da05dbbd17b0aa1b95acdeb65f61cb1", + "proofs": { + "0x0742D35CC6634c0532925A3b844bc9E7595f0Beb": [ + "0x0913be3722007e511e5a39c86db33fd96b2f6b4e7244f8596dd62d4a275c0393132222256583d912174004897728fbab2a5038d9b84b0981ba4467f8cbf900eeaf", + "0x090809181c074a1a0083c8ea29db41ebd96028937303050160f033c56e698003411357edea9797879e64ad77acb2231ab7e6df3f2d5e7110199d3c842510484ad0", + "0x0924133f63b4cff130a1f6e77c0198c6afb905eba0f0473e2986e30ebce4fae2180f4be945f00183f6833f932e2021f6ff5698622457524a20ce21a3921aabce3a", + "0x092e39637937176f646ed70c7a03609d343d6f605240ec74ca8e8a9f276af3f1f514f4b04aad11a22d617370765cf6f9565a981470066b9992cf1100ba8ac98b5c", + "0x0928891067f3bff831effa4d32af6564f8ab1243d8ce137c79c39a4b81830a728c00d247dec7c5069fde342365b2f0a6d229665abb83917d06a43e60c740587af2", + "0x0921e52be4e48113937c9518f8f807680050580b0e2d6bf47e8b1c147f4e4b4d4108f0e98ac5fe4f888d695f71cbb4331160d1f2da76bfe341d98894fd0d727a04", + "0x092b15971b522af8964f68be0ee71a6a27c9808fe6f21829536adeb7a44cb70c1a12b75bc5b5595ac2a0695af6ef7dbe5750433e1fb9e99ca29115a33c7585108d", + "0x0911411e755306f50353deebe39a344092e6c10168609a12c7e84a1e8c84858c10075a8dc059fb7fe4ca2b95555162ba7fe86ed4b3f2829397f0ab8ed7e3442663", + "0x0907b7a5079fb418510fd9221c5cac6f1c229f5e9f09f3728c7b931370031287652dcf5e0d5da47acd07b3b60f81704503ccbdf26898da7922ee3a3e63ae90ba6d", + "0x0700000000000000000000000000000000000000000000000000000000000000000ec32ecc8117bc12482a0319f7be3c4601a565bf3217a9df3552d040459cc12c", + "0x07000000000000000000000000000000000000000000000000000000000000000029e1c0b1239387fff6db2d405754bf1cf5ae3422cf26702fd858584f2b1e2e47", + "0x082b5b8c2fbe542487466ad4a634aecc98099c710944e499e43a3d34e8ce07f9a51cece90884518dd5016ccd2b79fbe00c1c2a3b67037a41508f7223b7b3d44ee1", + "0x0711db8406fc8063e32fc4ca0f0faed8d31c5e1278d9d5e41c790f0c1ed43fc77e042db0541967a6441a3f826f5fcc7f091a0b07bc88d21d227ccd644d72b44a36", + "0x041a41a36901ec07e376de0d0d5409328f7c9ae666006cc427b1f8ad646ce147c105080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098a7d9b8314c00080000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864200742d35cc6634c0532925a3b844bc9e7595f0beb000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5300000000000000000000000000000000000001": [ + "0x0913be3722007e511e5a39c86db33fd96b2f6b4e7244f8596dd62d4a275c0393132222256583d912174004897728fbab2a5038d9b84b0981ba4467f8cbf900eeaf", + "0x0927d8efe3143eb96bb435559ef28d9ab4f7ffa31e4462a7b85b9c674e8c2185170e70eb8c482f863b571a8f7df494058ed161b481c623557e575b3cbf9ace6744", + "0x092dc8bcc52b5bf24ee1ae627059ebfde2c83d3c3389610f08050f11e9f6a437720a7e335771fa2c19e0bd11dd9604968aa7a81ed4ecf74bda066058c70cbaebf2", + "0x090148e32ea3877d9a2f510bf3ebeb1c9c3d90d79033bf6a2a912db89122983e1006921c2f3b60bbd12dae3fc369a599b847b18e90e7cbb03a76e5a43f895671df", + "0x091037dd57995a394370ce77d18031e7fdd716725f6cd90a047d8c84c88da15d2c05439eeedb12605248ea72151df5e0b74353566dadc219214393e36290243f63", + "0x090c311950521cda0cdca65f368c0fca2eae6b063232fb84eac9ed027e9834aac8183d898dec71e85c4ba675301636453030beea2a744967a50159574a47b0c9f6", + "0x091cde134960925ee62cea9c340d6241c548fa0978ceca2965c87acccaf8b2805322d288ea2a9d771a19771658abf5a64fd503f4ed277aa8d6f779137a88ea1c8d", + "0x091dba2418c5fdd917fcdeff144d6017c58fac6c5ab448ef2a790ab85e36f9099a20a8a95c49033e899476e2d9c2c98bf1ec0d3423c4d3f31ddea9af65a3a27945", + "0x09220b163279be211a426832f5ff47e0ecadb5bd5eaaf0d62189998fde4e14e629126d21b3294439db0a7819880feb71e44daa89510b4e7415bad226dafdba0c1d", + "0x08150feb81fe1639286c75adb93e5467d36ad52d9ff00e0c706bc5345f6dcd49500000000000000000000000000000000000000000000000000000000000000000", + "0x081cb430cbc5dd11f62a713fb3656184085386104dc53fc135fb3c56dba49670500000000000000000000000000000000000000000000000000000000000000000", + "0x060c320ff8f6c3907ae6df62a7fe70e2be093390bd246197d5f56b6bce56f513f812fac8f51e3812914c097147217411381b9b2dad76963ef63c261885d3a49223", + "0x0427cfcbd2fe87474008e199ef5bff09273803bbf38032c75a36a7726b3c88f8a205080000000000000000000000000000000000000000000000000aec000000000000000000000000000000000000000000000000000000000000000000000000000000002198e2c16011cd18ef5be82557ea4552a16cc88ed8026d68fc38a18776550fa944107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f8400", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x530000000000000000000000000000000000000f": [ + "0x0913be3722007e511e5a39c86db33fd96b2f6b4e7244f8596dd62d4a275c0393132222256583d912174004897728fbab2a5038d9b84b0981ba4467f8cbf900eeaf", + "0x0927d8efe3143eb96bb435559ef28d9ab4f7ffa31e4462a7b85b9c674e8c2185170e70eb8c482f863b571a8f7df494058ed161b481c623557e575b3cbf9ace6744", + "0x0918ec3f04aa26dfe2fdb34122691277175ffeb34b57b96de91a11020d796b5b371ae7733a80d9755671d52c8e28599b95ba033f1be663cff98bdf29dfe8c74291", + "0x092095e03a6c163738018ddb4e1cdc171ed8306b711a78a59e07798e60d974a8f52e51ae1fc969dfd817613e2e6ee8062cd343612928fc1f2a8be5a4053032a3e0", + "0x090430edc094dcb51bb128e4db1e27812218fcb3b88806da90445fe07b5ca18e3006767c9fc9e8eb4a72272bf69aef6ef5cf6ab77620acf76754cdff87c31dfa41", + "0x090d2955877b59dd23203eda776f580ddea39d387b90e4178cc7fb41f83080ab1c1558ebda9c7a671a601af519b323ca394a262519dacf80a90f66dc0ce90e6572", + "0x09101b44cf1f33794d2a3078cb1acdfc64b79980839d80127d34998e67a32c6aa42a16300f95ebb8c46e4e6ede02b7fa4944ecc1315bc8b7a2de274188b5f6f6d3", + "0x0923bfab6f7b9cc20bae8ca8989ad45df9625cf0c14ee54257ffd31b2593b8385f219d7fa978c4389f2ee5a1be328f17e3df180f18177925171afd5a1ae5493b93", + "0x06179596d8aa933023605d9c3eaad2b08f7893d5b65f8ddce4d36c97f541e11d892a868ae99ff40d43cff3f28ff0655bf467eaa89e3d3a1493203e4abb26099b3b", + "0x0418a86f98026d1a55f6fee616f04d51be16c033651ffaafb0514287ec067d04e805080000000000000000000000000000000000000000000000000aec0000000000000000000000000000000000000000000000000000000000000000000000000000000002f56e29848865e204296c51c2fa18997db9888d7dd5a3e9ed3c726e278c099744107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f8400", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5300000000000000000000000000000000000017": [ + "0x0913be3722007e511e5a39c86db33fd96b2f6b4e7244f8596dd62d4a275c0393132222256583d912174004897728fbab2a5038d9b84b0981ba4467f8cbf900eeaf", + "0x0927d8efe3143eb96bb435559ef28d9ab4f7ffa31e4462a7b85b9c674e8c2185170e70eb8c482f863b571a8f7df494058ed161b481c623557e575b3cbf9ace6744", + "0x0918ec3f04aa26dfe2fdb34122691277175ffeb34b57b96de91a11020d796b5b371ae7733a80d9755671d52c8e28599b95ba033f1be663cff98bdf29dfe8c74291", + "0x092095e03a6c163738018ddb4e1cdc171ed8306b711a78a59e07798e60d974a8f52e51ae1fc969dfd817613e2e6ee8062cd343612928fc1f2a8be5a4053032a3e0", + "0x0910b1ec1393c71d2fb5f6024dc8b3b21f75c8de647d481b0121dce322076582d82ca08ae593596704180b0f3f4c8f0bf9f9c8831cff2868f401b67a261813c939", + "0x0901603144c1255abe7e4dccedabde2d3acb83cccfc845602366ed7db86fcea8062dae21e4c5cee679a94325a7d6f9aa0b595a42f165e7bcda729f860111329f61", + "0x090e11cb818c1c31b2c42077bce95e1ac83faec4262e3d214f20345931b381488e1fa1e0f8d195352fc7dfdc1d2cca64062e326f1a44490fb1f715293dc5d56d67", + "0x071e7b646383bbd8defcc230d420cefddd4cae409681ef74ff98bb66527c23473c292161f39efa24ba2d072e47064c6d7ebc45e7890480005cd78d89dc640091c0", + "0x060e3d168eba427cee8d7be26b10e66d5d21b0301485d3cac9c45470fae67ad5031d49523b9f532097709c6c724d41ec10986bc0a4e5d078f5e9f861b56d91b773", + "0x041918c47a133f759975cc95c0dba82051d9b5cd65407e76ef1366a9deaa14f28005080000000000000000000000000000000000000000000000000aec000000000000000000000000000000000000000000000000000000000000000000000000000000002c3cbfa3d0183eb2e332389ef0c7a5e5d73cf155103c3ac0eddefa9e2beae91c44107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f8400", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5300000000000000000000000000000000000021": [ + "0x0913be3722007e511e5a39c86db33fd96b2f6b4e7244f8596dd62d4a275c0393132222256583d912174004897728fbab2a5038d9b84b0981ba4467f8cbf900eeaf", + "0x090809181c074a1a0083c8ea29db41ebd96028937303050160f033c56e698003411357edea9797879e64ad77acb2231ab7e6df3f2d5e7110199d3c842510484ad0", + "0x092a06163d398088f873c062a317a00fd3db764138a54e7cdc629709208dfa6c1f1753a598697cbe343ad4994b2c27d9956532d41d2601835d45b438f7fc223a33", + "0x092cb3b11908a52cd926de960bc1605ba0ca074809eb4b4eeef23b306cdc8a8774049c9ba7546167504538f67af40a08189fe0b869af3172c62b4c748af3580b28", + "0x0913028f68e22d222f43ddc69482acfe4fffbbb3180065d5f00d63d2d839ab86c718be689dee79760972a42c9c0d3f6b4cc1acf518425ed10b445d1b3798822455", + "0x092638133fc9368332440781bda5fd3a9ab693ecb89f611f26acc785e68e181b7e0e520de80cc858c66d2f4dc02567bbe08c1a8f2bdfef6b10355fb2218c77ec0a", + "0x092166504c35825475687da93a700c997aadb255261bc6ce18ff61cd7182db14122cc3d3cf55c0beec2b0f09e350473bd703a8a84463f135d2c2d45ca19f34503a", + "0x091c746524ed2bcb228d6ebf9953357bb1b618a23fc2fe4302df1108a8a0e35ba122aeab44900556acd8bdd693a47952cb01f194cd72e12a550c7fcbc971ed742f", + "0x08244257efc46fd96db45b1505e03603f8b611a3e9ac4630d1fc9b01b4f5fd714117fac506dee79e5f7f52cb7b1eb174b441f0adee2a477e9c1680eeb5913a7eaf", + "0x071e6f5cd0c216a9cf74d9a8ce13256dd8970a07efacb2c61df9e3a4faab03c2de08738589134993085ec4962792e46613a66798325b297c93eca9ded9189ddfd2", + "0x07084f4e6b01a5eda178901c705a9a69b829618c6785a38c831ad467dc7c2d449115e4567e1f83d13a7fe610cca9aa17ba49bce22eb2edbc7f6242f42dc0c1dfd4", + "0x061dbb1f2fe996371625dbfaa5cd6ca070ed15c020c94e65344db5176087c17770242bf081ac926273432685f64c22d3603904df8edc4ddd3d1724817b14a6b8d6", + "0x040883d4562dfe8ba7ad8176bc2844d35ecc486199d589a152eabcee8398f3aebb05080000000000000000000000000000000000000000000000000aec00000000000000000000000000000000000000000000000000000000000000000000000000000000036c7b3f0434b9a4c98814ec5bfef913a8a785403fcc22d17f1adef51905db1a44107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f84205300000000000000000000000000000000000021000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8": [ + "0x0913be3722007e511e5a39c86db33fd96b2f6b4e7244f8596dd62d4a275c0393132222256583d912174004897728fbab2a5038d9b84b0981ba4467f8cbf900eeaf", + "0x0927d8efe3143eb96bb435559ef28d9ab4f7ffa31e4462a7b85b9c674e8c2185170e70eb8c482f863b571a8f7df494058ed161b481c623557e575b3cbf9ace6744", + "0x0918ec3f04aa26dfe2fdb34122691277175ffeb34b57b96de91a11020d796b5b371ae7733a80d9755671d52c8e28599b95ba033f1be663cff98bdf29dfe8c74291", + "0x092af3174ad9f512c7dde7f4b2058496d31fc7f87f34bf74d397e9c092b44f19ae24931ced24212206fa48a12d2f13412c1308ab073b7b877a7ccde133989601e9", + "0x09036c4fee62bb83d523b25829a9143501aea11f0d248381af88746cddffffcb1526081e0a1a33fa7c8da785fc695eb8c93b170bf92259061d528dc654dfd6e6d0", + "0x092bacc030e7201c95030a1aea2839ee9bfee02262d8e0675495fea4338bdfa50624290bc03486169884c095011bb2435972302374385080cd7f6d85f3122c5980", + "0x0900f088c016ba77fd9f92ce70ea2a1d105cdfc6c6a5d9186a2c187134d4c5a4ee0e435e036911663b3da9826298b2ce80a6e920fd21aadb2f837b362ccae52d40", + "0x0803c07aa92c1dddc92b08025a82eceba3b40ac337f571f45c1216f05b2ff55b4d0000000000000000000000000000000000000000000000000000000000000000", + "0x0822d381e78bb6e50e7ba420e48dd800c957d5cfb3c12f7bb8b886c2cf7fac5e3b0d4474dabac26c440366c6be2b3a5fcf32dfe164d192fe3a6ecc79528800a8db", + "0x0407edffb2f516756416f9cd6da120841b708d8ba8e0ae76133c0022b273252174050800000000000000000000000000000000000000000000000000000000000000000017001fffffffffffffffffffffffffffffffffffffffffffff59776f638fc0477b0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b648642070997970c51812dc3a010c7d01b50e0d17dc79c8000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9": [ + "0x0913be3722007e511e5a39c86db33fd96b2f6b4e7244f8596dd62d4a275c0393132222256583d912174004897728fbab2a5038d9b84b0981ba4467f8cbf900eeaf", + "0x090809181c074a1a0083c8ea29db41ebd96028937303050160f033c56e698003411357edea9797879e64ad77acb2231ab7e6df3f2d5e7110199d3c842510484ad0", + "0x092a06163d398088f873c062a317a00fd3db764138a54e7cdc629709208dfa6c1f1753a598697cbe343ad4994b2c27d9956532d41d2601835d45b438f7fc223a33", + "0x09055073efa8d18f7b39ca93783a3d0757684b088fa9c40989ecdd11a6582d7d2222d9cc86e892dbc1f62e6543af23b8c396027d5cd7f694bfc469c1f10a331063", + "0x091859bdb0a396b24324b27dbc1eb31b1e2a11be6ef195a0163949bfd110ae5a6405e9dc638978400983b610b9f7501e49155663714a078df378de55d05316b29c", + "0x092117dac84ff3dc2cdee910557bf7a16284dbe01c4f931825930b624db9d6fd82271154039f469ae99905dd912dada7d86f601990452854ab904b39b90b1934c3", + "0x091aac8a0d30ffd7f8fb8a12af2c5bd312dfb21329474d0194e744dc4c1c40ea8a0879c20326089af5838976b5e646a16d9394299fda517fc5a4021bcb9a32bf14", + "0x060f06127668bb1bdd54f6294e02b62b0098b7cc5ed0140cbcf437bb5a55a7412b1ed8a44895958e2be9bdb9afc524c6bd7911e9d2f9a196b170033aa252429bec", + "0x041578b561ae8e97e3c6cdd2fe55167ee977e55548f3010b69ed60bf9e61c9eaaf05080000000000000000000000000000000000000000000000000d89000000000000000100000000000000000000000000000000000000000000000000000000000000002637088b2130c2fb167fbd2069cf16994b2aec5dcc359fed6eb4a3d8ddc908481747624a26df7a2ccc64170f9fdf64b98868e36285f4f3d3418bc63b1cac3a4522077695cc1515e749aea246da1c0832429ec8db834be69a840c496c187d5bd520cf7ed3acca5a467e9e704c703e8d87f634fb0fc9000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xFABB0ac9d68B0B445fB7357272Ff202C5651694a": [ + "0x0913be3722007e511e5a39c86db33fd96b2f6b4e7244f8596dd62d4a275c0393132222256583d912174004897728fbab2a5038d9b84b0981ba4467f8cbf900eeaf", + "0x090809181c074a1a0083c8ea29db41ebd96028937303050160f033c56e698003411357edea9797879e64ad77acb2231ab7e6df3f2d5e7110199d3c842510484ad0", + "0x0924133f63b4cff130a1f6e77c0198c6afb905eba0f0473e2986e30ebce4fae2180f4be945f00183f6833f932e2021f6ff5698622457524a20ce21a3921aabce3a", + "0x092ee6a5cff1508574915e5c5fa61134dcb9946427ead4b12c3273e9b97a0b77a6001854e8380fbd58620925780f3ed2d0abeea5a13b4e0a4e0a51f59b9b5ec3c0", + "0x09174cfdf2f1e0c6fe4cab85c20ea084898c0e359ada326bd1d38abce77a6ea2492137ebae927de9055c704eaf20176efd3688db2f24e0b7e0a197ed67abc806f0", + "0x0921e218fe94e8e55e46d83b3c61bc6d8f60c2262bf59669299b70dcfe52d8b7442cd91c7a4c36943da038bcb35dde8dd004b83e190a17e35d1bda9011ae062f99", + "0x092173e847844f75d655ac0690b26ee3bf3e65a3c0062f9b9be566e74cd41927df12b7fd5527c406a10b999c59c3c6a1f781797558a36b7fbdadd2d2cf435c1e25", + "0x07000000000000000000000000000000000000000000000000000000000000000002c01b849e25a91dd222e8d006ae918579a6bff12484cc758a8c43c8d6ce0017", + "0x080931f89fedde2fe071003121dcbbc15662cc71fc96127a81b17ca72f1dc81d620000000000000000000000000000000000000000000000000000000000000000", + "0x070d53acb57a8c223e5af81f5dbf1d80922525be5a8d4e45f5f09ff8580a16e210159ad10b4c89ff16157cc364c81f6039eeea9a8eb87e4b4700249219e71cc3ef", + "0x0403d2c88868dc8b5f7994604147a8246c48cc905235de980c42c3e78f351f00c505080000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000f76b616411d0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420fabb0ac9d68b0b445fb7357272ff202c5651694a000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "storageProofs": { + "0x5300000000000000000000000000000000000001": { + "0x0000000000000000000000000000000000000000000000000000000000000021": [ + "0x0825bcd8ed4a7e39c0f0e835761cda36131dd34f16de95765d2216d997923a52f60e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200", + "0x06216372aa3165a29ee67494a5a9680358be92c254cc5724949e4d52742ba8d57f02a40b5614637fca2783d673559f035f5f5a0588ee27d164bb5375568493200a", + "0x042f683d080c393f5fb2ade2190fd56e8a5e8fa26533acdea8cce25caa236027cc0101000027ae5ba08d7291c96c8cbddcc148bf48a6d68c7974b94356f53754ef6171d75700", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x530000000000000000000000000000000000000f": { + "0x0000000000000000000000000000000000000000000000000000000000000001": [ + "0x09250fbf2587e7f07f1dd72ac26e3245705f67157a2e402a60bcb9c861b5a4d3f7256fbb55c0a0ca65679134f25a5a893427348f9086273c801ff4633c50899f1e", + "0x0904657f17b545183e86b0545adff05a99f8efe788d72e90e01784a1b9f986e35a162b4d479ff13f2af3f0cfaadc6bccc8622dd980f83c7014e947f50577eedaba", + "0x0804422082d7197f691b32c2c4120b44e674d5bd50d4b210f0d4525906237d29871e144bbeb8f4c147dafacf9567e13b1b15e4804a9d74df2da7619735d765c1be", + "0x081341967c7422e5508fc72463c51ace718e18440d00db082bf2184d906f2c9ad90000000000000000000000000000000000000000000000000000000000000000", + "0x07000000000000000000000000000000000000000000000000000000000000000006e79d86dd9c9fa893eb97cd43df98e2d19487b963520202b144a3f4b84f0c45", + "0x080e0f66ccb838bd67cbf343dadf696b6d2aa46137c6c82c4fd6ceaf8d60fe80d60000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000002634b0768a20cec85ef53630d7f4dfc6d1c8c8f76dad4d9014828fc94bf0ded8", + "0x080b10db1b542a2f6c809a2d2cd03aa0c4d4ddcdfd2a1c8a00dc06cdc12bbb976c0000000000000000000000000000000000000000000000000000000000000000", + "0x08144e4aeb02298f8f0545b923bc88172527f7ffdd24eb31a2dccfe887757beb0f0000000000000000000000000000000000000000000000000000000000000000", + "0x07000000000000000000000000000000000000000000000000000000000000000023413c0bd51b56dc557426037ffd25cae18e73e8f116ad6aa3a46aaba671f1e4", + "0x0628e14710ef1f9a6f539110a2d6c693d9389d38836eb9f0e0ea449d3afaede2a6156a0960a84fa4287f66d18b9c39ab9d403fa6b6dddd126f47758aadcb82e122", + "0x0426049ba6de63003492eb078a01a8aa4f4a0e67f28f0955c2eba9101d5d2eea5001010000000000000000000000000000000000000000000000000000000000003b9aca00200000000000000000000000000000000000000000000000000000000000000001", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000002": [ + "0x09250fbf2587e7f07f1dd72ac26e3245705f67157a2e402a60bcb9c861b5a4d3f7256fbb55c0a0ca65679134f25a5a893427348f9086273c801ff4633c50899f1e", + "0x0904657f17b545183e86b0545adff05a99f8efe788d72e90e01784a1b9f986e35a162b4d479ff13f2af3f0cfaadc6bccc8622dd980f83c7014e947f50577eedaba", + "0x0804422082d7197f691b32c2c4120b44e674d5bd50d4b210f0d4525906237d29871e144bbeb8f4c147dafacf9567e13b1b15e4804a9d74df2da7619735d765c1be", + "0x04020953ad52de135367a1ba2629636216ed5174cce5629d11b5d97fe733f07dcc0101000000000000000000000000000000000000000000000000000000000000000009c4200000000000000000000000000000000000000000000000000000000000000002", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000003": [ + "0x09250fbf2587e7f07f1dd72ac26e3245705f67157a2e402a60bcb9c861b5a4d3f7256fbb55c0a0ca65679134f25a5a893427348f9086273c801ff4633c50899f1e", + "0x0700000000000000000000000000000000000000000000000000000000000000002c627348b5769391cdf27c1c6ccd9e7363936623501503e7549c1df6542031b9", + "0x060ee2ca3e190e48951aa8d5bb00d33ba76a92de69a807dfa6f2eaa9881e303f320e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200", + "0x0406c50541f08911ad149aa545dd3d606f86ee63c751a795c7d57f0d3f85e6bdeb01010000000000000000000000000000000000000000000000000000000000003b9aca0000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000006": [ + "0x09250fbf2587e7f07f1dd72ac26e3245705f67157a2e402a60bcb9c861b5a4d3f7256fbb55c0a0ca65679134f25a5a893427348f9086273c801ff4633c50899f1e", + "0x0904657f17b545183e86b0545adff05a99f8efe788d72e90e01784a1b9f986e35a162b4d479ff13f2af3f0cfaadc6bccc8622dd980f83c7014e947f50577eedaba", + "0x0804422082d7197f691b32c2c4120b44e674d5bd50d4b210f0d4525906237d29871e144bbeb8f4c147dafacf9567e13b1b15e4804a9d74df2da7619735d765c1be", + "0x04020953ad52de135367a1ba2629636216ed5174cce5629d11b5d97fe733f07dcc0101000000000000000000000000000000000000000000000000000000000000000009c4200000000000000000000000000000000000000000000000000000000000000002", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000007": [ + "0x09250fbf2587e7f07f1dd72ac26e3245705f67157a2e402a60bcb9c861b5a4d3f7256fbb55c0a0ca65679134f25a5a893427348f9086273c801ff4633c50899f1e", + "0x0904657f17b545183e86b0545adff05a99f8efe788d72e90e01784a1b9f986e35a162b4d479ff13f2af3f0cfaadc6bccc8622dd980f83c7014e947f50577eedaba", + "0x0803f6f6d47db3a7888f229ead7798b1ae14eb8855585ebb4d70f6a2020ac30dbf0000000000000000000000000000000000000000000000000000000000000000", + "0x081824025e42aefa5d18b0a0c39ba03d737dc20b78e6574d948d80d82a52f727d80000000000000000000000000000000000000000000000000000000000000000", + "0x05", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000008": [ + "0x09250fbf2587e7f07f1dd72ac26e3245705f67157a2e402a60bcb9c861b5a4d3f7256fbb55c0a0ca65679134f25a5a893427348f9086273c801ff4633c50899f1e", + "0x0700000000000000000000000000000000000000000000000000000000000000002c627348b5769391cdf27c1c6ccd9e7363936623501503e7549c1df6542031b9", + "0x060ee2ca3e190e48951aa8d5bb00d33ba76a92de69a807dfa6f2eaa9881e303f320e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200", + "0x0419a44eca69f8d5e3651ccf05934126419470106b4b51bb4b96b6230b7d80236701010000000000000000000000000000530000000000000000000000000000000000000b00", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000009": [ + "0x09250fbf2587e7f07f1dd72ac26e3245705f67157a2e402a60bcb9c861b5a4d3f7256fbb55c0a0ca65679134f25a5a893427348f9086273c801ff4633c50899f1e", + "0x0700000000000000000000000000000000000000000000000000000000000000002c627348b5769391cdf27c1c6ccd9e7363936623501503e7549c1df6542031b9", + "0x05", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x5300000000000000000000000000000000000017": { + "0x0000000000000000000000000000000000000000000000000000000000000065": [ + "0x09295b90a00505079f65623858f8e164c095a86cfbb449412829e1fc988749139c2c08ec36e0b240f28727cc2f0e93b4b55b1214857f62e93cd895cd25d6b1fca3", + "0x0924e760587c9b1db469c29fecb46a7a69bf5102811e52577a0be8379118e3506115e6e9020712f91f6ee3d7b78613fdb79c35a4f68cf0438bb49ff403e3d93296", + "0x081e5ac2ec2032e7f34af7c72542b1ff463f5590272545e8a2f4f32e3b5a63eda30e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200", + "0x07165d00aa7e206c00402a408f8fd7708cade38a4505b733034b0395a63d9972db1ddc1c901911c636efb3e2c53251d143b3f5bb4271fb6b9e8837fc0c1f739212", + "0x0700000000000000000000000000000000000000000000000000000000000000002b22b7103e3a83cc758c8e8997b79b6e30988fbe8aa1924fdbe675cd6d5ceed0", + "0x0700000000000000000000000000000000000000000000000000000000000000001f4b453328057d0249978fe5ee1e635e4671f325a2bcf3449ef1637170859c43", + "0x0623965bae207a394b8516562f391edb1cdc19cad8d2aa324db42a44fd0810fd550a36302dbd0bcb8ba381bd22b85ded888e754404629c06c2b7801c87978dfd6f", + "0x042115c9b0a0938aa1ce2e8c01581e5aa931288249a453588de70cf2c5dae26a7b0101000022efe8537c043bf1a471893cba84c8cd29a0d3ea62ad7c4ada032136254ad6c9200000000000000000000000000000000000000000000000000000000000000065", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x5300000000000000000000000000000000000021": { + "0x000000000000000000000000000000000000000000000000000000000000009a": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x091e999ad0969a892635449070e98a13e662492f946d6ba9efaccf52ab53e7875e2cbbe5bbc301a45411f8c9d9639b312ddcaffd9fb0598f3bf73f656f309fcb4d", + "0x0904314d470dc20d9ee18b9434c6fff6e9cc5c211a2e469cdeb00b69942bccfb7c0b567c74e6484b887c320ed6b5c14a50a89fe400b3eb13ed5a5e86880a65aea0", + "0x061c7c2370b89156b28f4141e6320159e799f8353ac328f91eadd9c65a06fad2a628b3bf9a92d906051defc60a366063e6d133f3bb15dc661dad6b57e1f51f95e6", + "0x040959c4a1b3fc665dce20b30216d51dd0141a6738567cfbbf2054a1bc710af948010100000000000000000000000000000000000000000000000000049824fc6fcac9f3ba206d01ba8ffed4ce500f24b73f45df7dc163a96f64ced987d8ee795c34e371362e", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x6d01ba8ffed4ce500f24b73f45df7dc163a96f64ced987d8ee795c34e371362e": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x091e999ad0969a892635449070e98a13e662492f946d6ba9efaccf52ab53e7875e2cbbe5bbc301a45411f8c9d9639b312ddcaffd9fb0598f3bf73f656f309fcb4d", + "0x0904314d470dc20d9ee18b9434c6fff6e9cc5c211a2e469cdeb00b69942bccfb7c0b567c74e6484b887c320ed6b5c14a50a89fe400b3eb13ed5a5e86880a65aea0", + "0x061c7c2370b89156b28f4141e6320159e799f8353ac328f91eadd9c65a06fad2a628b3bf9a92d906051defc60a366063e6d133f3bb15dc661dad6b57e1f51f95e6", + "0x040959c4a1b3fc665dce20b30216d51dd0141a6738567cfbbf2054a1bc710af948010100000000000000000000000000000000000000000000000000049824fc6fcac9f3ba206d01ba8ffed4ce500f24b73f45df7dc163a96f64ced987d8ee795c34e371362e", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c1f": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x0919e44f4c1854907175b4b2b5a0c96536103adcca1baf40cffa44b0331a8901db2603c9a992dc69a6b684dc301f77cc1c4e9e8a4dd972d15f4cd2ed974c4a79cc", + "0x090dec3fded5debc4bba8aa761a657e8f3bbf01043cb27c6fe8889998a0887b24718683552e0d0dfb464626d6d970adb45c97d9934acaa537b7d7ac0539b53d359", + "0x0813405dada82f833e1a1f8a09f3d0272ad6b162baccede0af919f196392fcd8920000000000000000000000000000000000000000000000000000000000000000", + "0x0723e0dc8d0a6f591ebd77a74f4ee964c81484fbcd8ae0c8bada311e7bc460d959281d441c8ab855399e0f22d4ebf178922d8477c39622fc2c4d9eac325eef6f12", + "0x040e11aafee10c1ada84b19baca77f65014d45b4d26b4ce3aef99a36898199d98601010000000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc920f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c1f", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c20": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0910baa0679dfabc98a749e2cf19cf380cf168c5963ed340eb8793275881f1aab91a61ae832a78b0c5b49d6624e781530d6b4a5ae6747aa8024bb5e00238b397e8", + "0x09128488b0bbdf573df71a726be2ff9a53c1c3ebea2d83da9bc818082d6114154e2f22abdf8825ed09c438ab5e357d601c5008c108986a0f79604020d03dd5658e", + "0x092ce0544b0f1037241d83b784217e1db71aed02f6bb6cbae678f12d8193e6fa561125c8bd98a62433fd57539d6de2d621f4f27c9a5a0a131df210d20fd063a298", + "0x0914bb75030a49de47a3568a2e726e3917e1508d35184c4436116ab72a8d57e65d08d136d73cfd57d8c8015158a423a463519cf14810f6d417259b71dd7bf648d6", + "0x0803dcf8e3b0f9009bdb5cc45234cdc34d8b90bc39e93768b8e8ff8688e950f15f0000000000000000000000000000000000000000000000000000000000000000", + "0x0617b0f320c1804f82f63a90e5e742227da35743a460ca351c5b6fd9481941d68a300c25969dcd82b2b69e782cd8d7535ea8d97f409cadb1187efbe5d940dce947", + "0x040ce6415daf9119eaa403a2266a11c8e6ea133c74e056da323547a0115ecd9f8901010000000000000000000000000000000000000000000000000000000000000000000420f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c20", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c21": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x0919e44f4c1854907175b4b2b5a0c96536103adcca1baf40cffa44b0331a8901db2603c9a992dc69a6b684dc301f77cc1c4e9e8a4dd972d15f4cd2ed974c4a79cc", + "0x0925ffe896678956add403385939c3f41f2db8bff412c9cc8d8f0590cef223288f1bbbbc549a61adc7a091da47883f9c34951e785f75cce8226f3ffdd7189d71b4", + "0x09282aa159b4c043af9c744e12ae4c4836a6fad029715cd87972d9b86e31466cf505f95afda0666a080bb144051a34ee842f918d97623213ca6c0b3537d6aab3d5", + "0x0923dcac699b2bc22dc2f7fa81bf06b44a951d3142c20fc0663b738e658d07ad6204469cd5cb700f31d2934e01feb4321e5be7476821bf1dde82369b6d764ec9dd", + "0x081ecccb20e28882de75addf9eec71a1b14d8fa7b4bd8d7322c4a3dc98c2e085d70000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000001a4fed6b9ad33da7ca3fff4cfb1669e16d80ea7547466dc8dcd67313b34b8787", + "0x082e81ca75173eddf06730891a8f9596f671a7d43cfff11669d4dbfda376538f3e0000000000000000000000000000000000000000000000000000000000000000", + "0x070000000000000000000000000000000000000000000000000000000000000000045d9db03e27071fd4b78117e0e472e06a4eb440617f3ed1e684a5f352856f1f", + "0x080b54e05661b49468d95e43a2ea570347ee51cf309b34b76425adde9b4811b50a18d1292738ab018ea00b3f5f4def62bd9396f9d1caadf29c4be6f2c4833e8035", + "0x062b11db9f1c375e2991097c0da6db9f65ee67825fec9a9613755ca0814cab2fc10154484431d37f9c311e65c4a516c144975b04c404eae5b908e141b3df6ccf92", + "0x0409130a06ba75cb64ae567f1af4e20969bcad96dedcf63d1e434f3f6dc966ca9201010000000000000000000000000000000000000000000000000000000000000000060120f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c21", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c22": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0910baa0679dfabc98a749e2cf19cf380cf168c5963ed340eb8793275881f1aab91a61ae832a78b0c5b49d6624e781530d6b4a5ae6747aa8024bb5e00238b397e8", + "0x0901dd7acbf5ebcbdec718df5774b877e62c16725cd43f07a7bbed7920c5825bb827d74048a99c16ca943362467a7232acba34083af75d10df8c6db36857d01b4c", + "0x0900dc2acf77d008cd9bc982319f8ecdd4d2ecff285b0b66882f4fa9eb1dff1f29183cf679b7f04d5c7327a1bfbd66754f84cc0a9e47ece70d5a7369ab612aed42", + "0x090b90fc0f2f16ef66c025e559d404c4d5fc49562899599a5348d307090c6a4e75078a35b037fa17e0b7801e7df716d17bf9015921ba9961df657c5776da6cc41f", + "0x072415b967f38129cf7e76297d7eb0462e470ee8a443503d59b3b1faecb081590829ea4234c57072a69a28d9575d618f0432d8cc99c29689bd3fda0e3954fa1918", + "0x08028439355a6f136af7432fe618a91dca0933acbc2375aa0a1ca90633b928815811a4b142f80899b94192f56c30e2545b0f60d45246f89520b827da4245440b0a", + "0x0426021fba3d566dfc3284c8ace6e55cbf07f0864ebec2f8f1a14e7d1d1294ecf70101000000000000000000000000000000000000000000000000000000000000000f424020f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c22", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9": { + "0x8c37336c8eae88ad7bbf871a6a05192bff663bf13ee0773449221a2afccbd95a": [ + "0x082fb0bcdc46aac7848a9355b7e441ed99b9e420718699d2ef24dc12d148424dae0000000000000000000000000000000000000000000000000000000000000000", + "0x091bcd8b2b8b971eb26d897408e1456228660f0b89fc59602df5d97b481491ed500641f9932f778cec994aeeca51226f2ebe4becc4dc82b98e7cce7e6b276abb28", + "0x08250575f943874e98d22e301b7befed701140c92a72e11d2c387eb28cb9a25e580000000000000000000000000000000000000000000000000000000000000000", + "0x0607bb43435f21e2a4a7cf97e33ed02ffdd2d10733adbe4d98fd4b9530224b20f52667a2932006fe896a048c3feac19ec4c6ca69542641437ec781c3919e1f0bdc", + "0x04123a9464ab167aa30076139d8d977b716a85918f12de86764c00ee1a7c603f9a01010000000000000000000000000000000000000000000000000000000000000000000a208c37336c8eae88ad7bbf871a6a05192bff663bf13ee0773449221a2afccbd95a", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x9c35da83f88043b3115f30d93beacec49ca14b6238430bdff196a249c29baa80": [ + "0x082fb0bcdc46aac7848a9355b7e441ed99b9e420718699d2ef24dc12d148424dae0000000000000000000000000000000000000000000000000000000000000000", + "0x091bcd8b2b8b971eb26d897408e1456228660f0b89fc59602df5d97b481491ed500641f9932f778cec994aeeca51226f2ebe4becc4dc82b98e7cce7e6b276abb28", + "0x0725e5bc9d7850b93ca1a3491589373e5bfa543dab27fbe55d9379b661118d0ebc0e4204147b7c901443ab2eeb605a3349fdea81c0a9dff919d61111ee63aa4e50", + "0x0601bec08162213599bf69c325cf2d97488d3af4a269c8ed5c9b0f208ee8122c6311af9d72891936e057a6fcc3c5e5973bd7fb35481b0c0f63ef4491427d5f230a", + "0x0408fce273ee0c1553e3b2eebd59ca7cb8a863be1f26eaefad72094e7d72212a94010100000000000000000000000000000000000000000000000000000de0b6b3a763fff6209c35da83f88043b3115f30d93beacec49ca14b6238430bdff196a249c29baa80", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + } + } + }, + "codes": [ + { + "codeSize": 0, + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "code": "0x" + }, + { + "codeSize": 0, + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "code": "0x" + }, + { + "codeSize": 3465, + "keccakCodeHash": "0x1747624a26df7a2ccc64170f9fdf64b98868e36285f4f3d3418bc63b1cac3a45", + "hash": "0x22077695cc1515e749aea246da1c0832429ec8db834be69a840c496c187d5bd5", + "code": "0x608060405234801561000f575f80fd5b50600436106100e5575f3560e01c806370a08231116100885780639dc29fac116100635780639dc29fac146101f0578063a9059cbb14610203578063d505accf14610216578063dd62ed3e14610229575f80fd5b806370a08231146101aa5780637ecebe00146101c957806395d89b41146101e8575f80fd5b806323b872dd116100c357806323b872dd14610141578063313ce567146101545780633644e5151461018d57806340c10f1914610195575f80fd5b806306fdde03146100e9578063095ea7b31461010757806318160ddd1461012a575b5f80fd5b6100f1610253565b6040516100fe9190610a52565b60405180910390f35b61011a610115366004610ae4565b6102de565b60405190151581526020016100fe565b61013360025481565b6040519081526020016100fe565b61011a61014f366004610b0c565b610357565b61017b7f000000000000000000000000000000000000000000000000000000000000000681565b60405160ff90911681526020016100fe565b610133610497565b6101a86101a3366004610ae4565b6104f1565b005b6101336101b8366004610b45565b60036020525f908152604090205481565b6101336101d7366004610b45565b60056020525f908152604090205481565b6100f16104ff565b6101a86101fe366004610ae4565b61050c565b61011a610211366004610ae4565b610516565b6101a8610224366004610b65565b610599565b610133610237366004610bd2565b600460209081525f928352604080842090915290825290205481565b5f805461025f90610c03565b80601f016020809104026020016040519081016040528092919081815260200182805461028b90610c03565b80156102d65780601f106102ad576101008083540402835291602001916102d6565b820191905f5260205f20905b8154815290600101906020018083116102b957829003601f168201915b505050505081565b335f81815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff8716808552925280832085905551919290917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925906103459086815260200190565b60405180910390a35060015b92915050565b73ffffffffffffffffffffffffffffffffffffffff83165f9081526004602090815260408083203384529091528120547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146103e9576103b88382610c81565b73ffffffffffffffffffffffffffffffffffffffff86165f9081526004602090815260408083203384529091529020555b73ffffffffffffffffffffffffffffffffffffffff85165f908152600360205260408120805485929061041d908490610c81565b909155505073ffffffffffffffffffffffffffffffffffffffff8085165f81815260036020526040908190208054870190555190918716907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906104849087815260200190565b60405180910390a3506001949350505050565b5f7f000000000000000000000000000000000000000000000000000000000000cf5546146104cc576104c76108b7565b905090565b507fdc3435dca418b10e0cd044263a037691aa7a3f09458c668c777ab43e880f269890565b6104fb828261094f565b5050565b6001805461025f90610c03565b6104fb82826109c6565b335f90815260036020526040812080548391908390610536908490610c81565b909155505073ffffffffffffffffffffffffffffffffffffffff83165f81815260036020526040908190208054850190555133907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906103459086815260200190565b42841015610608576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f5045524d49545f444541444c494e455f4558504952454400000000000000000060448201526064015b60405180910390fd5b5f6001610613610497565b73ffffffffffffffffffffffffffffffffffffffff8a81165f8181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938d166060840152608083018c905260a083019390935260c08083018b90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe081840301815282825280516020918201205f84529083018083525260ff871690820152606081018590526080810184905260a0016020604051602081039080840390855afa158015610761573d5f803e3d5ffd5b50506040517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0015191505073ffffffffffffffffffffffffffffffffffffffff8116158015906107dc57508773ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16145b610842576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f494e56414c49445f5349474e455200000000000000000000000000000000000060448201526064016105ff565b73ffffffffffffffffffffffffffffffffffffffff9081165f9081526004602090815260408083208a8516808552908352928190208990555188815291928a16917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925910160405180910390a350505050505050565b5f7f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f5f6040516108e79190610c94565b6040805191829003822060208301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b8060025f8282546109609190610d69565b909155505073ffffffffffffffffffffffffffffffffffffffff82165f818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b73ffffffffffffffffffffffffffffffffffffffff82165f90815260036020526040812080548392906109fa908490610c81565b90915550506002805482900390556040518181525f9073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016109ba565b5f602080835283518060208501525f5b81811015610a7e57858101830151858201604001528201610a62565b505f6040828601015260407fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0601f8301168501019250505092915050565b803573ffffffffffffffffffffffffffffffffffffffff81168114610adf575f80fd5b919050565b5f8060408385031215610af5575f80fd5b610afe83610abc565b946020939093013593505050565b5f805f60608486031215610b1e575f80fd5b610b2784610abc565b9250610b3560208501610abc565b9150604084013590509250925092565b5f60208284031215610b55575f80fd5b610b5e82610abc565b9392505050565b5f805f805f805f60e0888a031215610b7b575f80fd5b610b8488610abc565b9650610b9260208901610abc565b95506040880135945060608801359350608088013560ff81168114610bb5575f80fd5b9699959850939692959460a0840135945060c09093013592915050565b5f8060408385031215610be3575f80fd5b610bec83610abc565b9150610bfa60208401610abc565b90509250929050565b600181811c90821680610c1757607f821691505b602082108103610c4e577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b50919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b8181038181111561035157610351610c54565b5f8083545f60018260011c91506001831680610cb157607f831692505b60208084108203610ce9577f4e487b71000000000000000000000000000000000000000000000000000000005f52602260045260245ffd5b818015610cfd5760018114610d3057610d5b565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0086168952841515850289019650610d5b565b5f8a8152602090205f5b86811015610d535781548b820152908501908301610d3a565b505084890196505b509498975050505050505050565b8082018082111561035157610351610c5456fea164736f6c6343000818000a" + }, + { + "codeSize": 2796, + "keccakCodeHash": "0x44107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d5", + "hash": "0x18d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f84", + "code": "0x60806040523661001357610011610017565b005b6100115b61001f6102a0565b73ffffffffffffffffffffffffffffffffffffffff1633036102965760607fffffffff000000000000000000000000000000000000000000000000000000005f35167fc9a6301a000000000000000000000000000000000000000000000000000000008101610097576100906102df565b915061028e565b7fb0e10d7a000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216016100e857610090610332565b7f70d7c690000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160161013957610090610376565b7f07ae5bc0000000000000000000000000000000000000000000000000000000007fffffffff0000000000000000000000000000000000000000000000000000000082160161018a576100906103a6565b7fa39f25e5000000000000000000000000000000000000000000000000000000007fffffffff000000000000000000000000000000000000000000000000000000008216016101db576100906103f2565b6040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152604260248201527f5472616e73706172656e745570677261646561626c6550726f78793a2061646d60448201527f696e2063616e6e6f742066616c6c6261636b20746f2070726f7879207461726760648201527f6574000000000000000000000000000000000000000000000000000000000000608482015260a4015b60405180910390fd5b815160208301f35b61029e610405565b565b5f7fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b5473ffffffffffffffffffffffffffffffffffffffff16919050565b60606102e9610415565b5f6102f736600481846108bc565b810190610304919061090b565b905061031f8160405180602001604052805f8152505f61041f565b505060408051602081019091525f815290565b60605f8061034336600481846108bc565b8101906103509190610951565b915091506103608282600161041f565b60405180602001604052805f8152509250505090565b6060610380610415565b5f61038e36600481846108bc565b81019061039b919061090b565b905061031f8161044a565b60606103b0610415565b5f6103b96102a0565b6040805173ffffffffffffffffffffffffffffffffffffffff831660208201529192500160405160208183030381529060405291505090565b60606103fc610415565b5f6103b96104ae565b61029e6104106104ae565b6104bc565b341561029e575f80fd5b610428836104da565b5f825111806104345750805b15610445576104438383610526565b505b505050565b7f7e644d79422f17c01e4894b5f4f588d331ebfa28653d42ae832dc59e38c9798f6104736102a0565b6040805173ffffffffffffffffffffffffffffffffffffffff928316815291841660208301520160405180910390a16104ab81610552565b50565b5f6104b761065e565b905090565b365f80375f80365f845af43d5f803e8080156104d6573d5ff35b3d5ffd5b6104e381610685565b60405173ffffffffffffffffffffffffffffffffffffffff8216907fbc7cd75a20ee27fd9adebab32041f755214dbc6bffa90cc0225b39da2e5c2d3b905f90a250565b606061054b8383604051806060016040528060278152602001610ab960279139610750565b9392505050565b73ffffffffffffffffffffffffffffffffffffffff81166105f5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602660248201527f455243313936373a206e65772061646d696e20697320746865207a65726f206160448201527f64647265737300000000000000000000000000000000000000000000000000006064820152608401610285565b807fb53127684a568b3173ae13b9f8a6016e243e63b6e8ee1178d6a717850b5d61035b80547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff9290921691909117905550565b5f7f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc6102c3565b73ffffffffffffffffffffffffffffffffffffffff81163b610729576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152602d60248201527f455243313936373a206e657720696d706c656d656e746174696f6e206973206e60448201527f6f74206120636f6e7472616374000000000000000000000000000000000000006064820152608401610285565b807f360894a13ba1a3210667c828492db98dca3e2076cc3735a920a3ca505d382bbc610618565b60605f808573ffffffffffffffffffffffffffffffffffffffff16856040516107799190610a4d565b5f60405180830381855af49150503d805f81146107b1576040519150601f19603f3d011682016040523d82523d5f602084013e6107b6565b606091505b50915091506107c7868383876107d1565b9695505050505050565b606083156108665782515f0361085f5773ffffffffffffffffffffffffffffffffffffffff85163b61085f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e74726163740000006044820152606401610285565b5081610870565b6108708383610878565b949350505050565b8151156108885781518083602001fd5b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102859190610a68565b5f80858511156108ca575f80fd5b838611156108d6575f80fd5b5050820193919092039150565b803573ffffffffffffffffffffffffffffffffffffffff81168114610906575f80fd5b919050565b5f6020828403121561091b575f80fd5b61054b826108e3565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52604160045260245ffd5b5f8060408385031215610962575f80fd5b61096b836108e3565b9150602083013567ffffffffffffffff80821115610987575f80fd5b818501915085601f83011261099a575f80fd5b8135818111156109ac576109ac610924565b604051601f82017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0908116603f011681019083821181831017156109f2576109f2610924565b81604052828152886020848701011115610a0a575f80fd5b826020860160208301375f6020848301015280955050505050509250929050565b5f5b83811015610a45578181015183820152602001610a2d565b50505f910152565b5f8251610a5e818460208701610a2b565b9190910192915050565b602081525f8251806020840152610a86816040850160208701610a2b565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe016919091016040019291505056fe416464726573733a206c6f772d6c6576656c2064656c65676174652063616c6c206661696c6564a164736f6c6343000818000a" + } + ], + "txStorageTraces": [ + { + "rootBefore": "0x0f75dac4d10978f55932475e3ab1041d657666720d877e808c87317d9de12e7f", + "rootAfter": "0x0fb51f966fc7e8d78378d3221b0477b93da05dbbd17b0aa1b95acdeb65f61cb1", + "proofs": { + "0x0742D35CC6634c0532925A3b844bc9E7595f0Beb": [ + "0x0913be3722007e511e5a39c86db33fd96b2f6b4e7244f8596dd62d4a275c0393132222256583d912174004897728fbab2a5038d9b84b0981ba4467f8cbf900eeaf", + "0x090809181c074a1a0083c8ea29db41ebd96028937303050160f033c56e698003411357edea9797879e64ad77acb2231ab7e6df3f2d5e7110199d3c842510484ad0", + "0x0924133f63b4cff130a1f6e77c0198c6afb905eba0f0473e2986e30ebce4fae2180f4be945f00183f6833f932e2021f6ff5698622457524a20ce21a3921aabce3a", + "0x092e39637937176f646ed70c7a03609d343d6f605240ec74ca8e8a9f276af3f1f514f4b04aad11a22d617370765cf6f9565a981470066b9992cf1100ba8ac98b5c", + "0x0928891067f3bff831effa4d32af6564f8ab1243d8ce137c79c39a4b81830a728c00d247dec7c5069fde342365b2f0a6d229665abb83917d06a43e60c740587af2", + "0x0921e52be4e48113937c9518f8f807680050580b0e2d6bf47e8b1c147f4e4b4d4108f0e98ac5fe4f888d695f71cbb4331160d1f2da76bfe341d98894fd0d727a04", + "0x092b15971b522af8964f68be0ee71a6a27c9808fe6f21829536adeb7a44cb70c1a12b75bc5b5595ac2a0695af6ef7dbe5750433e1fb9e99ca29115a33c7585108d", + "0x0911411e755306f50353deebe39a344092e6c10168609a12c7e84a1e8c84858c10075a8dc059fb7fe4ca2b95555162ba7fe86ed4b3f2829397f0ab8ed7e3442663", + "0x0907b7a5079fb418510fd9221c5cac6f1c229f5e9f09f3728c7b931370031287652dcf5e0d5da47acd07b3b60f81704503ccbdf26898da7922ee3a3e63ae90ba6d", + "0x0700000000000000000000000000000000000000000000000000000000000000000ec32ecc8117bc12482a0319f7be3c4601a565bf3217a9df3552d040459cc12c", + "0x07000000000000000000000000000000000000000000000000000000000000000029e1c0b1239387fff6db2d405754bf1cf5ae3422cf26702fd858584f2b1e2e47", + "0x082b5b8c2fbe542487466ad4a634aecc98099c710944e499e43a3d34e8ce07f9a51cece90884518dd5016ccd2b79fbe00c1c2a3b67037a41508f7223b7b3d44ee1", + "0x0711db8406fc8063e32fc4ca0f0faed8d31c5e1278d9d5e41c790f0c1ed43fc77e042db0541967a6441a3f826f5fcc7f091a0b07bc88d21d227ccd644d72b44a36", + "0x041a41a36901ec07e376de0d0d5409328f7c9ae666006cc427b1f8ad646ce147c105080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000098a7d9b8314c00080000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864200742d35cc6634c0532925a3b844bc9e7595f0beb000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8": [ + "0x0913be3722007e511e5a39c86db33fd96b2f6b4e7244f8596dd62d4a275c0393132222256583d912174004897728fbab2a5038d9b84b0981ba4467f8cbf900eeaf", + "0x0927d8efe3143eb96bb435559ef28d9ab4f7ffa31e4462a7b85b9c674e8c2185170e70eb8c482f863b571a8f7df494058ed161b481c623557e575b3cbf9ace6744", + "0x0918ec3f04aa26dfe2fdb34122691277175ffeb34b57b96de91a11020d796b5b371ae7733a80d9755671d52c8e28599b95ba033f1be663cff98bdf29dfe8c74291", + "0x092af3174ad9f512c7dde7f4b2058496d31fc7f87f34bf74d397e9c092b44f19ae24931ced24212206fa48a12d2f13412c1308ab073b7b877a7ccde133989601e9", + "0x09036c4fee62bb83d523b25829a9143501aea11f0d248381af88746cddffffcb1526081e0a1a33fa7c8da785fc695eb8c93b170bf92259061d528dc654dfd6e6d0", + "0x092bacc030e7201c95030a1aea2839ee9bfee02262d8e0675495fea4338bdfa50624290bc03486169884c095011bb2435972302374385080cd7f6d85f3122c5980", + "0x0900f088c016ba77fd9f92ce70ea2a1d105cdfc6c6a5d9186a2c187134d4c5a4ee0e435e036911663b3da9826298b2ce80a6e920fd21aadb2f837b362ccae52d40", + "0x0803c07aa92c1dddc92b08025a82eceba3b40ac337f571f45c1216f05b2ff55b4d0000000000000000000000000000000000000000000000000000000000000000", + "0x0822d381e78bb6e50e7ba420e48dd800c957d5cfb3c12f7bb8b886c2cf7fac5e3b0d4474dabac26c440366c6be2b3a5fcf32dfe164d192fe3a6ecc79528800a8db", + "0x0407edffb2f516756416f9cd6da120841b708d8ba8e0ae76133c0022b273252174050800000000000000000000000000000000000000000000000000000000000000000017001fffffffffffffffffffffffffffffffffffffffffffff59776f638fc0477b0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b648642070997970c51812dc3a010c7d01b50e0d17dc79c8000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9": [ + "0x0913be3722007e511e5a39c86db33fd96b2f6b4e7244f8596dd62d4a275c0393132222256583d912174004897728fbab2a5038d9b84b0981ba4467f8cbf900eeaf", + "0x090809181c074a1a0083c8ea29db41ebd96028937303050160f033c56e698003411357edea9797879e64ad77acb2231ab7e6df3f2d5e7110199d3c842510484ad0", + "0x092a06163d398088f873c062a317a00fd3db764138a54e7cdc629709208dfa6c1f1753a598697cbe343ad4994b2c27d9956532d41d2601835d45b438f7fc223a33", + "0x09055073efa8d18f7b39ca93783a3d0757684b088fa9c40989ecdd11a6582d7d2222d9cc86e892dbc1f62e6543af23b8c396027d5cd7f694bfc469c1f10a331063", + "0x091859bdb0a396b24324b27dbc1eb31b1e2a11be6ef195a0163949bfd110ae5a6405e9dc638978400983b610b9f7501e49155663714a078df378de55d05316b29c", + "0x092117dac84ff3dc2cdee910557bf7a16284dbe01c4f931825930b624db9d6fd82271154039f469ae99905dd912dada7d86f601990452854ab904b39b90b1934c3", + "0x091aac8a0d30ffd7f8fb8a12af2c5bd312dfb21329474d0194e744dc4c1c40ea8a0879c20326089af5838976b5e646a16d9394299fda517fc5a4021bcb9a32bf14", + "0x060f06127668bb1bdd54f6294e02b62b0098b7cc5ed0140cbcf437bb5a55a7412b1ed8a44895958e2be9bdb9afc524c6bd7911e9d2f9a196b170033aa252429bec", + "0x041578b561ae8e97e3c6cdd2fe55167ee977e55548f3010b69ed60bf9e61c9eaaf05080000000000000000000000000000000000000000000000000d89000000000000000100000000000000000000000000000000000000000000000000000000000000002637088b2130c2fb167fbd2069cf16994b2aec5dcc359fed6eb4a3d8ddc908481747624a26df7a2ccc64170f9fdf64b98868e36285f4f3d3418bc63b1cac3a4522077695cc1515e749aea246da1c0832429ec8db834be69a840c496c187d5bd520cf7ed3acca5a467e9e704c703e8d87f634fb0fc9000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xFABB0ac9d68B0B445fB7357272Ff202C5651694a": [ + "0x0913be3722007e511e5a39c86db33fd96b2f6b4e7244f8596dd62d4a275c0393132222256583d912174004897728fbab2a5038d9b84b0981ba4467f8cbf900eeaf", + "0x090809181c074a1a0083c8ea29db41ebd96028937303050160f033c56e698003411357edea9797879e64ad77acb2231ab7e6df3f2d5e7110199d3c842510484ad0", + "0x0924133f63b4cff130a1f6e77c0198c6afb905eba0f0473e2986e30ebce4fae2180f4be945f00183f6833f932e2021f6ff5698622457524a20ce21a3921aabce3a", + "0x092ee6a5cff1508574915e5c5fa61134dcb9946427ead4b12c3273e9b97a0b77a6001854e8380fbd58620925780f3ed2d0abeea5a13b4e0a4e0a51f59b9b5ec3c0", + "0x09174cfdf2f1e0c6fe4cab85c20ea084898c0e359ada326bd1d38abce77a6ea2492137ebae927de9055c704eaf20176efd3688db2f24e0b7e0a197ed67abc806f0", + "0x0921e218fe94e8e55e46d83b3c61bc6d8f60c2262bf59669299b70dcfe52d8b7442cd91c7a4c36943da038bcb35dde8dd004b83e190a17e35d1bda9011ae062f99", + "0x092173e847844f75d655ac0690b26ee3bf3e65a3c0062f9b9be566e74cd41927df12b7fd5527c406a10b999c59c3c6a1f781797558a36b7fbdadd2d2cf435c1e25", + "0x07000000000000000000000000000000000000000000000000000000000000000002c01b849e25a91dd222e8d006ae918579a6bff12484cc758a8c43c8d6ce0017", + "0x080931f89fedde2fe071003121dcbbc15662cc71fc96127a81b17ca72f1dc81d620000000000000000000000000000000000000000000000000000000000000000", + "0x070d53acb57a8c223e5af81f5dbf1d80922525be5a8d4e45f5f09ff8580a16e210159ad10b4c89ff16157cc364c81f6039eeea9a8eb87e4b4700249219e71cc3ef", + "0x0403d2c88868dc8b5f7994604147a8246c48cc905235de980c42c3e78f351f00c505080000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000f76b616411d0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420fabb0ac9d68b0b445fb7357272ff202c5651694a000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "storageProofs": { + "0x5300000000000000000000000000000000000021": { + "0x6d01ba8ffed4ce500f24b73f45df7dc163a96f64ced987d8ee795c34e371362e": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x091e999ad0969a892635449070e98a13e662492f946d6ba9efaccf52ab53e7875e2cbbe5bbc301a45411f8c9d9639b312ddcaffd9fb0598f3bf73f656f309fcb4d", + "0x0904314d470dc20d9ee18b9434c6fff6e9cc5c211a2e469cdeb00b69942bccfb7c0b567c74e6484b887c320ed6b5c14a50a89fe400b3eb13ed5a5e86880a65aea0", + "0x061c7c2370b89156b28f4141e6320159e799f8353ac328f91eadd9c65a06fad2a628b3bf9a92d906051defc60a366063e6d133f3bb15dc661dad6b57e1f51f95e6", + "0x040959c4a1b3fc665dce20b30216d51dd0141a6738567cfbbf2054a1bc710af948010100000000000000000000000000000000000000000000000000049824fc6fcac9f3ba206d01ba8ffed4ce500f24b73f45df7dc163a96f64ced987d8ee795c34e371362e", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c1f": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x0919e44f4c1854907175b4b2b5a0c96536103adcca1baf40cffa44b0331a8901db2603c9a992dc69a6b684dc301f77cc1c4e9e8a4dd972d15f4cd2ed974c4a79cc", + "0x090dec3fded5debc4bba8aa761a657e8f3bbf01043cb27c6fe8889998a0887b24718683552e0d0dfb464626d6d970adb45c97d9934acaa537b7d7ac0539b53d359", + "0x0813405dada82f833e1a1f8a09f3d0272ad6b162baccede0af919f196392fcd8920000000000000000000000000000000000000000000000000000000000000000", + "0x0723e0dc8d0a6f591ebd77a74f4ee964c81484fbcd8ae0c8bada311e7bc460d959281d441c8ab855399e0f22d4ebf178922d8477c39622fc2c4d9eac325eef6f12", + "0x040e11aafee10c1ada84b19baca77f65014d45b4d26b4ce3aef99a36898199d98601010000000000000000000000000000cf7ed3acca5a467e9e704c703e8d87f634fb0fc920f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c1f", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c20": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0910baa0679dfabc98a749e2cf19cf380cf168c5963ed340eb8793275881f1aab91a61ae832a78b0c5b49d6624e781530d6b4a5ae6747aa8024bb5e00238b397e8", + "0x09128488b0bbdf573df71a726be2ff9a53c1c3ebea2d83da9bc818082d6114154e2f22abdf8825ed09c438ab5e357d601c5008c108986a0f79604020d03dd5658e", + "0x092ce0544b0f1037241d83b784217e1db71aed02f6bb6cbae678f12d8193e6fa561125c8bd98a62433fd57539d6de2d621f4f27c9a5a0a131df210d20fd063a298", + "0x0914bb75030a49de47a3568a2e726e3917e1508d35184c4436116ab72a8d57e65d08d136d73cfd57d8c8015158a423a463519cf14810f6d417259b71dd7bf648d6", + "0x0803dcf8e3b0f9009bdb5cc45234cdc34d8b90bc39e93768b8e8ff8688e950f15f0000000000000000000000000000000000000000000000000000000000000000", + "0x0617b0f320c1804f82f63a90e5e742227da35743a460ca351c5b6fd9481941d68a300c25969dcd82b2b69e782cd8d7535ea8d97f409cadb1187efbe5d940dce947", + "0x040ce6415daf9119eaa403a2266a11c8e6ea133c74e056da323547a0115ecd9f8901010000000000000000000000000000000000000000000000000000000000000000000420f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c20", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c21": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0903f1d48d7156c4041f7d28b3ebccd92bfe1d1341d3f800ae94bed4773d40f7a618842bc1b111a53c46a7b33d42af86d7af3631e6fb8d3939182f16bfa8ad26e8", + "0x0919e44f4c1854907175b4b2b5a0c96536103adcca1baf40cffa44b0331a8901db2603c9a992dc69a6b684dc301f77cc1c4e9e8a4dd972d15f4cd2ed974c4a79cc", + "0x0925ffe896678956add403385939c3f41f2db8bff412c9cc8d8f0590cef223288f1bbbbc549a61adc7a091da47883f9c34951e785f75cce8226f3ffdd7189d71b4", + "0x09282aa159b4c043af9c744e12ae4c4836a6fad029715cd87972d9b86e31466cf505f95afda0666a080bb144051a34ee842f918d97623213ca6c0b3537d6aab3d5", + "0x0923dcac699b2bc22dc2f7fa81bf06b44a951d3142c20fc0663b738e658d07ad6204469cd5cb700f31d2934e01feb4321e5be7476821bf1dde82369b6d764ec9dd", + "0x081ecccb20e28882de75addf9eec71a1b14d8fa7b4bd8d7322c4a3dc98c2e085d70000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000001a4fed6b9ad33da7ca3fff4cfb1669e16d80ea7547466dc8dcd67313b34b8787", + "0x082e81ca75173eddf06730891a8f9596f671a7d43cfff11669d4dbfda376538f3e0000000000000000000000000000000000000000000000000000000000000000", + "0x070000000000000000000000000000000000000000000000000000000000000000045d9db03e27071fd4b78117e0e472e06a4eb440617f3ed1e684a5f352856f1f", + "0x080b54e05661b49468d95e43a2ea570347ee51cf309b34b76425adde9b4811b50a18d1292738ab018ea00b3f5f4def62bd9396f9d1caadf29c4be6f2c4833e8035", + "0x062b11db9f1c375e2991097c0da6db9f65ee67825fec9a9613755ca0814cab2fc10154484431d37f9c311e65c4a516c144975b04c404eae5b908e141b3df6ccf92", + "0x0409130a06ba75cb64ae567f1af4e20969bcad96dedcf63d1e434f3f6dc966ca9201010000000000000000000000000000000000000000000000000000000000000000060120f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c21", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c22": [ + "0x0928a77876a165d27da15cb3bcdf6ddbde710c10004f203495ce8541c2fb7c94ee0a7c2cfce580fa36ab704dae776a7b499f1edc62bca5d36cf8cea3302056be15", + "0x0910baa0679dfabc98a749e2cf19cf380cf168c5963ed340eb8793275881f1aab91a61ae832a78b0c5b49d6624e781530d6b4a5ae6747aa8024bb5e00238b397e8", + "0x0901dd7acbf5ebcbdec718df5774b877e62c16725cd43f07a7bbed7920c5825bb827d74048a99c16ca943362467a7232acba34083af75d10df8c6db36857d01b4c", + "0x0900dc2acf77d008cd9bc982319f8ecdd4d2ecff285b0b66882f4fa9eb1dff1f29183cf679b7f04d5c7327a1bfbd66754f84cc0a9e47ece70d5a7369ab612aed42", + "0x090b90fc0f2f16ef66c025e559d404c4d5fc49562899599a5348d307090c6a4e75078a35b037fa17e0b7801e7df716d17bf9015921ba9961df657c5776da6cc41f", + "0x072415b967f38129cf7e76297d7eb0462e470ee8a443503d59b3b1faecb081590829ea4234c57072a69a28d9575d618f0432d8cc99c29689bd3fda0e3954fa1918", + "0x08028439355a6f136af7432fe618a91dca0933acbc2375aa0a1ca90633b928815811a4b142f80899b94192f56c30e2545b0f60d45246f89520b827da4245440b0a", + "0x0426021fba3d566dfc3284c8ace6e55cbf07f0864ebec2f8f1a14e7d1d1294ecf70101000000000000000000000000000000000000000000000000000000000000000f424020f6fe0582e0e323a551f456b66350a1ed549948a34fdd35be011d229e00171c22", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0xCf7Ed3AccA5a467e9e704C703E8D87F634fB0Fc9": { + "0x8c37336c8eae88ad7bbf871a6a05192bff663bf13ee0773449221a2afccbd95a": [ + "0x082fb0bcdc46aac7848a9355b7e441ed99b9e420718699d2ef24dc12d148424dae0000000000000000000000000000000000000000000000000000000000000000", + "0x091bcd8b2b8b971eb26d897408e1456228660f0b89fc59602df5d97b481491ed500641f9932f778cec994aeeca51226f2ebe4becc4dc82b98e7cce7e6b276abb28", + "0x08250575f943874e98d22e301b7befed701140c92a72e11d2c387eb28cb9a25e580000000000000000000000000000000000000000000000000000000000000000", + "0x0607bb43435f21e2a4a7cf97e33ed02ffdd2d10733adbe4d98fd4b9530224b20f52667a2932006fe896a048c3feac19ec4c6ca69542641437ec781c3919e1f0bdc", + "0x04123a9464ab167aa30076139d8d977b716a85918f12de86764c00ee1a7c603f9a01010000000000000000000000000000000000000000000000000000000000000000000a208c37336c8eae88ad7bbf871a6a05192bff663bf13ee0773449221a2afccbd95a", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x9c35da83f88043b3115f30d93beacec49ca14b6238430bdff196a249c29baa80": [ + "0x082fb0bcdc46aac7848a9355b7e441ed99b9e420718699d2ef24dc12d148424dae0000000000000000000000000000000000000000000000000000000000000000", + "0x091bcd8b2b8b971eb26d897408e1456228660f0b89fc59602df5d97b481491ed500641f9932f778cec994aeeca51226f2ebe4becc4dc82b98e7cce7e6b276abb28", + "0x0725e5bc9d7850b93ca1a3491589373e5bfa543dab27fbe55d9379b661118d0ebc0e4204147b7c901443ab2eeb605a3349fdea81c0a9dff919d61111ee63aa4e50", + "0x0601bec08162213599bf69c325cf2d97488d3af4a269c8ed5c9b0f208ee8122c6311af9d72891936e057a6fcc3c5e5973bd7fb35481b0c0f63ef4491427d5f230a", + "0x0408fce273ee0c1553e3b2eebd59ca7cb8a863be1f26eaefad72094e7d72212a94010100000000000000000000000000000000000000000000000000000de0b6b3a763fff6209c35da83f88043b3115f30d93beacec49ca14b6238430bdff196a249c29baa80", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + } + } + } + ], + "executionResults": [ + { + "l1DataFee": "0x0", + "feeTokenID": 4, + "feeRate": "0x49824fc6fcac9f3ba", + "tokenScale": "0xf4240", + "feeLimit": "0x9184e72a000", + "gas": 21000, + "failed": false, + "returnValue": "", + "from": { + "address": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", + "nonce": 23, + "balance": "0x1fffffffffffffffffffffffffffffffffffffffffffff59776f638fc0477b", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + "to": { + "address": "0x0742d35cc6634c0532925a3b844bc9e7595f0beb", + "nonce": 0, + "balance": "0x98a7d9b8314c0008", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + "accountAfter": [ + { + "address": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", + "nonce": 24, + "balance": "0x1fffffffffffffffffffffffffffffffffffffffffffff59776f638fc0477a", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + { + "address": "0x0742d35cc6634c0532925a3b844bc9e7595f0beb", + "nonce": 0, + "balance": "0x98a7d9b8314c0009", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + { + "address": "0xfabb0ac9d68b0b445fb7357272ff202c5651694a", + "nonce": 0, + "balance": "0x200000000000000000000000000000000000000000000000000f76b616411d", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + } + ], + "structLogs": [], + "callTrace": { + "from": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", + "gas": "0x5208", + "gasUsed": "0x5208", + "to": "0x0742d35cc6634c0532925a3b844bc9e7595f0beb", + "input": "0x", + "value": "0x1", + "type": "CALL" + } + } + ], + "withdraw_trie_root": "0x27ae5ba08d7291c96c8cbddcc148bf48a6d68c7974b94356f53754ef6171d757", + "sequencer_set_verify_hash": "0x22efe8537c043bf1a471893cba84c8cd29a0d3ea62ad7c4ada032136254ad6c9", + "startL1QueueIndex": 0 + } + ] +] \ No newline at end of file diff --git a/prover/testdata/mainnet_batch_traces.json b/prover/testdata/mainnet_batch_traces.json index 8d8ba5c57..8142cc534 100644 --- a/prover/testdata/mainnet_batch_traces.json +++ b/prover/testdata/mainnet_batch_traces.json @@ -267,6 +267,7 @@ "data": "0x095ea7b300000000000000000000000053000000000000000000000000000000000000200000000000000000000000000000000000000000000000000de0b6b3a7640000", "isCreate": false, "accessList": [], + "authorizationList":[], "v": "0x0", "r": "0x96e9b09c393b8a43cd3f11c19410d0b4db093b10b4df0c8fb2fac90cfa7e15b3", "s": "0x65fc7bc2f929093127e978fe4fc1952b1dd1d957163d2c137ebed6e557930b23" diff --git a/prover/testdata/morph203/morph203_0_traces.json b/prover/testdata/morph203/morph203_0_traces.json new file mode 100644 index 000000000..725866e57 --- /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 000000000..2fd3b25d4 --- /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 000000000..2defeb832 --- /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 000000000..3e84074fb --- /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/testdata/verify.sh b/prover/testdata/verify.sh new file mode 100755 index 000000000..e7eec00c4 --- /dev/null +++ b/prover/testdata/verify.sh @@ -0,0 +1,139 @@ +#!/bin/bash + +# Script to fetch block traces and verify them with Rust prover +# Usage: ./verify.sh [rpc_url] +# Example: ./verify.sh 10 20 http://localhost:8545 + +set -e + +# Check if required commands exist +command -v cast >/dev/null 2>&1 || { echo "Error: 'cast' command not found. Please install foundry."; exit 1; } +command -v jq >/dev/null 2>&1 || { echo "Error: 'jq' command not found. Please install jq."; exit 1; } + +# Parse arguments +if [ $# -lt 2 ]; then + echo "Usage: $0 [rpc_url]" + echo "Example: $0 10 20 http://localhost:8545" + exit 1 +fi + +START_BLOCK=$1 +END_BLOCK=$2 +RPC_URL=${3:-"http://localhost:8545"} + +# Validate block numbers +if ! [[ "$START_BLOCK" =~ ^[0-9]+$ ]] || ! [[ "$END_BLOCK" =~ ^[0-9]+$ ]]; then + echo "Error: Block numbers must be integers" + exit 1 +fi + +if [ "$START_BLOCK" -gt "$END_BLOCK" ]; then + echo "Error: Start block must be less than or equal to end block" + exit 1 +fi + +# Create output directory if it doesn't exist +OUTPUT_DIR="./generated" +mkdir -p "$OUTPUT_DIR" + +OUTPUT_FILE="$OUTPUT_DIR/block_traces_${START_BLOCK}_${END_BLOCK}.json" +TEMP_FILE="$OUTPUT_DIR/temp_traces.json" + +echo "Fetching block traces from block $START_BLOCK to $END_BLOCK..." +echo "RPC URL: $RPC_URL" +echo "Output file: $OUTPUT_FILE" +echo "" + +# Initialize the JSON array with outer and inner array +echo "[" > "$TEMP_FILE" +echo " [" >> "$TEMP_FILE" + +FIRST=true +SUCCESS_COUNT=0 +FAIL_COUNT=0 + +# Iterate through blocks +for ((block=$START_BLOCK; block<=$END_BLOCK; block++)); do + # Convert block number to hex + BLOCK_HEX=$(printf "0x%x" $block) + + echo -n "Fetching block $block (${BLOCK_HEX})... " + + # Fetch the block trace + TRACE=$(cast rpc morph_getBlockTraceByNumberOrHash "$BLOCK_HEX" --rpc-url "$RPC_URL" 2>/dev/null) + + if [ $? -eq 0 ] && [ -n "$TRACE" ] && [ "$TRACE" != "null" ]; then + # Add comma separator if not first element + if [ "$FIRST" = false ]; then + echo "," >> "$TEMP_FILE" + fi + FIRST=false + + # Append the trace directly (without wrapping in individual array) + echo -n " $TRACE" >> "$TEMP_FILE" + + echo "✓ Success" + SUCCESS_COUNT=$((SUCCESS_COUNT + 1)) + else + echo "✗ Failed (empty or null response)" + FAIL_COUNT=$((FAIL_COUNT + 1)) + fi +done + +# Close the inner and outer JSON arrays +echo "" >> "$TEMP_FILE" +echo " ]" >> "$TEMP_FILE" +echo "]" >> "$TEMP_FILE" + +# Validate and format JSON +echo "" +echo "Validating and formatting JSON..." +if jq empty "$TEMP_FILE" 2>/dev/null; then + jq '.' "$TEMP_FILE" > "$OUTPUT_FILE" + rm "$TEMP_FILE" + echo "✓ JSON is valid and formatted" +else + echo "✗ Error: Invalid JSON generated" + echo "Temp file saved at: $TEMP_FILE" + exit 1 +fi + +echo "" +echo "Summary:" +echo " Total blocks: $((END_BLOCK - START_BLOCK + 1))" +echo " Successfully fetched: $SUCCESS_COUNT" +echo " Failed: $FAIL_COUNT" +echo " Output file (absolute): $(cd "$(dirname "$OUTPUT_FILE")" && pwd)/$(basename "$OUTPUT_FILE")" +echo "" + +# If all blocks failed, exit +if [ "$SUCCESS_COUNT" -eq 0 ]; then + echo "Error: No blocks were successfully fetched" + exit 1 +fi + +# Run Rust verification +echo "================================================" +echo "Running Rust verification..." +echo "================================================" +echo "" + +cd "$(dirname "$0")/.." + +# Update OUTPUT_FILE path to be relative to prover directory +OUTPUT_FILE_FOR_RUST="./testdata/$OUTPUT_FILE" + +RUST_LOG=info TRUSTED_SETUP_4844=./configs/4844_trusted_setup.txt cargo run --release -- --block-path "$OUTPUT_FILE_FOR_RUST" + +RUST_EXIT_CODE=$? + +echo "" +echo "================================================" +if [ $RUST_EXIT_CODE -eq 0 ]; then + echo "✓ Verification completed successfully!" +else + echo "✗ Verification failed with exit code $RUST_EXIT_CODE" +fi +echo "================================================" + +exit $RUST_EXIT_CODE diff --git a/prover/testdata/viridian/eip7702_traces.json b/prover/testdata/viridian/eip7702_traces.json new file mode 100644 index 000000000..753644715 --- /dev/null +++ b/prover/testdata/viridian/eip7702_traces.json @@ -0,0 +1,21796 @@ +[ + [ + { + "chainID": 53077, + "version": "2.0.5-mainnet-8464a96b", + "coinbase": { + "address": "0xfabb0ac9d68b0b445fb7357272ff202c5651694a", + "nonce": 0, + "balance": "0x2000000000000000000000000000000000000000000000000002e50a5d4fa1", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + "header": { + "parentHash": "0x84535da970531382a70896ac3069a8660aebadd55b909dd747058dd426d66556", + "sha3Uncles": "0x1dcc4de8dec75d7aab85b567b6ccd41ad312451b948a7413f0a142fd40d49347", + "miner": "0x0000000000000000000000000000000000000000", + "stateRoot": "0x18ebc82388b24ea1fe4ee32af39ceeb03c47bfe2ed2d435339a7dc173dddca74", + "transactionsRoot": "0xa5b81905e86b19c96d277e7cbbf3f768a33f4448ab7d022fff8d7f8c2c6bc2cb", + "receiptsRoot": "0xe5ce2dd44aa6e2679b8eb813bcaae6caaa983f0b7ed23ac03bccaffac3542a32", + "logsBloom": "0x00000000000000000002000040000000000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000400000000800020000000000200100000800000000000000000000000000000000000000000000000000000000000000000000000000000000000000000020000000000020000000200000000000000000000000000000000000000000000000000000000000000000200000000000000000000300002000000000000000000020000000000000000000000000000000000001000000000000000000000000000000", + "difficulty": "0x0", + "number": "0x161", + "gasLimit": "0x1c9c380", + "gasUsed": "0x16d5d", + "timestamp": "0x68c23c79", + "extraData": "0x", + "mixHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "nonce": "0x0000000000000000", + "nextL1MsgIndex": "0x4", + "batchHash": "0x0000000000000000000000000000000000000000000000000000000000000000", + "baseFeePerGas": "0xf4240", + "withdrawalsRoot": null, + "blobGasUsed": null, + "excessBlobGas": null, + "parentBeaconBlockRoot": null, + "requestsHash": null, + "hash": "0x512826849b5c4dff36a8ca275dead23cba5fa850fd6c7756b1b992791e397c29" + }, + "transactions": [ + { + "type": 4, + "nonce": 26, + "txHash": "0x17373909c8b0b8533729a9a3066769387a9c91c8ead1c1cb2c9847f1efbbd114", + "gas": 106033, + "gasPrice": "0x1e8480", + "gasTipCap": "0x0", + "gasFeeCap": "0x1e8480", + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "to": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "chainId": "0xcf55", + "value": "0x0", + "data": "0x3f707e6b00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038d7ea4c680000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c800000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "isCreate": false, + "accessList": [], + "authorizationList": [ + { + "chainId": "53077", + "address": "0x4ed7c70f96b99c776995fb64377f0d4ab3b0e1c1", + "nonce": 27, + "yParity": "0x0", + "r": "0x9df6fa601a3c237403da56ead163f7d49d4401b71d4fc8f331dafee2900ff84f", + "s": "0x41de3818df0f1e1680eba812e70cfc2332aba73b1b3b81b6d2f96e71a68a7233" + } + ], + "v": "0x1", + "r": "0x2338aa6a13270e3b14365e3cd35a7568ba86e1b73aec0e1b84c01e7cc6a5ff73", + "s": "0x549013147e8b8cae8ae780fedd7a28dcb0ecdeef41be02e91be54792b2a1556c" + } + ], + "storageTrace": { + "rootBefore": "0x273fb9d3a1dd7d07574edd0a72ec4af5120dd12d2be9f66045d4d81ba2941c7f", + "rootAfter": "0x18ebc82388b24ea1fe4ee32af39ceeb03c47bfe2ed2d435339a7dc173dddca74", + "proofs": { + "0x0000000000000000000000000000000000000000": [ + "0x0916915644141af4c02c966160672d0f79e8a73ec65c03d95e3c08a79f93ea34050cabafce3c82158e92dacb47a9d226866b439aadf000b8a698a0491bb1287e09", + "0x09005130f6ef170b4a55bcece863ec93c6cc42c2c0b3b618cb255f84771d586082116b1ca7ad273164d30da58de7debca26d20471db94ed6d51170c7438a98a7d7", + "0x090aed840e92cbd0a06800b3b4e8551bb764b65d8e45b9c8c637a2c2e9bfd4b5d81dba29d9dfbb5718d98659be4655313dd511a0af82697048d9ad7ccfecc1a694", + "0x091ca7eeccc653e167fcd5788f8def0cada0619512b2d7babce67dc9b733b5dfcc06921c2f3b60bbd12dae3fc369a599b847b18e90e7cbb03a76e5a43f895671df", + "0x0904d372f19e36a9adfaa1a210e66dd590ca3f95c5a0c97a71e0928cb510c396a026a84c76a676d5c0929ac8406af400ef8c7580df1e1d5b184702c70009e93bba", + "0x090c311950521cda0cdca65f368c0fca2eae6b063232fb84eac9ed027e9834aac81dde5555b5b88e85d2b4a3de5225588792edf5d0b25a6bcfda7a6c6c87d6afbc", + "0x090f4c6955544004a19a37ad4ea0deb1e6cc09e1555da82281d838d035d1f2b31522d288ea2a9d771a19771658abf5a64fd503f4ed277aa8d6f779137a88ea1c8d", + "0x091dba2418c5fdd917fcdeff144d6017c58fac6c5ab448ef2a790ab85e36f9099a112f60b3aaa84f6521c5dfa52e57f3419ebd61eb13483f29a33d04ef4ae2c343", + "0x080eda5bf086d5839d8fcfa8883005fb3b9c68b526e9b221c094a4fb87389b046c28b42382f42a1a2a4fc8329518bff8410faaeefdef03690c3dae950e776633b2", + "0x0902836231e0288853f62a106ad6a02685f83c0b34f0f24a7276289307b965067b06f9ead146ceb98849393e4ed7cd88f5d83d0d6c8f1d48d050f6d4b5cd9cb324", + "0x07000000000000000000000000000000000000000000000000000000000000000010b38f4cacb58648a65ff1a762222d7dbddc77aae093b3c70cf2c244e8121e43", + "0x060c43880211e73b90a118ce38b3d9bbf1b036dc9095d191d6c039e532d96c278d208dd5a64c5e4034c79e1494cdce7657de057b509d34315a42c27c4e32afa428", + "0x041d3c5f8c36e5da873d45bfa1d2399a572ac77493ec089cbf88a37b9e9442842205080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864200000000000000000000000000000000000000000000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x4ed7c70F96B99c776995fB64377f0d4aB3B0e1C1": [ + "0x0916915644141af4c02c966160672d0f79e8a73ec65c03d95e3c08a79f93ea34050cabafce3c82158e92dacb47a9d226866b439aadf000b8a698a0491bb1287e09", + "0x09005130f6ef170b4a55bcece863ec93c6cc42c2c0b3b618cb255f84771d586082116b1ca7ad273164d30da58de7debca26d20471db94ed6d51170c7438a98a7d7", + "0x090aed840e92cbd0a06800b3b4e8551bb764b65d8e45b9c8c637a2c2e9bfd4b5d81dba29d9dfbb5718d98659be4655313dd511a0af82697048d9ad7ccfecc1a694", + "0x092f19ed137c690502fa39d44da340c158afba7dc9732f170e499fcb3398ff63411dd146eecf9467342cc9f7b75fa58b57ef584ec33097295e3d08139b04e0f4ba", + "0x093029964c13475a5242965571568e6ab104079690081eaf70d38ecf20fb88acd51b46cd41cec88f983cf944b6b428ee51fbeb1515d374a8e8ec23cdf302e24dd8", + "0x092525ed7af70cbd5d7b71f7c84fb33a32f95f3a6e9025347669b946ae2f68204f216f49cfb45df5d357cbbc0dec5195ffb0ae7915a9abbf9998423aed1c4719ee", + "0x09301e24b714f6681214818447ef9875ba90e1a79a1b548d263209873e35b0e6470b2f1165f0e1953a83b72bbdee88220e13488f66def7b166d1137d3281e7711e", + "0x0805dd9464b12997d35f1f6c02f7afa86fe5b3b09c9e88ba6ae449cf6d3bf756140000000000000000000000000000000000000000000000000000000000000000", + "0x06174debb83d91dd811da7bc6662a642cc352a7b72612539c39807529fd1b256ef28a7371d704258f6b2fadbe3fbebe5ed2214c1f338da5f598d200d6ca50d8726", + "0x0402c74cd9c4f15ebfc84e9c3e7e11f959d616a40dcbd2adc803712cdace700d460508000000000000000000000000000000000000000000000000122a000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f1c66c4fbac3b5728d7d3a97bad854d7b8868ccbecc96963b6deb56c7d59b6631e75865a0ae96d1340b5fa97af7a9ff44d89d793d59bbe06fe969d25e17512fc204ed7c70f96b99c776995fb64377f0d4ab3b0e1c1000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5300000000000000000000000000000000000001": [ + "0x0916915644141af4c02c966160672d0f79e8a73ec65c03d95e3c08a79f93ea34050cabafce3c82158e92dacb47a9d226866b439aadf000b8a698a0491bb1287e09", + "0x09005130f6ef170b4a55bcece863ec93c6cc42c2c0b3b618cb255f84771d586082116b1ca7ad273164d30da58de7debca26d20471db94ed6d51170c7438a98a7d7", + "0x090aed840e92cbd0a06800b3b4e8551bb764b65d8e45b9c8c637a2c2e9bfd4b5d81dba29d9dfbb5718d98659be4655313dd511a0af82697048d9ad7ccfecc1a694", + "0x091ca7eeccc653e167fcd5788f8def0cada0619512b2d7babce67dc9b733b5dfcc06921c2f3b60bbd12dae3fc369a599b847b18e90e7cbb03a76e5a43f895671df", + "0x0904d372f19e36a9adfaa1a210e66dd590ca3f95c5a0c97a71e0928cb510c396a026a84c76a676d5c0929ac8406af400ef8c7580df1e1d5b184702c70009e93bba", + "0x090c311950521cda0cdca65f368c0fca2eae6b063232fb84eac9ed027e9834aac81dde5555b5b88e85d2b4a3de5225588792edf5d0b25a6bcfda7a6c6c87d6afbc", + "0x090f4c6955544004a19a37ad4ea0deb1e6cc09e1555da82281d838d035d1f2b31522d288ea2a9d771a19771658abf5a64fd503f4ed277aa8d6f779137a88ea1c8d", + "0x091dba2418c5fdd917fcdeff144d6017c58fac6c5ab448ef2a790ab85e36f9099a112f60b3aaa84f6521c5dfa52e57f3419ebd61eb13483f29a33d04ef4ae2c343", + "0x09220b163279be211a426832f5ff47e0ecadb5bd5eaaf0d62189998fde4e14e6290af97b6355a72f5ffbed62006db4f63fcb6d0b550170607c72b8c3cfede6c63a", + "0x08150feb81fe1639286c75adb93e5467d36ad52d9ff00e0c706bc5345f6dcd49500000000000000000000000000000000000000000000000000000000000000000", + "0x081cb430cbc5dd11f62a713fb3656184085386104dc53fc135fb3c56dba49670500000000000000000000000000000000000000000000000000000000000000000", + "0x060c320ff8f6c3907ae6df62a7fe70e2be093390bd246197d5f56b6bce56f513f812fac8f51e3812914c097147217411381b9b2dad76963ef63c261885d3a49223", + "0x0427cfcbd2fe87474008e199ef5bff09273803bbf38032c75a36a7726b3c88f8a205080000000000000000000000000000000000000000000000000aec000000000000000000000000000000000000000000000000000000000000000000000000000000002198e2c16011cd18ef5be82557ea4552a16cc88ed8026d68fc38a18776550fa944107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f8400", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x530000000000000000000000000000000000000f": [ + "0x0916915644141af4c02c966160672d0f79e8a73ec65c03d95e3c08a79f93ea34050cabafce3c82158e92dacb47a9d226866b439aadf000b8a698a0491bb1287e09", + "0x09005130f6ef170b4a55bcece863ec93c6cc42c2c0b3b618cb255f84771d586082116b1ca7ad273164d30da58de7debca26d20471db94ed6d51170c7438a98a7d7", + "0x09101c4d9efd8067a09a82c4f8194046ecd985e2317bcdd156146fc39bf7a81ea528c52b5419b4774d38553b818f243269ab491f801340b55c054840102c1183cf", + "0x09278bbf009fefc768817766de86876d98c15cce15b6b9add36cde6285e1081eea02e09c016fca10408e12bcfeb00069c1ccead51a2e8d3534a1dbabfd3e294cc8", + "0x091b878051aac5aab3962a62e4bddfda38dbd2c7cb958ac5b41ae9cd143f0bf2c1191c03c9f4d3c867fb18a8aeb12d49f89b7d6225ca00e0a7efb58adffb5ed2ad", + "0x090d2955877b59dd23203eda776f580ddea39d387b90e4178cc7fb41f83080ab1c0f2d4d4745c0b6c28a1cbd97d70ab89c3885d8bcdb1a02c8670fb85cc7f59656", + "0x09101b44cf1f33794d2a3078cb1acdfc64b79980839d80127d34998e67a32c6aa422d44144b96aac5a9d2a37c72ac726617c25948e75bb07ba75b6660b6cb4b777", + "0x0923bfab6f7b9cc20bae8ca8989ad45df9625cf0c14ee54257ffd31b2593b8385f26e6410435d4ccc3d77443c8e4a282a225a080cc041f4516cf2a94f1585c1749", + "0x06198f0b737a3bf71be1a218ba1f21fbc5335509438ba4889192394d2e58f0ab0f2a868ae99ff40d43cff3f28ff0655bf467eaa89e3d3a1493203e4abb26099b3b", + "0x0418a86f98026d1a55f6fee616f04d51be16c033651ffaafb0514287ec067d04e805080000000000000000000000000000000000000000000000000aec0000000000000000000000000000000000000000000000000000000000000000000000000000000013f154a0de6e0f8fe3cfbcf5c08636a6a6021c2bfd0d281cb610af8001480c6a44107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f8420530000000000000000000000000000000000000f000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x5300000000000000000000000000000000000017": [ + "0x0916915644141af4c02c966160672d0f79e8a73ec65c03d95e3c08a79f93ea34050cabafce3c82158e92dacb47a9d226866b439aadf000b8a698a0491bb1287e09", + "0x09005130f6ef170b4a55bcece863ec93c6cc42c2c0b3b618cb255f84771d586082116b1ca7ad273164d30da58de7debca26d20471db94ed6d51170c7438a98a7d7", + "0x09101c4d9efd8067a09a82c4f8194046ecd985e2317bcdd156146fc39bf7a81ea528c52b5419b4774d38553b818f243269ab491f801340b55c054840102c1183cf", + "0x09278bbf009fefc768817766de86876d98c15cce15b6b9add36cde6285e1081eea02e09c016fca10408e12bcfeb00069c1ccead51a2e8d3534a1dbabfd3e294cc8", + "0x092b3e1045b1c9573fb6165380f100ae0700edeafdd79ae95d1ab3793a1c8a44d62ca08ae593596704180b0f3f4c8f0bf9f9c8831cff2868f401b67a261813c939", + "0x091c76ab23b9fd354fc43772cfa1052ee9240f375f9aec225474202ce5a0b814202dae21e4c5cee679a94325a7d6f9aa0b595a42f165e7bcda729f860111329f61", + "0x090e6a107b535c322cf565128387be097f4c5ba1157c81650dbe8fd63e31c89e501fa1e0f8d195352fc7dfdc1d2cca64062e326f1a44490fb1f715293dc5d56d67", + "0x071e7b646383bbd8defcc230d420cefddd4cae409681ef74ff98bb66527c23473c19a0bb1032a15e54b7e44d1777836f3d984572d354f75da2ace812ce1c732d83", + "0x0614e4293035fd73fe0fdaf74ceb5d1396ee22aa88bbeec1a0c3f8323e25fae3681d49523b9f532097709c6c724d41ec10986bc0a4e5d078f5e9f861b56d91b773", + "0x041918c47a133f759975cc95c0dba82051d9b5cd65407e76ef1366a9deaa14f28005080000000000000000000000000000000000000000000000000aec000000000000000000000000000000000000000000000000000000000000000000000000000000001b844ebfe02115caac027823cde753b75bfd8b7c5e4380fd1af28e8e9fc90d9244107d7c70e67e04d35d77455d5755c94d4897196e4ea9a341c1a6d864a6d4d518d32c9790b7656cb1991e831f76e6d65151cbd1c05aef8cfa7d369ad2076f84205300000000000000000000000000000000000017000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8": [ + "0x0916915644141af4c02c966160672d0f79e8a73ec65c03d95e3c08a79f93ea34050cabafce3c82158e92dacb47a9d226866b439aadf000b8a698a0491bb1287e09", + "0x09005130f6ef170b4a55bcece863ec93c6cc42c2c0b3b618cb255f84771d586082116b1ca7ad273164d30da58de7debca26d20471db94ed6d51170c7438a98a7d7", + "0x09101c4d9efd8067a09a82c4f8194046ecd985e2317bcdd156146fc39bf7a81ea528c52b5419b4774d38553b818f243269ab491f801340b55c054840102c1183cf", + "0x0911afd63ee62d1450fc093a4531ac8985c8e58925ed2ea24e9cd96741c99dc6481dc4d1c2b8624ca22bfd53cb0bf0847ed32e2b62acc80f754dae980b19e6d2bc", + "0x090fb7e28ee1049d2fcaf7891293c6b6d0299a4e37d32bcb18977efa1e9b05fd8c0fad0cee1b4af52f9ee626d48b7c20d5a80296cd163dc5892ae89d44ae279819", + "0x092bacc030e7201c95030a1aea2839ee9bfee02262d8e0675495fea4338bdfa50626ca9b2788a2c49a41b61470c48c149c5d1e5df1152a66a3efd56214f1a21f50", + "0x0900f088c016ba77fd9f92ce70ea2a1d105cdfc6c6a5d9186a2c187134d4c5a4ee19d7c633c789bddf48c5adc5ca2f156a312a4b6df48cfeb3c68f8912289f700a", + "0x0811aeb5c77f58acc623269a27421e3df2a976590ea3c49253696886e11dd909630000000000000000000000000000000000000000000000000000000000000000", + "0x0611f38814e6e8cc137e70a9f1a263bc86ee4a46de80e45b577943bc39cf34db0113b4cfe2bd0eca587f8630c6f7009354670195e252d84f756d2011ae36034a03", + "0x0407edffb2f516756416f9cd6da120841b708d8ba8e0ae76133c0022b27325217405080000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b648642070997970c51812dc3a010c7d01b50e0d17dc79c8000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xFABB0ac9d68B0B445fB7357272Ff202C5651694a": [ + "0x0916915644141af4c02c966160672d0f79e8a73ec65c03d95e3c08a79f93ea34050cabafce3c82158e92dacb47a9d226866b439aadf000b8a698a0491bb1287e09", + "0x0925469c93478142c5181e8c83afe048e886115bbe31c679399c74d72080cb632c221d5513fe95f49ecd8e389e37d52d6ec8130ad69d888c675bdc84ce2400ee78", + "0x091e4b5ef1d5222d492d2d4d40db8b129f7e10db7c7e9d74df510e88957c0497572946640f70eaec6f6e502522f7cf1f5571f190ee0c0161a16879fcdb7ab6cbe0", + "0x092c64d5221dad610c5df84365da67f50a0bbd440c79a874ca183646c9fbeb0d26001854e8380fbd58620925780f3ed2d0abeea5a13b4e0a4e0a51f59b9b5ec3c0", + "0x090c7324dbf6f4a22b32995b056371d963065c580ba06b15d290f20912ab74de150737c330f50040af342a6fcde8e7cf9b55d99aea72a8da354a297ce83a6236ae", + "0x0925d35eaab3e661482b194b877f0c5d6eb68454c147ab82e5a1cf0630964298da2cd91c7a4c36943da038bcb35dde8dd004b83e190a17e35d1bda9011ae062f99", + "0x092173e847844f75d655ac0690b26ee3bf3e65a3c0062f9b9be566e74cd41927df1215ac258b337f405bdc220d46ab414449397bccc7a37ba0d766a2cbf5737bd0", + "0x07000000000000000000000000000000000000000000000000000000000000000027205679e57b17b3fe2ffec8d7631b7e3a7cf3090b3d18884a9573935e7a7511", + "0x08046f8c27fed9e1020f9093fb8f65b4d54359076a4a42f7de062315f02984d8530000000000000000000000000000000000000000000000000000000000000000", + "0x070da2cd588a58eac30e8fc5d438bff48ff6121f873190f56749be6d1973b91bd8159ad10b4c89ff16157cc364c81f6039eeea9a8eb87e4b4700249219e71cc3ef", + "0x0403d2c88868dc8b5f7994604147a8246c48cc905235de980c42c3e78f351f00c5050800000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000002cf435b5b8a0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420fabb0ac9d68b0b445fb7357272ff202c5651694a000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266": [ + "0x0916915644141af4c02c966160672d0f79e8a73ec65c03d95e3c08a79f93ea34050cabafce3c82158e92dacb47a9d226866b439aadf000b8a698a0491bb1287e09", + "0x09005130f6ef170b4a55bcece863ec93c6cc42c2c0b3b618cb255f84771d586082116b1ca7ad273164d30da58de7debca26d20471db94ed6d51170c7438a98a7d7", + "0x090aed840e92cbd0a06800b3b4e8551bb764b65d8e45b9c8c637a2c2e9bfd4b5d81dba29d9dfbb5718d98659be4655313dd511a0af82697048d9ad7ccfecc1a694", + "0x091ca7eeccc653e167fcd5788f8def0cada0619512b2d7babce67dc9b733b5dfcc06921c2f3b60bbd12dae3fc369a599b847b18e90e7cbb03a76e5a43f895671df", + "0x0904d372f19e36a9adfaa1a210e66dd590ca3f95c5a0c97a71e0928cb510c396a026a84c76a676d5c0929ac8406af400ef8c7580df1e1d5b184702c70009e93bba", + "0x090499f54d51ade86d47dab5d1e970743042c1ce0717b2b7b81bee9b189518ca8a23511be62ff26051b2c4a8e6ffa3bce4f6ee4e6b2331b614f0754a1f4b561f3a", + "0x092451b07285b95053d2dee61874127cd4e97218d6ab497f3dda1b28144a902d350cb5631addf24f8a0f50535b274b94e6b7a6c3d81cb06568d9ceb10f972630fe", + "0x0611b54906e8056f349a1fbbc39f76c384935a4fff46b85993ce0e37619b5dad962136227bfdf556b4f3fd9b1d2cfbf706be762de618e40d1a84d9dfc25bfa7c18", + "0x040d972511ec05ac7e25d155e7d292ab9a61b2227df344cd0eabfeff6f423c64d205080000000000000000000000000000000000000000000000000000000000000000001a001ffffffffffffffffffffffffffffffffffffffffffffffffffd30bca4a4760000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420f39fd6e51aad88f6f4ce6ab8827279cfffb92266000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "storageProofs": { + "0x5300000000000000000000000000000000000001": { + "0x0000000000000000000000000000000000000000000000000000000000000021": [ + "0x0825bcd8ed4a7e39c0f0e835761cda36131dd34f16de95765d2216d997923a52f60e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200", + "0x06216372aa3165a29ee67494a5a9680358be92c254cc5724949e4d52742ba8d57f02a40b5614637fca2783d673559f035f5f5a0588ee27d164bb5375568493200a", + "0x042f683d080c393f5fb2ade2190fd56e8a5e8fa26533acdea8cce25caa236027cc0101000027ae5ba08d7291c96c8cbddcc148bf48a6d68c7974b94356f53754ef6171d75700", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x530000000000000000000000000000000000000f": { + "0x0000000000000000000000000000000000000000000000000000000000000001": [ + "0x092a8f2c561ffc424c9cc00db6ffb899d2d8e5979d2f2eb99d4b674e8ff89f1f5d305837382344bb8c16c78c482e68e414dcaf0dd956b894c85acca1ae8d3b661a", + "0x0927db7c7ad7dc5136178517bc13faab424c791a5c9c28131e69b7752cecdc88e7087f77106fe09a2a8b890654d17f46ff5688258ba611ef9e0d53ac9fb31943ae", + "0x09015c4fc60a3c6160762783cfc0da7e9d0518e56f0f4f236b7666e1afde43c8f61952bdec2ac6cd00c8bebfc77863f183bd2c9d09cd1938ebb9fe5fc2e2d2c1f4", + "0x080782addd8b48a93860ab4cb45e80c6cc869c1288f09d52cb7dec1f6aab62deb70000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000000f35c10e1893b6065c8ce8ba23fcd841bb168eb35643ca124118a4e44668fab2", + "0x080487bd50c628c019d7858418000d1393427df64c9c103a4229f7b6cb3cdf5ae60000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000001046b31bcd31548fa80d0a9fb9fae45e61112d689f6b9c82958033c0787f1f94", + "0x0805b5be5c8d36bd01ef9c3d10f3d994da611bc1484e9e48f69d2224efeb811b320000000000000000000000000000000000000000000000000000000000000000", + "0x081ebc02f6986209f10fc7d04ba0c4ef196d75ad0a22e786fc7cf789f591e9b26f0000000000000000000000000000000000000000000000000000000000000000", + "0x0700000000000000000000000000000000000000000000000000000000000000002680dd0a6ed49fc1faf7d4ef23a8328de46b8a4c1d86e6553f4940e394673978", + "0x0628658ea3cbfa933d0e4041f9000bcc3393a3536913008ef6e1837ba7053bdec1156a0960a84fa4287f66d18b9c39ab9d403fa6b6dddd126f47758aadcb82e122", + "0x0426049ba6de63003492eb078a01a8aa4f4a0e67f28f0955c2eba9101d5d2eea50010100000000000000000000000000000000000000000000000000000000000000000007200000000000000000000000000000000000000000000000000000000000000001", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000002": [ + "0x092a8f2c561ffc424c9cc00db6ffb899d2d8e5979d2f2eb99d4b674e8ff89f1f5d305837382344bb8c16c78c482e68e414dcaf0dd956b894c85acca1ae8d3b661a", + "0x0927db7c7ad7dc5136178517bc13faab424c791a5c9c28131e69b7752cecdc88e7087f77106fe09a2a8b890654d17f46ff5688258ba611ef9e0d53ac9fb31943ae", + "0x09015c4fc60a3c6160762783cfc0da7e9d0518e56f0f4f236b7666e1afde43c8f61952bdec2ac6cd00c8bebfc77863f183bd2c9d09cd1938ebb9fe5fc2e2d2c1f4", + "0x061b12dcd1a582e1e93ccb441e0688e482eb23efa9fb802dd24b7e5a46a7fcd9e21e144bbeb8f4c147dafacf9567e13b1b15e4804a9d74df2da7619735d765c1be", + "0x04020953ad52de135367a1ba2629636216ed5174cce5629d11b5d97fe733f07dcc0101000000000000000000000000000000000000000000000000000000000000000009c4200000000000000000000000000000000000000000000000000000000000000002", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000003": [ + "0x092a8f2c561ffc424c9cc00db6ffb899d2d8e5979d2f2eb99d4b674e8ff89f1f5d305837382344bb8c16c78c482e68e414dcaf0dd956b894c85acca1ae8d3b661a", + "0x0700000000000000000000000000000000000000000000000000000000000000001f63b7a392d1af6e501f653490c2436a2b6ecc4835f91bfc8983aded770a595c", + "0x070ee2ca3e190e48951aa8d5bb00d33ba76a92de69a807dfa6f2eaa9881e303f3226ee193ec0e0368b03645561b95ea6fee2df8bb5f1db80afc64364ec993655f8", + "0x0406c50541f08911ad149aa545dd3d606f86ee63c751a795c7d57f0d3f85e6bdeb01010000000000000000000000000000000000000000000000000000000000003b9aca00200000000000000000000000000000000000000000000000000000000000000003", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000006": [ + "0x092a8f2c561ffc424c9cc00db6ffb899d2d8e5979d2f2eb99d4b674e8ff89f1f5d305837382344bb8c16c78c482e68e414dcaf0dd956b894c85acca1ae8d3b661a", + "0x0927db7c7ad7dc5136178517bc13faab424c791a5c9c28131e69b7752cecdc88e7087f77106fe09a2a8b890654d17f46ff5688258ba611ef9e0d53ac9fb31943ae", + "0x09015c4fc60a3c6160762783cfc0da7e9d0518e56f0f4f236b7666e1afde43c8f61952bdec2ac6cd00c8bebfc77863f183bd2c9d09cd1938ebb9fe5fc2e2d2c1f4", + "0x061b12dcd1a582e1e93ccb441e0688e482eb23efa9fb802dd24b7e5a46a7fcd9e21e144bbeb8f4c147dafacf9567e13b1b15e4804a9d74df2da7619735d765c1be", + "0x04064ef33f6d7044a6aa1458b710bb24a531e379030cf6ca490d84fff1d8e79c94010100000000000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000006", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000007": [ + "0x092a8f2c561ffc424c9cc00db6ffb899d2d8e5979d2f2eb99d4b674e8ff89f1f5d305837382344bb8c16c78c482e68e414dcaf0dd956b894c85acca1ae8d3b661a", + "0x0927db7c7ad7dc5136178517bc13faab424c791a5c9c28131e69b7752cecdc88e7087f77106fe09a2a8b890654d17f46ff5688258ba611ef9e0d53ac9fb31943ae", + "0x080c0db60cbaaa4544fd56c31e78366009a2a87b99e73aa52c4460c68a0f98a6180000000000000000000000000000000000000000000000000000000000000000", + "0x081824025e42aefa5d18b0a0c39ba03d737dc20b78e6574d948d80d82a52f727d8107af28ec5e24bebff03552c7165ec32f2ce6af3c8390f20b9a453a3a56b311c", + "0x040d1e80106f23933567a7c4881177b5d6c45a3f319feafe560a28df75769db9ba0101000000000000000000000000000000000000000000000000000000000636b08c8600200000000000000000000000000000000000000000000000000000000000000007", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000008": [ + "0x092a8f2c561ffc424c9cc00db6ffb899d2d8e5979d2f2eb99d4b674e8ff89f1f5d305837382344bb8c16c78c482e68e414dcaf0dd956b894c85acca1ae8d3b661a", + "0x0700000000000000000000000000000000000000000000000000000000000000001f63b7a392d1af6e501f653490c2436a2b6ecc4835f91bfc8983aded770a595c", + "0x070ee2ca3e190e48951aa8d5bb00d33ba76a92de69a807dfa6f2eaa9881e303f3226ee193ec0e0368b03645561b95ea6fee2df8bb5f1db80afc64364ec993655f8", + "0x060e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200302bd20972a48695c1c418461cc2124f0c246ad1bb41e1d8d05cd9527784228a", + "0x0412c0c59f64422dd5b7ce259c4aa62e9bf4e2bcc4f0da068e332b9f4e502ba38f01010000000000000000000000000000000000000000000000000000000000174876e800200000000000000000000000000000000000000000000000000000000000000008", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x0000000000000000000000000000000000000000000000000000000000000009": [ + "0x092a8f2c561ffc424c9cc00db6ffb899d2d8e5979d2f2eb99d4b674e8ff89f1f5d305837382344bb8c16c78c482e68e414dcaf0dd956b894c85acca1ae8d3b661a", + "0x0700000000000000000000000000000000000000000000000000000000000000001f63b7a392d1af6e501f653490c2436a2b6ecc4835f91bfc8983aded770a595c", + "0x05", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + }, + "0x5300000000000000000000000000000000000017": { + "0x0000000000000000000000000000000000000000000000000000000000000065": [ + "0x0905251de17ac0fe45ec5f62d5e9df042cd50c17b43569010dcd14ae1f3a86163022f084d88387867b6d97eb6ab55ab68768482c68e98d8e49dd5327ddf50fef0c", + "0x0924e760587c9b1db469c29fecb46a7a69bf5102811e52577a0be8379118e350612ed02b8b91a71a92e27015af848ff19b0ae99dea68a5322de832f43d823c6b3a", + "0x0813d4585489beb697a507d5253fb8c60699d5f971464faa611fc3de433ad766980e38bf5d7d592ab89df92d87f260b8529d9c466b936b42ad8fbfe576bf97b200", + "0x07165d00aa7e206c00402a408f8fd7708cade38a4505b733034b0395a63d9972db0bbe8ac7bd6d46178eb894a11429e20af729a920470f752e18e2155aba8efad7", + "0x072bddb1a3814cebf63c503a4a72f3dd15c60cb9962b8573537ab6124655d1be76137cf5f80b44214cc3d1c3de64293fe17b4d07828f096986d8f23f65a43d4da2", + "0x07000000000000000000000000000000000000000000000000000000000000000028cde97ff00f1e1c493727b57f58cf47591b706db11996f12d49ab1b15e37577", + "0x0623965bae207a394b8516562f391edb1cdc19cad8d2aa324db42a44fd0810fd551c5455ebd4b507947b79a0d7aeefbe26cda2f0a279f3a136bc8f1608fea338d2", + "0x042115c9b0a0938aa1ce2e8c01581e5aa931288249a453588de70cf2c5dae26a7b010100005586abb0fb477a7951e0a249f28ee3ab81a9892d89b7bf54a887a924da4e93f0200000000000000000000000000000000000000000000000000000000000000065", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + } + } + }, + "codes": [ + { + "codeSize": 0, + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "code": "0x" + }, + { + "codeSize": 0, + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "hash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "code": "0x" + }, + { + "codeSize": 4650, + "keccakCodeHash": "0xf1c66c4fbac3b5728d7d3a97bad854d7b8868ccbecc96963b6deb56c7d59b663", + "hash": "0x1e75865a0ae96d1340b5fa97af7a9ff44d89d793d59bbe06fe969d25e17512fc", + "code": "0x608060405260043610610037575f3560e01c80633f707e6b146100405780636171d1c91461005c578063affed0e0146100785761003e565b3661003e57005b005b61005a60048036038101906100559190610869565b6100a2565b005b61007660048036038101906100719190610909565b61011e565b005b348015610083575f80fd5b5061008c6102ff565b604051610099919061099f565b60405180910390f35b3073ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610110576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161010790610a12565b60405180910390fd5b61011a8282610304565b5050565b60605f5b858590508110156101f3578186868381811061014157610140610a30565b5b90506020028101906101539190610a69565b5f0160208101906101649190610aea565b87878481811061017757610176610a30565b5b90506020028101906101899190610a69565b602001358888858181106101a05761019f610a30565b5b90506020028101906101b29190610a69565b80604001906101c19190610b15565b6040516020016101d5959493929190610c7a565b60405160208183030381529060405291508080600101915050610122565b505f805482604051602001610209929190610cc1565b6040516020818303038152906040528051906020012090505f61022b826103a6565b90505f61027b8287878080601f0160208091040260200160405190810160405280939291908181526020018383808284375f81840152601f19601f820116905080830192505050505050506103d9565b90503073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146102eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016102e290610d32565b60405180910390fd5b6102f58888610304565b5050505050505050565b5f5481565b5f805490505f8081548092919061031a90610d7d565b91905055505f5b838390508110156103665761035984848381811061034257610341610a30565b5b90506020028101906103549190610a69565b610403565b8080600101915050610321565b50807f280bb3599696acbf79fb8ffcde81a57337b52500f789600fbb1cff9b4cbaba39848460405161039992919061102a565b60405180910390a2505050565b5f7f19457468657265756d205369676e6564204d6573736167653a0a3332000000005f5281601c52603c5f209050919050565b5f805f806103e78686610562565b9250925092506103f782826105b7565b82935050505092915050565b5f815f0160208101906104169190610aea565b73ffffffffffffffffffffffffffffffffffffffff1682602001358380604001906104419190610b15565b60405161044f92919061104c565b5f6040518083038185875af1925050503d805f8114610489576040519150601f19603f3d011682016040523d82523d5f602084013e61048e565b606091505b50509050806104d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016104c9906110ae565b60405180910390fd5b815f0160208101906104e49190610aea565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff167fed7e8f919df9cc0d0ad8b4057d084ebf319b630564d5da283e14751adc931f3a84602001358580604001906105479190610b15565b60405161055693929190611108565b60405180910390a35050565b5f805f60418451036105a2575f805f602087015192506040870151915060608701515f1a905061059488828585610719565b9550955095505050506105b0565b5f600285515f1b9250925092505b9250925092565b5f60038111156105ca576105c9611138565b5b8260038111156105dd576105dc611138565b5b031561071557600160038111156105f7576105f6611138565b5b82600381111561060a57610609611138565b5b03610641576040517ff645eedf00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6002600381111561065557610654611138565b5b82600381111561066857610667611138565b5b036106ac57805f1c6040517ffce698f70000000000000000000000000000000000000000000000000000000081526004016106a3919061099f565b60405180910390fd5b6003808111156106bf576106be611138565b5b8260038111156106d2576106d1611138565b5b0361071457806040517fd78bce0c00000000000000000000000000000000000000000000000000000000815260040161070b919061117d565b60405180910390fd5b5b5050565b5f805f7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a0845f1c1115610755575f6003859250925092506107f6565b5f6001888888886040515f815260200160405260405161077894939291906111b1565b6020604051602081039080840390855afa158015610798573d5f803e3d5ffd5b5050506020604051035190505f73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036107e9575f60015f801b935093509350506107f6565b805f805f1b935093509350505b9450945094915050565b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f80fd5b5f8083601f84011261082957610828610808565b5b8235905067ffffffffffffffff8111156108465761084561080c565b5b60208301915083602082028301111561086257610861610810565b5b9250929050565b5f806020838503121561087f5761087e610800565b5b5f83013567ffffffffffffffff81111561089c5761089b610804565b5b6108a885828601610814565b92509250509250929050565b5f8083601f8401126108c9576108c8610808565b5b8235905067ffffffffffffffff8111156108e6576108e561080c565b5b60208301915083600182028301111561090257610901610810565b5b9250929050565b5f805f806040858703121561092157610920610800565b5b5f85013567ffffffffffffffff81111561093e5761093d610804565b5b61094a87828801610814565b9450945050602085013567ffffffffffffffff81111561096d5761096c610804565b5b610979878288016108b4565b925092505092959194509250565b5f819050919050565b61099981610987565b82525050565b5f6020820190506109b25f830184610990565b92915050565b5f82825260208201905092915050565b7f496e76616c696420617574686f726974790000000000000000000000000000005f82015250565b5f6109fc6011836109b8565b9150610a07826109c8565b602082019050919050565b5f6020820190508181035f830152610a29816109f0565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52603260045260245ffd5b5f80fd5b5f80fd5b5f80fd5b5f82356001606003833603038112610a8457610a83610a5d565b5b80830191505092915050565b5f73ffffffffffffffffffffffffffffffffffffffff82169050919050565b5f610ab982610a90565b9050919050565b610ac981610aaf565b8114610ad3575f80fd5b50565b5f81359050610ae481610ac0565b92915050565b5f60208284031215610aff57610afe610800565b5b5f610b0c84828501610ad6565b91505092915050565b5f8083356001602003843603038112610b3157610b30610a5d565b5b80840192508235915067ffffffffffffffff821115610b5357610b52610a61565b5b602083019250600182023603831315610b6f57610b6e610a65565b5b509250929050565b5f81519050919050565b5f81905092915050565b5f5b83811015610ba8578082015181840152602081019050610b8d565b5f8484015250505050565b5f610bbd82610b77565b610bc78185610b81565b9350610bd7818560208601610b8b565b80840191505092915050565b5f8160601b9050919050565b5f610bf982610be3565b9050919050565b5f610c0a82610bef565b9050919050565b610c22610c1d82610aaf565b610c00565b82525050565b5f819050919050565b610c42610c3d82610987565b610c28565b82525050565b828183375f83830152505050565b5f610c618385610b81565b9350610c6e838584610c48565b82840190509392505050565b5f610c858288610bb3565b9150610c918287610c11565b601482019150610ca18286610c31565b602082019150610cb2828486610c56565b91508190509695505050505050565b5f610ccc8285610c31565b602082019150610cdc8284610bb3565b91508190509392505050565b7f496e76616c6964207369676e61747572650000000000000000000000000000005f82015250565b5f610d1c6011836109b8565b9150610d2782610ce8565b602082019050919050565b5f6020820190508181035f830152610d4981610d10565b9050919050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52601160045260245ffd5b5f610d8782610987565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203610db957610db8610d50565b5b600182019050919050565b5f82825260208201905092915050565b5f819050919050565b5f610deb6020840184610ad6565b905092915050565b610dfc81610aaf565b82525050565b610e0b81610987565b8114610e15575f80fd5b50565b5f81359050610e2681610e02565b92915050565b5f610e3a6020840184610e18565b905092915050565b610e4b81610987565b82525050565b5f80fd5b5f80fd5b5f80fd5b5f8083356001602003843603038112610e7957610e78610e59565b5b83810192508235915060208301925067ffffffffffffffff821115610ea157610ea0610e51565b5b600182023603831315610eb757610eb6610e55565b5b509250929050565b5f82825260208201905092915050565b5f601f19601f8301169050919050565b5f610eea8385610ebf565b9350610ef7838584610c48565b610f0083610ecf565b840190509392505050565b5f60608301610f1c5f840184610ddd565b610f285f860182610df3565b50610f366020840184610e2c565b610f436020860182610e42565b50610f516040840184610e5d565b8583036040870152610f64838284610edf565b925050508091505092915050565b5f610f7d8383610f0b565b905092915050565b5f82356001606003833603038112610fa057610f9f610e59565b5b82810191505092915050565b5f602082019050919050565b5f610fc38385610dc4565b935083602084028501610fd584610dd4565b805f5b87811015611018578484038952610fef8284610f85565b610ff98582610f72565b945061100483610fac565b925060208a01995050600181019050610fd8565b50829750879450505050509392505050565b5f6020820190508181035f830152611043818486610fb8565b90509392505050565b5f611058828486610c56565b91508190509392505050565b7f43616c6c207265766572746564000000000000000000000000000000000000005f82015250565b5f611098600d836109b8565b91506110a382611064565b602082019050919050565b5f6020820190508181035f8301526110c58161108c565b9050919050565b5f82825260208201905092915050565b5f6110e783856110cc565b93506110f4838584610c48565b6110fd83610ecf565b840190509392505050565b5f60408201905061111b5f830186610990565b818103602083015261112e8184866110dc565b9050949350505050565b7f4e487b71000000000000000000000000000000000000000000000000000000005f52602160045260245ffd5b5f819050919050565b61117781611165565b82525050565b5f6020820190506111905f83018461116e565b92915050565b5f60ff82169050919050565b6111ab81611196565b82525050565b5f6080820190506111c45f83018761116e565b6111d160208301866111a2565b6111de604083018561116e565b6111eb606083018461116e565b9594505050505056fea264697066735822122083ca365a65ff87d1dd0e87e3ee8d94c0ae7b0e4c5c67399d076596c824eef48864736f6c63430008180033" + }, + { + "codeSize": 23, + "keccakCodeHash": "0x04d8ac2c8a335e729a265fb2e4b80244e2ce64e4fa078a8ad35d3caa94f3dae0", + "hash": "0x226b48d26f25d639001ec8aad64cc7da237713910c2fdf77e87f2bd6547ebdfd", + "code": "0xef01004ed7c70f96b99c776995fb64377f0d4ab3b0e1c1" + } + ], + "txStorageTraces": [ + { + "rootBefore": "0x273fb9d3a1dd7d07574edd0a72ec4af5120dd12d2be9f66045d4d81ba2941c7f", + "rootAfter": "0x18ebc82388b24ea1fe4ee32af39ceeb03c47bfe2ed2d435339a7dc173dddca74", + "proofs": { + "0x0000000000000000000000000000000000000000": [ + "0x0916915644141af4c02c966160672d0f79e8a73ec65c03d95e3c08a79f93ea34050cabafce3c82158e92dacb47a9d226866b439aadf000b8a698a0491bb1287e09", + "0x09005130f6ef170b4a55bcece863ec93c6cc42c2c0b3b618cb255f84771d586082116b1ca7ad273164d30da58de7debca26d20471db94ed6d51170c7438a98a7d7", + "0x090aed840e92cbd0a06800b3b4e8551bb764b65d8e45b9c8c637a2c2e9bfd4b5d81dba29d9dfbb5718d98659be4655313dd511a0af82697048d9ad7ccfecc1a694", + "0x091ca7eeccc653e167fcd5788f8def0cada0619512b2d7babce67dc9b733b5dfcc06921c2f3b60bbd12dae3fc369a599b847b18e90e7cbb03a76e5a43f895671df", + "0x0904d372f19e36a9adfaa1a210e66dd590ca3f95c5a0c97a71e0928cb510c396a026a84c76a676d5c0929ac8406af400ef8c7580df1e1d5b184702c70009e93bba", + "0x090c311950521cda0cdca65f368c0fca2eae6b063232fb84eac9ed027e9834aac81dde5555b5b88e85d2b4a3de5225588792edf5d0b25a6bcfda7a6c6c87d6afbc", + "0x090f4c6955544004a19a37ad4ea0deb1e6cc09e1555da82281d838d035d1f2b31522d288ea2a9d771a19771658abf5a64fd503f4ed277aa8d6f779137a88ea1c8d", + "0x091dba2418c5fdd917fcdeff144d6017c58fac6c5ab448ef2a790ab85e36f9099a112f60b3aaa84f6521c5dfa52e57f3419ebd61eb13483f29a33d04ef4ae2c343", + "0x080eda5bf086d5839d8fcfa8883005fb3b9c68b526e9b221c094a4fb87389b046c28b42382f42a1a2a4fc8329518bff8410faaeefdef03690c3dae950e776633b2", + "0x0902836231e0288853f62a106ad6a02685f83c0b34f0f24a7276289307b965067b06f9ead146ceb98849393e4ed7cd88f5d83d0d6c8f1d48d050f6d4b5cd9cb324", + "0x07000000000000000000000000000000000000000000000000000000000000000010b38f4cacb58648a65ff1a762222d7dbddc77aae093b3c70cf2c244e8121e43", + "0x060c43880211e73b90a118ce38b3d9bbf1b036dc9095d191d6c039e532d96c278d208dd5a64c5e4034c79e1494cdce7657de057b509d34315a42c27c4e32afa428", + "0x041d3c5f8c36e5da873d45bfa1d2399a572ac77493ec089cbf88a37b9e9442842205080000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864200000000000000000000000000000000000000000000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x4ed7c70F96B99c776995fB64377f0d4aB3B0e1C1": [ + "0x0916915644141af4c02c966160672d0f79e8a73ec65c03d95e3c08a79f93ea34050cabafce3c82158e92dacb47a9d226866b439aadf000b8a698a0491bb1287e09", + "0x09005130f6ef170b4a55bcece863ec93c6cc42c2c0b3b618cb255f84771d586082116b1ca7ad273164d30da58de7debca26d20471db94ed6d51170c7438a98a7d7", + "0x090aed840e92cbd0a06800b3b4e8551bb764b65d8e45b9c8c637a2c2e9bfd4b5d81dba29d9dfbb5718d98659be4655313dd511a0af82697048d9ad7ccfecc1a694", + "0x092f19ed137c690502fa39d44da340c158afba7dc9732f170e499fcb3398ff63411dd146eecf9467342cc9f7b75fa58b57ef584ec33097295e3d08139b04e0f4ba", + "0x093029964c13475a5242965571568e6ab104079690081eaf70d38ecf20fb88acd51b46cd41cec88f983cf944b6b428ee51fbeb1515d374a8e8ec23cdf302e24dd8", + "0x092525ed7af70cbd5d7b71f7c84fb33a32f95f3a6e9025347669b946ae2f68204f216f49cfb45df5d357cbbc0dec5195ffb0ae7915a9abbf9998423aed1c4719ee", + "0x09301e24b714f6681214818447ef9875ba90e1a79a1b548d263209873e35b0e6470b2f1165f0e1953a83b72bbdee88220e13488f66def7b166d1137d3281e7711e", + "0x0805dd9464b12997d35f1f6c02f7afa86fe5b3b09c9e88ba6ae449cf6d3bf756140000000000000000000000000000000000000000000000000000000000000000", + "0x06174debb83d91dd811da7bc6662a642cc352a7b72612539c39807529fd1b256ef28a7371d704258f6b2fadbe3fbebe5ed2214c1f338da5f598d200d6ca50d8726", + "0x0402c74cd9c4f15ebfc84e9c3e7e11f959d616a40dcbd2adc803712cdace700d460508000000000000000000000000000000000000000000000000122a000000000000000100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000f1c66c4fbac3b5728d7d3a97bad854d7b8868ccbecc96963b6deb56c7d59b6631e75865a0ae96d1340b5fa97af7a9ff44d89d793d59bbe06fe969d25e17512fc204ed7c70f96b99c776995fb64377f0d4ab3b0e1c1000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0x70997970C51812dc3A010C7d01b50e0d17dc79C8": [ + "0x0916915644141af4c02c966160672d0f79e8a73ec65c03d95e3c08a79f93ea34050cabafce3c82158e92dacb47a9d226866b439aadf000b8a698a0491bb1287e09", + "0x09005130f6ef170b4a55bcece863ec93c6cc42c2c0b3b618cb255f84771d586082116b1ca7ad273164d30da58de7debca26d20471db94ed6d51170c7438a98a7d7", + "0x09101c4d9efd8067a09a82c4f8194046ecd985e2317bcdd156146fc39bf7a81ea528c52b5419b4774d38553b818f243269ab491f801340b55c054840102c1183cf", + "0x0911afd63ee62d1450fc093a4531ac8985c8e58925ed2ea24e9cd96741c99dc6481dc4d1c2b8624ca22bfd53cb0bf0847ed32e2b62acc80f754dae980b19e6d2bc", + "0x090fb7e28ee1049d2fcaf7891293c6b6d0299a4e37d32bcb18977efa1e9b05fd8c0fad0cee1b4af52f9ee626d48b7c20d5a80296cd163dc5892ae89d44ae279819", + "0x092bacc030e7201c95030a1aea2839ee9bfee02262d8e0675495fea4338bdfa50626ca9b2788a2c49a41b61470c48c149c5d1e5df1152a66a3efd56214f1a21f50", + "0x0900f088c016ba77fd9f92ce70ea2a1d105cdfc6c6a5d9186a2c187134d4c5a4ee19d7c633c789bddf48c5adc5ca2f156a312a4b6df48cfeb3c68f8912289f700a", + "0x0811aeb5c77f58acc623269a27421e3df2a976590ea3c49253696886e11dd909630000000000000000000000000000000000000000000000000000000000000000", + "0x0611f38814e6e8cc137e70a9f1a263bc86ee4a46de80e45b577943bc39cf34db0113b4cfe2bd0eca587f8630c6f7009354670195e252d84f756d2011ae36034a03", + "0x0407edffb2f516756416f9cd6da120841b708d8ba8e0ae76133c0022b27325217405080000000000000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b648642070997970c51812dc3a010c7d01b50e0d17dc79c8000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xFABB0ac9d68B0B445fB7357272Ff202C5651694a": [ + "0x0916915644141af4c02c966160672d0f79e8a73ec65c03d95e3c08a79f93ea34050cabafce3c82158e92dacb47a9d226866b439aadf000b8a698a0491bb1287e09", + "0x0925469c93478142c5181e8c83afe048e886115bbe31c679399c74d72080cb632c221d5513fe95f49ecd8e389e37d52d6ec8130ad69d888c675bdc84ce2400ee78", + "0x091e4b5ef1d5222d492d2d4d40db8b129f7e10db7c7e9d74df510e88957c0497572946640f70eaec6f6e502522f7cf1f5571f190ee0c0161a16879fcdb7ab6cbe0", + "0x092c64d5221dad610c5df84365da67f50a0bbd440c79a874ca183646c9fbeb0d26001854e8380fbd58620925780f3ed2d0abeea5a13b4e0a4e0a51f59b9b5ec3c0", + "0x090c7324dbf6f4a22b32995b056371d963065c580ba06b15d290f20912ab74de150737c330f50040af342a6fcde8e7cf9b55d99aea72a8da354a297ce83a6236ae", + "0x0925d35eaab3e661482b194b877f0c5d6eb68454c147ab82e5a1cf0630964298da2cd91c7a4c36943da038bcb35dde8dd004b83e190a17e35d1bda9011ae062f99", + "0x092173e847844f75d655ac0690b26ee3bf3e65a3c0062f9b9be566e74cd41927df1215ac258b337f405bdc220d46ab414449397bccc7a37ba0d766a2cbf5737bd0", + "0x07000000000000000000000000000000000000000000000000000000000000000027205679e57b17b3fe2ffec8d7631b7e3a7cf3090b3d18884a9573935e7a7511", + "0x08046f8c27fed9e1020f9093fb8f65b4d54359076a4a42f7de062315f02984d8530000000000000000000000000000000000000000000000000000000000000000", + "0x070da2cd588a58eac30e8fc5d438bff48ff6121f873190f56749be6d1973b91bd8159ad10b4c89ff16157cc364c81f6039eeea9a8eb87e4b4700249219e71cc3ef", + "0x0403d2c88868dc8b5f7994604147a8246c48cc905235de980c42c3e78f351f00c5050800000000000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000002cf435b5b8a0000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420fabb0ac9d68b0b445fb7357272ff202c5651694a000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ], + "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266": [ + "0x0916915644141af4c02c966160672d0f79e8a73ec65c03d95e3c08a79f93ea34050cabafce3c82158e92dacb47a9d226866b439aadf000b8a698a0491bb1287e09", + "0x09005130f6ef170b4a55bcece863ec93c6cc42c2c0b3b618cb255f84771d586082116b1ca7ad273164d30da58de7debca26d20471db94ed6d51170c7438a98a7d7", + "0x090aed840e92cbd0a06800b3b4e8551bb764b65d8e45b9c8c637a2c2e9bfd4b5d81dba29d9dfbb5718d98659be4655313dd511a0af82697048d9ad7ccfecc1a694", + "0x091ca7eeccc653e167fcd5788f8def0cada0619512b2d7babce67dc9b733b5dfcc06921c2f3b60bbd12dae3fc369a599b847b18e90e7cbb03a76e5a43f895671df", + "0x0904d372f19e36a9adfaa1a210e66dd590ca3f95c5a0c97a71e0928cb510c396a026a84c76a676d5c0929ac8406af400ef8c7580df1e1d5b184702c70009e93bba", + "0x090499f54d51ade86d47dab5d1e970743042c1ce0717b2b7b81bee9b189518ca8a23511be62ff26051b2c4a8e6ffa3bce4f6ee4e6b2331b614f0754a1f4b561f3a", + "0x092451b07285b95053d2dee61874127cd4e97218d6ab497f3dda1b28144a902d350cb5631addf24f8a0f50535b274b94e6b7a6c3d81cb06568d9ceb10f972630fe", + "0x0611b54906e8056f349a1fbbc39f76c384935a4fff46b85993ce0e37619b5dad962136227bfdf556b4f3fd9b1d2cfbf706be762de618e40d1a84d9dfc25bfa7c18", + "0x040d972511ec05ac7e25d155e7d292ab9a61b2227df344cd0eabfeff6f423c64d205080000000000000000000000000000000000000000000000000000000000000000001a001ffffffffffffffffffffffffffffffffffffffffffffffffffd30bca4a4760000000000000000000000000000000000000000000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a4702098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b6486420f39fd6e51aad88f6f4ce6ab8827279cfffb92266000000000000000000000000", + "0x5448495320495320534f4d45204d4147494320425954455320464f5220534d54206d3172525867503278704449" + ] + } + } + ], + "executionResults": [ + { + "l1DataFee": "0x1a2d7", + "gas": 93533, + "failed": false, + "returnValue": "", + "from": { + "address": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "nonce": 26, + "balance": "0x1ffffffffffffffffffffffffffffffffffffffffffffffffffd30bca4a476", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + "to": { + "address": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "nonce": 26, + "balance": "0x1ffffffffffffffffffffffffffffffffffffffffffffffffffd30bca4a476", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + }, + "accountAfter": [ + { + "address": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "nonce": 28, + "balance": "0x1ffffffffffffffffffffffffffffffffffffffffffffffff5549f074f305f", + "keccakCodeHash": "0x04d8ac2c8a335e729a265fb2e4b80244e2ce64e4fa078a8ad35d3caa94f3dae0", + "poseidonCodeHash": "0x226b48d26f25d639001ec8aad64cc7da237713910c2fdf77e87f2bd6547ebdfd", + "codeSize": 23 + }, + { + "address": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "nonce": 28, + "balance": "0x1ffffffffffffffffffffffffffffffffffffffffffffffff5549f074f305f", + "keccakCodeHash": "0x04d8ac2c8a335e729a265fb2e4b80244e2ce64e4fa078a8ad35d3caa94f3dae0", + "poseidonCodeHash": "0x226b48d26f25d639001ec8aad64cc7da237713910c2fdf77e87f2bd6547ebdfd", + "codeSize": 23 + }, + { + "address": "0xfabb0ac9d68b0b445fb7357272ff202c5651694a", + "nonce": 0, + "balance": "0x2000000000000000000000000000000000000000000000000002e50a5d4fa1", + "keccakCodeHash": "0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470", + "poseidonCodeHash": "0x2098f5fb9e239eab3ceac3f27b81e481dc3124d55ffed523a839ee8446b64864", + "codeSize": 0 + } + ], + "structLogs": [ + { + "pc": 0, + "op": "PUSH1", + "gas": 57989, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2, + "op": "PUSH1", + "gas": 57986, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4, + "op": "MSTORE", + "gas": 57983, + "gasCost": 12, + "depth": 1, + "refund": 12500 + }, + { + "pc": 5, + "op": "PUSH1", + "gas": 57971, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 7, + "op": "CALLDATASIZE", + "gas": 57968, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 8, + "op": "LT", + "gas": 57966, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 9, + "op": "PUSH2", + "gas": 57963, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 12, + "op": "JUMPI", + "gas": 57960, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 13, + "op": "PUSH0", + "gas": 57950, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 14, + "op": "CALLDATALOAD", + "gas": 57948, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 15, + "op": "PUSH1", + "gas": 57945, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 17, + "op": "SHR", + "gas": 57942, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 18, + "op": "DUP1", + "gas": 57939, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 19, + "op": "PUSH4", + "gas": 57936, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 24, + "op": "EQ", + "gas": 57933, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 25, + "op": "PUSH2", + "gas": 57930, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 28, + "op": "JUMPI", + "gas": 57927, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 64, + "op": "JUMPDEST", + "gas": 57917, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 65, + "op": "PUSH2", + "gas": 57916, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 68, + "op": "PUSH1", + "gas": 57913, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 70, + "op": "DUP1", + "gas": 57910, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 71, + "op": "CALLDATASIZE", + "gas": 57907, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 72, + "op": "SUB", + "gas": 57905, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 73, + "op": "DUP2", + "gas": 57902, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 74, + "op": "ADD", + "gas": 57899, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 75, + "op": "SWAP1", + "gas": 57896, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 76, + "op": "PUSH2", + "gas": 57893, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 79, + "op": "SWAP2", + "gas": 57890, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 80, + "op": "SWAP1", + "gas": 57887, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 81, + "op": "PUSH2", + "gas": 57884, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 84, + "op": "JUMP", + "gas": 57881, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2153, + "op": "JUMPDEST", + "gas": 57873, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2154, + "op": "PUSH0", + "gas": 57872, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2155, + "op": "DUP1", + "gas": 57870, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2156, + "op": "PUSH1", + "gas": 57867, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2158, + "op": "DUP4", + "gas": 57864, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2159, + "op": "DUP6", + "gas": 57861, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2160, + "op": "SUB", + "gas": 57858, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2161, + "op": "SLT", + "gas": 57855, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2162, + "op": "ISZERO", + "gas": 57852, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2163, + "op": "PUSH2", + "gas": 57849, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2166, + "op": "JUMPI", + "gas": 57846, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2175, + "op": "JUMPDEST", + "gas": 57836, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2176, + "op": "PUSH0", + "gas": 57835, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2177, + "op": "DUP4", + "gas": 57833, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2178, + "op": "ADD", + "gas": 57830, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2179, + "op": "CALLDATALOAD", + "gas": 57827, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2180, + "op": "PUSH8", + "gas": 57824, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2189, + "op": "DUP2", + "gas": 57821, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2190, + "op": "GT", + "gas": 57818, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2191, + "op": "ISZERO", + "gas": 57815, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2192, + "op": "PUSH2", + "gas": 57812, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2195, + "op": "JUMPI", + "gas": 57809, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2204, + "op": "JUMPDEST", + "gas": 57799, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2205, + "op": "PUSH2", + "gas": 57798, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2208, + "op": "DUP6", + "gas": 57795, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2209, + "op": "DUP3", + "gas": 57792, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2210, + "op": "DUP7", + "gas": 57789, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2211, + "op": "ADD", + "gas": 57786, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2212, + "op": "PUSH2", + "gas": 57783, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2215, + "op": "JUMP", + "gas": 57780, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2068, + "op": "JUMPDEST", + "gas": 57772, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2069, + "op": "PUSH0", + "gas": 57771, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2070, + "op": "DUP1", + "gas": 57769, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2071, + "op": "DUP4", + "gas": 57766, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2072, + "op": "PUSH1", + "gas": 57763, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2074, + "op": "DUP5", + "gas": 57760, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2075, + "op": "ADD", + "gas": 57757, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2076, + "op": "SLT", + "gas": 57754, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2077, + "op": "PUSH2", + "gas": 57751, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2080, + "op": "JUMPI", + "gas": 57748, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2089, + "op": "JUMPDEST", + "gas": 57738, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2090, + "op": "DUP3", + "gas": 57737, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2091, + "op": "CALLDATALOAD", + "gas": 57734, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2092, + "op": "SWAP1", + "gas": 57731, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2093, + "op": "POP", + "gas": 57728, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2094, + "op": "PUSH8", + "gas": 57726, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2103, + "op": "DUP2", + "gas": 57723, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2104, + "op": "GT", + "gas": 57720, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2105, + "op": "ISZERO", + "gas": 57717, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2106, + "op": "PUSH2", + "gas": 57714, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2109, + "op": "JUMPI", + "gas": 57711, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2118, + "op": "JUMPDEST", + "gas": 57701, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2119, + "op": "PUSH1", + "gas": 57700, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2121, + "op": "DUP4", + "gas": 57697, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2122, + "op": "ADD", + "gas": 57694, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2123, + "op": "SWAP2", + "gas": 57691, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2124, + "op": "POP", + "gas": 57688, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2125, + "op": "DUP4", + "gas": 57686, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2126, + "op": "PUSH1", + "gas": 57683, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2128, + "op": "DUP3", + "gas": 57680, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2129, + "op": "MUL", + "gas": 57677, + "gasCost": 5, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2130, + "op": "DUP4", + "gas": 57672, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2131, + "op": "ADD", + "gas": 57669, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2132, + "op": "GT", + "gas": 57666, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2133, + "op": "ISZERO", + "gas": 57663, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2134, + "op": "PUSH2", + "gas": 57660, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2137, + "op": "JUMPI", + "gas": 57657, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2146, + "op": "JUMPDEST", + "gas": 57647, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2147, + "op": "SWAP3", + "gas": 57646, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2148, + "op": "POP", + "gas": 57643, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2149, + "op": "SWAP3", + "gas": 57641, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2150, + "op": "SWAP1", + "gas": 57638, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2151, + "op": "POP", + "gas": 57635, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2152, + "op": "JUMP", + "gas": 57633, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2216, + "op": "JUMPDEST", + "gas": 57625, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2217, + "op": "SWAP3", + "gas": 57624, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2218, + "op": "POP", + "gas": 57621, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2219, + "op": "SWAP3", + "gas": 57619, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2220, + "op": "POP", + "gas": 57616, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2221, + "op": "POP", + "gas": 57614, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2222, + "op": "SWAP3", + "gas": 57612, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2223, + "op": "POP", + "gas": 57609, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2224, + "op": "SWAP3", + "gas": 57607, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2225, + "op": "SWAP1", + "gas": 57604, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2226, + "op": "POP", + "gas": 57601, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2227, + "op": "JUMP", + "gas": 57599, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 85, + "op": "JUMPDEST", + "gas": 57591, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 86, + "op": "PUSH2", + "gas": 57590, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 89, + "op": "JUMP", + "gas": 57587, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 162, + "op": "JUMPDEST", + "gas": 57579, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 163, + "op": "ADDRESS", + "gas": 57578, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 164, + "op": "PUSH20", + "gas": 57576, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 185, + "op": "AND", + "gas": 57573, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 186, + "op": "CALLER", + "gas": 57570, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 187, + "op": "PUSH20", + "gas": 57568, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 208, + "op": "AND", + "gas": 57565, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 209, + "op": "EQ", + "gas": 57562, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 210, + "op": "PUSH2", + "gas": 57559, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 213, + "op": "JUMPI", + "gas": 57556, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 272, + "op": "JUMPDEST", + "gas": 57546, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 273, + "op": "PUSH2", + "gas": 57545, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 276, + "op": "DUP3", + "gas": 57542, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 277, + "op": "DUP3", + "gas": 57539, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 278, + "op": "PUSH2", + "gas": 57536, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 281, + "op": "JUMP", + "gas": 57533, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 772, + "op": "JUMPDEST", + "gas": 57525, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 773, + "op": "PUSH0", + "gas": 57524, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 774, + "op": "DUP1", + "gas": 57522, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 775, + "op": "SLOAD", + "gas": 57519, + "gasCost": 2100, + "depth": 1, + "refund": 12500 + }, + { + "pc": 776, + "op": "SWAP1", + "gas": 55419, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 777, + "op": "POP", + "gas": 55416, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 778, + "op": "PUSH0", + "gas": 55414, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 779, + "op": "DUP1", + "gas": 55412, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 780, + "op": "DUP2", + "gas": 55409, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 781, + "op": "SLOAD", + "gas": 55406, + "gasCost": 100, + "depth": 1, + "refund": 12500 + }, + { + "pc": 782, + "op": "DUP1", + "gas": 55306, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 783, + "op": "SWAP3", + "gas": 55303, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 784, + "op": "SWAP2", + "gas": 55300, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 785, + "op": "SWAP1", + "gas": 55297, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 786, + "op": "PUSH2", + "gas": 55294, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 789, + "op": "SWAP1", + "gas": 55291, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 790, + "op": "PUSH2", + "gas": 55288, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 793, + "op": "JUMP", + "gas": 55285, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3453, + "op": "JUMPDEST", + "gas": 55277, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3454, + "op": "PUSH0", + "gas": 55276, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3455, + "op": "PUSH2", + "gas": 55274, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3458, + "op": "DUP3", + "gas": 55271, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3459, + "op": "PUSH2", + "gas": 55268, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3462, + "op": "JUMP", + "gas": 55265, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2439, + "op": "JUMPDEST", + "gas": 55257, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2440, + "op": "PUSH0", + "gas": 55256, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2441, + "op": "DUP2", + "gas": 55254, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2442, + "op": "SWAP1", + "gas": 55251, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2443, + "op": "POP", + "gas": 55248, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2444, + "op": "SWAP2", + "gas": 55246, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2445, + "op": "SWAP1", + "gas": 55243, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2446, + "op": "POP", + "gas": 55240, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2447, + "op": "JUMP", + "gas": 55238, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3463, + "op": "JUMPDEST", + "gas": 55230, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3464, + "op": "SWAP2", + "gas": 55229, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3465, + "op": "POP", + "gas": 55226, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3466, + "op": "PUSH32", + "gas": 55224, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3499, + "op": "DUP3", + "gas": 55221, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3500, + "op": "SUB", + "gas": 55218, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3501, + "op": "PUSH2", + "gas": 55215, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3504, + "op": "JUMPI", + "gas": 55212, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3513, + "op": "JUMPDEST", + "gas": 55202, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3514, + "op": "PUSH1", + "gas": 55201, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3516, + "op": "DUP3", + "gas": 55198, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3517, + "op": "ADD", + "gas": 55195, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3518, + "op": "SWAP1", + "gas": 55192, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3519, + "op": "POP", + "gas": 55189, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3520, + "op": "SWAP2", + "gas": 55187, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3521, + "op": "SWAP1", + "gas": 55184, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3522, + "op": "POP", + "gas": 55181, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3523, + "op": "JUMP", + "gas": 55179, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 794, + "op": "JUMPDEST", + "gas": 55171, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 795, + "op": "SWAP2", + "gas": 55170, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 796, + "op": "SWAP1", + "gas": 55167, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 797, + "op": "POP", + "gas": 55164, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 798, + "op": "SSTORE", + "gas": 55162, + "gasCost": 20000, + "depth": 1, + "refund": 12500 + }, + { + "pc": 799, + "op": "POP", + "gas": 35162, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 800, + "op": "PUSH0", + "gas": 35160, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 801, + "op": "JUMPDEST", + "gas": 35158, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 802, + "op": "DUP4", + "gas": 35157, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 803, + "op": "DUP4", + "gas": 35154, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 804, + "op": "SWAP1", + "gas": 35151, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 805, + "op": "POP", + "gas": 35148, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 806, + "op": "DUP2", + "gas": 35146, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 807, + "op": "LT", + "gas": 35143, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 808, + "op": "ISZERO", + "gas": 35140, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 809, + "op": "PUSH2", + "gas": 35137, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 812, + "op": "JUMPI", + "gas": 35134, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 813, + "op": "PUSH2", + "gas": 35124, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 816, + "op": "DUP5", + "gas": 35121, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 817, + "op": "DUP5", + "gas": 35118, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 818, + "op": "DUP4", + "gas": 35115, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 819, + "op": "DUP2", + "gas": 35112, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 820, + "op": "DUP2", + "gas": 35109, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 821, + "op": "LT", + "gas": 35106, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 822, + "op": "PUSH2", + "gas": 35103, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 825, + "op": "JUMPI", + "gas": 35100, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 834, + "op": "JUMPDEST", + "gas": 35090, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 835, + "op": "SWAP1", + "gas": 35089, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 836, + "op": "POP", + "gas": 35086, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 837, + "op": "PUSH1", + "gas": 35084, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 839, + "op": "MUL", + "gas": 35081, + "gasCost": 5, + "depth": 1, + "refund": 12500 + }, + { + "pc": 840, + "op": "DUP2", + "gas": 35076, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 841, + "op": "ADD", + "gas": 35073, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 842, + "op": "SWAP1", + "gas": 35070, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 843, + "op": "PUSH2", + "gas": 35067, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 846, + "op": "SWAP2", + "gas": 35064, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 847, + "op": "SWAP1", + "gas": 35061, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 848, + "op": "PUSH2", + "gas": 35058, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 851, + "op": "JUMP", + "gas": 35055, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2665, + "op": "JUMPDEST", + "gas": 35047, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2666, + "op": "PUSH0", + "gas": 35046, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2667, + "op": "DUP3", + "gas": 35044, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2668, + "op": "CALLDATALOAD", + "gas": 35041, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2669, + "op": "PUSH1", + "gas": 35038, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2671, + "op": "PUSH1", + "gas": 35035, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2673, + "op": "SUB", + "gas": 35032, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2674, + "op": "DUP4", + "gas": 35029, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2675, + "op": "CALLDATASIZE", + "gas": 35026, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2676, + "op": "SUB", + "gas": 35024, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2677, + "op": "SUB", + "gas": 35021, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2678, + "op": "DUP2", + "gas": 35018, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2679, + "op": "SLT", + "gas": 35015, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2680, + "op": "PUSH2", + "gas": 35012, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2683, + "op": "JUMPI", + "gas": 35009, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2692, + "op": "JUMPDEST", + "gas": 34999, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2693, + "op": "DUP1", + "gas": 34998, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2694, + "op": "DUP4", + "gas": 34995, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2695, + "op": "ADD", + "gas": 34992, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2696, + "op": "SWAP2", + "gas": 34989, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2697, + "op": "POP", + "gas": 34986, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2698, + "op": "POP", + "gas": 34984, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2699, + "op": "SWAP3", + "gas": 34982, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2700, + "op": "SWAP2", + "gas": 34979, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2701, + "op": "POP", + "gas": 34976, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2702, + "op": "POP", + "gas": 34974, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2703, + "op": "JUMP", + "gas": 34972, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 852, + "op": "JUMPDEST", + "gas": 34964, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 853, + "op": "PUSH2", + "gas": 34963, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 856, + "op": "JUMP", + "gas": 34960, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1027, + "op": "JUMPDEST", + "gas": 34952, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1028, + "op": "PUSH0", + "gas": 34951, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1029, + "op": "DUP2", + "gas": 34949, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1030, + "op": "PUSH0", + "gas": 34946, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1031, + "op": "ADD", + "gas": 34944, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1032, + "op": "PUSH1", + "gas": 34941, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1034, + "op": "DUP2", + "gas": 34938, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1035, + "op": "ADD", + "gas": 34935, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1036, + "op": "SWAP1", + "gas": 34932, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1037, + "op": "PUSH2", + "gas": 34929, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1040, + "op": "SWAP2", + "gas": 34926, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1041, + "op": "SWAP1", + "gas": 34923, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1042, + "op": "PUSH2", + "gas": 34920, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1045, + "op": "JUMP", + "gas": 34917, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2794, + "op": "JUMPDEST", + "gas": 34909, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2795, + "op": "PUSH0", + "gas": 34908, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2796, + "op": "PUSH1", + "gas": 34906, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2798, + "op": "DUP3", + "gas": 34903, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2799, + "op": "DUP5", + "gas": 34900, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2800, + "op": "SUB", + "gas": 34897, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2801, + "op": "SLT", + "gas": 34894, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2802, + "op": "ISZERO", + "gas": 34891, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2803, + "op": "PUSH2", + "gas": 34888, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2806, + "op": "JUMPI", + "gas": 34885, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2815, + "op": "JUMPDEST", + "gas": 34875, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2816, + "op": "PUSH0", + "gas": 34874, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2817, + "op": "PUSH2", + "gas": 34872, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2820, + "op": "DUP5", + "gas": 34869, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2821, + "op": "DUP3", + "gas": 34866, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2822, + "op": "DUP6", + "gas": 34863, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2823, + "op": "ADD", + "gas": 34860, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2824, + "op": "PUSH2", + "gas": 34857, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2827, + "op": "JUMP", + "gas": 34854, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2774, + "op": "JUMPDEST", + "gas": 34846, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2775, + "op": "PUSH0", + "gas": 34845, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2776, + "op": "DUP2", + "gas": 34843, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2777, + "op": "CALLDATALOAD", + "gas": 34840, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2778, + "op": "SWAP1", + "gas": 34837, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2779, + "op": "POP", + "gas": 34834, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2780, + "op": "PUSH2", + "gas": 34832, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2783, + "op": "DUP2", + "gas": 34829, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2784, + "op": "PUSH2", + "gas": 34826, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2787, + "op": "JUMP", + "gas": 34823, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2752, + "op": "JUMPDEST", + "gas": 34815, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2753, + "op": "PUSH2", + "gas": 34814, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2756, + "op": "DUP2", + "gas": 34811, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2757, + "op": "PUSH2", + "gas": 34808, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2760, + "op": "JUMP", + "gas": 34805, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2735, + "op": "JUMPDEST", + "gas": 34797, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2736, + "op": "PUSH0", + "gas": 34796, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2737, + "op": "PUSH2", + "gas": 34794, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2740, + "op": "DUP3", + "gas": 34791, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2741, + "op": "PUSH2", + "gas": 34788, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2744, + "op": "JUMP", + "gas": 34785, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2704, + "op": "JUMPDEST", + "gas": 34777, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2705, + "op": "PUSH0", + "gas": 34776, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2706, + "op": "PUSH20", + "gas": 34774, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2727, + "op": "DUP3", + "gas": 34771, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2728, + "op": "AND", + "gas": 34768, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2729, + "op": "SWAP1", + "gas": 34765, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2730, + "op": "POP", + "gas": 34762, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2731, + "op": "SWAP2", + "gas": 34760, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2732, + "op": "SWAP1", + "gas": 34757, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2733, + "op": "POP", + "gas": 34754, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2734, + "op": "JUMP", + "gas": 34752, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2745, + "op": "JUMPDEST", + "gas": 34744, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2746, + "op": "SWAP1", + "gas": 34743, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2747, + "op": "POP", + "gas": 34740, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2748, + "op": "SWAP2", + "gas": 34738, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2749, + "op": "SWAP1", + "gas": 34735, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2750, + "op": "POP", + "gas": 34732, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2751, + "op": "JUMP", + "gas": 34730, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2761, + "op": "JUMPDEST", + "gas": 34722, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2762, + "op": "DUP2", + "gas": 34721, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2763, + "op": "EQ", + "gas": 34718, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2764, + "op": "PUSH2", + "gas": 34715, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2767, + "op": "JUMPI", + "gas": 34712, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2771, + "op": "JUMPDEST", + "gas": 34702, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2772, + "op": "POP", + "gas": 34701, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2773, + "op": "JUMP", + "gas": 34699, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2788, + "op": "JUMPDEST", + "gas": 34691, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2789, + "op": "SWAP3", + "gas": 34690, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2790, + "op": "SWAP2", + "gas": 34687, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2791, + "op": "POP", + "gas": 34684, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2792, + "op": "POP", + "gas": 34682, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2793, + "op": "JUMP", + "gas": 34680, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2828, + "op": "JUMPDEST", + "gas": 34672, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2829, + "op": "SWAP2", + "gas": 34671, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2830, + "op": "POP", + "gas": 34668, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2831, + "op": "POP", + "gas": 34666, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2832, + "op": "SWAP3", + "gas": 34664, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2833, + "op": "SWAP2", + "gas": 34661, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2834, + "op": "POP", + "gas": 34658, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2835, + "op": "POP", + "gas": 34656, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2836, + "op": "JUMP", + "gas": 34654, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1046, + "op": "JUMPDEST", + "gas": 34646, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1047, + "op": "PUSH20", + "gas": 34645, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1068, + "op": "AND", + "gas": 34642, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1069, + "op": "DUP3", + "gas": 34639, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1070, + "op": "PUSH1", + "gas": 34636, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1072, + "op": "ADD", + "gas": 34633, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1073, + "op": "CALLDATALOAD", + "gas": 34630, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1074, + "op": "DUP4", + "gas": 34627, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1075, + "op": "DUP1", + "gas": 34624, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1076, + "op": "PUSH1", + "gas": 34621, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1078, + "op": "ADD", + "gas": 34618, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1079, + "op": "SWAP1", + "gas": 34615, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1080, + "op": "PUSH2", + "gas": 34612, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1083, + "op": "SWAP2", + "gas": 34609, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1084, + "op": "SWAP1", + "gas": 34606, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1085, + "op": "PUSH2", + "gas": 34603, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1088, + "op": "JUMP", + "gas": 34600, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2837, + "op": "JUMPDEST", + "gas": 34592, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2838, + "op": "PUSH0", + "gas": 34591, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2839, + "op": "DUP1", + "gas": 34589, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2840, + "op": "DUP4", + "gas": 34586, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2841, + "op": "CALLDATALOAD", + "gas": 34583, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2842, + "op": "PUSH1", + "gas": 34580, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2844, + "op": "PUSH1", + "gas": 34577, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2846, + "op": "SUB", + "gas": 34574, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2847, + "op": "DUP5", + "gas": 34571, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2848, + "op": "CALLDATASIZE", + "gas": 34568, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2849, + "op": "SUB", + "gas": 34566, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2850, + "op": "SUB", + "gas": 34563, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2851, + "op": "DUP2", + "gas": 34560, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2852, + "op": "SLT", + "gas": 34557, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2853, + "op": "PUSH2", + "gas": 34554, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2856, + "op": "JUMPI", + "gas": 34551, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2865, + "op": "JUMPDEST", + "gas": 34541, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2866, + "op": "DUP1", + "gas": 34540, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2867, + "op": "DUP5", + "gas": 34537, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2868, + "op": "ADD", + "gas": 34534, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2869, + "op": "SWAP3", + "gas": 34531, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2870, + "op": "POP", + "gas": 34528, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2871, + "op": "DUP3", + "gas": 34526, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2872, + "op": "CALLDATALOAD", + "gas": 34523, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2873, + "op": "SWAP2", + "gas": 34520, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2874, + "op": "POP", + "gas": 34517, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2875, + "op": "PUSH8", + "gas": 34515, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2884, + "op": "DUP3", + "gas": 34512, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2885, + "op": "GT", + "gas": 34509, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2886, + "op": "ISZERO", + "gas": 34506, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2887, + "op": "PUSH2", + "gas": 34503, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2890, + "op": "JUMPI", + "gas": 34500, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2899, + "op": "JUMPDEST", + "gas": 34490, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2900, + "op": "PUSH1", + "gas": 34489, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2902, + "op": "DUP4", + "gas": 34486, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2903, + "op": "ADD", + "gas": 34483, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2904, + "op": "SWAP3", + "gas": 34480, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2905, + "op": "POP", + "gas": 34477, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2906, + "op": "PUSH1", + "gas": 34475, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2908, + "op": "DUP3", + "gas": 34472, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2909, + "op": "MUL", + "gas": 34469, + "gasCost": 5, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2910, + "op": "CALLDATASIZE", + "gas": 34464, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2911, + "op": "SUB", + "gas": 34462, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2912, + "op": "DUP4", + "gas": 34459, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2913, + "op": "SGT", + "gas": 34456, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2914, + "op": "ISZERO", + "gas": 34453, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2915, + "op": "PUSH2", + "gas": 34450, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2918, + "op": "JUMPI", + "gas": 34447, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2927, + "op": "JUMPDEST", + "gas": 34437, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2928, + "op": "POP", + "gas": 34436, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2929, + "op": "SWAP3", + "gas": 34434, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2930, + "op": "POP", + "gas": 34431, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2931, + "op": "SWAP3", + "gas": 34429, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2932, + "op": "SWAP1", + "gas": 34426, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2933, + "op": "POP", + "gas": 34423, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2934, + "op": "JUMP", + "gas": 34421, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1089, + "op": "JUMPDEST", + "gas": 34413, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1090, + "op": "PUSH1", + "gas": 34412, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1092, + "op": "MLOAD", + "gas": 34409, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1093, + "op": "PUSH2", + "gas": 34406, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1096, + "op": "SWAP3", + "gas": 34403, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1097, + "op": "SWAP2", + "gas": 34400, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1098, + "op": "SWAP1", + "gas": 34397, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1099, + "op": "PUSH2", + "gas": 34394, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1102, + "op": "JUMP", + "gas": 34391, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4172, + "op": "JUMPDEST", + "gas": 34383, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4173, + "op": "PUSH0", + "gas": 34382, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4174, + "op": "PUSH2", + "gas": 34380, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4177, + "op": "DUP3", + "gas": 34377, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4178, + "op": "DUP5", + "gas": 34374, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4179, + "op": "DUP7", + "gas": 34371, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4180, + "op": "PUSH2", + "gas": 34368, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4183, + "op": "JUMP", + "gas": 34365, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3158, + "op": "JUMPDEST", + "gas": 34357, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3159, + "op": "PUSH0", + "gas": 34356, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3160, + "op": "PUSH2", + "gas": 34354, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3163, + "op": "DUP4", + "gas": 34351, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3164, + "op": "DUP6", + "gas": 34348, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3165, + "op": "PUSH2", + "gas": 34345, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3168, + "op": "JUMP", + "gas": 34342, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2945, + "op": "JUMPDEST", + "gas": 34334, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2946, + "op": "PUSH0", + "gas": 34333, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2947, + "op": "DUP2", + "gas": 34331, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2948, + "op": "SWAP1", + "gas": 34328, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2949, + "op": "POP", + "gas": 34325, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2950, + "op": "SWAP3", + "gas": 34323, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2951, + "op": "SWAP2", + "gas": 34320, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2952, + "op": "POP", + "gas": 34317, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2953, + "op": "POP", + "gas": 34315, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2954, + "op": "JUMP", + "gas": 34313, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3169, + "op": "JUMPDEST", + "gas": 34305, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3170, + "op": "SWAP4", + "gas": 34304, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3171, + "op": "POP", + "gas": 34301, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3172, + "op": "PUSH2", + "gas": 34299, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3175, + "op": "DUP4", + "gas": 34296, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3176, + "op": "DUP6", + "gas": 34293, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3177, + "op": "DUP5", + "gas": 34290, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3178, + "op": "PUSH2", + "gas": 34287, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3181, + "op": "JUMP", + "gas": 34284, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3144, + "op": "JUMPDEST", + "gas": 34276, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3145, + "op": "DUP3", + "gas": 34275, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3146, + "op": "DUP2", + "gas": 34272, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3147, + "op": "DUP4", + "gas": 34269, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3148, + "op": "CALLDATACOPY", + "gas": 34266, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3149, + "op": "PUSH0", + "gas": 34263, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3150, + "op": "DUP4", + "gas": 34261, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3151, + "op": "DUP4", + "gas": 34258, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3152, + "op": "ADD", + "gas": 34255, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3153, + "op": "MSTORE", + "gas": 34252, + "gasCost": 9, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3154, + "op": "POP", + "gas": 34243, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3155, + "op": "POP", + "gas": 34241, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3156, + "op": "POP", + "gas": 34239, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3157, + "op": "JUMP", + "gas": 34237, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3182, + "op": "JUMPDEST", + "gas": 34229, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3183, + "op": "DUP3", + "gas": 34228, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3184, + "op": "DUP5", + "gas": 34225, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3185, + "op": "ADD", + "gas": 34222, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3186, + "op": "SWAP1", + "gas": 34219, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3187, + "op": "POP", + "gas": 34216, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3188, + "op": "SWAP4", + "gas": 34214, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3189, + "op": "SWAP3", + "gas": 34211, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3190, + "op": "POP", + "gas": 34208, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3191, + "op": "POP", + "gas": 34206, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3192, + "op": "POP", + "gas": 34204, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3193, + "op": "JUMP", + "gas": 34202, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4184, + "op": "JUMPDEST", + "gas": 34194, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4185, + "op": "SWAP2", + "gas": 34193, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4186, + "op": "POP", + "gas": 34190, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4187, + "op": "DUP2", + "gas": 34188, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4188, + "op": "SWAP1", + "gas": 34185, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4189, + "op": "POP", + "gas": 34182, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4190, + "op": "SWAP4", + "gas": 34180, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4191, + "op": "SWAP3", + "gas": 34177, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4192, + "op": "POP", + "gas": 34174, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4193, + "op": "POP", + "gas": 34172, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4194, + "op": "POP", + "gas": 34170, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4195, + "op": "JUMP", + "gas": 34168, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1103, + "op": "JUMPDEST", + "gas": 34160, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1104, + "op": "PUSH0", + "gas": 34159, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1105, + "op": "PUSH1", + "gas": 34157, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1107, + "op": "MLOAD", + "gas": 34154, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1108, + "op": "DUP1", + "gas": 34151, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1109, + "op": "DUP4", + "gas": 34148, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1110, + "op": "SUB", + "gas": 34145, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1111, + "op": "DUP2", + "gas": 34142, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1112, + "op": "DUP6", + "gas": 34139, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1113, + "op": "DUP8", + "gas": 34136, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1114, + "op": "GAS", + "gas": 34133, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1115, + "op": "CALL", + "gas": 34131, + "gasCost": 33779, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1116, + "op": "SWAP3", + "gas": 24831, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1117, + "op": "POP", + "gas": 24828, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1118, + "op": "POP", + "gas": 24826, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1119, + "op": "POP", + "gas": 24824, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1120, + "op": "RETURNDATASIZE", + "gas": 24822, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1121, + "op": "DUP1", + "gas": 24820, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1122, + "op": "PUSH0", + "gas": 24817, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1123, + "op": "DUP2", + "gas": 24815, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1124, + "op": "EQ", + "gas": 24812, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1125, + "op": "PUSH2", + "gas": 24809, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1128, + "op": "JUMPI", + "gas": 24806, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1161, + "op": "JUMPDEST", + "gas": 24796, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1162, + "op": "PUSH1", + "gas": 24795, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1164, + "op": "SWAP2", + "gas": 24792, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1165, + "op": "POP", + "gas": 24789, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1166, + "op": "JUMPDEST", + "gas": 24787, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1167, + "op": "POP", + "gas": 24786, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1168, + "op": "POP", + "gas": 24784, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1169, + "op": "SWAP1", + "gas": 24782, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1170, + "op": "POP", + "gas": 24779, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1171, + "op": "DUP1", + "gas": 24777, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1172, + "op": "PUSH2", + "gas": 24774, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1175, + "op": "JUMPI", + "gas": 24771, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1234, + "op": "JUMPDEST", + "gas": 24761, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1235, + "op": "DUP2", + "gas": 24760, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1236, + "op": "PUSH0", + "gas": 24757, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1237, + "op": "ADD", + "gas": 24755, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1238, + "op": "PUSH1", + "gas": 24752, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1240, + "op": "DUP2", + "gas": 24749, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1241, + "op": "ADD", + "gas": 24746, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1242, + "op": "SWAP1", + "gas": 24743, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1243, + "op": "PUSH2", + "gas": 24740, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1246, + "op": "SWAP2", + "gas": 24737, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1247, + "op": "SWAP1", + "gas": 24734, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1248, + "op": "PUSH2", + "gas": 24731, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1251, + "op": "JUMP", + "gas": 24728, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2794, + "op": "JUMPDEST", + "gas": 24720, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2795, + "op": "PUSH0", + "gas": 24719, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2796, + "op": "PUSH1", + "gas": 24717, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2798, + "op": "DUP3", + "gas": 24714, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2799, + "op": "DUP5", + "gas": 24711, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2800, + "op": "SUB", + "gas": 24708, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2801, + "op": "SLT", + "gas": 24705, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2802, + "op": "ISZERO", + "gas": 24702, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2803, + "op": "PUSH2", + "gas": 24699, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2806, + "op": "JUMPI", + "gas": 24696, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2815, + "op": "JUMPDEST", + "gas": 24686, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2816, + "op": "PUSH0", + "gas": 24685, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2817, + "op": "PUSH2", + "gas": 24683, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2820, + "op": "DUP5", + "gas": 24680, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2821, + "op": "DUP3", + "gas": 24677, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2822, + "op": "DUP6", + "gas": 24674, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2823, + "op": "ADD", + "gas": 24671, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2824, + "op": "PUSH2", + "gas": 24668, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2827, + "op": "JUMP", + "gas": 24665, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2774, + "op": "JUMPDEST", + "gas": 24657, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2775, + "op": "PUSH0", + "gas": 24656, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2776, + "op": "DUP2", + "gas": 24654, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2777, + "op": "CALLDATALOAD", + "gas": 24651, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2778, + "op": "SWAP1", + "gas": 24648, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2779, + "op": "POP", + "gas": 24645, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2780, + "op": "PUSH2", + "gas": 24643, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2783, + "op": "DUP2", + "gas": 24640, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2784, + "op": "PUSH2", + "gas": 24637, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2787, + "op": "JUMP", + "gas": 24634, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2752, + "op": "JUMPDEST", + "gas": 24626, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2753, + "op": "PUSH2", + "gas": 24625, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2756, + "op": "DUP2", + "gas": 24622, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2757, + "op": "PUSH2", + "gas": 24619, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2760, + "op": "JUMP", + "gas": 24616, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2735, + "op": "JUMPDEST", + "gas": 24608, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2736, + "op": "PUSH0", + "gas": 24607, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2737, + "op": "PUSH2", + "gas": 24605, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2740, + "op": "DUP3", + "gas": 24602, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2741, + "op": "PUSH2", + "gas": 24599, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2744, + "op": "JUMP", + "gas": 24596, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2704, + "op": "JUMPDEST", + "gas": 24588, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2705, + "op": "PUSH0", + "gas": 24587, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2706, + "op": "PUSH20", + "gas": 24585, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2727, + "op": "DUP3", + "gas": 24582, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2728, + "op": "AND", + "gas": 24579, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2729, + "op": "SWAP1", + "gas": 24576, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2730, + "op": "POP", + "gas": 24573, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2731, + "op": "SWAP2", + "gas": 24571, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2732, + "op": "SWAP1", + "gas": 24568, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2733, + "op": "POP", + "gas": 24565, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2734, + "op": "JUMP", + "gas": 24563, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2745, + "op": "JUMPDEST", + "gas": 24555, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2746, + "op": "SWAP1", + "gas": 24554, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2747, + "op": "POP", + "gas": 24551, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2748, + "op": "SWAP2", + "gas": 24549, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2749, + "op": "SWAP1", + "gas": 24546, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2750, + "op": "POP", + "gas": 24543, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2751, + "op": "JUMP", + "gas": 24541, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2761, + "op": "JUMPDEST", + "gas": 24533, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2762, + "op": "DUP2", + "gas": 24532, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2763, + "op": "EQ", + "gas": 24529, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2764, + "op": "PUSH2", + "gas": 24526, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2767, + "op": "JUMPI", + "gas": 24523, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2771, + "op": "JUMPDEST", + "gas": 24513, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2772, + "op": "POP", + "gas": 24512, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2773, + "op": "JUMP", + "gas": 24510, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2788, + "op": "JUMPDEST", + "gas": 24502, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2789, + "op": "SWAP3", + "gas": 24501, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2790, + "op": "SWAP2", + "gas": 24498, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2791, + "op": "POP", + "gas": 24495, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2792, + "op": "POP", + "gas": 24493, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2793, + "op": "JUMP", + "gas": 24491, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2828, + "op": "JUMPDEST", + "gas": 24483, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2829, + "op": "SWAP2", + "gas": 24482, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2830, + "op": "POP", + "gas": 24479, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2831, + "op": "POP", + "gas": 24477, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2832, + "op": "SWAP3", + "gas": 24475, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2833, + "op": "SWAP2", + "gas": 24472, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2834, + "op": "POP", + "gas": 24469, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2835, + "op": "POP", + "gas": 24467, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2836, + "op": "JUMP", + "gas": 24465, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1252, + "op": "JUMPDEST", + "gas": 24457, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1253, + "op": "PUSH20", + "gas": 24456, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1274, + "op": "AND", + "gas": 24453, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1275, + "op": "CALLER", + "gas": 24450, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1276, + "op": "PUSH20", + "gas": 24448, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1297, + "op": "AND", + "gas": 24445, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1298, + "op": "PUSH32", + "gas": 24442, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1331, + "op": "DUP5", + "gas": 24439, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1332, + "op": "PUSH1", + "gas": 24436, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1334, + "op": "ADD", + "gas": 24433, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1335, + "op": "CALLDATALOAD", + "gas": 24430, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1336, + "op": "DUP6", + "gas": 24427, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1337, + "op": "DUP1", + "gas": 24424, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1338, + "op": "PUSH1", + "gas": 24421, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1340, + "op": "ADD", + "gas": 24418, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1341, + "op": "SWAP1", + "gas": 24415, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1342, + "op": "PUSH2", + "gas": 24412, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1345, + "op": "SWAP2", + "gas": 24409, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1346, + "op": "SWAP1", + "gas": 24406, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1347, + "op": "PUSH2", + "gas": 24403, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1350, + "op": "JUMP", + "gas": 24400, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2837, + "op": "JUMPDEST", + "gas": 24392, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2838, + "op": "PUSH0", + "gas": 24391, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2839, + "op": "DUP1", + "gas": 24389, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2840, + "op": "DUP4", + "gas": 24386, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2841, + "op": "CALLDATALOAD", + "gas": 24383, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2842, + "op": "PUSH1", + "gas": 24380, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2844, + "op": "PUSH1", + "gas": 24377, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2846, + "op": "SUB", + "gas": 24374, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2847, + "op": "DUP5", + "gas": 24371, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2848, + "op": "CALLDATASIZE", + "gas": 24368, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2849, + "op": "SUB", + "gas": 24366, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2850, + "op": "SUB", + "gas": 24363, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2851, + "op": "DUP2", + "gas": 24360, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2852, + "op": "SLT", + "gas": 24357, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2853, + "op": "PUSH2", + "gas": 24354, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2856, + "op": "JUMPI", + "gas": 24351, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2865, + "op": "JUMPDEST", + "gas": 24341, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2866, + "op": "DUP1", + "gas": 24340, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2867, + "op": "DUP5", + "gas": 24337, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2868, + "op": "ADD", + "gas": 24334, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2869, + "op": "SWAP3", + "gas": 24331, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2870, + "op": "POP", + "gas": 24328, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2871, + "op": "DUP3", + "gas": 24326, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2872, + "op": "CALLDATALOAD", + "gas": 24323, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2873, + "op": "SWAP2", + "gas": 24320, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2874, + "op": "POP", + "gas": 24317, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2875, + "op": "PUSH8", + "gas": 24315, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2884, + "op": "DUP3", + "gas": 24312, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2885, + "op": "GT", + "gas": 24309, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2886, + "op": "ISZERO", + "gas": 24306, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2887, + "op": "PUSH2", + "gas": 24303, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2890, + "op": "JUMPI", + "gas": 24300, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2899, + "op": "JUMPDEST", + "gas": 24290, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2900, + "op": "PUSH1", + "gas": 24289, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2902, + "op": "DUP4", + "gas": 24286, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2903, + "op": "ADD", + "gas": 24283, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2904, + "op": "SWAP3", + "gas": 24280, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2905, + "op": "POP", + "gas": 24277, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2906, + "op": "PUSH1", + "gas": 24275, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2908, + "op": "DUP3", + "gas": 24272, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2909, + "op": "MUL", + "gas": 24269, + "gasCost": 5, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2910, + "op": "CALLDATASIZE", + "gas": 24264, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2911, + "op": "SUB", + "gas": 24262, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2912, + "op": "DUP4", + "gas": 24259, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2913, + "op": "SGT", + "gas": 24256, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2914, + "op": "ISZERO", + "gas": 24253, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2915, + "op": "PUSH2", + "gas": 24250, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2918, + "op": "JUMPI", + "gas": 24247, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2927, + "op": "JUMPDEST", + "gas": 24237, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2928, + "op": "POP", + "gas": 24236, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2929, + "op": "SWAP3", + "gas": 24234, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2930, + "op": "POP", + "gas": 24231, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2931, + "op": "SWAP3", + "gas": 24229, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2932, + "op": "SWAP1", + "gas": 24226, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2933, + "op": "POP", + "gas": 24223, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2934, + "op": "JUMP", + "gas": 24221, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1351, + "op": "JUMPDEST", + "gas": 24213, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1352, + "op": "PUSH1", + "gas": 24212, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1354, + "op": "MLOAD", + "gas": 24209, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1355, + "op": "PUSH2", + "gas": 24206, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1358, + "op": "SWAP4", + "gas": 24203, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1359, + "op": "SWAP3", + "gas": 24200, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1360, + "op": "SWAP2", + "gas": 24197, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1361, + "op": "SWAP1", + "gas": 24194, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1362, + "op": "PUSH2", + "gas": 24191, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1365, + "op": "JUMP", + "gas": 24188, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4360, + "op": "JUMPDEST", + "gas": 24180, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4361, + "op": "PUSH0", + "gas": 24179, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4362, + "op": "PUSH1", + "gas": 24177, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4364, + "op": "DUP3", + "gas": 24174, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4365, + "op": "ADD", + "gas": 24171, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4366, + "op": "SWAP1", + "gas": 24168, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4367, + "op": "POP", + "gas": 24165, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4368, + "op": "PUSH2", + "gas": 24163, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4371, + "op": "PUSH0", + "gas": 24160, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4372, + "op": "DUP4", + "gas": 24158, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4373, + "op": "ADD", + "gas": 24155, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4374, + "op": "DUP7", + "gas": 24152, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4375, + "op": "PUSH2", + "gas": 24149, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4378, + "op": "JUMP", + "gas": 24146, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2448, + "op": "JUMPDEST", + "gas": 24138, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2449, + "op": "PUSH2", + "gas": 24137, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2452, + "op": "DUP2", + "gas": 24134, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2453, + "op": "PUSH2", + "gas": 24131, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2456, + "op": "JUMP", + "gas": 24128, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2439, + "op": "JUMPDEST", + "gas": 24120, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2440, + "op": "PUSH0", + "gas": 24119, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2441, + "op": "DUP2", + "gas": 24117, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2442, + "op": "SWAP1", + "gas": 24114, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2443, + "op": "POP", + "gas": 24111, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2444, + "op": "SWAP2", + "gas": 24109, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2445, + "op": "SWAP1", + "gas": 24106, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2446, + "op": "POP", + "gas": 24103, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2447, + "op": "JUMP", + "gas": 24101, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2457, + "op": "JUMPDEST", + "gas": 24093, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2458, + "op": "DUP3", + "gas": 24092, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2459, + "op": "MSTORE", + "gas": 24089, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2460, + "op": "POP", + "gas": 24086, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2461, + "op": "POP", + "gas": 24084, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2462, + "op": "JUMP", + "gas": 24082, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4379, + "op": "JUMPDEST", + "gas": 24074, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4380, + "op": "DUP2", + "gas": 24073, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4381, + "op": "DUP2", + "gas": 24070, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4382, + "op": "SUB", + "gas": 24067, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4383, + "op": "PUSH1", + "gas": 24064, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4385, + "op": "DUP4", + "gas": 24061, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4386, + "op": "ADD", + "gas": 24058, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4387, + "op": "MSTORE", + "gas": 24055, + "gasCost": 6, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4388, + "op": "PUSH2", + "gas": 24049, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4391, + "op": "DUP2", + "gas": 24046, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4392, + "op": "DUP5", + "gas": 24043, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4393, + "op": "DUP7", + "gas": 24040, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4394, + "op": "PUSH2", + "gas": 24037, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4397, + "op": "JUMP", + "gas": 24034, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4316, + "op": "JUMPDEST", + "gas": 24026, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4317, + "op": "PUSH0", + "gas": 24025, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4318, + "op": "PUSH2", + "gas": 24023, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4321, + "op": "DUP4", + "gas": 24020, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4322, + "op": "DUP6", + "gas": 24017, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4323, + "op": "PUSH2", + "gas": 24014, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4326, + "op": "JUMP", + "gas": 24011, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4300, + "op": "JUMPDEST", + "gas": 24003, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4301, + "op": "PUSH0", + "gas": 24002, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4302, + "op": "DUP3", + "gas": 24000, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4303, + "op": "DUP3", + "gas": 23997, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4304, + "op": "MSTORE", + "gas": 23994, + "gasCost": 6, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4305, + "op": "PUSH1", + "gas": 23988, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4307, + "op": "DUP3", + "gas": 23985, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4308, + "op": "ADD", + "gas": 23982, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4309, + "op": "SWAP1", + "gas": 23979, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4310, + "op": "POP", + "gas": 23976, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4311, + "op": "SWAP3", + "gas": 23974, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4312, + "op": "SWAP2", + "gas": 23971, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4313, + "op": "POP", + "gas": 23968, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4314, + "op": "POP", + "gas": 23966, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4315, + "op": "JUMP", + "gas": 23964, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4327, + "op": "JUMPDEST", + "gas": 23956, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4328, + "op": "SWAP4", + "gas": 23955, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4329, + "op": "POP", + "gas": 23952, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4330, + "op": "PUSH2", + "gas": 23950, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4333, + "op": "DUP4", + "gas": 23947, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4334, + "op": "DUP6", + "gas": 23944, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4335, + "op": "DUP5", + "gas": 23941, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4336, + "op": "PUSH2", + "gas": 23938, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4339, + "op": "JUMP", + "gas": 23935, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3144, + "op": "JUMPDEST", + "gas": 23927, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3145, + "op": "DUP3", + "gas": 23926, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3146, + "op": "DUP2", + "gas": 23923, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3147, + "op": "DUP4", + "gas": 23920, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3148, + "op": "CALLDATACOPY", + "gas": 23917, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3149, + "op": "PUSH0", + "gas": 23914, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3150, + "op": "DUP4", + "gas": 23912, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3151, + "op": "DUP4", + "gas": 23909, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3152, + "op": "ADD", + "gas": 23906, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3153, + "op": "MSTORE", + "gas": 23903, + "gasCost": 6, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3154, + "op": "POP", + "gas": 23897, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3155, + "op": "POP", + "gas": 23895, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3156, + "op": "POP", + "gas": 23893, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3157, + "op": "JUMP", + "gas": 23891, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4340, + "op": "JUMPDEST", + "gas": 23883, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4341, + "op": "PUSH2", + "gas": 23882, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4344, + "op": "DUP4", + "gas": 23879, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4345, + "op": "PUSH2", + "gas": 23876, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4348, + "op": "JUMP", + "gas": 23873, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3791, + "op": "JUMPDEST", + "gas": 23865, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3792, + "op": "PUSH0", + "gas": 23864, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3793, + "op": "PUSH1", + "gas": 23862, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3795, + "op": "NOT", + "gas": 23859, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3796, + "op": "PUSH1", + "gas": 23856, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3798, + "op": "DUP4", + "gas": 23853, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3799, + "op": "ADD", + "gas": 23850, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3800, + "op": "AND", + "gas": 23847, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3801, + "op": "SWAP1", + "gas": 23844, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3802, + "op": "POP", + "gas": 23841, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3803, + "op": "SWAP2", + "gas": 23839, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3804, + "op": "SWAP1", + "gas": 23836, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3805, + "op": "POP", + "gas": 23833, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3806, + "op": "JUMP", + "gas": 23831, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4349, + "op": "JUMPDEST", + "gas": 23823, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4350, + "op": "DUP5", + "gas": 23822, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4351, + "op": "ADD", + "gas": 23819, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4352, + "op": "SWAP1", + "gas": 23816, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4353, + "op": "POP", + "gas": 23813, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4354, + "op": "SWAP4", + "gas": 23811, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4355, + "op": "SWAP3", + "gas": 23808, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4356, + "op": "POP", + "gas": 23805, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4357, + "op": "POP", + "gas": 23803, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4358, + "op": "POP", + "gas": 23801, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4359, + "op": "JUMP", + "gas": 23799, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4398, + "op": "JUMPDEST", + "gas": 23791, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4399, + "op": "SWAP1", + "gas": 23790, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4400, + "op": "POP", + "gas": 23787, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4401, + "op": "SWAP5", + "gas": 23785, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4402, + "op": "SWAP4", + "gas": 23782, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4403, + "op": "POP", + "gas": 23779, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4404, + "op": "POP", + "gas": 23777, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4405, + "op": "POP", + "gas": 23775, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4406, + "op": "POP", + "gas": 23773, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4407, + "op": "JUMP", + "gas": 23771, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1366, + "op": "JUMPDEST", + "gas": 23763, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1367, + "op": "PUSH1", + "gas": 23762, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1369, + "op": "MLOAD", + "gas": 23759, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1370, + "op": "DUP1", + "gas": 23756, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1371, + "op": "SWAP2", + "gas": 23753, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1372, + "op": "SUB", + "gas": 23750, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1373, + "op": "SWAP1", + "gas": 23747, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1374, + "op": "LOG3", + "gas": 23744, + "gasCost": 2268, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1375, + "op": "POP", + "gas": 21476, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1376, + "op": "POP", + "gas": 21474, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1377, + "op": "JUMP", + "gas": 21472, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 857, + "op": "JUMPDEST", + "gas": 21464, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 858, + "op": "DUP1", + "gas": 21463, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 859, + "op": "DUP1", + "gas": 21460, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 860, + "op": "PUSH1", + "gas": 21457, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 862, + "op": "ADD", + "gas": 21454, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 863, + "op": "SWAP2", + "gas": 21451, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 864, + "op": "POP", + "gas": 21448, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 865, + "op": "POP", + "gas": 21446, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 866, + "op": "PUSH2", + "gas": 21444, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 869, + "op": "JUMP", + "gas": 21441, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 801, + "op": "JUMPDEST", + "gas": 21433, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 802, + "op": "DUP4", + "gas": 21432, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 803, + "op": "DUP4", + "gas": 21429, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 804, + "op": "SWAP1", + "gas": 21426, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 805, + "op": "POP", + "gas": 21423, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 806, + "op": "DUP2", + "gas": 21421, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 807, + "op": "LT", + "gas": 21418, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 808, + "op": "ISZERO", + "gas": 21415, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 809, + "op": "PUSH2", + "gas": 21412, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 812, + "op": "JUMPI", + "gas": 21409, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 813, + "op": "PUSH2", + "gas": 21399, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 816, + "op": "DUP5", + "gas": 21396, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 817, + "op": "DUP5", + "gas": 21393, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 818, + "op": "DUP4", + "gas": 21390, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 819, + "op": "DUP2", + "gas": 21387, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 820, + "op": "DUP2", + "gas": 21384, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 821, + "op": "LT", + "gas": 21381, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 822, + "op": "PUSH2", + "gas": 21378, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 825, + "op": "JUMPI", + "gas": 21375, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 834, + "op": "JUMPDEST", + "gas": 21365, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 835, + "op": "SWAP1", + "gas": 21364, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 836, + "op": "POP", + "gas": 21361, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 837, + "op": "PUSH1", + "gas": 21359, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 839, + "op": "MUL", + "gas": 21356, + "gasCost": 5, + "depth": 1, + "refund": 12500 + }, + { + "pc": 840, + "op": "DUP2", + "gas": 21351, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 841, + "op": "ADD", + "gas": 21348, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 842, + "op": "SWAP1", + "gas": 21345, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 843, + "op": "PUSH2", + "gas": 21342, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 846, + "op": "SWAP2", + "gas": 21339, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 847, + "op": "SWAP1", + "gas": 21336, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 848, + "op": "PUSH2", + "gas": 21333, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 851, + "op": "JUMP", + "gas": 21330, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2665, + "op": "JUMPDEST", + "gas": 21322, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2666, + "op": "PUSH0", + "gas": 21321, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2667, + "op": "DUP3", + "gas": 21319, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2668, + "op": "CALLDATALOAD", + "gas": 21316, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2669, + "op": "PUSH1", + "gas": 21313, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2671, + "op": "PUSH1", + "gas": 21310, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2673, + "op": "SUB", + "gas": 21307, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2674, + "op": "DUP4", + "gas": 21304, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2675, + "op": "CALLDATASIZE", + "gas": 21301, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2676, + "op": "SUB", + "gas": 21299, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2677, + "op": "SUB", + "gas": 21296, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2678, + "op": "DUP2", + "gas": 21293, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2679, + "op": "SLT", + "gas": 21290, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2680, + "op": "PUSH2", + "gas": 21287, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2683, + "op": "JUMPI", + "gas": 21284, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2692, + "op": "JUMPDEST", + "gas": 21274, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2693, + "op": "DUP1", + "gas": 21273, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2694, + "op": "DUP4", + "gas": 21270, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2695, + "op": "ADD", + "gas": 21267, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2696, + "op": "SWAP2", + "gas": 21264, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2697, + "op": "POP", + "gas": 21261, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2698, + "op": "POP", + "gas": 21259, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2699, + "op": "SWAP3", + "gas": 21257, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2700, + "op": "SWAP2", + "gas": 21254, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2701, + "op": "POP", + "gas": 21251, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2702, + "op": "POP", + "gas": 21249, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2703, + "op": "JUMP", + "gas": 21247, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 852, + "op": "JUMPDEST", + "gas": 21239, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 853, + "op": "PUSH2", + "gas": 21238, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 856, + "op": "JUMP", + "gas": 21235, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1027, + "op": "JUMPDEST", + "gas": 21227, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1028, + "op": "PUSH0", + "gas": 21226, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1029, + "op": "DUP2", + "gas": 21224, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1030, + "op": "PUSH0", + "gas": 21221, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1031, + "op": "ADD", + "gas": 21219, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1032, + "op": "PUSH1", + "gas": 21216, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1034, + "op": "DUP2", + "gas": 21213, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1035, + "op": "ADD", + "gas": 21210, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1036, + "op": "SWAP1", + "gas": 21207, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1037, + "op": "PUSH2", + "gas": 21204, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1040, + "op": "SWAP2", + "gas": 21201, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1041, + "op": "SWAP1", + "gas": 21198, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1042, + "op": "PUSH2", + "gas": 21195, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1045, + "op": "JUMP", + "gas": 21192, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2794, + "op": "JUMPDEST", + "gas": 21184, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2795, + "op": "PUSH0", + "gas": 21183, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2796, + "op": "PUSH1", + "gas": 21181, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2798, + "op": "DUP3", + "gas": 21178, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2799, + "op": "DUP5", + "gas": 21175, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2800, + "op": "SUB", + "gas": 21172, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2801, + "op": "SLT", + "gas": 21169, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2802, + "op": "ISZERO", + "gas": 21166, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2803, + "op": "PUSH2", + "gas": 21163, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2806, + "op": "JUMPI", + "gas": 21160, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2815, + "op": "JUMPDEST", + "gas": 21150, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2816, + "op": "PUSH0", + "gas": 21149, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2817, + "op": "PUSH2", + "gas": 21147, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2820, + "op": "DUP5", + "gas": 21144, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2821, + "op": "DUP3", + "gas": 21141, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2822, + "op": "DUP6", + "gas": 21138, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2823, + "op": "ADD", + "gas": 21135, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2824, + "op": "PUSH2", + "gas": 21132, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2827, + "op": "JUMP", + "gas": 21129, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2774, + "op": "JUMPDEST", + "gas": 21121, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2775, + "op": "PUSH0", + "gas": 21120, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2776, + "op": "DUP2", + "gas": 21118, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2777, + "op": "CALLDATALOAD", + "gas": 21115, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2778, + "op": "SWAP1", + "gas": 21112, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2779, + "op": "POP", + "gas": 21109, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2780, + "op": "PUSH2", + "gas": 21107, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2783, + "op": "DUP2", + "gas": 21104, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2784, + "op": "PUSH2", + "gas": 21101, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2787, + "op": "JUMP", + "gas": 21098, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2752, + "op": "JUMPDEST", + "gas": 21090, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2753, + "op": "PUSH2", + "gas": 21089, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2756, + "op": "DUP2", + "gas": 21086, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2757, + "op": "PUSH2", + "gas": 21083, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2760, + "op": "JUMP", + "gas": 21080, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2735, + "op": "JUMPDEST", + "gas": 21072, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2736, + "op": "PUSH0", + "gas": 21071, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2737, + "op": "PUSH2", + "gas": 21069, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2740, + "op": "DUP3", + "gas": 21066, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2741, + "op": "PUSH2", + "gas": 21063, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2744, + "op": "JUMP", + "gas": 21060, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2704, + "op": "JUMPDEST", + "gas": 21052, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2705, + "op": "PUSH0", + "gas": 21051, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2706, + "op": "PUSH20", + "gas": 21049, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2727, + "op": "DUP3", + "gas": 21046, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2728, + "op": "AND", + "gas": 21043, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2729, + "op": "SWAP1", + "gas": 21040, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2730, + "op": "POP", + "gas": 21037, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2731, + "op": "SWAP2", + "gas": 21035, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2732, + "op": "SWAP1", + "gas": 21032, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2733, + "op": "POP", + "gas": 21029, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2734, + "op": "JUMP", + "gas": 21027, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2745, + "op": "JUMPDEST", + "gas": 21019, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2746, + "op": "SWAP1", + "gas": 21018, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2747, + "op": "POP", + "gas": 21015, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2748, + "op": "SWAP2", + "gas": 21013, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2749, + "op": "SWAP1", + "gas": 21010, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2750, + "op": "POP", + "gas": 21007, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2751, + "op": "JUMP", + "gas": 21005, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2761, + "op": "JUMPDEST", + "gas": 20997, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2762, + "op": "DUP2", + "gas": 20996, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2763, + "op": "EQ", + "gas": 20993, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2764, + "op": "PUSH2", + "gas": 20990, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2767, + "op": "JUMPI", + "gas": 20987, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2771, + "op": "JUMPDEST", + "gas": 20977, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2772, + "op": "POP", + "gas": 20976, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2773, + "op": "JUMP", + "gas": 20974, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2788, + "op": "JUMPDEST", + "gas": 20966, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2789, + "op": "SWAP3", + "gas": 20965, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2790, + "op": "SWAP2", + "gas": 20962, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2791, + "op": "POP", + "gas": 20959, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2792, + "op": "POP", + "gas": 20957, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2793, + "op": "JUMP", + "gas": 20955, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2828, + "op": "JUMPDEST", + "gas": 20947, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2829, + "op": "SWAP2", + "gas": 20946, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2830, + "op": "POP", + "gas": 20943, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2831, + "op": "POP", + "gas": 20941, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2832, + "op": "SWAP3", + "gas": 20939, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2833, + "op": "SWAP2", + "gas": 20936, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2834, + "op": "POP", + "gas": 20933, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2835, + "op": "POP", + "gas": 20931, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2836, + "op": "JUMP", + "gas": 20929, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1046, + "op": "JUMPDEST", + "gas": 20921, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1047, + "op": "PUSH20", + "gas": 20920, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1068, + "op": "AND", + "gas": 20917, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1069, + "op": "DUP3", + "gas": 20914, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1070, + "op": "PUSH1", + "gas": 20911, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1072, + "op": "ADD", + "gas": 20908, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1073, + "op": "CALLDATALOAD", + "gas": 20905, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1074, + "op": "DUP4", + "gas": 20902, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1075, + "op": "DUP1", + "gas": 20899, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1076, + "op": "PUSH1", + "gas": 20896, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1078, + "op": "ADD", + "gas": 20893, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1079, + "op": "SWAP1", + "gas": 20890, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1080, + "op": "PUSH2", + "gas": 20887, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1083, + "op": "SWAP2", + "gas": 20884, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1084, + "op": "SWAP1", + "gas": 20881, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1085, + "op": "PUSH2", + "gas": 20878, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1088, + "op": "JUMP", + "gas": 20875, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2837, + "op": "JUMPDEST", + "gas": 20867, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2838, + "op": "PUSH0", + "gas": 20866, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2839, + "op": "DUP1", + "gas": 20864, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2840, + "op": "DUP4", + "gas": 20861, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2841, + "op": "CALLDATALOAD", + "gas": 20858, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2842, + "op": "PUSH1", + "gas": 20855, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2844, + "op": "PUSH1", + "gas": 20852, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2846, + "op": "SUB", + "gas": 20849, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2847, + "op": "DUP5", + "gas": 20846, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2848, + "op": "CALLDATASIZE", + "gas": 20843, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2849, + "op": "SUB", + "gas": 20841, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2850, + "op": "SUB", + "gas": 20838, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2851, + "op": "DUP2", + "gas": 20835, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2852, + "op": "SLT", + "gas": 20832, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2853, + "op": "PUSH2", + "gas": 20829, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2856, + "op": "JUMPI", + "gas": 20826, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2865, + "op": "JUMPDEST", + "gas": 20816, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2866, + "op": "DUP1", + "gas": 20815, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2867, + "op": "DUP5", + "gas": 20812, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2868, + "op": "ADD", + "gas": 20809, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2869, + "op": "SWAP3", + "gas": 20806, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2870, + "op": "POP", + "gas": 20803, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2871, + "op": "DUP3", + "gas": 20801, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2872, + "op": "CALLDATALOAD", + "gas": 20798, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2873, + "op": "SWAP2", + "gas": 20795, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2874, + "op": "POP", + "gas": 20792, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2875, + "op": "PUSH8", + "gas": 20790, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2884, + "op": "DUP3", + "gas": 20787, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2885, + "op": "GT", + "gas": 20784, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2886, + "op": "ISZERO", + "gas": 20781, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2887, + "op": "PUSH2", + "gas": 20778, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2890, + "op": "JUMPI", + "gas": 20775, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2899, + "op": "JUMPDEST", + "gas": 20765, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2900, + "op": "PUSH1", + "gas": 20764, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2902, + "op": "DUP4", + "gas": 20761, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2903, + "op": "ADD", + "gas": 20758, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2904, + "op": "SWAP3", + "gas": 20755, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2905, + "op": "POP", + "gas": 20752, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2906, + "op": "PUSH1", + "gas": 20750, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2908, + "op": "DUP3", + "gas": 20747, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2909, + "op": "MUL", + "gas": 20744, + "gasCost": 5, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2910, + "op": "CALLDATASIZE", + "gas": 20739, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2911, + "op": "SUB", + "gas": 20737, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2912, + "op": "DUP4", + "gas": 20734, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2913, + "op": "SGT", + "gas": 20731, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2914, + "op": "ISZERO", + "gas": 20728, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2915, + "op": "PUSH2", + "gas": 20725, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2918, + "op": "JUMPI", + "gas": 20722, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2927, + "op": "JUMPDEST", + "gas": 20712, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2928, + "op": "POP", + "gas": 20711, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2929, + "op": "SWAP3", + "gas": 20709, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2930, + "op": "POP", + "gas": 20706, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2931, + "op": "SWAP3", + "gas": 20704, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2932, + "op": "SWAP1", + "gas": 20701, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2933, + "op": "POP", + "gas": 20698, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2934, + "op": "JUMP", + "gas": 20696, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1089, + "op": "JUMPDEST", + "gas": 20688, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1090, + "op": "PUSH1", + "gas": 20687, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1092, + "op": "MLOAD", + "gas": 20684, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1093, + "op": "PUSH2", + "gas": 20681, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1096, + "op": "SWAP3", + "gas": 20678, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1097, + "op": "SWAP2", + "gas": 20675, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1098, + "op": "SWAP1", + "gas": 20672, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1099, + "op": "PUSH2", + "gas": 20669, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1102, + "op": "JUMP", + "gas": 20666, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4172, + "op": "JUMPDEST", + "gas": 20658, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4173, + "op": "PUSH0", + "gas": 20657, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4174, + "op": "PUSH2", + "gas": 20655, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4177, + "op": "DUP3", + "gas": 20652, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4178, + "op": "DUP5", + "gas": 20649, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4179, + "op": "DUP7", + "gas": 20646, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4180, + "op": "PUSH2", + "gas": 20643, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4183, + "op": "JUMP", + "gas": 20640, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3158, + "op": "JUMPDEST", + "gas": 20632, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3159, + "op": "PUSH0", + "gas": 20631, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3160, + "op": "PUSH2", + "gas": 20629, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3163, + "op": "DUP4", + "gas": 20626, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3164, + "op": "DUP6", + "gas": 20623, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3165, + "op": "PUSH2", + "gas": 20620, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3168, + "op": "JUMP", + "gas": 20617, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2945, + "op": "JUMPDEST", + "gas": 20609, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2946, + "op": "PUSH0", + "gas": 20608, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2947, + "op": "DUP2", + "gas": 20606, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2948, + "op": "SWAP1", + "gas": 20603, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2949, + "op": "POP", + "gas": 20600, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2950, + "op": "SWAP3", + "gas": 20598, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2951, + "op": "SWAP2", + "gas": 20595, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2952, + "op": "POP", + "gas": 20592, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2953, + "op": "POP", + "gas": 20590, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2954, + "op": "JUMP", + "gas": 20588, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3169, + "op": "JUMPDEST", + "gas": 20580, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3170, + "op": "SWAP4", + "gas": 20579, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3171, + "op": "POP", + "gas": 20576, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3172, + "op": "PUSH2", + "gas": 20574, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3175, + "op": "DUP4", + "gas": 20571, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3176, + "op": "DUP6", + "gas": 20568, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3177, + "op": "DUP5", + "gas": 20565, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3178, + "op": "PUSH2", + "gas": 20562, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3181, + "op": "JUMP", + "gas": 20559, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3144, + "op": "JUMPDEST", + "gas": 20551, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3145, + "op": "DUP3", + "gas": 20550, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3146, + "op": "DUP2", + "gas": 20547, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3147, + "op": "DUP4", + "gas": 20544, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3148, + "op": "CALLDATACOPY", + "gas": 20541, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3149, + "op": "PUSH0", + "gas": 20538, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3150, + "op": "DUP4", + "gas": 20536, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3151, + "op": "DUP4", + "gas": 20533, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3152, + "op": "ADD", + "gas": 20530, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3153, + "op": "MSTORE", + "gas": 20527, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3154, + "op": "POP", + "gas": 20524, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3155, + "op": "POP", + "gas": 20522, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3156, + "op": "POP", + "gas": 20520, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3157, + "op": "JUMP", + "gas": 20518, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3182, + "op": "JUMPDEST", + "gas": 20510, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3183, + "op": "DUP3", + "gas": 20509, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3184, + "op": "DUP5", + "gas": 20506, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3185, + "op": "ADD", + "gas": 20503, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3186, + "op": "SWAP1", + "gas": 20500, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3187, + "op": "POP", + "gas": 20497, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3188, + "op": "SWAP4", + "gas": 20495, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3189, + "op": "SWAP3", + "gas": 20492, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3190, + "op": "POP", + "gas": 20489, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3191, + "op": "POP", + "gas": 20487, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3192, + "op": "POP", + "gas": 20485, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3193, + "op": "JUMP", + "gas": 20483, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4184, + "op": "JUMPDEST", + "gas": 20475, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4185, + "op": "SWAP2", + "gas": 20474, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4186, + "op": "POP", + "gas": 20471, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4187, + "op": "DUP2", + "gas": 20469, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4188, + "op": "SWAP1", + "gas": 20466, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4189, + "op": "POP", + "gas": 20463, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4190, + "op": "SWAP4", + "gas": 20461, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4191, + "op": "SWAP3", + "gas": 20458, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4192, + "op": "POP", + "gas": 20455, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4193, + "op": "POP", + "gas": 20453, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4194, + "op": "POP", + "gas": 20451, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4195, + "op": "JUMP", + "gas": 20449, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1103, + "op": "JUMPDEST", + "gas": 20441, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1104, + "op": "PUSH0", + "gas": 20440, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1105, + "op": "PUSH1", + "gas": 20438, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1107, + "op": "MLOAD", + "gas": 20435, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1108, + "op": "DUP1", + "gas": 20432, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1109, + "op": "DUP4", + "gas": 20429, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1110, + "op": "SUB", + "gas": 20426, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1111, + "op": "DUP2", + "gas": 20423, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1112, + "op": "DUP6", + "gas": 20420, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1113, + "op": "DUP8", + "gas": 20417, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1114, + "op": "GAS", + "gas": 20414, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1115, + "op": "CALL", + "gas": 20412, + "gasCost": 20275, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1116, + "op": "SWAP3", + "gas": 11112, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1117, + "op": "POP", + "gas": 11109, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1118, + "op": "POP", + "gas": 11107, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1119, + "op": "POP", + "gas": 11105, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1120, + "op": "RETURNDATASIZE", + "gas": 11103, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1121, + "op": "DUP1", + "gas": 11101, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1122, + "op": "PUSH0", + "gas": 11098, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1123, + "op": "DUP2", + "gas": 11096, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1124, + "op": "EQ", + "gas": 11093, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1125, + "op": "PUSH2", + "gas": 11090, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1128, + "op": "JUMPI", + "gas": 11087, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1161, + "op": "JUMPDEST", + "gas": 11077, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1162, + "op": "PUSH1", + "gas": 11076, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1164, + "op": "SWAP2", + "gas": 11073, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1165, + "op": "POP", + "gas": 11070, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1166, + "op": "JUMPDEST", + "gas": 11068, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1167, + "op": "POP", + "gas": 11067, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1168, + "op": "POP", + "gas": 11065, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1169, + "op": "SWAP1", + "gas": 11063, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1170, + "op": "POP", + "gas": 11060, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1171, + "op": "DUP1", + "gas": 11058, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1172, + "op": "PUSH2", + "gas": 11055, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1175, + "op": "JUMPI", + "gas": 11052, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1234, + "op": "JUMPDEST", + "gas": 11042, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1235, + "op": "DUP2", + "gas": 11041, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1236, + "op": "PUSH0", + "gas": 11038, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1237, + "op": "ADD", + "gas": 11036, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1238, + "op": "PUSH1", + "gas": 11033, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1240, + "op": "DUP2", + "gas": 11030, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1241, + "op": "ADD", + "gas": 11027, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1242, + "op": "SWAP1", + "gas": 11024, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1243, + "op": "PUSH2", + "gas": 11021, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1246, + "op": "SWAP2", + "gas": 11018, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1247, + "op": "SWAP1", + "gas": 11015, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1248, + "op": "PUSH2", + "gas": 11012, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1251, + "op": "JUMP", + "gas": 11009, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2794, + "op": "JUMPDEST", + "gas": 11001, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2795, + "op": "PUSH0", + "gas": 11000, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2796, + "op": "PUSH1", + "gas": 10998, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2798, + "op": "DUP3", + "gas": 10995, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2799, + "op": "DUP5", + "gas": 10992, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2800, + "op": "SUB", + "gas": 10989, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2801, + "op": "SLT", + "gas": 10986, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2802, + "op": "ISZERO", + "gas": 10983, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2803, + "op": "PUSH2", + "gas": 10980, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2806, + "op": "JUMPI", + "gas": 10977, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2815, + "op": "JUMPDEST", + "gas": 10967, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2816, + "op": "PUSH0", + "gas": 10966, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2817, + "op": "PUSH2", + "gas": 10964, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2820, + "op": "DUP5", + "gas": 10961, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2821, + "op": "DUP3", + "gas": 10958, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2822, + "op": "DUP6", + "gas": 10955, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2823, + "op": "ADD", + "gas": 10952, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2824, + "op": "PUSH2", + "gas": 10949, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2827, + "op": "JUMP", + "gas": 10946, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2774, + "op": "JUMPDEST", + "gas": 10938, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2775, + "op": "PUSH0", + "gas": 10937, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2776, + "op": "DUP2", + "gas": 10935, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2777, + "op": "CALLDATALOAD", + "gas": 10932, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2778, + "op": "SWAP1", + "gas": 10929, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2779, + "op": "POP", + "gas": 10926, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2780, + "op": "PUSH2", + "gas": 10924, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2783, + "op": "DUP2", + "gas": 10921, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2784, + "op": "PUSH2", + "gas": 10918, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2787, + "op": "JUMP", + "gas": 10915, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2752, + "op": "JUMPDEST", + "gas": 10907, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2753, + "op": "PUSH2", + "gas": 10906, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2756, + "op": "DUP2", + "gas": 10903, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2757, + "op": "PUSH2", + "gas": 10900, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2760, + "op": "JUMP", + "gas": 10897, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2735, + "op": "JUMPDEST", + "gas": 10889, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2736, + "op": "PUSH0", + "gas": 10888, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2737, + "op": "PUSH2", + "gas": 10886, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2740, + "op": "DUP3", + "gas": 10883, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2741, + "op": "PUSH2", + "gas": 10880, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2744, + "op": "JUMP", + "gas": 10877, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2704, + "op": "JUMPDEST", + "gas": 10869, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2705, + "op": "PUSH0", + "gas": 10868, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2706, + "op": "PUSH20", + "gas": 10866, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2727, + "op": "DUP3", + "gas": 10863, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2728, + "op": "AND", + "gas": 10860, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2729, + "op": "SWAP1", + "gas": 10857, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2730, + "op": "POP", + "gas": 10854, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2731, + "op": "SWAP2", + "gas": 10852, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2732, + "op": "SWAP1", + "gas": 10849, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2733, + "op": "POP", + "gas": 10846, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2734, + "op": "JUMP", + "gas": 10844, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2745, + "op": "JUMPDEST", + "gas": 10836, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2746, + "op": "SWAP1", + "gas": 10835, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2747, + "op": "POP", + "gas": 10832, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2748, + "op": "SWAP2", + "gas": 10830, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2749, + "op": "SWAP1", + "gas": 10827, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2750, + "op": "POP", + "gas": 10824, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2751, + "op": "JUMP", + "gas": 10822, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2761, + "op": "JUMPDEST", + "gas": 10814, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2762, + "op": "DUP2", + "gas": 10813, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2763, + "op": "EQ", + "gas": 10810, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2764, + "op": "PUSH2", + "gas": 10807, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2767, + "op": "JUMPI", + "gas": 10804, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2771, + "op": "JUMPDEST", + "gas": 10794, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2772, + "op": "POP", + "gas": 10793, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2773, + "op": "JUMP", + "gas": 10791, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2788, + "op": "JUMPDEST", + "gas": 10783, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2789, + "op": "SWAP3", + "gas": 10782, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2790, + "op": "SWAP2", + "gas": 10779, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2791, + "op": "POP", + "gas": 10776, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2792, + "op": "POP", + "gas": 10774, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2793, + "op": "JUMP", + "gas": 10772, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2828, + "op": "JUMPDEST", + "gas": 10764, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2829, + "op": "SWAP2", + "gas": 10763, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2830, + "op": "POP", + "gas": 10760, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2831, + "op": "POP", + "gas": 10758, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2832, + "op": "SWAP3", + "gas": 10756, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2833, + "op": "SWAP2", + "gas": 10753, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2834, + "op": "POP", + "gas": 10750, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2835, + "op": "POP", + "gas": 10748, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2836, + "op": "JUMP", + "gas": 10746, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1252, + "op": "JUMPDEST", + "gas": 10738, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1253, + "op": "PUSH20", + "gas": 10737, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1274, + "op": "AND", + "gas": 10734, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1275, + "op": "CALLER", + "gas": 10731, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1276, + "op": "PUSH20", + "gas": 10729, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1297, + "op": "AND", + "gas": 10726, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1298, + "op": "PUSH32", + "gas": 10723, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1331, + "op": "DUP5", + "gas": 10720, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1332, + "op": "PUSH1", + "gas": 10717, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1334, + "op": "ADD", + "gas": 10714, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1335, + "op": "CALLDATALOAD", + "gas": 10711, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1336, + "op": "DUP6", + "gas": 10708, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1337, + "op": "DUP1", + "gas": 10705, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1338, + "op": "PUSH1", + "gas": 10702, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1340, + "op": "ADD", + "gas": 10699, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1341, + "op": "SWAP1", + "gas": 10696, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1342, + "op": "PUSH2", + "gas": 10693, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1345, + "op": "SWAP2", + "gas": 10690, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1346, + "op": "SWAP1", + "gas": 10687, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1347, + "op": "PUSH2", + "gas": 10684, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1350, + "op": "JUMP", + "gas": 10681, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2837, + "op": "JUMPDEST", + "gas": 10673, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2838, + "op": "PUSH0", + "gas": 10672, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2839, + "op": "DUP1", + "gas": 10670, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2840, + "op": "DUP4", + "gas": 10667, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2841, + "op": "CALLDATALOAD", + "gas": 10664, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2842, + "op": "PUSH1", + "gas": 10661, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2844, + "op": "PUSH1", + "gas": 10658, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2846, + "op": "SUB", + "gas": 10655, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2847, + "op": "DUP5", + "gas": 10652, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2848, + "op": "CALLDATASIZE", + "gas": 10649, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2849, + "op": "SUB", + "gas": 10647, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2850, + "op": "SUB", + "gas": 10644, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2851, + "op": "DUP2", + "gas": 10641, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2852, + "op": "SLT", + "gas": 10638, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2853, + "op": "PUSH2", + "gas": 10635, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2856, + "op": "JUMPI", + "gas": 10632, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2865, + "op": "JUMPDEST", + "gas": 10622, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2866, + "op": "DUP1", + "gas": 10621, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2867, + "op": "DUP5", + "gas": 10618, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2868, + "op": "ADD", + "gas": 10615, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2869, + "op": "SWAP3", + "gas": 10612, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2870, + "op": "POP", + "gas": 10609, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2871, + "op": "DUP3", + "gas": 10607, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2872, + "op": "CALLDATALOAD", + "gas": 10604, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2873, + "op": "SWAP2", + "gas": 10601, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2874, + "op": "POP", + "gas": 10598, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2875, + "op": "PUSH8", + "gas": 10596, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2884, + "op": "DUP3", + "gas": 10593, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2885, + "op": "GT", + "gas": 10590, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2886, + "op": "ISZERO", + "gas": 10587, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2887, + "op": "PUSH2", + "gas": 10584, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2890, + "op": "JUMPI", + "gas": 10581, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2899, + "op": "JUMPDEST", + "gas": 10571, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2900, + "op": "PUSH1", + "gas": 10570, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2902, + "op": "DUP4", + "gas": 10567, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2903, + "op": "ADD", + "gas": 10564, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2904, + "op": "SWAP3", + "gas": 10561, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2905, + "op": "POP", + "gas": 10558, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2906, + "op": "PUSH1", + "gas": 10556, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2908, + "op": "DUP3", + "gas": 10553, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2909, + "op": "MUL", + "gas": 10550, + "gasCost": 5, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2910, + "op": "CALLDATASIZE", + "gas": 10545, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2911, + "op": "SUB", + "gas": 10543, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2912, + "op": "DUP4", + "gas": 10540, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2913, + "op": "SGT", + "gas": 10537, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2914, + "op": "ISZERO", + "gas": 10534, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2915, + "op": "PUSH2", + "gas": 10531, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2918, + "op": "JUMPI", + "gas": 10528, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2927, + "op": "JUMPDEST", + "gas": 10518, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2928, + "op": "POP", + "gas": 10517, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2929, + "op": "SWAP3", + "gas": 10515, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2930, + "op": "POP", + "gas": 10512, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2931, + "op": "SWAP3", + "gas": 10510, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2932, + "op": "SWAP1", + "gas": 10507, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2933, + "op": "POP", + "gas": 10504, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2934, + "op": "JUMP", + "gas": 10502, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1351, + "op": "JUMPDEST", + "gas": 10494, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1352, + "op": "PUSH1", + "gas": 10493, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1354, + "op": "MLOAD", + "gas": 10490, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1355, + "op": "PUSH2", + "gas": 10487, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1358, + "op": "SWAP4", + "gas": 10484, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1359, + "op": "SWAP3", + "gas": 10481, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1360, + "op": "SWAP2", + "gas": 10478, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1361, + "op": "SWAP1", + "gas": 10475, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1362, + "op": "PUSH2", + "gas": 10472, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1365, + "op": "JUMP", + "gas": 10469, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4360, + "op": "JUMPDEST", + "gas": 10461, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4361, + "op": "PUSH0", + "gas": 10460, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4362, + "op": "PUSH1", + "gas": 10458, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4364, + "op": "DUP3", + "gas": 10455, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4365, + "op": "ADD", + "gas": 10452, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4366, + "op": "SWAP1", + "gas": 10449, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4367, + "op": "POP", + "gas": 10446, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4368, + "op": "PUSH2", + "gas": 10444, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4371, + "op": "PUSH0", + "gas": 10441, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4372, + "op": "DUP4", + "gas": 10439, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4373, + "op": "ADD", + "gas": 10436, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4374, + "op": "DUP7", + "gas": 10433, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4375, + "op": "PUSH2", + "gas": 10430, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4378, + "op": "JUMP", + "gas": 10427, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2448, + "op": "JUMPDEST", + "gas": 10419, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2449, + "op": "PUSH2", + "gas": 10418, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2452, + "op": "DUP2", + "gas": 10415, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2453, + "op": "PUSH2", + "gas": 10412, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2456, + "op": "JUMP", + "gas": 10409, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2439, + "op": "JUMPDEST", + "gas": 10401, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2440, + "op": "PUSH0", + "gas": 10400, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2441, + "op": "DUP2", + "gas": 10398, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2442, + "op": "SWAP1", + "gas": 10395, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2443, + "op": "POP", + "gas": 10392, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2444, + "op": "SWAP2", + "gas": 10390, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2445, + "op": "SWAP1", + "gas": 10387, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2446, + "op": "POP", + "gas": 10384, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2447, + "op": "JUMP", + "gas": 10382, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2457, + "op": "JUMPDEST", + "gas": 10374, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2458, + "op": "DUP3", + "gas": 10373, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2459, + "op": "MSTORE", + "gas": 10370, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2460, + "op": "POP", + "gas": 10367, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2461, + "op": "POP", + "gas": 10365, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2462, + "op": "JUMP", + "gas": 10363, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4379, + "op": "JUMPDEST", + "gas": 10355, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4380, + "op": "DUP2", + "gas": 10354, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4381, + "op": "DUP2", + "gas": 10351, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4382, + "op": "SUB", + "gas": 10348, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4383, + "op": "PUSH1", + "gas": 10345, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4385, + "op": "DUP4", + "gas": 10342, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4386, + "op": "ADD", + "gas": 10339, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4387, + "op": "MSTORE", + "gas": 10336, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4388, + "op": "PUSH2", + "gas": 10333, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4391, + "op": "DUP2", + "gas": 10330, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4392, + "op": "DUP5", + "gas": 10327, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4393, + "op": "DUP7", + "gas": 10324, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4394, + "op": "PUSH2", + "gas": 10321, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4397, + "op": "JUMP", + "gas": 10318, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4316, + "op": "JUMPDEST", + "gas": 10310, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4317, + "op": "PUSH0", + "gas": 10309, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4318, + "op": "PUSH2", + "gas": 10307, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4321, + "op": "DUP4", + "gas": 10304, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4322, + "op": "DUP6", + "gas": 10301, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4323, + "op": "PUSH2", + "gas": 10298, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4326, + "op": "JUMP", + "gas": 10295, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4300, + "op": "JUMPDEST", + "gas": 10287, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4301, + "op": "PUSH0", + "gas": 10286, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4302, + "op": "DUP3", + "gas": 10284, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4303, + "op": "DUP3", + "gas": 10281, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4304, + "op": "MSTORE", + "gas": 10278, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4305, + "op": "PUSH1", + "gas": 10275, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4307, + "op": "DUP3", + "gas": 10272, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4308, + "op": "ADD", + "gas": 10269, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4309, + "op": "SWAP1", + "gas": 10266, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4310, + "op": "POP", + "gas": 10263, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4311, + "op": "SWAP3", + "gas": 10261, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4312, + "op": "SWAP2", + "gas": 10258, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4313, + "op": "POP", + "gas": 10255, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4314, + "op": "POP", + "gas": 10253, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4315, + "op": "JUMP", + "gas": 10251, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4327, + "op": "JUMPDEST", + "gas": 10243, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4328, + "op": "SWAP4", + "gas": 10242, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4329, + "op": "POP", + "gas": 10239, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4330, + "op": "PUSH2", + "gas": 10237, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4333, + "op": "DUP4", + "gas": 10234, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4334, + "op": "DUP6", + "gas": 10231, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4335, + "op": "DUP5", + "gas": 10228, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4336, + "op": "PUSH2", + "gas": 10225, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4339, + "op": "JUMP", + "gas": 10222, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3144, + "op": "JUMPDEST", + "gas": 10214, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3145, + "op": "DUP3", + "gas": 10213, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3146, + "op": "DUP2", + "gas": 10210, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3147, + "op": "DUP4", + "gas": 10207, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3148, + "op": "CALLDATACOPY", + "gas": 10204, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3149, + "op": "PUSH0", + "gas": 10201, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3150, + "op": "DUP4", + "gas": 10199, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3151, + "op": "DUP4", + "gas": 10196, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3152, + "op": "ADD", + "gas": 10193, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3153, + "op": "MSTORE", + "gas": 10190, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3154, + "op": "POP", + "gas": 10187, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3155, + "op": "POP", + "gas": 10185, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3156, + "op": "POP", + "gas": 10183, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3157, + "op": "JUMP", + "gas": 10181, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4340, + "op": "JUMPDEST", + "gas": 10173, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4341, + "op": "PUSH2", + "gas": 10172, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4344, + "op": "DUP4", + "gas": 10169, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4345, + "op": "PUSH2", + "gas": 10166, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4348, + "op": "JUMP", + "gas": 10163, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3791, + "op": "JUMPDEST", + "gas": 10155, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3792, + "op": "PUSH0", + "gas": 10154, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3793, + "op": "PUSH1", + "gas": 10152, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3795, + "op": "NOT", + "gas": 10149, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3796, + "op": "PUSH1", + "gas": 10146, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3798, + "op": "DUP4", + "gas": 10143, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3799, + "op": "ADD", + "gas": 10140, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3800, + "op": "AND", + "gas": 10137, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3801, + "op": "SWAP1", + "gas": 10134, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3802, + "op": "POP", + "gas": 10131, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3803, + "op": "SWAP2", + "gas": 10129, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3804, + "op": "SWAP1", + "gas": 10126, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3805, + "op": "POP", + "gas": 10123, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3806, + "op": "JUMP", + "gas": 10121, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4349, + "op": "JUMPDEST", + "gas": 10113, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4350, + "op": "DUP5", + "gas": 10112, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4351, + "op": "ADD", + "gas": 10109, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4352, + "op": "SWAP1", + "gas": 10106, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4353, + "op": "POP", + "gas": 10103, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4354, + "op": "SWAP4", + "gas": 10101, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4355, + "op": "SWAP3", + "gas": 10098, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4356, + "op": "POP", + "gas": 10095, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4357, + "op": "POP", + "gas": 10093, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4358, + "op": "POP", + "gas": 10091, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4359, + "op": "JUMP", + "gas": 10089, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4398, + "op": "JUMPDEST", + "gas": 10081, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4399, + "op": "SWAP1", + "gas": 10080, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4400, + "op": "POP", + "gas": 10077, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4401, + "op": "SWAP5", + "gas": 10075, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4402, + "op": "SWAP4", + "gas": 10072, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4403, + "op": "POP", + "gas": 10069, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4404, + "op": "POP", + "gas": 10067, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4405, + "op": "POP", + "gas": 10065, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4406, + "op": "POP", + "gas": 10063, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4407, + "op": "JUMP", + "gas": 10061, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1366, + "op": "JUMPDEST", + "gas": 10053, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1367, + "op": "PUSH1", + "gas": 10052, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1369, + "op": "MLOAD", + "gas": 10049, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1370, + "op": "DUP1", + "gas": 10046, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1371, + "op": "SWAP2", + "gas": 10043, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1372, + "op": "SUB", + "gas": 10040, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1373, + "op": "SWAP1", + "gas": 10037, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1374, + "op": "LOG3", + "gas": 10034, + "gasCost": 2268, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1375, + "op": "POP", + "gas": 7766, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1376, + "op": "POP", + "gas": 7764, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 1377, + "op": "JUMP", + "gas": 7762, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 857, + "op": "JUMPDEST", + "gas": 7754, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 858, + "op": "DUP1", + "gas": 7753, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 859, + "op": "DUP1", + "gas": 7750, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 860, + "op": "PUSH1", + "gas": 7747, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 862, + "op": "ADD", + "gas": 7744, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 863, + "op": "SWAP2", + "gas": 7741, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 864, + "op": "POP", + "gas": 7738, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 865, + "op": "POP", + "gas": 7736, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 866, + "op": "PUSH2", + "gas": 7734, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 869, + "op": "JUMP", + "gas": 7731, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 801, + "op": "JUMPDEST", + "gas": 7723, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 802, + "op": "DUP4", + "gas": 7722, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 803, + "op": "DUP4", + "gas": 7719, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 804, + "op": "SWAP1", + "gas": 7716, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 805, + "op": "POP", + "gas": 7713, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 806, + "op": "DUP2", + "gas": 7711, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 807, + "op": "LT", + "gas": 7708, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 808, + "op": "ISZERO", + "gas": 7705, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 809, + "op": "PUSH2", + "gas": 7702, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 812, + "op": "JUMPI", + "gas": 7699, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 870, + "op": "JUMPDEST", + "gas": 7689, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 871, + "op": "POP", + "gas": 7688, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 872, + "op": "DUP1", + "gas": 7686, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 873, + "op": "PUSH32", + "gas": 7683, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 906, + "op": "DUP5", + "gas": 7680, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 907, + "op": "DUP5", + "gas": 7677, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 908, + "op": "PUSH1", + "gas": 7674, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 910, + "op": "MLOAD", + "gas": 7671, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 911, + "op": "PUSH2", + "gas": 7668, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 914, + "op": "SWAP3", + "gas": 7665, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 915, + "op": "SWAP2", + "gas": 7662, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 916, + "op": "SWAP1", + "gas": 7659, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 917, + "op": "PUSH2", + "gas": 7656, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 920, + "op": "JUMP", + "gas": 7653, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4138, + "op": "JUMPDEST", + "gas": 7645, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4139, + "op": "PUSH0", + "gas": 7644, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4140, + "op": "PUSH1", + "gas": 7642, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4142, + "op": "DUP3", + "gas": 7639, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4143, + "op": "ADD", + "gas": 7636, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4144, + "op": "SWAP1", + "gas": 7633, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4145, + "op": "POP", + "gas": 7630, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4146, + "op": "DUP2", + "gas": 7628, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4147, + "op": "DUP2", + "gas": 7625, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4148, + "op": "SUB", + "gas": 7622, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4149, + "op": "PUSH0", + "gas": 7619, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4150, + "op": "DUP4", + "gas": 7617, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4151, + "op": "ADD", + "gas": 7614, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4152, + "op": "MSTORE", + "gas": 7611, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4153, + "op": "PUSH2", + "gas": 7608, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4156, + "op": "DUP2", + "gas": 7605, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4157, + "op": "DUP5", + "gas": 7602, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4158, + "op": "DUP7", + "gas": 7599, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4159, + "op": "PUSH2", + "gas": 7596, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4162, + "op": "JUMP", + "gas": 7593, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4024, + "op": "JUMPDEST", + "gas": 7585, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4025, + "op": "PUSH0", + "gas": 7584, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4026, + "op": "PUSH2", + "gas": 7582, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4029, + "op": "DUP4", + "gas": 7579, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4030, + "op": "DUP6", + "gas": 7576, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4031, + "op": "PUSH2", + "gas": 7573, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4034, + "op": "JUMP", + "gas": 7570, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3524, + "op": "JUMPDEST", + "gas": 7562, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3525, + "op": "PUSH0", + "gas": 7561, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3526, + "op": "DUP3", + "gas": 7559, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3527, + "op": "DUP3", + "gas": 7556, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3528, + "op": "MSTORE", + "gas": 7553, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3529, + "op": "PUSH1", + "gas": 7550, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3531, + "op": "DUP3", + "gas": 7547, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3532, + "op": "ADD", + "gas": 7544, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3533, + "op": "SWAP1", + "gas": 7541, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3534, + "op": "POP", + "gas": 7538, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3535, + "op": "SWAP3", + "gas": 7536, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3536, + "op": "SWAP2", + "gas": 7533, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3537, + "op": "POP", + "gas": 7530, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3538, + "op": "POP", + "gas": 7528, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3539, + "op": "JUMP", + "gas": 7526, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4035, + "op": "JUMPDEST", + "gas": 7518, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4036, + "op": "SWAP4", + "gas": 7517, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4037, + "op": "POP", + "gas": 7514, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4038, + "op": "DUP4", + "gas": 7512, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4039, + "op": "PUSH1", + "gas": 7509, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4041, + "op": "DUP5", + "gas": 7506, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4042, + "op": "MUL", + "gas": 7503, + "gasCost": 5, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4043, + "op": "DUP6", + "gas": 7498, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4044, + "op": "ADD", + "gas": 7495, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4045, + "op": "PUSH2", + "gas": 7492, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4048, + "op": "DUP5", + "gas": 7489, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4049, + "op": "PUSH2", + "gas": 7486, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4052, + "op": "JUMP", + "gas": 7483, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3540, + "op": "JUMPDEST", + "gas": 7475, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3541, + "op": "PUSH0", + "gas": 7474, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3542, + "op": "DUP2", + "gas": 7472, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3543, + "op": "SWAP1", + "gas": 7469, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3544, + "op": "POP", + "gas": 7466, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3545, + "op": "SWAP2", + "gas": 7464, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3546, + "op": "SWAP1", + "gas": 7461, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3547, + "op": "POP", + "gas": 7458, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3548, + "op": "JUMP", + "gas": 7456, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4053, + "op": "JUMPDEST", + "gas": 7448, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4054, + "op": "DUP1", + "gas": 7447, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4055, + "op": "PUSH0", + "gas": 7444, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4056, + "op": "JUMPDEST", + "gas": 7442, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4057, + "op": "DUP8", + "gas": 7441, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4058, + "op": "DUP2", + "gas": 7438, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4059, + "op": "LT", + "gas": 7435, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4060, + "op": "ISZERO", + "gas": 7432, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4061, + "op": "PUSH2", + "gas": 7429, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4064, + "op": "JUMPI", + "gas": 7426, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4065, + "op": "DUP5", + "gas": 7416, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4066, + "op": "DUP5", + "gas": 7413, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4067, + "op": "SUB", + "gas": 7410, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4068, + "op": "DUP10", + "gas": 7407, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4069, + "op": "MSTORE", + "gas": 7404, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4070, + "op": "PUSH2", + "gas": 7401, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4073, + "op": "DUP3", + "gas": 7398, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4074, + "op": "DUP5", + "gas": 7395, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4075, + "op": "PUSH2", + "gas": 7392, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4078, + "op": "JUMP", + "gas": 7389, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3973, + "op": "JUMPDEST", + "gas": 7381, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3974, + "op": "PUSH0", + "gas": 7380, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3975, + "op": "DUP3", + "gas": 7378, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3976, + "op": "CALLDATALOAD", + "gas": 7375, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3977, + "op": "PUSH1", + "gas": 7372, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3979, + "op": "PUSH1", + "gas": 7369, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3981, + "op": "SUB", + "gas": 7366, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3982, + "op": "DUP4", + "gas": 7363, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3983, + "op": "CALLDATASIZE", + "gas": 7360, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3984, + "op": "SUB", + "gas": 7358, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3985, + "op": "SUB", + "gas": 7355, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3986, + "op": "DUP2", + "gas": 7352, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3987, + "op": "SLT", + "gas": 7349, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3988, + "op": "PUSH2", + "gas": 7346, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3991, + "op": "JUMPI", + "gas": 7343, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4000, + "op": "JUMPDEST", + "gas": 7333, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4001, + "op": "DUP3", + "gas": 7332, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4002, + "op": "DUP2", + "gas": 7329, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4003, + "op": "ADD", + "gas": 7326, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4004, + "op": "SWAP2", + "gas": 7323, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4005, + "op": "POP", + "gas": 7320, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4006, + "op": "POP", + "gas": 7318, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4007, + "op": "SWAP3", + "gas": 7316, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4008, + "op": "SWAP2", + "gas": 7313, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4009, + "op": "POP", + "gas": 7310, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4010, + "op": "POP", + "gas": 7308, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4011, + "op": "JUMP", + "gas": 7306, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4079, + "op": "JUMPDEST", + "gas": 7298, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4080, + "op": "PUSH2", + "gas": 7297, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4083, + "op": "DUP6", + "gas": 7294, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4084, + "op": "DUP3", + "gas": 7291, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4085, + "op": "PUSH2", + "gas": 7288, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4088, + "op": "JUMP", + "gas": 7285, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3954, + "op": "JUMPDEST", + "gas": 7277, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3955, + "op": "PUSH0", + "gas": 7276, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3956, + "op": "PUSH2", + "gas": 7274, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3959, + "op": "DUP4", + "gas": 7271, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3960, + "op": "DUP4", + "gas": 7268, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3961, + "op": "PUSH2", + "gas": 7265, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3964, + "op": "JUMP", + "gas": 7262, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3851, + "op": "JUMPDEST", + "gas": 7254, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3852, + "op": "PUSH0", + "gas": 7253, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3853, + "op": "PUSH1", + "gas": 7251, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3855, + "op": "DUP4", + "gas": 7248, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3856, + "op": "ADD", + "gas": 7245, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3857, + "op": "PUSH2", + "gas": 7242, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3860, + "op": "PUSH0", + "gas": 7239, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3861, + "op": "DUP5", + "gas": 7237, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3862, + "op": "ADD", + "gas": 7234, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3863, + "op": "DUP5", + "gas": 7231, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3864, + "op": "PUSH2", + "gas": 7228, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3867, + "op": "JUMP", + "gas": 7225, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3549, + "op": "JUMPDEST", + "gas": 7217, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3550, + "op": "PUSH0", + "gas": 7216, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3551, + "op": "PUSH2", + "gas": 7214, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3554, + "op": "PUSH1", + "gas": 7211, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3556, + "op": "DUP5", + "gas": 7208, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3557, + "op": "ADD", + "gas": 7205, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3558, + "op": "DUP5", + "gas": 7202, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3559, + "op": "PUSH2", + "gas": 7199, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3562, + "op": "JUMP", + "gas": 7196, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2774, + "op": "JUMPDEST", + "gas": 7188, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2775, + "op": "PUSH0", + "gas": 7187, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2776, + "op": "DUP2", + "gas": 7185, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2777, + "op": "CALLDATALOAD", + "gas": 7182, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2778, + "op": "SWAP1", + "gas": 7179, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2779, + "op": "POP", + "gas": 7176, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2780, + "op": "PUSH2", + "gas": 7174, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2783, + "op": "DUP2", + "gas": 7171, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2784, + "op": "PUSH2", + "gas": 7168, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2787, + "op": "JUMP", + "gas": 7165, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2752, + "op": "JUMPDEST", + "gas": 7157, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2753, + "op": "PUSH2", + "gas": 7156, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2756, + "op": "DUP2", + "gas": 7153, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2757, + "op": "PUSH2", + "gas": 7150, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2760, + "op": "JUMP", + "gas": 7147, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2735, + "op": "JUMPDEST", + "gas": 7139, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2736, + "op": "PUSH0", + "gas": 7138, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2737, + "op": "PUSH2", + "gas": 7136, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2740, + "op": "DUP3", + "gas": 7133, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2741, + "op": "PUSH2", + "gas": 7130, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2744, + "op": "JUMP", + "gas": 7127, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2704, + "op": "JUMPDEST", + "gas": 7119, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2705, + "op": "PUSH0", + "gas": 7118, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2706, + "op": "PUSH20", + "gas": 7116, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2727, + "op": "DUP3", + "gas": 7113, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2728, + "op": "AND", + "gas": 7110, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2729, + "op": "SWAP1", + "gas": 7107, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2730, + "op": "POP", + "gas": 7104, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2731, + "op": "SWAP2", + "gas": 7102, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2732, + "op": "SWAP1", + "gas": 7099, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2733, + "op": "POP", + "gas": 7096, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2734, + "op": "JUMP", + "gas": 7094, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2745, + "op": "JUMPDEST", + "gas": 7086, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2746, + "op": "SWAP1", + "gas": 7085, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2747, + "op": "POP", + "gas": 7082, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2748, + "op": "SWAP2", + "gas": 7080, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2749, + "op": "SWAP1", + "gas": 7077, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2750, + "op": "POP", + "gas": 7074, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2751, + "op": "JUMP", + "gas": 7072, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2761, + "op": "JUMPDEST", + "gas": 7064, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2762, + "op": "DUP2", + "gas": 7063, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2763, + "op": "EQ", + "gas": 7060, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2764, + "op": "PUSH2", + "gas": 7057, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2767, + "op": "JUMPI", + "gas": 7054, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2771, + "op": "JUMPDEST", + "gas": 7044, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2772, + "op": "POP", + "gas": 7043, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2773, + "op": "JUMP", + "gas": 7041, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2788, + "op": "JUMPDEST", + "gas": 7033, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2789, + "op": "SWAP3", + "gas": 7032, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2790, + "op": "SWAP2", + "gas": 7029, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2791, + "op": "POP", + "gas": 7026, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2792, + "op": "POP", + "gas": 7024, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2793, + "op": "JUMP", + "gas": 7022, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3563, + "op": "JUMPDEST", + "gas": 7014, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3564, + "op": "SWAP1", + "gas": 7013, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3565, + "op": "POP", + "gas": 7010, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3566, + "op": "SWAP3", + "gas": 7008, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3567, + "op": "SWAP2", + "gas": 7005, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3568, + "op": "POP", + "gas": 7002, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3569, + "op": "POP", + "gas": 7000, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3570, + "op": "JUMP", + "gas": 6998, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3868, + "op": "JUMPDEST", + "gas": 6990, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3869, + "op": "PUSH2", + "gas": 6989, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3872, + "op": "PUSH0", + "gas": 6986, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3873, + "op": "DUP7", + "gas": 6984, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3874, + "op": "ADD", + "gas": 6981, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3875, + "op": "DUP3", + "gas": 6978, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3876, + "op": "PUSH2", + "gas": 6975, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3879, + "op": "JUMP", + "gas": 6972, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3571, + "op": "JUMPDEST", + "gas": 6964, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3572, + "op": "PUSH2", + "gas": 6963, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3575, + "op": "DUP2", + "gas": 6960, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3576, + "op": "PUSH2", + "gas": 6957, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3579, + "op": "JUMP", + "gas": 6954, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2735, + "op": "JUMPDEST", + "gas": 6946, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2736, + "op": "PUSH0", + "gas": 6945, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2737, + "op": "PUSH2", + "gas": 6943, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2740, + "op": "DUP3", + "gas": 6940, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2741, + "op": "PUSH2", + "gas": 6937, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2744, + "op": "JUMP", + "gas": 6934, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2704, + "op": "JUMPDEST", + "gas": 6926, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2705, + "op": "PUSH0", + "gas": 6925, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2706, + "op": "PUSH20", + "gas": 6923, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2727, + "op": "DUP3", + "gas": 6920, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2728, + "op": "AND", + "gas": 6917, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2729, + "op": "SWAP1", + "gas": 6914, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2730, + "op": "POP", + "gas": 6911, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2731, + "op": "SWAP2", + "gas": 6909, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2732, + "op": "SWAP1", + "gas": 6906, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2733, + "op": "POP", + "gas": 6903, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2734, + "op": "JUMP", + "gas": 6901, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2745, + "op": "JUMPDEST", + "gas": 6893, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2746, + "op": "SWAP1", + "gas": 6892, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2747, + "op": "POP", + "gas": 6889, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2748, + "op": "SWAP2", + "gas": 6887, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2749, + "op": "SWAP1", + "gas": 6884, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2750, + "op": "POP", + "gas": 6881, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2751, + "op": "JUMP", + "gas": 6879, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3580, + "op": "JUMPDEST", + "gas": 6871, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3581, + "op": "DUP3", + "gas": 6870, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3582, + "op": "MSTORE", + "gas": 6867, + "gasCost": 6, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3583, + "op": "POP", + "gas": 6861, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3584, + "op": "POP", + "gas": 6859, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3585, + "op": "JUMP", + "gas": 6857, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3880, + "op": "JUMPDEST", + "gas": 6849, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3881, + "op": "POP", + "gas": 6848, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3882, + "op": "PUSH2", + "gas": 6846, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3885, + "op": "PUSH1", + "gas": 6843, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3887, + "op": "DUP5", + "gas": 6840, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3888, + "op": "ADD", + "gas": 6837, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3889, + "op": "DUP5", + "gas": 6834, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3890, + "op": "PUSH2", + "gas": 6831, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3893, + "op": "JUMP", + "gas": 6828, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3628, + "op": "JUMPDEST", + "gas": 6820, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3629, + "op": "PUSH0", + "gas": 6819, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3630, + "op": "PUSH2", + "gas": 6817, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3633, + "op": "PUSH1", + "gas": 6814, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3635, + "op": "DUP5", + "gas": 6811, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3636, + "op": "ADD", + "gas": 6808, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3637, + "op": "DUP5", + "gas": 6805, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3638, + "op": "PUSH2", + "gas": 6802, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3641, + "op": "JUMP", + "gas": 6799, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3608, + "op": "JUMPDEST", + "gas": 6791, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3609, + "op": "PUSH0", + "gas": 6790, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3610, + "op": "DUP2", + "gas": 6788, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3611, + "op": "CALLDATALOAD", + "gas": 6785, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3612, + "op": "SWAP1", + "gas": 6782, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3613, + "op": "POP", + "gas": 6779, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3614, + "op": "PUSH2", + "gas": 6777, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3617, + "op": "DUP2", + "gas": 6774, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3618, + "op": "PUSH2", + "gas": 6771, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3621, + "op": "JUMP", + "gas": 6768, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3586, + "op": "JUMPDEST", + "gas": 6760, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3587, + "op": "PUSH2", + "gas": 6759, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3590, + "op": "DUP2", + "gas": 6756, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3591, + "op": "PUSH2", + "gas": 6753, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3594, + "op": "JUMP", + "gas": 6750, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2439, + "op": "JUMPDEST", + "gas": 6742, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2440, + "op": "PUSH0", + "gas": 6741, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2441, + "op": "DUP2", + "gas": 6739, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2442, + "op": "SWAP1", + "gas": 6736, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2443, + "op": "POP", + "gas": 6733, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2444, + "op": "SWAP2", + "gas": 6731, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2445, + "op": "SWAP1", + "gas": 6728, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2446, + "op": "POP", + "gas": 6725, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2447, + "op": "JUMP", + "gas": 6723, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3595, + "op": "JUMPDEST", + "gas": 6715, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3596, + "op": "DUP2", + "gas": 6714, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3597, + "op": "EQ", + "gas": 6711, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3598, + "op": "PUSH2", + "gas": 6708, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3601, + "op": "JUMPI", + "gas": 6705, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3605, + "op": "JUMPDEST", + "gas": 6695, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3606, + "op": "POP", + "gas": 6694, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3607, + "op": "JUMP", + "gas": 6692, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3622, + "op": "JUMPDEST", + "gas": 6684, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3623, + "op": "SWAP3", + "gas": 6683, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3624, + "op": "SWAP2", + "gas": 6680, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3625, + "op": "POP", + "gas": 6677, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3626, + "op": "POP", + "gas": 6675, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3627, + "op": "JUMP", + "gas": 6673, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3642, + "op": "JUMPDEST", + "gas": 6665, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3643, + "op": "SWAP1", + "gas": 6664, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3644, + "op": "POP", + "gas": 6661, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3645, + "op": "SWAP3", + "gas": 6659, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3646, + "op": "SWAP2", + "gas": 6656, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3647, + "op": "POP", + "gas": 6653, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3648, + "op": "POP", + "gas": 6651, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3649, + "op": "JUMP", + "gas": 6649, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3894, + "op": "JUMPDEST", + "gas": 6641, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3895, + "op": "PUSH2", + "gas": 6640, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3898, + "op": "PUSH1", + "gas": 6637, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3900, + "op": "DUP7", + "gas": 6634, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3901, + "op": "ADD", + "gas": 6631, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3902, + "op": "DUP3", + "gas": 6628, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3903, + "op": "PUSH2", + "gas": 6625, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3906, + "op": "JUMP", + "gas": 6622, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3650, + "op": "JUMPDEST", + "gas": 6614, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3651, + "op": "PUSH2", + "gas": 6613, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3654, + "op": "DUP2", + "gas": 6610, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3655, + "op": "PUSH2", + "gas": 6607, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3658, + "op": "JUMP", + "gas": 6604, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2439, + "op": "JUMPDEST", + "gas": 6596, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2440, + "op": "PUSH0", + "gas": 6595, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2441, + "op": "DUP2", + "gas": 6593, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2442, + "op": "SWAP1", + "gas": 6590, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2443, + "op": "POP", + "gas": 6587, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2444, + "op": "SWAP2", + "gas": 6585, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2445, + "op": "SWAP1", + "gas": 6582, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2446, + "op": "POP", + "gas": 6579, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2447, + "op": "JUMP", + "gas": 6577, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3659, + "op": "JUMPDEST", + "gas": 6569, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3660, + "op": "DUP3", + "gas": 6568, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3661, + "op": "MSTORE", + "gas": 6565, + "gasCost": 6, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3662, + "op": "POP", + "gas": 6559, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3663, + "op": "POP", + "gas": 6557, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3664, + "op": "JUMP", + "gas": 6555, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3907, + "op": "JUMPDEST", + "gas": 6547, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3908, + "op": "POP", + "gas": 6546, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3909, + "op": "PUSH2", + "gas": 6544, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3912, + "op": "PUSH1", + "gas": 6541, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3914, + "op": "DUP5", + "gas": 6538, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3915, + "op": "ADD", + "gas": 6535, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3916, + "op": "DUP5", + "gas": 6532, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3917, + "op": "PUSH2", + "gas": 6529, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3920, + "op": "JUMP", + "gas": 6526, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3677, + "op": "JUMPDEST", + "gas": 6518, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3678, + "op": "PUSH0", + "gas": 6517, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3679, + "op": "DUP1", + "gas": 6515, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3680, + "op": "DUP4", + "gas": 6512, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3681, + "op": "CALLDATALOAD", + "gas": 6509, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3682, + "op": "PUSH1", + "gas": 6506, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3684, + "op": "PUSH1", + "gas": 6503, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3686, + "op": "SUB", + "gas": 6500, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3687, + "op": "DUP5", + "gas": 6497, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3688, + "op": "CALLDATASIZE", + "gas": 6494, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3689, + "op": "SUB", + "gas": 6492, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3690, + "op": "SUB", + "gas": 6489, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3691, + "op": "DUP2", + "gas": 6486, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3692, + "op": "SLT", + "gas": 6483, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3693, + "op": "PUSH2", + "gas": 6480, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3696, + "op": "JUMPI", + "gas": 6477, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3705, + "op": "JUMPDEST", + "gas": 6467, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3706, + "op": "DUP4", + "gas": 6466, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3707, + "op": "DUP2", + "gas": 6463, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3708, + "op": "ADD", + "gas": 6460, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3709, + "op": "SWAP3", + "gas": 6457, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3710, + "op": "POP", + "gas": 6454, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3711, + "op": "DUP3", + "gas": 6452, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3712, + "op": "CALLDATALOAD", + "gas": 6449, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3713, + "op": "SWAP2", + "gas": 6446, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3714, + "op": "POP", + "gas": 6443, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3715, + "op": "PUSH1", + "gas": 6441, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3717, + "op": "DUP4", + "gas": 6438, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3718, + "op": "ADD", + "gas": 6435, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3719, + "op": "SWAP3", + "gas": 6432, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3720, + "op": "POP", + "gas": 6429, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3721, + "op": "PUSH8", + "gas": 6427, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3730, + "op": "DUP3", + "gas": 6424, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3731, + "op": "GT", + "gas": 6421, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3732, + "op": "ISZERO", + "gas": 6418, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3733, + "op": "PUSH2", + "gas": 6415, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3736, + "op": "JUMPI", + "gas": 6412, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3745, + "op": "JUMPDEST", + "gas": 6402, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3746, + "op": "PUSH1", + "gas": 6401, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3748, + "op": "DUP3", + "gas": 6398, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3749, + "op": "MUL", + "gas": 6395, + "gasCost": 5, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3750, + "op": "CALLDATASIZE", + "gas": 6390, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3751, + "op": "SUB", + "gas": 6388, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3752, + "op": "DUP4", + "gas": 6385, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3753, + "op": "SGT", + "gas": 6382, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3754, + "op": "ISZERO", + "gas": 6379, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3755, + "op": "PUSH2", + "gas": 6376, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3758, + "op": "JUMPI", + "gas": 6373, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3767, + "op": "JUMPDEST", + "gas": 6363, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3768, + "op": "POP", + "gas": 6362, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3769, + "op": "SWAP3", + "gas": 6360, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3770, + "op": "POP", + "gas": 6357, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3771, + "op": "SWAP3", + "gas": 6355, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3772, + "op": "SWAP1", + "gas": 6352, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3773, + "op": "POP", + "gas": 6349, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3774, + "op": "JUMP", + "gas": 6347, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3921, + "op": "JUMPDEST", + "gas": 6339, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3922, + "op": "DUP6", + "gas": 6338, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3923, + "op": "DUP4", + "gas": 6335, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3924, + "op": "SUB", + "gas": 6332, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3925, + "op": "PUSH1", + "gas": 6329, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3927, + "op": "DUP8", + "gas": 6326, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3928, + "op": "ADD", + "gas": 6323, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3929, + "op": "MSTORE", + "gas": 6320, + "gasCost": 6, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3930, + "op": "PUSH2", + "gas": 6314, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3933, + "op": "DUP4", + "gas": 6311, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3934, + "op": "DUP3", + "gas": 6308, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3935, + "op": "DUP5", + "gas": 6305, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3936, + "op": "PUSH2", + "gas": 6302, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3939, + "op": "JUMP", + "gas": 6299, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3807, + "op": "JUMPDEST", + "gas": 6291, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3808, + "op": "PUSH0", + "gas": 6290, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3809, + "op": "PUSH2", + "gas": 6288, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3812, + "op": "DUP4", + "gas": 6285, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3813, + "op": "DUP6", + "gas": 6282, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3814, + "op": "PUSH2", + "gas": 6279, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3817, + "op": "JUMP", + "gas": 6276, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3775, + "op": "JUMPDEST", + "gas": 6268, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3776, + "op": "PUSH0", + "gas": 6267, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3777, + "op": "DUP3", + "gas": 6265, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3778, + "op": "DUP3", + "gas": 6262, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3779, + "op": "MSTORE", + "gas": 6259, + "gasCost": 6, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3780, + "op": "PUSH1", + "gas": 6253, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3782, + "op": "DUP3", + "gas": 6250, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3783, + "op": "ADD", + "gas": 6247, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3784, + "op": "SWAP1", + "gas": 6244, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3785, + "op": "POP", + "gas": 6241, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3786, + "op": "SWAP3", + "gas": 6239, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3787, + "op": "SWAP2", + "gas": 6236, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3788, + "op": "POP", + "gas": 6233, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3789, + "op": "POP", + "gas": 6231, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3790, + "op": "JUMP", + "gas": 6229, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3818, + "op": "JUMPDEST", + "gas": 6221, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3819, + "op": "SWAP4", + "gas": 6220, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3820, + "op": "POP", + "gas": 6217, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3821, + "op": "PUSH2", + "gas": 6215, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3824, + "op": "DUP4", + "gas": 6212, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3825, + "op": "DUP6", + "gas": 6209, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3826, + "op": "DUP5", + "gas": 6206, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3827, + "op": "PUSH2", + "gas": 6203, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3830, + "op": "JUMP", + "gas": 6200, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3144, + "op": "JUMPDEST", + "gas": 6192, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3145, + "op": "DUP3", + "gas": 6191, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3146, + "op": "DUP2", + "gas": 6188, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3147, + "op": "DUP4", + "gas": 6185, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3148, + "op": "CALLDATACOPY", + "gas": 6182, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3149, + "op": "PUSH0", + "gas": 6179, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3150, + "op": "DUP4", + "gas": 6177, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3151, + "op": "DUP4", + "gas": 6174, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3152, + "op": "ADD", + "gas": 6171, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3153, + "op": "MSTORE", + "gas": 6168, + "gasCost": 6, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3154, + "op": "POP", + "gas": 6162, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3155, + "op": "POP", + "gas": 6160, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3156, + "op": "POP", + "gas": 6158, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3157, + "op": "JUMP", + "gas": 6156, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3831, + "op": "JUMPDEST", + "gas": 6148, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3832, + "op": "PUSH2", + "gas": 6147, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3835, + "op": "DUP4", + "gas": 6144, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3836, + "op": "PUSH2", + "gas": 6141, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3839, + "op": "JUMP", + "gas": 6138, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3791, + "op": "JUMPDEST", + "gas": 6130, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3792, + "op": "PUSH0", + "gas": 6129, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3793, + "op": "PUSH1", + "gas": 6127, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3795, + "op": "NOT", + "gas": 6124, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3796, + "op": "PUSH1", + "gas": 6121, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3798, + "op": "DUP4", + "gas": 6118, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3799, + "op": "ADD", + "gas": 6115, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3800, + "op": "AND", + "gas": 6112, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3801, + "op": "SWAP1", + "gas": 6109, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3802, + "op": "POP", + "gas": 6106, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3803, + "op": "SWAP2", + "gas": 6104, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3804, + "op": "SWAP1", + "gas": 6101, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3805, + "op": "POP", + "gas": 6098, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3806, + "op": "JUMP", + "gas": 6096, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3840, + "op": "JUMPDEST", + "gas": 6088, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3841, + "op": "DUP5", + "gas": 6087, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3842, + "op": "ADD", + "gas": 6084, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3843, + "op": "SWAP1", + "gas": 6081, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3844, + "op": "POP", + "gas": 6078, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3845, + "op": "SWAP4", + "gas": 6076, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3846, + "op": "SWAP3", + "gas": 6073, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3847, + "op": "POP", + "gas": 6070, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3848, + "op": "POP", + "gas": 6068, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3849, + "op": "POP", + "gas": 6066, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3850, + "op": "JUMP", + "gas": 6064, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3940, + "op": "JUMPDEST", + "gas": 6056, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3941, + "op": "SWAP3", + "gas": 6055, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3942, + "op": "POP", + "gas": 6052, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3943, + "op": "POP", + "gas": 6050, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3944, + "op": "POP", + "gas": 6048, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3945, + "op": "DUP1", + "gas": 6046, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3946, + "op": "SWAP2", + "gas": 6043, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3947, + "op": "POP", + "gas": 6040, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3948, + "op": "POP", + "gas": 6038, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3949, + "op": "SWAP3", + "gas": 6036, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3950, + "op": "SWAP2", + "gas": 6033, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3951, + "op": "POP", + "gas": 6030, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3952, + "op": "POP", + "gas": 6028, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3953, + "op": "JUMP", + "gas": 6026, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3965, + "op": "JUMPDEST", + "gas": 6018, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3966, + "op": "SWAP1", + "gas": 6017, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3967, + "op": "POP", + "gas": 6014, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3968, + "op": "SWAP3", + "gas": 6012, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3969, + "op": "SWAP2", + "gas": 6009, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3970, + "op": "POP", + "gas": 6006, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3971, + "op": "POP", + "gas": 6004, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3972, + "op": "JUMP", + "gas": 6002, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4089, + "op": "JUMPDEST", + "gas": 5994, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4090, + "op": "SWAP5", + "gas": 5993, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4091, + "op": "POP", + "gas": 5990, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4092, + "op": "PUSH2", + "gas": 5988, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4095, + "op": "DUP4", + "gas": 5985, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4096, + "op": "PUSH2", + "gas": 5982, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4099, + "op": "JUMP", + "gas": 5979, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4012, + "op": "JUMPDEST", + "gas": 5971, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4013, + "op": "PUSH0", + "gas": 5970, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4014, + "op": "PUSH1", + "gas": 5968, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4016, + "op": "DUP3", + "gas": 5965, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4017, + "op": "ADD", + "gas": 5962, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4018, + "op": "SWAP1", + "gas": 5959, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4019, + "op": "POP", + "gas": 5956, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4020, + "op": "SWAP2", + "gas": 5954, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4021, + "op": "SWAP1", + "gas": 5951, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4022, + "op": "POP", + "gas": 5948, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4023, + "op": "JUMP", + "gas": 5946, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4100, + "op": "JUMPDEST", + "gas": 5938, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4101, + "op": "SWAP3", + "gas": 5937, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4102, + "op": "POP", + "gas": 5934, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4103, + "op": "PUSH1", + "gas": 5932, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4105, + "op": "DUP11", + "gas": 5929, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4106, + "op": "ADD", + "gas": 5926, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4107, + "op": "SWAP10", + "gas": 5923, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4108, + "op": "POP", + "gas": 5920, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4109, + "op": "POP", + "gas": 5918, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4110, + "op": "PUSH1", + "gas": 5916, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4112, + "op": "DUP2", + "gas": 5913, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4113, + "op": "ADD", + "gas": 5910, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4114, + "op": "SWAP1", + "gas": 5907, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4115, + "op": "POP", + "gas": 5904, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4116, + "op": "PUSH2", + "gas": 5902, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4119, + "op": "JUMP", + "gas": 5899, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4056, + "op": "JUMPDEST", + "gas": 5891, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4057, + "op": "DUP8", + "gas": 5890, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4058, + "op": "DUP2", + "gas": 5887, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4059, + "op": "LT", + "gas": 5884, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4060, + "op": "ISZERO", + "gas": 5881, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4061, + "op": "PUSH2", + "gas": 5878, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4064, + "op": "JUMPI", + "gas": 5875, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4065, + "op": "DUP5", + "gas": 5865, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4066, + "op": "DUP5", + "gas": 5862, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4067, + "op": "SUB", + "gas": 5859, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4068, + "op": "DUP10", + "gas": 5856, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4069, + "op": "MSTORE", + "gas": 5853, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4070, + "op": "PUSH2", + "gas": 5850, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4073, + "op": "DUP3", + "gas": 5847, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4074, + "op": "DUP5", + "gas": 5844, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4075, + "op": "PUSH2", + "gas": 5841, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4078, + "op": "JUMP", + "gas": 5838, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3973, + "op": "JUMPDEST", + "gas": 5830, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3974, + "op": "PUSH0", + "gas": 5829, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3975, + "op": "DUP3", + "gas": 5827, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3976, + "op": "CALLDATALOAD", + "gas": 5824, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3977, + "op": "PUSH1", + "gas": 5821, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3979, + "op": "PUSH1", + "gas": 5818, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3981, + "op": "SUB", + "gas": 5815, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3982, + "op": "DUP4", + "gas": 5812, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3983, + "op": "CALLDATASIZE", + "gas": 5809, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3984, + "op": "SUB", + "gas": 5807, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3985, + "op": "SUB", + "gas": 5804, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3986, + "op": "DUP2", + "gas": 5801, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3987, + "op": "SLT", + "gas": 5798, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3988, + "op": "PUSH2", + "gas": 5795, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3991, + "op": "JUMPI", + "gas": 5792, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4000, + "op": "JUMPDEST", + "gas": 5782, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4001, + "op": "DUP3", + "gas": 5781, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4002, + "op": "DUP2", + "gas": 5778, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4003, + "op": "ADD", + "gas": 5775, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4004, + "op": "SWAP2", + "gas": 5772, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4005, + "op": "POP", + "gas": 5769, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4006, + "op": "POP", + "gas": 5767, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4007, + "op": "SWAP3", + "gas": 5765, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4008, + "op": "SWAP2", + "gas": 5762, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4009, + "op": "POP", + "gas": 5759, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4010, + "op": "POP", + "gas": 5757, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4011, + "op": "JUMP", + "gas": 5755, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4079, + "op": "JUMPDEST", + "gas": 5747, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4080, + "op": "PUSH2", + "gas": 5746, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4083, + "op": "DUP6", + "gas": 5743, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4084, + "op": "DUP3", + "gas": 5740, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4085, + "op": "PUSH2", + "gas": 5737, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4088, + "op": "JUMP", + "gas": 5734, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3954, + "op": "JUMPDEST", + "gas": 5726, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3955, + "op": "PUSH0", + "gas": 5725, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3956, + "op": "PUSH2", + "gas": 5723, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3959, + "op": "DUP4", + "gas": 5720, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3960, + "op": "DUP4", + "gas": 5717, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3961, + "op": "PUSH2", + "gas": 5714, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3964, + "op": "JUMP", + "gas": 5711, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3851, + "op": "JUMPDEST", + "gas": 5703, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3852, + "op": "PUSH0", + "gas": 5702, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3853, + "op": "PUSH1", + "gas": 5700, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3855, + "op": "DUP4", + "gas": 5697, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3856, + "op": "ADD", + "gas": 5694, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3857, + "op": "PUSH2", + "gas": 5691, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3860, + "op": "PUSH0", + "gas": 5688, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3861, + "op": "DUP5", + "gas": 5686, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3862, + "op": "ADD", + "gas": 5683, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3863, + "op": "DUP5", + "gas": 5680, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3864, + "op": "PUSH2", + "gas": 5677, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3867, + "op": "JUMP", + "gas": 5674, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3549, + "op": "JUMPDEST", + "gas": 5666, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3550, + "op": "PUSH0", + "gas": 5665, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3551, + "op": "PUSH2", + "gas": 5663, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3554, + "op": "PUSH1", + "gas": 5660, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3556, + "op": "DUP5", + "gas": 5657, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3557, + "op": "ADD", + "gas": 5654, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3558, + "op": "DUP5", + "gas": 5651, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3559, + "op": "PUSH2", + "gas": 5648, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3562, + "op": "JUMP", + "gas": 5645, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2774, + "op": "JUMPDEST", + "gas": 5637, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2775, + "op": "PUSH0", + "gas": 5636, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2776, + "op": "DUP2", + "gas": 5634, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2777, + "op": "CALLDATALOAD", + "gas": 5631, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2778, + "op": "SWAP1", + "gas": 5628, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2779, + "op": "POP", + "gas": 5625, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2780, + "op": "PUSH2", + "gas": 5623, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2783, + "op": "DUP2", + "gas": 5620, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2784, + "op": "PUSH2", + "gas": 5617, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2787, + "op": "JUMP", + "gas": 5614, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2752, + "op": "JUMPDEST", + "gas": 5606, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2753, + "op": "PUSH2", + "gas": 5605, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2756, + "op": "DUP2", + "gas": 5602, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2757, + "op": "PUSH2", + "gas": 5599, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2760, + "op": "JUMP", + "gas": 5596, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2735, + "op": "JUMPDEST", + "gas": 5588, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2736, + "op": "PUSH0", + "gas": 5587, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2737, + "op": "PUSH2", + "gas": 5585, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2740, + "op": "DUP3", + "gas": 5582, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2741, + "op": "PUSH2", + "gas": 5579, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2744, + "op": "JUMP", + "gas": 5576, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2704, + "op": "JUMPDEST", + "gas": 5568, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2705, + "op": "PUSH0", + "gas": 5567, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2706, + "op": "PUSH20", + "gas": 5565, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2727, + "op": "DUP3", + "gas": 5562, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2728, + "op": "AND", + "gas": 5559, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2729, + "op": "SWAP1", + "gas": 5556, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2730, + "op": "POP", + "gas": 5553, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2731, + "op": "SWAP2", + "gas": 5551, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2732, + "op": "SWAP1", + "gas": 5548, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2733, + "op": "POP", + "gas": 5545, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2734, + "op": "JUMP", + "gas": 5543, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2745, + "op": "JUMPDEST", + "gas": 5535, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2746, + "op": "SWAP1", + "gas": 5534, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2747, + "op": "POP", + "gas": 5531, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2748, + "op": "SWAP2", + "gas": 5529, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2749, + "op": "SWAP1", + "gas": 5526, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2750, + "op": "POP", + "gas": 5523, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2751, + "op": "JUMP", + "gas": 5521, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2761, + "op": "JUMPDEST", + "gas": 5513, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2762, + "op": "DUP2", + "gas": 5512, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2763, + "op": "EQ", + "gas": 5509, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2764, + "op": "PUSH2", + "gas": 5506, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2767, + "op": "JUMPI", + "gas": 5503, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2771, + "op": "JUMPDEST", + "gas": 5493, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2772, + "op": "POP", + "gas": 5492, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2773, + "op": "JUMP", + "gas": 5490, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2788, + "op": "JUMPDEST", + "gas": 5482, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2789, + "op": "SWAP3", + "gas": 5481, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2790, + "op": "SWAP2", + "gas": 5478, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2791, + "op": "POP", + "gas": 5475, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2792, + "op": "POP", + "gas": 5473, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2793, + "op": "JUMP", + "gas": 5471, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3563, + "op": "JUMPDEST", + "gas": 5463, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3564, + "op": "SWAP1", + "gas": 5462, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3565, + "op": "POP", + "gas": 5459, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3566, + "op": "SWAP3", + "gas": 5457, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3567, + "op": "SWAP2", + "gas": 5454, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3568, + "op": "POP", + "gas": 5451, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3569, + "op": "POP", + "gas": 5449, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3570, + "op": "JUMP", + "gas": 5447, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3868, + "op": "JUMPDEST", + "gas": 5439, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3869, + "op": "PUSH2", + "gas": 5438, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3872, + "op": "PUSH0", + "gas": 5435, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3873, + "op": "DUP7", + "gas": 5433, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3874, + "op": "ADD", + "gas": 5430, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3875, + "op": "DUP3", + "gas": 5427, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3876, + "op": "PUSH2", + "gas": 5424, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3879, + "op": "JUMP", + "gas": 5421, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3571, + "op": "JUMPDEST", + "gas": 5413, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3572, + "op": "PUSH2", + "gas": 5412, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3575, + "op": "DUP2", + "gas": 5409, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3576, + "op": "PUSH2", + "gas": 5406, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3579, + "op": "JUMP", + "gas": 5403, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2735, + "op": "JUMPDEST", + "gas": 5395, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2736, + "op": "PUSH0", + "gas": 5394, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2737, + "op": "PUSH2", + "gas": 5392, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2740, + "op": "DUP3", + "gas": 5389, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2741, + "op": "PUSH2", + "gas": 5386, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2744, + "op": "JUMP", + "gas": 5383, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2704, + "op": "JUMPDEST", + "gas": 5375, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2705, + "op": "PUSH0", + "gas": 5374, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2706, + "op": "PUSH20", + "gas": 5372, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2727, + "op": "DUP3", + "gas": 5369, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2728, + "op": "AND", + "gas": 5366, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2729, + "op": "SWAP1", + "gas": 5363, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2730, + "op": "POP", + "gas": 5360, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2731, + "op": "SWAP2", + "gas": 5358, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2732, + "op": "SWAP1", + "gas": 5355, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2733, + "op": "POP", + "gas": 5352, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2734, + "op": "JUMP", + "gas": 5350, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2745, + "op": "JUMPDEST", + "gas": 5342, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2746, + "op": "SWAP1", + "gas": 5341, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2747, + "op": "POP", + "gas": 5338, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2748, + "op": "SWAP2", + "gas": 5336, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2749, + "op": "SWAP1", + "gas": 5333, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2750, + "op": "POP", + "gas": 5330, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2751, + "op": "JUMP", + "gas": 5328, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3580, + "op": "JUMPDEST", + "gas": 5320, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3581, + "op": "DUP3", + "gas": 5319, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3582, + "op": "MSTORE", + "gas": 5316, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3583, + "op": "POP", + "gas": 5313, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3584, + "op": "POP", + "gas": 5311, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3585, + "op": "JUMP", + "gas": 5309, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3880, + "op": "JUMPDEST", + "gas": 5301, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3881, + "op": "POP", + "gas": 5300, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3882, + "op": "PUSH2", + "gas": 5298, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3885, + "op": "PUSH1", + "gas": 5295, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3887, + "op": "DUP5", + "gas": 5292, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3888, + "op": "ADD", + "gas": 5289, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3889, + "op": "DUP5", + "gas": 5286, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3890, + "op": "PUSH2", + "gas": 5283, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3893, + "op": "JUMP", + "gas": 5280, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3628, + "op": "JUMPDEST", + "gas": 5272, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3629, + "op": "PUSH0", + "gas": 5271, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3630, + "op": "PUSH2", + "gas": 5269, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3633, + "op": "PUSH1", + "gas": 5266, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3635, + "op": "DUP5", + "gas": 5263, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3636, + "op": "ADD", + "gas": 5260, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3637, + "op": "DUP5", + "gas": 5257, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3638, + "op": "PUSH2", + "gas": 5254, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3641, + "op": "JUMP", + "gas": 5251, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3608, + "op": "JUMPDEST", + "gas": 5243, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3609, + "op": "PUSH0", + "gas": 5242, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3610, + "op": "DUP2", + "gas": 5240, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3611, + "op": "CALLDATALOAD", + "gas": 5237, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3612, + "op": "SWAP1", + "gas": 5234, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3613, + "op": "POP", + "gas": 5231, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3614, + "op": "PUSH2", + "gas": 5229, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3617, + "op": "DUP2", + "gas": 5226, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3618, + "op": "PUSH2", + "gas": 5223, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3621, + "op": "JUMP", + "gas": 5220, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3586, + "op": "JUMPDEST", + "gas": 5212, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3587, + "op": "PUSH2", + "gas": 5211, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3590, + "op": "DUP2", + "gas": 5208, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3591, + "op": "PUSH2", + "gas": 5205, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3594, + "op": "JUMP", + "gas": 5202, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2439, + "op": "JUMPDEST", + "gas": 5194, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2440, + "op": "PUSH0", + "gas": 5193, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2441, + "op": "DUP2", + "gas": 5191, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2442, + "op": "SWAP1", + "gas": 5188, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2443, + "op": "POP", + "gas": 5185, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2444, + "op": "SWAP2", + "gas": 5183, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2445, + "op": "SWAP1", + "gas": 5180, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2446, + "op": "POP", + "gas": 5177, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2447, + "op": "JUMP", + "gas": 5175, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3595, + "op": "JUMPDEST", + "gas": 5167, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3596, + "op": "DUP2", + "gas": 5166, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3597, + "op": "EQ", + "gas": 5163, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3598, + "op": "PUSH2", + "gas": 5160, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3601, + "op": "JUMPI", + "gas": 5157, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3605, + "op": "JUMPDEST", + "gas": 5147, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3606, + "op": "POP", + "gas": 5146, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3607, + "op": "JUMP", + "gas": 5144, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3622, + "op": "JUMPDEST", + "gas": 5136, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3623, + "op": "SWAP3", + "gas": 5135, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3624, + "op": "SWAP2", + "gas": 5132, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3625, + "op": "POP", + "gas": 5129, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3626, + "op": "POP", + "gas": 5127, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3627, + "op": "JUMP", + "gas": 5125, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3642, + "op": "JUMPDEST", + "gas": 5117, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3643, + "op": "SWAP1", + "gas": 5116, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3644, + "op": "POP", + "gas": 5113, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3645, + "op": "SWAP3", + "gas": 5111, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3646, + "op": "SWAP2", + "gas": 5108, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3647, + "op": "POP", + "gas": 5105, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3648, + "op": "POP", + "gas": 5103, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3649, + "op": "JUMP", + "gas": 5101, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3894, + "op": "JUMPDEST", + "gas": 5093, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3895, + "op": "PUSH2", + "gas": 5092, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3898, + "op": "PUSH1", + "gas": 5089, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3900, + "op": "DUP7", + "gas": 5086, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3901, + "op": "ADD", + "gas": 5083, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3902, + "op": "DUP3", + "gas": 5080, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3903, + "op": "PUSH2", + "gas": 5077, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3906, + "op": "JUMP", + "gas": 5074, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3650, + "op": "JUMPDEST", + "gas": 5066, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3651, + "op": "PUSH2", + "gas": 5065, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3654, + "op": "DUP2", + "gas": 5062, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3655, + "op": "PUSH2", + "gas": 5059, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3658, + "op": "JUMP", + "gas": 5056, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2439, + "op": "JUMPDEST", + "gas": 5048, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2440, + "op": "PUSH0", + "gas": 5047, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2441, + "op": "DUP2", + "gas": 5045, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2442, + "op": "SWAP1", + "gas": 5042, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2443, + "op": "POP", + "gas": 5039, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2444, + "op": "SWAP2", + "gas": 5037, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2445, + "op": "SWAP1", + "gas": 5034, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2446, + "op": "POP", + "gas": 5031, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 2447, + "op": "JUMP", + "gas": 5029, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3659, + "op": "JUMPDEST", + "gas": 5021, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3660, + "op": "DUP3", + "gas": 5020, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3661, + "op": "MSTORE", + "gas": 5017, + "gasCost": 6, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3662, + "op": "POP", + "gas": 5011, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3663, + "op": "POP", + "gas": 5009, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3664, + "op": "JUMP", + "gas": 5007, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3907, + "op": "JUMPDEST", + "gas": 4999, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3908, + "op": "POP", + "gas": 4998, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3909, + "op": "PUSH2", + "gas": 4996, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3912, + "op": "PUSH1", + "gas": 4993, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3914, + "op": "DUP5", + "gas": 4990, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3915, + "op": "ADD", + "gas": 4987, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3916, + "op": "DUP5", + "gas": 4984, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3917, + "op": "PUSH2", + "gas": 4981, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3920, + "op": "JUMP", + "gas": 4978, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3677, + "op": "JUMPDEST", + "gas": 4970, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3678, + "op": "PUSH0", + "gas": 4969, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3679, + "op": "DUP1", + "gas": 4967, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3680, + "op": "DUP4", + "gas": 4964, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3681, + "op": "CALLDATALOAD", + "gas": 4961, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3682, + "op": "PUSH1", + "gas": 4958, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3684, + "op": "PUSH1", + "gas": 4955, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3686, + "op": "SUB", + "gas": 4952, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3687, + "op": "DUP5", + "gas": 4949, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3688, + "op": "CALLDATASIZE", + "gas": 4946, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3689, + "op": "SUB", + "gas": 4944, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3690, + "op": "SUB", + "gas": 4941, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3691, + "op": "DUP2", + "gas": 4938, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3692, + "op": "SLT", + "gas": 4935, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3693, + "op": "PUSH2", + "gas": 4932, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3696, + "op": "JUMPI", + "gas": 4929, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3705, + "op": "JUMPDEST", + "gas": 4919, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3706, + "op": "DUP4", + "gas": 4918, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3707, + "op": "DUP2", + "gas": 4915, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3708, + "op": "ADD", + "gas": 4912, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3709, + "op": "SWAP3", + "gas": 4909, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3710, + "op": "POP", + "gas": 4906, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3711, + "op": "DUP3", + "gas": 4904, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3712, + "op": "CALLDATALOAD", + "gas": 4901, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3713, + "op": "SWAP2", + "gas": 4898, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3714, + "op": "POP", + "gas": 4895, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3715, + "op": "PUSH1", + "gas": 4893, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3717, + "op": "DUP4", + "gas": 4890, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3718, + "op": "ADD", + "gas": 4887, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3719, + "op": "SWAP3", + "gas": 4884, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3720, + "op": "POP", + "gas": 4881, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3721, + "op": "PUSH8", + "gas": 4879, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3730, + "op": "DUP3", + "gas": 4876, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3731, + "op": "GT", + "gas": 4873, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3732, + "op": "ISZERO", + "gas": 4870, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3733, + "op": "PUSH2", + "gas": 4867, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3736, + "op": "JUMPI", + "gas": 4864, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3745, + "op": "JUMPDEST", + "gas": 4854, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3746, + "op": "PUSH1", + "gas": 4853, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3748, + "op": "DUP3", + "gas": 4850, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3749, + "op": "MUL", + "gas": 4847, + "gasCost": 5, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3750, + "op": "CALLDATASIZE", + "gas": 4842, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3751, + "op": "SUB", + "gas": 4840, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3752, + "op": "DUP4", + "gas": 4837, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3753, + "op": "SGT", + "gas": 4834, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3754, + "op": "ISZERO", + "gas": 4831, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3755, + "op": "PUSH2", + "gas": 4828, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3758, + "op": "JUMPI", + "gas": 4825, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3767, + "op": "JUMPDEST", + "gas": 4815, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3768, + "op": "POP", + "gas": 4814, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3769, + "op": "SWAP3", + "gas": 4812, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3770, + "op": "POP", + "gas": 4809, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3771, + "op": "SWAP3", + "gas": 4807, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3772, + "op": "SWAP1", + "gas": 4804, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3773, + "op": "POP", + "gas": 4801, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3774, + "op": "JUMP", + "gas": 4799, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3921, + "op": "JUMPDEST", + "gas": 4791, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3922, + "op": "DUP6", + "gas": 4790, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3923, + "op": "DUP4", + "gas": 4787, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3924, + "op": "SUB", + "gas": 4784, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3925, + "op": "PUSH1", + "gas": 4781, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3927, + "op": "DUP8", + "gas": 4778, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3928, + "op": "ADD", + "gas": 4775, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3929, + "op": "MSTORE", + "gas": 4772, + "gasCost": 6, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3930, + "op": "PUSH2", + "gas": 4766, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3933, + "op": "DUP4", + "gas": 4763, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3934, + "op": "DUP3", + "gas": 4760, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3935, + "op": "DUP5", + "gas": 4757, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3936, + "op": "PUSH2", + "gas": 4754, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3939, + "op": "JUMP", + "gas": 4751, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3807, + "op": "JUMPDEST", + "gas": 4743, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3808, + "op": "PUSH0", + "gas": 4742, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3809, + "op": "PUSH2", + "gas": 4740, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3812, + "op": "DUP4", + "gas": 4737, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3813, + "op": "DUP6", + "gas": 4734, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3814, + "op": "PUSH2", + "gas": 4731, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3817, + "op": "JUMP", + "gas": 4728, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3775, + "op": "JUMPDEST", + "gas": 4720, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3776, + "op": "PUSH0", + "gas": 4719, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3777, + "op": "DUP3", + "gas": 4717, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3778, + "op": "DUP3", + "gas": 4714, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3779, + "op": "MSTORE", + "gas": 4711, + "gasCost": 6, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3780, + "op": "PUSH1", + "gas": 4705, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3782, + "op": "DUP3", + "gas": 4702, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3783, + "op": "ADD", + "gas": 4699, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3784, + "op": "SWAP1", + "gas": 4696, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3785, + "op": "POP", + "gas": 4693, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3786, + "op": "SWAP3", + "gas": 4691, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3787, + "op": "SWAP2", + "gas": 4688, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3788, + "op": "POP", + "gas": 4685, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3789, + "op": "POP", + "gas": 4683, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3790, + "op": "JUMP", + "gas": 4681, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3818, + "op": "JUMPDEST", + "gas": 4673, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3819, + "op": "SWAP4", + "gas": 4672, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3820, + "op": "POP", + "gas": 4669, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3821, + "op": "PUSH2", + "gas": 4667, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3824, + "op": "DUP4", + "gas": 4664, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3825, + "op": "DUP6", + "gas": 4661, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3826, + "op": "DUP5", + "gas": 4658, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3827, + "op": "PUSH2", + "gas": 4655, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3830, + "op": "JUMP", + "gas": 4652, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3144, + "op": "JUMPDEST", + "gas": 4644, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3145, + "op": "DUP3", + "gas": 4643, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3146, + "op": "DUP2", + "gas": 4640, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3147, + "op": "DUP4", + "gas": 4637, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3148, + "op": "CALLDATACOPY", + "gas": 4634, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3149, + "op": "PUSH0", + "gas": 4631, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3150, + "op": "DUP4", + "gas": 4629, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3151, + "op": "DUP4", + "gas": 4626, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3152, + "op": "ADD", + "gas": 4623, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3153, + "op": "MSTORE", + "gas": 4620, + "gasCost": 6, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3154, + "op": "POP", + "gas": 4614, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3155, + "op": "POP", + "gas": 4612, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3156, + "op": "POP", + "gas": 4610, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3157, + "op": "JUMP", + "gas": 4608, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3831, + "op": "JUMPDEST", + "gas": 4600, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3832, + "op": "PUSH2", + "gas": 4599, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3835, + "op": "DUP4", + "gas": 4596, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3836, + "op": "PUSH2", + "gas": 4593, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3839, + "op": "JUMP", + "gas": 4590, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3791, + "op": "JUMPDEST", + "gas": 4582, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3792, + "op": "PUSH0", + "gas": 4581, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3793, + "op": "PUSH1", + "gas": 4579, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3795, + "op": "NOT", + "gas": 4576, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3796, + "op": "PUSH1", + "gas": 4573, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3798, + "op": "DUP4", + "gas": 4570, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3799, + "op": "ADD", + "gas": 4567, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3800, + "op": "AND", + "gas": 4564, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3801, + "op": "SWAP1", + "gas": 4561, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3802, + "op": "POP", + "gas": 4558, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3803, + "op": "SWAP2", + "gas": 4556, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3804, + "op": "SWAP1", + "gas": 4553, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3805, + "op": "POP", + "gas": 4550, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3806, + "op": "JUMP", + "gas": 4548, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3840, + "op": "JUMPDEST", + "gas": 4540, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3841, + "op": "DUP5", + "gas": 4539, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3842, + "op": "ADD", + "gas": 4536, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3843, + "op": "SWAP1", + "gas": 4533, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3844, + "op": "POP", + "gas": 4530, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3845, + "op": "SWAP4", + "gas": 4528, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3846, + "op": "SWAP3", + "gas": 4525, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3847, + "op": "POP", + "gas": 4522, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3848, + "op": "POP", + "gas": 4520, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3849, + "op": "POP", + "gas": 4518, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3850, + "op": "JUMP", + "gas": 4516, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3940, + "op": "JUMPDEST", + "gas": 4508, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3941, + "op": "SWAP3", + "gas": 4507, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3942, + "op": "POP", + "gas": 4504, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3943, + "op": "POP", + "gas": 4502, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3944, + "op": "POP", + "gas": 4500, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3945, + "op": "DUP1", + "gas": 4498, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3946, + "op": "SWAP2", + "gas": 4495, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3947, + "op": "POP", + "gas": 4492, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3948, + "op": "POP", + "gas": 4490, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3949, + "op": "SWAP3", + "gas": 4488, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3950, + "op": "SWAP2", + "gas": 4485, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3951, + "op": "POP", + "gas": 4482, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3952, + "op": "POP", + "gas": 4480, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3953, + "op": "JUMP", + "gas": 4478, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3965, + "op": "JUMPDEST", + "gas": 4470, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3966, + "op": "SWAP1", + "gas": 4469, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3967, + "op": "POP", + "gas": 4466, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3968, + "op": "SWAP3", + "gas": 4464, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3969, + "op": "SWAP2", + "gas": 4461, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3970, + "op": "POP", + "gas": 4458, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3971, + "op": "POP", + "gas": 4456, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 3972, + "op": "JUMP", + "gas": 4454, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4089, + "op": "JUMPDEST", + "gas": 4446, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4090, + "op": "SWAP5", + "gas": 4445, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4091, + "op": "POP", + "gas": 4442, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4092, + "op": "PUSH2", + "gas": 4440, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4095, + "op": "DUP4", + "gas": 4437, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4096, + "op": "PUSH2", + "gas": 4434, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4099, + "op": "JUMP", + "gas": 4431, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4012, + "op": "JUMPDEST", + "gas": 4423, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4013, + "op": "PUSH0", + "gas": 4422, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4014, + "op": "PUSH1", + "gas": 4420, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4016, + "op": "DUP3", + "gas": 4417, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4017, + "op": "ADD", + "gas": 4414, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4018, + "op": "SWAP1", + "gas": 4411, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4019, + "op": "POP", + "gas": 4408, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4020, + "op": "SWAP2", + "gas": 4406, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4021, + "op": "SWAP1", + "gas": 4403, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4022, + "op": "POP", + "gas": 4400, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4023, + "op": "JUMP", + "gas": 4398, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4100, + "op": "JUMPDEST", + "gas": 4390, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4101, + "op": "SWAP3", + "gas": 4389, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4102, + "op": "POP", + "gas": 4386, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4103, + "op": "PUSH1", + "gas": 4384, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4105, + "op": "DUP11", + "gas": 4381, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4106, + "op": "ADD", + "gas": 4378, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4107, + "op": "SWAP10", + "gas": 4375, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4108, + "op": "POP", + "gas": 4372, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4109, + "op": "POP", + "gas": 4370, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4110, + "op": "PUSH1", + "gas": 4368, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4112, + "op": "DUP2", + "gas": 4365, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4113, + "op": "ADD", + "gas": 4362, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4114, + "op": "SWAP1", + "gas": 4359, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4115, + "op": "POP", + "gas": 4356, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4116, + "op": "PUSH2", + "gas": 4354, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4119, + "op": "JUMP", + "gas": 4351, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4056, + "op": "JUMPDEST", + "gas": 4343, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4057, + "op": "DUP8", + "gas": 4342, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4058, + "op": "DUP2", + "gas": 4339, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4059, + "op": "LT", + "gas": 4336, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4060, + "op": "ISZERO", + "gas": 4333, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4061, + "op": "PUSH2", + "gas": 4330, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4064, + "op": "JUMPI", + "gas": 4327, + "gasCost": 10, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4120, + "op": "JUMPDEST", + "gas": 4317, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4121, + "op": "POP", + "gas": 4316, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4122, + "op": "DUP3", + "gas": 4314, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4123, + "op": "SWAP8", + "gas": 4311, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4124, + "op": "POP", + "gas": 4308, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4125, + "op": "DUP8", + "gas": 4306, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4126, + "op": "SWAP5", + "gas": 4303, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4127, + "op": "POP", + "gas": 4300, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4128, + "op": "POP", + "gas": 4298, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4129, + "op": "POP", + "gas": 4296, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4130, + "op": "POP", + "gas": 4294, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4131, + "op": "POP", + "gas": 4292, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4132, + "op": "SWAP4", + "gas": 4290, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4133, + "op": "SWAP3", + "gas": 4287, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4134, + "op": "POP", + "gas": 4284, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4135, + "op": "POP", + "gas": 4282, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4136, + "op": "POP", + "gas": 4280, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4137, + "op": "JUMP", + "gas": 4278, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4163, + "op": "JUMPDEST", + "gas": 4270, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4164, + "op": "SWAP1", + "gas": 4269, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4165, + "op": "POP", + "gas": 4266, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4166, + "op": "SWAP4", + "gas": 4264, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4167, + "op": "SWAP3", + "gas": 4261, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4168, + "op": "POP", + "gas": 4258, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4169, + "op": "POP", + "gas": 4256, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4170, + "op": "POP", + "gas": 4254, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 4171, + "op": "JUMP", + "gas": 4252, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 921, + "op": "JUMPDEST", + "gas": 4244, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 922, + "op": "PUSH1", + "gas": 4243, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 924, + "op": "MLOAD", + "gas": 4240, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 925, + "op": "DUP1", + "gas": 4237, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 926, + "op": "SWAP2", + "gas": 4234, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 927, + "op": "SUB", + "gas": 4231, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 928, + "op": "SWAP1", + "gas": 4228, + "gasCost": 3, + "depth": 1, + "refund": 12500 + }, + { + "pc": 929, + "op": "LOG2", + "gas": 4225, + "gasCost": 4197, + "depth": 1, + "refund": 12500 + }, + { + "pc": 930, + "op": "POP", + "gas": 28, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 931, + "op": "POP", + "gas": 26, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 932, + "op": "POP", + "gas": 24, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 933, + "op": "JUMP", + "gas": 22, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 282, + "op": "JUMPDEST", + "gas": 14, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 283, + "op": "POP", + "gas": 13, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 284, + "op": "POP", + "gas": 11, + "gasCost": 2, + "depth": 1, + "refund": 12500 + }, + { + "pc": 285, + "op": "JUMP", + "gas": 9, + "gasCost": 8, + "depth": 1, + "refund": 12500 + }, + { + "pc": 90, + "op": "JUMPDEST", + "gas": 1, + "gasCost": 1, + "depth": 1, + "refund": 12500 + }, + { + "pc": 91, + "op": "STOP", + "gas": 0, + "gasCost": 0, + "depth": 1, + "refund": 12500 + } + ], + "callTrace": { + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "gas": "0x19e31", + "gasUsed": "0x16d5d", + "to": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "input": "0x3f707e6b00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000038d7ea4c680000000000000000000000000000000000000000000000000000000000000000060000000000000000000000000000000000000000000000000000000000000000000000000000000000000000070997970c51812dc3a010c7d01b50e0d17dc79c800000000000000000000000000000000000000000000000000071afd498d000000000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000", + "calls": [ + { + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "gas": "0x5f9f", + "gasUsed": "0x0", + "to": "0x0000000000000000000000000000000000000000", + "input": "0x", + "value": "0x38d7ea4c68000", + "type": "CALL" + }, + { + "from": "0xf39fd6e51aad88f6f4ce6ab8827279cfffb92266", + "gas": "0x2adf", + "gasUsed": "0x0", + "to": "0x70997970c51812dc3a010c7d01b50e0d17dc79c8", + "input": "0x", + "value": "0x71afd498d0000", + "type": "CALL" + } + ], + "value": "0x0", + "type": "CALL" + } + } + ], + "withdraw_trie_root": "0x27ae5ba08d7291c96c8cbddcc148bf48a6d68c7974b94356f53754ef6171d757", + "sequencer_set_verify_hash": "0x5586abb0fb477a7951e0a249f28ee3ab81a9892d89b7bf54a887a924da4e93f0", + "startL1QueueIndex": 4 + } + ] +] \ No newline at end of file diff --git a/prover/tests/algebra/host/build.rs b/prover/tests/algebra/host/build.rs deleted file mode 100644 index 5b62505c7..000000000 --- a/prover/tests/algebra/host/build.rs +++ /dev/null @@ -1,12 +0,0 @@ -use sp1_helper::{build_program_with_args, BuildArgs}; - -fn main() { - build_program_with_args( - "../client", - BuildArgs { - ignore_rust_version: true, - output_directory: "tests/algebra/client/elf".to_string(), - ..Default::default() - }, - ) -} diff --git a/prover/tests/bls12381/host/build.rs b/prover/tests/bls12381/host/build.rs deleted file mode 100644 index a68444b99..000000000 --- a/prover/tests/bls12381/host/build.rs +++ /dev/null @@ -1,12 +0,0 @@ -use sp1_helper::{build_program_with_args, BuildArgs}; - -fn main() { - build_program_with_args( - "../client", - BuildArgs { - ignore_rust_version: true, - output_directory: "tests/bls12381/client/elf".to_string(), - ..Default::default() - }, - ) -} diff --git a/prover/tests/keccak256/host/build.rs b/prover/tests/keccak256/host/build.rs deleted file mode 100644 index 370dce295..000000000 --- a/prover/tests/keccak256/host/build.rs +++ /dev/null @@ -1,12 +0,0 @@ -use sp1_helper::{build_program_with_args, BuildArgs}; - -fn main() { - build_program_with_args( - "../client", - BuildArgs { - ignore_rust_version: true, - output_directory: "tests/keccak256/client/elf".to_string(), - ..Default::default() - }, - ) -} diff --git a/prover/tests/zstd/host/build.rs b/prover/tests/zstd/host/build.rs deleted file mode 100644 index d0a9bbbd4..000000000 --- a/prover/tests/zstd/host/build.rs +++ /dev/null @@ -1,12 +0,0 @@ -use sp1_helper::{build_program_with_args, BuildArgs}; - -fn main() { - build_program_with_args( - "../client", - BuildArgs { - ignore_rust_version: true, - output_directory: "tests/zstd/client/elf".to_string(), - ..Default::default() - }, - ) -} diff --git a/token-price-oracle/Dockerfile b/token-price-oracle/Dockerfile new file mode 100644 index 000000000..eeb2d7c71 --- /dev/null +++ b/token-price-oracle/Dockerfile @@ -0,0 +1,42 @@ +# Build stage +FROM golang:1.21-alpine AS builder + +# Install build dependencies +RUN apk add --no-cache git make gcc musl-dev + +WORKDIR /app + +# Copy dependency files +COPY go.mod go.sum ./ +RUN go mod download + +# Copy source code +COPY . . + +# Build binary +RUN make build + +# Runtime stage +FROM alpine:latest + +# Install ca-certificates for HTTPS requests +RUN apk --no-cache add ca-certificates + +WORKDIR /root/ + +# Copy binary from build stage +COPY --from=builder /app/build/bin/token-price-oracle . + +# Create log directory +RUN mkdir -p /data/logs/token-price-oracle + +# Expose metrics port +EXPOSE 6060 + +# Health check endpoint +HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ + CMD wget --no-verbose --tries=1 --spider http://localhost:6060/metrics || exit 1 + +# Run service +ENTRYPOINT ["./token-price-oracle"] + diff --git a/token-price-oracle/Makefile b/token-price-oracle/Makefile new file mode 100644 index 000000000..0e4e5b9f9 --- /dev/null +++ b/token-price-oracle/Makefile @@ -0,0 +1,44 @@ +.PHONY: all build test lint clean run docker-build help + +# Default target +all: build + +GITCOMMIT := $(shell git rev-parse HEAD) +GITDATE := $(shell git show -s --format='%ct') +VERSION := v0.1.0 + +LDFLAGSSTRING +=-X main.GitCommit=$(GITCOMMIT) +LDFLAGSSTRING +=-X main.GitDate=$(GITDATE) +LDFLAGSSTRING +=-X main.GitVersion=$(VERSION) +LDFLAGS := -ldflags "$(LDFLAGSSTRING)" + +build: + if [ ! -d build/bin ]; then mkdir -p build/bin; fi + go mod download + env GO111MODULE=on CGO_ENABLED=1 CGO_LDFLAGS="-ldl" go build -o build/bin/token-price-oracle -v $(LDFLAGS) ./cmd +run: build + ./build/bin/token-price-oracle + +test: + go test -v ./... + +lint: + golangci-lint run ./... + +clean: + rm -rf build/ + +docker-build: + docker build -t morph/token-price-oracle:latest . + +help: + @echo "Available targets:" + @echo " all (default) - Build the token-price-oracle binary" + @echo " build - Build the token-price-oracle binary" + @echo " run - Build and run the service" + @echo " test - Run tests" + @echo " lint - Run linter" + @echo " clean - Clean build artifacts" + @echo " docker-build - Build Docker image" + @echo " help - Show this help message" + diff --git a/token-price-oracle/README.md b/token-price-oracle/README.md new file mode 100644 index 000000000..0fa987961 --- /dev/null +++ b/token-price-oracle/README.md @@ -0,0 +1,190 @@ +# Token Price Oracle + +Token Price Oracle service monitors token prices and updates the price ratio between tokens and ETH to L2 on-chain contracts, enabling Alt Fee Token functionality. + +## Features + +- **Real-time Price Monitoring**: Fetches token USD prices from exchange APIs (Bitget) +- **Price Ratio Calculation**: Computes price ratio between tokens and ETH +- **Threshold-based Updates**: Only updates on-chain when price change exceeds threshold, saving Gas +- **Batch Updates**: Updates multiple token prices in a single `batchUpdatePrices` transaction +- **Fallback Mechanism**: Supports automatic switching between multiple data sources +- **Transaction Management**: Prevents nonce conflicts, supports local and external signing +- **Prometheus Monitoring**: Provides operational metrics + +## Quick Start + +### Environment Variables (Local Signing Mode) + +```bash +# Required +export TOKEN_PRICE_ORACLE_L2_ETH_RPC="https://rpc.morphl2.io" +export TOKEN_PRICE_ORACLE_PRIVATE_KEY="0x..." # Required for local signing only +export TOKEN_PRICE_ORACLE_BITGET_API_BASE_URL="https://api.bitget.com" +export TOKEN_PRICE_ORACLE_TOKEN_MAPPING_BITGET="1:BTCUSDT,2:ETHUSDT" + +# Optional +export TOKEN_PRICE_ORACLE_PRICE_UPDATE_INTERVAL="1m" +export TOKEN_PRICE_ORACLE_PRICE_THRESHOLD="100" # 1% (100 bps) +export TOKEN_PRICE_ORACLE_METRICS_SERVER_ENABLE="true" +export TOKEN_PRICE_ORACLE_METRICS_PORT="6060" +export TOKEN_PRICE_ORACLE_LOG_LEVEL="info" +``` + +> **Note**: `PRIVATE_KEY` is only required when using local signing mode. For production, use [External Signing](#external-signing-recommended-for-production) instead. + +### Build and Run + +```bash +# Build +make build + +# Run +./build/bin/token-price-oracle + +# Or use Docker +make docker-build +docker run -d \ + -e TOKEN_PRICE_ORACLE_L2_ETH_RPC="..." \ + -e TOKEN_PRICE_ORACLE_PRIVATE_KEY="..." \ + -e TOKEN_PRICE_ORACLE_BITGET_API_BASE_URL="..." \ + -e TOKEN_PRICE_ORACLE_TOKEN_MAPPING_BITGET="..." \ + morph/token-price-oracle:latest +``` + +## Configuration + +### Required (All Modes) + +| Environment Variable | Description | +|---------------------|-------------| +| `TOKEN_PRICE_ORACLE_L2_ETH_RPC` | L2 node RPC endpoint | +| `TOKEN_PRICE_ORACLE_BITGET_API_BASE_URL` | Bitget API base URL | +| `TOKEN_PRICE_ORACLE_TOKEN_MAPPING_BITGET` | TokenID to trading pair mapping | + +### Required (Local Signing Mode Only) + +| Environment Variable | Description | +|---------------------|-------------| +| `TOKEN_PRICE_ORACLE_PRIVATE_KEY` | Signing private key (not needed if using external signing) | + +### Optional + +| Environment Variable | Default | Description | +|---------------------|---------|-------------| +| `TOKEN_PRICE_ORACLE_PRICE_UPDATE_INTERVAL` | `1m` | Price update interval | +| `TOKEN_PRICE_ORACLE_PRICE_THRESHOLD` | `100` | Update threshold (basis points, 100=1%) | +| `TOKEN_PRICE_ORACLE_PRICE_FEED_PRIORITY` | `bitget` | Price feed priority | +| `TOKEN_PRICE_ORACLE_METRICS_SERVER_ENABLE` | `false` | Enable metrics server | +| `TOKEN_PRICE_ORACLE_METRICS_HOSTNAME` | `0.0.0.0` | Metrics server hostname | +| `TOKEN_PRICE_ORACLE_METRICS_PORT` | `6060` | Metrics server port | +| `TOKEN_PRICE_ORACLE_LOG_LEVEL` | `info` | Log level | +| `TOKEN_PRICE_ORACLE_LOG_FILENAME` | - | Log file path | + +### External Signing (Recommended for Production) + +| Environment Variable | Description | +|---------------------|-------------| +| `TOKEN_PRICE_ORACLE_EXTERNAL_SIGN` | Enable external signing (`true`/`false`) | +| `TOKEN_PRICE_ORACLE_EXTERNAL_SIGN_ADDRESS` | Signing account address | +| `TOKEN_PRICE_ORACLE_EXTERNAL_SIGN_APPID` | External signing service AppID | +| `TOKEN_PRICE_ORACLE_EXTERNAL_SIGN_CHAIN` | Chain identifier | +| `TOKEN_PRICE_ORACLE_EXTERNAL_SIGN_URL` | External signing service URL | +| `TOKEN_PRICE_ORACLE_EXTERNAL_SIGN_RSA_PRIV` | RSA private key (PEM format) | + +## Price Calculation + +### Price Ratio Formula + +``` +priceRatio = tokenScale × tokenPriceUSD × 10^(18 - tokenDecimals) / ethPriceUSD +``` + +### Threshold + +Threshold is specified in basis points (bps): +- 1 bps = 0.01% +- 100 bps = 1% +- 10000 bps = 100% + +On-chain prices are only updated when price change exceeds the threshold, avoiding unnecessary Gas costs. + +## Monitoring + +### Prometheus Metrics + +When metrics server is enabled, access `http://:/metrics`: + +| Metric | Type | Description | +|--------|------|-------------| +| `last_successful_update_timestamp` | Gauge | Last successful update timestamp | +| `updates_total{type="updated"}` | Counter | Actual update count | +| `updates_total{type="skipped"}` | Counter | Skipped update count | +| `update_errors_total{type="price"}` | Counter | Update error count | +| `account_balance_eth` | Gauge | Oracle account balance | + +### Health Check + +```bash +curl http://:/health +``` + +### Suggested Alert Rules + +```yaml +# Price not updated for a long time +- alert: TokenPriceOracleStalled + expr: time() - last_successful_update_timestamp > 300 + for: 1m + labels: + severity: critical + +# Low account balance +- alert: TokenPriceOracleLowBalance + expr: account_balance_eth < 0.1 + for: 5m + labels: + severity: warning +``` + +## Project Structure + +``` +token-price-oracle/ +├── cmd/ # Entry point +├── flags/ # CLI flags definition +├── config/ # Configuration loading +├── client/ # Client wrappers +│ ├── l2_client.go # L2 chain client +│ ├── price_feed.go # Price feed interface +│ ├── bitget_sdk.go # Bitget API client +│ └── sign.go # External signing +├── updater/ # Update logic +│ ├── token_price.go # Price updater +│ ├── tx_manager.go # Transaction manager +│ └── factory.go # Factory methods +├── metrics/ # Prometheus metrics +└── README.md # This document +``` + +## Development + +```bash +# Run tests +make test + +# Test Bitget price feed (requires network) +go test ./client -run TestBitgetPriceFeed -v + +# Format code +go fmt ./... + +# Local run +cp env.example .env +# Edit .env configuration +source .env && make run +``` + +## License + +MIT diff --git a/token-price-oracle/client/bitget_sdk.go b/token-price-oracle/client/bitget_sdk.go new file mode 100644 index 000000000..1f92f33ab --- /dev/null +++ b/token-price-oracle/client/bitget_sdk.go @@ -0,0 +1,296 @@ +package client + +import ( + "context" + "encoding/json" + "fmt" + "io" + "math/big" + "net/http" + "strconv" + "strings" + "sync" + "time" + + "github.com/morph-l2/go-ethereum/log" +) + +const ( + bitgetTickerPath = "/api/v2/spot/market/tickers" + + // StablecoinPrefix is used to mark stablecoins with fixed USD price + // Format: "$1.0" means the token is pegged to $1.0 USD + StablecoinPrefix = "$" +) + +// BitgetSDKPriceFeed uses Bitget REST API to fetch prices +// This type is safe for concurrent use by multiple goroutines +type BitgetSDKPriceFeed struct { + httpClient *http.Client + mu sync.RWMutex // protects tokenMap and ethPrice + tokenMap map[uint16]string // guarded by mu + ethPrice *big.Float // guarded by mu + log log.Logger + baseURL string +} + +// BitgetV2Response represents Bitget V2 API response +type BitgetV2Response struct { + Code string `json:"code"` + Msg string `json:"msg"` + RequestTime int64 `json:"requestTime"` + Data []BitgetV2Ticker `json:"data"` +} + +// BitgetV2Ticker represents V2 ticker data +type BitgetV2Ticker struct { + Symbol string `json:"symbol"` + LastPr string `json:"lastPr"` + High24h string `json:"high24h"` + Low24h string `json:"low24h"` + Change24h string `json:"change24h"` + BaseVolume string `json:"baseVolume"` + QuoteVolume string `json:"quoteVolume"` +} + +// NewBitgetSDKPriceFeed creates a new Bitget price feed using REST API +func NewBitgetSDKPriceFeed(tokenMap map[uint16]string, baseURL string) *BitgetSDKPriceFeed { + return &BitgetSDKPriceFeed{ + httpClient: &http.Client{ + Timeout: 10 * time.Second, + }, + tokenMap: tokenMap, + ethPrice: big.NewFloat(0), + log: log.New("component", "bitget_price_feed"), + baseURL: baseURL, + } +} + +// GetTokenPrice returns token price in USD +// Note: Caller should ensure ETH price is updated via GetBatchTokenPrices for batch operations +// +// Stablecoin handling: +// - If the symbol starts with "$" (e.g., "$1.0"), it's treated as a stablecoin with fixed price +// - Example: "3:$1.0" means token ID 3 is a stablecoin pegged to $1.0 USD +func (b *BitgetSDKPriceFeed) GetTokenPrice(ctx context.Context, tokenID uint16) (*TokenPrice, error) { + b.mu.RLock() + symbol, exists := b.tokenMap[tokenID] + ethPrice := new(big.Float).Copy(b.ethPrice) + b.mu.RUnlock() + + if !exists { + return nil, fmt.Errorf("token ID %d not mapped to trading pair", tokenID) + } + + // Use cached ETH price (should be updated by GetBatchTokenPrices) + if ethPrice.Cmp(big.NewFloat(0)) == 0 { + return nil, fmt.Errorf("ETH price not initialized, please call GetBatchTokenPrices first") + } + + var tokenPrice *big.Float + + // Check if this is a stablecoin with fixed price (e.g., "$1.0") + if strings.HasPrefix(symbol, StablecoinPrefix) { + priceStr := strings.TrimPrefix(symbol, StablecoinPrefix) + fixedPrice, err := strconv.ParseFloat(priceStr, 64) + if err != nil { + return nil, fmt.Errorf("invalid stablecoin price format '%s': %w", symbol, err) + } + if fixedPrice <= 0 { + return nil, fmt.Errorf("stablecoin price must be positive, got '%s'", symbol) + } + tokenPrice = big.NewFloat(fixedPrice) + + b.log.Info("Using fixed stablecoin price", + "source", "stablecoin", + "token_id", tokenID, + "symbol", symbol, + "token_price_usd", tokenPrice.String(), + "eth_price_usd", ethPrice.String()) + } else { + // Fetch token price from exchange + var err error + tokenPrice, err = b.fetchPrice(ctx, symbol) + if err != nil { + return nil, fmt.Errorf("failed to fetch price for %s: %w", symbol, err) + } + + b.log.Info("Fetched price from Bitget", + "source", "bitget", + "token_id", tokenID, + "symbol", symbol, + "token_price_usd", tokenPrice.String(), + "eth_price_usd", ethPrice.String()) + } + + return &TokenPrice{ + TokenID: tokenID, + Symbol: symbol, + TokenPriceUSD: tokenPrice, + EthPriceUSD: ethPrice, + }, nil +} + +// GetBatchTokenPrices returns batch token prices in USD +func (b *BitgetSDKPriceFeed) GetBatchTokenPrices(ctx context.Context, tokenIDs []uint16) (map[uint16]*TokenPrice, error) { + // Update ETH price first (this will acquire write lock) + if err := b.updateETHPrice(ctx); err != nil { + return nil, fmt.Errorf("failed to update ETH price: %w", err) + } + + prices := make(map[uint16]*TokenPrice) + + for _, tokenID := range tokenIDs { + price, err := b.GetTokenPrice(ctx, tokenID) + if err != nil { + b.log.Warn("Failed to get price for token, skipping", + "token_id", tokenID, + "error", err) + continue + } + prices[tokenID] = price + } + + return prices, nil +} + +// updateETHPrice updates ETH price +func (b *BitgetSDKPriceFeed) updateETHPrice(ctx context.Context) error { + price, err := b.fetchPrice(ctx, "ETHUSDT") + if err != nil { + return fmt.Errorf("failed to fetch ETH price: %w", err) + } + + b.mu.Lock() + b.ethPrice = price + b.mu.Unlock() + + b.log.Info("Fetched ETH price from Bitget", + "source", "bitget", + "symbol", "ETHUSDT", + "eth_price_usd", price.String()) + + return nil +} + +// fetchPrice fetches price with retry +func (b *BitgetSDKPriceFeed) fetchPrice(ctx context.Context, symbol string) (*big.Float, error) { + maxRetries := 3 + var lastErr error + + for attempt := 0; attempt < maxRetries; attempt++ { + if attempt > 0 { + backoff := time.Duration(attempt) * time.Second + b.log.Debug("Retrying fetch price", + "symbol", symbol, + "attempt", attempt+1, + "backoff", backoff) + + select { + case <-time.After(backoff): + case <-ctx.Done(): + return nil, ctx.Err() + } + } + + price, err := b.fetchPriceOnce(ctx, symbol) + if err == nil { + return price, nil + } + + lastErr = err + b.log.Warn("Failed to fetch price, will retry", + "symbol", symbol, + "attempt", attempt+1, + "error", err) + } + + return nil, fmt.Errorf("failed after %d attempts: %w", maxRetries, lastErr) +} + +// fetchPriceOnce fetches price once using Bitget REST API +func (b *BitgetSDKPriceFeed) fetchPriceOnce(ctx context.Context, symbol string) (*big.Float, error) { + // Build request URL + url := fmt.Sprintf("%s%s?symbol=%s", b.baseURL, bitgetTickerPath, symbol) + + // Create HTTP request + req, err := http.NewRequestWithContext(ctx, "GET", url, nil) + if err != nil { + return nil, fmt.Errorf("failed to create request: %w", err) + } + + // Set headers + req.Header.Set("Content-Type", "application/json") + + // Send request + resp, err := b.httpClient.Do(req) + if err != nil { + return nil, fmt.Errorf("HTTP request failed: %w", err) + } + defer resp.Body.Close() + + // Read response body + body, err := io.ReadAll(resp.Body) + if err != nil { + return nil, fmt.Errorf("failed to read response body: %w", err) + } + + // Parse JSON response + var apiResp BitgetV2Response + if err := json.Unmarshal(body, &apiResp); err != nil { + return nil, fmt.Errorf("failed to parse JSON response: %w", err) + } + + // Check API response code + if apiResp.Code != "00000" { + return nil, fmt.Errorf("API error: %s - %s", apiResp.Code, apiResp.Msg) + } + + // Check if data exists + if len(apiResp.Data) == 0 { + return nil, fmt.Errorf("no data returned for symbol %s", symbol) + } + + // Parse price + lastPriceStr := apiResp.Data[0].LastPr + if lastPriceStr == "" { + return nil, fmt.Errorf("no price data returned for symbol %s", symbol) + } + + lastPrice, err := strconv.ParseFloat(lastPriceStr, 64) + if err != nil { + return nil, fmt.Errorf("failed to parse price '%s': %w", lastPriceStr, err) + } + + b.log.Debug("Fetched price from Bitget API", + "symbol", symbol, + "price", lastPrice) + + return big.NewFloat(lastPrice), nil +} + +// UpdateTokenMap updates token mapping +// This method is safe to call concurrently with other methods +// The input map is copied to prevent external modifications +func (b *BitgetSDKPriceFeed) UpdateTokenMap(tokenMap map[uint16]string) { + b.mu.Lock() + // Create a defensive copy to prevent external modifications + copied := make(map[uint16]string, len(tokenMap)) + for k, v := range tokenMap { + copied[k] = v + } + b.tokenMap = copied + b.mu.Unlock() + b.log.Info("Updated token map", "token_map", copied) +} + +// GetSupportedTokens returns list of supported token IDs +func (b *BitgetSDKPriceFeed) GetSupportedTokens() []uint16 { + b.mu.RLock() + tokenIDs := make([]uint16, 0, len(b.tokenMap)) + for tokenID := range b.tokenMap { + tokenIDs = append(tokenIDs, tokenID) + } + b.mu.RUnlock() + return tokenIDs +} diff --git a/token-price-oracle/client/l2_client.go b/token-price-oracle/client/l2_client.go new file mode 100644 index 000000000..a69ea044c --- /dev/null +++ b/token-price-oracle/client/l2_client.go @@ -0,0 +1,169 @@ +package client + +import ( + "context" + "fmt" + "math/big" + + "github.com/morph-l2/externalsign" + "github.com/morph-l2/go-ethereum/accounts/abi/bind" + "github.com/morph-l2/go-ethereum/common" + "github.com/morph-l2/go-ethereum/core/types" + "github.com/morph-l2/go-ethereum/crypto" + "github.com/morph-l2/go-ethereum/ethclient" + "github.com/morph-l2/go-ethereum/log" + "morph-l2/token-price-oracle/config" +) + +// L2Client wraps L2 chain client +type L2Client struct { + client *ethclient.Client + chainID *big.Int + opts *bind.TransactOpts + signer *Signer + externalSign bool +} + +// NewL2Client creates new L2 client +func NewL2Client(rpcURL string, cfg *config.Config) (*L2Client, error) { + client, err := ethclient.Dial(rpcURL) + if err != nil { + return nil, fmt.Errorf("failed to dial L2 RPC: %w", err) + } + + // Ensure client is closed if any subsequent step fails + defer func() { + if err != nil { + client.Close() + } + }() + + // Get chain ID + chainID, err := client.ChainID(context.Background()) + if err != nil { + return nil, fmt.Errorf("failed to get chain ID: %w", err) + } + + l2Client := &L2Client{ + client: client, + chainID: chainID, + externalSign: cfg.ExternalSign, + } + + if cfg.ExternalSign { + // External sign mode + rsaPriv, err := externalsign.ParseRsaPrivateKey(cfg.ExternalSignRsaPriv) + if err != nil { + return nil, fmt.Errorf("failed to parse RSA private key: %w", err) + } + + l2Client.signer = NewSigner( + true, + cfg.ExternalSignAppid, + rsaPriv, + cfg.ExternalSignAddress, + cfg.ExternalSignChain, + cfg.ExternalSignUrl, + chainID, + ) + + fromAddr := common.HexToAddress(cfg.ExternalSignAddress) + ethSigner := types.NewLondonSigner(chainID) + + // Create opts with a placeholder signer for building transactions. + // This allows contract bindings to construct transaction objects so we can + // extract the calldata and target address. The placeholder signature is never + // actually broadcast - the real signing happens via external signer. + // SAFETY: NoSend is always true, and tx_manager.go only extracts To() and Data() + // from the placeholder tx, then creates a new properly signed transaction. + l2Client.opts = &bind.TransactOpts{ + From: fromAddr, + NoSend: true, // CRITICAL: Must always be true for external signing mode + Signer: func(address common.Address, tx *types.Transaction) (*types.Transaction, error) { + // Placeholder signer - returns tx with dummy signature to satisfy bind package. + // This tx is NEVER sent; only used to extract calldata for external signing. + return tx.WithSignature(ethSigner, make([]byte, 65)) + }, + } + + log.Info("L2 client initialized with external signing", + "address", cfg.ExternalSignAddress, + "chainID", chainID) + } else { + // Local private key mode + privateKeyHex := cfg.PrivateKey + if len(cfg.PrivateKey) > 2 && cfg.PrivateKey[:2] == "0x" { + privateKeyHex = cfg.PrivateKey[2:] + } + key, err := crypto.HexToECDSA(privateKeyHex) + if err != nil { + return nil, fmt.Errorf("failed to parse private key: %w", err) + } + + // Create transaction options + opts, err := bind.NewKeyedTransactorWithChainID(key, chainID) + if err != nil { + return nil, fmt.Errorf("failed to create transactor: %w", err) + } + l2Client.opts = opts + + log.Info("L2 client initialized with local signing", + "address", opts.From.Hex(), + "chainID", chainID) + } + + return l2Client, nil +} + +// Close closes client connection +func (c *L2Client) Close() { + c.client.Close() +} + +// GetClient returns the underlying ethclient +func (c *L2Client) GetClient() *ethclient.Client { + return c.client +} + +// GetOpts returns a copy of transaction options +// Returns a new instance to prevent concurrent modification +func (c *L2Client) GetOpts() *bind.TransactOpts { + // Return a copy to prevent shared state issues + return &bind.TransactOpts{ + From: c.opts.From, + Nonce: c.opts.Nonce, + Signer: c.opts.Signer, + Value: c.opts.Value, + GasPrice: c.opts.GasPrice, + GasFeeCap: c.opts.GasFeeCap, + GasTipCap: c.opts.GasTipCap, + GasLimit: c.opts.GasLimit, + Context: c.opts.Context, + NoSend: c.opts.NoSend, + } +} + +// GetBalance returns account balance +func (c *L2Client) GetBalance(ctx context.Context, address common.Address) (*big.Int, error) { + return c.client.BalanceAt(ctx, address, nil) +} + +// WalletAddress returns wallet address +func (c *L2Client) WalletAddress() common.Address { + return c.opts.From +} + +// IsExternalSign returns whether external signing is enabled +func (c *L2Client) IsExternalSign() bool { + return c.externalSign +} + +// GetSigner returns the external signer (nil if using local signing) +func (c *L2Client) GetSigner() *Signer { + return c.signer +} + +// GetChainID returns the chain ID +func (c *L2Client) GetChainID() *big.Int { + return c.chainID +} diff --git a/token-price-oracle/client/price_feed.go b/token-price-oracle/client/price_feed.go new file mode 100644 index 000000000..b689f34e1 --- /dev/null +++ b/token-price-oracle/client/price_feed.go @@ -0,0 +1,137 @@ +package client + +import ( + "context" + "fmt" + "math/big" + + "github.com/morph-l2/go-ethereum/log" +) + +// TokenPrice represents token price information +type TokenPrice struct { + TokenID uint16 + Symbol string + TokenPriceUSD *big.Float // Token price in USD + EthPriceUSD *big.Float // ETH price in USD (for reference) +} + +// PriceFeed represents a price feed interface +type PriceFeed interface { + // GetTokenPrice returns token price in USD + GetTokenPrice(ctx context.Context, tokenID uint16) (*TokenPrice, error) + + // GetBatchTokenPrices returns token prices in USD for multiple tokens + GetBatchTokenPrices(ctx context.Context, tokenIDs []uint16) (map[uint16]*TokenPrice, error) +} + +// FallbackPriceFeed implements fallback mechanism for multiple price feeds +type FallbackPriceFeed struct { + feeds []PriceFeed + names []string // Feed names for logging + log log.Logger +} + +// NewFallbackPriceFeed creates a price feed with fallback support +// feeds: price feeds in priority order (first = highest priority) +// names: corresponding names for logging +func NewFallbackPriceFeed(feeds []PriceFeed, names []string) *FallbackPriceFeed { + return &FallbackPriceFeed{ + feeds: feeds, + names: names, + log: log.New("component", "fallback_price_feed"), + } +} + +// GetTokenPrice tries to get token price from feeds in priority order +func (f *FallbackPriceFeed) GetTokenPrice(ctx context.Context, tokenID uint16) (*TokenPrice, error) { + var lastErr error + + for i, feed := range f.feeds { + feedName := "unknown" + if i < len(f.names) { + feedName = f.names[i] + } + + price, err := feed.GetTokenPrice(ctx, tokenID) + if err == nil { + // Validate returned price to prevent nil pointer panics + if price == nil || price.TokenPriceUSD == nil || price.EthPriceUSD == nil { + f.log.Warn("Feed returned nil price or components, treating as failure", + "token_id", tokenID, + "feed", feedName, + "priority", i) + lastErr = fmt.Errorf("feed %s returned incomplete price for token %d", feedName, tokenID) + continue + } + + f.log.Info("Successfully fetched price from feed", + "source", feedName, + "token_id", tokenID, + "symbol", price.Symbol, + "priority", i, + "token_price_usd", price.TokenPriceUSD.String(), + "eth_price_usd", price.EthPriceUSD.String()) + return price, nil + } + + f.log.Warn("Failed to fetch price from feed, trying next", + "token_id", tokenID, + "feed", feedName, + "priority", i, + "error", err.Error()) + lastErr = err + } + + return nil, lastErr +} + +// GetBatchTokenPrices tries to get batch token prices from feeds in priority order +func (f *FallbackPriceFeed) GetBatchTokenPrices(ctx context.Context, tokenIDs []uint16) (map[uint16]*TokenPrice, error) { + var lastErr error + + for i, feed := range f.feeds { + feedName := "unknown" + if i < len(f.names) { + feedName = f.names[i] + } + + prices, err := feed.GetBatchTokenPrices(ctx, tokenIDs) + if err == nil { + // Validate all returned prices to prevent nil pointer panics + hasInvalidPrice := false + for tokenID, price := range prices { + if price == nil || price.TokenPriceUSD == nil || price.EthPriceUSD == nil { + f.log.Warn("Feed returned nil price or components for token, treating as failure", + "token_id", tokenID, + "feed", feedName, + "priority", i) + hasInvalidPrice = true + break + } + } + + if hasInvalidPrice { + lastErr = fmt.Errorf("feed %s returned incomplete prices", feedName) + continue + } + + f.log.Info("Successfully fetched batch prices from feed", + "token_count", len(prices), + "requested_count", len(tokenIDs), + "feed", feedName, + "priority", i) + return prices, nil + } + + f.log.Warn("Failed to fetch batch prices from feed, trying next", + "token_count", len(tokenIDs), + "feed", feedName, + "priority", i, + "error", err.Error()) + lastErr = err + } + + return nil, lastErr +} + diff --git a/token-price-oracle/client/sign.go b/token-price-oracle/client/sign.go new file mode 100644 index 000000000..340e32140 --- /dev/null +++ b/token-price-oracle/client/sign.go @@ -0,0 +1,158 @@ +package client + +import ( + "context" + "crypto/rsa" + "fmt" + "math/big" + + "github.com/morph-l2/externalsign" + "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/log" +) + +// Signer handles transaction signing with support for both local and external signing +type Signer struct { + externalSign bool + externalSigner *externalsign.ExternalSign + externalSignUrl string + externalSignAddress common.Address + chainID *big.Int + signer types.Signer +} + +// NewSigner creates a new Signer instance +func NewSigner( + externalSign bool, + externalSignAppid string, + externalRsaPriv *rsa.PrivateKey, + externalSignAddress string, + externalSignChain string, + externalSignUrl string, + chainID *big.Int, +) *Signer { + signer := types.NewLondonSigner(chainID) + + s := &Signer{ + externalSign: externalSign, + externalSignUrl: externalSignUrl, + externalSignAddress: common.HexToAddress(externalSignAddress), + chainID: chainID, + signer: signer, + } + + if externalSign { + s.externalSigner = externalsign.NewExternalSign( + externalSignAppid, + externalRsaPriv, + externalSignAddress, + externalSignChain, + signer, + ) + log.Info("External signer initialized", + "address", externalSignAddress, + "chain", externalSignChain) + } + + return s +} + +// Sign signs a transaction using either external or local signing +func (s *Signer) Sign(tx *types.Transaction) (*types.Transaction, error) { + if !s.externalSign { + return nil, fmt.Errorf("local signing not supported in Signer, use bind.TransactOpts") + } + + signedTx, err := s.externalSigner.RequestSign(s.externalSignUrl, tx) + if err != nil { + return nil, fmt.Errorf("external sign request failed: %w", err) + } + return signedTx, nil +} + +// IsExternalSign returns whether external signing is enabled +func (s *Signer) IsExternalSign() bool { + return s.externalSign +} + +// GetFromAddress returns the signer's address +func (s *Signer) GetFromAddress() common.Address { + return s.externalSignAddress +} + +// CreateAndSignTx creates a new transaction and signs it +func (s *Signer) CreateAndSignTx( + ctx context.Context, + client *L2Client, + to common.Address, + callData []byte, +) (*types.Transaction, error) { + from := s.externalSignAddress + + nonce, err := client.GetClient().NonceAt(ctx, from, nil) + if err != nil { + return nil, fmt.Errorf("failed to get nonce: %w", err) + } + + // Get gas tip cap + tip, err := client.GetClient().SuggestGasTipCap(ctx) + if err != nil { + return nil, fmt.Errorf("failed to get gas tip cap: %w", err) + } + + // Get base fee from latest block + head, err := client.GetClient().HeaderByNumber(ctx, nil) + if err != nil { + return nil, fmt.Errorf("failed to get block header: %w", err) + } + + var gasFeeCap *big.Int + if head.BaseFee != nil { + gasFeeCap = new(big.Int).Add( + tip, + new(big.Int).Mul(head.BaseFee, big.NewInt(2)), + ) + } else { + gasFeeCap = new(big.Int).Set(tip) + } + + // Estimate gas + gas, err := client.GetClient().EstimateGas(ctx, ethereum.CallMsg{ + From: from, + To: &to, + GasFeeCap: gasFeeCap, + GasTipCap: tip, + Data: callData, + }) + if err != nil { + return nil, fmt.Errorf("failed to estimate gas: %w", err) + } + + // Add 50% buffer to gas estimate + gas = gas * 3 / 2 + + // Create transaction + tx := types.NewTx(&types.DynamicFeeTx{ + ChainID: s.chainID, + Nonce: nonce, + GasTipCap: tip, + GasFeeCap: gasFeeCap, + Gas: gas, + To: &to, + Data: callData, + }) + + log.Info("Created transaction for signing", + "from", from.Hex(), + "to", to.Hex(), + "nonce", nonce, + "gas", gas, + "gasFeeCap", gasFeeCap, + "gasTipCap", tip) + + // Sign transaction + return s.Sign(tx) +} + diff --git a/token-price-oracle/cmd/main.go b/token-price-oracle/cmd/main.go new file mode 100644 index 000000000..f2ff3c841 --- /dev/null +++ b/token-price-oracle/cmd/main.go @@ -0,0 +1,155 @@ +package main + +import ( + "context" + "fmt" + "io" + "os" + "os/signal" + "path/filepath" + "syscall" + "time" + + "github.com/morph-l2/go-ethereum/log" + "github.com/urfave/cli" + "gopkg.in/natefinch/lumberjack.v2" + "morph-l2/token-price-oracle/client" + "morph-l2/token-price-oracle/config" + "morph-l2/token-price-oracle/flags" + "morph-l2/token-price-oracle/metrics" + "morph-l2/token-price-oracle/updater" +) + +var ( + GitVersion = "" + GitCommit = "" + GitDate = "" +) + +func main() { + app := cli.NewApp() + app.Flags = flags.Flags + app.Version = fmt.Sprintf("%s-%s-%s", GitVersion, GitCommit, GitDate) + app.Name = "token-price-oracle" + app.Usage = "Gas Price Oracle Service" + app.Description = "Service for monitoring L1 gas prices and updating L2 GasPriceOracle contract" + app.Action = Main + + if err := app.Run(os.Args); err != nil { + log.Crit("Application failed", "err", err) + } +} + +func Main(cliCtx *cli.Context) error { + // Load configuration + cfg, err := config.LoadConfig(cliCtx) + if err != nil { + return fmt.Errorf("failed to load config: %w", err) + } + + // Setup logging + var logHandler log.Handler + + output := io.Writer(os.Stderr) + if cfg.LogFilename != "" { + dir := filepath.Dir(cfg.LogFilename) // handles "dir/filename" correctly + if dir != "" && dir != "." { + if err := os.MkdirAll(dir, 0o755); err != nil { + return fmt.Errorf("create log directory %q failed: %v", dir, err) + } + } + f, err := os.OpenFile(cfg.LogFilename, os.O_CREATE|os.O_RDWR, os.FileMode(0600)) + if err != nil { + return fmt.Errorf("wrong log.filename set: %d", err) + } + f.Close() + + if cfg.LogFileMaxSize < 1 { + return fmt.Errorf("wrong log.maxsize set: %d", cfg.LogFileMaxSize) + } + + if cfg.LogFileMaxAge < 1 { + return fmt.Errorf("wrong log.maxage set: %d", cfg.LogFileMaxAge) + } + logFile := &lumberjack.Logger{ + Filename: cfg.LogFilename, + MaxSize: cfg.LogFileMaxSize, // megabytes + MaxAge: cfg.LogFileMaxAge, // days + Compress: cfg.LogCompress, + } + output = io.MultiWriter(output, logFile) + } + if cfg.LogTerminal { + logHandler = log.StreamHandler(os.Stdout, log.TerminalFormat(true)) + } else { + logHandler = log.StreamHandler(output, log.JSONFormat()) + } + logLevel, err := log.LvlFromString(cfg.LogLevel) + if err != nil { + return err + } + log.Root().SetHandler(log.LvlFilterHandler(logLevel, logHandler)) + + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + // Initialize metrics if enabled + if cfg.MetricsServerEnable { + go func() { + if err := metrics.StartMetricsServer(cfg.MetricAddress()); err != nil { + log.Error("Metrics server failed", "err", err) + } + }() + log.Info("Metrics server started", "address", cfg.MetricAddress()) + } + + // Create L2 client + l2Client, err := client.NewL2Client(cfg.L2RPC, cfg) + if err != nil { + return fmt.Errorf("failed to create L2 client: %w", err) + } + defer l2Client.Close() + + // Create transaction manager + txManager := updater.CreateTxManager(l2Client) + log.Info("Transaction manager initialized") + + priceUpdater, err := updater.CreatePriceUpdater(cfg, l2Client, txManager) + if err != nil { + return fmt.Errorf("failed to create price updater: %w", err) + } + + if priceUpdater == nil { + log.Warn("Price updater not created (no token IDs configured)") + } else { + log.Info("Price updater created", "updater", "price") + if err := priceUpdater.Start(ctx); err != nil { + return fmt.Errorf("failed to start updater: %w", err) + } + } + + // Wait for interrupt signal + sigCh := make(chan os.Signal, 1) + signal.Notify(sigCh, syscall.SIGINT, syscall.SIGTERM) + + select { + case <-sigCh: + log.Info("Received interrupt signal, shutting down...") + case <-ctx.Done(): + log.Info("Context cancelled, shutting down...") + } + + // Graceful shutdown + cancel() + + if priceUpdater != nil { + if err := priceUpdater.Stop(); err != nil { + log.Warn("Failed to stop updater", "error", err) + } + } + + time.Sleep(2 * time.Second) + + log.Info("Token price Oracle stopped") + return nil +} diff --git a/token-price-oracle/config/config.go b/token-price-oracle/config/config.go new file mode 100644 index 000000000..c66b69e9b --- /dev/null +++ b/token-price-oracle/config/config.go @@ -0,0 +1,253 @@ +package config + +import ( + "fmt" + "morph-l2/bindings/predeploys" + "strconv" + "strings" + "time" + + "github.com/morph-l2/go-ethereum/common" + "github.com/urfave/cli" + "morph-l2/token-price-oracle/flags" +) + +const ( + // MaxPriceThresholdBPS is the maximum allowed price threshold in basis points (100% = 10000 bps) + MaxPriceThresholdBPS = 10000 +) + +// PriceFeedType represents the type of price feed source +type PriceFeedType string + +const ( + PriceFeedTypeBitget PriceFeedType = "bitget" + PriceFeedTypeBinance PriceFeedType = "binance" +) + +// ValidPriceFeedTypes returns all valid price feed types +func ValidPriceFeedTypes() []PriceFeedType { + return []PriceFeedType{ + PriceFeedTypeBitget, + // PriceFeedTypeBinance, // TODO: Add back when Binance price feed is implemented + } +} + +// IsValidPriceFeedType checks if a string is a valid price feed type +func IsValidPriceFeedType(s string) bool { + feedType := PriceFeedType(s) + for _, valid := range ValidPriceFeedTypes() { + if feedType == valid { + return true + } + } + return false +} + +// String returns the string representation of PriceFeedType +func (p PriceFeedType) String() string { + return string(p) +} + +// Config contains all service configurations +type Config struct { + // RPC endpoints + L2RPC string + // Contract addresses + L2TokenRegistryAddr common.Address + // Private key + PrivateKey string + // Price update parameters + PriceUpdateInterval time.Duration // Price update interval + PriceThreshold uint64 // Price change threshold percentage to trigger update + PriceFeedPriority []PriceFeedType // Price feed types in priority order (fallback mechanism) + TokenMappings map[PriceFeedType]map[uint16]string // Token ID to trading pair mappings for each price feed type + BitgetAPIBaseURL string // Bitget API base URL + BinanceAPIBaseURL string // Binance API base URL + + // External sign + ExternalSign bool + ExternalSignAddress string + ExternalSignAppid string + ExternalSignChain string + ExternalSignUrl string + ExternalSignRsaPriv string + + // Metrics + MetricsServerEnable bool + MetricsHostname string + MetricsPort uint64 + + // Logging + LogLevel string + LogTerminal bool + LogFilename string + LogFileMaxSize int + LogFileMaxAge int + LogCompress bool +} + +// LoadConfig loads configuration from cli.Context +func LoadConfig(ctx *cli.Context) (*Config, error) { + cfg := &Config{ + L2RPC: ctx.String(flags.L2EthRPCFlag.Name), + PrivateKey: ctx.String(flags.PrivateKeyFlag.Name), + + // External sign + ExternalSign: ctx.Bool(flags.ExternalSignFlag.Name), + ExternalSignAddress: ctx.String(flags.ExternalSignAddressFlag.Name), + ExternalSignAppid: ctx.String(flags.ExternalSignAppidFlag.Name), + ExternalSignChain: ctx.String(flags.ExternalSignChainFlag.Name), + ExternalSignUrl: ctx.String(flags.ExternalSignUrlFlag.Name), + ExternalSignRsaPriv: ctx.String(flags.ExternalSignRsaPrivFlag.Name), + + MetricsServerEnable: ctx.Bool(flags.MetricsServerEnableFlag.Name), + MetricsHostname: ctx.String(flags.MetricsHostnameFlag.Name), + MetricsPort: ctx.Uint64(flags.MetricsPortFlag.Name), + + LogLevel: ctx.String(flags.LogLevelFlag.Name), + LogFilename: ctx.String(flags.LogFilenameFlag.Name), + LogFileMaxSize: ctx.Int(flags.LogFileMaxSizeFlag.Name), + LogFileMaxAge: ctx.Int(flags.LogFileMaxAgeFlag.Name), + LogCompress: ctx.Bool(flags.LogCompressFlag.Name), + } + + // Parse token registry address (optional) + cfg.L2TokenRegistryAddr = predeploys.L2TokenRegistryAddr + + // Parse price update interval + cfg.PriceUpdateInterval = ctx.Duration(flags.PriceUpdateIntervalFlag.Name) + + cfg.PriceThreshold = ctx.Uint64(flags.PriceThresholdFlag.Name) + + // Validate price threshold is reasonable (basis points should be 0-MaxPriceThresholdBPS) + if cfg.PriceThreshold > MaxPriceThresholdBPS { + return nil, fmt.Errorf("price threshold %d is too large (should be 0-%d basis points, where %d bps = 100%%)", + cfg.PriceThreshold, MaxPriceThresholdBPS, MaxPriceThresholdBPS) + } + + // Parse and validate price feed priority list + priorityStr := ctx.String(flags.PriceFeedPriorityFlag.Name) + if priorityStr == "" { + return nil, fmt.Errorf("price feed priority list cannot be empty") + } + + priorityParts := strings.Split(priorityStr, ",") + cfg.PriceFeedPriority = make([]PriceFeedType, 0, len(priorityParts)) + seenTypes := make(map[PriceFeedType]bool) + + for _, part := range priorityParts { + part = strings.TrimSpace(part) + if part == "" { + continue + } + if !IsValidPriceFeedType(part) { + validTypes := make([]string, len(ValidPriceFeedTypes())) + for i, t := range ValidPriceFeedTypes() { + validTypes[i] = t.String() + } + return nil, fmt.Errorf("invalid price feed type '%s' in priority list (must be one of: %s)", part, strings.Join(validTypes, ", ")) + } + feedType := PriceFeedType(part) + if seenTypes[feedType] { + return nil, fmt.Errorf("duplicate price feed type '%s' in priority list", part) + } + seenTypes[feedType] = true + cfg.PriceFeedPriority = append(cfg.PriceFeedPriority, feedType) + } + + if len(cfg.PriceFeedPriority) == 0 { + return nil, fmt.Errorf("price feed priority list cannot be empty after parsing") + } + + // Helper function to parse token mapping + parseTokenMapping := func(mappingStr string) (map[uint16]string, error) { + mapping := make(map[uint16]string) + if mappingStr == "" { + return mapping, nil + } + pairs := strings.Split(mappingStr, ",") + for _, pair := range pairs { + pair = strings.TrimSpace(pair) + if pair == "" { + continue + } + parts := strings.Split(pair, ":") + if len(parts) != 2 { + return nil, fmt.Errorf("invalid token mapping pair '%s' (expected format: tokenID:symbol)", pair) + } + tokenID, err := strconv.ParseUint(strings.TrimSpace(parts[0]), 10, 16) + if err != nil { + return nil, fmt.Errorf("invalid token ID in mapping '%s': %w", parts[0], err) + } + symbol := strings.TrimSpace(parts[1]) + mapping[uint16(tokenID)] = symbol + } + return mapping, nil + } + + // Parse all token mappings for different price feed types + cfg.TokenMappings = make(map[PriceFeedType]map[uint16]string) + + bitgetMapping, err := parseTokenMapping(ctx.String(flags.TokenMappingBitgetFlag.Name)) + if err != nil { + return nil, fmt.Errorf("failed to parse bitget token mapping: %w", err) + } + if len(bitgetMapping) > 0 { + cfg.TokenMappings[PriceFeedTypeBitget] = bitgetMapping + } + + binanceMapping, err := parseTokenMapping(ctx.String(flags.TokenMappingBinanceFlag.Name)) + if err != nil { + return nil, fmt.Errorf("failed to parse binance token mapping: %w", err) + } + if len(binanceMapping) > 0 { + cfg.TokenMappings[PriceFeedTypeBinance] = binanceMapping + } + + // Parse API base URLs + cfg.BitgetAPIBaseURL = ctx.String(flags.BitgetAPIBaseURLFlag.Name) + cfg.BinanceAPIBaseURL = ctx.String(flags.BinanceAPIBaseURLFlag.Name) + + // Validate API URLs for configured feeds (non-empty check only) + for _, feedType := range cfg.PriceFeedPriority { + switch feedType { + case PriceFeedTypeBitget: + if cfg.BitgetAPIBaseURL == "" { + return nil, fmt.Errorf("bitget feed is configured but --bitget-api-base-url is not set") + } + + case PriceFeedTypeBinance: + if cfg.BinanceAPIBaseURL == "" { + return nil, fmt.Errorf("binance feed is configured but --binance-api-base-url is not set") + } + } + } + + // Validate external sign config + if cfg.ExternalSign { + if cfg.ExternalSignAddress == "" || cfg.ExternalSignUrl == "" || + cfg.ExternalSignAppid == "" || cfg.ExternalSignChain == "" || + cfg.ExternalSignRsaPriv == "" { + return nil, fmt.Errorf("external sign is enabled but missing required config: address=%s, url=%s, appid=%s, chain=%s, rsa_priv_set=%t", + cfg.ExternalSignAddress, cfg.ExternalSignUrl, cfg.ExternalSignAppid, cfg.ExternalSignChain, cfg.ExternalSignRsaPriv != "") + } + + // Validate address format + if !common.IsHexAddress(cfg.ExternalSignAddress) { + return nil, fmt.Errorf("invalid external sign address format: %s", cfg.ExternalSignAddress) + } + } else { + // If not using external sign, private key is required + if cfg.PrivateKey == "" { + return nil, fmt.Errorf("private key is required when external sign is not enabled") + } + } + + return cfg, nil +} + +// MetricAddress returns the metrics server address +func (c *Config) MetricAddress() string { + return fmt.Sprintf("%s:%d", c.MetricsHostname, c.MetricsPort) +} diff --git a/token-price-oracle/docker-compose.yml b/token-price-oracle/docker-compose.yml new file mode 100644 index 000000000..389f0945e --- /dev/null +++ b/token-price-oracle/docker-compose.yml @@ -0,0 +1,51 @@ +version: '3.8' + +services: + token-price-oracle: + build: + context: . + dockerfile: Dockerfile + container_name: morph-token-price-oracle + restart: unless-stopped + environment: + # L2 RPC endpoint + TOKEN_PRICE_ORACLE_L2_ETH_RPC: ${TOKEN_PRICE_ORACLE_L2_ETH_RPC:-http://host.docker.internal:8545} + + # Private key for signing transactions + TOKEN_PRICE_ORACLE_PRIVATE_KEY: ${TOKEN_PRICE_ORACLE_PRIVATE_KEY} + + # Price update configuration + TOKEN_PRICE_ORACLE_PRICE_UPDATE_INTERVAL: ${TOKEN_PRICE_ORACLE_PRICE_UPDATE_INTERVAL:-30s} + TOKEN_PRICE_ORACLE_PRICE_THRESHOLD: ${TOKEN_PRICE_ORACLE_PRICE_THRESHOLD:-5} # percentage (%) + + # Price feed configuration + TOKEN_PRICE_ORACLE_PRICE_FEED_PRIORITY: ${TOKEN_PRICE_ORACLE_PRICE_FEED_PRIORITY:-bitget} + TOKEN_PRICE_ORACLE_TOKEN_MAPPING_BITGET: ${TOKEN_PRICE_ORACLE_TOKEN_MAPPING_BITGET} + TOKEN_PRICE_ORACLE_TOKEN_MAPPING_BINANCE: ${TOKEN_PRICE_ORACLE_TOKEN_MAPPING_BINANCE} + + # Token IDs to monitor (optional, will fetch from contract if not set) + TOKEN_PRICE_ORACLE_TOKEN_IDS: ${TOKEN_PRICE_ORACLE_TOKEN_IDS} + + # Metrics server + TOKEN_PRICE_ORACLE_METRICS_SERVER_ENABLE: ${TOKEN_PRICE_ORACLE_METRICS_SERVER_ENABLE:-true} + TOKEN_PRICE_ORACLE_METRICS_HOSTNAME: ${TOKEN_PRICE_ORACLE_METRICS_HOSTNAME:-0.0.0.0} + TOKEN_PRICE_ORACLE_METRICS_PORT: ${TOKEN_PRICE_ORACLE_METRICS_PORT:-6060} + + # Logging + TOKEN_PRICE_ORACLE_LOG_LEVEL: ${TOKEN_PRICE_ORACLE_LOG_LEVEL:-info} + ports: + - "${METRICS_PORT:-6060}:6060" # Metrics endpoint + volumes: + - oracle-logs:/data/logs/morph-gas-oracle + networks: + - morph-network + extra_hosts: + - "host.docker.internal:host-gateway" + +volumes: + oracle-logs: + driver: local + +networks: + morph-network: + driver: bridge diff --git a/token-price-oracle/env.example b/token-price-oracle/env.example new file mode 100644 index 000000000..aadec144d --- /dev/null +++ b/token-price-oracle/env.example @@ -0,0 +1,45 @@ +# Token Price Oracle Configuration Example +# Copy this file to .env and fill in your values + +# L2 RPC endpoint +TOKEN_PRICE_ORACLE_L2_ETH_RPC=http://localhost:8545 + +# L2 Token Registry contract address +TOKEN_PRICE_ORACLE_L2_TOKEN_REGISTRY_ADDRESS=0x5300000000000000000000000000000000000021 + +# Private key for signing transactions (without 0x prefix in env var) +TOKEN_PRICE_ORACLE_PRIVATE_KEY=ac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 + +# Price update configuration +TOKEN_PRICE_ORACLE_PRICE_UPDATE_INTERVAL=30s +TOKEN_PRICE_ORACLE_PRICE_THRESHOLD=100 # basis points (bps), e.g. 100 means 1% (100 bps), 10 means 0.1%, 1 means 0.01% + +# Price feed priority (comma-separated: bitget,binance) +TOKEN_PRICE_ORACLE_PRICE_FEED_PRIORITY=bitget + +# Token mapping for Bitget (tokenID:tradingPair,tokenID:tradingPair) +# Format: +# - Regular tokens: tokenID:SYMBOL (e.g., 1:BGBUSDT, 2:BTCUSDT) +# - Stablecoins: tokenID:$PRICE (e.g., 3:$1.0 for USDT pegged to $1 USD) +# Example: 1:BGBUSDT,2:BTCUSDT,3:$1.0,4:$0.9999 +TOKEN_PRICE_ORACLE_TOKEN_MAPPING_BITGET=1:BGBUSDT,2:BTCUSDT,3:$1.0 + +# Token mapping for Binance (optional, same format as Bitget) +# TOKEN_PRICE_ORACLE_TOKEN_MAPPING_BINANCE=1:BGBUSDT,2:BTCUSDT,3:$1.0 + +# API base URLs (optional, defaults provided) +TOKEN_PRICE_ORACLE_BITGET_API_BASE_URL=https://api.bitget.com +# TOKEN_PRICE_ORACLE_BINANCE_API_BASE_URL=https://api.binance.com + +# Token IDs to monitor (optional, will fetch from contract if not set) +TOKEN_PRICE_ORACLE_TOKEN_IDS=1,2 + +# Metrics server configuration +TOKEN_PRICE_ORACLE_METRICS_SERVER_ENABLE=true +TOKEN_PRICE_ORACLE_METRICS_HOSTNAME=0.0.0.0 +TOKEN_PRICE_ORACLE_METRICS_PORT=6060 + +# Logging +TOKEN_PRICE_ORACLE_LOG_LEVEL=info + + diff --git a/token-price-oracle/flags/flags.go b/token-price-oracle/flags/flags.go new file mode 100644 index 000000000..785783e15 --- /dev/null +++ b/token-price-oracle/flags/flags.go @@ -0,0 +1,216 @@ +package flags + +import ( + "time" + + "github.com/urfave/cli" +) + +const envVarPrefix = "TOKEN_PRICE_ORACLE_" + +func prefixEnvVar(name string) string { + return envVarPrefix + name +} + +var ( + /* Required Flags */ + L2EthRPCFlag = cli.StringFlag{ + Name: "l2-eth-rpc", + Usage: "HTTP provider URL for L2", + Required: true, + EnvVar: prefixEnvVar("L2_ETH_RPC"), + } + + PrivateKeyFlag = cli.StringFlag{ + Name: "private-key", + Usage: "The private key to use for sending transactions to L2 (not required if external-sign is enabled)", + EnvVar: prefixEnvVar("PRIVATE_KEY"), + } + + /* Optional Flags */ + + TxnPerBatchFlag = cli.Uint64Flag{ + Name: "txn-per-batch", + Usage: "Expected transactions per batch", + Value: 50, + EnvVar: prefixEnvVar("TXN_PER_BATCH"), + } + + PriceUpdateIntervalFlag = cli.DurationFlag{ + Name: "price-update-interval", + Usage: "Token price update interval", + Value: 60 * time.Second, + EnvVar: prefixEnvVar("PRICE_UPDATE_INTERVAL"), + } + + PriceThresholdFlag = cli.Uint64Flag{ + Name: "price-threshold", + Usage: "Price change threshold in basis points (bps) to trigger update (e.g. 100 for 1%, 10 for 0.1%, 1 for 0.01%)", + Value: 0, + EnvVar: prefixEnvVar("PRICE_THRESHOLD"), + } + + PriceFeedPriorityFlag = cli.StringFlag{ + Name: "price-feed-priority", + Usage: "Comma-separated list of price feed types in priority order (e.g. \"bitget,binance\")", + Value: "bitget", + EnvVar: prefixEnvVar("PRICE_FEED_PRIORITY"), + } + + TokenMappingBitgetFlag = cli.StringFlag{ + Name: "token-mapping-bitget", + Usage: "Token ID to Bitget trading pair mapping (e.g. \"1:BTCUSDT,2:ETHUSDT\")", + Value: "", + EnvVar: prefixEnvVar("TOKEN_MAPPING_BITGET"), + } + + TokenMappingBinanceFlag = cli.StringFlag{ + Name: "token-mapping-binance", + Usage: "Token ID to Binance trading pair mapping (e.g. \"1:BTCUSDT,2:ETHUSDT\")", + Value: "", + EnvVar: prefixEnvVar("TOKEN_MAPPING_BINANCE"), + } + + BitgetAPIBaseURLFlag = cli.StringFlag{ + Name: "bitget-api-base-url", + Usage: "Bitget API base URL (required if bitget feed is enabled)", + Value: "", + EnvVar: prefixEnvVar("BITGET_API_BASE_URL"), + } + + BinanceAPIBaseURLFlag = cli.StringFlag{ + Name: "binance-api-base-url", + Usage: "Binance API base URL (required if binance feed is enabled)", + Value: "", + EnvVar: prefixEnvVar("BINANCE_API_BASE_URL"), + } + + // Logging flags + LogLevelFlag = cli.StringFlag{ + Name: "log-level", + Usage: "The lowest log level that will be output", + Value: "info", + EnvVar: prefixEnvVar("LOG_LEVEL"), + } + + LogFilenameFlag = cli.StringFlag{ + Name: "log-filename", + Usage: "The target file for writing logs", + EnvVar: prefixEnvVar("LOG_FILENAME"), + } + + LogFileMaxSizeFlag = cli.IntFlag{ + Name: "log-file-max-size", + Usage: "The maximum size in megabytes of the log file before it gets rotated", + Value: 100, + EnvVar: prefixEnvVar("LOG_FILE_MAX_SIZE"), + } + + LogFileMaxAgeFlag = cli.IntFlag{ + Name: "log-file-max-age", + Usage: "The maximum number of days to retain old log files", + Value: 30, + EnvVar: prefixEnvVar("LOG_FILE_MAX_AGE"), + } + + LogCompressFlag = cli.BoolFlag{ + Name: "log-compress", + Usage: "Whether to compress rotated log files using gzip", + EnvVar: prefixEnvVar("LOG_COMPRESS"), + } + + // Metrics flags + MetricsServerEnableFlag = cli.BoolFlag{ + Name: "metrics-server-enable", + Usage: "Whether or not to run the embedded metrics server", + EnvVar: prefixEnvVar("METRICS_SERVER_ENABLE"), + } + + MetricsHostnameFlag = cli.StringFlag{ + Name: "metrics-hostname", + Usage: "The hostname of the metrics server", + Value: "0.0.0.0", + EnvVar: prefixEnvVar("METRICS_HOSTNAME"), + } + + MetricsPortFlag = cli.Uint64Flag{ + Name: "metrics-port", + Usage: "The port of the metrics server", + Value: 6060, + EnvVar: prefixEnvVar("METRICS_PORT"), + } + + // External sign flags + ExternalSignFlag = cli.BoolFlag{ + Name: "external-sign", + Usage: "Enable external sign", + EnvVar: prefixEnvVar("EXTERNAL_SIGN"), + } + + ExternalSignAddressFlag = cli.StringFlag{ + Name: "external-sign-address", + Usage: "The address of the external signer", + EnvVar: prefixEnvVar("EXTERNAL_SIGN_ADDRESS"), + } + + ExternalSignAppidFlag = cli.StringFlag{ + Name: "external-sign-appid", + Usage: "The appid for external sign", + EnvVar: prefixEnvVar("EXTERNAL_SIGN_APPID"), + } + + ExternalSignChainFlag = cli.StringFlag{ + Name: "external-sign-chain", + Usage: "The chain identifier for external sign", + EnvVar: prefixEnvVar("EXTERNAL_SIGN_CHAIN"), + } + + ExternalSignUrlFlag = cli.StringFlag{ + Name: "external-sign-url", + Usage: "The URL of the external sign service", + EnvVar: prefixEnvVar("EXTERNAL_SIGN_URL"), + } + + ExternalSignRsaPrivFlag = cli.StringFlag{ + Name: "external-sign-rsa-priv", + Usage: "The RSA private key for external sign", + EnvVar: prefixEnvVar("EXTERNAL_SIGN_RSA_PRIV"), + } +) + +var requiredFlags = []cli.Flag{ + L2EthRPCFlag, + PrivateKeyFlag, +} + +var optionalFlags = []cli.Flag{ + TxnPerBatchFlag, + PriceUpdateIntervalFlag, + PriceThresholdFlag, + PriceFeedPriorityFlag, + TokenMappingBitgetFlag, + TokenMappingBinanceFlag, + BitgetAPIBaseURLFlag, + BinanceAPIBaseURLFlag, + + LogLevelFlag, + LogFilenameFlag, + LogFileMaxSizeFlag, + LogFileMaxAgeFlag, + LogCompressFlag, + + MetricsServerEnableFlag, + MetricsHostnameFlag, + MetricsPortFlag, + + // External sign + ExternalSignFlag, + ExternalSignAddressFlag, + ExternalSignAppidFlag, + ExternalSignChainFlag, + ExternalSignUrlFlag, + ExternalSignRsaPrivFlag, +} + +// Flags contains the list of configuration options available to the binary. +var Flags = append(requiredFlags, optionalFlags...) diff --git a/token-price-oracle/go.mod b/token-price-oracle/go.mod new file mode 100644 index 000000000..02292b9e8 --- /dev/null +++ b/token-price-oracle/go.mod @@ -0,0 +1,89 @@ +module morph-l2/token-price-oracle + +go 1.24.0 + +replace ( + github.com/VictoriaMetrics/fastcache => github.com/VictoriaMetrics/fastcache v1.12.2 + golang.org/x/sys => golang.org/x/sys v0.30.0 +) + +require ( + github.com/morph-l2/externalsign v0.3.1 + github.com/morph-l2/go-ethereum v1.10.14-0.20260211074551-4f0f6e6bd141 + github.com/prometheus/client_golang v1.17.0 + github.com/sirupsen/logrus v1.9.3 + github.com/urfave/cli v1.22.17 + gopkg.in/natefinch/lumberjack.v2 v2.2.1 +) + +require ( + github.com/VictoriaMetrics/fastcache v1.12.2 // indirect + github.com/beorn7/perks v1.0.1 // indirect + github.com/bits-and-blooms/bitset v1.20.0 // indirect + github.com/btcsuite/btcd/btcec/v2 v2.2.1 // indirect + github.com/cespare/xxhash/v2 v2.2.0 // indirect + github.com/consensys/bavard v0.1.27 // indirect + github.com/consensys/gnark-crypto v0.16.0 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect + github.com/crate-crypto/go-eth-kzg v1.4.0 // indirect + github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect + github.com/deckarep/golang-set v1.8.0 // indirect + github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect + github.com/edsrzf/mmap-go v1.1.0 // indirect + github.com/ethereum/c-kzg-4844/v2 v2.1.5 // indirect + github.com/ethereum/go-ethereum v1.10.26 // indirect + github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect + github.com/go-kit/kit v0.12.0 // indirect + github.com/go-logfmt/logfmt v0.6.0 // indirect + github.com/go-ole/go-ole v1.3.0 // indirect + github.com/go-resty/resty/v2 v2.13.1 // indirect + github.com/go-stack/stack v1.8.1 // indirect + github.com/golang-jwt/jwt/v4 v4.5.0 // indirect + github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/go-cmp v0.6.0 // indirect + github.com/google/uuid v1.6.0 // indirect + github.com/gorilla/websocket v1.5.1 // indirect + github.com/hashicorp/go-bexpr v0.1.13 // indirect + github.com/hashicorp/golang-lru v1.0.2 // indirect + github.com/holiman/bloomfilter/v2 v2.0.3 // indirect + github.com/holiman/uint256 v1.2.4 // indirect + github.com/huin/goupnp v1.3.0 // indirect + github.com/iden3/go-iden3-crypto v0.0.16 // indirect + github.com/jackpal/go-nat-pmp v1.0.2 // indirect + github.com/mattn/go-colorable v0.1.13 // indirect + github.com/mattn/go-isatty v0.0.20 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect + github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect + github.com/mitchellh/mapstructure v1.5.0 // indirect + github.com/mitchellh/pointerstructure v1.2.1 // indirect + github.com/mmcloughlin/addchain v0.4.0 // indirect + github.com/olekukonko/tablewriter v0.0.5 // indirect + github.com/pkg/errors v0.9.1 // indirect + github.com/prometheus/client_model v0.5.0 // indirect + github.com/prometheus/common v0.45.0 // indirect + github.com/prometheus/procfs v0.12.0 // indirect + github.com/prometheus/tsdb v0.10.0 // indirect + github.com/rivo/uniseg v0.4.7 // indirect + github.com/rjeczalik/notify v0.9.3 // indirect + github.com/rs/cors v1.11.0 // indirect + github.com/russross/blackfriday/v2 v2.1.0 // indirect + 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/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe // 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 + github.com/yusufpapurcu/wmi v1.2.3 // indirect + golang.org/x/crypto v0.35.0 // indirect + golang.org/x/net v0.25.0 // indirect + golang.org/x/sync v0.11.0 // indirect + golang.org/x/sys v0.30.0 // indirect + golang.org/x/text v0.22.0 // indirect + golang.org/x/time v0.5.0 // indirect + google.golang.org/protobuf v1.33.0 // indirect + gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect + gopkg.in/urfave/cli.v1 v1.20.0 // indirect + rsc.io/tmplfunc v0.0.3 // indirect +) diff --git a/token-price-oracle/go.sum b/token-price-oracle/go.sum new file mode 100644 index 000000000..a0b161877 --- /dev/null +++ b/token-price-oracle/go.sum @@ -0,0 +1,342 @@ +github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= +github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= +github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= +github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= +github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuyumcjzFXgccqObfd/Ljyb9UuFJ6TxHnclSeseNhc= +github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156 h1:eMwmnE/GDgah4HI848JfFxHt+iPb26b4zyfspmqY0/8= +github.com/allegro/bigcache v1.2.1-0.20190218064605-e24eb225f156/go.mod h1:Cb/ax3seSYIx7SuZdm2G2xzfwmv3TPSk2ucNfQESPXM= +github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= +github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= +github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= +github.com/bits-and-blooms/bitset v1.20.0 h1:2F+rfL86jE2d/bmw7OhqUg2Sj/1rURkBn3MdfoPyRVU= +github.com/bits-and-blooms/bitset v1.20.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= +github.com/btcsuite/btcd/btcec/v2 v2.2.1 h1:xP60mv8fvp+0khmrN0zTdPC3cNm24rfeE6lh2R/Yv3E= +github.com/btcsuite/btcd/btcec/v2 v2.2.1/go.mod h1:9/CSmJxmuvqzX9Wh2fXMWToLOHhPd11lSPuIupwTkI8= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1 h1:q0rUy8C/TYNBQS1+CGKw68tLOFYSNEs0TFnxxnS9+4U= +github.com/btcsuite/btcd/chaincfg/chainhash v1.0.1/go.mod h1:7SFka0XMvUgj3hfZtydOrQY2mwhPclbT2snogU7SQQc= +github.com/cespare/cp v0.1.0 h1:SE+dxFebS7Iik5LK0tsi1k9ZCxEaFX4AjQmoyA+1dJk= +github.com/cespare/cp v0.1.0/go.mod h1:SOGHArjBr4JWaSDEVpWpo/hNg6RoKrls6Oh40hiwW+s= +github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= +github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44= +github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= +github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= +github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= +github.com/consensys/bavard v0.1.27 h1:j6hKUrGAy/H+gpNrpLU3I26n1yc+VMGmd6ID5+gAhOs= +github.com/consensys/bavard v0.1.27/go.mod h1:k/zVjHHC4B+PQy1Pg7fgvG3ALicQw540Crag8qx+dZs= +github.com/consensys/gnark-crypto v0.16.0 h1:8Dl4eYmUWK9WmlP1Bj6je688gBRJCJbT8Mw4KoTAawo= +github.com/consensys/gnark-crypto v0.16.0/go.mod h1:Ke3j06ndtPTVvo++PhGNgvm+lgpLvzbcE2MqljY7diU= +github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo= +github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/crate-crypto/go-eth-kzg v1.4.0 h1:WzDGjHk4gFg6YzV0rJOAsTK4z3Qkz5jd4RE3DAvPFkg= +github.com/crate-crypto/go-eth-kzg v1.4.0/go.mod h1:J9/u5sWfznSObptgfa92Jq8rTswn6ahQWEuiLHOjCUI= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM= +github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= +github.com/deckarep/golang-set v1.8.0 h1:sk9/l/KqpunDwP7pSjUg0keiOOLEnOBHzykLrsPppp4= +github.com/deckarep/golang-set v1.8.0/go.mod h1:5nI87KwE7wgsBU1F4GKAw2Qod7p5kyS383rP6+o6qqo= +github.com/decred/dcrd/crypto/blake256 v1.0.1 h1:7PltbUIQB7u/FfZ39+DGa/ShuMyJ5ilcvdfma9wOH6Y= +github.com/decred/dcrd/crypto/blake256 v1.0.1/go.mod h1:2OfgNZ5wDpcsFmHmCK5gZTPcCXqlm2ArzUIkw9czNJo= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 h1:8UrgZ3GkP4i/CLijOJx79Yu+etlyjdBU4sfcs2WYQMs= +github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3lJL149eHGSe9Jvczhzjo/0= +github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= +github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= +github.com/ethereum/c-kzg-4844/v2 v2.1.5 h1:aVtoLK5xwJ6c5RiqO8g8ptJ5KU+2Hdquf6G3aXiHh5s= +github.com/ethereum/c-kzg-4844/v2 v2.1.5/go.mod h1:u59hRTTah4Co6i9fDWtiCjTrblJv0UwsqZKCc0GfgUs= +github.com/ethereum/go-ethereum v1.10.26 h1:i/7d9RBBwiXCEuyduBQzJw/mKmnvzsN14jqBmytw72s= +github.com/ethereum/go-ethereum v1.10.26/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= +github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= +github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= +github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= +github.com/fsnotify/fsnotify v1.6.0 h1:n+5WquG0fcWoWp6xPWfHdbskMCQaFnG6PfBrh1Ky4HY= +github.com/fsnotify/fsnotify v1.6.0/go.mod h1:sl3t1tCWJFWoRz9R8WJCbQihKKwmorjAbSClcnxKAGw= +github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 h1:f6D9Hr8xV8uYKlyuj8XIruxlh9WjVjdh1gIicAS7ays= +github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08/go.mod h1:x7DCsMOv1taUwEWCzT4cmDeAkigA5/QCwUodaVOe8Ww= +github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= +github.com/go-kit/kit v0.12.0 h1:e4o3o3IsBfAKQh5Qbbiqyfu97Ku7jrO/JbohvztANh4= +github.com/go-kit/kit v0.12.0/go.mod h1:lHd+EkCZPIwYItmGDDRdhinkzX2A1sj+M9biaEaizzs= +github.com/go-kit/log v0.2.1 h1:MRVx0/zhvdseW+Gza6N9rVzU/IVzaeE1SFI4raAhmBU= +github.com/go-kit/log v0.2.1/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= +github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= +github.com/go-logfmt/logfmt v0.6.0 h1:wGYYu3uicYdqXVgoYbvnkrPVXkuLM1p1ifugDMEdRi4= +github.com/go-logfmt/logfmt v0.6.0/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= +github.com/go-ole/go-ole v1.2.6/go.mod h1:pprOEPIfldk/42T2oK7lQ4v4JSDwmV0As9GaiUsvbm0= +github.com/go-ole/go-ole v1.3.0 h1:Dt6ye7+vXGIKZ7Xtk4s6/xVdGDQynvom7xCFEdWr6uE= +github.com/go-ole/go-ole v1.3.0/go.mod h1:5LS6F96DhAwUc7C+1HLexzMXY1xGRSryjyPPKW6zv78= +github.com/go-resty/resty/v2 v2.13.1 h1:x+LHXBI2nMB1vqndymf26quycC4aggYJ7DECYbiz03g= +github.com/go-resty/resty/v2 v2.13.1/go.mod h1:GznXlLxkq6Nh4sU59rPmUw3VtgpO3aS96ORAI6Q7d+0= +github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= +github.com/go-stack/stack v1.8.1 h1:ntEHSVwIt7PNXNpgPmVfMrNhLtgjlmnZha2kOpuRiDw= +github.com/go-stack/stack v1.8.1/go.mod h1:dcoOX6HbPZSZptuspn9bctJ+N/CnF5gGygcUP3XYfe4= +github.com/go-task/slim-sprig v0.0.0-20210107165309-348f09dbbbc0/go.mod h1:fyg7847qk6SyHyPtNmDHnmrv/HOrqktSC+C9fM+CJOE= +github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= +github.com/golang-jwt/jwt/v4 v4.5.0 h1:7cYmW1XlMY7h7ii7UhUyChSgS5wUJEnm9uZVTGqOWzg= +github.com/golang-jwt/jwt/v4 v4.5.0/go.mod h1:m21LjoU+eqJr34lmDMbreY2eSTRJ1cv77w39/MY0Ch0= +github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/protobuf v1.4.0-rc.1/go.mod h1:ceaxUfeHdC40wWswd/P6IGgMaK3YpKi5j83Wpe3EHw8= +github.com/golang/protobuf v1.4.0-rc.1.0.20200221234624-67d41d38c208/go.mod h1:xKAWHe0F5eneWXFV3EuXVDTCmh+JuBKY0li0aMyXATA= +github.com/golang/protobuf v1.4.0-rc.2/go.mod h1:LlEzMj4AhA7rCAGe4KMBDvJI+AwstrUpVNzEA03Pprs= +github.com/golang/protobuf v1.4.0-rc.4.0.20200313231945-b860323f09d0/go.mod h1:WU3c8KckQ9AFe+yFwt9sWVRKCVIyN9cPHBJSNnbL67w= +github.com/golang/protobuf v1.4.0/go.mod h1:jodUvKwWbYaEsadDk5Fwe5c77LiNKVO9IDvqG2KuDX0= +github.com/golang/protobuf v1.4.2/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw735rRwI= +github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= +github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb h1:PBC98N2aIaM3XXiurYmW7fx4GZkL8feAMVq7nEjURHk= +github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/google/go-cmp v0.3.0/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.3.1/go.mod h1:8QqcDgzrUqlUb/G2PQTWiueGozuR1884gddMywk6iLU= +github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= +github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= +github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= +github.com/google/pprof v0.0.0-20210407192527-94a9f03dee38/go.mod h1:kpwsk12EmLew5upagYY7GY0pfYCcupk39gWOCRROcvE= +github.com/google/subcommands v1.2.0/go.mod h1:ZjhPrFU+Olkh9WazFPsl27BQ4UPiG37m3yTrtFlrHVk= +github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= +github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= +github.com/gorilla/websocket v1.5.1 h1:gmztn0JnHVt9JZquRuzLw3g4wouNVzKL15iLr/zn/QY= +github.com/gorilla/websocket v1.5.1/go.mod h1:x3kM2JMyaluk02fnUJpQuwD2dCS5NDG2ZHL0uE0tcaY= +github.com/hashicorp/go-bexpr v0.1.13 h1:HNwp7vZrMpRq8VZXj8VF90LbZpRjQQpim1oJF0DgSwg= +github.com/hashicorp/go-bexpr v0.1.13/go.mod h1:gN7hRKB3s7yT+YvTdnhZVLTENejvhlkZ8UE4YVBS+Q8= +github.com/hashicorp/golang-lru v1.0.2 h1:dV3g9Z/unq5DpblPpw+Oqcv4dU/1omnb4Ok8iPY6p1c= +github.com/hashicorp/golang-lru v1.0.2/go.mod h1:iADmTwqILo4mZ8BN3D2Q6+9jd8WM5uGBxy+E8yxSoD4= +github.com/holiman/bloomfilter/v2 v2.0.3 h1:73e0e/V0tCydx14a0SCYS/EWCxgwLZ18CZcZKVu0fao= +github.com/holiman/bloomfilter/v2 v2.0.3/go.mod h1:zpoh+gs7qcpqrHr3dB55AMiJwo0iURXE7ZOP9L9hSkA= +github.com/holiman/uint256 v1.2.4 h1:jUc4Nk8fm9jZabQuqr2JzednajVmBpC+oiTiXZJEApU= +github.com/holiman/uint256 v1.2.4/go.mod h1:EOMSn4q6Nyt9P6efbI3bueV4e1b3dGlUCXeiRV4ng7E= +github.com/hpcloud/tail v1.0.0/go.mod h1:ab1qPbhIpdTxEkNHXyeSf5vhxWSCs/tWer42PpOxQnU= +github.com/huin/goupnp v1.3.0 h1:UvLUlWDNpoUdYzb2TCn+MuTWtcjXKSza2n6CBdQ0xXc= +github.com/huin/goupnp v1.3.0/go.mod h1:gnGPsThkYa7bFi/KWmEysQRf48l2dvR5bxr2OFckNX8= +github.com/ianlancetaylor/demangle v0.0.0-20200824232613-28f6c0f3b639/go.mod h1:aSSvb/t6k1mPoxDqO4vJh6VOCGPwU4O0C2/Eqndh1Sc= +github.com/iden3/go-iden3-crypto v0.0.16 h1:zN867xiz6HgErXVIV/6WyteGcOukE9gybYTorBMEdsk= +github.com/iden3/go-iden3-crypto v0.0.16/go.mod h1:dLpM4vEPJ3nDHzhWFXDjzkn1qHoBeOT/3UEhXsEsP3E= +github.com/jackpal/go-nat-pmp v1.0.2 h1:KzKSgb7qkJvOUTqYl9/Hg/me3pWgBmERKrTGD7BdWus= +github.com/jackpal/go-nat-pmp v1.0.2/go.mod h1:QPH045xvCAeXUZOxsnwmrtiCoxIr9eob+4orBN1SBKc= +github.com/json-iterator/go v1.1.6/go.mod h1:+SdeFBvtyEkXs7REEP0seUULqWtbJapLOCVDaaPEHmU= +github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= +github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= +github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFBFZlji/RkVcI2GknAs/DXo4wKdlNEc= +github.com/leanovate/gopter v0.2.11 h1:vRjThO1EKPb/1NsDXuDrzldR28RLkBflWYcU9CvzWu4= +github.com/leanovate/gopter v0.2.11/go.mod h1:aK3tzZP/C+p1m3SPRE4SYZFGP7jjkuSI4f7Xvpt0S9c= +github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= +github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= +github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= +github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= +github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= +github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= +github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= +github.com/mitchellh/mapstructure v1.4.1/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyuac5Z2hdY= +github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= +github.com/mitchellh/pointerstructure v1.2.1 h1:ZhBBeX8tSlRpu/FFhXH4RC4OJzFlqsQhoHZAz4x7TIw= +github.com/mitchellh/pointerstructure v1.2.1/go.mod h1:BRAsLI5zgXmw97Lf6s25bs8ohIXc3tViBH44KcwB2g4= +github.com/mmcloughlin/addchain v0.4.0 h1:SobOdjm2xLj1KkXN5/n0xTIWyZA2+s99UCY1iPfkHRY= +github.com/mmcloughlin/addchain v0.4.0/go.mod h1:A86O+tHqZLMNO4w6ZZ4FlVQEadcoqkyU72HC5wJ4RlU= +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.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.20260211074551-4f0f6e6bd141 h1:A8eygErKU6WKMipGWIemzwLeYkIGLd9yb/Ry3x+J9PQ= +github.com/morph-l2/go-ethereum v1.10.14-0.20260211074551-4f0f6e6bd141/go.mod h1:nkVzHjQWCOjvukQW8ittlwX+Xz9gmVHrP7mUi7zoHTs= +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= +github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= +github.com/oklog/ulid v1.3.1/go.mod h1:CirwcVhetQ6Lv90oh/F+FBtV6XMibvdAFo93nm5qn4U= +github.com/olekukonko/tablewriter v0.0.5 h1:P2Ga83D34wi1o9J6Wh1mRuqd4mF/x/lgBS7N7AbDhec= +github.com/olekukonko/tablewriter v0.0.5/go.mod h1:hPp6KlRPjbx+hW8ykQs1w3UBbZlj6HuIJcUGPhkA7kY= +github.com/onsi/ginkgo v1.6.0/go.mod h1:lLunBs/Ym6LB5Z9jYTR76FiuTmxDTDusOGeTQH+WWjE= +github.com/onsi/ginkgo v1.12.1/go.mod h1:zj2OWP4+oCPe1qIXoGWkgMRwljMUYCdkwsT2108oapk= +github.com/onsi/ginkgo v1.16.4/go.mod h1:dX+/inL/fNMqNlz0e9LfyB9TswhZpCVdJM/Z6Vvnwo0= +github.com/onsi/ginkgo v1.16.5 h1:8xi0RTUf59SOSfEtZMvwTvXYMzG4gV23XVHOZiXNtnE= +github.com/onsi/ginkgo v1.16.5/go.mod h1:+E8gABHa3K6zRBolWtd+ROzc/U5bkGt0FwiG042wbpU= +github.com/onsi/ginkgo/v2 v2.1.3/go.mod h1:vw5CSIxN1JObi/U8gcbwft7ZxR2dgaR70JSE3/PpL4c= +github.com/onsi/gomega v1.7.1/go.mod h1:XdKZgCCFLUoM/7CFJVPcG8C1xQ1AJ0vpAezJrB7JYyY= +github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1ybHNo= +github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= +github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= +github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= +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= +github.com/prometheus/client_golang v0.9.1/go.mod h1:7SWBe2y4D6OKWSNQJUaRYU/AaXPKyh/dDVn+NZz0KFw= +github.com/prometheus/client_golang v1.0.0/go.mod h1:db9x61etRT2tGnBNRi70OPL5FsnadC4Ky3P0J6CfImo= +github.com/prometheus/client_golang v1.17.0 h1:rl2sfwZMtSthVU752MqfjQozy7blglC+1SOtjMAMh+Q= +github.com/prometheus/client_golang v1.17.0/go.mod h1:VeL+gMmOAxkS2IqfCq0ZmHSL+LjWfWDUmp1mBz9JgUY= +github.com/prometheus/client_model v0.0.0-20180712105110-5c3871d89910/go.mod h1:MbSGuTsp3dbXC40dX6PRTWyKYBIrTGTE9sqQNg2J8bo= +github.com/prometheus/client_model v0.0.0-20190129233127-fd36f4220a90/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= +github.com/prometheus/client_model v0.5.0 h1:VQw1hfvPvk3Uv6Qf29VrPF32JB6rtbgI6cYPYQjL0Qw= +github.com/prometheus/client_model v0.5.0/go.mod h1:dTiFglRmd66nLR9Pv9f0mZi7B7fk5Pm3gvsjB5tr+kI= +github.com/prometheus/common v0.4.1/go.mod h1:TNfzLD0ON7rHzMJeJkieUDPYmFC7Snx/y86RQel1bk4= +github.com/prometheus/common v0.45.0 h1:2BGz0eBc2hdMDLnO/8n0jeB3oPrt2D08CekT0lneoxM= +github.com/prometheus/common v0.45.0/go.mod h1:YJmSTw9BoKxJplESWWxlbyttQR4uaEcGyv9MZjVOJsY= +github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R/oaqEKCNdg8wHV1ftS6bRYblBhIjjI8uT2IGk= +github.com/prometheus/procfs v0.0.2/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= +github.com/prometheus/procfs v0.12.0 h1:jluTpSng7V9hY0O2R9DzzJHYb2xULk9VTR1V1R/k6Bo= +github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3cnaOZAZEfOo= +github.com/prometheus/tsdb v0.10.0 h1:If5rVCMTp6W2SiRAQFlbpJNgVlgMEd+U2GZckwK38ic= +github.com/prometheus/tsdb v0.10.0/go.mod h1:oi49uRhEe9dPUTlS3JRZOwJuVi6tmh10QSgwXEyGCt4= +github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rjeczalik/notify v0.9.3 h1:6rJAzHTGKXGj76sbRgDiDcYj/HniypXmSJo1SWakZeY= +github.com/rjeczalik/notify v0.9.3/go.mod h1:gF3zSOrafR9DQEWSE8TjfI9NkooDxbyT4UgRGKZA0lc= +github.com/rs/cors v1.11.0 h1:0B9GE/r9Bc2UxRMMtymBkHTenPkHDv0CW4Y98GBY+po= +github.com/rs/cors v1.11.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= +github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= +github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= +github.com/scroll-tech/zktrie v0.8.4 h1:UagmnZ4Z3ITCk+aUq9NQZJNAwnWl4gSxsLb2Nl7IgRE= +github.com/scroll-tech/zktrie v0.8.4/go.mod h1:XvNo7vAk8yxNyTjBDj5WIiFzYW4bx/gJ78+NK6Zn6Uk= +github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= +github.com/shirou/gopsutil v3.21.11+incompatible/go.mod h1:5b4v6he4MtMOwMlS0TUMTu2PcXUg8+E1lC7eC3UO/RA= +github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= +github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ= +github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ= +github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= +github.com/status-im/keycard-go v0.3.2 h1:YusIF/bHx6YZis8UTOJrpZFnTs4IkRBdmJXqdiXkpFE= +github.com/status-im/keycard-go v0.3.2/go.mod h1:wlp8ZLbsmrF6g6WjugPAx+IzoLrkdf9+mHxBEeo3Hbg= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= +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/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= +github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= +github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= +github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= +github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe h1:nbdqkIGOGfUAD54q1s2YBcBz/WcsxCO9HUQ4aGV5hUw= +github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= +github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= +github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4= +github.com/tklauser/go-sysconf v0.3.13/go.mod h1:zwleP4Q4OehZHGn4CYZDipCgg9usW5IJePewFCGVEa0= +github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr4= +github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY= +github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= +github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= +github.com/urfave/cli v1.22.17 h1:SYzXoiPfQjHBbkYxbew5prZHS1TOLT3ierW8SYLqtVQ= +github.com/urfave/cli v1.22.17/go.mod h1:b0ht0aqgH/6pBYzzxURyrM4xXNgsoT/n2ZzwQiEhNVo= +github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= +github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= +github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= +github.com/yusufpapurcu/wmi v1.2.3/go.mod h1:SBZ9tNy3G9/m5Oi98Zks0QjeHVDvuK0qfxQmPyzfmi0= +golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= +golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= +golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= +golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs= +golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ= +golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= +golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= +golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= +golang.org/x/net v0.0.0-20180906233101-161cd47e91fd/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20181114220301-adae6a3d119a/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= +golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= +golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= +golang.org/x/net v0.0.0-20200520004742-59133d7f0dd7/go.mod h1:qpuaurCH72eLCgpAm/N6yyVIVM9cpaDIP3A8BGJEC5A= +golang.org/x/net v0.0.0-20201021035429-f5854403a974/go.mod h1:sp8m0HH+o8qH0wwXwYZr8TS3Oi6o0r6Gce1SSxlDquU= +golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg= +golang.org/x/net v0.0.0-20210428140749-89ef3d95e781/go.mod h1:OJAsFXCWl8Ukc7SiCT/9KSuxbyM7479/AVlXFRxuMCk= +golang.org/x/net v0.0.0-20220225172249-27dd8689420f/go.mod h1:CfG3xpIq0wQ8r1q4Su4UZFWDARRcnwPjda9FqA0JpMk= +golang.org/x/net v0.0.0-20220607020251-c690dde0001d/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c= +golang.org/x/net v0.6.0/go.mod h1:2Tu9+aMcznHK/AK1HMvgo6xiTLG5rD5rZLDS+rp2Bjs= +golang.org/x/net v0.10.0/go.mod h1:0qNGK6F8kojg2nk9dLZ2mShWaEBan6FAoqfSigmmuDg= +golang.org/x/net v0.21.0/go.mod h1:bIjVDfnllIU7BJ2DNgfnXvpSvtn8VRwhlsaeUTyUS44= +golang.org/x/net v0.25.0 h1:d/OCCoBEUq33pjydKrGQhw7IlUPI2Oylr+8qLx49kac= +golang.org/x/net v0.25.0/go.mod h1:JkAGAh7GEvH74S6FOH42FLoXpXbE/aqXSrIQjXgsiwM= +golang.org/x/sync v0.0.0-20180314180146-1d60e4601c6f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181108010431-42b317875d0f/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= +golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= +golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= +golang.org/x/term v0.8.0/go.mod h1:xPskH00ivmX89bAKVGSKKtLOWNx2+17Eiy94tnKShWo= +golang.org/x/term v0.17.0/go.mod h1:lLRBjIVuehSbZlaOtGMbcMncT+aqLLLmKrsjNrUguwk= +golang.org/x/term v0.20.0/go.mod h1:8UkIAJTvZgivsXaD6/pH6U9ecQzZ45awqEOzuCvwpFY= +golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= +golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= +golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= +golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= +golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= +golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= +golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= +golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= +golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= +golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= +golang.org/x/tools v0.0.0-20201224043029-2b0845dc783e/go.mod h1:emZCQorbCU4vsT4fOWvOPXz4eW1wZW4PmDk9uLelYpA= +golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc= +golang.org/x/tools v0.6.0/go.mod h1:Xwgl3UAJ/d3gWutnCtw505GrjyAbvKui8lOU390QaIU= +golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191011141410-1b5146add898/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20191204190536-9bdfabe68543/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20200804184101-5ec99f83aff1/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0= +golang.org/x/xerrors v0.0.0-20220517211312-f3a8303e98df/go.mod h1:K8+ghG5WaK9qNqU5K3HdILfMLy1f3aNYFI/wnl100a8= +google.golang.org/protobuf v0.0.0-20200109180630-ec00e32a8dfd/go.mod h1:DFci5gLYBciE7Vtevhsrf46CRTquxDuWsQurQQe4oz8= +google.golang.org/protobuf v0.0.0-20200221191635-4d8936d0db64/go.mod h1:kwYJMbMJ01Woi6D6+Kah6886xMZcty6N08ah7+eCXa0= +google.golang.org/protobuf v0.0.0-20200228230310-ab0ca4ff8a60/go.mod h1:cfTl7dwQJ+fmap5saPgwCLgHXTUD7jkjRqWcaiX5VyM= +google.golang.org/protobuf v1.20.1-0.20200309200217-e05f789c0967/go.mod h1:A+miEFZTKqfCUM6K7xSMQL9OKL/b6hQv+e19PK+JZNE= +google.golang.org/protobuf v1.21.0/go.mod h1:47Nbq4nVaFHyn7ilMalzfO3qCViNmqZ2kzikPIcrTAo= +google.golang.org/protobuf v1.23.0/go.mod h1:EGpADcykh3NcUnDUJcl1+ZksZNG86OlYog2l/sGQquU= +google.golang.org/protobuf v1.26.0-rc.1/go.mod h1:jlhhOSvTdKEhbULTjvd4ARK9grFBp09yW+WbY/TyQbw= +google.golang.org/protobuf v1.26.0/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= +google.golang.org/protobuf v1.33.0 h1:uNO2rsAINq/JlFpSdYEKIZ0uKD/R9cpdv0T+yoGwGmI= +google.golang.org/protobuf v1.33.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gopkg.in/alecthomas/kingpin.v2 v2.2.6/go.mod h1:FMv+mEhP44yOT+4EoQTLFTRgOQ1FBLkstjWtayDeSgw= +gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/fsnotify.v1 v1.4.7/go.mod h1:Tz8NjZHkW78fSQdbUxIjBTcgA1z1m8ZHf0WmKUhAMys= +gopkg.in/natefinch/lumberjack.v2 v2.2.1 h1:bBRl1b0OH9s/DuPhuXpNl+VtCaJXFZ5/uEFST95x9zc= +gopkg.in/natefinch/lumberjack.v2 v2.2.1/go.mod h1:YD8tP3GAjkrDg1eZH7EGmyESg/lsYskCTPBJVb9jqSc= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce h1:+JknDZhAj8YMt7GC73Ei8pv4MzjDUNPHgQWJdtMAaDU= +gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce/go.mod h1:5AcXVHNjg+BDxry382+8OKon8SEWiKktQR07RKPsv1c= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7 h1:uRGJdciOHaEIrze2W8Q3AKkepLTh2hOroT7a+7czfdQ= +gopkg.in/tomb.v1 v1.0.0-20141024135613-dd632973f1e7/go.mod h1:dt/ZhP58zS4L8KSrWDmTeBkI65Dw0HsyUHuEVlX15mw= +gopkg.in/urfave/cli.v1 v1.20.0 h1:NdAVW6RYxDif9DhDHaAortIu956m2c0v+09AZBPTbE0= +gopkg.in/urfave/cli.v1 v1.20.0/go.mod h1:vuBzUtMdQeixQj8LVd+/98pzhxNGQoyuPBlsXHOQNO0= +gopkg.in/yaml.v2 v2.2.1/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.2.4/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.3.0/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= +gopkg.in/yaml.v2 v2.4.0 h1:D8xgwECY7CYvx+Y2n4sBz93Jn9JRvxdiyyo8CTfuKaY= +gopkg.in/yaml.v2 v2.4.0/go.mod h1:RDklbk79AGWmwhnvt/jBztapEOGDOx6ZbXqjP6csGnQ= +gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= +gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +rsc.io/tmplfunc v0.0.3 h1:53XFQh69AfOa8Tw0Jm7t+GV7KZhOi6jzsCzTtKbMvzU= +rsc.io/tmplfunc v0.0.3/go.mod h1:AG3sTPzElb1Io3Yg4voV9AGZJuleGAwaVRxL9M49PhA= diff --git a/token-price-oracle/local.sh b/token-price-oracle/local.sh new file mode 100644 index 000000000..609390ce0 --- /dev/null +++ b/token-price-oracle/local.sh @@ -0,0 +1,23 @@ +#!/bin/bash + +# Local development startup script for token-price-oracle + +./build/bin/token-price-oracle \ + --l2-eth-rpc http://localhost:8545 \ + --private-key 0xac0974bec39a17e36ba4a6b4d238ff944bacb478cbed5efcae784d7bf4f2ff80 \ + --price-update-interval 30s \ + --price-threshold 100 \ + --price-feed-priority bitget \ + --token-mapping-bitget "1:BGBUSDT,2:BTCUSDT,3:\$1.0" \ + --bitget-api-base-url https://api.bitget.com \ + --log-level info \ + --metrics-server-enable + +# Price threshold examples (in basis points): +# 1 bps = 0.01%, 10 bps = 0.1%, 100 bps = 1%, 500 bps = 5%, 1000 bps = 10% + +# Token mapping format: +# - Regular tokens: tokenID:SYMBOL (e.g., 1:BGBUSDT, 2:BTCUSDT) +# - Stablecoins: tokenID:$PRICE (e.g., 3:$1.0 for USDT pegged to $1 USD) +# Note: Use \$ in bash to escape the dollar sign + diff --git a/token-price-oracle/metrics/metrics.go b/token-price-oracle/metrics/metrics.go new file mode 100644 index 000000000..e03b6be39 --- /dev/null +++ b/token-price-oracle/metrics/metrics.go @@ -0,0 +1,83 @@ +package metrics + +import ( + "net/http" + "time" + + "github.com/prometheus/client_golang/prometheus" + "github.com/prometheus/client_golang/prometheus/promhttp" + "github.com/sirupsen/logrus" +) + +var ( + // UpdateErrors update error count + UpdateErrors = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Name: "update_errors_total", + Help: "Total number of update errors", + }, + []string{"type"}, // error type: basefee, scalar, price + ) + + // AccountBalance tracks account balance in ETH + AccountBalance = prometheus.NewGauge( + prometheus.GaugeOpts{ + Name: "account_balance_eth", + Help: "Account balance in ETH", + }, + ) + + // LastSuccessfulUpdateTimestamp records the Unix timestamp of the last successful update cycle + // A successful update includes: prices updated on-chain OR prices skipped (below threshold) + // This helps monitor if the oracle is running normally + LastSuccessfulUpdateTimestamp = prometheus.NewGauge( + prometheus.GaugeOpts{ + Name: "last_successful_update_timestamp", + Help: "Unix timestamp of the last successful price update cycle (includes both updates and skips)", + }, + ) + + // UpdatesTotal counts total number of successful update cycles + UpdatesTotal = prometheus.NewCounterVec( + prometheus.CounterOpts{ + Name: "updates_total", + Help: "Total number of successful update cycles", + }, + []string{"type"}, // type: "updated" or "skipped" + ) +) + +// init registers all metrics +func init() { + prometheus.MustRegister(UpdateErrors) + prometheus.MustRegister(AccountBalance) + prometheus.MustRegister(LastSuccessfulUpdateTimestamp) + prometheus.MustRegister(UpdatesTotal) + + // Initialize metrics with default values to avoid nil pointer issues in alerting systems + // Set initial timestamp to current time (program start time) + LastSuccessfulUpdateTimestamp.Set(float64(time.Now().Unix())) + // Initialize counter labels to ensure they exist from the start + // Must call Add(0) to actually create the metric, WithLabelValues alone doesn't create it + UpdatesTotal.WithLabelValues("updated").Add(0) + UpdatesTotal.WithLabelValues("skipped").Add(0) + // Initialize error counter labels + UpdateErrors.WithLabelValues("price").Add(0) + // Note: AccountBalance is NOT initialized here to avoid triggering low balance alerts + // It will be set with the real value on the first update cycle +} + +// StartMetricsServer starts metrics HTTP server +func StartMetricsServer(address string) error { + logrus.WithField("address", address).Info("Starting metrics server") + + http.Handle("/metrics", promhttp.Handler()) + + // Health check endpoint + http.HandleFunc("/health", func(w http.ResponseWriter, r *http.Request) { + w.WriteHeader(http.StatusOK) + w.Write([]byte("OK")) + }) + + return http.ListenAndServe(address, nil) +} diff --git a/token-price-oracle/updater/factory.go b/token-price-oracle/updater/factory.go new file mode 100644 index 000000000..18a54c205 --- /dev/null +++ b/token-price-oracle/updater/factory.go @@ -0,0 +1,134 @@ +package updater + +import ( + "fmt" + + "github.com/morph-l2/go-ethereum/common" + "github.com/morph-l2/go-ethereum/log" + "morph-l2/bindings/bindings" + "morph-l2/token-price-oracle/client" + "morph-l2/token-price-oracle/config" +) + +// CreatePriceUpdater creates price updater if conditions are met +func CreatePriceUpdater( + cfg *config.Config, + l2Client *client.L2Client, + txManager *TxManager, +) (*PriceUpdater, error) { + if cfg.L2TokenRegistryAddr == (common.Address{}) { + return nil, fmt.Errorf("price update enabled but token registry address not set") + } + + // Create registry contract + registryContract, err := bindings.NewL2TokenRegistry(cfg.L2TokenRegistryAddr, l2Client.GetClient()) + if err != nil { + return nil, fmt.Errorf("failed to create TokenRegistry contract: %w", err) + } + log.Info("TokenRegistry contract bound", "address", cfg.L2TokenRegistryAddr.Hex()) + + // Create price feeds with fallback support + priceFeed, err := createFallbackPriceFeed(cfg) + if err != nil { + return nil, fmt.Errorf("failed to create price feed: %w", err) + } + + // Collect all token mappings from configured feeds + allTokenMappings := make(map[uint16]string) + for _, feedType := range cfg.PriceFeedPriority { + if mapping, exists := cfg.TokenMappings[feedType]; exists { + for tokenID, symbol := range mapping { + // Use first mapping found (highest priority) + if _, alreadyMapped := allTokenMappings[tokenID]; !alreadyMapped { + allTokenMappings[tokenID] = symbol + } + } + } + } + + // Create price updater + priceUpdater := NewPriceUpdater( + l2Client, + registryContract, + priceFeed, + txManager, + allTokenMappings, + cfg.PriceUpdateInterval, + cfg.PriceThreshold, + ) + + log.Info("Price updater configured", + "price_feed_priority", cfg.PriceFeedPriority, + "token_mappings", allTokenMappings, + "interval", cfg.PriceUpdateInterval, + "threshold", cfg.PriceThreshold) + + return priceUpdater, nil +} + +// createFallbackPriceFeed creates price feed with fallback support +func createFallbackPriceFeed(cfg *config.Config) (client.PriceFeed, error) { + if len(cfg.PriceFeedPriority) == 0 { + return nil, fmt.Errorf("no price feeds configured in priority list") + } + + var feeds []client.PriceFeed + var feedNames []string + + for _, feedType := range cfg.PriceFeedPriority { + feed, name, err := createSinglePriceFeed(feedType, cfg) + if err != nil { + log.Warn("Failed to create price feed, skipping", + "feed_type", feedType, + "error", err.Error()) + continue + } + feeds = append(feeds, feed) + feedNames = append(feedNames, name) + } + + if len(feeds) == 0 { + return nil, fmt.Errorf("no valid price feeds could be created") + } + + if len(feeds) == 1 { + log.Info("Single price feed configured (no fallback)", "feed", feedNames[0]) + return feeds[0], nil + } + + log.Info("Fallback price feed configured with multiple sources", + "feeds", feedNames, + "priority", "first to last") + + return client.NewFallbackPriceFeed(feeds, feedNames), nil +} + +// createSinglePriceFeed creates a single price feed instance +func createSinglePriceFeed(feedType config.PriceFeedType, cfg *config.Config) (client.PriceFeed, string, error) { + switch feedType { + case config.PriceFeedTypeBitget: + mapping, exists := cfg.TokenMappings[config.PriceFeedTypeBitget] + if !exists || len(mapping) == 0 { + return nil, "", fmt.Errorf("bitget price feed requires token mapping, please configure --token-mapping-bitget") + } + feed := client.NewBitgetSDKPriceFeed(mapping, cfg.BitgetAPIBaseURL) + log.Info("Bitget price feed created", + "type", "bitget", + "base_url", cfg.BitgetAPIBaseURL, + "mapping", mapping) + return feed, "bitget", nil + + case config.PriceFeedTypeBinance: + // Binance price feed is not yet implemented + // This case should not be reached since Binance is not in ValidPriceFeedTypes + return nil, "", fmt.Errorf("binance price feed is not supported yet") + + default: + return nil, "", fmt.Errorf("unsupported price feed type: %s", feedType) + } +} + +// CreateTxManager creates transaction manager +func CreateTxManager(l2Client *client.L2Client) *TxManager { + return NewTxManager(l2Client) +} diff --git a/token-price-oracle/updater/token_price.go b/token-price-oracle/updater/token_price.go new file mode 100644 index 000000000..42503fe09 --- /dev/null +++ b/token-price-oracle/updater/token_price.go @@ -0,0 +1,450 @@ +package updater + +import ( + "context" + "fmt" + "math/big" + "sync" + "time" + + "morph-l2/bindings/bindings" + "morph-l2/token-price-oracle/client" + "morph-l2/token-price-oracle/config" + "morph-l2/token-price-oracle/metrics" + + "github.com/morph-l2/go-ethereum/accounts/abi/bind" + "github.com/morph-l2/go-ethereum/core/types" + "github.com/morph-l2/go-ethereum/log" +) + +// PriceUpdater handles token price updates +type PriceUpdater struct { + l2Client *client.L2Client + registryContract *bindings.L2TokenRegistry + priceFeed client.PriceFeed + txManager *TxManager + tokenMapping map[uint16]string // tokenID -> trading pair (e.g. 1 -> "BTCUSDT") + interval time.Duration + priceThreshold uint64 + stopChan chan struct{} + stopOnce sync.Once // ensures stopChan is closed only once +} + +// NewPriceUpdater creates a new price updater +func NewPriceUpdater( + l2Client *client.L2Client, + registryContract *bindings.L2TokenRegistry, + priceFeed client.PriceFeed, + txManager *TxManager, + tokenMapping map[uint16]string, + interval time.Duration, + priceThreshold uint64, +) *PriceUpdater { + return &PriceUpdater{ + l2Client: l2Client, + registryContract: registryContract, + priceFeed: priceFeed, + txManager: txManager, + tokenMapping: tokenMapping, + interval: interval, + priceThreshold: priceThreshold, + stopChan: make(chan struct{}), + } +} + +// Start starts the price updater +func (u *PriceUpdater) Start(ctx context.Context) error { + go func() { + log.Info("Price updater starting", "interval", u.interval) + ticker := time.NewTicker(u.interval) + defer ticker.Stop() + + if err := u.update(ctx); err != nil { + log.Error("Initial price update failed") + } + + for { + select { + case <-ctx.Done(): + log.Info("Price updater stopped by context") + return + case <-u.stopChan: + log.Info("Price updater stopped") + return + case <-ticker.C: + if err := u.update(ctx); err != nil { + log.Error("Failed to update prices") + metrics.UpdateErrors.WithLabelValues("price").Inc() + } + } + } + }() + return nil +} + +// Stop gracefully stops the updater +// This method is safe to call multiple times +func (u *PriceUpdater) Stop() error { + u.stopOnce.Do(func() { + close(u.stopChan) + log.Info("Price updater stop requested") + }) + return nil +} + +// update performs one price update +func (u *PriceUpdater) update(ctx context.Context) error { + defer func() { + if err := u.updateBalanceMetrics(ctx); err != nil { + log.Warn("Failed to update balance metrics", "error", err) + } + }() + + // Fetch token IDs from contract if not configured + tokenIDs, err := u.fetchTokenIDsFromContract(ctx) + if err != nil { + log.Error("Failed to fetch tokenIDs from contract, price updater will not start") + return err + } + + if len(tokenIDs) == 0 { + log.Warn("No tokens to update, skipping price update cycle") + return nil + } + + // Step 0: Filter out inactive tokens BEFORE fetching prices (to save API calls) + activeTokenIDs, tokenInfoMap := u.filterActiveTokens(ctx, tokenIDs) + if len(activeTokenIDs) == 0 { + log.Warn("No active tokens to update after filtering") + return nil + } + + // Step 1: Fetch new prices from feed (USD prices) - only for active tokens + tokenPrices, err := u.priceFeed.GetBatchTokenPrices(ctx, activeTokenIDs) + if err != nil { + return fmt.Errorf("failed to fetch token prices: %w", err) + } + + // Step 2: Calculate price ratios using pre-fetched tokenInfo (no extra contract calls) + newPriceRatios := make(map[uint16]*big.Int) + for tokenID, tokenPrice := range tokenPrices { + priceRatio, err := u.calculatePriceRatioWithInfo(tokenID, tokenPrice, tokenInfoMap[tokenID]) + if err != nil { + log.Warn("Failed to calculate price ratio, skipping", + "token_id", tokenID, + "error", err) + continue + } + newPriceRatios[tokenID] = priceRatio + } + + // Step 3: Fetch current prices from contract and filter prices that need updating + var tokenIDsToUpdate []uint16 + var pricesToUpdate []*big.Int + + callOpts := &bind.CallOpts{Context: ctx} + for tokenID, newPrice := range newPriceRatios { + if newPrice == nil || newPrice.Sign() == 0 { + log.Warn("Skipping zero price", + "token_id", tokenID) + continue + } + + // Fetch current price from contract (not from cache) + lastPrice, err := u.registryContract.GetTokenPrice(callOpts, tokenID) + if err != nil { + log.Warn("Failed to get current price from contract, will update anyway", + "token_id", tokenID, + "error", err) + tokenIDsToUpdate = append(tokenIDsToUpdate, tokenID) + pricesToUpdate = append(pricesToUpdate, newPrice) + continue + } + + // Check if price changed significantly + if lastPrice.Sign() > 0 { + // Calculate if price change exceeds threshold + if !u.shouldUpdatePrice(lastPrice, newPrice) { + log.Debug("Price change below threshold, skipping update", + "token_id", tokenID, + "last_price", lastPrice.String(), + "new_price", newPrice.String(), + "threshold", u.priceThreshold) + continue + } + + log.Info("Price change exceeds threshold, will update", + "token_id", tokenID, + "last_price", lastPrice.String(), + "new_price", newPrice.String()) + } else { + log.Info("First time update for token (no price in contract)", + "token_id", tokenID, + "new_price", newPrice.String()) + } + + tokenIDsToUpdate = append(tokenIDsToUpdate, tokenID) + pricesToUpdate = append(pricesToUpdate, newPrice) + } + + if len(tokenIDsToUpdate) == 0 { + log.Debug("No prices need updating (all changes below threshold)") + // Record as successful update cycle (skipped) + metrics.LastSuccessfulUpdateTimestamp.Set(float64(time.Now().Unix())) + metrics.UpdatesTotal.WithLabelValues("skipped").Inc() + return nil + } + + log.Info("Updating token prices", + "token_count", len(tokenIDsToUpdate), + "token_ids", tokenIDsToUpdate, + "active_tokens", len(activeTokenIDs), + "total_tokens", len(tokenIDs)) + + // Step 3: Update prices on L2 + receipt, err := u.txManager.SendTransaction(ctx, func(auth *bind.TransactOpts) (*types.Transaction, error) { + return u.registryContract.BatchUpdatePrices(auth, tokenIDsToUpdate, pricesToUpdate) + }) + + if err != nil { + log.Error("Failed to send transaction", "error", err) + return fmt.Errorf("failed to send batch update prices transaction: %w", err) + } + + if receipt == nil { + log.Error("Received nil receipt") + return fmt.Errorf("received nil receipt") + } + + if receipt.Status != types.ReceiptStatusSuccessful { + log.Error("Transaction failed on-chain", + "tx_hash", receipt.TxHash.Hex(), + "status", receipt.Status, + "gas_used", receipt.GasUsed) + return fmt.Errorf("transaction failed on-chain: %s", receipt.TxHash.Hex()) + } + + log.Info("Successfully updated token prices", + "tx_hash", receipt.TxHash.Hex(), + "gas_used", receipt.GasUsed, + "token_count", len(tokenIDsToUpdate)) + + // Step 5: Update metrics + // Record as successful update cycle (updated) + metrics.LastSuccessfulUpdateTimestamp.Set(float64(time.Now().Unix())) + metrics.UpdatesTotal.WithLabelValues("updated").Inc() + + for i, tokenID := range tokenIDsToUpdate { + log.Debug("Price updated", + "token_id", tokenID, + "price_ratio", pricesToUpdate[i].String()) + } + + return nil +} + +// TokenInfo is a cached token info from contract +type TokenInfo struct { + TokenAddress string + Decimals uint8 + Scale *big.Int + IsActive bool +} + +// filterActiveTokens filters out inactive tokens and returns active tokenIDs with their info +// This is called BEFORE fetching prices to save API calls +func (u *PriceUpdater) filterActiveTokens(ctx context.Context, tokenIDs []uint16) ([]uint16, map[uint16]*TokenInfo) { + callOpts := &bind.CallOpts{Context: ctx} + activeTokenIDs := make([]uint16, 0, len(tokenIDs)) + tokenInfoMap := make(map[uint16]*TokenInfo) + + for _, tokenID := range tokenIDs { + tokenInfo, err := u.registryContract.GetTokenInfo(callOpts, tokenID) + if err != nil { + log.Warn("Failed to get token info, skipping token", + "token_id", tokenID, + "error", err) + continue + } + + // Log and skip inactive tokens + if !tokenInfo.Info.IsActive { + log.Info("Token is inactive, skipping price update", + "token_id", tokenID, + "address", tokenInfo.Info.TokenAddress.Hex()) + continue + } + + // Cache token info for later use + tokenInfoMap[tokenID] = &TokenInfo{ + TokenAddress: tokenInfo.Info.TokenAddress.Hex(), + Decimals: tokenInfo.Info.Decimals, + Scale: tokenInfo.Info.Scale, + IsActive: tokenInfo.Info.IsActive, + } + activeTokenIDs = append(activeTokenIDs, tokenID) + + log.Debug("Token is active", + "token_id", tokenID, + "address", tokenInfo.Info.TokenAddress.Hex(), + "decimals", tokenInfo.Info.Decimals, + "scale", tokenInfo.Info.Scale.String()) + } + + if len(activeTokenIDs) < len(tokenIDs) { + log.Info("Filtered tokens by active status", + "total", len(tokenIDs), + "active", len(activeTokenIDs), + "skipped", len(tokenIDs)-len(activeTokenIDs)) + } + + return activeTokenIDs, tokenInfoMap +} + +// calculatePriceRatioWithInfo calculates the price ratio using pre-fetched token info +// Formula: priceRatio = tokenScale * tokenPriceUSD * 10^(18 - tokenDecimals) / ethPriceUSD +// We do multiplications first, then division at the end to avoid precision loss +func (u *PriceUpdater) calculatePriceRatioWithInfo(tokenID uint16, tokenPrice *client.TokenPrice, tokenInfo *TokenInfo) (*big.Int, error) { + // Validate input price data to prevent nil pointer panics + if tokenPrice == nil || tokenPrice.TokenPriceUSD == nil || tokenPrice.EthPriceUSD == nil { + return nil, fmt.Errorf("token price data missing for token %d", tokenID) + } + + if tokenInfo == nil { + return nil, fmt.Errorf("token info missing for token %d", tokenID) + } + + tokenScale := tokenInfo.Scale + tokenDecimals := tokenInfo.Decimals + + // Check ETH price is not zero + if tokenPrice.EthPriceUSD.Cmp(big.NewFloat(0)) == 0 { + return nil, fmt.Errorf("ETH price is zero") + } + + // Check token price is not zero or negative + if tokenPrice.TokenPriceUSD.Cmp(big.NewFloat(0)) <= 0 { + return nil, fmt.Errorf("invalid token price %s for token %d", tokenPrice.TokenPriceUSD.String(), tokenID) + } + + // Step 1: Start with tokenPriceUSD + priceRatio := new(big.Float).Set(tokenPrice.TokenPriceUSD) + + // Step 2: Multiply by tokenScale + tokenScaleFloat := new(big.Float).SetInt(tokenScale) + priceRatio.Mul(priceRatio, tokenScaleFloat) + + // Step 3: Multiply by 10^(18 - tokenDecimals) + // ETH has 18 decimals, so we need to adjust for token decimals + decimalAdjustment := new(big.Int).Exp(big.NewInt(10), big.NewInt(int64(18-tokenDecimals)), nil) + decimalAdjustmentFloat := new(big.Float).SetInt(decimalAdjustment) + priceRatio.Mul(priceRatio, decimalAdjustmentFloat) + + // Step 4: Finally divide by ethPriceUSD + priceRatio.Quo(priceRatio, tokenPrice.EthPriceUSD) + + // Convert to big.Int with precision check + priceRatioInt, accuracy := priceRatio.Int(nil) + if accuracy != big.Exact { + log.Warn("Price ratio conversion lost precision", + "token_id", tokenID, + "symbol", tokenPrice.Symbol, + "accuracy", accuracy.String(), + "float_value", priceRatio.String(), + "int_value", priceRatioInt.String()) + } + + log.Info("Calculated price ratio", + "token_id", tokenID, + "symbol", tokenPrice.Symbol, + "token_price_usd", tokenPrice.TokenPriceUSD.String(), + "eth_price_usd", tokenPrice.EthPriceUSD.String(), + "decimals", tokenDecimals, + "token_scale", tokenScale.String(), + "price_ratio", priceRatioInt.String()) + + return priceRatioInt, nil +} + +// updateBalanceMetrics queries and updates balance metrics +func (u *PriceUpdater) updateBalanceMetrics(ctx context.Context) error { + // Get account address + account := u.l2Client.WalletAddress() + + // Query ETH balance + ethBalance, err := u.l2Client.GetClient().BalanceAt(ctx, account, nil) + if err != nil { + return fmt.Errorf("failed to get ETH balance: %w", err) + } + + // Convert to ETH (wei to ETH) + ethBalanceFloat := new(big.Float).SetInt(ethBalance) + ethBalanceFloat.Quo(ethBalanceFloat, big.NewFloat(1e18)) + ethBalanceEth, _ := ethBalanceFloat.Float64() + + // Update ETH balance metric + metrics.AccountBalance.Set(ethBalanceEth) + + log.Info("Updated balance metrics", + "account", account.Hex(), + "eth_balance", ethBalanceEth) + + return nil +} + +// shouldUpdatePrice checks if the price change exceeds the threshold +// Formula: |newPrice - lastPrice| / lastPrice * 10000 >= threshold +// Threshold is in basis points (bps): 1 bps = 0.01%, 100 bps = 1%, 10000 bps = 100% +// Example: if threshold is 100 (bps), price must change by at least 1% to trigger update +func (u *PriceUpdater) shouldUpdatePrice(lastPrice, newPrice *big.Int) bool { + // Validate inputs + if lastPrice == nil || newPrice == nil { + log.Warn("shouldUpdatePrice called with nil price") + return false + } + + if lastPrice.Sign() == 0 { + return true // Always update if no previous price + } + + // Validate threshold is reasonable (should be <= MaxPriceThresholdBPS) + // If threshold is unreasonably large, log warning and cap at 100% + threshold := u.priceThreshold + if threshold > config.MaxPriceThresholdBPS { + log.Warn("Price threshold is unusually large, capping at 100%", + "configured_threshold", threshold, + "capped_threshold", config.MaxPriceThresholdBPS, + "max_bps", config.MaxPriceThresholdBPS) + threshold = config.MaxPriceThresholdBPS + } + + // Calculate absolute difference: |newPrice - lastPrice| + diff := new(big.Int).Sub(newPrice, lastPrice) + diff.Abs(diff) + + // Calculate change in basis points: diff * MaxPriceThresholdBPS / lastPrice + // This gives us the change in bps (e.g., 100 for 1%, 10 for 0.1%, 1 for 0.01%) + bps := new(big.Int).Mul(diff, big.NewInt(int64(config.MaxPriceThresholdBPS))) + bps.Div(bps, lastPrice) + + // Compare with threshold (both are in basis points) + thresholdBig := big.NewInt(int64(threshold)) + shouldUpdate := bps.Cmp(thresholdBig) >= 0 + + log.Debug("Price change check", + "last_price", lastPrice.String(), + "new_price", newPrice.String(), + "change_bps", bps.String(), + "threshold_bps", threshold, + "should_update", shouldUpdate) + + return shouldUpdate +} + +// fetchTokenIDsFromContract fetches supported token IDs from L2TokenRegistry contract +func (u *PriceUpdater) fetchTokenIDsFromContract(ctx context.Context) ([]uint16, error) { + callOpts := &bind.CallOpts{Context: ctx} + + // Call getSupportedIDList() on the contract + return u.registryContract.GetSupportedIDList(callOpts) +} diff --git a/token-price-oracle/updater/tx_manager.go b/token-price-oracle/updater/tx_manager.go new file mode 100644 index 000000000..ebed49395 --- /dev/null +++ b/token-price-oracle/updater/tx_manager.go @@ -0,0 +1,238 @@ +package updater + +import ( + "context" + "fmt" + "sync" + "time" + + "github.com/morph-l2/go-ethereum/accounts/abi/bind" + "github.com/morph-l2/go-ethereum/common" + "github.com/morph-l2/go-ethereum/core/types" + "github.com/morph-l2/go-ethereum/log" + "morph-l2/token-price-oracle/client" +) + +// TxManager manages transaction sending to avoid nonce conflicts +type TxManager struct { + l2Client *client.L2Client + mu sync.Mutex +} + +// NewTxManager creates a new transaction manager +func NewTxManager(l2Client *client.L2Client) *TxManager { + return &TxManager{ + l2Client: l2Client, + } +} + +// SendTransaction sends a transaction in a thread-safe manner +// It ensures only one transaction is sent at a time to avoid nonce conflicts +// Before sending, it checks if there are any pending transactions by comparing nonces +func (m *TxManager) SendTransaction(ctx context.Context, txFunc func(*bind.TransactOpts) (*types.Transaction, error)) (*types.Receipt, error) { + m.mu.Lock() + defer m.mu.Unlock() + + if m.l2Client.IsExternalSign() { + return m.sendWithExternalSign(ctx, txFunc) + } + return m.sendWithLocalSign(ctx, txFunc) +} + +// sendWithLocalSign sends transaction using local private key signing +func (m *TxManager) sendWithLocalSign(ctx context.Context, txFunc func(*bind.TransactOpts) (*types.Transaction, error)) (*types.Receipt, error) { + fromAddr := m.l2Client.WalletAddress() + + // Check if there are pending transactions by comparing nonces + confirmedNonce, err := m.l2Client.GetClient().NonceAt(ctx, fromAddr, nil) + if err != nil { + return nil, fmt.Errorf("failed to get confirmed nonce: %w", err) + } + + pendingNonce, err := m.l2Client.GetClient().PendingNonceAt(ctx, fromAddr) + if err != nil { + return nil, fmt.Errorf("failed to get pending nonce: %w", err) + } + + if pendingNonce > confirmedNonce { + // There are pending transactions, don't send new one + log.Warn("Found pending transactions, skipping this round", + "address", fromAddr.Hex(), + "confirmed_nonce", confirmedNonce, + "pending_nonce", pendingNonce, + "pending_count", pendingNonce-confirmedNonce) + return nil, fmt.Errorf("pending transactions exist (confirmed: %d, pending: %d)", confirmedNonce, pendingNonce) + } + + log.Info("No pending transactions, proceeding to send", + "address", fromAddr.Hex(), + "nonce", confirmedNonce) + + // Get transaction options (returns a copy) + auth := m.l2Client.GetOpts() + auth.Context = ctx + + // First, estimate gas with GasLimit = 0 + auth.GasLimit = 0 + auth.NoSend = true + tx, err := txFunc(auth) + if err != nil { + return nil, fmt.Errorf("failed to estimate gas: %w", err) + } + + // Use 1.5x of estimated gas as the actual gas limit + estimatedGas := tx.Gas() + auth.GasLimit = estimatedGas * 3 / 2 + log.Info("Gas estimation completed", "estimated", estimatedGas, "actual_limit", auth.GasLimit) + + // Now send the actual transaction + auth.NoSend = false + tx, err = txFunc(auth) + if err != nil { + return nil, err + } + + log.Info("Transaction sent (local sign)", + "tx_hash", tx.Hash().Hex(), + "nonce", tx.Nonce(), + "gas_limit", tx.Gas()) + + // Wait for transaction to be mined with timeout and retry logic + receipt, err := m.waitForReceipt(ctx, tx.Hash(), 60*time.Second, 2*time.Second) + if err != nil { + log.Error("Failed to wait for transaction receipt", + "tx_hash", tx.Hash().Hex(), + "error", err) + return nil, err + } + + return receipt, nil +} + +// sendWithExternalSign sends transaction using external signing service +func (m *TxManager) sendWithExternalSign(ctx context.Context, txFunc func(*bind.TransactOpts) (*types.Transaction, error)) (*types.Receipt, error) { + signer := m.l2Client.GetSigner() + if signer == nil { + return nil, fmt.Errorf("external signer is not initialized") + } + + fromAddr := m.l2Client.WalletAddress() + + // Check if there are pending transactions by comparing nonces + confirmedNonce, err := m.l2Client.GetClient().NonceAt(ctx, fromAddr, nil) + if err != nil { + return nil, fmt.Errorf("failed to get confirmed nonce: %w", err) + } + + pendingNonce, err := m.l2Client.GetClient().PendingNonceAt(ctx, fromAddr) + if err != nil { + return nil, fmt.Errorf("failed to get pending nonce: %w", err) + } + + if pendingNonce > confirmedNonce { + // There are pending transactions, don't send new one + log.Warn("Found pending transactions, skipping this round", + "address", fromAddr.Hex(), + "confirmed_nonce", confirmedNonce, + "pending_nonce", pendingNonce, + "pending_count", pendingNonce-confirmedNonce) + return nil, fmt.Errorf("pending transactions exist (confirmed: %d, pending: %d)", confirmedNonce, pendingNonce) + } + + log.Info("No pending transactions, proceeding to send", + "address", fromAddr.Hex(), + "nonce", confirmedNonce) + + // Get transaction options (returns a copy) with NoSend=true to get calldata + auth := m.l2Client.GetOpts() + auth.Context = ctx + auth.NoSend = true + auth.GasLimit = 0 + + // Call txFunc to get the transaction (this gives us the calldata and to address) + tx, err := txFunc(auth) + if err != nil { + return nil, fmt.Errorf("failed to build transaction: %w", err) + } + + // Get the target contract address and calldata from the unsigned tx + if tx.To() == nil { + return nil, fmt.Errorf("contract creation transactions are not supported") + } + toAddr := *tx.To() + callData := tx.Data() + + log.Info("Building external sign transaction", + "to", toAddr.Hex(), + "calldata_len", len(callData)) + + // Create and sign transaction using external signer + signedTx, err := signer.CreateAndSignTx(ctx, m.l2Client, toAddr, callData) + if err != nil { + return nil, fmt.Errorf("failed to create and sign transaction: %w", err) + } + + // Send the signed transaction + err = m.l2Client.GetClient().SendTransaction(ctx, signedTx) + if err != nil { + return nil, fmt.Errorf("failed to send signed transaction: %w", err) + } + + log.Info("Transaction sent (external sign)", + "tx_hash", signedTx.Hash().Hex(), + "gas_limit", signedTx.Gas()) + + // Wait for transaction to be mined with custom timeout and retry logic + receipt, err := m.waitForReceipt(ctx, signedTx.Hash(), 60*time.Second, 2*time.Second) + if err != nil { + log.Error("Failed to wait for transaction receipt", + "tx_hash", signedTx.Hash().Hex(), + "error", err) + return nil, err + } + return receipt, nil +} + +// waitForReceipt waits for a transaction receipt with timeout and custom polling interval +func (m *TxManager) waitForReceipt(ctx context.Context, txHash common.Hash, timeout, pollInterval time.Duration) (*types.Receipt, error) { + deadline := time.Now().Add(timeout) + ticker := time.NewTicker(pollInterval) + defer ticker.Stop() + + log.Debug("Waiting for transaction receipt", + "tx_hash", txHash.Hex(), + "timeout", timeout, + "poll_interval", pollInterval) + + for { + // Check if we've exceeded the timeout + if time.Now().After(deadline) { + return nil, fmt.Errorf("timeout waiting for transaction %s after %v", txHash.Hex(), timeout) + } + + // Try to get the receipt + receipt, err := m.l2Client.GetClient().TransactionReceipt(ctx, txHash) + if err == nil && receipt != nil { + log.Debug("Receipt received", + "tx_hash", txHash.Hex(), + "status", receipt.Status, + "gas_used", receipt.GasUsed, + "block_number", receipt.BlockNumber) + return receipt, nil + } + + if err != nil { + log.Trace("Receipt retrieval failed, will retry", + "tx_hash", txHash.Hex(), + "error", err) + } + + // Wait for next poll or context cancellation + select { + case <-ctx.Done(): + return nil, fmt.Errorf("context cancelled while waiting for transaction %s: %w", txHash.Hex(), ctx.Err()) + case <-ticker.C: + // Continue to next iteration + } + } +} diff --git a/tx-submitter/.gitignore b/tx-submitter/.gitignore index 7ef51ca15..835c4a0e4 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 000000000..aefe24d06 --- /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 index d6913390b..ce62bd6eb 100644 --- a/tx-submitter/db/db.go +++ b/tx-submitter/db/db.go @@ -8,10 +8,11 @@ import ( "morph-l2/tx-submitter/utils" "github.com/morph-l2/go-ethereum/ethdb/leveldb" + "github.com/syndtr/goleveldb/leveldb/errors" ) var ( - ErrKeyNotFound = fmt.Errorf("not found") + ErrKeyNotFound = errors.ErrNotFound ) type Db struct { @@ -55,6 +56,9 @@ func (d *Db) GetString(key string) (string, error) { 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 diff --git a/tx-submitter/db/interface.go b/tx-submitter/db/interface.go new file mode 100644 index 000000000..0bec57f6f --- /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 b44be5628..bc5675fcd 100644 --- a/tx-submitter/entry.go +++ b/tx-submitter/entry.go @@ -193,6 +193,10 @@ func Main() func(ctx *cli.Context) error { 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) diff --git a/tx-submitter/event/indexer.go b/tx-submitter/event/indexer.go index 0ba87ab5b..dc517ba72 100644 --- a/tx-submitter/event/indexer.go +++ b/tx-submitter/event/indexer.go @@ -16,10 +16,10 @@ type EventIndexer struct { deployBlock *big.Int // Block number of contract deployment filterQuery ethereum.FilterQuery indexStep uint64 // index step - storage *EventInfoStorage + storage IEventStorage } -func NewEventIndexer(client *ethclient.Client, deployedBlock *big.Int, filter ethereum.FilterQuery, indexStep uint64, storage *EventInfoStorage) *EventIndexer { +func NewEventIndexer(client *ethclient.Client, deployedBlock *big.Int, filter ethereum.FilterQuery, indexStep uint64, storage IEventStorage) *EventIndexer { return &EventIndexer{ client: client, deployBlock: deployedBlock, @@ -32,8 +32,8 @@ func NewEventIndexer(client *ethclient.Client, deployedBlock *big.Int, filter et func (l *EventIndexer) Index() { log.Info("event indexer started") - if l.storage.BlockProcessed == 0 { - l.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) @@ -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 <= l.storage.BlockProcessed { - log.Info("no new block to index", "current_block", currentBlock, "last_processed_block", l.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(l.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 { - l.storage.EventInfo = *indexedEventInfo + l.storage.SetBlockProcessed(indexedEventInfo.BlockProcessed) } else { - l.storage.EventInfo = EventInfo{ - BlockProcessed: currentBlock, - } + l.storage.SetBlockProcessed(currentBlock) } + // Update storage err = l.storage.Store() if err != nil { log.Error("event index complete, failed to update storage", "error", err) } else { - log.Info("event index complete, storage updated", "processed_block", l.storage.EventInfo.BlockProcessed, "block_time", l.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,6 +140,6 @@ func (ei *EventIndexer) index(client *ethclient.Client, fromBlock, toBlock *big. func (l *EventIndexer) GetFilter() ethereum.FilterQuery { return l.filterQuery } -func (l *EventIndexer) GetStorage() *EventInfoStorage { +func (l *EventIndexer) GetStorage() IEventStorage { return l.storage } diff --git a/tx-submitter/event/storage.go b/tx-submitter/event/storage.go index d77f857f7..e40b83ed8 100644 --- a/tx-submitter/event/storage.go +++ b/tx-submitter/event/storage.go @@ -7,12 +7,16 @@ import ( "morph-l2/tx-submitter/db" "morph-l2/tx-submitter/params" - "morph-l2/tx-submitter/utils" ) type IEventStorage interface { Store() error Load() error + BlockProcessed() uint64 + SetBlockProcessed(blockNum uint64) + BlockTime() uint64 + SetBlockTime(blockTime uint64) + EventInfo() EventInfo } type EventInfo struct { @@ -21,21 +25,20 @@ type EventInfo struct { } type EventInfoStorage struct { - EventInfo - db *db.Db - mu sync.Mutex + eventInfo EventInfo + db db.Database + mu sync.RWMutex } -func NewEventInfoStorage(db *db.Db) *EventInfoStorage { +func NewEventInfoStorage(db db.Database) *EventInfoStorage { return &EventInfoStorage{ db: db, } } func (e *EventInfoStorage) Store() error { - // Convert struct to JSON string - jsonData, err := json.Marshal(e.EventInfo) + jsonData, err := json.Marshal(e.eventInfo) if err != nil { return fmt.Errorf("failed to convert struct to JSON: %w", err) } @@ -49,31 +52,57 @@ func (e *EventInfoStorage) Store() error { } return nil } + func (e *EventInfoStorage) Load() error { e.mu.Lock() defer e.mu.Unlock() - evnetInfo, err := e.db.GetString(params.EventInfoKey) + + jsonStr, err := e.db.GetString(params.EventInfoKey) if err != nil { - if utils.ErrStringMatch(err, db.ErrKeyNotFound) { - e.EventInfo = EventInfo{} - jsonData, err := json.Marshal(e.EventInfo) - if err != nil { - return fmt.Errorf("failed to marshal json: %w", err) - } - err = e.db.PutString(params.EventInfoKey, string(jsonData)) - if err != nil { - return fmt.Errorf("failed to init eventinfo to db: %w", err) - } + if err == db.ErrKeyNotFound { + // Initialize with default values if not found + e.eventInfo = EventInfo{} return nil } - return fmt.Errorf("failed to load eventinfo from db: %w", err) + return fmt.Errorf("failed to read from db: %w", err) } - // parse json data to struct - err = json.Unmarshal([]byte(evnetInfo), &e.EventInfo) + 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 74e78b094..2299bab52 100644 --- a/tx-submitter/event/storage_test.go +++ b/tx-submitter/event/storage_test.go @@ -2,27 +2,39 @@ package event import ( "morph-l2/tx-submitter/db" + "os" + "path/filepath" "testing" "github.com/stretchr/testify/require" ) func TestEventInfoStorage(t *testing.T) { + // Create a unique test directory + testDir := filepath.Join(t.TempDir(), "testleveldb") - db, err := db.New("./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(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/go.mod b/tx-submitter/go.mod index 587aa4f78..ead642c78 100644 --- a/tx-submitter/go.mod +++ b/tx-submitter/go.mod @@ -1,45 +1,46 @@ module morph-l2/tx-submitter -go 1.22 +go 1.24.0 -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.3 require ( + github.com/consensys/gnark-crypto v0.16.0 + github.com/crate-crypto/go-eth-kzg v1.4.0 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.20241224100051-1582a364edc0 + github.com/morph-l2/go-ethereum v1.10.14-0.20260211074551-4f0f6e6bd141 github.com/prometheus/client_golang v1.17.0 - github.com/stretchr/testify v1.9.0 - github.com/tendermint/tendermint v0.35.9 - github.com/urfave/cli v1.22.14 + github.com/stretchr/testify v1.10.0 + github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a + github.com/urfave/cli v1.22.17 gopkg.in/natefinch/lumberjack.v2 v2.2.1 ) require ( github.com/VictoriaMetrics/fastcache v1.12.2 // indirect github.com/beorn7/perks v1.0.1 // indirect - github.com/bits-and-blooms/bitset v1.7.0 // indirect + github.com/bits-and-blooms/bitset v1.20.0 // indirect github.com/btcsuite/btcd v0.20.1-beta // indirect github.com/btcsuite/btcd/btcec/v2 v2.2.1 // indirect github.com/cespare/xxhash/v2 v2.2.0 // indirect - github.com/consensys/bavard v0.1.13 // indirect - github.com/consensys/gnark-crypto v0.12.1 // indirect - github.com/cpuguy83/go-md2man/v2 v2.0.3 // indirect - github.com/crate-crypto/go-kzg-4844 v1.0.0 // indirect + github.com/consensys/bavard v0.1.27 // indirect + github.com/cpuguy83/go-md2man/v2 v2.0.7 // indirect github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc // indirect github.com/deckarep/golang-set v1.8.0 // indirect github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0 // indirect github.com/edsrzf/mmap-go v1.1.0 // indirect - github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4 // indirect - github.com/fjl/memsize v0.0.2 // indirect + github.com/ethereum/c-kzg-4844/v2 v2.1.5 // indirect + github.com/ethereum/go-ethereum v1.10.26 // indirect github.com/gballet/go-libpcsclite v0.0.0-20191108122812-4678299bea08 // indirect - github.com/go-kit/log v0.2.1 // indirect + github.com/go-kit/kit v0.12.0 // indirect github.com/go-logfmt/logfmt v0.6.0 // indirect github.com/go-ole/go-ole v1.3.0 // indirect github.com/go-resty/resty/v2 v2.13.1 // indirect github.com/go-stack/stack v1.8.1 // indirect github.com/golang-jwt/jwt/v4 v4.5.0 // indirect github.com/golang/snappy v0.0.5-0.20220116011046-fa5810519dcb // indirect + github.com/google/go-cmp v0.6.0 // indirect github.com/google/uuid v1.6.0 // indirect github.com/gorilla/websocket v1.5.1 // indirect github.com/hashicorp/go-bexpr v0.1.13 // indirect @@ -50,38 +51,36 @@ require ( github.com/jackpal/go-nat-pmp v1.0.2 // indirect github.com/mattn/go-colorable v0.1.13 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - github.com/mattn/go-runewidth v0.0.15 // indirect + github.com/mattn/go-runewidth v0.0.16 // indirect github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 // indirect github.com/mitchellh/mapstructure v1.5.0 // indirect github.com/mitchellh/pointerstructure v1.2.1 // indirect github.com/mmcloughlin/addchain v0.4.0 // indirect github.com/olekukonko/tablewriter v0.0.5 // indirect - github.com/petermattis/goid v0.0.0-20231207134359-e60b3f734c67 // indirect github.com/pkg/errors v0.9.1 // indirect github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 // indirect github.com/prometheus/client_model v0.5.0 // indirect github.com/prometheus/common v0.45.0 // indirect github.com/prometheus/procfs v0.12.0 // indirect github.com/prometheus/tsdb v0.10.0 // indirect - github.com/rivo/uniseg v0.4.3 // indirect + github.com/rivo/uniseg v0.4.7 // indirect github.com/rjeczalik/notify v0.9.3 // indirect github.com/rs/cors v1.11.0 // indirect github.com/russross/blackfriday/v2 v2.1.0 // indirect - github.com/sasha-s/go-deadlock v0.3.1 // indirect 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/supranational/blst v0.3.11 // indirect - github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a // indirect + github.com/stretchr/objx v0.5.2 // indirect + github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe // 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 github.com/yusufpapurcu/wmi v1.2.3 // indirect - golang.org/x/crypto v0.23.0 // indirect + golang.org/x/crypto v0.35.0 // indirect golang.org/x/net v0.25.0 // indirect - golang.org/x/sync v0.7.0 // indirect - golang.org/x/sys v0.20.0 // indirect - golang.org/x/text v0.15.0 // indirect + golang.org/x/sync v0.11.0 // indirect + golang.org/x/sys v0.30.0 // indirect + golang.org/x/text v0.22.0 // indirect golang.org/x/time v0.5.0 // indirect google.golang.org/protobuf v1.33.0 // indirect gopkg.in/natefinch/npipe.v2 v2.0.0-20160621034901-c1b8fa8bdcce // indirect diff --git a/tx-submitter/go.sum b/tx-submitter/go.sum index e310519f5..725f75a79 100644 --- a/tx-submitter/go.sum +++ b/tx-submitter/go.sum @@ -1,4 +1,4 @@ -github.com/BurntSushi/toml v1.3.2/go.mod h1:CxXYINrC8qIiEnFrOxCa7Jy5BFHlXnUU2pbicEuybxQ= +github.com/BurntSushi/toml v1.5.0/go.mod h1:ukJfTF/6rtPPRCnwkur4qwRxa8vTRFBF0uk2lLoLwho= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/VictoriaMetrics/fastcache v1.12.2 h1:N0y9ASrJ0F6h0QaC3o6uJb3NIZ9VKLjCM7NQbSmF7WI= github.com/VictoriaMetrics/fastcache v1.12.2/go.mod h1:AmC+Nzz1+3G2eCPapF6UcsnkThDcMsQicp4xDukwJYI= @@ -11,8 +11,8 @@ github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24 github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= github.com/beorn7/perks v1.0.1 h1:VlbKKnNfV8bJzeqoa4cOKqO6bYr3WgKZxO8Z16+hsOM= github.com/beorn7/perks v1.0.1/go.mod h1:G2ZrVWU2WbWT9wwq4/hrbKbnv/1ERSJQ0ibhJ6rlkpw= -github.com/bits-and-blooms/bitset v1.7.0 h1:YjAGVd3XmtK9ktAbX8Zg2g2PwLIMjGREZJHlV4j7NEo= -github.com/bits-and-blooms/bitset v1.7.0/go.mod h1:gIdJ4wp64HaoK2YrL1Q5/N7Y16edYb8uY+O0FJTyyDA= +github.com/bits-and-blooms/bitset v1.20.0 h1:2F+rfL86jE2d/bmw7OhqUg2Sj/1rURkBn3MdfoPyRVU= +github.com/bits-and-blooms/bitset v1.20.0/go.mod h1:7hO7Gc7Pp1vODcmWvKMRA9BNmbv6a/7QIWpPxHddWR8= github.com/btcsuite/btcd v0.20.1-beta h1:Ik4hyJqN8Jfyv3S4AGBOmyouMsYE3EdYODkMbQjwPGw= github.com/btcsuite/btcd v0.20.1-beta/go.mod h1:wVuoA8VJLEcwgqHBwHmzLRazpKxTv13Px/pDuV7OomQ= github.com/btcsuite/btcd/btcec/v2 v2.2.1 h1:xP60mv8fvp+0khmrN0zTdPC3cNm24rfeE6lh2R/Yv3E= @@ -32,15 +32,14 @@ github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XL github.com/chzyer/logex v1.1.10/go.mod h1:+Ywpsq7O8HXn0nuIou7OrIPyXbp3wmkHB+jjWRnGsAI= github.com/chzyer/readline v0.0.0-20180603132655-2972be24d48e/go.mod h1:nSuG5e5PlCu98SY8svDHJxuZscDgtXS6KTTbou5AhLI= github.com/chzyer/test v0.0.0-20180213035817-a1ea475d72b1/go.mod h1:Q3SI9o4m/ZMnBNeIyt5eFwwo7qiLfzFZmjNmxjkiQlU= -github.com/consensys/bavard v0.1.13 h1:oLhMLOFGTLdlda/kma4VOJazblc7IM5y5QPd2A/YjhQ= -github.com/consensys/bavard v0.1.13/go.mod h1:9ItSMtA/dXMAiL7BG6bqW2m3NdSEObYWoH223nGHukI= -github.com/consensys/gnark-crypto v0.12.1 h1:lHH39WuuFgVHONRl3J0LRBtuYdQTumFSDtJF7HpyG8M= -github.com/consensys/gnark-crypto v0.12.1/go.mod h1:v2Gy7L/4ZRosZ7Ivs+9SfUDr0f5UlG+EM5t7MPHiLuY= -github.com/cpuguy83/go-md2man/v2 v2.0.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/cpuguy83/go-md2man/v2 v2.0.3 h1:qMCsGGgs+MAzDFyp9LpAe1Lqy/fY/qCovCm0qnXZOBM= -github.com/cpuguy83/go-md2man/v2 v2.0.3/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/crate-crypto/go-kzg-4844 v1.0.0 h1:TsSgHwrkTKecKJ4kadtHi4b3xHW5dCFUDFnUp1TsawI= -github.com/crate-crypto/go-kzg-4844 v1.0.0/go.mod h1:1kMhvPgI0Ky3yIa+9lFySEBUBXkYxeOi8ZF1sYioxhc= +github.com/consensys/bavard v0.1.27 h1:j6hKUrGAy/H+gpNrpLU3I26n1yc+VMGmd6ID5+gAhOs= +github.com/consensys/bavard v0.1.27/go.mod h1:k/zVjHHC4B+PQy1Pg7fgvG3ALicQw540Crag8qx+dZs= +github.com/consensys/gnark-crypto v0.16.0 h1:8Dl4eYmUWK9WmlP1Bj6je688gBRJCJbT8Mw4KoTAawo= +github.com/consensys/gnark-crypto v0.16.0/go.mod h1:Ke3j06ndtPTVvo++PhGNgvm+lgpLvzbcE2MqljY7diU= +github.com/cpuguy83/go-md2man/v2 v2.0.7 h1:zbFlGlXEAKlwXpmvle3d8Oe3YnkKIK4xSRTd3sHPnBo= +github.com/cpuguy83/go-md2man/v2 v2.0.7/go.mod h1:oOW0eioCTA6cOiMLiUPZOpcVxMig6NIQQ7OS05n1F4g= +github.com/crate-crypto/go-eth-kzg v1.4.0 h1:WzDGjHk4gFg6YzV0rJOAsTK4z3Qkz5jd4RE3DAvPFkg= +github.com/crate-crypto/go-eth-kzg v1.4.0/go.mod h1:J9/u5sWfznSObptgfa92Jq8rTswn6ahQWEuiLHOjCUI= github.com/davecgh/go-spew v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -55,10 +54,10 @@ github.com/decred/dcrd/dcrec/secp256k1/v4 v4.2.0/go.mod h1:v57UDF4pDQJcEfFUCRop3 github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= github.com/edsrzf/mmap-go v1.1.0 h1:6EUwBLQ/Mcr1EYLE4Tn1VdW1A4ckqCQWZBw8Hr0kjpQ= github.com/edsrzf/mmap-go v1.1.0/go.mod h1:19H/e8pUPLicwkyNgOykDXkJ9F0MHE+Z52B8EIth78Q= -github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4 h1:B2mpK+MNqgPqk2/KNi1LbqwtZDy5F7iy0mynQiBr8VA= -github.com/ethereum/c-kzg-4844/bindings/go v0.0.0-20230126171313-363c7d7593b4/go.mod h1:y4GA2JbAUama1S4QwYjC2hefgGLU8Ul0GMtL/ADMF1c= -github.com/fjl/memsize v0.0.2 h1:27txuSD9or+NZlnOWdKUxeBzTAUkWCVh+4Gf2dWFOzA= -github.com/fjl/memsize v0.0.2/go.mod h1:VvhXpOYNQvB+uIk2RvXzuaQtkQJzzIx6lSBe1xv7hi0= +github.com/ethereum/c-kzg-4844/v2 v2.1.5 h1:aVtoLK5xwJ6c5RiqO8g8ptJ5KU+2Hdquf6G3aXiHh5s= +github.com/ethereum/c-kzg-4844/v2 v2.1.5/go.mod h1:u59hRTTah4Co6i9fDWtiCjTrblJv0UwsqZKCc0GfgUs= +github.com/ethereum/go-ethereum v1.10.26 h1:i/7d9RBBwiXCEuyduBQzJw/mKmnvzsN14jqBmytw72s= +github.com/ethereum/go-ethereum v1.10.26/go.mod h1:EYFyF19u3ezGLD4RqOkLq+ZCXzYbLoNDdZlMt7kyKFg= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/fsnotify/fsnotify v1.4.9/go.mod h1:znqG4EE+3YCdAaPaxE2ZRY/06pZUdp0tY4IgpuI1SZQ= github.com/fsnotify/fsnotify v1.5.4/go.mod h1:OVB6XrOHzAwXMpEM7uPOzcehqUV2UqJxmVXmkdnm1bU= @@ -139,16 +138,16 @@ github.com/kr/pretty v0.3.1 h1:flRD4NNwYAUpkphVc1HcthR4KEIFJ65n8Mw5qdRn3LE= github.com/kr/pretty v0.3.1/go.mod h1:hoEshYVHaxMs3cyo3Yncou5ZscifuDolrwPKZanG3xk= github.com/kr/text v0.2.0 h1:5Nx0Ya0ZqY2ygV366QzturHI13Jq95ApcVaJBhpS+AY= github.com/kr/text v0.2.0/go.mod h1:eLer722TekiGuMkidMxC/pM04lWEeraHUUmBw8l2grE= -github.com/leanovate/gopter v0.2.9 h1:fQjYxZaynp97ozCzfOyOuAGOU4aU/z37zf/tOujFk7c= -github.com/leanovate/gopter v0.2.9/go.mod h1:U2L/78B+KVFIx2VmW6onHJQzXtFb+p5y3y2Sh+Jxxv8= +github.com/leanovate/gopter v0.2.11 h1:vRjThO1EKPb/1NsDXuDrzldR28RLkBflWYcU9CvzWu4= +github.com/leanovate/gopter v0.2.11/go.mod h1:aK3tzZP/C+p1m3SPRE4SYZFGP7jjkuSI4f7Xvpt0S9c= github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA= github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg= github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-runewidth v0.0.9/go.mod h1:H031xJmbD/WCDINGzjvQ9THkh0rPKHF+m2gUSrubnMI= -github.com/mattn/go-runewidth v0.0.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= -github.com/mattn/go-runewidth v0.0.15/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= +github.com/mattn/go-runewidth v0.0.16 h1:E5ScNMtiwvlvB5paMFdw9p4kSQzbXFikJ5SQO6TULQc= +github.com/mattn/go-runewidth v0.0.16/go.mod h1:Jdepj2loyihRzMpdS35Xk/zdY8IAYHsh153qUoGf23w= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0 h1:jWpvCLoY8Z/e3VKvlsiIGKtc+UG6U5vzxaoagmhXfyg= github.com/matttproud/golang_protobuf_extensions/v2 v2.0.0/go.mod h1:QUyp042oQthUoa9bqDv0ER0wrtXnBruoNd7aNjkbP+k= @@ -164,10 +163,8 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= 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.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/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.20260211074551-4f0f6e6bd141 h1:A8eygErKU6WKMipGWIemzwLeYkIGLd9yb/Ry3x+J9PQ= +github.com/morph-l2/go-ethereum v1.10.14-0.20260211074551-4f0f6e6bd141/go.mod h1:nkVzHjQWCOjvukQW8ittlwX+Xz9gmVHrP7mUi7zoHTs= 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= @@ -188,9 +185,6 @@ github.com/onsi/gomega v1.10.1/go.mod h1:iN09h71vgCQne3DLsj+A5owkum+a2tYe+TOCB1y github.com/onsi/gomega v1.17.0/go.mod h1:HnhC7FXeEQY45zxNK3PPoIUhzk/80Xly9PcubAlGdZY= github.com/onsi/gomega v1.19.0 h1:4ieX6qQjPP/BfC3mpsAtIGGlxTWPeA3Inl/7DtXw1tw= github.com/onsi/gomega v1.19.0/go.mod h1:LY+I3pBVzYsTBU1AnDwOSxaYi9WoWiqgwooUqq9yPro= -github.com/petermattis/goid v0.0.0-20180202154549-b0b1615b78e5/go.mod h1:jvVRKCrJTQWu0XVbaOlby/2lO20uSCHEMzzplHXte1o= -github.com/petermattis/goid v0.0.0-20231207134359-e60b3f734c67 h1:jik8PHtAIsPlCRJjJzl4udgEf7hawInF9texMeO2jrU= -github.com/petermattis/goid v0.0.0-20231207134359-e60b3f734c67/go.mod h1:pxMtw7cyUw6B2bRH0ZBANSPg+AoSud1I1iyJHI69jH4= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= @@ -215,8 +209,8 @@ github.com/prometheus/procfs v0.12.0/go.mod h1:pcuDEFsWDnvcgNzo4EEweacyhjeA9Zk3c github.com/prometheus/tsdb v0.10.0 h1:If5rVCMTp6W2SiRAQFlbpJNgVlgMEd+U2GZckwK38ic= github.com/prometheus/tsdb v0.10.0/go.mod h1:oi49uRhEe9dPUTlS3JRZOwJuVi6tmh10QSgwXEyGCt4= github.com/rivo/uniseg v0.2.0/go.mod h1:J6wj4VEh+S6ZtnVlnTBMWIodfgj8LQOQFoIToxlJtxc= -github.com/rivo/uniseg v0.4.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= -github.com/rivo/uniseg v0.4.3/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= +github.com/rivo/uniseg v0.4.7 h1:WUdvkW8uEhrYfLC4ZzdpI2ztxP1I582+49Oc5Mq64VQ= +github.com/rivo/uniseg v0.4.7/go.mod h1:FN3SvrM+Zdj16jyLfmOkMNblXMcoc8DfTHruCPUcx88= github.com/rjeczalik/notify v0.9.3 h1:6rJAzHTGKXGj76sbRgDiDcYj/HniypXmSJo1SWakZeY= github.com/rjeczalik/notify v0.9.3/go.mod h1:gF3zSOrafR9DQEWSE8TjfI9NkooDxbyT4UgRGKZA0lc= github.com/rogpeppe/go-internal v1.12.0 h1:exVL4IDcn6na9z1rAb56Vxr+CgyK3nn3O+epU5NdKM8= @@ -225,8 +219,6 @@ github.com/rs/cors v1.11.0 h1:0B9GE/r9Bc2UxRMMtymBkHTenPkHDv0CW4Y98GBY+po= github.com/rs/cors v1.11.0/go.mod h1:XyqrcTp5zjWr1wsJ8PIRZssZ8b/WMcMf71DJnit4EMU= github.com/russross/blackfriday/v2 v2.1.0 h1:JIOH55/0cWyOuilr9/qlrm0BSXldqnqwMsf35Ld67mk= github.com/russross/blackfriday/v2 v2.1.0/go.mod h1:+Rmxgy9KzJVeS9/2gXHxylqXiyQDYRxCVz55jmeOWTM= -github.com/sasha-s/go-deadlock v0.3.1 h1:sqv7fDNShgjcaxkO0JNcOAlr8B9+cV5Ey/OB71efZx0= -github.com/sasha-s/go-deadlock v0.3.1/go.mod h1:F73l+cr82YSh10GxyRI6qZiCgK64VaZjwesgfQ1/iLM= github.com/scroll-tech/zktrie v0.8.4 h1:UagmnZ4Z3ITCk+aUq9NQZJNAwnWl4gSxsLb2Nl7IgRE= github.com/scroll-tech/zktrie v0.8.4/go.mod h1:XvNo7vAk8yxNyTjBDj5WIiFzYW4bx/gJ78+NK6Zn6Uk= github.com/shirou/gopsutil v3.21.11+incompatible h1:+1+c1VGhc88SSonWP6foOcLhvnKlUeu/erjjvaPEYiI= @@ -239,6 +231,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= @@ -246,10 +240,10 @@ github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stretchr/testify v1.7.2/go.mod h1:R6va5+xMeoiuVRoj+gSkQ7d3FALtqAAGI1FQKckRals= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.4/go.mod h1:sz/lmYIOXD/1dqDmKjjqLyZ2RngseejIcXlSw2iwfAo= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= -github.com/supranational/blst v0.3.11 h1:LyU6FolezeWAhvQk0k6O/d49jqgO52MSDDfYgbeoEm4= -github.com/supranational/blst v0.3.11/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= +github.com/stretchr/testify v1.10.0 h1:Xv5erBjTwe/5IxqUQTdXv5kgmIvbHo3QQyRwhJsOfJA= +github.com/stretchr/testify v1.10.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= +github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe h1:nbdqkIGOGfUAD54q1s2YBcBz/WcsxCO9HUQ4aGV5hUw= +github.com/supranational/blst v0.3.16-0.20250831170142-f48500c1fdbe/go.mod h1:jZJtfjgudtNl4en1tzwPIV3KjUnQUvG3/j+w+fVonLw= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a h1:1ur3QoCqvE5fl+nylMaIr9PVV1w343YRDtsy+Rwu7XI= github.com/syndtr/goleveldb v1.0.1-0.20220614013038-64ee5596c38a/go.mod h1:RRCYJbIwD5jmqPI9XoAFR0OcDxqUctll6zUj/+B4S48= github.com/tklauser/go-sysconf v0.3.13 h1:GBUpcahXSpR2xN01jhkNAbTLRk2Yzgggk8IM08lq3r4= @@ -258,8 +252,8 @@ github.com/tklauser/numcpus v0.7.0 h1:yjuerZP127QG9m5Zh/mSO4wqurYil27tHrqwRoRjpr github.com/tklauser/numcpus v0.7.0/go.mod h1:bb6dMVcj8A42tSE7i32fsIUCbQNllK5iDguyOZRUzAY= github.com/tyler-smith/go-bip39 v1.1.0 h1:5eUemwrMargf3BSLRRCalXT93Ns6pQJIjYQN2nyfOP8= github.com/tyler-smith/go-bip39 v1.1.0/go.mod h1:gUYDtqQw1JS3ZJ8UWVcGTGqqr6YIN3CWg+kkNaLt55U= -github.com/urfave/cli v1.22.14 h1:ebbhrRiGK2i4naQJr+1Xj92HXZCrK7MsyTS/ob3HnAk= -github.com/urfave/cli v1.22.14/go.mod h1:X0eDS6pD6Exaclxm99NJ3FiCDRED7vIHpx2mDOHLvkA= +github.com/urfave/cli v1.22.17 h1:SYzXoiPfQjHBbkYxbew5prZHS1TOLT3ierW8SYLqtVQ= +github.com/urfave/cli v1.22.17/go.mod h1:b0ht0aqgH/6pBYzzxURyrM4xXNgsoT/n2ZzwQiEhNVo= github.com/yuin/goldmark v1.2.1/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY= github.com/yusufpapurcu/wmi v1.2.3 h1:E1ctvB7uKFMOJw3fdOW32DwGE9I7t++CRUEMKvFoFiw= @@ -271,8 +265,9 @@ golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= golang.org/x/crypto v0.19.0/go.mod h1:Iy9bg/ha4yyC70EfRS8jz+B6ybOBKMaSxLj6P6oBDfU= -golang.org/x/crypto v0.23.0 h1:dIJU/v2J8Mdglj/8rJ6UUOM3Zc9zLZxVZwwxMooUSAI= golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v8= +golang.org/x/crypto v0.35.0 h1:b15kiHdrGCHrP6LvwaQ3c03kgNhhiMgvlhxHQhmg2Xs= +golang.org/x/crypto v0.35.0/go.mod h1:dy7dXNW32cAb/6/PRuTNsix8T+vJAqvuIy5Bli/x0YQ= golang.org/x/mod v0.3.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4= golang.org/x/mod v0.8.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= @@ -300,8 +295,8 @@ golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.1.0/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= -golang.org/x/sync v0.7.0 h1:YsImfSBoP9QPYL0xyKJPq0gcaJdG3rInoqxTWbfQu9M= -golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= +golang.org/x/sync v0.11.0 h1:GGz8+XQP4FvTTrjZPzNKTMFtSXH80RAzG+5ghFPgK9w= +golang.org/x/sync v0.11.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180909124046-d0be0721c37e/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180926160741-c2ed4eda69e7/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -330,8 +325,9 @@ golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.8.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.14.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/sys v0.17.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= -golang.org/x/sys v0.20.0 h1:Od9JTbYCk261bKm4M/mw7AklTlFYIa0bIp9BgSm1S8Y= golang.org/x/sys v0.20.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +golang.org/x/sys v0.30.0 h1:QjkSwP/36a20jFYWkSue1YwXzLmsV5Gfq7Eiy72C1uc= +golang.org/x/sys v0.30.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/term v0.5.0/go.mod h1:jMB1sMXY+tzblOD4FWmEbocvup2/aLOaQEp7JmGp78k= @@ -345,8 +341,9 @@ golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ= golang.org/x/text v0.7.0/go.mod h1:mrYo+phRRbMaCq/xk9113O4dZlRixOauAjOtrjsXDZ8= golang.org/x/text v0.9.0/go.mod h1:e1OnstbJyHTd6l/uOt8jFFHp6TRDWZR/bV3emEE/zU8= golang.org/x/text v0.14.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= -golang.org/x/text v0.15.0 h1:h1V/4gjBv8v9cjcR6+AR5+/cIYK5N/WAgiv4xlsEtAk= golang.org/x/text v0.15.0/go.mod h1:18ZOQIKpY8NJVqYksKHtTdi31H5itFRjB5/qKTNYzSU= +golang.org/x/text v0.22.0 h1:bofq7m3/HAFvbF51jz3Q9wLg3jkvSPuiZu/pD1XwgtM= +golang.org/x/text v0.22.0/go.mod h1:YRoo4H8PVmsu+E3Ou7cqLVH8oXWIHVoX0jqUWALQhfY= golang.org/x/time v0.5.0 h1:o7cqy6amK/52YcAKIPlM3a+Fpj35zvRj2TP+e1xFSfk= golang.org/x/time v0.5.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM= golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= diff --git a/tx-submitter/iface/batch_fetcher.go b/tx-submitter/iface/batch_fetcher.go new file mode 100644 index 000000000..0bf3bb16d --- /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 000000000..6b34a82d2 --- /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 000000000..896c4db37 --- /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/localpool/journal.go b/tx-submitter/localpool/journal.go index ca918f106..5b17d07cc 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 2b09d467c..6ac53b617 100644 --- a/tx-submitter/metrics/metrics.go +++ b/tx-submitter/metrics/metrics.go @@ -4,111 +4,211 @@ 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 - RollupCost prometheus.Gauge - FinalizeCost prometheus.Gauge - CollectedL1FeeSum prometheus.Counter - CollectedL1Fee prometheus.Gauge - IndexerBlockProcessed prometheus.Gauge + WalletBalance prometheus.Gauge + RpcErrors prometheus.Counter + RollupCostSum prometheus.Gauge + FinalizeCostSum prometheus.Gauge + RollupCost prometheus.Gauge + FinalizeCost prometheus.Gauge + CollectedL1FeeSum prometheus.Gauge + IndexerBlockProcessed prometheus.Gauge + LastCommittedBatch prometheus.Gauge + LastFinalizedBatch prometheus.Gauge + HasPendingFinalizeBatch 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", }), - CollectedL1Fee: promauto.NewGauge(prometheus.GaugeOpts{ - Name: "submitter_collected_l1_fee", - Help: "Collected L1 fee for every batch", - Namespace: metricsNamespace, + CollectedL1FeeSum: prometheus.NewGauge(prometheus.GaugeOpts{ + Name: "tx_submitter_collected_l1_fee_sum", + Help: "Total L1 fees collected in ETH", }), - CollectedL1FeeSum: promauto.NewCounter(prometheus.CounterOpts{ - Name: "submitter_collected_l1_fee_sum", - Help: "Collected L1 fee for all batches committed ", - 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", + }), + HasPendingFinalizeBatch: prometheus.NewGauge(prometheus.GaugeOpts{ + Name: "tx_submitter_has_pending_finalize_batch", + Help: "Whether there are batches pending finalization (1 = yes, 0 = no)", + }), + 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.HasPendingFinalizeBatch) + _ = 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.FinalizeCostSum.Set(cost) m.FinalizeCost.Set(cost) } +// SetCollectedL1Fee sets the collected L1 fee metric func (m *Metrics) SetCollectedL1Fee(cost float64) { - m.CollectedL1FeeSum.Add(cost) - m.CollectedL1Fee.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)) +} + +// SetHasPendingFinalizeBatch sets whether there are batches pending finalization +// hasPending should be true if there are pending batches, false otherwise +func (m *Metrics) SetHasPendingFinalizeBatch(hasPending bool) { + if hasPending { + m.HasPendingFinalizeBatch.Set(1) + } else { + m.HasPendingFinalizeBatch.Set(0) + } +} + +// 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.HasPendingFinalizeBatch) + 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 000000000..2eb44844f --- /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 000000000..e26087720 --- /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 000000000..abe25dec6 --- /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 000000000..92565d65c --- /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/l1mock.go b/tx-submitter/mock/l1mock.go deleted file mode 100644 index 10dccef62..000000000 --- a/tx-submitter/mock/l1mock.go +++ /dev/null @@ -1,87 +0,0 @@ -package mock - -import ( - "context" - "math/big" - - "github.com/morph-l2/go-ethereum" - "github.com/morph-l2/go-ethereum/common" - "github.com/morph-l2/go-ethereum/core/types" -) - -type L1ClientWrapper struct { - Block *types.Block - TipCap *big.Int -} - -func NewL1ClientWrapper() *L1ClientWrapper { - return &L1ClientWrapper{} -} - -func (c *L1ClientWrapper) BlockByNumber(ctx context.Context, number *big.Int) (*types.Block, error) { - return nil, nil -} - -func (c *L1ClientWrapper) BalanceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (*big.Int, error) { - return big.NewInt(0), nil -} - -func (c *L1ClientWrapper) TransactionByHash(ctx context.Context, hash common.Hash) (tx *types.Transaction, isPending bool, err error) { - return nil, false, nil -} - -func (c *L1ClientWrapper) NonceAt(ctx context.Context, account common.Address, blockNumber *big.Int) (uint64, error) { - return 0, nil -} - -func (c *L1ClientWrapper) TransactionReceipt(ctx context.Context, txHash common.Hash) (*types.Receipt, error) { - return nil, nil -} - -func (c *L1ClientWrapper) HeaderByNumber(ctx context.Context, number *big.Int) (*types.Header, error) { - return c.Block.Header(), nil -} - -func (c *L1ClientWrapper) BlockNumber(ctx context.Context) (uint64, error) { - return c.Block.NumberU64(), nil -} - -func (c *L1ClientWrapper) SubscribeNewHead(ctx context.Context, ch chan<- *types.Header) (ethereum.Subscription, error) { - ch <- c.Block.Header() - return nil, nil -} - -func (c *L1ClientWrapper) SetBlock(block *types.Block) { - c.Block = block -} -func (c *L1ClientWrapper) CodeAt(ctx context.Context, contract common.Address, blockNumber *big.Int) ([]byte, error) { - return nil, nil -} - -func (c *L1ClientWrapper) CallContract(ctx context.Context, call ethereum.CallMsg, blockNumber *big.Int) ([]byte, error) { - return nil, nil -} -func (c *L1ClientWrapper) PendingCodeAt(ctx context.Context, account common.Address) ([]byte, error) { - return nil, nil -} -func (c *L1ClientWrapper) PendingNonceAt(ctx context.Context, account common.Address) (uint64, error) { - return 0, nil -} -func (c *L1ClientWrapper) SuggestGasPrice(ctx context.Context) (*big.Int, error) { - return big.NewInt(0), nil -} -func (c *L1ClientWrapper) SuggestGasTipCap(ctx context.Context) (*big.Int, error) { - return c.TipCap, nil -} -func (c *L1ClientWrapper) EstimateGas(ctx context.Context, call ethereum.CallMsg) (gas uint64, err error) { - return 0, nil -} -func (c *L1ClientWrapper) SendTransaction(ctx context.Context, tx *types.Transaction) error { - return nil -} -func (c *L1ClientWrapper) FilterLogs(ctx context.Context, query ethereum.FilterQuery) ([]types.Log, error) { - return nil, nil -} -func (c *L1ClientWrapper) SubscribeFilterLogs(ctx context.Context, query ethereum.FilterQuery, ch chan<- types.Log) (ethereum.Subscription, error) { - return nil, nil -} diff --git a/tx-submitter/mock/l1staking.go b/tx-submitter/mock/l1staking.go new file mode 100644 index 000000000..08939b834 --- /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 000000000..d1acf1b8a --- /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 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 000000000..a2eea182f --- /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 000000000..6dd534ffd --- /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/services/batch_fetcher.go b/tx-submitter/services/batch_fetcher.go new file mode 100644 index 000000000..7c658ab81 --- /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/blob_hash_test.go b/tx-submitter/services/blob_hash_test.go new file mode 100644 index 000000000..929d57103 --- /dev/null +++ b/tx-submitter/services/blob_hash_test.go @@ -0,0 +1,126 @@ +package services + +import ( + "crypto/sha256" + "testing" + + "github.com/morph-l2/go-ethereum/common" + "github.com/morph-l2/go-ethereum/crypto/kzg4844" + "github.com/stretchr/testify/assert" +) + +// TestCalcBlobHashV1VsKZGToVersionedHash verifies that CalcBlobHashV1 and kZGToVersionedHash +// produce the same results for the same commitment. +func TestCalcBlobHashV1VsKZGToVersionedHash(t *testing.T) { + tests := []struct { + name string + commitment kzg4844.Commitment + }{ + { + name: "zero commitment", + commitment: kzg4844.Commitment{}, + }, + { + name: "all ones commitment", + commitment: func() kzg4844.Commitment { + var c kzg4844.Commitment + for i := range c { + c[i] = 0xFF + } + return c + }(), + }, + { + name: "pattern commitment", + commitment: func() kzg4844.Commitment { + var c kzg4844.Commitment + for i := range c { + c[i] = byte(i % 256) + } + return c + }(), + }, + { + name: "reversed pattern commitment", + commitment: func() kzg4844.Commitment { + var c kzg4844.Commitment + for i := range c { + c[i] = byte(255 - (i % 256)) + } + return c + }(), + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + // Calculate using kZGToVersionedHash (v0 method) + hashV0 := kZGToVersionedHash(tt.commitment) + + // Calculate using CalcBlobHashV1 (v1 method) + hasher := sha256.New() + hashV1 := kzg4844.CalcBlobHashV1(hasher, &tt.commitment) + + // Convert hashV1 to common.Hash for comparison + hashV1CommonHash := common.Hash(hashV1) + + // They should be equal + assert.Equal(t, hashV0, hashV1CommonHash, + "CalcBlobHashV1 and kZGToVersionedHash should produce the same result") + + // Verify the first byte is 0x01 (version byte) + assert.Equal(t, uint8(0x01), hashV0[0], "First byte should be version 0x01") + assert.Equal(t, uint8(0x01), hashV1[0], "First byte should be version 0x01") + }) + } +} + +// TestCalcBlobHashV1ReuseHasher verifies that CalcBlobHashV1 can correctly reuse a hasher +// for multiple commitments. +func TestCalcBlobHashV1ReuseHasher(t *testing.T) { + // Create multiple commitments + commitments := []kzg4844.Commitment{ + {0x01, 0x02, 0x03}, // Will be padded with zeros + {0xFF, 0xFE, 0xFD}, // Will be padded with zeros + {}, // Zero commitment + } + + // Calculate hashes using reused hasher + hasher := sha256.New() + hashesV1 := make([]common.Hash, len(commitments)) + for i, commit := range commitments { + hashV1 := kzg4844.CalcBlobHashV1(hasher, &commit) + hashesV1[i] = common.Hash(hashV1) + } + + // Calculate hashes using kZGToVersionedHash (should produce same results) + hashesV0 := make([]common.Hash, len(commitments)) + for i, commit := range commitments { + hashesV0[i] = kZGToVersionedHash(commit) + } + + // Compare results + for i := range commitments { + assert.Equal(t, hashesV0[i], hashesV1[i], + "Hash %d should be equal regardless of hasher reuse", i) + } +} + +// TestCalcBlobHashV1MultipleCalls verifies that CalcBlobHashV1 produces consistent +// results when called multiple times with the same commitment. +func TestCalcBlobHashV1MultipleCalls(t *testing.T) { + commitment := kzg4844.Commitment{0x42} + + hasher1 := sha256.New() + hash1 := kzg4844.CalcBlobHashV1(hasher1, &commitment) + + hasher2 := sha256.New() + hash2 := kzg4844.CalcBlobHashV1(hasher2, &commitment) + + // Same commitment should produce same hash + assert.Equal(t, hash1, hash2, "Same commitment should produce same hash") + + // Should also match kZGToVersionedHash + hashV0 := kZGToVersionedHash(commitment) + assert.Equal(t, common.Hash(hash1), hashV0, "Should match kZGToVersionedHash result") +} diff --git a/tx-submitter/services/pendingtx.go b/tx-submitter/services/pendingtx.go index 53276fb7a..fc5ac18c2 100644 --- a/tx-submitter/services/pendingtx.go +++ b/tx-submitter/services/pendingtx.go @@ -4,230 +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) TrySetFailedBatchIndex(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 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) +} - pt.failedIndex = nil +// GetPindex gets the current pending index +func (pt *PendingTxs) GetPindex() uint64 { + return atomic.LoadUint64(&pt.pindex) } -func (pt *PendingTxs) HaveFailed() bool { - return pt.failedIndex != nil +// SetPFinalize sets the pending finalize index +func (pt *PendingTxs) SetPFinalize(finalize uint64) { + atomic.StoreUint64(&pt.pfinalize, finalize) } -func (pt *PendingTxs) ExistedIndex(index uint64) bool { +// GetPFinalize gets the current pending finalize index +func (pt *PendingTxs) GetPFinalize() uint64 { + return atomic.LoadUint64(&pt.pfinalize) +} - txs := pt.GetAll() +// 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 + } - 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()) + + 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/pendingtx_test.go b/tx-submitter/services/pendingtx_test.go deleted file mode 100644 index 71cb9ab76..000000000 --- a/tx-submitter/services/pendingtx_test.go +++ /dev/null @@ -1,31 +0,0 @@ -package services - -import ( - "testing" - - "github.com/stretchr/testify/require" -) - -func TestSetFailedStatus(t *testing.T) { - // index 2 failed -> set failed index 2 success - pt := NewPendingTxs(nil, nil, nil) - pt.SetPindex(2) - require.Nil(t, pt.failedIndex) - pt.TrySetFailedBatchIndex(2) - require.NotNil(t, pt.failedIndex) - require.EqualValues(t, 2, *pt.failedIndex) - - // failed index =2 - // new failed index = 3 - // set failed index failed - pt = NewPendingTxs(nil, nil, nil) - failedIndex := uint64(2) - pt.failedIndex = &failedIndex - pt.TrySetFailedBatchIndex(3) - require.EqualValues(t, 2, *pt.failedIndex) - - // set failed index without pindex -> failed - pt = NewPendingTxs(nil, nil, nil) - pt.TrySetFailedBatchIndex(2) - require.Nil(t, pt.failedIndex) -} diff --git a/tx-submitter/services/reorg.go b/tx-submitter/services/reorg.go new file mode 100644 index 000000000..a030b8508 --- /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 3e1de9af0..3999477b2 100644 --- a/tx-submitter/services/rollup.go +++ b/tx-submitter/services/rollup.go @@ -19,14 +19,14 @@ import ( "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/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" "github.com/morph-l2/go-ethereum/rpc" - "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" @@ -79,6 +79,9 @@ type Rollup struct { batchCache *types.BatchCache bm *l1checker.BlockMonitor eventInfoStorage *event.EventInfoStorage + reorgDetector iface.IReorgDetector + + ChainConfigMap types.ChainBlobConfigs } func NewRollup( @@ -100,8 +103,9 @@ func NewRollup( bm *l1checker.BlockMonitor, eventInfoStorage *event.EventInfoStorage, ) *Rollup { - - return &Rollup{ + batchFetcher := NewBatchFetcher(l2Clients) + reorgDetector := NewReorgDetector(l1, metrics) + r := &Rollup{ ctx: ctx, metrics: metrics, l1RpcClient: l1RpcClient, @@ -117,11 +121,14 @@ func NewRollup( cfg: cfg, signer: ethtypes.LatestSignerForChainID(chainId), externalRsaPriv: rsaPriv, - batchCache: types.NewBatchCache(), + batchCache: types.NewBatchCache(batchFetcher), ldb: ldb, bm: bm, eventInfoStorage: eventInfoStorage, + reorgDetector: reorgDetector, + ChainConfigMap: types.ChainConfigMap, } + return r } func (r *Rollup) Start() error { @@ -138,12 +145,13 @@ func (r *Rollup) Start() error { 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 @@ -158,7 +166,6 @@ func (r *Rollup) Start() error { // 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 { @@ -177,9 +184,36 @@ func (r *Rollup) Start() error { 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()) + + // has pending finalize batch (outside challenge window) + hasPendingFinalizeBatch := false + if lastCommittedBatch.Uint64() > lastFinalizedBatch.Uint64() { + // Check if the next batch to finalize is outside challenge window + nextToFinalize := new(big.Int).Add(lastFinalizedBatch, big.NewInt(1)) + inWindow, err := r.Rollup.BatchInsideChallengeWindow(nil, nextToFinalize) + if err != nil { + log.Warn("check challenge window error", "error", err, "batch_index", nextToFinalize.Uint64()) + } else if !inWindow { + // Batch is outside challenge window and ready to finalize + hasPendingFinalizeBatch = true + } + } + r.metrics.SetHasPendingFinalizeBatch(hasPendingFinalizeBatch) }) go utils.Loop(r.ctx, r.cfg.RollupInterval, func() { @@ -224,177 +258,531 @@ func (r *Rollup) Start() error { } 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 := 0; i < 3; i++ { // 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 +} - 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()) +// 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) + } + + 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) - } - - // 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) - } + + // 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) } - } else { // not in mempool - receipt, err := r.L1Client.TransactionReceipt(context.Background(), rtx.Hash()) + 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) + } +} + +// 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("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 update collected L1 fee sum in leveldb", "error", 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("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) + } + } - log.Info("tx included", - logs..., - ) + return nil +} - if receipt.Status != ethtypes.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.TrySetFailedBatchIndex(index) - r.rollupFinalizeMu.Unlock() - - } - - } else { - if method == "commitBatch" && r.pendingTxs.failedIndex != nil { - log.Info("fail revover", "failed_index", r.pendingTxs.failedIndex) - r.pendingTxs.RemoveRollupRestriction() - } - } +type txStatus struct { + state int + receipt *ethtypes.Receipt +} - 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.rollupFeeSum += fee - err = r.ldb.PutFloat(rollupSumKey, r.rollupFeeSum) - if err != nil { - log.Warn("put rollup fee sum error", "error", err) - } - r.metrics.SetRollupCost(fee) - index := utils.ParseParentBatchIndex(rtx.Data()) + 1 - batch, ok := r.batchCache.Get(index) - if ok { - collectedL1FeeFloat := ToEtherFloat((*big.Int)(batch.CollectedL1Fee)) - r.collectedL1FeeSum += collectedL1FeeFloat - err = r.ldb.PutFloat(collectedL1FeeSumKey, r.collectedL1FeeSum) - if err != nil { - log.Warn("put collected l1 fee sum error", "error", err) - } - r.metrics.SetCollectedL1Fee(ToEtherFloat((*big.Int)(batch.CollectedL1Fee))) - // remove batch from cache - r.batchCache.Delete(index) - } else { - log.Warn("batch not found in batchCache while set collect fee metrics", - "index", index, - ) - } - - } else if method == "finalizeBatch" { - r.finalizeFeeSum += fee - err = r.ldb.PutFloat(finalizeSumKey, r.finalizeFeeSum) - if err != nil { - log.Warn("put finalize fee sum error", "error", err) - } - r.metrics.SetFinalizeCost(fee) - } +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("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) + } + + 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) + } + + 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()) + + // 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) } + 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 { @@ -445,10 +833,9 @@ func (r *Rollup) finalize() error { log.Info("batch inside challenge window, wait") return nil } - // finalize - // get next batch nextBatchIndex := target.Uint64() + 1 + batch, err := GetRollupBatchByIndex(nextBatchIndex, r.L2Clients) if err != nil { log.Error("get next batch by index error", @@ -466,7 +853,7 @@ func (r *Rollup) finalize() error { if err != nil { return fmt.Errorf("pack finalizeBatch error:%v", err) } - tip, feecap, _, err := r.GetGasTipAndCap() + tip, feecap, _, _, err := r.GetGasTipAndCap() if err != nil { log.Error("get gas tip and cap error", "business", "finalize") return fmt.Errorf("get gas tip and cap error:%v", err) @@ -549,7 +936,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 @@ -557,9 +946,9 @@ 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) } @@ -568,23 +957,24 @@ func (r *Rollup) rollup() error { if err != nil { return fmt.Errorf("failed to load storage in rollup: %w", err) } - log.Info("indexer info", - "block_processed", r.eventInfoStorage.EventInfo.BlockProcessed, - "event_latest_emit_time", r.eventInfoStorage.EventInfo.BlockTime, - ) + 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(r.eventInfoStorage.EventInfo.BlockProcessed) + r.metrics.SetIndexerBlockProcessed(r.eventInfoStorage.BlockProcessed()) // check if indexed block number is too old - if blockNumber > r.eventInfoStorage.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", r.eventInfoStorage.EventInfo.BlockProcessed) + "current_block", blockNumber, + "processed_block", r.eventInfoStorage.BlockProcessed(), + "blocks_behind", blockNumber-r.eventInfoStorage.BlockProcessed()) return nil } @@ -592,30 +982,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 } @@ -627,65 +1039,31 @@ 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) - var failedIndex uint64 - if r.pendingTxs.failedIndex != nil { - failedIndex = *r.pendingTxs.failedIndex - } - log.Info("batch index info", - "last_committed_batch_index", cindex, - "batch_index_will_get", batchIndex, - "pending_index", r.pendingTxs.pindex, - "failed_index", failedIndex, - ) 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.Set(batchIndex, batch) - signature, err := r.buildSignatureInput(batch) if err != nil { return err @@ -693,14 +1071,15 @@ func (r *Rollup) rollup() error { rollupBatch := bindings.IRollupBatchDataInput{ Version: uint8(batch.Version), ParentBatchHeader: batch.ParentBatchHeader, - BlockContexts: batch.BlockContexts, + LastBlockNumber: batch.LastBlockNumber, + NumL1Messages: batch.NumL1Messages, PrevStateRoot: batch.PrevStateRoot, PostStateRoot: batch.PostStateRoot, WithdrawalRoot: batch.WithdrawRoot, } // tip and cap - tip, gasFeeCap, blobFee, err := r.GetGasTipAndCap() + tip, gasFeeCap, blobFee, head, err := r.GetGasTipAndCap() if err != nil { return fmt.Errorf("get gas tip and cap error:%v", err) } @@ -710,141 +1089,159 @@ 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, - "try_update_pooled_pending_index", cindex+1, - ) - r.pendingTxs.TrySetFailedBatchIndex(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 *ethtypes.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 = 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, - }, - }) - - } else { - tx = ethtypes.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, head) + 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, head *ethtypes.Header) (*ethtypes.Transaction, error) { + if len(batch.Sidecar.Blobs) > 0 { + return r.createBlobTx(batch, nonce, gas, tip, gasFeeCap, blobFee, calldata, head) + } + 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, head *ethtypes.Header) (*ethtypes.Transaction, error) { + versionedHashes := types.BlobHashes(batch.Sidecar.Blobs, batch.Sidecar.Commitments) + sidecar := ðtypes.BlobTxSidecar{ + Blobs: batch.Sidecar.Blobs, + Commitments: batch.Sidecar.Commitments, + } + switch types.DetermineBlobVersion(head, r.chainId.Uint64()) { + case ethtypes.BlobSidecarVersion0: + sidecar.Version = ethtypes.BlobSidecarVersion0 + proof, err := types.MakeBlobProof(sidecar.Blobs, sidecar.Commitments) + if err != nil { + return nil, fmt.Errorf("gen blob proof failed %v", err) + } + sidecar.Proofs = proof + case ethtypes.BlobSidecarVersion1: + sidecar.Version = ethtypes.BlobSidecarVersion1 + proof, err := types.MakeCellProof(sidecar.Blobs) + if err != nil { + return nil, fmt.Errorf("gen cell proof failed %v", err) + } + sidecar.Proofs = proof + default: + return nil, fmt.Errorf("unsupported blob version") + } + + 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: sidecar, + }), 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 { return nil, fmt.Errorf("invalid batch signature") } signers := make([]common.Address, len(blsSignatures)) - sigs := make([]blssignatures.Signature, 0) for i, bz := range blsSignatures { if len(bz.Signature) > 0 { - sig, err := blssignatures.SignatureFromBytes(bz.Signature) - if err != nil { - return nil, err - } - sigs = append(sigs, sig) signers[i] = bz.Signer } } - aggregatedSig := blssignatures.AggregateSignatures(sigs) - blsSignature := bls12381.NewG1().EncodePoint(aggregatedSig) // query bitmap of signers bm, err := r.Staking.GetStakersBitmap(nil, signers) @@ -858,27 +1255,26 @@ func (r *Rollup) buildSignatureInput(batch *eth.RPCRollupBatch) (*bindings.IRoll sigData := bindings.IRollupBatchSignatureInput{ SignedSequencersBitmap: bm, SequencerSets: batch.CurrentSequencerSetBytes, - Signature: blsSignature, + Signature: []byte("0x"), } return &sigData, nil } -func (r *Rollup) GetGasTipAndCap() (*big.Int, *big.Int, *big.Int, error) { - +func (r *Rollup) GetGasTipAndCap() (*big.Int, *big.Int, *big.Int, *ethtypes.Header, error) { head, err := r.L1Client.HeaderByNumber(context.Background(), nil) if err != nil { - return nil, nil, nil, err + return nil, nil, nil, nil, err } 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) + return nil, 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 + return nil, nil, nil, nil, err } log.Info("market fee info", "tip", tip) @@ -887,7 +1283,7 @@ func (r *Rollup) GetGasTipAndCap() (*big.Int, *big.Int, *big.Int, error) { 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) + return nil, nil, nil, nil, fmt.Errorf("tip is too high, tip %v exceeds max %v", tip, r.cfg.MaxTip) } var gasFeeCap *big.Int @@ -903,7 +1299,15 @@ func (r *Rollup) GetGasTipAndCap() (*big.Int, *big.Int, *big.Int, error) { // calc blob fee cap var blobFee *big.Int if head.ExcessBlobGas != nil { - blobFee = eip4844.CalcBlobFee(*head.ExcessBlobGas) + log.Info("market blob fee info", "excess blob gas", *head.ExcessBlobGas) + blobConfig, exist := types.ChainConfigMap[r.chainId.Uint64()] + if !exist { + blobConfig = types.DefaultBlobConfig + } + blobFeeDenominator := types.GetBlobFeeDenominator(blobConfig, head.Time) + blobFee = eip4844.CalcBlobFee(*head.ExcessBlobGas, blobFeeDenominator.Uint64()) + // Set to 3x to handle blob market congestion + blobFee = new(big.Int).Mul(blobFee, big.NewInt(3)) } log.Info("fee info after bump", @@ -912,7 +1316,7 @@ func (r *Rollup) GetGasTipAndCap() (*big.Int, *big.Int, *big.Int, error) { "blobfee", blobFee, ) - return tip, gasFeeCap, blobFee, nil + return tip, gasFeeCap, blobFee, head, nil } // PreCheck is run before the submitter to check whether the submitter can be started @@ -1140,7 +1544,9 @@ func (r *Rollup) SendTx(tx *ethtypes.Transaction) error { // after send tx // add to pending txs if r.pendingTxs != nil { - r.pendingTxs.Add(tx) + if err := r.pendingTxs.Add(tx); err != nil { + log.Error("failed to add transaction", "hash", tx.Hash().String(), "error", err) + } } return nil @@ -1190,7 +1596,7 @@ func (r *Rollup) ReSubmitTx(resend bool, tx *ethtypes.Transaction) (*ethtypes.Tr "nonce", tx.Nonce(), ) - tip, gasFeeCap, blobFeeCap, err := r.GetGasTipAndCap() + tip, gasFeeCap, blobFeeCap, head, err := r.GetGasTipAndCap() if err != nil { return nil, fmt.Errorf("get gas tip and cap error:%w", err) } @@ -1218,18 +1624,17 @@ func (r *Rollup) ReSubmitTx(resend bool, tx *ethtypes.Transaction) (*ethtypes.Tr 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 { - gasFeeCap = new(big.Int).Add( + recalculatedFeecap = new(big.Int).Add( tip, new(big.Int).Mul(head.BaseFee, big.NewInt(2)), ) } else { - gasFeeCap = new(big.Int).Set(tip) + recalculatedFeecap = new(big.Int).Set(tip) + } + if recalculatedFeecap.Cmp(gasFeeCap) > 0 { + gasFeeCap = recalculatedFeecap } } } @@ -1238,6 +1643,7 @@ func (r *Rollup) ReSubmitTx(resend bool, tx *ethtypes.Transaction) (*ethtypes.Tr switch tx.Type() { case ethtypes.DynamicFeeTxType: newTx = ethtypes.NewTx(ðtypes.DynamicFeeTx{ + ChainID: tx.ChainId(), To: tx.To(), Nonce: tx.Nonce(), GasFeeCap: gasFeeCap, @@ -1247,7 +1653,14 @@ func (r *Rollup) ReSubmitTx(resend bool, tx *ethtypes.Transaction) (*ethtypes.Tr Data: tx.Data(), }) case ethtypes.BlobTxType: - + sidecar := tx.BlobTxSidecar() + version := types.DetermineBlobVersion(head, r.chainId.Uint64()) + if sidecar.Version == ethtypes.BlobSidecarVersion0 && version == ethtypes.BlobSidecarVersion1 { + err = types.BlobSidecarVersionToV1(sidecar) + if err != nil { + return nil, err + } + } newTx = ethtypes.NewTx(ðtypes.BlobTx{ ChainID: uint256.MustFromBig(tx.ChainId()), Nonce: tx.Nonce(), @@ -1259,7 +1672,7 @@ func (r *Rollup) ReSubmitTx(resend bool, tx *ethtypes.Transaction) (*ethtypes.Tr Data: tx.Data(), BlobFeeCap: uint256.MustFromBig(blobFeeCap), BlobHashes: tx.BlobHashes(), - Sidecar: tx.BlobTxSidecar(), + Sidecar: sidecar, }) default: @@ -1267,11 +1680,23 @@ func (r *Rollup) ReSubmitTx(resend bool, tx *ethtypes.Transaction) (*ethtypes.Tr } + // 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) @@ -1347,7 +1772,7 @@ func (r *Rollup) InitFeeMetricsSum() error { return fmt.Errorf("get data from leveldb faild, key: %s, %w", rollupSumKey, err) } } - log.Info("rollupFeeSum: %f", rollupFeeSum) + 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) @@ -1360,7 +1785,7 @@ func (r *Rollup) InitFeeMetricsSum() error { return fmt.Errorf("get data from leveldb faild, key: %s, %w", finalizeSumKey, err) } } - log.Info("finalizeFeeSum: %f", finalizeFeeSum) + 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) @@ -1374,7 +1799,7 @@ func (r *Rollup) InitFeeMetricsSum() error { } } r.collectedL1FeeSum = collectedL1FeeSum - log.Info("collectedL1FeeSum: %f", collectedL1FeeSum) + log.Info(fmt.Sprintf("collectedL1FeeSum: %f", collectedL1FeeSum)) r.rollupFeeSum = rollupFeeSum r.finalizeFeeSum = finalizeFeeSum @@ -1385,3 +1810,123 @@ func (r *Rollup) InitFeeMetricsSum() error { 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 000000000..64f03b197 --- /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 b8045b4ab..79fe4fcd3 100644 --- a/tx-submitter/services/rollup_test.go +++ b/tx-submitter/services/rollup_test.go @@ -1,19 +1,16 @@ package services import ( - "context" "math/big" "testing" - "morph-l2/tx-submitter/mock" - "morph-l2/tx-submitter/utils" - + "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" - - "github.com/holiman/uint256" + "github.com/morph-l2/go-ethereum/crypto/kzg4844" "github.com/stretchr/testify/require" + + "morph-l2/tx-submitter/utils" ) func TestSendTx(t *testing.T) { @@ -55,101 +52,367 @@ func TestSendTx(t *testing.T) { } func TestGetGasTipAndCap(t *testing.T) { - l1Mock := mock.NewL1ClientWrapper() initTip := big.NewInt(1e9) - baseFee := big.NewInt(1e9) - excessBlobGas := uint64(1) block := types.NewBlockWithHeader( &types.Header{ - BaseFee: baseFee, - ExcessBlobGas: &excessBlobGas, + BaseFee: baseFee, }, ) + + r, l1Mock, _, _ := setupTestRollup(t) l1Mock.TipCap = initTip l1Mock.Block = block - config := utils.Config{ - MaxTip: 10e9, - MaxBaseFee: 100e9, - MinTip: 1e9, - TipFeeBump: 100, - } - r := NewRollup(context.Background(), nil, nil, l1Mock, nil, nil, nil, nil, nil, common.Address{}, nil, config, nil, nil, nil, nil, nil) - tip, feecap, blobfee, err := r.GetGasTipAndCap() + + 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) - config = utils.Config{ - MaxTip: 10e9, - MaxBaseFee: 100e9, - MinTip: 1e9, - TipFeeBump: 200, - } - r = NewRollup(context.Background(), nil, nil, l1Mock, nil, nil, nil, nil, nil, common.Address{}, nil, config, nil, nil, nil, nil, nil) - tip, feecap, blobfee, err = r.GetGasTipAndCap() + // 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))) - config = utils.Config{ - MaxTip: 10e9, - MaxBaseFee: baseFee.Uint64() - 1, - MinTip: 1e9, - TipFeeBump: 200, - } - r = NewRollup(context.Background(), nil, nil, l1Mock, nil, nil, nil, nil, nil, common.Address{}, nil, config, nil, nil, nil, nil, nil) - _, _, _, err = r.GetGasTipAndCap() + // 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") - config = utils.Config{ - MaxTip: initTip.Uint64() - 1, - MaxBaseFee: 100e9, - MinTip: 1e9, - TipFeeBump: 200, - } - r = NewRollup(context.Background(), nil, nil, l1Mock, nil, nil, nil, nil, nil, common.Address{}, nil, config, nil, nil, nil, nil, nil) - _, _, _, err = r.GetGasTipAndCap() - require.ErrorContains(t, err, "tip 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) { - l1Mock := mock.NewL1ClientWrapper() - initTip := big.NewInt(1e9) + 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) - excessBlobGas := uint64(1) block := types.NewBlockWithHeader( &types.Header{ - BaseFee: baseFee, - ExcessBlobGas: &excessBlobGas, + BaseFee: baseFee, }, ) + + r, l1Mock, _, _ := setupTestRollup(t) l1Mock.TipCap = initTip l1Mock.Block = block - config := utils.Config{ - MaxTip: 10e12, - MaxBaseFee: 100e9, - MinTip: 1e10, - TipFeeBump: 100, - } + 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") - priv, err := crypto.GenerateKey() + // 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) - r := NewRollup(context.Background(), nil, nil, l1Mock, nil, nil, nil, big.NewInt(1), priv, common.Address{}, nil, config, nil, nil, nil, nil, nil) - _, err = r.ReSubmitTx(false, nil) - require.ErrorContains(t, err, "nil tx") - oldTx := types.NewTx(&types.DynamicFeeTx{ - GasTipCap: initTip, + // 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}}, + }, }) - tx, err := r.ReSubmitTx(false, oldTx) + + cancelBlobTx, err := r.CancelTx(blobTx) require.NoError(t, err) - require.EqualValues(t, config.MinTip, tx.GasTipCap().Uint64()) + 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 c99884049..bb5bb81af 100644 --- a/tx-submitter/services/rotator.go +++ b/tx-submitter/services/rotator.go @@ -63,11 +63,11 @@ func (r *Rotator) UpdateState(clients []iface.L2Client, l1Staking iface.IL1Staki 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) @@ -96,36 +96,40 @@ func (r *Rotator) UpdateState(clients []iface.L2Client, l1Staking iface.IL1Staki log.Info( "rotator state updated", "epoch", r.epoch, - "start", r.startTime, - "epoch_update_time", epochUpdateTime, - "seq_update_time", sequcerUpdateTime, - "indexed_latest_block", storage.BlockProcessed, - "indexed_event_emit_time", storage.BlockTime, + "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 e8e185b42..302f692fe 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,24 +44,39 @@ 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) - calldatafee := new(big.Int).Mul(receipt.EffectiveGasPrice, big.NewInt(int64(receipt.GasUsed))) - // blobfee - blobfee := big.NewInt(0) - if receipt.Type == types.BlobTxType { + // Convert to ETH + ethDenominator := new(big.Float).SetInt(big.NewInt(params.Ether)) + txFeeEth := new(big.Float).Quo(txFee, ethDenominator) + + // 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 { - blobfee = new(big.Int).Mul(big.NewInt(int64(receipt.BlobGasUsed)), receipt.BlobGasPrice) + blobGasPrice.SetInt(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 { diff --git a/tx-submitter/types/batch_cache.go b/tx-submitter/types/batch_cache.go index 7e6794f1d..9be2d6031 100644 --- a/tx-submitter/types/batch_cache.go +++ b/tx-submitter/types/batch_cache.go @@ -3,28 +3,79 @@ 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 - m sync.Mutex + fetcher iface.BatchFetcher } -func NewBatchCache() *BatchCache { +// 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) { - b.m.Lock() - defer b.m.Unlock() - + // First try to get from cache + b.m.RLock() batch, ok := b.batchCache[batchIndex] - return batch, ok + 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() @@ -37,3 +88,10 @@ func (b *BatchCache) Delete(batchIndex uint64) { 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 index f07d6411e..ae1449fd0 100644 --- a/tx-submitter/types/batch_cache_test.go +++ b/tx-submitter/types/batch_cache_test.go @@ -1,21 +1,201 @@ package types import ( + "sync" "testing" - "github.com/stretchr/testify/require" + "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) + } + }() + } - cache := NewBatchCache() - cache.Set(1, nil) - _, ok := cache.Get(1) - require.True(t, ok) - cache.Delete(1) - _, ok = cache.Get(1) - require.False(t, ok) - _, ok = cache.Get(2) - require.False(t, ok) + 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 000000000..c809b5e5e --- /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/blob.go b/tx-submitter/types/blob.go new file mode 100644 index 000000000..d0da2b6bc --- /dev/null +++ b/tx-submitter/types/blob.go @@ -0,0 +1,73 @@ +package types + +import ( + "crypto/sha256" + + "github.com/morph-l2/go-ethereum/common" + ethtypes "github.com/morph-l2/go-ethereum/core/types" + "github.com/morph-l2/go-ethereum/crypto/kzg4844" +) + +// BlobHashes computes the blob hashes of the given blobs. +func BlobHashes(blobs []kzg4844.Blob, commitments []kzg4844.Commitment) []common.Hash { + hasher := sha256.New() + h := make([]common.Hash, len(commitments)) + for i := range blobs { + h[i] = kzg4844.CalcBlobHashV1(hasher, &commitments[i]) + } + return h +} + +func MakeBlobProof(blobs []kzg4844.Blob, commitment []kzg4844.Commitment) ([]kzg4844.Proof, error) { + proofs := make([]kzg4844.Proof, len(blobs)) + for i := range blobs { + proof, err := kzg4844.ComputeBlobProof(&blobs[i], commitment[i]) + if err != nil { + return nil, err + } + proofs[i] = proof + } + return proofs, nil +} + +func MakeCellProof(blobs []kzg4844.Blob) ([]kzg4844.Proof, error) { + proofs := make([]kzg4844.Proof, 0, len(blobs)*kzg4844.CellProofsPerBlob) + for _, blob := range blobs { + cellProofs, err := kzg4844.ComputeCellProofs(&blob) + if err != nil { + return nil, err + } + proofs = append(proofs, cellProofs...) + } + return proofs, nil +} + +func DetermineBlobVersion(head *ethtypes.Header, chainID uint64) byte { + if head == nil { + return ethtypes.BlobSidecarVersion0 + } + blobConfig, exist := ChainConfigMap[chainID] + if !exist { + blobConfig = DefaultBlobConfig + } + if blobConfig.OsakaTime != nil && blobConfig.IsOsaka(head.Number, head.Time) { + return ethtypes.BlobSidecarVersion1 + } + return ethtypes.BlobSidecarVersion0 +} + +// BlobSidecarVersionToV1 converts the BlobSidecar to version 1, attaching the cell proofs. +func BlobSidecarVersionToV1(sc *ethtypes.BlobTxSidecar) error { + if sc.Version == ethtypes.BlobSidecarVersion1 { + return nil + } + if sc.Version == ethtypes.BlobSidecarVersion0 { + proofs, err := MakeCellProof(sc.Blobs) + if err != nil { + return err + } + sc.Version = ethtypes.BlobSidecarVersion1 + sc.Proofs = proofs + } + return nil +} diff --git a/tx-submitter/types/blob_config.go b/tx-submitter/types/blob_config.go new file mode 100644 index 000000000..70dc371a3 --- /dev/null +++ b/tx-submitter/types/blob_config.go @@ -0,0 +1,156 @@ +package types + +import ( + "math/big" + + "github.com/morph-l2/go-ethereum/log" +) + +// BlobFeeConfig is used to configure blob fee calculation parameters. +type BlobFeeConfig struct { + ChainID *big.Int + + // LondonBlock is the London block number (used for time determination). + LondonBlock *big.Int + + // Timestamps for each EIP upgrade (Unix timestamp, seconds). + CancunTime *uint64 // EIP-4844 (Cancun) + PragueTime *uint64 // Prague + OsakaTime *uint64 // Osaka + BPO1Time *uint64 // BPO1 + BPO2Time *uint64 // BPO2 + BPO3Time *uint64 // BPO3 + BPO4Time *uint64 // BPO4 + BPO5Time *uint64 // BPO5 + + // BlobConfig corresponding to each EIP. + Cancun *BlobConfig + Prague *BlobConfig + Osaka *BlobConfig + BPO1 *BlobConfig + BPO2 *BlobConfig + BPO3 *BlobConfig + BPO4 *BlobConfig + BPO5 *BlobConfig + + Default *BlobConfig +} + +// BlobConfig contains the parameters required for blob fee calculation. +type BlobConfig struct { + // UpdateFraction is the denominator in the fakeExponential function. + UpdateFraction uint64 +} + +// Time determination methods (referencing go-ethereum logic). +// IsCancun returns whether time is either equal to the Cancun fork time or greater. +func (c *BlobFeeConfig) IsCancun(num *big.Int, time uint64) bool { + return c.IsLondon(num) && isTimestampForked(c.CancunTime, time) +} + +// IsPrague returns whether time is either equal to the Prague fork time or greater. +func (c *BlobFeeConfig) IsPrague(num *big.Int, time uint64) bool { + return c.IsLondon(num) && isTimestampForked(c.PragueTime, time) +} + +// IsOsaka returns whether time is either equal to the Osaka fork time or greater. +func (c *BlobFeeConfig) IsOsaka(num *big.Int, time uint64) bool { + return c.IsLondon(num) && isTimestampForked(c.OsakaTime, time) +} + +// IsBPO1 returns whether time is either equal to the BPO1 fork time or greater. +func (c *BlobFeeConfig) IsBPO1(num *big.Int, time uint64) bool { + return c.IsLondon(num) && isTimestampForked(c.BPO1Time, time) +} + +// IsBPO2 returns whether time is either equal to the BPO2 fork time or greater. +func (c *BlobFeeConfig) IsBPO2(num *big.Int, time uint64) bool { + return c.IsLondon(num) && isTimestampForked(c.BPO2Time, time) +} + +// IsBPO3 returns whether time is either equal to the BPO3 fork time or greater. +func (c *BlobFeeConfig) IsBPO3(num *big.Int, time uint64) bool { + return c.IsLondon(num) && isTimestampForked(c.BPO3Time, time) +} + +// IsBPO4 returns whether time is either equal to the BPO4 fork time or greater. +func (c *BlobFeeConfig) IsBPO4(num *big.Int, time uint64) bool { + return c.IsLondon(num) && isTimestampForked(c.BPO4Time, time) +} + +// IsBPO5 returns whether time is either equal to the BPO5 fork time or greater. +func (c *BlobFeeConfig) IsBPO5(num *big.Int, time uint64) bool { + return c.IsLondon(num) && isTimestampForked(c.BPO5Time, time) +} + +// IsLondon returns whether num is either equal to the London fork block or greater. +func (c *BlobFeeConfig) IsLondon(num *big.Int) bool { + return isBlockForked(c.LondonBlock, num) +} + +// GetBlobFeeDenominator returns the corresponding UpdateFraction based on the time. +func GetBlobFeeDenominator(blobFeeConfig *BlobFeeConfig, blockTime uint64) *big.Int { + if blobFeeConfig == nil { + // If not configured, use default value. + log.Warn("BlobFeeConfig not set, using default denominator", + "default", DefaultOsakaBlobConfig) + return new(big.Int).SetUint64(DefaultOsakaBlobConfig.UpdateFraction) + } + + cfg := blobFeeConfig + londonBlock := cfg.LondonBlock // London block number for fork determination. + + // Check in priority order from high to low (BPO5 -> BPO4 -> ... -> Cancun). + var blobConfig *BlobConfig + + // Check BPO5 + if cfg.BPO5Time != nil && cfg.IsBPO5(londonBlock, blockTime) && cfg.BPO5 != nil { + blobConfig = cfg.BPO5 + } else if cfg.BPO4Time != nil && cfg.IsBPO4(londonBlock, blockTime) && cfg.BPO4 != nil { + blobConfig = cfg.BPO4 + } else if cfg.BPO3Time != nil && cfg.IsBPO3(londonBlock, blockTime) && cfg.BPO3 != nil { + blobConfig = cfg.BPO3 + } else if cfg.BPO2Time != nil && cfg.IsBPO2(londonBlock, blockTime) && cfg.BPO2 != nil { + blobConfig = cfg.BPO2 + } else if cfg.BPO1Time != nil && cfg.IsBPO1(londonBlock, blockTime) && cfg.BPO1 != nil { + blobConfig = cfg.BPO1 + } else if cfg.OsakaTime != nil && cfg.IsOsaka(londonBlock, blockTime) && cfg.Osaka != nil { + blobConfig = cfg.Osaka + } else if cfg.PragueTime != nil && cfg.IsPrague(londonBlock, blockTime) && cfg.Prague != nil { + blobConfig = cfg.Prague + } else if cfg.CancunTime != nil && cfg.IsCancun(londonBlock, blockTime) && cfg.Cancun != nil { + blobConfig = cfg.Cancun + } else if cfg.Default != nil { + blobConfig = cfg.Default + } + + if blobConfig == nil { + log.Warn("No blob config found for current time, using default", + "blockTime", blockTime, + "londonBlock", londonBlock, + "default", DefaultOsakaBlobConfig) + return new(big.Int).SetUint64(DefaultOsakaBlobConfig.UpdateFraction) + } + + return new(big.Int).SetUint64(blobConfig.UpdateFraction) +} + +// isBlockForked returns whether a fork scheduled at block s is active at the +// given head block. Whilst this method is the same as isTimestampForked, they +// are explicitly separate for clearer reading. +func isBlockForked(s, head *big.Int) bool { + if s == nil || head == nil { + return false + } + return s.Cmp(head) <= 0 +} + +// isTimestampForked returns whether a fork scheduled at timestamp s is active +// at the given head timestamp. Whilst this method is the same as isBlockForked, +// they are explicitly separate for clearer reading. +func isTimestampForked(s *uint64, head uint64) bool { + if s == nil { + return false + } + return *s <= head +} diff --git a/tx-submitter/types/blob_config_test.go b/tx-submitter/types/blob_config_test.go new file mode 100644 index 000000000..cfa4e79a6 --- /dev/null +++ b/tx-submitter/types/blob_config_test.go @@ -0,0 +1,271 @@ +package types + +import ( + "strconv" + "testing" + + "github.com/morph-l2/go-ethereum/consensus/misc/eip4844" + "github.com/stretchr/testify/assert" +) + +func TestGetBlobFeeDenominator_MainnetChainConfig(t *testing.T) { + // Use MainnetChainConfig directly since map lookup with *big.Int keys requires exact pointer match + config := MainnetChainConfig + assert.NotNil(t, config, "MainnetChainConfig should exist") + + tests := []struct { + name string + blockTime uint64 + expectedResult uint64 + forkName string + }{ + { + name: "Before Cancun", + blockTime: 1710338134, // Before Cancun (1710338135) + expectedResult: DefaultOsakaBlobConfig.UpdateFraction, // Should use Default + forkName: "Default", + }, + { + name: "At Cancun", + blockTime: 1710338135, // Cancun fork time + expectedResult: DefaultCancunBlobConfig.UpdateFraction, + forkName: "Cancun", + }, + { + name: "After Cancun, Before Prague", + blockTime: 1740000000, // Between Cancun and Prague + expectedResult: DefaultCancunBlobConfig.UpdateFraction, + forkName: "Cancun", + }, + { + name: "At Prague", + blockTime: 1746612311, // Prague fork time + expectedResult: DefaultPragueBlobConfig.UpdateFraction, + forkName: "Prague", + }, + { + name: "After Prague", + blockTime: 1746612312, // After Prague + expectedResult: DefaultPragueBlobConfig.UpdateFraction, + forkName: "Prague", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := GetBlobFeeDenominator(config, tt.blockTime) + assert.NotNil(t, result) + assert.Equal(t, tt.expectedResult, result.Uint64(), "Expected %s fork UpdateFraction", tt.forkName) + }) + } +} + +func TestGetBlobFeeDenominator_HoodiChainConfig(t *testing.T) { + // Use HoodiChainConfig directly since map lookup with *big.Int keys requires exact pointer match + config := HoodiChainConfig + assert.NotNil(t, config, "HoodiChainConfig should exist") + + tests := []struct { + name string + blockTime uint64 + expectedResult uint64 + forkName string + }{ + { + name: "At Cancun (0)", + blockTime: 0, // Cancun fork time is 0 + expectedResult: DefaultCancunBlobConfig.UpdateFraction, + forkName: "Cancun", + }, + { + name: "Before Prague", + blockTime: 1742999831, // Before Prague (1742999832) + expectedResult: DefaultCancunBlobConfig.UpdateFraction, + forkName: "Cancun", + }, + { + name: "At Prague", + blockTime: 1742999832, // Prague fork time + expectedResult: DefaultPragueBlobConfig.UpdateFraction, + forkName: "Prague", + }, + { + name: "Before Osaka", + blockTime: 1761677591, // Before Osaka (1761677592) + expectedResult: DefaultPragueBlobConfig.UpdateFraction, + forkName: "Prague", + }, + { + name: "At Osaka", + blockTime: 1761677592, // Osaka fork time + expectedResult: DefaultOsakaBlobConfig.UpdateFraction, + forkName: "Osaka", + }, + { + name: "Before BPO1", + blockTime: 1762365719, // Before BPO1 (1762365720) + expectedResult: DefaultOsakaBlobConfig.UpdateFraction, + forkName: "Osaka", + }, + { + name: "At BPO1", + blockTime: 1762365720, // BPO1 fork time + expectedResult: DefaultBPO1BlobConfig.UpdateFraction, + forkName: "BPO1", + }, + { + name: "Before BPO2", + blockTime: 1762955543, // Before BPO2 (1762955544) + expectedResult: DefaultBPO1BlobConfig.UpdateFraction, + forkName: "BPO1", + }, + { + name: "At BPO2", + blockTime: 1762955544, // BPO2 fork time + expectedResult: DefaultBPO2BlobConfig.UpdateFraction, + forkName: "BPO2", + }, + { + name: "After BPO2", + blockTime: 1762955545, // After BPO2 + expectedResult: DefaultBPO2BlobConfig.UpdateFraction, + forkName: "BPO2", + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + result := GetBlobFeeDenominator(config, tt.blockTime) + assert.NotNil(t, result) + assert.Equal(t, tt.expectedResult, result.Uint64(), "Expected %s fork UpdateFraction", tt.forkName) + }) + } +} + +func TestGetBlobFeeDenominator_NilConfig(t *testing.T) { + t.Run("Nil config uses default", func(t *testing.T) { + result := GetBlobFeeDenominator(nil, 1000000000) + assert.NotNil(t, result) + assert.Equal(t, DefaultOsakaBlobConfig.UpdateFraction, result.Uint64()) + }) +} + +func TestGetBlobFeeDenominator_AllChainConfigs(t *testing.T) { + // Test that all chain configs in ChainConfigMap work correctly + for chainID, config := range ChainConfigMap { + t.Run("ChainID_"+strconv.FormatUint(chainID, 10), func(t *testing.T) { + assert.NotNil(t, config, "Config should not be nil for chainID %s", chainID) + assert.NotNil(t, config.LondonBlock, "LondonBlock should not be nil for chainID %s", chainID) + + // Test with a very large timestamp to ensure it works + result := GetBlobFeeDenominator(config, 9999999999) + assert.NotNil(t, result) + assert.Greater(t, result.Uint64(), uint64(0), "UpdateFraction should be greater than 0") + }) + } +} + +func TestGetBlobFeeDenominator_ChainConfigMap(t *testing.T) { + // Test GetBlobFeeDenominator using ChainConfigMap + t.Run("Mainnet from ChainConfigMap", func(t *testing.T) { + // Find Mainnet config by ChainID + var mainnetConfig *BlobFeeConfig + for chainID, config := range ChainConfigMap { + if chainID == 1 { + mainnetConfig = config + break + } + } + assert.NotNil(t, mainnetConfig, "Mainnet config should be found in ChainConfigMap") + + // Test various timestamps + result := GetBlobFeeDenominator(mainnetConfig, 1710338135) // At Cancun + assert.Equal(t, DefaultCancunBlobConfig.UpdateFraction, result.Uint64()) + + result = GetBlobFeeDenominator(mainnetConfig, 1746612311) // At Prague + assert.Equal(t, DefaultPragueBlobConfig.UpdateFraction, result.Uint64()) + }) + + t.Run("Hoodi from ChainConfigMap", func(t *testing.T) { + // Find Hoodi config by ChainID + var hoodiConfig *BlobFeeConfig + for chainID, config := range ChainConfigMap { + if chainID == 560048 { + hoodiConfig = config + break + } + } + assert.NotNil(t, hoodiConfig, "Hoodi config should be found in ChainConfigMap") + + // Test various timestamps + result := GetBlobFeeDenominator(hoodiConfig, 0) // At Cancun (0) + assert.Equal(t, DefaultCancunBlobConfig.UpdateFraction, result.Uint64()) + + result = GetBlobFeeDenominator(hoodiConfig, 1761677592) // At Osaka + assert.Equal(t, DefaultOsakaBlobConfig.UpdateFraction, result.Uint64()) + + result = GetBlobFeeDenominator(hoodiConfig, 1762365720) // At BPO1 + assert.Equal(t, DefaultBPO1BlobConfig.UpdateFraction, result.Uint64()) + + result = GetBlobFeeDenominator(hoodiConfig, 1762955544) // At BPO2 + assert.Equal(t, DefaultBPO2BlobConfig.UpdateFraction, result.Uint64()) + }) + + t.Run("Devnet from ChainConfigMap", func(t *testing.T) { + // Find Devnet config by ChainID + var devnetConfig *BlobFeeConfig + for chainID, config := range ChainConfigMap { + if chainID == 900 { + devnetConfig = config + break + } + } + assert.NotNil(t, devnetConfig, "Devnet config should be found in ChainConfigMap") + + // Test various timestamps + result := GetBlobFeeDenominator(devnetConfig, 0) // At Cancun (0) + assert.Equal(t, DefaultCancunBlobConfig.UpdateFraction, result.Uint64()) + + result = GetBlobFeeDenominator(devnetConfig, 1761677592) // At Osaka + assert.Equal(t, DefaultOsakaBlobConfig.UpdateFraction, result.Uint64()) + + result = GetBlobFeeDenominator(devnetConfig, 1762365720) // At BPO1 + assert.Equal(t, DefaultBPO1BlobConfig.UpdateFraction, result.Uint64()) + + result = GetBlobFeeDenominator(devnetConfig, 1762955544) // At BPO2 + assert.Equal(t, DefaultBPO2BlobConfig.UpdateFraction, result.Uint64()) + }) +} + +func TestGetBlobFeeDenominator_ForkPriority(t *testing.T) { + // Test that higher priority forks are checked first + config := HoodiChainConfig + assert.NotNil(t, config) + + // At BPO2 time, should return BPO2, not BPO1, Osaka, Prague, or Cancun + bpo2Time := uint64(1762955544) + result := GetBlobFeeDenominator(config, bpo2Time) + assert.Equal(t, DefaultBPO2BlobConfig.UpdateFraction, result.Uint64()) + + // At BPO1 time, should return BPO1, not Osaka, Prague, or Cancun + bpo1Time := uint64(1762365720) + result = GetBlobFeeDenominator(config, bpo1Time) + assert.Equal(t, DefaultBPO1BlobConfig.UpdateFraction, result.Uint64()) + + // At Osaka time, should return Osaka, not Prague or Cancun + osakaTime := uint64(1761677592) + result = GetBlobFeeDenominator(config, osakaTime) + assert.Equal(t, DefaultOsakaBlobConfig.UpdateFraction, result.Uint64()) +} + +func TestCal(t *testing.T) { + // Test that higher priority forks are checked first + config := HoodiChainConfig + assert.NotNil(t, config) + + timeNow := uint64(1762395060) + result := GetBlobFeeDenominator(config, timeNow) + t.Log(result) + fee := eip4844.CalcBlobFee(170172092, result.Uint64()) + t.Log(fee.Uint64()) +} diff --git a/tx-submitter/types/blob_params.go b/tx-submitter/types/blob_params.go new file mode 100644 index 000000000..4ebe43a41 --- /dev/null +++ b/tx-submitter/types/blob_params.go @@ -0,0 +1,103 @@ +package types + +import ( + "math/big" +) + +var ( + DefaultBlobConfig = HoodiChainConfig + + ChainConfigMap = ChainBlobConfigs{ + 1: MainnetChainConfig, + 560048: HoodiChainConfig, + 900: DevnetChainConfig, + } +) + +func newUint64(val uint64) *uint64 { return &val } + +type ChainBlobConfigs map[uint64]*BlobFeeConfig + +var ( + // MainnetChainConfig is the chain parameters to run a node on the main network. + MainnetChainConfig = &BlobFeeConfig{ + ChainID: big.NewInt(1), + LondonBlock: big.NewInt(12_965_000), + CancunTime: newUint64(1710338135), + PragueTime: newUint64(1746612311), + OsakaTime: newUint64(1764798551), + BPO1Time: newUint64(1765290071), + BPO2Time: newUint64(1767747671), + Cancun: DefaultCancunBlobConfig, + Prague: DefaultPragueBlobConfig, + Osaka: DefaultOsakaBlobConfig, + BPO1: DefaultBPO1BlobConfig, + BPO2: DefaultBPO2BlobConfig, + Default: DefaultOsakaBlobConfig, + } + + // HoodiChainConfig contains the chain parameters to run a node on the Hoodi test network. + HoodiChainConfig = &BlobFeeConfig{ + ChainID: big.NewInt(560048), + LondonBlock: big.NewInt(0), + CancunTime: newUint64(0), + PragueTime: newUint64(1742999832), + OsakaTime: newUint64(1761677592), + BPO1Time: newUint64(1762365720), + BPO2Time: newUint64(1762955544), + Cancun: DefaultCancunBlobConfig, + Prague: DefaultPragueBlobConfig, + Osaka: DefaultOsakaBlobConfig, + BPO1: DefaultBPO1BlobConfig, + BPO2: DefaultBPO2BlobConfig, + Default: DefaultOsakaBlobConfig, + } + + // DevnetChainConfig contains the chain parameters to run a node on the devnet test network. + DevnetChainConfig = &BlobFeeConfig{ + ChainID: big.NewInt(900), + LondonBlock: big.NewInt(0), + CancunTime: newUint64(0), + PragueTime: newUint64(1742999832), + OsakaTime: newUint64(1761677592), + BPO1Time: newUint64(1762365720), + BPO2Time: newUint64(1762955544), + Cancun: DefaultCancunBlobConfig, + Prague: DefaultPragueBlobConfig, + Osaka: DefaultOsakaBlobConfig, + BPO1: DefaultBPO1BlobConfig, + BPO2: DefaultBPO2BlobConfig, + Default: DefaultOsakaBlobConfig, + } +) + +var ( + // DefaultCancunBlobConfig is the default blob configuration for the Cancun fork. + DefaultCancunBlobConfig = &BlobConfig{ + UpdateFraction: 3338477, + } + // DefaultPragueBlobConfig is the default blob configuration for the Prague fork. + DefaultPragueBlobConfig = &BlobConfig{ + UpdateFraction: 5007716, + } + // DefaultOsakaBlobConfig is the default blob configuration for the Osaka fork. + DefaultOsakaBlobConfig = &BlobConfig{ + UpdateFraction: 5007716, + } + // DefaultBPO1BlobConfig is the default blob configuration for the BPO1 fork. + DefaultBPO1BlobConfig = &BlobConfig{ + UpdateFraction: 8346193, + } + // DefaultBPO2BlobConfig is the default blob configuration for the BPO2 fork. + DefaultBPO2BlobConfig = &BlobConfig{ + UpdateFraction: 11684671, + } + // DefaultBPO3BlobConfig is the default blob configuration for the BPO3 fork. + DefaultBPO3BlobConfig = &BlobConfig{ + UpdateFraction: 20609697, + } + // DefaultBPO4BlobConfig is the default blob configuration for the BPO4 fork. + DefaultBPO4BlobConfig = &BlobConfig{ + UpdateFraction: 13739630, + } +) diff --git a/tx-submitter/types/blob_test.go b/tx-submitter/types/blob_test.go new file mode 100644 index 000000000..8f5beae7b --- /dev/null +++ b/tx-submitter/types/blob_test.go @@ -0,0 +1,273 @@ +package types + +import ( + "crypto/rand" + "testing" + + "github.com/consensys/gnark-crypto/ecc/bls12-381/fr" + gokzg4844 "github.com/crate-crypto/go-eth-kzg" + "github.com/morph-l2/go-ethereum/crypto/kzg4844" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" +) + +// randFieldElement generates a random valid field element for BLS12-381 +func randFieldElement() [32]byte { + bytes := make([]byte, 32) + _, err := rand.Read(bytes) + if err != nil { + panic("failed to get random field element") + } + var r fr.Element + r.SetBytes(bytes) + return gokzg4844.SerializeScalar(r) +} + +// randBlob creates a random valid blob +func randBlob() *kzg4844.Blob { + var blob kzg4844.Blob + for i := 0; i < len(blob); i += gokzg4844.SerializedScalarSize { + fieldElementBytes := randFieldElement() + copy(blob[i:i+gokzg4844.SerializedScalarSize], fieldElementBytes[:]) + } + return &blob +} + +// emptyBlob creates an empty (zero) blob +func emptyBlob() *kzg4844.Blob { + return new(kzg4844.Blob) +} + +func TestMakeBlobProof_SingleBlob(t *testing.T) { + // Create a single blob + blob := randBlob() + + // Generate commitment from blob + commitment, err := kzg4844.BlobToCommitment(blob) + require.NoError(t, err, "should create commitment from blob") + + // Generate proofs using MakeBlobProof + blobs := []kzg4844.Blob{*blob} + commitments := []kzg4844.Commitment{commitment} + + proofs, err := MakeBlobProof(blobs, commitments) + require.NoError(t, err, "should generate proofs") + require.Len(t, proofs, 1, "should generate one proof for one blob") + + // Verify the proof + err = kzg4844.VerifyBlobProof(blob, commitment, proofs[0]) + assert.NoError(t, err, "proof should verify successfully") +} + +func TestMakeBlobProof_MultipleBlobs(t *testing.T) { + // Create multiple blobs + numBlobs := 3 + blobs := make([]kzg4844.Blob, numBlobs) + commitments := make([]kzg4844.Commitment, numBlobs) + + // Generate commitments for each blob + for i := 0; i < numBlobs; i++ { + blob := randBlob() + blobs[i] = *blob + + commitment, err := kzg4844.BlobToCommitment(blob) + require.NoError(t, err, "should create commitment from blob") + commitments[i] = commitment + } + + // Generate proofs using MakeBlobProof + proofs, err := MakeBlobProof(blobs, commitments) + require.NoError(t, err, "should generate proofs") + require.Len(t, proofs, numBlobs, "should generate one proof per blob") + + // Verify each proof + for i := 0; i < numBlobs; i++ { + err = kzg4844.VerifyBlobProof(&blobs[i], commitments[i], proofs[i]) + assert.NoError(t, err, "proof %d should verify successfully", i) + } +} + +func TestMakeBlobProof_EmptyBlob(t *testing.T) { + // Test with empty (zero) blob + blob := emptyBlob() + + commitment, err := kzg4844.BlobToCommitment(blob) + require.NoError(t, err, "should create commitment from empty blob") + + blobs := []kzg4844.Blob{*blob} + commitments := []kzg4844.Commitment{commitment} + + proofs, err := MakeBlobProof(blobs, commitments) + require.NoError(t, err, "should generate proof for empty blob") + require.Len(t, proofs, 1, "should generate one proof") + + // Verify the proof + err = kzg4844.VerifyBlobProof(blob, commitment, proofs[0]) + assert.NoError(t, err, "proof for empty blob should verify successfully") +} + +func TestMakeBlobProof_InvalidCommitment(t *testing.T) { + // Test with blob and mismatched commitment + blob := randBlob() + // Create a different blob and its commitment + otherBlob := randBlob() + wrongCommitment, err := kzg4844.BlobToCommitment(otherBlob) + require.NoError(t, err) + + blobs := []kzg4844.Blob{*blob} + commitments := []kzg4844.Commitment{wrongCommitment} + + // MakeBlobProof should succeed (it doesn't validate commitment matches blob) + proofs, err := MakeBlobProof(blobs, commitments) + require.NoError(t, err, "MakeBlobProof should succeed even with wrong commitment") + require.Len(t, proofs, 1) + + // But verification should fail + err = kzg4844.VerifyBlobProof(blob, wrongCommitment, proofs[0]) + assert.Error(t, err, "verification should fail with mismatched commitment") +} + +func TestMakeBlobProof_EmptySlice(t *testing.T) { + // Test with empty slices + blobs := []kzg4844.Blob{} + commitments := []kzg4844.Commitment{} + + proofs, err := MakeBlobProof(blobs, commitments) + require.NoError(t, err, "should handle empty slices") + require.Len(t, proofs, 0, "should return empty proofs slice") +} + +func TestMakeCellProof_SingleBlob(t *testing.T) { + // Create a single blob + blob := randBlob() + + // Generate commitment from blob + commitment, err := kzg4844.BlobToCommitment(blob) + require.NoError(t, err, "should create commitment from blob") + + // Generate cell proofs using MakeCellProof + blobs := []kzg4844.Blob{*blob} + proofs, err := MakeCellProof(blobs) + require.NoError(t, err, "should generate cell proofs") + require.Len(t, proofs, kzg4844.CellProofsPerBlob, "should generate %d proofs for one blob", kzg4844.CellProofsPerBlob) + + // Verify the cell proofs + err = kzg4844.VerifyCellProofs(blobs, []kzg4844.Commitment{commitment}, proofs) + assert.NoError(t, err, "cell proofs should verify successfully") +} + +func TestMakeCellProof_MultipleBlobs(t *testing.T) { + // Create multiple blobs + numBlobs := 3 + blobs := make([]kzg4844.Blob, numBlobs) + commitments := make([]kzg4844.Commitment, numBlobs) + + // Generate commitments for each blob + for i := 0; i < numBlobs; i++ { + blob := randBlob() + blobs[i] = *blob + + commitment, err := kzg4844.BlobToCommitment(blob) + require.NoError(t, err, "should create commitment from blob") + commitments[i] = commitment + } + + // Generate cell proofs using MakeCellProof + proofs, err := MakeCellProof(blobs) + require.NoError(t, err, "should generate cell proofs") + expectedProofCount := numBlobs * kzg4844.CellProofsPerBlob + require.Len(t, proofs, expectedProofCount, "should generate %d proofs for %d blobs", expectedProofCount, numBlobs) + + // Verify all cell proofs + err = kzg4844.VerifyCellProofs(blobs, commitments, proofs) + assert.NoError(t, err, "cell proofs should verify successfully") +} + +func TestMakeCellProof_EmptyBlob(t *testing.T) { + // Test with empty (zero) blob + blob := emptyBlob() + + commitment, err := kzg4844.BlobToCommitment(blob) + require.NoError(t, err, "should create commitment from empty blob") + + blobs := []kzg4844.Blob{*blob} + proofs, err := MakeCellProof(blobs) + require.NoError(t, err, "should generate cell proofs for empty blob") + require.Len(t, proofs, kzg4844.CellProofsPerBlob, "should generate %d proofs", kzg4844.CellProofsPerBlob) + + // Verify the cell proofs + err = kzg4844.VerifyCellProofs(blobs, []kzg4844.Commitment{commitment}, proofs) + assert.NoError(t, err, "cell proofs for empty blob should verify successfully") +} + +func TestMakeCellProof_EmptySlice(t *testing.T) { + // Test with empty slice + blobs := []kzg4844.Blob{} + + proofs, err := MakeCellProof(blobs) + require.NoError(t, err, "should handle empty slice") + require.Len(t, proofs, 0, "should return empty proofs slice") +} + +func TestMakeCellProof_ProofCount(t *testing.T) { + // Test that each blob generates exactly CellProofsPerBlob proofs + testCases := []struct { + name string + numBlobs int + }{ + {"single blob", 1}, + {"two blobs", 2}, + {"five blobs", 5}, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + blobs := make([]kzg4844.Blob, tc.numBlobs) + for i := 0; i < tc.numBlobs; i++ { + blob := randBlob() + blobs[i] = *blob + } + + proofs, err := MakeCellProof(blobs) + require.NoError(t, err) + expectedCount := tc.numBlobs * kzg4844.CellProofsPerBlob + assert.Equal(t, expectedCount, len(proofs), "should generate %d proofs for %d blobs", expectedCount, tc.numBlobs) + }) + } +} + +func TestMakeCellProof_ProofGrouping(t *testing.T) { + // Test that proofs are correctly grouped by blob + // Each blob's proofs should be consecutive in the proofs slice + numBlobs := 2 + blobs := make([]kzg4844.Blob, numBlobs) + commitments := make([]kzg4844.Commitment, numBlobs) + + for i := 0; i < numBlobs; i++ { + blob := randBlob() + blobs[i] = *blob + + commitment, err := kzg4844.BlobToCommitment(blob) + require.NoError(t, err) + commitments[i] = commitment + } + + // Generate all proofs + allProofs, err := MakeCellProof(blobs) + require.NoError(t, err) + + // Verify each blob's proofs individually + for i := 0; i < numBlobs; i++ { + startIdx := i * kzg4844.CellProofsPerBlob + endIdx := startIdx + kzg4844.CellProofsPerBlob + blobProofs := allProofs[startIdx:endIdx] + + // Verify this blob's proofs + err = kzg4844.VerifyCellProofs( + []kzg4844.Blob{blobs[i]}, + []kzg4844.Commitment{commitments[i]}, + blobProofs, + ) + assert.NoError(t, err, "blob %d proofs should verify successfully", i) + } +} diff --git a/tx-submitter/types/tx.go b/tx-submitter/types/tx.go new file mode 100644 index 000000000..45ec9644a --- /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/methods.go b/tx-submitter/utils/methods.go index b2e19782a..65a96c15a 100644 --- a/tx-submitter/utils/methods.go +++ b/tx-submitter/utils/methods.go @@ -135,3 +135,15 @@ func ParseStringToType[T any](s string) (T, error) { 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 index 381cb65e4..ed050dda6 100644 --- a/tx-submitter/utils/methods_test.go +++ b/tx-submitter/utils/methods_test.go @@ -2,6 +2,7 @@ package utils import ( "fmt" + "math/big" "testing" "github.com/stretchr/testify/require" @@ -84,3 +85,71 @@ func TestParseStringToType(t *testing.T) { }) } } + +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 bcfc02051..06de87e6e 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 71cf61114..75f2382f2 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) }