diff --git a/.github/workflows/oracle.yml b/.github/workflows/oracle.yml index 6ad292d43..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.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 +# 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/Makefile b/Makefile index c12a4ca44..6e55077de 100644 --- a/Makefile +++ b/Makefile @@ -1,6 +1,6 @@ ################## update dependencies #################### -ETHEREUM_SUBMODULE_COMMIT_OR_TAG := morph-v2.0.9 -ETHEREUM_TARGET_VERSION := morph-v2.0.8 +ETHEREUM_SUBMODULE_COMMIT_OR_TAG := morph-v2.1.0 +ETHEREUM_TARGET_VERSION := v1.10.14-0.20251219060125-03910bc750a2 TENDERMINT_TARGET_VERSION := v0.3.2 ETHEREUM_MODULE_NAME := github.com/morph-l2/go-ethereum @@ -30,6 +30,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: diff --git a/MakefileEc2.mk b/MakefileEc2.mk index 876f0d3fd..92832247d 100644 --- a/MakefileEc2.mk +++ b/MakefileEc2.mk @@ -22,7 +22,7 @@ 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 qanet build-bk-test-morph-test-qanet-to-morph-node-qanet: if [ ! -d dist ]; then mkdir -p dist; fi cd $(PWD)/node && make build @@ -38,7 +38,6 @@ build-bk-test-morph-test-qanet-to-morph-tx-submitter-qanet: 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 - # build for hoodi build-bk-prod-morph-prod-testnet-to-morph-node-hoodi: if [ ! -d dist ]; then mkdir -p dist; fi @@ -54,4 +53,3 @@ build-bk-prod-morph-prod-testnet-to-morph-tx-submitter-hoodi: 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/hoodi/morph-setup/tx-submitter.tar.gz - diff --git a/MakefileEks.mk b/MakefileEks.mk index efef15103..03a8b39d1 100644 --- a/MakefileEks.mk +++ b/MakefileEks.mk @@ -93,6 +93,36 @@ 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 + +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/ + + +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/ + + +start-bk-prod-morph-prod-mainnet-to-morph-token-price-oracle: + /data/secret-manager-wrapper ./token-price-oracle + # gas-oracle # testnet 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/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/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/go.mod b/bindings/go.mod index 5a3a5e7a2..cb76dba78 100644 --- a/bindings/go.mod +++ b/bindings/go.mod @@ -4,7 +4,7 @@ go 1.24.0 replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3.2 -require github.com/morph-l2/go-ethereum v1.10.14-0.20251031091135-78b17f183b84 +require github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2 require ( github.com/VictoriaMetrics/fastcache v1.12.2 // indirect diff --git a/bindings/go.sum b/bindings/go.sum index 75302b02e..a479ed434 100644 --- a/bindings/go.sum +++ b/bindings/go.sum @@ -111,8 +111,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.20251031091135-78b17f183b84 h1:FmHKWYMNfIfpNDWO4+ulmmgstBI5Ujt7NWI1g1PzVjQ= -github.com/morph-l2/go-ethereum v1.10.14-0.20251031091135-78b17f183b84/go.mod h1:U/Gt6UghgHD7SB8t/rTD9908qFRjvzgIAtXUqEYjtI8= +github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2 h1:FUv9gtnvF+1AVrkoNGYbVOesi7E+STjdfD2mcqVaEY0= +github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2/go.mod h1:tiFPeidxjoCmLj18ne9H3KQdIGTCvRC30qlef06Fd9M= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/nxadm/tail v1.4.4/go.mod h1:kenIhsEOeOJmVchQTgglprH7qJGnHDVpk1VPCcaMI8A= github.com/nxadm/tail v1.4.8/go.mod h1:+ncqLTQzXmGhMZNUePPaPqPvBxHAIsmXswZKocGu+AU= diff --git a/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/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/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/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/go.mod b/contracts/go.mod index fd82ebd06..05b2b2912 100644 --- a/contracts/go.mod +++ b/contracts/go.mod @@ -6,26 +6,71 @@ replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3. require ( github.com/iden3/go-iden3-crypto v0.0.16 - github.com/morph-l2/go-ethereum v1.10.14-0.20251031091135-78b17f183b84 + github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2 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.15 // 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/rogpeppe/go-internal v1.12.0 // 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/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.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 - gopkg.in/check.v1 v1.0.0-20201130134442-10cb98267c6c // 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 4813f6cc5..319f1f2b8 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.20251031091135-78b17f183b84 h1:FmHKWYMNfIfpNDWO4+ulmmgstBI5Ujt7NWI1g1PzVjQ= -github.com/morph-l2/go-ethereum v1.10.14-0.20251031091135-78b17f183b84/go.mod h1:U/Gt6UghgHD7SB8t/rTD9908qFRjvzgIAtXUqEYjtI8= -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.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/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.20251219060125-03910bc750a2 h1:FUv9gtnvF+1AVrkoNGYbVOesi7E+STjdfD2mcqVaEY0= +github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2/go.mod h1:tiFPeidxjoCmLj18ne9H3KQdIGTCvRC30qlef06Fd9M= +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.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= +github.com/rivo/uniseg v0.4.3/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/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.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.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/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 37b666482..ae2f966ba 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: '0x0059b74a8fd03c44462de3916b45ebeedb9f1158e3037e8c40b8941cbe438d7e', + programVkey: '0x0044eed79d39a90e842c5f5e599d019cbe63c1719300f1366f9dc4d3729f7810', // rollup contract config // initialize config finalizationPeriodSeconds: 600, diff --git a/contracts/src/deploy-config/hoodi.ts b/contracts/src/deploy-config/hoodi.ts index 8304f699c..bc1c3c5a6 100644 --- a/contracts/src/deploy-config/hoodi.ts +++ b/contracts/src/deploy-config/hoodi.ts @@ -17,7 +17,7 @@ const config = { l2BaseFee: 0.1, // Gwei // verify contract config - programVkey: '0x006c835a4c049b699a3675fefa51b182c7efe404a656151c0410245966724bc3', + programVkey: '0x0044eed79d39a90e842c5f5e599d019cbe63c1719300f1366f9dc4d3729f7810', // rollup contract config // initialize config finalizationPeriodSeconds: 600, diff --git a/contracts/src/deploy-config/l1.ts b/contracts/src/deploy-config/l1.ts index 7a6bc7ef7..ce19c9eda 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: '0x0059b74a8fd03c44462de3916b45ebeedb9f1158e3037e8c40b8941cbe438d7e', + programVkey: '0x0044eed79d39a90e842c5f5e599d019cbe63c1719300f1366f9dc4d3729f7810', // rollup contract config // initialize config finalizationPeriodSeconds: 10, diff --git a/contracts/src/deploy-config/qanetl1.ts b/contracts/src/deploy-config/qanetl1.ts index c266e34fd..6c992d9db 100644 --- a/contracts/src/deploy-config/qanetl1.ts +++ b/contracts/src/deploy-config/qanetl1.ts @@ -14,7 +14,7 @@ const config = { l2BaseFee: 0.1, // Gwei // verify contract config - programVkey: '0x0059b74a8fd03c44462de3916b45ebeedb9f1158e3037e8c40b8941cbe438d7e', + programVkey: '0x0044eed79d39a90e842c5f5e599d019cbe63c1719300f1366f9dc4d3729f7810', // rollup contract config // initialize config finalizationPeriodSeconds: 600, diff --git a/contracts/src/deploy-config/sepolia.ts b/contracts/src/deploy-config/sepolia.ts index e8838ba00..afaa17718 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: '0x006c835a4c049b699a3675fefa51b182c7efe404a656151c0410245966724bc3', + programVkey: '0x0044eed79d39a90e842c5f5e599d019cbe63c1719300f1366f9dc4d3729f7810', rollupMinDeposit: 0.0001, rollupProofWindow: 86400, rollupGenesisBlockNumber: 0, diff --git a/contracts/src/deploy-config/testnetl1.ts b/contracts/src/deploy-config/testnetl1.ts index 2d95a2324..8d0bdee8b 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: '0x006c835a4c049b699a3675fefa51b182c7efe404a656151c0410245966724bc3', + programVkey: '0x0044eed79d39a90e842c5f5e599d019cbe63c1719300f1366f9dc4d3729f7810', 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/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/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 3ab36c5d8..03910bc75 160000 --- a/go-ethereum +++ b/go-ethereum @@ -1 +1 @@ -Subproject commit 3ab36c5d8cb65a5b50540f29ef7640c17a95d1f9 +Subproject commit 03910bc750a2301be4c1410b9f3c4d3741df251e diff --git a/go.work b/go.work index 7b232d505..d29dbaad9 100644 --- a/go.work +++ b/go.work @@ -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 7006bf015..4403ab863 100644 --- a/go.work.sum +++ b/go.work.sum @@ -1,307 +1,591 @@ +4d63.com/gochecknoglobals v0.1.0 h1:zeZSRqj5yCg28tCkIV/z/lWbwvNm5qnKVS15PI8nhD0= 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.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.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.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= github.com/Antonboom/errname v0.1.7/go.mod h1:g0ONh16msHIPgJSGsecu1G/dcF2hlYR/0SddnIAGavU= +github.com/Antonboom/nilnil v0.1.1 h1:PHhrh5ANKFWRBh7TdYmyyq2gyT2lotnvFvvFbylF81Q= github.com/Antonboom/nilnil v0.1.1/go.mod h1:L1jBqoWM7AOeTD+tSquifKSesRHs4ZdaxvZR+xdJEaI= 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.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= +github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24 h1:sHglBQTwgx+rWPdisA5ynNEsoARbiCBOyGcJM4/OzsM= github.com/Djarvur/go-err113 v0.0.0-20210108212216-aea10b59be24/go.mod h1:4UJr5HIiMZrwgkSPdsjy2uOQExX/WEILpIrO9UPGuXs= +github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0 h1:+r1rSv4gvYn0wmRjC8X7IAzX8QezqtFV9m0MUHFJgts= github.com/GaijinEntertainment/go-exhaustruct/v2 v2.3.0/go.mod h1:b3g59n2Y+T5xmcxJL+UEG2f8cQploZm1mR/v6BW0mU0= github.com/HdrHistogram/hdrhistogram-go v1.1.0/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/HdrHistogram/hdrhistogram-go v1.1.2 h1:5IcZpTvzydCQeHzK4Ef/D5rrSqwxob0t8PQPMybUNFM= github.com/HdrHistogram/hdrhistogram-go v1.1.2/go.mod h1:yDgFjdqOqDEKOvasDdhWNXYg9BVp4O+o5f6V/ehm6Oo= +github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible h1:1G1pk05UrOh0NlF1oeaaix1x8XzrfjIDK47TY0Zehcw= github.com/Knetic/govaluate v3.0.1-0.20171022003610-9aa49832a739+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= +github.com/Masterminds/semver v1.5.0 h1:H65muMkzWKEuNDnfl9d70GUjFniHKHRbFPGBuZ3QEww= 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= +github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137 h1:s6gZFSlWYmbqAuRjVTiNNhvNRfY2Wxp9nhfyel4rklc= github.com/alecthomas/units v0.0.0-20211218093645-b94a6e3cc137/go.mod h1:OMCwj8VM1Kc9e19TLln2VL61YJF0x1XFtfdL4JdbSyE= +github.com/alexkohler/prealloc v1.0.0 h1:Hbq0/3fJPQhNkN0dR95AVrr6R7tou91y0uHG5pOcUuw= 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= github.com/armon/go-metrics v0.3.9/go.mod h1:4O98XIr/9W0sxpJ8UaYkvjk10Iff7SnFrb4QAOwNTFc= +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= +github.com/ashanbrown/makezero v1.1.1 h1:iCQ87C0V0vSyO+M9E/FZYbu65auqH0lnsOkf5FcB28s= github.com/ashanbrown/makezero v1.1.1/go.mod h1:i1bJLCRSCHOcOa9Y6MyF2FTfMZMFdHvxKHxgO5Z1axI= +github.com/aws/aws-sdk-go v1.40.45 h1:QN1nsY27ssD/JmW4s83qmSb+uL6DG4GmCDzjmJB4xUI= github.com/aws/aws-sdk-go v1.40.45/go.mod h1:585smgzpB/KqRA+K3y/NL/oYRqQvpNJYvLm+LY1U59Q= github.com/aws/aws-sdk-go-v2 v1.9.1/go.mod h1:cK/D0BBs0b/oWPIcX/Z/obahJK1TT7IPVjy53i/mX/4= github.com/aws/aws-sdk-go-v2 v1.21.2/go.mod h1:ErQhvNuEMhJjweavOYhxVkn2RUx7kQXVATHrjKtxIpM= +github.com/aws/aws-sdk-go-v2 v1.24.1 h1:xAojnj+ktS95YZlDf0zxWBkbFtymPeDP+rvUQIH3uAU= github.com/aws/aws-sdk-go-v2 v1.24.1/go.mod h1:LNh45Br1YAkEKaAqvmE1m8FUx6a5b/V0oAKV7of29b4= +github.com/aws/aws-sdk-go-v2/config v1.26.6 h1:Z/7w9bUqlRI0FFQpetVuFYEsjzE3h7fpU6HuGmfPL/o= github.com/aws/aws-sdk-go-v2/config v1.26.6/go.mod h1:uKU6cnDmYCvJ+pxO9S4cWDb2yWWIH5hra+32hVh1MI4= +github.com/aws/aws-sdk-go-v2/credentials v1.16.16 h1:8q6Rliyv0aUFAVtzaldUEcS+T5gbadPbWdV1WcAddK8= github.com/aws/aws-sdk-go-v2/credentials v1.16.16/go.mod h1:UHVZrdUsv63hPXFo1H7c5fEneoVo9UXiz36QG1GEPi0= +github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11 h1:c5I5iH+DZcH3xOIMlz3/tCKJDaHFwYEmxvlh2fAcFo8= github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.14.11/go.mod h1:cRrYDYAMUohBJUtUnOhydaMHtiK/1NZ0Otc9lIb6O0Y= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.43/go.mod h1:auo+PiyLl0n1l8A0e8RIeR8tOzYPfZZH/JNlrJ8igTQ= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10 h1:vF+Zgd9s+H4vOXd5BMaPWykta2a6Ih0AKLq/X6NYKn4= github.com/aws/aws-sdk-go-v2/internal/configsources v1.2.10/go.mod h1:6BkRjejp/GR4411UGqkX8+wFMbFbqsUIimfK4XjOKR4= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.37/go.mod h1:Qe+2KtKml+FEsQF/DHmDV+xjtche/hwoF75EG4UlHW8= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10 h1:nYPe006ktcqUji8S2mqXf9c/7NdiKriOwMvWQHgYztw= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.5.10/go.mod h1:6UV4SZkVvmODfXKql4LCbaZUpF7HO2BX38FgBf9ZOLw= +github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3 h1:n3GDfwqF2tzEkXlv5cuy4iy7LpKDtqDMcNLfZDu9rls= github.com/aws/aws-sdk-go-v2/internal/ini v1.7.3/go.mod h1:6fQQgfuGmw8Al/3M2IgIllycxV7ZW7WCdVSqfBeUiCY= +github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1 h1:w/fPGB0t5rWwA43mux4e9ozFSH5zF1moQemlA131PWc= github.com/aws/aws-sdk-go-v2/service/cloudwatch v1.8.1/go.mod h1:CM+19rL1+4dFWnOQKwDc7H1KwXTz+h61oUSHyhV0b3o= +github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4 h1:/b31bi3YVNlkzkBrm9LfpaKoaYZUxIAj4sHfOTmLfqw= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.10.4/go.mod h1:2aGXHFmbInwgP9ZfpmdIfOELL79zhdNYNmReK8qDfdQ= +github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10 h1:DBYTXwIGQSGs9w4jKm60F5dmCQ3EEruxdc0MFh+3EY4= github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.10.10/go.mod h1:wohMUQiFdzo0NtxbBg0mSRGZ4vL3n0dKjLTINdcIino= +github.com/aws/aws-sdk-go-v2/service/route53 v1.30.2 h1:/RPQNjh1sDIezpXaFIkZb7MlXnSyAqjVdAwcJuGYTqg= github.com/aws/aws-sdk-go-v2/service/route53 v1.30.2/go.mod h1:TQZBt/WaQy+zTHoW++rnl8JBrmZ0VO6EUbVua1+foCA= +github.com/aws/aws-sdk-go-v2/service/sso v1.18.7 h1:eajuO3nykDPdYicLlP3AGgOyVN3MOlFmZv7WGTuJPow= github.com/aws/aws-sdk-go-v2/service/sso v1.18.7/go.mod h1:+mJNDdF+qiUlNKNC3fxn74WWNN+sOiGOEImje+3ScPM= +github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7 h1:QPMJf+Jw8E1l7zqhZmMlFw6w1NmfkfiSK8mS4zOx3BA= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.21.7/go.mod h1:ykf3COxYI0UJmxcfcxcVuz7b6uADi1FkiUz6Eb7AgM8= +github.com/aws/aws-sdk-go-v2/service/sts v1.26.7 h1:NzO4Vrau795RkUdSHKEwiR01FaGzGOH1EETJ+5QHnm0= github.com/aws/aws-sdk-go-v2/service/sts v1.26.7/go.mod h1:6h2YuIoxaMSCFf5fi1EgZAwdfkGMgDY+DVfa61uLe4U= github.com/aws/smithy-go v1.8.0/go.mod h1:SObp3lf9smib00L/v3U2eAKG8FyQ7iLrJnQiAmR5n+E= 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/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= +github.com/breml/bidichk v0.2.3 h1:qe6ggxpTfA8E75hdjWPZ581sY3a2lnl0IRxLQFelECI= github.com/breml/bidichk v0.2.3/go.mod h1:8u2C6DnAy0g2cEq+k/A2+tr9O1s+vHGxWn0LTc70T2A= +github.com/breml/errchkjson v0.3.0 h1:YdDqhfqMT+I1vIxPSas44P+9Z9HzJwCeAzjB8PxP1xw= github.com/breml/errchkjson v0.3.0/go.mod h1:9Cogkyv9gcT8HREpzi3TiqBxCqDzo8awa92zSDFcofU= github.com/btcsuite/btcd/btcec/v2 v2.2.0/go.mod h1:U7MHm051Al6XmscBQ0BoNydpOTsFAn707034b5nY8zU= +github.com/btcsuite/btclog v0.0.0-20170628155309-84c8d2346e9f h1:bAs4lUbRJpnnkd9VhRV3jjAVU7DJVjMaK+IsvSeZvFo= +github.com/btcsuite/btcutil v0.0.0-20190425235716-9e5f4b9a998d h1:yJzD/yFppdVCf6ApMkVy8cUxV0XrxdP9rVf6D87/Mng= +github.com/btcsuite/go-socks v0.0.0-20170105172521-4720035b7bfd h1:R/opQEbFEy9JGkIguV40SvRY1uliPX8ifOvi6ICsFCw= +github.com/btcsuite/goleveldb v0.0.0-20160330041536-7834afc9e8cd h1:qdGvebPBDuYDPGi1WCPjy1tGyMpmDK8IEapSsszn7HE= +github.com/btcsuite/snappy-go v0.0.0-20151229074030-0bdef8d06723 h1:ZA/jbKoGcVAnER6pCHPEkGdZOV7U1oLUedErBHCUMs0= +github.com/btcsuite/websocket v0.0.0-20150119174127-31079b680792 h1:R8vQdOQdZ9Y3SkEwmHoWBmX1DNXhXZqlTpq6s4tyJGc= +github.com/btcsuite/winsvc v1.0.0 h1:J9B4L7e3oqhXOcm+2IuNApwzQec85lE+QaikUcCs+dk= +github.com/bufbuild/buf v1.7.0 h1:uWRjhIXcrWkzIkA5TqXGyJbF51VW54QJsQZ3nwaes5Q= github.com/bufbuild/buf v1.7.0/go.mod h1:Go40fMAF46PnPLC7jJgTQhAI95pmC0+VtxFKVC0qLq0= +github.com/bufbuild/connect-go v0.2.0 h1:WuMI/jLiJIhysHWvLWlxRozV67mGjCOUuDSl/lkDVic= 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= github.com/cenkalti/backoff/v4 v4.1.1/go.mod h1:scbssz8iZGpm3xbr14ovlUdkxfGXNInqkPWOWmG2CLw= +github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= github.com/cespare/xxhash/v2 v2.1.2/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs= +github.com/charithe/durationcheck v0.0.9 h1:mPP4ucLrf/rKZiIG/a9IPXHGlh8p4CzgpyTy6EEutYk= 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/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= +github.com/client9/misspell v0.3.4 h1:ta993UF76GwbvJcIo3Y68y/M3WxlpEHPWIGDkJYwzJI= +github.com/cloudflare/cloudflare-go v0.79.0 h1:ErwCYDjFCYppDJlDJ/5WhsSmzegAUe2+K9qgFyQDg3M= github.com/cloudflare/cloudflare-go v0.79.0/go.mod h1:gkHQf9xEubaQPEuerBuoinR9P8bf8a05Lq0X6WKy1Oc= +github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe h1:QQ3GSy+MqSHxm/d8nCtnAiZdYFd45cYZPs8vOOIYKfk= github.com/cncf/udpa/go v0.0.0-20220112060539-c52dc94e7fbe/go.mod h1:6pvJx4me5XPnfI9Z40ddWsdw2W/uZgQLFXToKeRcDiI= 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/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= github.com/containerd/log v0.1.0/go.mod h1:VRRf09a7mHDIRezVKTRCrOq78v577GXq3bSa3EhrzVo= +github.com/containerd/typeurl/v2 v2.1.1 h1:3Q4Pt7i8nYwy2KmQWIw2+1hTvwTE/6w9FqcttATPO/4= github.com/containerd/typeurl/v2 v2.1.1/go.mod h1:IDp2JFvbwZ31H8dQbEIY7sDl2L3o3HZj1hsSQlywkQ0= +github.com/coreos/etcd v3.3.10+incompatible h1:jFneRYjIvLMLhDLCzuTuU4rSJUjRplcJQ7pD7MnhC04= +github.com/coreos/go-etcd v2.0.0+incompatible h1:bXhRBIXoTm9BYHS3gE0TtQuyNZyeEMux2sDi4oo5YOo= +github.com/coreos/go-semver v0.3.0 h1:wkHLiw0WNATZnSG7epLsujiMCgPAc9xhjJ4tgnAxmfM= github.com/coreos/go-semver v0.3.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= +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= github.com/decred/dcrd/crypto/blake256 v1.0.0/go.mod h1:sQl2p6Y26YV+ZOcSTP6thNdn47hh8kt6rqSlvmrXFAc= github.com/decred/dcrd/dcrec/secp256k1/v4 v4.0.1/go.mod h1:hyedUtir6IdtD/7lIxGeCxkaw7y45JueMRL4DIyJDKs= github.com/deepmap/oapi-codegen v1.6.0/go.mod h1:ryDa9AgbELGeB+YEXE1dR53yAjHwFvE9iAUlWl9Al3M= +github.com/deepmap/oapi-codegen v1.8.2 h1:SegyeYGcdi0jLLrpbCMoJxnUUn8GBXHsvr4rbzjuhfU= 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= github.com/distribution/reference v0.5.0/go.mod h1:BbU0aIcezP1/5jX/8MP0YiH4SdvB5Y4f/wlDRiLyi3E= github.com/dlclark/regexp2 v1.4.1-0.20201116162257-a2a8dda75c91/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/dlclark/regexp2 v1.7.0 h1:7lJfhqlPssTb1WQx4yvTHN0uElPEv52sbaECrAQxjAo= github.com/dlclark/regexp2 v1.7.0/go.mod h1:DHkYz0B9wPfa6wondMfaivmHpzrQ3v9q8cnmRbL6yW8= github.com/docker/docker v1.6.2/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= +github.com/docker/docker v25.0.3+incompatible h1:D5fy/lYmY7bvZa0XTZ5/UJPljor41F+vdyJG5luQLfQ= github.com/docker/docker v25.0.3+incompatible/go.mod h1:eEKB0N0r5NX/I1kEveEz05bcu8tLC/8azJZsviup8Sk= github.com/dop251/goja v0.0.0-20211022113120-dc8c55024d06/go.mod h1:R9ET47fwRVRPZnOGvHxxhuZcbrMCuiqOz3Rlrh4KSnk= +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= github.com/envoyproxy/go-control-plane v0.9.9-0.20210512163311-63b5d3c536b0/go.mod h1:hliV/p42l8fGbc6Y9bQ70uLwIvmJyVE5k4iMKlh8wCQ= +github.com/envoyproxy/go-control-plane v0.12.0 h1:4X+VP1GHd1Mhj6IB5mMeGbLCleqxjletLK6K0rbxyZI= github.com/envoyproxy/go-control-plane v0.12.0/go.mod h1:ZBTaoJ23lqITozF0M6G4/IragXCQKCnYbmlmtHvwRG0= +github.com/envoyproxy/protoc-gen-validate v1.0.4 h1:gVPz/FMfvh57HdSJQyvBtF00j8JU4zdyUgIUNhlgg0A= 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/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= github.com/fatih/color v1.9.0/go.mod h1:eQcE1qtQxscV5RaZvpXrrb8Drkc3/DdQ+uUYCNjL+zU= github.com/fatih/color v1.12.0/go.mod h1:ELkj/draVOlAH/xkhN6mQ50Qd0MPOk5AAr3maGEBuJM= +github.com/fatih/color v1.13.0 h1:8LOYc1KYPPmyKMuN8QV2DNRWNbLo6LZ0iLs8+mlH53w= github.com/fatih/color v1.13.0/go.mod h1:kLAiJbzzSOZDVNGyDpeOxJ47H46qBXwg5ILebYFFOfk= +github.com/fatih/structtag v1.2.0 h1:/OdNE99OxoI/PqaW/SuSK9uxxT3f/tcSZgon/ssNSx4= github.com/fatih/structtag v1.2.0/go.mod h1:mBJUNpUnHmRKrKlQQlmCrh5PuhftFbNv8Ys4/aAZl94= +github.com/felixge/fgprof v0.9.3 h1:VvyZxILNuCiUCSXtPtYmmtGvb65nqXh2QFWc0Wpf2/g= github.com/felixge/fgprof v0.9.3/go.mod h1:RdbpDgzqYVh/T9fPELJyV7EYJuHB55UTEULNun8eiPw= +github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg= github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U= +github.com/firefart/nonamedreturns v1.0.4 h1:abzI1p7mAEPYuR4A+VLKn4eNDOycjYo2phmY9sfv40Y= 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= +github.com/fzipp/gocyclo v0.6.0 h1:lsblElZG7d3ALtGMx9fmxeTKZaLLpU8mET09yN4BBLo= github.com/fzipp/gocyclo v0.6.0/go.mod h1:rXPyn8fnlpa0R2csP/31uerbiVBugk5whMdlyaLkLoA= +github.com/garslo/gogen v0.0.0-20170306192744-1d203ffc1f61 h1:IZqZOB2fydHte3kUgxrzK5E1fW7RQGeDwE8F/ZZnUYc= 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= github.com/go-chi/chi/v5 v5.0.7/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8= +github.com/go-critic/go-critic v0.6.4 h1:tucuG1pvOyYgpBIrVxw0R6gwO42lNa92Aq3VaDoIs+E= github.com/go-critic/go-critic v0.6.4/go.mod h1:qL5SOlk7NtY6sJPoVCTKDIgzNOxHkkkOCVDyi9wJe1U= +github.com/go-gl/glfw v0.0.0-20190409004039-e6da0acd62b1 h1:QbL/5oDUmRBzO9/Z7Seo6zf912W/a6Sr4Eu0G/3Jho0= +github.com/go-gl/glfw/v3.3/glfw v0.0.0-20200222043503-6f7a984d4dc4 h1:WtGNWLvXpe6ZudgnXrq0barxBImvnnJoMEhXAzcbM0I= github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-kit/log v0.1.0/go.mod h1:zbhenjAZHb184qTLMA9ZjW7ThYL0H2mk7Q6pNt4vbaY= github.com/go-kit/log v0.2.0/go.mod h1:NwTd00d/i8cPZ3xOwwiv2PO5MOcx78fFErGNcVmBjv0= @@ -309,199 +593,349 @@ github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V github.com/go-logfmt/logfmt v0.5.0/go.mod h1:wCYkCAKZfumFQihp8CzCvQ3paCTfi41vtzG1KdI/P7A= github.com/go-logfmt/logfmt v0.5.1/go.mod h1:WYhtIu8zTZfxdn5+rREduYbwxfcBr/Vr6KEVveWlfTs= github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A= +github.com/go-logr/logr v1.3.0 h1:2y3SDp0ZXuc6/cjLSZ+Q3ir+QB9T/iG5yYRXqsagWSY= github.com/go-logr/logr v1.3.0/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= +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= github.com/go-toolsmith/astcast v1.0.0/go.mod h1:mt2OdQTeAQcY4DQgPSArJjHCcOwlX+Wl/kwN+LbLGQ4= +github.com/go-toolsmith/astcopy v1.0.1 h1:l09oBhAPyV74kLJ3ZO31iBU8htZGTwr9LTjuMCyL8go= github.com/go-toolsmith/astcopy v1.0.1/go.mod h1:4TcEdbElGc9twQEYpVo/aieIXfHhiuLh4aLAck6dO7Y= +github.com/go-toolsmith/astequal v1.0.2 h1:+XvaV8zNxua+9+Oa4AHmgmpo4RYAbwr/qjNppLfX2yM= github.com/go-toolsmith/astequal v1.0.2/go.mod h1:9Ai4UglvtR+4up+bAD4+hCj7iTo4m/OXVTSLnCyTAx4= +github.com/go-toolsmith/astfmt v1.0.0 h1:A0vDDXt+vsvLEdbMFJAUBI/uTbRw1ffOPnxsILnFL6k= github.com/go-toolsmith/astfmt v1.0.0/go.mod h1:cnWmsOAuq4jJY6Ct5YWlVLmcmLMn1JUPuQIHCY7CJDw= +github.com/go-toolsmith/astp v1.0.0 h1:alXE75TXgcmupDsMK1fRAy0YUzLzqPVvBKoyWV+KPXg= github.com/go-toolsmith/astp v1.0.0/go.mod h1:RSyrtpVlfTFGDYRbrjyWP1pYu//tSFcvdYrA8meBmLI= +github.com/go-toolsmith/strparse v1.0.0 h1:Vcw78DnpCAKlM20kSbAyO4mPfJn/lyYA4BJUDxe2Jb4= github.com/go-toolsmith/strparse v1.0.0/go.mod h1:YI2nUKP9YGZnL/L1/DLFBfixrcjslWct4wyljWhSRy8= +github.com/go-toolsmith/typep v1.0.2 h1:8xdsa1+FSIH/RhEkgnD1j2CJOy5mNllW1Q9tRiYwvlk= github.com/go-toolsmith/typep v1.0.2/go.mod h1:JSQCQMUPdRlMZFswiq3TGpNp1GMktqkR2Ns5AIQkATU= +github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b h1:khEcpUM4yFcxg4/FHQWkvVRmgijNXRfzkIDHh23ggEo= github.com/go-xmlfmt/xmlfmt v0.0.0-20191208150333-d5b6f63a941b/go.mod h1:aUCEOzzezBEjDBbFBoSiya/gduyIiWYRP6CnSFIV8AM= +github.com/go-zookeeper/zk v1.0.2 h1:4mx0EYENAdX/B/rbunjlt5+4RTA/a9SMHBRuSKdGxPM= github.com/go-zookeeper/zk v1.0.2/go.mod h1:nOB03cncLtlp4t+UAkGSV+9beXP/akpekBwL+UX1Qcw= +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= github.com/gofrs/uuid v3.3.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gofrs/uuid v4.2.0+incompatible h1:yyYWMnhkhrKwwr8gAOcOCYxOOscHgDS9yZgBrnJfGa0= github.com/gofrs/uuid v4.2.0+incompatible/go.mod h1:b2aQJv3Z4Fp6yNu3cdSllBxTCLRxnplIgP/c0N/04lM= +github.com/gogo/googleapis v1.4.1 h1:1Yx4Myt7BxzvUr5ldGSbwYiZG6t9wGBZ+8/fX3Wvtq0= github.com/gogo/googleapis v1.4.1/go.mod h1:2lpHqI5OcWCtVElxXnPt+s8oJvMpySlOyM6xDCrzib4= 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= +github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a h1:w8hkcTqaFpzKqonE9uMCefW1WDie15eSP/4MssdenaM= github.com/golangci/dupl v0.0.0-20180902072040-3e9179ac440a/go.mod h1:ryS0uhF+x9jgbj/N71xsEqODy9BN81/GonCZiOzirOk= +github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe h1:6RGUuS7EGotKx6J5HIP8ZtyMdiDscjMLfRBSPuzVVeo= github.com/golangci/go-misc v0.0.0-20220329215616-d24fe342adfe/go.mod h1:gjqyPShc/m8pEMpk0a3SeagVb0kaqvhscv+i9jI5ZhQ= +github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a h1:iR3fYXUjHCR97qWS8ch1y9zPNsgXThGwjKPrYfqMPks= github.com/golangci/gofmt v0.0.0-20190930125516-244bba706f1a/go.mod h1:9qCChq59u/eW8im404Q2WWTrnBUQKjpNYKMbU4M7EFU= +github.com/golangci/golangci-lint v1.49.0 h1:I8WHOavragDttlLHtSraHn/h39C+R60bEQ5NoGcHQr8= github.com/golangci/golangci-lint v1.49.0/go.mod h1:+V/7lLv449R6w9mQ3WdV0EKh7Je/jTylMeSwBZcLeWE= github.com/golangci/lint-1 v0.0.0-20181222135242-d2cdd8c08219/go.mod h1:/X8TswGSh1pIozq4ZwCfxS0WA5JGXguxk94ar/4c87Y= +github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0 h1:MfyDlzVjl1hoaPzPD4Gpb/QgoRfSBR0jdhwGyAWwMSA= github.com/golangci/lint-1 v0.0.0-20191013205115-297bf364a8e0/go.mod h1:66R6K6P6VWk9I95jvqGxkqJxVWGFy9XlDwLwVz1RCFg= +github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca h1:kNY3/svz5T29MYHubXix4aDDuE3RWHkPvopM/EDv/MA= github.com/golangci/maligned v0.0.0-20180506175553-b1d89398deca/go.mod h1:tvlJhZqDe4LMs4ZHD0oMUlt9G2LWuDGoisJTBzLMV9o= +github.com/golangci/misspell v0.3.5 h1:pLzmVdl3VxTOncgzHcvLOKirdvcx/TydsClUQXTehjo= github.com/golangci/misspell v0.3.5/go.mod h1:dEbvlSfYbMQDtrpRMQU675gSDLDNa8sCPPChZ7PhiVA= +github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6 h1:DIPQnGy2Gv2FSA4B/hh8Q7xx3B7AIDk3DAMeHclH1vQ= github.com/golangci/revgrep v0.0.0-20220804021717-745bb2f7c2e6/go.mod h1:0AKcRCkMoKvUvlf89F6O7H2LYdhr1zBh736mBItOdRs= +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= github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg= +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.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= github.com/gostaticanalysis/analysisutil v0.7.1/go.mod h1:v21E3hY37WKMGSnbsw2S/ojApNWb6C1//mXO48CXbVc= +github.com/gostaticanalysis/comment v1.4.2 h1:hlnx5+S2fY9Zo9ePo4AhgYsYHbM2+eAv8m/s1JiCd6Q= github.com/gostaticanalysis/comment v1.4.2/go.mod h1:KLUTGDv6HOCotCH8h2erHKmpci2ZoR8VPu34YA2uzdM= +github.com/gostaticanalysis/forcetypeassert v0.1.0 h1:6eUflI3DiGusXGK6X7cCcIgVCpZ2CiZ1Q7jl6ZxNV70= github.com/gostaticanalysis/forcetypeassert v0.1.0/go.mod h1:qZEedyP/sY1lTGV1uJ3VhWZ2mqag3IkWsDHVbplHXak= +github.com/gostaticanalysis/nilerr v0.1.1 h1:ThE+hJP0fEp4zWLkWHWcRyI2Od0p7DlgYG3Uqrmrcpk= github.com/gostaticanalysis/nilerr v0.1.1/go.mod h1:wZYb6YI5YAxxq0i1+VJbY0s2YONW0HU0GPE3+5PWN4A= +github.com/graph-gophers/graphql-go v1.3.0 h1:Eb9x/q6MFpCLz7jBCiP/WTxjSDrYLR1QY41SORZyNJ0= 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= github.com/hashicorp/go-cleanhttp v0.5.1/go.mod h1:JpRdi6/HCYpAwUzNwuwqhbovhLtngrth3wmdIIUrZ80= +github.com/hashicorp/go-cleanhttp v0.5.2 h1:035FKYIWjmULyFRBKPs8TBQoi0x6d9G4xc9neXJWAZQ= github.com/hashicorp/go-cleanhttp v0.5.2/go.mod h1:kO/YDlP8L1346E6Sodw+PrpBSV4/SoxCXGY6BqNFT48= github.com/hashicorp/go-hclog v0.9.2/go.mod h1:5CU+agLiy3J7N7QjHK5d05KxGsuXiQLrjA0H7acj2lQ= github.com/hashicorp/go-hclog v0.12.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= github.com/hashicorp/go-hclog v0.16.2/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= +github.com/hashicorp/go-hclog v1.2.0 h1:La19f8d7WIlm4ogzNHB0JGqs5AUDAZ2UfCY4sJXcJdM= github.com/hashicorp/go-hclog v1.2.0/go.mod h1:whpDNt7SSdeAju8AWKIWsul05p54N/39EeqMAyrmvFQ= 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= github.com/hashicorp/serf v0.9.7/go.mod h1:TXZNMjZQijwlDvp+r0b63xZ45H7JmCmgg4gpTwn9UV4= +github.com/hexops/gotextdiff v1.0.3 h1:gitA9+qJrrTCsiCl7+kh75nPqQt1cx4ZkudSTLoUqJM= github.com/hexops/gotextdiff v1.0.3/go.mod h1:pSWU5MAI3yDq+fZBTazCSJysOMbxWL1BSow5/V2vxeg= +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= +github.com/influxdata/influxdb-client-go/v2 v2.4.0 h1:HGBfZYStlx3Kqvsv1h2pJixbCl/jhnFtxpKFAv9Tu5k= 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= +github.com/jdxcode/netrc v0.0.0-20210204082910-926c7f70242a h1:d4+I1YEKVmWZrgkt6jpXBnLgV2ZjO0YxEtLDdfIZfH4= github.com/jdxcode/netrc v0.0.0-20210204082910-926c7f70242a/go.mod h1:Zi/ZFkEqFHTm7qkjyNJjaWH4LQA9LQhGJyF0lTYGpxw= +github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267 h1:TMtDYDHKYY15rFihtRfck/bfFqNfvcabqvXAFQfAUpY= github.com/jedisct1/go-minisign v0.0.0-20230811132847-661be99b8267/go.mod h1:h1nSAbGFqGVzn6Jyl1R/iCcBUHN4g+gW1u9CoBTrb9E= +github.com/jessevdk/go-flags v0.0.0-20141203071132-1679536dcc89 h1:12K8AlpT0/6QUXSfV0yi4Q0jkbq8NDtIKFtF61AoqV0= +github.com/jgautheron/goconst v1.5.1 h1:HxVbL1MhydKs8R8n/HE5NPvzfaYmQJA3o879lE4+WcM= github.com/jgautheron/goconst v1.5.1/go.mod h1:aAosetZ5zaeC/2EfMeRswtxUFBpe2Hr7HzkgX4fanO4= +github.com/jhump/protocompile v0.0.0-20220216033700-d705409f108f h1:BNuUg9k2EiJmlMwjoef3e8vZLHplbVw6DrjGFjLL+Yo= github.com/jhump/protocompile v0.0.0-20220216033700-d705409f108f/go.mod h1:qr2b5kx4HbFS7/g4uYO5qv9ei8303JMsC7ESbYiqr2Q= +github.com/jhump/protoreflect v1.12.1-0.20220721211354-060cc04fc18b h1:izTof8BKh/nE1wrKOrloNA5q4odOarjf+Xpe+4qow98= github.com/jhump/protoreflect v1.12.1-0.20220721211354-060cc04fc18b/go.mod h1:JytZfP5d0r8pVNLZvai7U/MCuTWITgrI4tTg7puQFKI= +github.com/jingyugao/rowserrcheck v1.1.1 h1:zibz55j/MJtLsjP1OF4bSdgXxwL1b+Vn7Tjzq7gFzUs= github.com/jingyugao/rowserrcheck v1.1.1/go.mod h1:4yvlZSDb3IyDTUZJUmpZfm2Hwok+Dtp+nu2qOq+er9c= +github.com/jirfag/go-printf-func-name v0.0.0-20200119135958-7558a9eaa5af h1:KA9BjwUk7KlCh6S9EAGWBt1oExIUv9WyNCiRz5amv48= 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= +github.com/jrick/logrotate v1.0.0 h1:lQ1bL/n9mBNeIXoTUoYRlK4dHuNJVofX9oWqBtPnSzI= github.com/json-iterator/go v1.1.9/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.10/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= github.com/json-iterator/go v1.1.11/go.mod h1:KdQUCv79m/52Kvf8AW2vK1V8akMuk1QjK/uOdHXbAo4= +github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM= github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo= +github.com/jstemmer/go-junit-report v0.9.1 h1:6QPYqodiu3GuPL+7mfx+NwDdp2eTkp9IfEUpgAwUN0o= +github.com/jsternberg/zap-logfmt v1.0.0 h1:0Dz2s/eturmdUS34GM82JwNEdQ9hPoJgqptcEKcbpzY= github.com/jsternberg/zap-logfmt v1.0.0/go.mod h1:uvPs/4X51zdkcm5jXl5SYoN+4RK21K8mysFmDaM/h+o= +github.com/jtolds/gls v4.20.0+incompatible h1:xdiiI2gbIgH/gLH7ADydsJ1uDOEzR8yvV7C0MuV77Wo= github.com/jtolds/gls v4.20.0+incompatible/go.mod h1:QJZ7F/aHp+rZTRtaJ1ow/lLfFfVYBRgL+9YlvaHOwJU= +github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM= +github.com/julz/importas v0.1.0 h1:F78HnrsjY3cR7j0etXy5+TU1Zuy7Xt08X/1aJnH5xXY= github.com/julz/importas v0.1.0/go.mod h1:oSFU2R4XK/P7kNBrnL/FEQlDGN1/6WoxXEjSSXO0DV0= +github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5 h1:PJr+ZMXIecYc1Ey2zucXdR73SMBtgjPgwa31099IMv0= github.com/jung-kurt/gofpdf v1.0.3-0.20190309125859-24315acbbda5/go.mod h1:7Id9E/uU8ce6rXgefFLlgrJj/GYY22cpxn+r32jIOes= +github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef h1:2jNeR4YUziVtswNP9sEFAI913cVrzH85T+8Q6LpYbT0= github.com/jwilder/encoding v0.0.0-20170811194829-b4e1701a28ef/go.mod h1:Ct9fl0F6iIOGgxJ5npU/IUOhOhqlVrGjyIZc8/MagT0= +github.com/karalabe/usb v0.0.2 h1:M6QQBNxF+CQ8OFvxrT90BA0qBOXymndZnk5q235mFc4= github.com/karalabe/usb v0.0.2/go.mod h1:Od972xHfMJowv7NGVDiWVxk2zxnWgjLlJzE+F4F7AGU= github.com/kisielk/errcheck v1.2.0/go.mod h1:/BMXB+zMLi60iA8Vv6Ksmxu/1UDYcXs4uQLJ+jE2L00= +github.com/kisielk/errcheck v1.6.2 h1:uGQ9xI8/pgc9iOoCe7kWQgRE6SBTrCGmTSf0LrEtY7c= 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/compress v1.17.4/go.mod h1:/dCuZOvVtNoHsyb+cuJD3itjs3NbnF6KH9zAO4BDxPM= +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= github.com/kulti/thelper v0.6.3/go.mod h1:DsqKShOvP40epevkFrvIwkCMNYxMeTNjdWL4dqWHZ6I= +github.com/kunwardeep/paralleltest v1.0.6 h1:FCKYMF1OF2+RveWlABsdnmsvJrei5aoyZoaGS+Ugg8g= github.com/kunwardeep/paralleltest v1.0.6/go.mod h1:Y0Y0XISdZM5IKm3TREQMZ6iteqn1YuwCsJO/0kL9Zes= +github.com/kylelemons/godebug v1.1.0 h1:RPNrshWIDI6G2gRW9EHilWtl7Z6Sb1BR0xunSBf0SNc= 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= @@ -511,6 +945,7 @@ github.com/mattn/go-colorable v0.1.7/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope github.com/mattn/go-colorable v0.1.8/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-colorable v0.1.9/go.mod h1:u6P/XSegPjTcexA+o6vUJrdnUu04hMope9wVRipJSqc= github.com/mattn/go-ieproxy v0.0.0-20190610004146-91bb50d98149/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= +github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d h1:oNAwILwmgWKFpuU+dXvI6dl9jG2mAWAZLX3r9s0PPiw= github.com/mattn/go-ieproxy v0.0.0-20190702010315-6dee0af9227d/go.mod h1:31jz6HNzdxOmlERGGEc4v/dMssOfmp2p5bT/okiKFFc= github.com/mattn/go-isatty v0.0.3/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= @@ -523,83 +958,146 @@ 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= +github.com/mbilski/exhaustivestruct v1.2.0 h1:wCBmUnSYufAHO6J4AVWY6ff+oxWxsVFrwgOdMUQePUo= github.com/mbilski/exhaustivestruct v1.2.0/go.mod h1:OeTBVxQWoEmB2J2JCHmXWPJ0aksxSUOUy+nvtVEfzXc= +github.com/mgechev/revive v1.2.3 h1:NzIEEa9+WimQ6q2Ov7OcNeySS/IOcwtkQ8RAh0R5UJ4= github.com/mgechev/revive v1.2.3/go.mod h1:iAWlQishqCuj4yhV24FTnKSXGpbAA+0SckXB8GQMX/Q= github.com/miekg/dns v1.0.14/go.mod h1:W1PPwlIAgtquWBMBEV9nkV9Cazfe8ScdGz/Lj7v3Nrg= github.com/miekg/dns v1.1.26/go.mod h1:bPDLeHnStXmXAq1m/Ch/hvfNHr14JKNPMBo3VZKjuso= 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/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= +github.com/mmcloughlin/profile v0.1.1 h1:jhDmAqPyebOsVDOCICJoINoLb/AnLBaUw58nFzxWS2w= +github.com/moby/buildkit v0.13.0 h1:reVR1Y+rbNIUQ9jf0Q1YZVH5a/nhOixZsl+HJ9qQEGI= github.com/moby/buildkit v0.13.0/go.mod h1:aNmNQKLBFYAOFuzQjR3VA27/FijlvtBD1pjNwTSN37k= +github.com/moby/term v0.5.0 h1:xt8Q1nalod/v7BqbG21f8mQPqH+xAaC9C3N3wfWbVP0= github.com/moby/term v0.5.0/go.mod h1:8FzsFHVUBGZdbDsJw/ot+X+d5HLUbvklYLJ9uGfcI3Y= github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q= +github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd h1:TRLaZ9cD/w8PVh93nsPXa1VrQ6jlwL5oN8l14QlcNfg= github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= +github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9Gz0M= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/moricho/tparallel v0.2.1 h1:95FytivzT6rYzdJLdtfn6m1bfFJylOJK41+lgv/EHf4= 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 v1.10.14-0.20251125061742-69718a9dcab9/go.mod h1:tiFPeidxjoCmLj18ne9H3KQdIGTCvRC30qlef06Fd9M= +github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2 h1:FUv9gtnvF+1AVrkoNGYbVOesi7E+STjdfD2mcqVaEY0= +github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2/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= +github.com/nakabonne/nestif v0.3.1 h1:wm28nZjhQY5HyYPx+weN3Q65k6ilSBxDb8v5S81B81U= github.com/nakabonne/nestif v0.3.1/go.mod h1:9EtoZochLn5iUprVDmDjqGKPofoUEBL8U4Ngq6aY7OE= +github.com/naoina/go-stringutil v0.1.0 h1:rCUeRUHjBjGTSHl0VC00jUPLz8/F9dDzYI70Hzifhks= 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= +github.com/nats-io/nats-server/v2 v2.5.0 h1:wsnVaaXH9VRSg+A2MVg5Q727/CqxnmPLGFQ3YZYKTQg= github.com/nats-io/nats-server/v2 v2.5.0/go.mod h1:Kj86UtrXAL6LwYRA6H4RqzkHhK0Vcv2ZnKD5WbQ1t3g= +github.com/nats-io/nats.go v1.12.1 h1:+0ndxwUPz3CmQ2vjbXdkC1fo3FdiOQDim4gl3Mge8Qo= github.com/nats-io/nats.go v1.12.1/go.mod h1:BPko4oXsySz4aSWeFgOHLZs3G4Jq4ZAyE6/zMCxRT6w= github.com/nats-io/nkeys v0.2.0/go.mod h1:XdZpAbhgyyODYqjTawOnIOI7VlbKSarI9Gfy1tqEu/s= +github.com/nats-io/nkeys v0.3.0 h1:cgM5tL53EvYRU+2YLXIK0G2mJtK12Ft9oeooSZMA2G8= github.com/nats-io/nkeys v0.3.0/go.mod h1:gvUNGjVcM2IPr5rCsRsC6Wb3Hr2CQAm08dsxtV6A5y4= +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= +github.com/nishanths/predeclared v0.2.2 h1:V2EPdZPliZymNAn79T8RkNApBjMmVKh5XRpLm/w98Vk= github.com/nishanths/predeclared v0.2.2/go.mod h1:RROzoN6TnGQupbC+lqggsOlcgysk3LMK/HI84Mp280c= +github.com/oklog/ulid v1.3.1 h1:EGfNDEx6MqHz8B3uNV6QAib1UR2Lm97sHi3ocA6ESJ4= github.com/onsi/ginkgo v1.16.2/go.mod h1:CObGmKUOKaSC0RjmoAK7tKyn4Azo5P2IWuoMnvwxz1E= +github.com/onsi/ginkgo/v2 v2.1.3 h1:e/3Cwtogj0HA+25nMP1jCMDIf8RtRYbGwGGuBIFztkc= github.com/onsi/gomega v1.13.0/go.mod h1:lRk9szgn8TxENtWd0Tp4c3wjlRfMTMH27I+3Je41yGY= +github.com/op/go-logging v0.0.0-20160315200505-970db520ece7 h1:lDH9UUVJtmYCjyT0CI4q8xvlXPxeZ0gYCVvWbmPlp88= github.com/op/go-logging v0.0.0-20160315200505-970db520ece7/go.mod h1:HzydrMdWErDVzsI23lYNej1Htcns9BCg93Dk0bBINWk= github.com/opentracing/opentracing-go v1.0.2/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.0.3-0.20180606204148-bd9c31933947/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= github.com/opentracing/opentracing-go v1.1.0/go.mod h1:UkNAQd3GIcIGf0SeVgPpRdFStlNbqXla1AfSYxPUl2o= +github.com/opentracing/opentracing-go v1.2.0 h1:uEJPy/1a5RIPAJ0Ov+OIO8OxWu77jEv+1B0VhjKrZUs= github.com/opentracing/opentracing-go v1.2.0/go.mod h1:GxEUsuufX4nBwe+T+Wl9TAgYrxe9dPLANfrWvHYVTgc= +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= +github.com/peterh/liner v1.1.1-0.20190123174540-a2c9a5303de7 h1:oYW+YCJ1pachXTQmzR3rNLYGGz4g/UgFcjb28p/viDM= 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= +github.com/pointlander/jetset v1.0.1-0.20190518214125-eee7eff80bd4 h1:RHHRCZeaNyBXdYPMjZNH8/XHDBH38TZzw8izrW7dmBE= github.com/pointlander/jetset v1.0.1-0.20190518214125-eee7eff80bd4/go.mod h1:RdR1j20Aj5pB6+fw6Y9Ur7lMHpegTEjY1vc19hEZL40= +github.com/pointlander/peg v1.0.1 h1:mgA/GQE8TeS9MdkU6Xn6iEzBmQUQCNuWD7rHCK6Mjs0= github.com/pointlander/peg v1.0.1/go.mod h1:5hsGDQR2oZI4QoWz0/Kdg3VSVEC31iJw/b7WjqCBGRI= +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= @@ -620,128 +1118,213 @@ github.com/prometheus/procfs v0.6.0/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1 github.com/prometheus/procfs v0.7.3/go.mod h1:cz+aTbrPOrUb4q7XlbU9ygM+/jj0fzG6c1xBZuNvfVA= github.com/prometheus/procfs v0.11.1/go.mod h1:eesXgaPo1q7lBpVMoMy0ZOFTth9hBn4W/y0/p/ScXhY= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= +github.com/quasilyte/go-ruleguard v0.3.17 h1:cDdoaSbQg11LXPDQqiCK54QmQXsEQQCTIgdcpeULGSI= github.com/quasilyte/go-ruleguard v0.3.17/go.mod h1:sST5PvaR7yb/Az5ksX8oc88usJ4EGjmJv7cK7y3jyig= +github.com/quasilyte/gogrep v0.0.0-20220120141003-628d8b3623b5 h1:PDWGei+Rf2bBiuZIbZmM20J2ftEy9IeUCHA8HbQqed8= github.com/quasilyte/gogrep v0.0.0-20220120141003-628d8b3623b5/go.mod h1:wSEyW6O61xRV6zb6My3HxrQ5/8ke7NE2OayqCHa3xRM= +github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95 h1:L8QM9bvf68pVdQ3bCFZMDmnt9yqcMBro1pC7F+IPYMY= github.com/quasilyte/regex/syntax v0.0.0-20200407221936-30656e2c4a95/go.mod h1:rlzQ04UMyJXu/aOvhd8qT+hvDrFpiwqp8MRXDY9szc0= +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= +github.com/sanposhiho/wastedassign/v2 v2.0.6 h1:+6/hQIHKNJAUixEj6EmOngGIisyeI+T3335lYTyxRoA= github.com/sanposhiho/wastedassign/v2 v2.0.6/go.mod h1:KyZ0MWTwxxBmfwn33zh3k1dmsbF2ud9pAAGfoLfjhtI= +github.com/sashamelentyev/interfacebloat v1.1.0 h1:xdRdJp0irL086OyW1H/RTZTr1h/tMEOsumirXcOJqAw= github.com/sashamelentyev/interfacebloat v1.1.0/go.mod h1:+Y9yU5YdTkrNvoX0xHc84dxiN1iBi9+G8zZIhPVoNjQ= +github.com/sashamelentyev/usestdlibvars v1.13.0 h1:uObNudVEEHf6JbOJy5bgKJloA1bWjxR9fwgNFpPzKnI= github.com/sashamelentyev/usestdlibvars v1.13.0/go.mod h1:D2Wb7niIYmTB+gB8z7kh8tyP5ccof1dQ+SFk+WW5NtY= +github.com/satori/go.uuid v1.2.0 h1:0uYX9dsZ2yD7q2RtLRtPSdGDWzjeM3TbMJP9utgA0ww= github.com/satori/go.uuid v1.2.0/go.mod h1:dA0hQrYB0VpLJoorglMZABFdXlWrHn1NEOzdhQKdks0= +github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529 h1:nn5Wsu0esKSJiIVhscUtVbo7ada43DJhG55ua/hjS5I= github.com/sean-/seed v0.0.0-20170313163322-e2103e2c3529/go.mod h1:DxrIzT+xaE7yg65j358z/aeFdxmN0P9QXhEzd20vsDc= +github.com/securego/gosec/v2 v2.13.1 h1:7mU32qn2dyC81MH9L2kefnQyRMUarfDER3iQyMHcjYM= github.com/securego/gosec/v2 v2.13.1/go.mod h1:EO1sImBMBWFjOTFzMWfTRrZW6M15gm60ljzrmy/wtHo= github.com/segmentio/kafka-go v0.1.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= +github.com/segmentio/kafka-go v0.2.0 h1:HtCSf6B4gN/87yc5qTl7WsxPKQIIGXLPPM1bMCPOsoY= github.com/segmentio/kafka-go v0.2.0/go.mod h1:X6itGqS9L4jDletMsxZ7Dz+JFWxM6JHfPOCvTvk+EJo= +github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c h1:W65qqJCIOVP4jpqPQ0YvHYKwcMEMVWIzWC5iNQQfBTU= github.com/shazow/go-diff v0.0.0-20160112020656-b6b7b6733b8c/go.mod h1:/PevMnwAxekIXwN8qQyfc5gl2NlkB3CQlkizAbOkeBs= 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= +github.com/sivchari/containedctx v1.0.2 h1:0hLQKpgC53OVF1VT7CeoFHk9YKstur1XOgfYIc1yrHI= github.com/sivchari/containedctx v1.0.2/go.mod h1:PwZOeqm4/DLoJOqMSIJs3aKqXRX4YO+uXww087KZ7Bw= +github.com/sivchari/nosnakecase v1.7.0 h1:7QkpWIRMe8x25gckkFd2A5Pi6Ymo0qgr4JrhGt95do8= 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= github.com/sonatard/noctx v0.0.1/go.mod h1:9D2D/EoULe8Yy2joDHJj7bv3sZoq9AaSb8B4lqBjiZI= +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= +github.com/stbenjam/no-sprintf-host-port v0.1.1 h1:tYugd/yrm1O0dV+ThCbaKZh195Dfm07ysF0U6JQXczc= github.com/stbenjam/no-sprintf-host-port v0.1.1/go.mod h1:TLhvtIvONRzdmkFiio4O8LHsN9N74I+PhRquPsxpL0I= github.com/streadway/amqp v0.0.0-20190404075320-75d898a42a94/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/amqp v1.0.0 h1:kuuDrUJFZL1QYL9hUNuCxNObNzB0bV/ZG5jV3RWAQgo= github.com/streadway/amqp v1.0.0/go.mod h1:AZpEONHx3DKn8O/DFsRAY58/XVQiIPMTMB1SddzLXVw= +github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e h1:mOtuXaRAbVZsxAHVdPR3IjfmN8T1h2iczJLynhLybf8= github.com/streadway/handy v0.0.0-20200128134331-0f66f006fb2e/go.mod h1:qNTQ5P5JnDBl6z3cMAg/SywNDC5ABu5ApDIw6lUbRmI= github.com/stretchr/testify v1.2.0/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= 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= +github.com/tdakkota/asciicheck v0.1.1 h1:PKzG7JUTUmVspQTDqtkX9eSiLGossXTybutHwTXuO0A= github.com/tdakkota/asciicheck v0.1.1/go.mod h1:yHp0ai0Z9gUljN3o0xMhYJnH/IcvkdTBOX2fmJ93JEM= +github.com/tetafro/godot v1.4.11 h1:BVoBIqAf/2QdbFmSwAWnaIqDivZdOV0ZRwEm6jivLKw= github.com/tetafro/godot v1.4.11/go.mod h1:LR3CJpxDVGlYOWn3ZZg1PgNZdTUvzsZWu8xaEohUpn8= +github.com/timakin/bodyclose v0.0.0-20210704033933-f49887972144 h1:kl4KhGNsJIbDHS9/4U9yQo1UcPQM0kOMJHn29EoH/Ro= 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= +github.com/tomarrell/wrapcheck/v2 v2.6.2 h1:3dI6YNcrJTQ/CJQ6M/DUkc0gnqYSIk6o0rChn9E/D0M= 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.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= go.etcd.io/etcd/api/v3 v3.5.0/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= +go.etcd.io/etcd/api/v3 v3.5.4 h1:OHVyt3TopwtUQ2GKdd5wu3PmmipR4FTwCqoEjSyRdIc= go.etcd.io/etcd/api/v3 v3.5.4/go.mod h1:5GB2vv4A4AOn3yk7MftYGHkUfGtDHnEraIjym4dYz5A= go.etcd.io/etcd/client/pkg/v3 v3.5.0/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= +go.etcd.io/etcd/client/pkg/v3 v3.5.4 h1:lrneYvz923dvC14R54XcA7FXoZ3mlGZAgmwhfm7HqOg= go.etcd.io/etcd/client/pkg/v3 v3.5.4/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.0/go.mod h1:h9puh54ZTgAKtEbut2oe9P4L/oqKCVB6xsXlzd7alYQ= +go.etcd.io/etcd/client/v2 v2.305.4 h1:Dcx3/MYyfKcPNLpR4VVQUP5KgYrBeJtktBwEKkw08Ao= go.etcd.io/etcd/client/v2 v2.305.4/go.mod h1:Ud+VUwIi9/uQHOMA+4ekToJ12lTxlv0zB/+DHwTGEbU= go.etcd.io/etcd/client/v3 v3.5.0/go.mod h1:AIKXXVX/DQXtfTEqBryiLTUXwON+GuvO6Z7lLS/oTh0= +go.etcd.io/etcd/client/v3 v3.5.4 h1:p83BUL3tAYS0OT/r0qglgc3M1JjhM0diV8DSWAhVXv4= go.etcd.io/etcd/client/v3 v3.5.4/go.mod h1:ZaRkVgBZC+L+dLCjTcF1hRXpgZXQPOvnA/Ak/gq3kiY= +go.etcd.io/gofail v0.1.0 h1:XItAMIhOojXFQMgrxjnd2EIIHun/d5qL0Pf7FzVTkFg= go.etcd.io/gofail v0.1.0/go.mod h1:VZBCXYGZhHAinaBiiqYvuDynvahNsAyLFwB3kEHKz1M= go.opencensus.io v0.23.0/go.mod h1:XItmlyltB5F7CS4xOC1DcqMoFqwtC6OG2xF7mCv7P7E= +go.opencensus.io v0.24.0 h1:y73uSU6J157QMP2kn2r30vwW1A2W2WFwSCGnAVxeaD0= go.opencensus.io v0.24.0/go.mod h1:vNK8G9p7aAivkbmorf4v+7Hgx+Zs0yY+0fOtgBfjQKo= +go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1 h1:SpGay3w+nEwMpfVnbqOLH5gY52/foP8RE8UzTZ1pdSE= go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.46.1/go.mod h1:4UoMYEZOC0yN/sPGH76KPkkU7zgiEWYWL9vwmbnTJPE= +go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1 h1:aFJWCqJMNjENlcleuuOkGAPH82y0yULBScfXcIEdS24= go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.46.1/go.mod h1:sEGXWArGqc3tVa+ekntsN65DmVbVeW+7lTKTjZF3/Fo= +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= go.uber.org/multierr v1.7.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= +go.uber.org/multierr v1.8.0 h1:dg6GjLku4EH+249NNmoIciG9N/jURbDG+pFlTkhzIC8= go.uber.org/multierr v1.8.0/go.mod h1:7EAYxJLBy9rStEaz58O2t4Uvip6FSURkq8/ppBp95ak= go.uber.org/zap v1.9.1/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= go.uber.org/zap v1.17.0/go.mod h1:MXVU+bhUf/A7Xi2HNOnopQOrmycQ5Ih87HtOu4q5SSo= 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= @@ -759,14 +1342,17 @@ 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.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/crypto v0.32.0/go.mod h1:ZnnJkOaASj8g0AjIduWNlq2NRxL0PlBrbKVyZ6V/Ugc= 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= +golang.org/x/exp/typeparams v0.0.0-20220613132600-b0d781184e0d h1:+W8Qf4iJtMGKkyAygcKohjxTk4JPsL9DpzApJ22m5Ic= golang.org/x/exp/typeparams v0.0.0-20220613132600-b0d781184e0d/go.mod h1:AbB0pIl9nAr9wVwH+Z2ZpaocVmF5I4GyWCDIsVjR0bk= 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= @@ -783,7 +1369,6 @@ golang.org/x/net v0.0.0-20210614182718-04defd469f4e/go.mod h1:9nx3DQGgdP8bBQD5qx 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= @@ -794,55 +1379,17 @@ golang.org/x/oauth2 v0.8.0/go.mod h1:yr7u4HXZRm1R1kBWqr/xKNqewf0plRYoB7sla+BCIXE golang.org/x/oauth2 v0.12.0/go.mod h1:A74bZ3aGXgCY0qaIC9Ahg6Lglin4AMAco8cIv9baba4= golang.org/x/oauth2 v0.13.0/go.mod h1:/JMhi4ZRXAf4HG9LiNmxvk+45+96RUlVThiH8FzNBn0= golang.org/x/oauth2 v0.15.0/go.mod h1:q48ptWNTY5XWf+JNten23lcvHpLJ0ZSxF5ttTHKVCAM= +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.5.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.6.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= golang.org/x/sync v0.7.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk= -golang.org/x/sync v0.10.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-20210220050731-9a76102bfb43/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210303074136-134d130e1a04/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210305230114-8fe3ee5dd75b/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210315160823-c6e025ad8005/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs= -golang.org/x/sys v0.0.0-20210320140829-1e4c9ba3b0c4/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.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/sys v0.29.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA= +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.6.0/go.mod h1:m6U89DPEgQRMq3DNkDClhWw02AUbt2daBVO4cn4Hv9U= -golang.org/x/term v0.18.0/go.mod h1:ILwASektA3OnRv7amZ1xhE/KTR+u50pbXfZ03+6Nx58= +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= @@ -865,20 +1412,28 @@ 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-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= 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.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= @@ -899,7 +1454,9 @@ google.golang.org/genproto/googleapis/api v0.0.0-20231016165738-49dd2c1f3d0b/go. google.golang.org/genproto/googleapis/api v0.0.0-20231211222908-989df2bf70f3/go.mod h1:k2dtGpRrbsSyKcNPKKI5sstZkrNCZwpU/ns96JoHbGg= google.golang.org/genproto/googleapis/api v0.0.0-20240102182953-50ed04b92917/go.mod h1:CmlNWB9lSezaYELKS5Ym1r44VrrbPUa7JTvw+6MbpJ0= 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-20231212172506-995d672761c0/go.mod h1:FUoWkonphQm3RhTS+kOEhF8h0iDpm4tdXolVCeZ9KKA= @@ -911,23 +1468,39 @@ google.golang.org/grpc v1.38.0/go.mod h1:NREThFqKR1f3iQ6oBuvc5LadQuXVGo9rkm5ZGrQ google.golang.org/grpc v1.40.0/go.mod h1:ogyxbiOoUXAkP+4+xa6PZSE9DZgIHtSpzjDTB9KAK34= google.golang.org/grpc v1.59.0/go.mod h1:aUPDwccQo6OTjy7Hct4AfBPD1GptF4fyUjIkQ9YtF98= google.golang.org/grpc v1.60.1/go.mod h1:OlCHIeLYqSSsLi6i49B5QGdzaMZK9+M7LXN2FKz4eGM= +google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0 h1:M1YKkFIboKNieVO5DLUEVzQfGwJD30Nv2jfUgzb5UcE= google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.1.0/go.mod h1:6Kw0yEErY5E/yWrBtf03jp27GLLJujG4z/JK95pnjjw= google.golang.org/protobuf v1.27.1/go.mod h1:9q0QmTI4eRPtz6boOQmLYwt+qCgq0jsYwAQnmE0givc= google.golang.org/protobuf v1.31.0/go.mod h1:HV8QOd/L58Z+nl8r43ehVNZIU/HEI6OcFqwMG9pJV4I= google.golang.org/protobuf v1.32.0/go.mod h1:c6P6GXX6sHbq/GpV6MGZEdwhWPcYBgnhAHhKbcUYpos= +gopkg.in/alecthomas/kingpin.v2 v2.2.6 h1:jMFz6MfLP0/4fUyZle81rXUoxOBFi19VUFKVDOQfozc= gopkg.in/check.v1 v1.0.0-20200227125254-8fa46927fb4f/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +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/ini.v1 v1.62.0/go.mod h1:pNLf8WUiyNEtQjuu5G5vTm06TEv9tsIgeAvK8hOrP4k= -gopkg.in/olebedev/go-duktape.v3 v3.0.0-20200619000410-60c24ae608a6/go.mod h1:uAJfkITjFhyEEuUfm7bsmCZRbW5WRq8s9EY8HZ6hCns= +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= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v3 v3.0.0-20210107192922-496545a6307b/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= +gotest.tools/v3 v3.5.1 h1:EENdUnS3pdur5nybKYIh2Vfgc8IUNBjxDPSjtiJcOzU= gotest.tools/v3 v3.5.1/go.mod h1:isy3WKz7GK6uNw/sbHzfKBLvlvXwUyV06n6brMxxopU= +honnef.co/go/tools v0.3.3 h1:oDx7VAwstgpYpb3wv0oxiZlxY+foCpRAwY7Vk6XpAgA= honnef.co/go/tools v0.3.3/go.mod h1:jzwdWgg7Jdq75wlfblQxO4neNaFFSvgc1tD5Wv8U0Yw= +mvdan.cc/gofumpt v0.3.1 h1:avhhrOmv0IuvQVK7fvwV91oFSGAk5/6Po8GXTzICeu8= mvdan.cc/gofumpt v0.3.1/go.mod h1:w3ymliuxvzVx8DAutBnVyDqYb1Niy/yCJt/lk821YCE= +mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed h1:WX1yoOaKQfddO/mLzdV4wptyWgoH/6hwLs7QHTixo0I= mvdan.cc/interfacer v0.0.0-20180901003855-c20040233aed/go.mod h1:Xkxe497xwlCKkIaQYRfC7CSLworTXY9RMqwhhCm+8Nc= +mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b h1:DxJ5nJdkhDlLok9K6qO+5290kphDJbHOQO1DFFFTeBo= mvdan.cc/lint v0.0.0-20170908181259-adc824a0674b/go.mod h1:2odslEg/xrtNQqCYg2/jCoyKnw3vv5biOc3JnIcYfL4= +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/cmd/node/main.go b/node/cmd/node/main.go index 25a5a0a05..faeed7960 100644 --- a/node/cmd/node/main.go +++ b/node/cmd/node/main.go @@ -41,6 +41,7 @@ func main() { app.Action = L2NodeMain app.Commands = []cli.Command{ keyConverterCmd, + versionCmd, } err := app.Run(os.Args) if err != 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/config.go b/node/core/config.go index f14d66488..cd3e80aae 100644 --- a/node/core/config.go +++ b/node/core/config.go @@ -23,8 +23,8 @@ import ( ) var ( - MainnetUpgradeBatchTime uint64 = 2000 - HoleskyUpgradeBatchTime uint64 = 350000 + MainnetUpgradeBatchTime uint64 = 0 + MainnetBlsKeyCheckForkHeight uint64 = 18409547 ) type Config struct { @@ -35,6 +35,7 @@ type Config struct { 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"` } @@ -157,12 +158,12 @@ func (c *Config) SetCliContext(ctx *cli.Context) error { c.DevSequencer = ctx.GlobalBool(flags.DevSequencer.Name) } - // setup batch upgrade index + // 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 90f97e253..0d8895658 100644 --- a/node/core/executor.go +++ b/node/core/executor.go @@ -51,9 +51,10 @@ type Executor struct { isSequencer bool devSequencer bool - UpgradeBatchTime uint64 - rollupABI *abi.ABI - batchingCache *BatchingCache + UpgradeBatchTime uint64 + blsKeyCheckForkHeight uint64 + rollupABI *abi.ABI + batchingCache *BatchingCache logger tmlog.Logger metrics *Metrics @@ -108,21 +109,22 @@ 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, + logger: logger, + metrics: PrometheusMetrics("morphnode"), } if config.DevSequencer { @@ -135,7 +137,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 } @@ -327,7 +334,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 +397,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 871994300..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,8 +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) - continue - // 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) { @@ -148,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/derivation/beacon.go b/node/derivation/beacon.go index d94101d63..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. diff --git a/node/derivation/beacon_test.go b/node/derivation/beacon_test.go index 2f79aa0c9..12e2dbaf7 100644 --- a/node/derivation/beacon_test.go +++ b/node/derivation/beacon_test.go @@ -1 +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/flags/flags.go b/node/flags/flags.go index 7ea7c21b2..3bb690e5c 100644 --- a/node/flags/flags.go +++ b/node/flags/flags.go @@ -230,10 +230,6 @@ var ( Name: "mainnet", Usage: "Morph mainnet", } - HoleskyFlag = cli.BoolFlag{ - Name: "holesky", - Usage: "Morph Holesky", - } DerivationConfirmations = cli.Int64Flag{ Name: "derivation.confirmations", @@ -345,7 +341,6 @@ var Flags = []cli.Flag{ // batch rules UpgradeBatchTime, MainnetFlag, - HoleskyFlag, // logger LogLevel, diff --git a/node/go.mod b/node/go.mod index 23e84b4c5..e8f9a3353 100644 --- a/node/go.mod +++ b/node/go.mod @@ -11,14 +11,14 @@ require ( 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.20251031091135-78b17f183b84 + github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2 github.com/prometheus/client_golang v1.17.0 github.com/spf13/viper v1.13.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 ) @@ -32,7 +32,7 @@ require ( 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.4 // 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 diff --git a/node/go.sum b/node/go.sum index 70fde719b..d11447ab7 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= @@ -111,9 +111,9 @@ 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.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= 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= @@ -361,8 +361,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.20251031091135-78b17f183b84 h1:FmHKWYMNfIfpNDWO4+ulmmgstBI5Ujt7NWI1g1PzVjQ= -github.com/morph-l2/go-ethereum v1.10.14-0.20251031091135-78b17f183b84/go.mod h1:U/Gt6UghgHD7SB8t/rTD9908qFRjvzgIAtXUqEYjtI8= +github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2 h1:FUv9gtnvF+1AVrkoNGYbVOesi7E+STjdfD2mcqVaEY0= +github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2/go.mod h1:tiFPeidxjoCmLj18ne9H3KQdIGTCvRC30qlef06Fd9M= github.com/morph-l2/tendermint v0.3.2 h1:Gu6Uj2G6c3YP2NAKFi7A46JZaOCdD4zfZDKCjt0pDm8= github.com/morph-l2/tendermint v0.3.2/go.mod h1:TtCzp9l6Z6yDUiwv3TbqKqw8Q8RKp3fSz5+adO1/Y8w= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -509,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= @@ -549,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= 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/l2-genesis/deploy-config/devnet-deploy-config.json b/ops/l2-genesis/deploy-config/devnet-deploy-config.json index 0b3b411c8..46923a4b4 100644 --- a/ops/l2-genesis/deploy-config/devnet-deploy-config.json +++ b/ops/l2-genesis/deploy-config/devnet-deploy-config.json @@ -27,6 +27,7 @@ "morphTokenDailyInflationRate": 1, "morph203Time": 0, "viridianTime": 0, + "emeraldTime": 0, "l2StakingSequencerMaxSize": 4, "l2StakingUnDelegatedLockEpochs": 2, "l2StakingRewardStartTime": 1728000000, diff --git a/ops/l2-genesis/deploy-config/qanet-deploy-config.json b/ops/l2-genesis/deploy-config/qanet-deploy-config.json index 5c7adb096..530a442b7 100644 --- a/ops/l2-genesis/deploy-config/qanet-deploy-config.json +++ b/ops/l2-genesis/deploy-config/qanet-deploy-config.json @@ -25,6 +25,7 @@ "recordNextBatchSubmissionIndex": 1, "morph203Time": 0, "viridianTime": 0, + "emeraldTime": 0, "morphTokenName": "Morph Token", "morphTokenSymbol": "Morph", "morphTokenOwner": "0x716173f5BBE0b4B51AaDF5A5840fA9A79D01636E", diff --git a/ops/l2-genesis/go.mod b/ops/l2-genesis/go.mod index ac50041c8..c87125349 100644 --- a/ops/l2-genesis/go.mod +++ b/ops/l2-genesis/go.mod @@ -6,9 +6,9 @@ replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3. require ( github.com/holiman/uint256 v1.2.4 - github.com/morph-l2/go-ethereum v1.10.14-0.20251031091135-78b17f183b84 + github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2 github.com/stretchr/testify v1.10.0 - github.com/urfave/cli v1.22.14 + github.com/urfave/cli v1.22.17 ) require ( @@ -18,7 +18,7 @@ require ( 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.4 // 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 diff --git a/ops/l2-genesis/go.sum b/ops/l2-genesis/go.sum index 40d9ffb79..34798fa73 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= @@ -26,9 +26,8 @@ github.com/consensys/bavard v0.1.27 h1:j6hKUrGAy/H+gpNrpLU3I26n1yc+VMGmd6ID5+gAh 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.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= -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= @@ -142,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.20251031091135-78b17f183b84 h1:FmHKWYMNfIfpNDWO4+ulmmgstBI5Ujt7NWI1g1PzVjQ= -github.com/morph-l2/go-ethereum v1.10.14-0.20251031091135-78b17f183b84/go.mod h1:U/Gt6UghgHD7SB8t/rTD9908qFRjvzgIAtXUqEYjtI8= +github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2 h1:FUv9gtnvF+1AVrkoNGYbVOesi7E+STjdfD2mcqVaEY0= +github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2/go.mod h1:tiFPeidxjoCmLj18ne9H3KQdIGTCvRC30qlef06Fd9M= 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= @@ -200,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= @@ -219,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= diff --git a/ops/l2-genesis/morph-chain-ops/genesis/config.go b/ops/l2-genesis/morph-chain-ops/genesis/config.go index 4e963ca03..a87f38c04 100644 --- a/ops/l2-genesis/morph-chain-ops/genesis/config.go +++ b/ops/l2-genesis/morph-chain-ops/genesis/config.go @@ -129,6 +129,7 @@ type DeployConfig struct { // 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 @@ -455,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 7dd10ae82..7aae9cd7d 100644 --- a/ops/l2-genesis/morph-chain-ops/genesis/genesis.go +++ b/ops/l2-genesis/morph-chain-ops/genesis/genesis.go @@ -45,6 +45,11 @@ func NewL2Genesis(config *DeployConfig, block *types.Block) (*core.Genesis, erro 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), @@ -67,6 +72,7 @@ func NewL2Genesis(config *DeployConfig, block *types.Block) (*core.Genesis, erro 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/setters.go b/ops/l2-genesis/morph-chain-ops/genesis/setters.go index 680d191a0..16cacd182 100644 --- a/ops/l2-genesis/morph-chain-ops/genesis/setters.go +++ b/ops/l2-genesis/morph-chain-ops/genesis/setters.go @@ -107,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 } 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/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 94eb2e803..5ece6f2bd 100644 --- a/ops/tools/go.mod +++ b/ops/tools/go.mod @@ -5,7 +5,7 @@ go 1.24.0 replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.3.2 require ( - github.com/morph-l2/go-ethereum v1.10.14-0.20251031091135-78b17f183b84 + github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2 github.com/tendermint/tendermint v0.35.9 ) diff --git a/ops/tools/go.sum b/ops/tools/go.sum index 37fd30e70..7bc000407 100644 --- a/ops/tools/go.sum +++ b/ops/tools/go.sum @@ -163,8 +163,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.20251031091135-78b17f183b84 h1:FmHKWYMNfIfpNDWO4+ulmmgstBI5Ujt7NWI1g1PzVjQ= -github.com/morph-l2/go-ethereum v1.10.14-0.20251031091135-78b17f183b84/go.mod h1:U/Gt6UghgHD7SB8t/rTD9908qFRjvzgIAtXUqEYjtI8= +github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2 h1:FUv9gtnvF+1AVrkoNGYbVOesi7E+STjdfD2mcqVaEY0= +github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2/go.mod h1:tiFPeidxjoCmLj18ne9H3KQdIGTCvRC30qlef06Fd9M= github.com/morph-l2/tendermint v0.3.2 h1:Gu6Uj2G6c3YP2NAKFi7A46JZaOCdD4zfZDKCjt0pDm8= github.com/morph-l2/tendermint v0.3.2/go.mod h1:TtCzp9l6Z6yDUiwv3TbqKqw8Q8RKp3fSz5+adO1/Y8w= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= diff --git a/oracle/go.mod b/oracle/go.mod index 639a714d9..2c115e81a 100644 --- a/oracle/go.mod +++ b/oracle/go.mod @@ -7,11 +7,11 @@ replace github.com/tendermint/tendermint => github.com/morph-l2/tendermint v0.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.20251031091135-78b17f183b84 + github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2 github.com/prometheus/client_golang v1.17.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 ) @@ -24,7 +24,7 @@ require ( 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.4 // 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 diff --git a/oracle/go.sum b/oracle/go.sum index 308a0aa4d..e4d6c750c 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= @@ -38,9 +38,8 @@ github.com/cosmos/go-bip39 v0.0.0-20180819234021-555e2067c45d h1:49RLWk1j44Xu4fj 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.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= -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= @@ -175,8 +174,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.20251031091135-78b17f183b84 h1:FmHKWYMNfIfpNDWO4+ulmmgstBI5Ujt7NWI1g1PzVjQ= -github.com/morph-l2/go-ethereum v1.10.14-0.20251031091135-78b17f183b84/go.mod h1:U/Gt6UghgHD7SB8t/rTD9908qFRjvzgIAtXUqEYjtI8= +github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2 h1:FUv9gtnvF+1AVrkoNGYbVOesi7E+STjdfD2mcqVaEY0= +github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2/go.mod h1:tiFPeidxjoCmLj18ne9H3KQdIGTCvRC30qlef06Fd9M= github.com/morph-l2/tendermint v0.3.2 h1:Gu6Uj2G6c3YP2NAKFi7A46JZaOCdD4zfZDKCjt0pDm8= github.com/morph-l2/tendermint v0.3.2/go.mod h1:TtCzp9l6Z6yDUiwv3TbqKqw8Q8RKp3fSz5+adO1/Y8w= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -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= @@ -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= diff --git a/oracle/oracle/batch.go b/oracle/oracle/batch.go index 0c2d52f7b..8e1eb9c23 100644 --- a/oracle/oracle/batch.go +++ b/oracle/oracle/batch.go @@ -192,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/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 9c6ad0956..f6cf8ba1e 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#4077135d57c44f11b731433c9ba42596560566cc" +source = "git+https://github.com/morph-l2/revm?branch=release/v42#17ddb55b4313d8cf5282dc8dfa3aa7635301953d" 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#4077135d57c44f11b731433c9ba42596560566cc" +source = "git+https://github.com/morph-l2/revm?branch=release/v42#17ddb55b4313d8cf5282dc8dfa3aa7635301953d" 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#4077135d57c44f11b731433c9ba42596560566cc" +source = "git+https://github.com/morph-l2/revm?branch=release/v42#17ddb55b4313d8cf5282dc8dfa3aa7635301953d" 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#4077135d57c44f11b731433c9ba42596560566cc" +source = "git+https://github.com/morph-l2/revm?branch=release/v42#17ddb55b4313d8cf5282dc8dfa3aa7635301953d" 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 baf514f47..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] @@ -25,7 +25,7 @@ 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"] } @@ -34,21 +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" @@ -103,7 +111,7 @@ features = [ "morph-default-handler", "morph-poseidon-codehash", "std", - "optional_no_base_fee" + "optional_no_base_fee", ] [workspace.dependencies.revm-primitives] @@ -114,7 +122,7 @@ features = [ "morph-default-handler", "morph-poseidon-codehash", "std", - "optional_no_base_fee" + "optional_no_base_fee", ] @@ -137,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/README.md b/prover/README.md index 5cd052ed8..e7939af86 100644 --- a/prover/README.md +++ b/prover/README.md @@ -9,7 +9,7 @@ Generate zk proof for the l2 batch. ### Fast Run ```sh cd bin/host -RUST_LOG=info TRUSTED_SETUP_4844=./configs/4844_trusted_setup.txt cargo run --release +RUST_LOG=info TRUSTED_SETUP_4844=../../configs/4844_trusted_setup.txt cargo run --release ``` or 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 cdb8ea429..44763205f 100644 --- a/prover/bin/challenge/src/handler.rs +++ b/prover/bin/challenge/src/handler.rs @@ -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; @@ -175,6 +174,7 @@ impl ChallengeHandler { 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; } @@ -462,6 +462,8 @@ async fn batch_inspect(l1_rollup: &RollupType, l1_provider: &Provider, bat let withdrawal_root: [u8; 32] = param.batch_data_input.withdrawal_root; let last_block_number: u64 = param.batch_data_input.last_block_number; let num_l1_messages = param.batch_data_input.num_l1_messages; + log::info!("======> batch inspect: decode tx.input, version = {:#?}", version); + log::info!("======> batch inspect: decode tx.input, param = {:#?}", param); let mut batch_info = BatchInfo { version, @@ -574,4 +576,4 @@ pub fn contract_error(e: ContractError) -> String { format!("error: {:?}", e) }; error_msg -} +} \ No newline at end of file diff --git a/prover/bin/client/elf/riscv32im-succinct-zkvm-elf b/prover/bin/client/elf/riscv32im-succinct-zkvm-elf index df42e45c2..49df04150 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 7c8147173..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() }; diff --git a/prover/bin/host/src/main.rs b/prover/bin/host/src/main.rs index 75a01a0ed..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/viridian/eip7702_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 b82e1bffc..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, 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); +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/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 80f58da96..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; @@ -11,4 +17,15 @@ pub struct BatchInfo { pub batch_index: u64, 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 dc8302b4e..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,6 +30,9 @@ 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; @@ -71,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), @@ -183,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_proving::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, start_block: 1000001, end_block: 1000002 }; - - shadow_prover.prove(batch_info).await.unwrap(); -} diff --git a/prover/bin/shadow-prove/src/shadow_prove.rs b/prover/bin/shadow-prove/src/shadow_prove.rs index 12e950fd8..b6f9b2d06 100644 --- a/prover/bin/shadow-prove/src/shadow_prove.rs +++ b/prover/bin/shadow-prove/src/shadow_prove.rs @@ -110,6 +110,10 @@ async fn handle_with_prover( // 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; @@ -160,6 +164,10 @@ async fn handle_with_prover( 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 6c41d8488..18e9e866c 100644 --- a/prover/bin/shadow-prove/src/shadow_rollup.rs +++ b/prover/bin/shadow-prove/src/shadow_rollup.rs @@ -1,4 +1,4 @@ -use crate::{metrics::METRICS, util::read_env_var, BatchInfo}; +use crate::{metrics::METRICS, BatchInfo}; use alloy::{ consensus::Transaction, network::{Network, ReceiptResponse}, @@ -47,31 +47,15 @@ where /** * 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, - &self.l2_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); }; @@ -155,96 +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>, - l2_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() < 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())); + 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())); + + 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()); + } + }; - let batch_index = match logs.get(logs.len() - 2) { - Some(log) => { - let _index = U256::from_be_slice(log.topics()[1].as_slice()); - _index.to::() + if batch_index_hash.0 == 0 { + return Err(String::from("batch_index is 0")); } - 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()); + } + }; + + 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.0 >= blocks.1 { + return Err(String::from("blocks is empty")); } - }; - if batch_index == 0 { - return Err(String::from("batch_index is 0")); - } - let (blocks, total_txn_count) = - match batch_blocks_inspect(l1_rollup, l2_provider, batch_index).await { - Some(block_txn) => block_txn, - None => return Err(String::from("batch_blocks_inspect none")), + 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 blocks.0 <= blocks.1 { - return Err(String::from("blocks is empty")); - } + // A rollup commit_batch_input contains prev batch_header. + let next_tx_hash = match logs.last() { + Some(log) => log.transaction_hash.unwrap_or_default(), - if blocks.1 - blocks.0 + 1 > read_env_var("SHADOW_PROVING_MAX_BLOCK", 300) { - log::warn!("Too many blocks in the latest batch to shadow prove"); - return Ok(None); - } + 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())?; - 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); + log::info!("Found the committed batch, batch index = {:#?}", batch_index_hash.0); + Ok(Some((batch_info, batch_input.0))) } - let batch_info: BatchInfo = - BatchInfo { batch_index, start_block: blocks.0, end_block: blocks.1 }; - - // A rollup commit_batch_input contains prev batch_header. - let next_tx_hash = match logs.last() { - Some(log) => log.transaction_hash.unwrap_or_default(), + 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; + } - None => { - return Err("find commit_batch log error".to_string()); + 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(); } - }; - let batch_header = batch_header_inspect(l1_provider, next_tx_hash) - .await - .ok_or_else(|| "Failed to inspect batch header".to_string())?; - log::info!("Found the committed batch, batch index = {:#?}", batch_index); - Ok(Some((batch_info, batch_header))) + log::info!( + "decode_blocks, blocks_len: {:#?}, start_block: {:#?}, txn_in_batch: {:?}", + end_block - start_block, + start_block, + total_tx_count + ); + + 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) + } } -pub async fn batch_header_inspect( +pub async fn batch_input_inspect( l1_provider: &RootProvider>, hash: TxHash, -) -> Option { +) -> Option<(Bytes, u64)> { //Step1. Get transaction let result = l1_provider.get_transaction_by_hash(hash).await; let tx = match result { @@ -273,80 +315,9 @@ pub async fn batch_header_inspect( return None; }; let parent_batch_header: Bytes = param.batchDataInput.parentBatchHeader; - Some(parent_batch_header) -} - -async fn batch_blocks_inspect( - l1_rollup: &RollupInstance, - l2_provider: &RootProvider>, - batch_index: u64, -) -> Option<((u64, u64), u64)> -where - P: Provider + Clone, - T: Transport + Clone, - N: Network, -{ - let prev_bn = match l1_rollup.batchDataStore(U256::from(batch_index - 1)).call().await { - Ok(s) => s.blockNumber.to::(), - Err(e) => { - log::error!("l1_rollup.batch_data_store err: {:#?}", e); - return None; - } - }; - - let current_bn = match l1_rollup.batchDataStore(U256::from(batch_index)).call().await { - Ok(s) => s.blockNumber.to::(), - Err(e) => { - log::error!("l1_rollup.batch_data_store err: {:#?}", e); - return None; - } - }; - - let mut total_tx_count: u64 = 0; - for i in prev_bn + 1..current_bn + 1 { - total_tx_count += l2_provider - .get_block_transaction_count_by_number(i.into()) - .await - .unwrap_or_default() - .unwrap_or_default(); - } - - log::info!( - "decode_blocks, blocks_len: {:#?}, start_block: {:#?}, txn_in_batch: {:?}", - current_bn - prev_bn, - prev_bn + 1, - total_tx_count - ); - - METRICS.shadow_txn_len.set(total_tx_count as i64); - - Some(((prev_bn + 1, current_bn), total_tx_count)) + let last_block_number: u64 = param.batchDataInput.lastBlockNumber; + Some((parent_batch_header, last_block_number)) } - -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_sync_batch() { use alloy::{ @@ -390,7 +361,8 @@ async fn test_sync_batch() { 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] @@ -404,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/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 94178f6ef..6ab5f2bce 100644 --- a/prover/crates/core/src/executor/mod.rs +++ b/prover/crates/core/src/executor/mod.rs @@ -92,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"); @@ -120,6 +126,8 @@ impl EvmExecutor<'_> { 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() }; @@ -277,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" ); @@ -303,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 aa91a6e02..d613a36be 100644 --- a/prover/crates/core/src/hardfork.rs +++ b/prover/crates/core/src/hardfork.rs @@ -23,6 +23,7 @@ static HARDFORK_HEIGHTS: Lazy>> = Lazy::new(|| (SpecId::CURIE, 0), (SpecId::MORPH203, 0), (SpecId::VIRIDIAN, 0), + (SpecId::EMERALD, 0), ]), ); map.insert( @@ -32,6 +33,7 @@ static HARDFORK_HEIGHTS: Lazy>> = Lazy::new(|| (SpecId::CURIE, 0), (SpecId::MORPH203, 0), (SpecId::VIRIDIAN, 0), + (SpecId::EMERALD, 0), ]), ); map.insert( @@ -41,6 +43,7 @@ static HARDFORK_HEIGHTS: Lazy>> = Lazy::new(|| (SpecId::CURIE, 0), (SpecId::MORPH203, 0), (SpecId::VIRIDIAN, 0), + (SpecId::EMERALD, 0), ]), ); @@ -54,6 +57,7 @@ pub struct HardforkConfig { curie_block: u64, morph203_block: u64, viridian_block: u64, + emerald_block: u64, } impl HardforkConfig { @@ -65,6 +69,7 @@ impl HardforkConfig { 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!( @@ -93,6 +98,12 @@ impl HardforkConfig { 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 { @@ -100,7 +111,8 @@ impl HardforkConfig { n if n < self.curie_block => SpecId::BERNOULLI, n if n < self.morph203_block => SpecId::CURIE, n if n < self.viridian_block => SpecId::MORPH203, - _ => SpecId::VIRIDIAN, + 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 2e630930a..5bd458a58 100644 --- a/prover/crates/morph-executor/client/src/lib.rs +++ b/prover/crates/morph-executor/client/src/lib.rs @@ -41,7 +41,7 @@ pub fn verify(input: &ClientInput) -> Result { // 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 0e476d5b8..3f83b0eba 100644 --- a/prover/crates/morph-executor/client/src/types/blob.rs +++ b/prover/crates/morph-executor/client/src/types/blob.rs @@ -76,7 +76,8 @@ pub fn decode_transactions(bs: &[u8]) -> Vec { (first_byte - 0xf7) as usize } else { // Support transaction types: 0x01, 0x02, 0x04 - if first_byte != 0x01 && first_byte != 0x02 && first_byte != 0x04 { + if first_byte != 0x01 && first_byte != 0x02 && first_byte != 0x04 && first_byte != 0x7f + { println!("not supported tx type: 0x{:02x}", first_byte); break; } 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 c0b3986dc..72b597f8b 100644 --- a/prover/crates/morph-executor/client/src/verifier/blob_verifier.rs +++ b/prover/crates/morph-executor/client/src/verifier/blob_verifier.rs @@ -19,7 +19,8 @@ impl BlobVerifier { 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()[num_blocks*60..]); + 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/primitives/src/lib.rs b/prover/crates/primitives/src/lib.rs index 4214bc4f6..6f6f17216 100644 --- a/prover/crates/primitives/src/lib.rs +++ b/prover/crates/primitives/src/lib.rs @@ -1,6 +1,6 @@ //! 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, TxEip7702, TxEnvelope, TxLegacy}, eips::eip2930::AccessList, @@ -194,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(); @@ -270,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) } } @@ -401,4 +423,12 @@ impl TxTrace for &T { 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/mod.rs b/prover/crates/primitives/src/types/mod.rs index 7ad1402a0..d88af7dd0 100644 --- a/prover/crates/primitives/src/types/mod.rs +++ b/prover/crates/primitives/src/types/mod.rs @@ -6,6 +6,8 @@ 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}; diff --git a/prover/crates/primitives/src/types/tx.rs b/prover/crates/primitives/src/types/tx.rs index f12f9ccbf..8790efaaa 100644 --- a/prover/crates/primitives/src/types/tx.rs +++ b/prover/crates/primitives/src/types/tx.rs @@ -1,6 +1,9 @@ -use crate::{types::AuthorizationList, 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 @@ -107,8 +112,15 @@ pub struct TransactionTrace { 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 @@ -182,6 +194,14 @@ impl TxTrace for TransactionTrace { 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 { @@ -255,6 +275,14 @@ impl TxTrace for ArchivedTransactionTrace { 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 { @@ -262,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), } } @@ -269,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(), } } @@ -276,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(), } } @@ -283,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(), } } @@ -290,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(), } } @@ -297,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(), } } @@ -304,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(), } } @@ -311,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(), } } @@ -318,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(), } } @@ -325,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(), } } @@ -332,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(), } } @@ -339,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(), } } @@ -346,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(), } } @@ -353,6 +394,7 @@ 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(), } } @@ -360,6 +402,7 @@ impl Transaction for TypedTransaction { match self { TypedTransaction::Enveloped(tx) => tx.authorization_list(), TypedTransaction::L1Msg(_) => None, + TypedTransaction::AltFee(_) => None, } } } @@ -476,6 +519,7 @@ impl TypedTransaction { match self { TypedTransaction::Enveloped(tx) => tx.tx_hash(), TypedTransaction::L1Msg(tx) => &tx.tx_hash, + TypedTransaction::AltFee(tx) => tx.hash(), } } @@ -486,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(), } } @@ -500,6 +545,10 @@ 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::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(), } } @@ -511,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()) } @@ -520,6 +570,7 @@ impl TypedTransaction { match self { TypedTransaction::Enveloped(tx) => tx.signature_hash(), TypedTransaction::L1Msg(_) => keccak256(self.rlp()), + TypedTransaction::AltFee(tx) => tx.signature_hash(), } } @@ -534,6 +585,7 @@ impl TypedTransaction { _ => unimplemented!("unsupported tx type {:?}", tx.tx_type()), }, TypedTransaction::L1Msg(tx) => tx.input.clone(), + TypedTransaction::AltFee(tx) => tx.tx().input.clone(), } } @@ -541,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 @@ -549,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/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/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..4c45911d2 --- /dev/null +++ b/token-price-oracle/README.md @@ -0,0 +1,173 @@ +# Gas Price Oracle + +Gas Price Oracle service monitors L1 gas prices and updates the GasPriceOracle contract on L2. + +## Features + +- **L1 Base Fee Update**: Monitors L1 base fee and blob base fee, updates to L2 +- **Scalar Update**: Calculates and updates commit scalar and blob scalar +- **Transaction Manager**: Serializes all contract updates to avoid nonce conflicts +- **Metrics Monitoring**: Exposes Prometheus metrics +- **Flags Configuration**: Uses `urfave/cli` for configuration management (supports both CLI flags and environment variables) + +## Configuration + +The service uses flags that can be set either via command line or environment variables (with `GAS_ORACLE_` prefix). + +### Required Flags + +| Flag | Env Var | Description | +| --------------------- | --------------------------- | ------------------------------- | +| `--l1-eth-rpc` | `GAS_ORACLE_L1_ETH_RPC` | L1 RPC endpoint | +| `--l2-eth-rpc` | `GAS_ORACLE_L2_ETH_RPC` | L2 RPC endpoint | +| `--l1-beacon-rpc` | `GAS_ORACLE_L1_BEACON_RPC` | L1 Beacon Chain API endpoint | +| `--l1-rollup-address` | `GAS_ORACLE_L1_ROLLUP` | L1 Rollup contract address | +| `--private-key` | `GAS_ORACLE_L2_PRIVATE_KEY` | Private key for L2 transactions | + +### Optional Flags + +| Flag | Env Var | Default | Description | +| ------------------------------- | ---------------------------------- | --------------- | --------------------------- | +| `--l2-gas-price-oracle-address` | `GAS_ORACLE_L2_GAS_PRICE_ORACLE` | `0x5300...0002` | L2 GasPriceOracle contract | +| `--gas-threshold` | `GAS_ORACLE_GAS_THRESHOLD` | `10` | Update threshold percentage | +| `--interval` | `GAS_ORACLE_INTERVAL` | `6s` | Base fee update interval | +| `--overhead-interval` | `GAS_ORACLE_OVERHEAD_INTERVAL` | `10` | Scalar update frequency | +| `--txn-per-batch` | `GAS_ORACLE_TXN_PER_BATCH` | `50` | Expected txs per batch | +| `--log-level` | `GAS_ORACLE_LOG_LEVEL` | `info` | Log level | +| `--log-filename` | `GAS_ORACLE_LOG_FILENAME` | - | Log file path | +| `--metrics-server-enable` | `GAS_ORACLE_METRICS_SERVER_ENABLE` | `false` | Enable metrics server | +| `--metrics-hostname` | `GAS_ORACLE_METRICS_HOSTNAME` | `0.0.0.0` | Metrics server host | +| `--metrics-port` | `GAS_ORACLE_METRICS_PORT` | `6060` | Metrics server port | + +## Usage + +### Command Line + +```bash +./bin/token-price-oracle \ + --l1-eth-rpc https://ethereum-rpc.com \ + --l2-eth-rpc https://morph-l2-rpc.com \ + --l1-beacon-rpc https://beacon-api.com \ + --l1-rollup-address 0x... \ + --private-key 0x... \ + --metrics-server-enable \ + --log-level debug +``` + +### Environment Variables + +```bash +export GAS_ORACLE_L1_ETH_RPC="https://ethereum-rpc.com" +export GAS_ORACLE_L2_ETH_RPC="https://morph-l2-rpc.com" +export GAS_ORACLE_L1_BEACON_RPC="https://beacon-api.com" +export GAS_ORACLE_L1_ROLLUP="0x..." +export GAS_ORACLE_L2_PRIVATE_KEY="0x..." +export GAS_ORACLE_METRICS_SERVER_ENABLE=true +export GAS_ORACLE_LOG_LEVEL=info + +./bin/token-price-oracle +``` + +## Build and Run + +**Note**: This project uses Go workspace and depends on `../bindings` module. + +```bash +# Build +make build + +# Run +make run + +# Test +make test + +# Test Bitget price feed (requires network) +go test ./client -run TestBitgetPriceFeed -v + +# Docker +make docker-build +docker run -d \ + -e GAS_ORACLE_L1_ETH_RPC="..." \ + -e GAS_ORACLE_L2_ETH_RPC="..." \ + -e GAS_ORACLE_L1_BEACON_RPC="..." \ + -e GAS_ORACLE_L1_ROLLUP="0x..." \ + -e GAS_ORACLE_L2_PRIVATE_KEY="0x..." \ + morph/token-price-oracle:latest +``` + +## Monitoring + +When metrics server is enabled, it exposes metrics at `:/metrics`: + +- `l1_base_fee` - L1 base fee (Gwei) +- `l1_base_fee_on_l2` - L1 base fee on L2 +- `l1_blob_base_fee_on_l2` - L1 blob base fee on L2 +- `commit_scalar` - Commit scalar value +- `blob_scalar` - Blob scalar value +- `txn_per_batch` - Transactions per batch +- `gas_oracle_owner_balance` - Oracle account balance +- `base_fee_update_count` - Total base fee updates +- `scalar_update_count` - Total scalar updates +- `update_errors_total` - Update errors by type + +Health check endpoint: `:/health` + +## Architecture + +``` +gas-price-oracle/ +├── cmd/ # Main entry point +├── flags/ # CLI flags definitions +├── config/ # Configuration from flags +├── updater/ # Update implementations +│ ├── basefee.go # Base fee updater +│ ├── scalar.go # Scalar updater +│ └── tx_manager.go # Transaction manager (prevents nonce conflicts) +├── client/ # Client wrappers +├── calc/ # Calculation logic +└── metrics/ # Prometheus metrics + +Uses: ../bindings/bindings (project root contract bindings) +``` + +## Key Components + +### Transaction Manager + +All contract updates are serialized through `TxManager` to prevent nonce conflicts: + +- Holds a mutex to ensure only one transaction is sent at a time +- Manages nonce retrieval and transaction confirmation +- Used by both `BaseFeeUpdater` and `ScalarUpdater` + +### Base Fee Updater + +- Runs on a fixed interval (default 6s) +- Fetches L1 base fee and blob base fee +- Updates L2 contract when threshold is exceeded + +### Scalar Updater + +- Runs every N base fee update cycles (default 10) +- Reads `CommitBatch` events from L1 Rollup +- Calculates commit and blob scalars +- Updates L2 contract when necessary + +### Blob Processing + +Blob data processing is partially implemented (interface defined in `calc/blob.go`). The actual blob parsing and L2 transaction extraction is deferred for future implementation. + +## Testing + +```bash +# Run all tests +go test ./... + +# Test Bitget price feed (requires network) +go test ./client -run TestBitgetPriceFeed -v + +# Skip integration tests +go test ./... -short +``` + 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..25b1b7f63 --- /dev/null +++ b/token-price-oracle/client/l2_client.go @@ -0,0 +1,100 @@ +package client + +import ( + "context" + "fmt" + "math/big" + + "github.com/morph-l2/go-ethereum/accounts/abi/bind" + "github.com/morph-l2/go-ethereum/common" + "github.com/morph-l2/go-ethereum/crypto" + "github.com/morph-l2/go-ethereum/ethclient" +) + +// L2Client wraps L2 chain client +type L2Client struct { + client *ethclient.Client + chainID *big.Int + opts *bind.TransactOpts +} + +// NewL2Client creates new L2 client +func NewL2Client(rpcURL string, privateKey string) (*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) + } + + // Parse private key (remove 0x prefix if present) + privateKeyHex := privateKey + if len(privateKey) > 2 && privateKey[:2] == "0x" { + privateKeyHex = 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) + } + + return &L2Client{ + client: client, + chainID: chainID, + opts: opts, + }, 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 +} 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/cmd/main.go b/token-price-oracle/cmd/main.go new file mode 100644 index 000000000..f5cf155a1 --- /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.PrivateKey) + 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..9420fbb77 --- /dev/null +++ b/token-price-oracle/config/config.go @@ -0,0 +1,217 @@ +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 + + // 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), + + 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") + } + } + } + + 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..5cd598531 --- /dev/null +++ b/token-price-oracle/flags/flags.go @@ -0,0 +1,172 @@ +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", + Required: true, + 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"), + } +) + +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, +} + +// 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..771a77156 --- /dev/null +++ b/token-price-oracle/go.mod @@ -0,0 +1,88 @@ +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/go-ethereum v1.10.14-0.20251219060125-03910bc750a2 + 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-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.15 // 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/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/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..933430e9a --- /dev/null +++ b/token-price-oracle/go.sum @@ -0,0 +1,315 @@ +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-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.15 h1:UNAjwbU9l54TA3KzvqLGxwWjHmMgBUVhBiTjelZgg3U= +github.com/mattn/go-runewidth v0.0.15/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/go-ethereum v1.10.14-0.20251219060125-03910bc750a2 h1:FUv9gtnvF+1AVrkoNGYbVOesi7E+STjdfD2mcqVaEY0= +github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2/go.mod h1:tiFPeidxjoCmLj18ne9H3KQdIGTCvRC30qlef06Fd9M= +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.3 h1:utMvzDsuh3suAEnhH0RdHmoPbU648o6CvXxTx4SBMOw= +github.com/rivo/uniseg v0.4.3/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/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.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.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= +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..6a6012a76 --- /dev/null +++ b/token-price-oracle/updater/tx_manager.go @@ -0,0 +1,116 @@ +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 +func (m *TxManager) SendTransaction(ctx context.Context, txFunc func(*bind.TransactOpts) (*types.Transaction, error)) (*types.Receipt, error) { + m.mu.Lock() + defer m.mu.Unlock() + + // 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", + "tx_hash", tx.Hash().Hex(), + "gas_limit", tx.Gas()) + + // Wait for transaction to be mined with custom 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 +} + +// 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/go.mod b/tx-submitter/go.mod index 044e78141..546e3b215 100644 --- a/tx-submitter/go.mod +++ b/tx-submitter/go.mod @@ -9,12 +9,12 @@ require ( 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.20251031091135-78b17f183b84 + github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2 github.com/prometheus/client_golang v1.17.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 + github.com/urfave/cli v1.22.17 gopkg.in/natefinch/lumberjack.v2 v2.2.1 ) @@ -26,7 +26,7 @@ require ( 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/cpuguy83/go-md2man/v2 v2.0.4 // 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 diff --git a/tx-submitter/go.sum b/tx-submitter/go.sum index 42ac28bf5..e98ef3ac1 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= @@ -36,9 +36,8 @@ github.com/consensys/bavard v0.1.27 h1:j6hKUrGAy/H+gpNrpLU3I26n1yc+VMGmd6ID5+gAh 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.2/go.mod h1:tgQtvFlXSQOSOSIRvRPT7W67SCa46tRHOmNcaadrF8o= -github.com/cpuguy83/go-md2man/v2 v2.0.4 h1:wfIWP927BUkWJb2NmU/kNDYIBTh/ziUX91+lVfRxZq4= -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 v0.0.0-20171005155431-ecdeabc65495/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= @@ -164,8 +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.20251031091135-78b17f183b84 h1:FmHKWYMNfIfpNDWO4+ulmmgstBI5Ujt7NWI1g1PzVjQ= -github.com/morph-l2/go-ethereum v1.10.14-0.20251031091135-78b17f183b84/go.mod h1:U/Gt6UghgHD7SB8t/rTD9908qFRjvzgIAtXUqEYjtI8= +github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2 h1:FUv9gtnvF+1AVrkoNGYbVOesi7E+STjdfD2mcqVaEY0= +github.com/morph-l2/go-ethereum v1.10.14-0.20251219060125-03910bc750a2/go.mod h1:tiFPeidxjoCmLj18ne9H3KQdIGTCvRC30qlef06Fd9M= github.com/morph-l2/tendermint v0.3.2 h1:Gu6Uj2G6c3YP2NAKFi7A46JZaOCdD4zfZDKCjt0pDm8= github.com/morph-l2/tendermint v0.3.2/go.mod h1:TtCzp9l6Z6yDUiwv3TbqKqw8Q8RKp3fSz5+adO1/Y8w= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= @@ -260,8 +259,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= diff --git a/tx-submitter/metrics/metrics.go b/tx-submitter/metrics/metrics.go index 0e3b83f01..6ac53b617 100644 --- a/tx-submitter/metrics/metrics.go +++ b/tx-submitter/metrics/metrics.go @@ -12,20 +12,21 @@ import ( // Metrics represents the metrics collection for the tx-submitter type Metrics struct { - 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 - reorgs prometheus.Counter - reorgDepthVal uint64 - reorgCountVal uint64 - confirmedTxs *prometheus.CounterVec + 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 @@ -71,6 +72,10 @@ func NewMetrics() *Metrics { 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", @@ -96,6 +101,7 @@ func NewMetrics() *Metrics { _ = prometheus.Register(m.IndexerBlockProcessed) _ = prometheus.Register(m.LastCommittedBatch) _ = prometheus.Register(m.LastFinalizedBatch) + _ = prometheus.Register(m.HasPendingFinalizeBatch) _ = prometheus.Register(m.reorgs) _ = prometheus.Register(m.confirmedTxs) @@ -144,6 +150,16 @@ 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) @@ -192,6 +208,7 @@ func (m *Metrics) UnregisterMetrics() { 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/services/rollup.go b/tx-submitter/services/rollup.go index 22d3125ff..818dce38a 100644 --- a/tx-submitter/services/rollup.go +++ b/tx-submitter/services/rollup.go @@ -202,6 +202,20 @@ func (r *Rollup) Start() error { } 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() {